Mercurial > projects > ldc
diff gen/toir.c @ 21:8d45266bbabe trunk
[svn r25] * Fixed a lot of problems with string literals
* Fixed slice-slice copying assignment
author | lindquist |
---|---|
date | Thu, 04 Oct 2007 07:01:15 +0200 |
parents | c05ef76f1c20 |
children | 77e3d1ddae3f |
line wrap: on
line diff
--- a/gen/toir.c Thu Oct 04 04:28:30 2007 +0200 +++ b/gen/toir.c Thu Oct 04 07:01:15 2007 +0200 @@ -239,7 +239,7 @@ elem* StringExp::toElem(IRState* p) { - Logger::print("StringExp::toElem: %s\n", toChars()); + Logger::print("StringExp::toElem: %s | \n", toChars(), type->toChars()); LOG_SCOPE; assert(type->next->ty == Tchar && "Only char is supported"); @@ -257,8 +257,10 @@ llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage; llvm::GlobalVariable* gvar = new llvm::GlobalVariable(at,true,_linkage,_init,"stringliteral",gIR->module); - llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); - llvm::Value* arrptr = LLVM_DtoGEP(gvar,zero,zero,"tmp",p->scopebb()); + llvm::ConstantInt* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); + //llvm::Value* arrptr = LLVM_DtoGEP(gvar,zero,zero,"tmp",p->scopebb()); + llvm::Constant* idxs[2] = { zero, zero }; + llvm::Constant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); elem* e = new elem; @@ -272,9 +274,19 @@ } else { llvm::Value* arr = p->toplval(); - LLVM_DtoSetArray(arr, clen, arrptr); + if (llvm::isa<llvm::GlobalVariable>(arr)) { + e->val = LLVM_DtoConstantSlice(clen, arrptr); + } + else { + LLVM_DtoSetArray(arr, clen, arrptr); + e->inplace = true; + } } } + else if (type->ty == Tsarray) { + const llvm::Type* dstType = llvm::PointerType::get(llvm::ArrayType::get(ct, len)); + e->mem = new llvm::BitCastInst(gvar, dstType, "tmp", gIR->scopebb()); + } else if (type->ty == Tpointer) { e->mem = arrptr; } @@ -282,7 +294,6 @@ assert(0); } - e->inplace = true; e->type = elem::VAL; return e; @@ -934,10 +945,13 @@ } } else if (!fnarg || fnarg->llvmCopy) { - llargs[j] = arg->getValue(); + Logger::println("regular arg"); + assert(arg->type != elem::SLICE); + llargs[j] = arg->arg ? arg->arg : arg->getValue(); assert(llargs[j] != 0); } else { + Logger::println("as ptr arg"); llargs[j] = arg->mem ? arg->mem : arg->val; assert(llargs[j] != 0); } @@ -956,7 +970,7 @@ Logger::cout() << *llargs[i] << '\n'; } - //Logger::cout() << "Calling: " << *funcval->getType() << '\n'; + Logger::cout() << "Calling: " << *funcval->getType() << '\n'; // call the function llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); @@ -1155,6 +1169,7 @@ llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); //llvm::Value* idx1 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); e->mem = LLVM_DtoGEP(vd->llvmValue,idx0,idx0,"tmp",p->scopebb()); + e->arg = vd->llvmValue; e->type = elem::VAL; } else if (offset == 0) {