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();*/