diff --git a/ast_expr.cc b/ast_expr.cc index 17eff03..95edef0 100644 --- a/ast_expr.cc +++ b/ast_expr.cc @@ -13,6 +13,7 @@ IntConstant::IntConstant(yyltype loc, int val) : Expr(loc) { value = val; } + void IntConstant::PrintChildren(int indentLevel) { printf("%d", value); } @@ -136,12 +137,6 @@ void Call::PrintChildren(int indentLevel) { llvm::Value* VarExpr::Emit() { return new llvm::LoadInst(findSymbol(id->GetName()).second, "", irgen.GetBasicBlock()); } -/* -llvm::Value* AssignExpr::Emit() { - VarExpr* ve = dynamic_cast(left); - return new llvm::StoreInst(right->Emit(), findSymbol(ve->GetIdentifier()->GetName()).second, false, irgen.GetBasicBlock()); -} - */ string Operator::getToken() const { return tokenString; @@ -325,11 +320,12 @@ llvm::Value* AssignExpr::Emit(){ llvm::Value *binOp = NULL; if(dynamic_cast(left)!=NULL){ + //std::cerr<< "field access"<<"\n"; return (dynamic_cast(left)->FieldStore(rightval,op->getToken()[0])); } if(op->IsOp("=")){ new llvm::StoreInst(rightval,targetL,basicBlock); - retVal=targetL; + retVal=rightval; } else if(op->IsOp("+=")){ if( leftval->getType()== convertType(Type::intType)){ @@ -419,10 +415,10 @@ llvm::Value* AssignExpr::Emit(){ new llvm::StoreInst(binOp,targetL,basicBlock); } } - return rightval; } + llvm::Value * FieldAccess::FieldStore(llvm::Value* val, char oper){ llvm::Value* baseVal = getBase()->Emit(); string fieldName = getField()->GetName(); @@ -649,11 +645,9 @@ llvm::Value * FieldAccess::Emit(){ llvm::Value * ArrayAccess::Emit(){ Expr * base= GetBase(); Expr * sub= GetSubScript(); - std::cerr<< "arrayAccess"<<"\n"; - - if(isInCurrentScope( dynamic_cast< VarExpr* >(base)->GetIdentifier()->GetName())){ - std::cerr<< "arrayAccess2"<<"\n"; + //std::cerr<< "arrayAccess"<<"\n"; + if(dynamic_cast< VarExpr* >(base)->GetIdentifier()->GetName()){ llvm::Value * val= findSymbol(dynamic_cast< VarExpr* >(base)->GetIdentifier()->GetName()).second; llvm::Value * subscrVal = sub->Emit(); std::vector vect; @@ -665,6 +659,7 @@ llvm::Value * ArrayAccess::Emit(){ return new llvm::LoadInst(elmt,"ARRAYACCESS",irgen.GetBasicBlock()); } else{ + //std::cerr<< "fucking fuck fuck fuck"<<"\n"; return NULL; } } diff --git a/ast_stmt.cc b/ast_stmt.cc index a1066d4..9c1c907 100644 --- a/ast_stmt.cc +++ b/ast_stmt.cc @@ -31,7 +31,7 @@ llvm::Value* Program::Emit() { } popScope(); - //module->dump(); + module->dump(); llvm::WriteBitcodeToFile(module, llvm::outs()); return NULL; } @@ -182,6 +182,7 @@ llvm::Value * ForStmt::Emit() llvm::BasicBlock * bodyBlock = llvm::BasicBlock::Create(*context, "bodyBlock", f); llvm::Value * cond; + cout<Emit();