Changeset 86:fd32135dca3e
- Timestamp:
- 11/03/07 09:44:58 (1 year ago)
- Files:
-
- dmd/declaration.h (modified) (1 diff)
- dmd/expression.h (modified) (1 diff)
- dmd/func.c (modified) (1 diff)
- dmd/module.h (modified) (1 diff)
- dmd/statement.c (modified) (2 diffs)
- dmd/statement.h (modified) (1 diff)
- gen/arrays.cpp (moved) (moved from gen/arrays.c) (14 diffs)
- gen/arrays.h (modified) (4 diffs)
- gen/binops.cpp (added)
- gen/dwarftypes.cpp (moved) (moved from gen/dwarftypes.c)
- gen/elem.cpp (moved) (moved from gen/elem.c) (4 diffs)
- gen/elem.h (modified) (3 diffs)
- gen/irstate.cpp (moved) (moved from gen/irstate.c) (1 diff)
- gen/irstate.h (modified) (2 diffs)
- gen/logger.cpp (moved) (moved from gen/logger.c)
- gen/runtime.cpp (moved) (moved from gen/runtime.c)
- gen/statements.cpp (moved) (moved from gen/statements.c) (18 diffs)
- gen/tocsym.cpp (moved) (moved from gen/tocsym.c)
- gen/todebug.cpp (moved) (moved from gen/todebug.c)
- gen/todt.cpp (moved) (moved from gen/todt.c)
- gen/toir.cpp (moved) (moved from gen/toir.c) (109 diffs)
- gen/tollvm.cpp (moved) (moved from gen/tollvm.c) (13 diffs)
- gen/tollvm.h (modified) (3 diffs)
- gen/toobj.cpp (moved) (moved from gen/toobj.c) (6 diffs)
- gen/typinf.cpp (moved) (moved from gen/typinf.c)
- lphobos/build.sh (modified) (3 diffs)
- lphobos/internal/aApply.d (added)
- lphobos/internal/aApplyR.d (added)
- lphobos/internal/objectimpl.d (modified) (1 diff)
- lphobos/phobos.d (modified) (1 diff)
- lphobos/std/array.d (added)
- lphobos/std/ctype.d (added)
- lphobos/std/uni.d (added)
- lphobos/std/utf.d (added)
- premake.lua (modified) (2 diffs)
- test/arrays10.d (added)
- test/arrays7.d (modified) (3 diffs)
- test/arrays9.d (added)
- test/b.d (modified) (2 diffs)
- test/bitops.d (modified) (2 diffs)
- test/bug48.d (added)
- test/bug49.d (added)
- test/bug50.d (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
dmd/declaration.h
r82 r86 528 528 llvm::Value* llvmArgPtr; 529 529 llvm::Constant* llvmDwarfSubProgram; 530 bool llvmRunTimeHack; 530 531 }; 531 532 dmd/expression.h
r40 r86 57 57 struct dt_t; 58 58 59 #if IN_LLVM 60 struct DValue; 61 typedef DValue elem; 62 #else 59 63 #ifdef IN_GCC 60 64 union tree_node; typedef union tree_node elem; 61 65 #else 62 66 struct elem; 67 #endif 63 68 #endif 64 69 dmd/func.c
r82 r86 80 80 llvmArgPtr = NULL; 81 81 llvmDwarfSubProgram = NULL; 82 llvmRunTimeHack = false; 82 83 } 83 84 dmd/module.h
r52 r86 27 27 28 28 // Back end 29 #if IN_GCC 29 #if IN_LLVM 30 struct DValue; 31 typedef DValue elem; 32 #else 33 #ifdef IN_GCC 30 34 union tree_node; typedef union tree_node elem; 31 35 #else 32 36 struct elem; 37 #endif 33 38 #endif 34 39 dmd/statement.c
r37 r86 1439 1439 else 1440 1440 fdapply = FuncDeclaration::genCfunc(Type::tindex, "_aaApply"); 1441 fdapply->llvmRunTimeHack = true; 1441 1442 ec = new VarExp(0, fdapply); 1442 1443 Expressions *exps = new Expressions(); … … 1480 1481 assert(j < sizeof(fdname)); 1481 1482 fdapply = FuncDeclaration::genCfunc(Type::tindex, fdname); 1483 fdapply->llvmRunTimeHack = true; 1482 1484 1483 1485 ec = new VarExp(0, fdapply); dmd/statement.h
r37 r86 59 59 struct IRState; 60 60 struct Blockx; 61 #if IN_LLVM 62 struct DValue; 63 typedef DValue elem; 64 #endif 65 61 66 #if IN_GCC 62 67 union tree_node; typedef union tree_node block; 63 union tree_node; typedef union tree_node elem;68 //union tree_node; typedef union tree_node elem; 64 69 #else 65 70 struct block; 66 struct elem;71 //struct elem; 67 72 #endif 68 73 struct code; gen/arrays.cpp
r81 r86 12 12 #include "gen/runtime.h" 13 13 #include "gen/logger.h" 14 #include "gen/ elem.h"14 #include "gen/dvalue.h" 15 15 16 16 ////////////////////////////////////////////////////////////////////////////////////////// … … 126 126 const llvm::PointerType* ptrty = llvm::cast<llvm::PointerType>(l->getType()); 127 127 const llvm::Type* t = ptrty->getContainedType(0); 128 const llvm::ArrayType* arrty = llvm:: cast_or_null<llvm::ArrayType>(t);128 const llvm::ArrayType* arrty = llvm::dyn_cast<llvm::ArrayType>(t); 129 129 if (arrty) 130 130 { 131 131 llvm::Value* ptr = DtoGEPi(l,0,0,"tmp",gIR->scopebb()); 132 132 llvm::Value* dim = llvm::ConstantInt::get(DtoSize_t(), arrty->getNumElements(), false); 133 llvm::Value* val = r; 134 DtoArrayInit(ptr, dim, val); 133 DtoArrayInit(ptr, dim, r); 135 134 } 136 135 else if (llvm::isa<llvm::StructType>(t)) 137 136 { 138 assert(0 && "Only static arrays support initialisers atm"); 137 llvm::Value* dim = DtoLoad(DtoGEPi(l, 0,0, "tmp")); 138 llvm::Value* ptr = DtoLoad(DtoGEPi(l, 0,1, "tmp")); 139 DtoArrayInit(ptr, dim, r); 139 140 } 140 141 else … … 160 161 void DtoArrayInit(llvm::Value* ptr, llvm::Value* dim, llvm::Value* val) 161 162 { 163 Logger::println("HELLO"); 164 Logger::cout() << "array: " << *ptr << " dim: " << *dim << " val: " << *val << '\n'; 162 165 const llvm::Type* pt = ptr->getType()->getContainedType(0); 163 166 const llvm::Type* t = val->getType(); … … 251 254 Logger::println("arr init begin"); 252 255 Type* arrinittype = DtoDType(arrinit->type); 253 assert(arrinittype->ty == Tsarray); 254 TypeSArray* t = (TypeSArray*)arrinittype; 255 integer_t tdim = t->dim->toInteger(); 256 257 Type* t; 258 integer_t tdim; 259 if (arrinittype->ty == Tsarray) { 260 TypeSArray* tsa = (TypeSArray*)arrinittype; 261 tdim = tsa->dim->toInteger(); 262 t = tsa; 263 } 264 else if (arrinittype->ty == Tarray) { 265 t = arrinittype; 266 tdim = arrinit->dim; 267 } 268 else 269 assert(0); 256 270 257 271 std::vector<llvm::Constant*> inits(tdim, 0); … … 309 323 } 310 324 311 const llvm::ArrayType* arrty = DtoStaticArrayType(t); 312 return llvm::ConstantArray::get(arrty, inits); 313 } 314 315 ////////////////////////////////////////////////////////////////////////////////////////// 316 static llvm::Value* get_slice_ptr(elem* e, llvm::Value*& sz) 317 { 318 assert(e->mem); 319 const llvm::Type* t = e->mem->getType()->getContainedType(0); 325 const llvm::ArrayType* arrty = llvm::ArrayType::get(elemty,tdim); 326 llvm::Constant* constarr = llvm::ConstantArray::get(arrty, inits); 327 328 if (arrinittype->ty == Tsarray) 329 return constarr; 330 else 331 assert(arrinittype->ty == Tarray); 332 333 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(arrty,true,llvm::GlobalValue::InternalLinkage,constarr,"constarray",gIR->module); 334 llvm::Constant* idxs[2] = { DtoConstUint(0), DtoConstUint(0) }; 335 llvm::Constant* gep = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); 336 return DtoConstSlice(DtoConstSize_t(tdim),gep); 337 } 338 339 ////////////////////////////////////////////////////////////////////////////////////////// 340 static llvm::Value* get_slice_ptr(DSliceValue* e, llvm::Value*& sz) 341 { 342 const llvm::Type* t = e->ptr->getType()->getContainedType(0); 320 343 llvm::Value* ret = 0; 321 if (e-> arg!= 0) {344 if (e->len != 0) { 322 345 // this means it's a real slice 323 ret = e-> mem;346 ret = e->ptr; 324 347 325 348 size_t elembsz = gTargetData->getTypeSize(ret->getType()); 326 349 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); 327 350 328 if (llvm::isa<llvm::ConstantInt>(e-> arg)) {329 sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e-> arg));351 if (llvm::isa<llvm::ConstantInt>(e->len)) { 352 sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e->len)); 330 353 } 331 354 else { 332 sz = llvm::BinaryOperator::createMul(elemsz,e-> arg,"tmp",gIR->scopebb());355 sz = llvm::BinaryOperator::createMul(elemsz,e->len,"tmp",gIR->scopebb()); 333 356 } 334 357 } 335 358 else if (llvm::isa<llvm::ArrayType>(t)) { 336 ret = DtoGEPi(e-> mem, 0, 0, "tmp", gIR->scopebb());359 ret = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); 337 360 338 361 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); … … 345 368 } 346 369 else if (llvm::isa<llvm::StructType>(t)) { 347 ret = DtoGEPi(e-> mem, 0, 1, "tmp", gIR->scopebb());370 ret = DtoGEPi(e->ptr, 0, 1, "tmp", gIR->scopebb()); 348 371 ret = new llvm::LoadInst(ret, "tmp", gIR->scopebb()); 349 372 … … 351 374 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); 352 375 353 llvm::Value* len = DtoGEPi(e-> mem, 0, 0, "tmp", gIR->scopebb());376 llvm::Value* len = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); 354 377 len = new llvm::LoadInst(len, "tmp", gIR->scopebb()); 355 378 sz = llvm::BinaryOperator::createMul(len,elemsz,"tmp",gIR->scopebb()); … … 361 384 } 362 385 363 void DtoArrayCopy(elem* dst, elem* src) 364 { 365 Logger::cout() << "Array copy ((((" << *src->mem << ")))) into ((((" << *dst->mem << "))))\n"; 366 367 assert(dst->type == elem::SLICE); 368 assert(src->type == elem::SLICE); 369 386 void DtoArrayCopy(DSliceValue* dst, DSliceValue* src) 387 { 370 388 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); 371 389 … … 436 454 437 455 if (doinit) { 438 elem* e = dty->defaultInit()->toElem(gIR); 439 DtoArrayInit(newptr,dim,e->getValue()); 440 delete e; 456 DValue* e = dty->defaultInit()->toElem(gIR); 457 DtoArrayInit(newptr,dim,e->getRVal()); 441 458 } 442 459 … … 450 467 451 468 ////////////////////////////////////////////////////////////////////////////////////////// 452 voidDtoResizeDynArray(llvm::Value* arr, llvm::Value* sz)469 llvm::Value* DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz) 453 470 { 454 471 llvm::Value* ptr = DtoGEPi(arr, 0, 1, "tmp", gIR->scopebb()); … … 464 481 llvm::Value* len = DtoGEPi(arr, 0, 0, "tmp", gIR->scopebb()); 465 482 new llvm::StoreInst(sz,len,gIR->scopebb()); 483 484 return newptr; 466 485 } 467 486 … … 469 488 void DtoCatAssignElement(llvm::Value* arr, Expression* exp) 470 489 { 471 llvm::Value* ptr = DtoGEPi(arr, 0, 0, "tmp" , gIR->scopebb());472 llvm::Value* idx = new llvm::LoadInst(ptr, "tmp", gIR->scopebb());490 llvm::Value* ptr = DtoGEPi(arr, 0, 0, "tmp"); 491 llvm::Value* idx = DtoLoad(ptr); 473 492 llvm::Value* one = llvm::ConstantInt::get(idx->getType(),1,false); 474 493 llvm::Value* len = llvm::BinaryOperator::createAdd(idx, one, "tmp", gIR->scopebb()); 475 494 DtoResizeDynArray(arr,len); 476 495 477 ptr = DtoGEPi(arr, 0, 1, "tmp", gIR->scopebb()); 478 ptr = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); 496 ptr = DtoLoad(DtoGEPi(arr, 0, 1, "tmp")); 479 497 ptr = new llvm::GetElementPtrInst(ptr, idx, "tmp", gIR->scopebb()); 480 498 481 elem* e = exp->toElem(gIR); 482 Type* et = DtoDType(exp->type); 483 DtoAssign(et, ptr, e->getValue()); 484 delete e; 499 DValue* dptr = new DVarValue(exp->type, ptr, true); 500 501 gIR->exps.push_back(IRExp(0,exp,dptr)); 502 DValue* e = exp->toElem(gIR); 503 gIR->exps.pop_back(); 504 505 if (!e->inPlace()) 506 DtoAssign(dptr, e); 507 } 508 509 ////////////////////////////////////////////////////////////////////////////////////////// 510 void DtoCatAssignArray(llvm::Value* arr, Expression* exp) 511 { 512 DValue* e = exp->toElem(gIR); 513 514 llvm::Value *len1, *len2, *src1, *src2, *res; 515 516 DValue* darr = new DVarValue(exp->type, arr, true); 517 518 len1 = DtoArrayLen(darr); 519 len2 = DtoArrayLen(e); 520 res = gIR->ir->CreateAdd(len1,len2,"tmp"); 521 522 llvm::Value* mem = DtoResizeDynArray(arr,res); 523 524 src1 = DtoArrayPtr(darr); 525 src2 = DtoArrayPtr(e); 526 527 mem = gIR->ir->CreateGEP(mem,len1,"tmp"); 528 DtoMemCpy(mem,src2,len2); 485 529 } 486 530 … … 494 538 assert(t1->ty == t2->ty); 495 539 496 elem* e1 = exp1->toElem(gIR); 497 llvm::Value* a = e1->getValue(); 498 delete e1; 499 500 elem* e2 = exp2->toElem(gIR); 501 llvm::Value* b = e2->getValue(); 502 delete e2; 540 DValue* e1 = exp1->toElem(gIR); 541 llvm::Value* a = e1->getRVal(); 542 543 DValue* e2 = exp2->toElem(gIR); 544 llvm::Value* b = e2->getRVal(); 503 545 504 546 llvm::Value *len1, *len2, *src1, *src2, *res; … … 671 713 return llvm::ConstantArray::get(at, initvals); 672 714 } 715 716 ////////////////////////////////////////////////////////////////////////////////////////// 717 llvm::Value* DtoArrayLen(DValue* v) 718 { 719 Type* t = DtoDType(v->getType()); 720 if (t->ty == Tarray) { 721 if (DSliceValue* s = v->isSlice()) { 722 if (s->len) return s->len; 723 DValue* next = new DVarValue(t,s->ptr,true); 724 return DtoArrayLen(next); 725 } 726 return DtoLoad(DtoGEPi(v->getRVal(), 0,0, "tmp")); 727 } 728 else if (t->ty == Tsarray) { 729 const llvm::ArrayType* t = llvm::cast<llvm::ArrayType>(v->getLVal()->getType()); 730 return DtoConstSize_t(t->getNumElements()); 731 } 732 assert(0); 733 return 0; 734 } 735 736 ////////////////////////////////////////////////////////////////////////////////////////// 737 llvm::Value* DtoArrayPtr(DValue* v) 738 { 739 Type* t = DtoDType(v->getType()); 740 if (t->ty == Tarray) { 741 if (DSliceValue* s = v->isSlice()) { 742 if (s->len) return s->ptr; 743 DValue* next = new DVarValue(t,s->ptr,true); 744 return DtoArrayPtr(next); 745 } 746 return DtoLoad(DtoGEPi(v->getRVal(), 0,1, "tmp")); 747 } 748 else if (t->ty == Tsarray) { 749 return DtoGEPi(v->getRVal(), 0,0, "tmp"); 750 } 751 assert(0); 752 return 0; 753 } 754 gen/arrays.h
r81 r86 1 1 #ifndef LLVMC_GEN_ARRAYS_H 2 2 #define LLVMC_GEN_ARRAYS_H 3 4 struct DSliceValue; 3 5 4 6 const llvm::StructType* DtoArrayType(Type* t); … … 9 11 llvm::Constant* DtoConstStaticArray(const llvm::Type* t, llvm::Constant* c); 10 12 11 void DtoArrayCopy(elem* dst, elem* src); 13 void DtoArrayCopy(DSliceValue* dst, DSliceValue* src); 14 12 15 void DtoArrayInit(llvm::Value* l, llvm::Value* r); 13 16 void DtoArrayInit(llvm::Value* ptr, llvm::Value* dim, llvm::Value* val); … … 17 20 18 21 llvm::Value* DtoNewDynArray(llvm::Value* dst, llvm::Value* dim, Type* dty, bool doinit=true); 19 voidDtoResizeDynArray(llvm::Value* arr, llvm::Value* sz);22 llvm::Value* DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz); 20 23 21 24 void DtoCatAssignElement(llvm::Value* arr, Expression* exp); 25 void DtoCatAssignArray(llvm::Value* arr, Expression* exp); 22 26 void DtoCatArrays(llvm::Value* arr, Expression* e1, Expression* e2); 23 27 … … 31 35 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty); 32 36 37 llvm::Value* DtoArrayLen(DValue* v); 38 llvm::Value* DtoArrayPtr(DValue* v); 39 33 40 #endif // LLVMC_GEN_ARRAYS_H gen/elem.cpp
r83 r86 1 /* 1 2 #include <iostream> 2 3 … … 6 7 #include "gen/irstate.h" 7 8 #include "gen/logger.h" 9 #include "gen/dvalue.h" 8 10 9 11 ////////////////////////////////////////////////////////////////////////////////////////// 10 12 11 elem::elem( )13 elem::elem(Expression* e) 12 14 { 15 exp = e; 16 13 17 mem = 0; 14 18 val = 0; … … 25 29 vardecl = 0; 26 30 funcdecl = 0; 31 32 dvalue = 0; 33 } 34 35 elem::~elem() 36 { 37 delete dvalue; 27 38 } 28 39 29 40 llvm::Value* elem::getValue() 30 41 { 42 if (dvalue && !dvalue->isSlice()) { 43 Logger::println("HAS DVALUE"); 44 return dvalue->getRVal(); 45 } 46 31 47 assert(val || mem); 32 48 switch(type) … … 67 83 return 0; 68 84 } 85 */ gen/elem.h
r83 r86 1 1 #ifndef LLVMDC_GEN_ELEM_H 2 2 #define LLVMDC_GEN_ELEM_H 3 4 #include "dvalue.h" 5 typedef DValue elem; 6 7 /* 3 8 4 9 #include "root.h" 5 10 #include "declaration.h" 6 11 #include "aggregate.h" 12 13 struct DValue; 7 14 8 15 // represents a value. be it a constant literal, a variable etc. … … 23 30 24 31 public: 25 elem(); 32 elem(Expression* e); 33 virtual ~elem(); 34 35 Expression* exp; 26 36 27 37 llvm::Value* mem; … … 42 52 //llvm::Value* getMemory(); 43 53 54 DValue* dvalue; 55 44 56 bool isNull() {return !(mem || val);} 45 57 }; 46 58 59 */ 60 47 61 #endif // LLVMDC_GEN_ELEM_H gen/irstate.cpp
r82 r86 165 165 } 166 166 167 IRExp::IRExp(Expression* l, Expression* r, llvm::Value* val)167 IRExp::IRExp(Expression* l, Expression* r, DValue* val) 168 168 { 169 169 e1 = l; gen/irstate.h
r82 r86 102 102 Expression* e1; 103 103 Expression* e2; 104 llvm::Value* v;104 DValue* v; 105 105 IRExp(); 106 IRExp(Expression* l, Expression* r, llvm::Value* val);106 IRExp(Expression* l, Expression* r, DValue* val); 107 107 }; 108 108 … … 159 159 // VarDeclaration for __dollar, but I can't see how to get the 160 160 // array pointer from this :( 161 std::vector< llvm::Value*> arrays;161 std::vector<DValue*> arrays; 162 162 163 163 // builder helper gen/statements.cpp
r82 r86 24 24 #include "gen/arrays.h" 25 25 #include "gen/todebug.h" 26 #include "gen/dvalue.h" 26 27 27 28 ////////////////////////////////////////////////////////////////////////////// … … 67 68 if (global.params.symdebug) DtoDwarfStopPoint(loc.linnum); 68 69 69 p->exps.push_back(IRExp(NULL,exp,f->llvmRetArg)); 70 elem* e = exp->toElem(p); 70 DValue* rvar = new DVarValue(f->next, f->llvmRetArg, true); 71 72 p->exps.push_back(IRExp(NULL,exp,rvar)); 73 DValue* e = exp->toElem(p); 71 74 p->exps.pop_back(); 72 75 73 if (expty == Tstruct) { 74 if (!e->inplace) 75 DtoStructCopy(f->llvmRetArg,e->getValue()); 76 } 77 else if (expty == Tdelegate) { 78 if (!e->inplace) 79 DtoDelegateCopy(f->llvmRetArg,e->getValue()); 80 } 81 else if (expty == Tarray) { 82 if (e->type == elem::SLICE) { 83 assert(e->mem); 84 DtoSetArray(f->llvmRetArg,e->arg,e->mem); 85 } 86 else if (!e->inplace) { 87 if (e->type == elem::NUL) { 88 DtoNullArray(f->llvmRetArg); 89 } 90 else { 91 DtoArrayAssign(f->llvmRetArg, e->getValue()); 92 } 93 } 94 } 95 else 96 assert(0); 76 if (!e->inPlace()) 77 DtoAssign(rvar, e); 97 78 98 79 IRFunction::FinallyVec& fin = p->func().finallys; … … 104 85 new llvm::BranchInst(fin.back().retbb, p->scopebb()); 105 86 } 106 delete e;107 87 } 108 88 else { 109 89 if (global.params.symdebug) DtoDwarfStopPoint(loc.linnum); 110 elem* e = exp->toElem(p);111 llvm::Value* v = e->get Value();90 DValue* e = exp->toElem(p); 91 llvm::Value* v = e->getRVal(); 112 92 delete e; 113 93 Logger::cout() << "return value is '" <<*v << "'\n"; … … 175 155 LOG_SCOPE; 176 156 177 elem* cond_e = condition->toElem(p);178 llvm::Value* cond_val = cond_e->get Value();157 DValue* cond_e = condition->toElem(p); 158 llvm::Value* cond_val = cond_e->getRVal(); 179 159 delete cond_e; 180 160 … … 266 246 267 247 // create the condition 268 elem* cond_e = condition->toElem(p);269 llvm::Value* cond_val = DtoBoolean(cond_e->get Value());248 DValue* cond_e = condition->toElem(p); 249 llvm::Value* cond_val = DtoBoolean(cond_e->getRVal()); 270 250 delete cond_e; 271 251 … … 309 289 310 290 // create the condition 311 elem* cond_e = condition->toElem(p);312 llvm::Value* cond_val = DtoBoolean(cond_e->get Value());291 DValue* cond_e = condition->toElem(p); 292 llvm::Value* cond_val = DtoBoolean(cond_e->getRVal()); 313 293 delete cond_e; 314 294 … … 348 328 349 329 // create the condition 350 elem* cond_e = condition->toElem(p);351 llvm::Value* cond_val = DtoBoolean(cond_e->get Value());330 DValue* cond_e = condition->toElem(p); 331 llvm::Value* cond_val = DtoBoolean(cond_e->getRVal()); 352 332 delete cond_e; 353 333 … … 367 347 // increment 368 348 if (increment) { 369 elem* inc = increment->toElem(p);349 DValue* inc = increment->toElem(p); 370 350 delete inc; 371 351 } … … 544 524 /* 545 525 assert(exp); 546 elem* e = exp->toElem(p);526 DValue* e = exp->toElem(p); 547 527 delete e; 548 528 */ … … 566 546 567 547 // get the case value 568 elem* e = cs->exp->toElem(p); 569 assert(e->val && llvm::isa<llvm::ConstantInt>(e->val)); 570 llvm::ConstantInt* ec = llvm::cast<llvm::ConstantInt>(e->val); 548 DValue* e = cs->exp->toElem(p); 549 DConstValue* ce = e->isConst(); 550 assert(ce && llvm::isa<llvm::ConstantInt>(ce->c)); 551 llvm::ConstantInt* ec = llvm::cast<llvm::ConstantInt>(ce->c); 571 552 delete e; 572 553 … … 588 569 589 570 // condition var 590 elem* cond = condition->toElem(p);591 llvm::SwitchInst* si = new llvm::SwitchInst(cond->get Value(), defbb ? defbb : endbb, cases->dim, p->scopebb());571 DValue* cond = condition->toElem(p); 572 llvm::SwitchInst* si = new llvm::SwitchInst(cond->getRVal(), defbb ? defbb : endbb, cases->dim, p->scopebb()); 592 573 delete cond; 593 574 … … 679 660 Logger::println("func = %s", func->toChars()); 680 661 681 elem* arr = aggr->toElem(p); 682 llvm::Value* val = arr->getValue(); 683 Logger::cout() << "aggr2llvm = " << *val << '\n'; 662 DValue* arr = aggr->toElem(p); 663 llvm::Value* val = 0; 664 if (!arr->isSlice()) { 665 val = arr->getRVal(); 666 Logger::cout() << "aggr2llvm = " << *val << '\n'; 667 } 684 668 685 669 llvm::Value* numiters = 0; … … 690 674 691 675 const llvm::Type* valtype = DtoType(value->type); 692 llvm::Value* valvar = ! value->isRef() ? new llvm::AllocaInst(valtype, "foreachval", p->topallocapoint()) : NULL;676 llvm::Value* valvar = !(value->isRef() || value->isOut()) ? new llvm::AllocaInst(valtype, "foreachval", p->topallocapoint()) : NULL; 693 677 694 678 Type* aggrtype = DtoDType(aggr->type); … … 703 687 else if (aggrtype->ty == Tarray) 704 688 { 705 if ( arr->type == elem::SLICE) {706 numiters = arr->arg;707 val = arr->mem;689 if (DSliceValue* slice = arr->isSlice()) { 690 numiters = slice->len; 691 val = slice->ptr; 708 692 } 709 693 else { … … 761 745 value->llvmValue = new llvm::GetElementPtrInst(val,loadedKey,"tmp",p->scopebb()); 762 746 763 if (!value->isRef() ) {764 elem* e = new elem;765 e->mem = value->llvmValue;766 e->type = elem::VAR;767 DtoAssign(DtoDType(value->type), valvar, e->getValue());768 delete e;747 if (!value->isRef() && !value->isOut()) { 748 DValue* dst = new DVarValue(value->type, valvar, true); 749 DValue* src = new DVarValue(value->type, value->llvmValue, true); 750 DtoAssign(dst, src); 751 delete dst; 752 delete src; 769 753 value->llvmValue = valvar; 770 754 } … … 799 783 llvmBB = new llvm::BasicBlock("label", p->topfunc(), oldend); 800 784 801 new llvm::BranchInst(llvmBB, p->scopebb()); 785 if (!p->scopereturned()) 786 new llvm::BranchInst(llvmBB, p->scopebb()); 787 802 788 p->scope() = IRScope(llvmBB,oldend); 803 statement->toIR(p); 789 if (statement) 790 statement->toIR(p); 804 791 } 805 792 … … 818 805 if (label->statement->llvmBB == NULL) 819 806 label->statement->llvmBB = new llvm::BasicBlock("label", p->topfunc()); 807 assert(!p->scopereturned()); 820 808 new llvm::BranchInst(label->statement->llvmBB, p->scopebb()); 821 809 p->scope() = IRScope(bb,oldend); … … 832 820 assert(body); 833 821 834 elem* e = exp->toElem(p);835 wthis->llvmValue = e->get Value();822 DValue* e = exp->toElem(p); 823 wthis->llvmValue = e->getRVal(); 836 824 delete e; 837 825 gen/toir.cpp
r85 r86 29 29 #include "gen/arrays.h" 30 30 31 ////////////////////////////////////////////////////////////////////////////////////////// 32 33 elem* DeclarationExp::toElem(IRState* p) 31 #include "gen/dvalue.h" 32 33 ////////////////////////////////////////////////////////////////////////////////////////// 34 35 DValue* DeclarationExp::toElem(IRState* p) 34 36 { 35 37 Logger::print("DeclarationExp::toElem: %s | T=%s\n", toChars(), type->toChars()); 36 38 LOG_SCOPE; 37 elem* e = new elem;38 39 39 40 // variable declaration … … 65 66 vd->llvmValue = allocainst; 66 67 } 67 elem* ie = DtoInitializer(vd->init);68 DValue* ie = DtoInitializer(vd->init); 68 69 delete ie; 69 70 } 71 72 return new DVarValue(vd, vd->llvmValue, true); 70 73 } 71 74 // struct declaration … … 98 101 assert(0); 99 102 } 100 return e;101 } 102 103 ////////////////////////////////////////////////////////////////////////////////////////// 104 105 elem* VarExp::toElem(IRState* p)103 return 0; 104 } 105 106 ////////////////////////////////////////////////////////////////////////////////////////// 107 108 DValue* VarExp::toElem(IRState* p) 106 109 { 107 110 Logger::print("VarExp::toElem: %s | %s\n", toChars(), type->toChars()); 108 111 LOG_SCOPE; 109 110 elem* e = new elem;111 112 112 113 assert(var); … … 119 120 { 120 121 Logger::println("Id::_arguments"); 121 vd->llvmValue = p->func().decl->llvmArguments; 122 if (!vd->llvmValue) 123 vd->llvmValue = p->func().decl->llvmArguments; 122 124 assert(vd->llvmValue); 123 e->mem = vd->llvmValue; 124 e->type = elem::VAR; 125 return new DVarValue(vd, vd->llvmValue, true); 125 126 } 126 127 // _argptr … … 128 129 { 129 130 Logger::println("Id::_argptr"); 130 vd->llvmValue = p->func().decl->llvmArgPtr; 131 if (!vd->llvmValue) 132 vd->llvmValue = p->func().decl->llvmArgPtr; 131 133 assert(vd->llvmValue); 132 e->mem = vd->llvmValue; 133 e->type = elem::VAR; 134 return new DVarValue(vd, vd->llvmValue, true); 134 135 } 135 136 // _dollar … … 138 139 Logger::println("Id::dollar"); 139 140 assert(!p->arrays.empty()); 140 llvm::Value* tmp = DtoGEPi(p->arrays.back(),0,0,"tmp",p->scopebb()); 141 e->val = new llvm::LoadInst(tmp,"tmp",p->scopebb()); 142 e->type = elem::VAL; 141 llvm::Value* tmp = DtoArrayLen(p->arrays.back()); 142 return new DVarValue(vd, tmp, false); 143 143 } 144 144 // typeinfo … … 149 149 assert(tid->llvmValue); 150 150 const llvm::Type* vartype = DtoType(type); 151 llvm::Value* m; 151 152 if (tid->llvmValue->getType() != llvm::PointerType::get(vartype)) 152 e->mem = p->ir->CreateBitCast(tid->llvmValue, vartype, "tmp");153 m = p->ir->CreateBitCast(tid->llvmValue, vartype, "tmp"); 153 154 else 154 e->mem = tid->llvmValue;155 e->type = elem::VAR;155 m = tid->llvmValue; 156 return new DVarValue(vd, m, true); 156 157 } 157 158 // nested variable 158 159 else if (vd->nestedref) { 159 160 Logger::println("nested variable"); 160 e->mem = DtoNestedVariable(vd); 161 e->type = elem::VAR; 162 e->vardecl = vd; 161 return new DVarValue(vd, DtoNestedVariable(vd), true); 163 162 } 164 163 // function parameter … … 171 170 } 172 171 if (vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type) || llvm::isa<llvm::AllocaInst>(vd->llvmValue)) { 173 e->mem = vd->llvmValue; 174 e->type = elem::VAR; 175 e->vardecl = vd; 172 return new DVarValue(vd, vd->llvmValue, true); 176 173 } 177 174 else if (llvm::isa<llvm::Argument>(vd->llvmValue)) { 178 e->val = vd->llvmValue; 179 e->type = elem::VAL; 180 e->vardecl = vd; 175 return new DImValue(type, vd->llvmValue); 181 176 } 182 177 else assert(0); … … 187 182 vd->toObjFile(); 188 183 assert(vd->llvmValue); 189 e->mem = vd->llvmValue; 190 e->vardecl = vd; 191 e->type = elem::VAR; 192 } 193 194 assert(e->mem || e->val); 184 return new DVarValue(vd, vd->llvmValue, true); 185 } 195 186 } 196 187 else if (FuncDeclaration* fdecl = var->isFuncDeclaration()) 197 188 { 198 189 Logger::println("FuncDeclaration"); 199 if (fdecl->llvmInternal != LLVMva_arg && fdecl->llvmValue == 0)190 if (fdecl->llvmInternal != LLVMva_arg)// && fdecl->llvmValue == 0) 200 191 fdecl->toObjFile(); 201 e->val = fdecl->llvmValue; 202 e->type = elem::FUNC; 203 e->funcdecl = fdecl; 192 return new DFuncValue(fdecl, fdecl->llvmValue); 204 193 } 205 194 else if (SymbolDeclaration* sdecl = var->isSymbolDeclaration()) … … 210 199 assert(sdecltype->ty == Tstruct); 211 200 TypeStruct* ts = (TypeStruct*)sdecltype; 212 e->mem = ts->llvmInit; 213 assert(e->mem); 214 e->type = elem::VAR; 201 assert(ts->llvmInit); 202 return new DVarValue(type, ts->llvmInit, true); 215 203 } 216 204 else … … 219 207 } 220 208 221 return e;209
