Commit 79e3b4c81e85aaa9ea45b80204d4e0e5e5afa395
1 parent
8af5d87083
Exists in
master
hopefully it works
Showing 1 changed file with 18 additions and 22 deletions Side-by-side Diff
ast_stmt.cc
View file @
79e3b4c
... | ... | @@ -169,51 +169,49 @@ |
169 | 169 | llvm::Value * ConditionalStmt::Emit(){ |
170 | 170 | return NULL; |
171 | 171 | } |
172 | -//for statement | |
172 | + | |
173 | 173 | llvm::Value * ForStmt::Emit() |
174 | 174 | { |
175 | 175 | pushScope(); |
176 | 176 | llvm::LLVMContext * context = irgen.GetContext(); |
177 | - llvm::Function * func = irgen.GetFunction(); | |
178 | - llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", func); | |
179 | - llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func); | |
180 | - llvm::BasicBlock * incBlock = llvm::BasicBlock::Create(*context, "incBlock", func); | |
181 | - llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", func); | |
182 | - llvm::Value * condition; | |
177 | + llvm::Function * f = irgen.GetFunction(); | |
178 | + llvm::BasicBlock * headBlock = llvm::BasicBlock::Create(*context, "headBlock", f); | |
179 | + llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", f); | |
180 | + llvm::BasicBlock * stepBlock = llvm::BasicBlock::Create(*context, "stepBlock", f); | |
181 | + llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", f); | |
182 | + llvm::Value * cond; | |
183 | 183 | |
184 | 184 | // init and branch to head |
185 | 185 | init->Emit(); |
186 | 186 | |
187 | - llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); | |
187 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides | |
188 | 188 | |
189 | 189 | // head |
190 | 190 | irgen.SetBasicBlock(headBlock); |
191 | - condition = test->Emit(); | |
191 | + cond = test->Emit(); | |
192 | 192 | if(!irgen.GetBasicBlock()->getTerminator()) |
193 | 193 | { |
194 | - llvm::BranchInst::Create(bodyBlock, footBlock, condition, irgen.GetBasicBlock()); | |
194 | + llvm::BranchInst::Create(bodyBlock, footBlock, cond, irgen.GetBasicBlock()); // given in the slides | |
195 | 195 | } |
196 | - | |
197 | 196 | // body |
198 | 197 | irgen.SetBasicBlock(bodyBlock); |
199 | 198 | body->Emit(); |
200 | 199 | if(!irgen.GetBasicBlock()->getTerminator()) |
201 | 200 | { |
202 | - llvm::BranchInst::Create(incBlock, irgen.GetBasicBlock()); | |
201 | + llvm::BranchInst::Create(stepBlock, irgen.GetBasicBlock()); // given in the slides | |
203 | 202 | } |
204 | - | |
205 | 203 | // step |
206 | - irgen.SetBasicBlock(incBlock); | |
204 | + irgen.SetBasicBlock(stepBlock); | |
207 | 205 | step->Emit(); |
208 | 206 | if(!irgen.GetBasicBlock()->getTerminator()) |
209 | 207 | { |
210 | - llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); | |
208 | + llvm::BranchInst::Create(headBlock, irgen.GetBasicBlock()); // given in the slides | |
211 | 209 | } |
212 | - | |
213 | 210 | irgen.SetBasicBlock(footBlock); |
214 | 211 | popScope(); |
215 | 212 | return NULL; |
216 | 213 | } |
214 | + | |
217 | 215 | //while statement |
218 | 216 | llvm::Value * WhileStmt::Emit(){ |
219 | 217 | pushScope(); |
220 | 218 | |
... | ... | @@ -321,11 +319,11 @@ |
321 | 319 | //stack for both |
322 | 320 | |
323 | 321 | llvm::Value * SwitchStmt::Emit(){ |
324 | - /* | |
325 | - llvm::Value * val; | |
322 | + | |
323 | + llvm::SwitchInst * val; | |
326 | 324 | llvm::LLVMContext * context = irgen.GetContext(); |
327 | 325 | llvm::Function * func = irgen.GetFunction(); |
328 | - llvm::BasicBlock * blockArr = new llvm::BasicBlock [cases->NumElements()]; | |
326 | + llvm::BasicBlock * blockArr = new llvm::BasicBlock[cases->NumElements()]; | |
329 | 327 | //find all cases and create a basic block for all of them |
330 | 328 | for (int i = 0; i < cases->NumElements(); i++){ |
331 | 329 | blockArr[i]= new llvm::BasicBlock::Create(*context, "switchBlock", func); |
332 | 330 | |
... | ... | @@ -340,13 +338,11 @@ |
340 | 338 | for(int i=0; i<cases->NumElements();i++){ |
341 | 339 | //add addCase to switch stmt |
342 | 340 | //addcase to val method |
343 | - val.AddCase (i, blockArr[i]); | |
341 | + val.addCase (i, blockArr[i]); | |
344 | 342 | cases->Nth(i)->Emit(); |
345 | 343 | irgen.GetBasicBlock()->getTerminator(); |
346 | 344 | } |
347 | 345 | return val; |
348 | - */ | |
349 | - return NULL; | |
350 | 346 | } |
351 | 347 | |
352 | 348 | llvm::Value * SwitchLabel::Emit(){ |