Commit 344a5bcfc79d4021724fb4d1bc88470eca7e32c3

Authored by Jeffrey Johnson
1 parent f3d23e0e67
Exists in master

Fix things

Showing 5 changed files with 36 additions and 20 deletions Side-by-side Diff

... ... @@ -51,6 +51,7 @@
51 51 /*------------------------------------------------------------------------------------
52 52 * Symbol Table Information
53 53 *----------------------------------------------------------------------------------*/
  54 +SymbolTable symbols;
54 55 pair<Decl*,llvm::Value *> findSymbol(string s) {
55 56 for(int i = symbols.size() - 1; i >= 0; i--) {
56 57 if(symbols[i].count(s) > 0) return symbols[i][s];
... ... @@ -34,8 +34,8 @@
34 34  
35 35 */
36 36  
37   -#pragma clang diagnostic push
38   -#pragma ide diagnostic ignored "CannotResolve"
  37 +//#pragma clang diagnostic push
  38 +//#pragma ide diagnostic ignored "CannotResolve"
39 39 #ifndef _H_ast
40 40 #define _H_ast
41 41  
... ... @@ -54,7 +54,6 @@
54 54  
55 55 using namespace std;
56 56  
57   -class SymbolTable;
58 57 class MyStack;
59 58 class FnDecl;
60 59 class Decl;
... ... @@ -67,8 +66,6 @@
67 66 public:
68 67 Node(yyltype loc);
69 68 Node();
70   - static IRGenerator * irGen;
71   - SymbolTable symbols;
72 69 virtual ~Node() {}
73 70  
74 71 yyltype *GetLocation() { return location; }
... ... @@ -129,5 +126,5 @@
129 126  
130 127 #endif
131 128  
132   -#pragma clang diagnostic pop
  129 +//#pragma clang diagnostic pop
... ... @@ -132,6 +132,10 @@
132 132 if (actuals) actuals->PrintAll(indentLevel+1, "(actuals) ");
133 133 }
134 134  
  135 +string Operator::getToken() const {
  136 + return tokenString;
  137 +}
  138 +
135 139 llvm::Value* IntConstant::Emit() {
136 140 return llvm::ConstantInt::get(llvm::Type::getInt32Ty(*irgen.GetContext()), value, true);
137 141 }
... ... @@ -142,5 +146,17 @@
142 146  
143 147 llvm::Value* BoolConstant::Emit() {
144 148 return llvm::ConstantInt::get(llvm::Type::getInt1Ty(*irgen.GetContext()), value, false);
  149 +}
  150 +
  151 +llvm::Value* CompoundExpr::Emit() {
  152 + if(op->getToken() == "+")
  153 + return llvm::BinaryOperator::Create(llvm::Instruction::FAdd, left->Emit(), right->Emit());
  154 + if(op->getToken() == "-")
  155 + return llvm::BinaryOperator::Create(llvm::Instruction::FSub, left->Emit(), right->Emit());
  156 + if(op->getToken() == "*")
  157 + return llvm::BinaryOperator::Create(llvm::Instruction::FMul, left->Emit(), right->Emit());
  158 + if(op->getToken() == "/")
  159 + return llvm::BinaryOperator::Create(llvm::Instruction::FDiv, left->Emit(), right->Emit());
  160 + return NULL;
145 161 }
... ... @@ -101,6 +101,7 @@
101 101 char tokenString[4];
102 102  
103 103 public:
  104 + string getToken() const;
104 105 Operator(yyltype loc, const char *tok);
105 106 const char *GetPrintNameForNode() { return "Operator"; }
106 107 void PrintChildren(int indentLevel);
... ... @@ -119,6 +120,7 @@
119 120 CompoundExpr(Operator *op, Expr *rhs); // for unary
120 121 CompoundExpr(Expr *lhs, Operator *op); // for unary
121 122 void PrintChildren(int indentLevel);
  123 + virtual llvm::Value* Emit();
122 124 };
123 125  
124 126 class ArithmeticExpr : public CompoundExpr
... ... @@ -24,7 +24,7 @@
24 24 }
25 25 //pls work
26 26 llvm::Value* Program::Emit() {
27   - llvm::Module *module = irGen->GetOrCreateModule("program");
  27 + llvm::Module *module = irgen.GetOrCreateModule("program");
28 28 pushScope();
29 29 for (int i = 0; i < decls->NumElements(); i++){
30 30 decls->Nth(i)->Emit();
31 31  
32 32  
33 33  
34 34  
35 35  
36 36  
37 37  
38 38  
39 39  
... ... @@ -175,42 +175,42 @@
175 175  
176 176 //if statement
177 177 llvm::Value * IfStmt::Emit(){
178   - llvm::Function * func = irGen->GetFunction();
  178 + llvm::LLVMContext * context = irgen.GetContext();
  179 + llvm::Function * func = irgen.GetFunction();
179 180 llvm::BasicBlock * elseBlock = NULL;
180 181 llvm::BasicBlock * thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", func);
181 182 llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func);
182 183 llvm::Value * val;
183 184 llvm::Value * cond = test->Emit();
184   - llvm::LLVMContext * context = irGen->GetContext();
185 185 if(elseBody)
186 186 {
187 187 elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func);
188 188 }
189 189  
190   - val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irGen->GetBasicBlock());
  190 + val = llvm::BranchInst::Create(thenBlock, elseBody ? elseBlock : footBlock, cond, irgen.GetBasicBlock());
191 191 pushScope();
192   - irGen->SetBasicBlock(thenBlock);
  192 + irgen.SetBasicBlock(thenBlock);
193 193 body->Emit();
194 194  
195   - if(!irGen->GetBasicBlock()->getTerminator())
  195 + if(!irgen.GetBasicBlock()->getTerminator())
196 196 {
197   - val = llvm::BranchInst::Create(footBlock, irGen->GetBasicBlock());
  197 + val = llvm::BranchInst::Create(footBlock, irgen.GetBasicBlock());
198 198 }
199 199 popScope();
200 200  
201 201 if(elseBody)
202 202 {
203 203 pushScope();
204   - irGen->SetBasicBlock(elseBlock);
  204 + irgen.SetBasicBlock(elseBlock);
205 205 elseBody->Emit();
206 206  
207   - if(!irGen->GetBasicBlock()->getTerminator())
  207 + if(!irgen.GetBasicBlock()->getTerminator())
208 208 {
209   - val = llvm::BranchInst::Create(footBlock, irGen->GetBasicBlock());
  209 + val = llvm::BranchInst::Create(footBlock, irgen.GetBasicBlock());
210 210 }
211 211 popScope();
212 212 }
213   - irGen->SetBasicBlock(footBlock);
  213 + irgen.SetBasicBlock(footBlock);
214 214 return val;
215 215 }
216 216  
217 217  
218 218  
... ... @@ -225,13 +225,13 @@
225 225 //Not sure
226 226 llvm::Value * ReturnStmt::Emit(){
227 227 llvm::Value * val;
228   - llvm::LLVMContext * context = irGen->GetContext();
  228 + llvm::LLVMContext * context = irgen.GetContext();
229 229 if (expr){
230 230 llvm::Value * retVal = expr->Emit();
231   - retVal = llvm::ReturnInst::Create(*context, retVal, irGen->GetBasicBlock());
  231 + retVal = llvm::ReturnInst::Create(*context, retVal, irgen.GetBasicBlock());
232 232 return retVal;
233 233 }
234   - val = llvm::ReturnInst::Create(*context, irGen->GetBasicBlock());
  234 + val = llvm::ReturnInst::Create(*context, irgen.GetBasicBlock());
235 235 return val;
236 236 }
237 237