Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
20:42bf2eb2973b | 21:8d45266bbabe |
---|---|
237 | 237 |
238 ////////////////////////////////////////////////////////////////////////////////////////// | 238 ////////////////////////////////////////////////////////////////////////////////////////// |
239 | 239 |
240 elem* StringExp::toElem(IRState* p) | 240 elem* StringExp::toElem(IRState* p) |
241 { | 241 { |
242 Logger::print("StringExp::toElem: %s\n", toChars()); | 242 Logger::print("StringExp::toElem: %s | \n", toChars(), type->toChars()); |
243 LOG_SCOPE; | 243 LOG_SCOPE; |
244 | 244 |
245 assert(type->next->ty == Tchar && "Only char is supported"); | 245 assert(type->next->ty == Tchar && "Only char is supported"); |
246 assert(sz == 1); | 246 assert(sz == 1); |
247 | 247 |
255 llvm::Constant* _init = llvm::ConstantArray::get(cont,true); | 255 llvm::Constant* _init = llvm::ConstantArray::get(cont,true); |
256 | 256 |
257 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage; | 257 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage; |
258 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(at,true,_linkage,_init,"stringliteral",gIR->module); | 258 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(at,true,_linkage,_init,"stringliteral",gIR->module); |
259 | 259 |
260 llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); | 260 llvm::ConstantInt* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); |
261 llvm::Value* arrptr = LLVM_DtoGEP(gvar,zero,zero,"tmp",p->scopebb()); | 261 //llvm::Value* arrptr = LLVM_DtoGEP(gvar,zero,zero,"tmp",p->scopebb()); |
262 llvm::Constant* idxs[2] = { zero, zero }; | |
263 llvm::Constant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); | |
262 | 264 |
263 elem* e = new elem; | 265 elem* e = new elem; |
264 | 266 |
265 if (type->ty == Tarray) { | 267 if (type->ty == Tarray) { |
266 llvm::Constant* clen = llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false); | 268 llvm::Constant* clen = llvm::ConstantInt::get(LLVM_DtoSize_t(),len,false); |
270 e->mem = arrptr; | 272 e->mem = arrptr; |
271 return e; | 273 return e; |
272 } | 274 } |
273 else { | 275 else { |
274 llvm::Value* arr = p->toplval(); | 276 llvm::Value* arr = p->toplval(); |
275 LLVM_DtoSetArray(arr, clen, arrptr); | 277 if (llvm::isa<llvm::GlobalVariable>(arr)) { |
276 } | 278 e->val = LLVM_DtoConstantSlice(clen, arrptr); |
279 } | |
280 else { | |
281 LLVM_DtoSetArray(arr, clen, arrptr); | |
282 e->inplace = true; | |
283 } | |
284 } | |
285 } | |
286 else if (type->ty == Tsarray) { | |
287 const llvm::Type* dstType = llvm::PointerType::get(llvm::ArrayType::get(ct, len)); | |
288 e->mem = new llvm::BitCastInst(gvar, dstType, "tmp", gIR->scopebb()); | |
277 } | 289 } |
278 else if (type->ty == Tpointer) { | 290 else if (type->ty == Tpointer) { |
279 e->mem = arrptr; | 291 e->mem = arrptr; |
280 } | 292 } |
281 else { | 293 else { |
282 assert(0); | 294 assert(0); |
283 } | 295 } |
284 | 296 |
285 e->inplace = true; | |
286 e->type = elem::VAL; | 297 e->type = elem::VAL; |
287 | 298 |
288 return e; | 299 return e; |
289 } | 300 } |
290 | 301 |
932 llargs[j] = allocaInst; | 943 llargs[j] = allocaInst; |
933 assert(llargs[j] != 0); | 944 assert(llargs[j] != 0); |
934 } | 945 } |
935 } | 946 } |
936 else if (!fnarg || fnarg->llvmCopy) { | 947 else if (!fnarg || fnarg->llvmCopy) { |
937 llargs[j] = arg->getValue(); | 948 Logger::println("regular arg"); |
949 assert(arg->type != elem::SLICE); | |
950 llargs[j] = arg->arg ? arg->arg : arg->getValue(); | |
938 assert(llargs[j] != 0); | 951 assert(llargs[j] != 0); |
939 } | 952 } |
940 else { | 953 else { |
954 Logger::println("as ptr arg"); | |
941 llargs[j] = arg->mem ? arg->mem : arg->val; | 955 llargs[j] = arg->mem ? arg->mem : arg->val; |
942 assert(llargs[j] != 0); | 956 assert(llargs[j] != 0); |
943 } | 957 } |
944 | 958 |
945 delete arg; | 959 delete arg; |
954 for (int i=0; i<n; ++i) | 968 for (int i=0; i<n; ++i) |
955 { | 969 { |
956 Logger::cout() << *llargs[i] << '\n'; | 970 Logger::cout() << *llargs[i] << '\n'; |
957 } | 971 } |
958 | 972 |
959 //Logger::cout() << "Calling: " << *funcval->getType() << '\n'; | 973 Logger::cout() << "Calling: " << *funcval->getType() << '\n'; |
960 | 974 |
961 // call the function | 975 // call the function |
962 llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); | 976 llvm::CallInst* call = new llvm::CallInst(funcval, llargs.begin(), llargs.end(), varname, p->scopebb()); |
963 e->val = call; | 977 e->val = call; |
964 | 978 |
1153 e->val = new llvm::GetElementPtrInst(vd->llvmValue,idx0,idx0,"tmp",p->scopebb());*/ | 1167 e->val = new llvm::GetElementPtrInst(vd->llvmValue,idx0,idx0,"tmp",p->scopebb());*/ |
1154 e = new elem; | 1168 e = new elem; |
1155 llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); | 1169 llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); |
1156 //llvm::Value* idx1 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); | 1170 //llvm::Value* idx1 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false); |
1157 e->mem = LLVM_DtoGEP(vd->llvmValue,idx0,idx0,"tmp",p->scopebb()); | 1171 e->mem = LLVM_DtoGEP(vd->llvmValue,idx0,idx0,"tmp",p->scopebb()); |
1172 e->arg = vd->llvmValue; | |
1158 e->type = elem::VAL; | 1173 e->type = elem::VAL; |
1159 } | 1174 } |
1160 else if (offset == 0) { | 1175 else if (offset == 0) { |
1161 /*if (!vd->llvmValue) | 1176 /*if (!vd->llvmValue) |
1162 vd->toObjFile();*/ | 1177 vd->toObjFile();*/ |