Commit 2cead1f5e8bfb78b7f54257f4f50b9c22bf79ffc
1 parent
ebc2ecde2e
Exists in
master
minor fixes arrays still dont work
Showing 6 changed files with 53 additions and 5 deletions Side-by-side Diff
ast_decl.cc
View file @
2cead1f
... | ... | @@ -70,8 +70,17 @@ |
70 | 70 | llvm::Value* VarDecl::Emit() { |
71 | 71 | llvm::BasicBlock* b = irgen.GetBasicBlock(); |
72 | 72 | llvm::Value* val; |
73 | + //locals | |
73 | 74 | if(b) { |
74 | - val = new llvm::AllocaInst(convertType(type), id->GetName(), b); | |
75 | + if(dynamic_cast<ArrayType *>(type) !=NULL){ | |
76 | + llvm::Value* val2 = llvm::ConstantInt::get(irgen.GetIntType(), dynamic_cast<ArrayType*>(type)->GetElemCount()); | |
77 | + llvm::Type* thisType = convertType(dynamic_cast<ArrayType*>(type)->GetElemType()); | |
78 | + llvm::ArrayType* arrType = llvm::ArrayType::get(thisType, dynamic_cast<ArrayType*>(type)->GetElemCount()); | |
79 | + val = new llvm::AllocaInst(arrType, val2, id->GetName(), irgen.GetBasicBlock()); | |
80 | + } | |
81 | + else{ | |
82 | + val = new llvm::AllocaInst(convertType(type), id->GetName(), b); | |
83 | + } | |
75 | 84 | if(assignTo) new llvm::StoreInst(assignTo->Emit(), val, false, irgen.GetBasicBlock()); |
76 | 85 | } |
77 | 86 | else { |
ast_expr.cc
View file @
2cead1f
... | ... | @@ -9,6 +9,7 @@ |
9 | 9 | #include "ast_decl.h" |
10 | 10 | #include "symtable.h" |
11 | 11 | |
12 | + | |
12 | 13 | IntConstant::IntConstant(yyltype loc, int val) : Expr(loc) { |
13 | 14 | value = val; |
14 | 15 | } |
... | ... | @@ -320,6 +321,7 @@ |
320 | 321 | |
321 | 322 | FieldAccess * f = dynamic_cast<FieldAccess *>(left); |
322 | 323 | if (f){ |
324 | + //std::cerr<< "fuck this assignment"<<"/n"; | |
323 | 325 | return this->AssignField(); |
324 | 326 | } |
325 | 327 | leftval = left->Emit(); |
326 | 328 | |
... | ... | @@ -355,7 +357,10 @@ |
355 | 357 | } |
356 | 358 | else if ( operationStr.compare("=") == 0 ){ |
357 | 359 | if (vd){ |
360 | + std::cerr<<"--------------------------------------------"<<"\n"; | |
361 | + std::cerr<< vd->GetIdentifier()->GetName()<<"\n"; | |
358 | 362 | vd->AddressStore(rightval); |
363 | + std::cerr<<"AFTER STOREING" << endl; | |
359 | 364 | return rightval; |
360 | 365 | } |
361 | 366 | return ((VarExpr *) left)->AddressStore(rightval); |
362 | 367 | |
363 | 368 | |
... | ... | @@ -558,15 +563,15 @@ |
558 | 563 | maskI.push_back(llvm::ConstantInt::get(intTyp, 0)); |
559 | 564 | valNum=0; |
560 | 565 | } |
561 | - else if(*ptr='y'){ | |
566 | + else if(*ptr=='y'){ | |
562 | 567 | maskI.push_back(llvm::ConstantInt::get(intTyp, 1)); |
563 | 568 | valNum=1; |
564 | 569 | } |
565 | - else if(*ptr='z'){ | |
570 | + else if(*ptr=='z'){ | |
566 | 571 | maskI.push_back(llvm::ConstantInt::get(intTyp, 2)); |
567 | 572 | valNum=2; |
568 | 573 | } |
569 | - else if(*ptr='w'){ | |
574 | + else if(*ptr=='w'){ | |
570 | 575 | maskI.push_back(llvm::ConstantInt::get(intTyp, 3)); |
571 | 576 | valNum=3; |
572 | 577 | } |
... | ... | @@ -581,5 +586,28 @@ |
581 | 586 | llvm::ConstantVector *masky = (llvm::ConstantVector *) llvm::ConstantVector::get(maskI); |
582 | 587 | llvm::Value * val = new llvm::ShuffleVectorInst(baseF,llvm::UndefValue::get(baseF->getType()), masky,"",irgen.GetBasicBlock()); |
583 | 588 | return val; |
589 | +} | |
590 | + | |
591 | +llvm::Value * ArrayAccess::Emit(){ | |
592 | + Expr * base= GetBase(); | |
593 | + Expr * sub= GetSubScript(); | |
594 | + std::cerr<< "arrayAccess"<<"\n"; | |
595 | + | |
596 | + if(isInCurrentScope( dynamic_cast< VarExpr* >(base)->GetIdentifier()->GetName())){ | |
597 | + std::cerr<< "arrayAccess2"<<"\n"; | |
598 | + | |
599 | + llvm::Value * val= findSymbol(dynamic_cast< VarExpr* >(base)->GetIdentifier()->GetName()).second; | |
600 | + llvm::Value * subscrVal = sub->Emit(); | |
601 | + std::vector <llvm::Value*> vect; | |
602 | + vect.push_back(llvm::ConstantInt::get(irgen.GetIntType(),0)); | |
603 | + vect.push_back((llvm::Value *const &) subscrVal); | |
604 | + llvm::ArrayRef<llvm::Value *> valList(vect); | |
605 | + llvm::Value *elmt= llvm::GetElementPtrInst::Create(val,valList,"ARRAYACCESS",irgen.GetBasicBlock()); | |
606 | + | |
607 | + return new llvm::LoadInst(elmt,"ARRAYACCESS",irgen.GetBasicBlock()); | |
608 | + } | |
609 | + else{ | |
610 | + return NULL; | |
611 | + } | |
584 | 612 | } |
ast_expr.h
View file @
2cead1f
... | ... | @@ -199,6 +199,11 @@ |
199 | 199 | ArrayAccess(yyltype loc, Expr *base, Expr *subscript); |
200 | 200 | const char *GetPrintNameForNode() { return "ArrayAccess"; } |
201 | 201 | void PrintChildren(int indentLevel); |
202 | + Expr *GetBase(){ return base; } | |
203 | + Expr *GetSubScript(){ return subscript;} | |
204 | + llvm::Value *Emit(); | |
205 | + | |
206 | + llvm::Value *EmitHelper(llvm::Value* rightH); | |
202 | 207 | }; |
203 | 208 | |
204 | 209 | /* Note that field access is used both for qualified names |
ast_stmt.cc
View file @
2cead1f
... | ... | @@ -259,6 +259,7 @@ |
259 | 259 | |
260 | 260 | //if statement |
261 | 261 | llvm::Value * IfStmt::Emit(){ |
262 | + | |
262 | 263 | llvm::LLVMContext * context = irgen.GetContext(); |
263 | 264 | llvm::Function * func = irgen.GetFunction(); |
264 | 265 | llvm::BasicBlock * elseBlock = NULL; |
... | ... | @@ -266,6 +267,7 @@ |
266 | 267 | llvm::BasicBlock * footBlock = llvm::BasicBlock::Create(*context, "footBlock", func); |
267 | 268 | llvm::Value * val; |
268 | 269 | llvm::Value * condition = test->Emit(); |
270 | + | |
269 | 271 | if(elseBody) |
270 | 272 | { |
271 | 273 | elseBlock = llvm::BasicBlock::Create(*context, "elseBlock", func); |
... | ... | @@ -280,6 +282,7 @@ |
280 | 282 | { |
281 | 283 | val = llvm::BranchInst::Create(footBlock, irgen.GetBasicBlock()); |
282 | 284 | } |
285 | + | |
283 | 286 | popScope(); |
284 | 287 | |
285 | 288 | if(elseBody) |
ast_type.h
View file @
2cead1f