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) {