Commit 344a5bcfc79d4021724fb4d1bc88470eca7e32c3
1 parent
f3d23e0e67
Exists in
master
Fix things
Showing 5 changed files with 36 additions and 20 deletions Side-by-side Diff
ast.cc
View file @
344a5bc
... | ... | @@ -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]; |
ast.h
View file @
344a5bc
... | ... | @@ -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 |
ast_expr.cc
View file @
344a5bc
... | ... | @@ -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 | } |
ast_expr.h
View file @
344a5bc
... | ... | @@ -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 |
ast_stmt.cc
View file @
344a5bc
... | ... | @@ -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 |