Commit 2cead1f5e8bfb78b7f54257f4f50b9c22bf79ffc

Authored by Austin Sun
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

... ... @@ -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 {
... ... @@ -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 }
... ... @@ -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
... ... @@ -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)
... ... @@ -90,6 +90,7 @@
90 90 void PrintChildren(int indentLevel);
91 91 void PrintToStream(ostream& out) { out << elemType << "[]"; }
92 92 Type *GetElemType() {return elemType;}
  93 + int GetElemCount(){return elemCount;}
93 94 };
94 95  
95 96 llvm::Type* convertType(Type* t);
... ... @@ -54,7 +54,7 @@
54 54  
55 55 llvm::Type *GetMat4Type() const;
56 56  
57   - private:
  57 +private:
58 58 llvm::LLVMContext *context;
59 59 llvm::Module *module;
60 60