Skip to content

Commit 1230092

Browse files
committed
Added reg allocation for method vars and offets for class vars
1 parent f78d828 commit 1230092

7 files changed

Lines changed: 320 additions & 61 deletions

File tree

‎MiniJavaCompiler.java‎

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import linker.*;
1414
import codegen.*;
1515
import backpatching.*;
16+
import regalloc.*;
17+
import java.util.Set;
1618
import java.util.List;
1719
import java.util.Hashtable;
1820
import java.util.HashMap;
@@ -77,12 +79,33 @@ public static void main(String[] args)
7779
Hashtable<Quadruple, List<Label>> labels = intermediateVisitor.getLabels();
7880
HashMap<String, String> workList = intermediateVisitor.getWorkList();
7981

82+
//Allocate Registers
83+
RegisterAllocator allocator = new RegisterAllocator();
84+
85+
SymbolTable symTable = (SymbolTable)symbolTable;
86+
Hashtable <String, ClassSymbolTable> classes = symTable.getClasses();
87+
Set<String> keys = classes.keySet();
88+
89+
for(String key : keys) //Iterate over each class
90+
{
91+
ClassSymbolTable classSymTable = classes.get(key);
92+
classSymTable.calculateVarOffsets(); //Store variable offsets in the symbol table
93+
94+
Hashtable<String, MethodSymbolTable> methods = classSymTable.getMethods();
95+
Set<String> methodKeys = methods.keySet();
96+
97+
for(String methodKey : methodKeys)
98+
{
99+
MethodSymbolTable methSymTable = methods.get(methodKey);
100+
methSymTable.assignRegisters(allocator); //Temporary allocation to all method locals
101+
}
102+
}
103+
80104
//Backpatch the IR to resolve labels in jumps to methods
81105
BackPatcher backPatch = new BackPatcher(IRList, workList);
82106
backPatch.patch();
83107

84-
85-
//Print IR
108+
//Print IR -- Temporary, remove later!
86109
for(int i = 0; i < IRList.size(); i++)
87110
{
88111
if(labels.containsKey(IRList.get(i)))
@@ -112,9 +135,10 @@ public static void main(String[] args)
112135
String fileName = args[0].substring(0, args[0].lastIndexOf(".")) + ".asm";
113136

114137
//Write MIPS
115-
CodeGenerator gen = new CodeGenerator(IRList, labels, fileName);
138+
CodeGenerator gen = new CodeGenerator(IRList, labels, allocator, symTable, fileName);
116139
gen.generateMIPS();
117140

141+
//Temporary -- remove later!
118142
System.out.println("\n Testing Graph");
119143
AssemFlowGraph asmFG = new AssemFlowGraph(IRList,labels);
120144
asmFG.buildCFG();

‎codegen/CodeGenerator.java‎

Lines changed: 113 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.io.*;
99
import IR.*;
1010
import helper.Label;
11-
import symboltable.Variable;
11+
import symboltable.*;
1212
import java.util.List;
1313
import java.util.Hashtable;
1414
import regalloc.RegisterAllocator;
@@ -19,13 +19,29 @@ public class CodeGenerator
1919
private List<Quadruple> IRList;
2020
private Hashtable<Quadruple, List<Label>> labels;
2121
private RegisterAllocator allocator;
22+
private SymbolTable symbolTable;
2223

23-
public CodeGenerator(List<Quadruple> list, Hashtable<Quadruple, List<Label>> label, String fileName)
24+
public CodeGenerator(List<Quadruple> list, Hashtable<Quadruple, List<Label>> label, RegisterAllocator alloc, Scope symTable, String fileName)
2425
{
2526
IRList = list;
2627
output = fileName;
2728
labels = label;
28-
allocator = new RegisterAllocator();
29+
allocator = alloc;
30+
symbolTable = (SymbolTable)symTable;
31+
}
32+
33+
//Helper function to get size of a class (in bytes)
34+
public int getClassSize(String name)
35+
{
36+
ClassSymbolTable cst = symbolTable.getClass(name);
37+
38+
if(cst == null)
39+
{
40+
System.err.println("Error - Invalid Class Lookup in CodeGenerator!");
41+
return -1;
42+
}
43+
44+
return cst.getSize();
2945
}
3046

3147
public void generateMIPS()
@@ -136,15 +152,28 @@ else if(arg1.getType().equals("temporary"))
136152
}
137153
else //Variable arg1
138154
{
139-
temp = "lw " + resultReg + ", " + arg1.getName() + "\n";
155+
if(arg1.getOffset() == -1)
156+
{
157+
temp = "move " + resultReg + ", " + arg1.getRegister() + "\n";
158+
}
159+
else //Class variable
160+
{
161+
//Todo
162+
}
140163
}
141164

142165
bw.write(temp, 0, temp.length());
143166

144167
if(!result.getType().equals("temporary")) //Variable result
145168
{
146-
//Store result from resultReg into the variable address
147-
temp = "sw " + resultReg + result.getName() + "\n";
169+
if(result.getOffset() == -1)
170+
{
171+
temp = "move " + result.getRegister() + ", " + resultReg + "\n";
172+
}
173+
else //Class variable
174+
{
175+
//Todo
176+
}
148177
bw.write(temp, 0, temp.length());
149178
}
150179
}
@@ -184,7 +213,15 @@ else if(arg1.getType().equals("temporary"))
184213
}
185214
else //Variable arg1
186215
{
187-
temp = "lw " + resultReg + ", " + arg1.getName() + "\n";
216+
if(arg1.getOffset() == -1)
217+
{
218+
temp = "move " + resultReg + ", " + arg1.getRegister() + "\n";
219+
}
220+
else //Class variable
221+
{
222+
//Todo
223+
temp = "";
224+
}
188225
}
189226

190227
bw.write(temp, 0, temp.length());
@@ -219,8 +256,14 @@ else if(arg1.getType().equals("temporary"))
219256

220257
if(!result.getType().equals("temporary")) //Variable result
221258
{
222-
//Store result from resultReg into the variable address
223-
temp = "sw " + resultReg + result.getName() + "\n";
259+
if(result.getOffset() == -1)
260+
{
261+
temp = "sw " + result.getRegister() + ", " + resultReg + "\n";
262+
}
263+
else //Class variable
264+
{
265+
//Todo
266+
}
224267
bw.write(temp, 0, temp.length());
225268
}
226269
}
@@ -247,7 +290,14 @@ else if(arg1.getType().equals("temporary"))
247290
}
248291
else //Variable
249292
{
250-
temp = "lw $v0, " + arg1.getName() + "\n";
293+
if(arg1.getOffset() == -1)
294+
{
295+
temp = "move $v0, " + arg1.getRegister() + "\n";
296+
}
297+
else //Class variable
298+
{
299+
//Todo
300+
}
251301
}
252302

253303
bw.write(temp, 0, temp.length());
@@ -271,17 +321,14 @@ private void handleAssignment(Quadruple instruction, BufferedWriter bw)
271321
Variable arg2 = (Variable)instruction.getArg2();
272322
String temp = "";
273323
String resultReg;
274-
String tempReg;
275324

276325
if(result.getType().equals("temporary"))
277326
{
278327
resultReg = allocator.allocateReg(result.getName());
279-
tempReg = allocator.allocateTempReg(0);
280328
}
281329
else //Variable result
282330
{
283331
resultReg = allocator.allocateTempReg(0);
284-
tempReg = allocator.allocateTempReg(1);
285332
}
286333

287334
//Handle arg1 -- Store the first parameter in the result register
@@ -295,7 +342,14 @@ else if(arg1.getType().equals("temporary"))
295342
}
296343
else //Variable arg1
297344
{
298-
temp = "lw " + resultReg + ", " + arg1.getName() + "\n";
345+
if(arg1.getOffset() == -1)
346+
{
347+
temp = "move " + resultReg + ", " + arg1.getRegister() + "\n";
348+
}
349+
else //Class variable
350+
{
351+
//Todo
352+
}
299353
}
300354

301355
bw.write(temp, 0, temp.length());
@@ -398,20 +452,28 @@ else if(op.equals("&&"))
398452
}
399453
else //Variable arg2
400454
{
401-
temp = "lw " + tempReg + ", " + arg2.getName() + "\n";
402-
bw.write(temp, 0, temp.length());
455+
String varReg = "";
456+
457+
if(arg1.getOffset() == -1)
458+
{
459+
varReg = arg1.getRegister();
460+
}
461+
else //Class variable
462+
{
463+
//Todo
464+
}
403465

404466
if(op.equals("+"))
405467
{
406-
temp = "add " + resultReg + ", " + resultReg + ", " + tempReg + "\n";
468+
temp = "add " + resultReg + ", " + resultReg + ", " + varReg + "\n";
407469
}
408470
else if(op.equals("-"))
409471
{
410-
temp = "sub " + resultReg + ", " + resultReg + ", " + tempReg + "\n";
472+
temp = "sub " + resultReg + ", " + resultReg + ", " + varReg + "\n";
411473
}
412474
else if(op.equals("*"))
413475
{
414-
temp = "mult " + resultReg + ", " + tempReg + "\n";
476+
temp = "mult " + resultReg + ", " + varReg + "\n";
415477
bw.write(temp, 0, temp.length());
416478

417479
temp = "mflo " + resultReg + "\n";
@@ -422,7 +484,7 @@ else if(op.equals("<"))
422484
Label L2 = new Label(false);
423485

424486
//If arg 1 < arg2, branch to L1 and store "1" inside resultReg
425-
temp = "blt " + resultReg + ", " + tempReg + ", " + L1.getName() + "\n";
487+
temp = "blt " + resultReg + ", " + varReg + ", " + L1.getName() + "\n";
426488
bw.write(temp, 0, temp.length());
427489

428490
//Else fallthrough and store "0" inside resultReg
@@ -442,16 +504,23 @@ else if(op.equals("<"))
442504
}
443505
else if(op.equals("&&"))
444506
{
445-
temp = "and " + resultReg + ", " + resultReg + ", " + tempReg + "\n";
507+
temp = "and " + resultReg + ", " + resultReg + ", " + varReg + "\n";
446508
}
447509
}
448510

449511
bw.write(temp, 0, temp.length());
450512

451513
if(!result.getType().equals("temporary")) //Variable result
452514
{
453-
//Store result from resultReg into the variable address
454-
temp = "sw " + resultReg + result.getName() + "\n";
515+
if(result.getOffset() == -1)
516+
{
517+
temp = "move " + result.getRegister() + ", " + resultReg + "\n";
518+
}
519+
else //Class variable
520+
{
521+
//Todo
522+
}
523+
455524
bw.write(temp, 0, temp.length());
456525
}
457526
}
@@ -518,20 +587,26 @@ private void functionCall(List<Quadruple>IRList, int index, BufferedWriter bw)
518587
ParameterIR param = (ParameterIR)IRList.get(paramIndex+i);
519588
String reg = "$a" + i;
520589

521-
String argName = ((Variable)param.getArg1()).getName();
522-
String argType = ((Variable)param.getArg1()).getType();
590+
Variable arg1 = (Variable)param.getArg1();
523591

524-
if(argType.equals("constant"))
592+
if(arg1.getType().equals("constant"))
525593
{
526-
temp = "li " + reg + ", " + argName + "\n";
594+
temp = "li " + reg + ", " + arg1.getName() + "\n";
527595
}
528-
else if(argType.equals("temporary"))
596+
else if(arg1.getType().equals("temporary"))
529597
{
530-
temp = "move " + reg + ", " + allocator.allocateReg(argName) + "\n";
598+
temp = "move " + reg + ", " + allocator.allocateReg(arg1.getName()) + "\n";
531599
}
532600
else //Variable
533601
{
534-
temp = "lw " + reg + ", " + argName + "\n";
602+
if(arg1.getOffset() == -1)
603+
{
604+
temp = "move " + reg + ", " + arg1.getRegister() + "\n";
605+
}
606+
else //Class variable
607+
{
608+
//Todo
609+
}
535610
}
536611

537612
bw.write(temp, 0, temp.length());
@@ -566,7 +641,14 @@ else if(argType.equals("temporary"))
566641
}
567642
else //Variable
568643
{
569-
temp = "sw $v0, " + result.getName() + "\n";
644+
if(result.getOffset() == -1)
645+
{
646+
temp = "move " + result.getRegister() + ", $v0\n";
647+
}
648+
else //Class variable
649+
{
650+
//Todo
651+
}
570652
}
571653

572654
bw.write(temp, 0, temp.length());

0 commit comments

Comments
 (0)