diff gen/tollvm.cpp @ 217:0806379a5eca trunk

[svn r233] Added: -oq command line option for writing fully qualified object names. Added: started support for x86 80bit floating point. Changed: aggregates passed by value now use the llvm 'byval' parameter attribute, also lays ground work for using other attributes. Changed: eliminated a lot more std::vectorS, these showed up pretty much at the top when profiling! Changed: performed other misc. cleanups. Changed: halt expression now call the new llvm trap intrinsic instead of an assert(0). Changed: dstress suite now passes -O0 by default, this only eliminates unreferenced globals, which speeds up linking quite a bit.
author lindquist
date Thu, 05 Jun 2008 06:38:36 +0200
parents 7816aafeea3c
children a168a2c3ea48
line wrap: on
line diff
--- a/gen/tollvm.cpp	Tue Jun 03 22:32:59 2008 +0200
+++ b/gen/tollvm.cpp	Thu Jun 05 06:38:36 2008 +0200
@@ -26,6 +26,13 @@
     return (t == Tstruct || t == Tarray || t == Tdelegate || t == Tsarray || typ->iscomplex());
 }
 
+bool DtoIsReturnedInArg(Type* type)
+{
+    Type* typ = DtoDType(type);
+    TY t = typ->ty;
+    return (t == Tstruct || t == Tarray || t == Tdelegate || t == Tsarray || typ->iscomplex());
+}
+
 Type* DtoDType(Type* t)
 {
     if (t->ty == Ttypedef) {
@@ -67,9 +74,10 @@
         return llvm::Type::FloatTy;
     case Tfloat64:
     case Timaginary64:
+        return llvm::Type::DoubleTy;
     case Tfloat80:
     case Timaginary80:
-        return llvm::Type::DoubleTy;
+        return (global.params.useFP80) ? llvm::Type::X86_FP80Ty : llvm::Type::DoubleTy;
 
     // complex
     case Tcomplex32:
@@ -590,46 +598,42 @@
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-LLValue* DtoGEP(LLValue* ptr, LLValue* i0, LLValue* i1, const std::string& var, llvm::BasicBlock* bb)
+LLValue* DtoGEP(LLValue* ptr, LLValue* i0, LLValue* i1, const char* var, llvm::BasicBlock* bb)
 {
-    std::vector<LLValue*> v(2);
+    LLSmallVector<LLValue*,2> v(2);
     v[0] = i0;
     v[1] = i1;
-    Logger::cout() << "DtoGEP: " << *ptr << ", " << *i0 << ", " << *i1 << '\n';
     return llvm::GetElementPtrInst::Create(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb());
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-LLValue* DtoGEP(LLValue* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb)
+LLValue* DtoGEPi(LLValue* ptr, const DStructIndexVector& src, const char* var, llvm::BasicBlock* bb)
 {
     size_t n = src.size();
-    std::vector<LLValue*> dst(n, NULL);
-    //std::ostream& ostr = Logger::cout();
-    //ostr << "indices for '" << *ptr << "':";
-    for (size_t i=0; i<n; ++i)
-    {
-        //ostr << ' ' << i;
-        dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false);
-    }
-    //ostr << '\n';*/
+    LLSmallVector<LLValue*, 3> dst(n);
+
+    size_t j=0;
+    for (DStructIndexVector::const_iterator i=src.begin(); i!=src.end(); ++i)
+        dst[j++] = DtoConstUint(*i);
+
     return llvm::GetElementPtrInst::Create(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb());
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-LLValue* DtoGEPi(LLValue* ptr, unsigned i, const std::string& var, llvm::BasicBlock* bb)
+LLValue* DtoGEPi(LLValue* ptr, unsigned i, const char* var, llvm::BasicBlock* bb)
 {
     return llvm::GetElementPtrInst::Create(ptr, llvm::ConstantInt::get(llvm::Type::Int32Ty, i, false), var, bb?bb:gIR->scopebb());
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 
-LLValue* DtoGEPi(LLValue* ptr, unsigned i0, unsigned i1, const std::string& var, llvm::BasicBlock* bb)
+LLValue* DtoGEPi(LLValue* ptr, unsigned i0, unsigned i1, const char* var, llvm::BasicBlock* bb)
 {
-    std::vector<LLValue*> v(2);
-    v[0] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i0, false);
-    v[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, i1, false);
+    LLSmallVector<LLValue*,2> v(2);
+    v[0] = DtoConstUint(i0);
+    v[1] = DtoConstUint(i1);
     return llvm::GetElementPtrInst::Create(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb());
 }
 
@@ -642,11 +646,8 @@
     // get type info
     LLConstant* ti = DtoTypeInfoOf(newtype);
     assert(isaPointer(ti));
-    // call runtime
-    LLSmallVector<LLValue*,1> arg;
-    arg.push_back(ti);
-    // allocate
-    LLValue* mem = gIR->ir->CreateCall(fn, arg.begin(), arg.end(), ".gc_mem");
+    // call runtime allocator
+    LLValue* mem = gIR->ir->CreateCall(fn, ti, ".gc_mem");
     // cast
     return DtoBitCast(mem, getPtrToType(DtoType(newtype)), ".gc_mem");
 }
@@ -707,6 +708,10 @@
     const char* fname = msg ? "_d_assert_msg" : "_d_assert";
     llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname);
 
+    // param attrs
+    llvm::PAListPtr palist;
+    int idx = 1;
+
     c = DtoConstString(loc->filename);
 
     // msg param
@@ -727,6 +732,7 @@
         {
             args.push_back(msg->getRVal());
         }
+        palist = palist.addAttr(idx++, llvm::ParamAttr::ByVal);
     }
 
     // file param
@@ -740,7 +746,10 @@
     DtoStore(c->getOperand(0), ptr);
     ptr = DtoGEPi(alloc, 0,1, "tmp");
     DtoStore(c->getOperand(1), ptr);
+
     args.push_back(alloc);
+    palist = palist.addAttr(idx++, llvm::ParamAttr::ByVal);
+
 
     // line param
     c = DtoConstUint(loc->linnum);
@@ -748,6 +757,7 @@
 
     // call
     llvm::CallInst* call = llvm::CallInst::Create(fn, args.begin(), args.end(), "", gIR->scopebb());
+    call->setParamAttrs(palist);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////