diff gen/functions.cpp @ 1051:dc608dc33081

Make IrFuncTy a member of TypeFunction. Reset between modules compiled in the same LDC call.
author Christian Kamm <kamm incasoftware de>
date Sat, 07 Mar 2009 14:25:30 +0100
parents afe271b0e271
children 802d508f66f1
line wrap: on
line diff
--- a/gen/functions.cpp	Fri Mar 06 21:15:13 2009 +0100
+++ b/gen/functions.cpp	Sat Mar 07 14:25:30 2009 +0100
@@ -33,16 +33,15 @@
 
     // already built ?
     if (type->ir.type != NULL) {
-        assert(f->fty != NULL);
+        //assert(f->fty != NULL);
         return llvm::cast<llvm::FunctionType>(type->ir.type->get());
     }
 
     // Tell the ABI we're resolving a new function type
     gABI->newFunctionType(f);
 
-    // create new ir funcTy
-    assert(f->fty == NULL);
-    f->fty = new IrFuncTy();
+    // start new ir funcTy
+    f->fty.reset();
 
     // llvm idx counter
     size_t lidx = 0;
@@ -50,7 +49,7 @@
     // main needs a little special handling
     if (ismain)
     {
-        f->fty->ret = new IrFuncTyArg(Type::tint32, false);
+        f->fty.ret = new IrFuncTyArg(Type::tint32, false);
     }
     // sane return value
     else
@@ -60,7 +59,7 @@
         // sret return
         if (gABI->returnInArg(f))
         {
-            f->fty->arg_sret = new IrFuncTyArg(rt, true, llvm::Attribute::StructRet);
+            f->fty.arg_sret = new IrFuncTyArg(rt, true, llvm::Attribute::StructRet);
             rt = Type::tvoid;
             lidx++;
         }
@@ -69,7 +68,7 @@
         {
             a = se;
         }
-        f->fty->ret = new IrFuncTyArg(rt, false, a);
+        f->fty.ret = new IrFuncTyArg(rt, false, a);
     }
     lidx++;
 
@@ -77,14 +76,14 @@
     if (thistype)
     {
         bool toref = (thistype->toBasetype()->ty == Tstruct);
-        f->fty->arg_this = new IrFuncTyArg(thistype, toref);
+        f->fty.arg_this = new IrFuncTyArg(thistype, toref);
         lidx++;
     }
 
     // and nested functions
     else if (nesttype)
     {
-        f->fty->arg_nest = new IrFuncTyArg(nesttype, false);
+        f->fty.arg_nest = new IrFuncTyArg(nesttype, false);
         lidx++;
     }
 
@@ -98,16 +97,16 @@
             if (f->varargs == 1)
             {
                 // _arguments
-                f->fty->arg_arguments = new IrFuncTyArg(Type::typeinfo->type->arrayOf(), false);
+                f->fty.arg_arguments = new IrFuncTyArg(Type::typeinfo->type->arrayOf(), false);
                 lidx++;
                 // _argptr
-                f->fty->arg_argptr = new IrFuncTyArg(Type::tvoid->pointerTo(), false);
+                f->fty.arg_argptr = new IrFuncTyArg(Type::tvoid->pointerTo(), false);
                 lidx++;
             }
         }
         else if (f->linkage == LINKc)
         {
-            f->fty->c_vararg = true;
+            f->fty.c_vararg = true;
         }
         else
         {
@@ -122,7 +121,7 @@
     if (ismain && nargs == 0)
     {
         Type* mainargs = Type::tchar->arrayOf()->arrayOf();
-        f->fty->args.push_back(new IrFuncTyArg(mainargs, false));
+        f->fty.args.push_back(new IrFuncTyArg(mainargs, false));
         lidx++;
     }
     // add explicit parameters
@@ -157,7 +156,7 @@
             a |= DtoShouldExtend(argtype);
         }
 
-        f->fty->args.push_back(new IrFuncTyArg(argtype, byref, a));
+        f->fty.args.push_back(new IrFuncTyArg(argtype, byref, a));
         lidx++;
     }
 
@@ -171,26 +170,26 @@
     std::vector<const LLType*> argtypes;
     argtypes.reserve(lidx);
 
-    if (f->fty->arg_sret) argtypes.push_back(f->fty->arg_sret->ltype);
-    if (f->fty->arg_this) argtypes.push_back(f->fty->arg_this->ltype);
-    if (f->fty->arg_nest) argtypes.push_back(f->fty->arg_nest->ltype);
-    if (f->fty->arg_arguments) argtypes.push_back(f->fty->arg_arguments->ltype);
-    if (f->fty->arg_argptr) argtypes.push_back(f->fty->arg_argptr->ltype);
+    if (f->fty.arg_sret) argtypes.push_back(f->fty.arg_sret->ltype);
+    if (f->fty.arg_this) argtypes.push_back(f->fty.arg_this->ltype);
+    if (f->fty.arg_nest) argtypes.push_back(f->fty.arg_nest->ltype);
+    if (f->fty.arg_arguments) argtypes.push_back(f->fty.arg_arguments->ltype);
+    if (f->fty.arg_argptr) argtypes.push_back(f->fty.arg_argptr->ltype);
 
     size_t beg = argtypes.size();
-    size_t nargs2 = f->fty->args.size();
+    size_t nargs2 = f->fty.args.size();
     for (size_t i = 0; i < nargs2; i++)
     {
-        argtypes.push_back(f->fty->args[i]->ltype);
+        argtypes.push_back(f->fty.args[i]->ltype);
     }
 
     // reverse params?
-    if (f->fty->reverseParams && nargs2 > 1)
+    if (f->fty.reverseParams && nargs2 > 1)
     {
         std::reverse(argtypes.begin() + beg, argtypes.end());
     }
 
-    llvm::FunctionType* functype = llvm::FunctionType::get(f->fty->ret->ltype, argtypes, f->fty->c_vararg);
+    llvm::FunctionType* functype = llvm::FunctionType::get(f->fty.ret->ltype, argtypes, f->fty.c_vararg);
     f->ir.type = new llvm::PATypeHolder(functype);
 
     Logger::cout() << "Final function type: " << *functype << "\n";
@@ -211,17 +210,16 @@
     const llvm::FunctionType* fty = 0;
 
     // create new ir funcTy
-    assert(f->fty == NULL);
-    f->fty = new IrFuncTy();
-    f->fty->ret = new IrFuncTyArg(Type::tvoid, false);
+    f->fty.reset();
+    f->fty.ret = new IrFuncTyArg(Type::tvoid, false);
 
-    f->fty->args.push_back(new IrFuncTyArg(Type::tvoid->pointerTo(), false));
+    f->fty.args.push_back(new IrFuncTyArg(Type::tvoid->pointerTo(), false));
 
     if (fdecl->llvmInternal == LLVMva_start)
         fty = GET_INTRINSIC_DECL(vastart)->getFunctionType();
     else if (fdecl->llvmInternal == LLVMva_copy) {
         fty = GET_INTRINSIC_DECL(vacopy)->getFunctionType();
-        f->fty->args.push_back(new IrFuncTyArg(Type::tvoid->pointerTo(), false));
+        f->fty.args.push_back(new IrFuncTyArg(Type::tvoid->pointerTo(), false));
     }
     else if (fdecl->llvmInternal == LLVMva_end)
         fty = GET_INTRINSIC_DECL(vaend)->getFunctionType();
@@ -359,10 +357,10 @@
 
     // handle implicit args
     #define ADD_PA(X) \
-    if (f->fty->X) { \
-        if (f->fty->X->attrs) { \
+    if (f->fty.X) { \
+        if (f->fty.X->attrs) { \
             PAWI.Index = idx; \
-            PAWI.Attrs = f->fty->X->attrs; \
+            PAWI.Attrs = f->fty.X->attrs; \
             attrs.push_back(PAWI); \
         } \
         idx++; \
@@ -386,11 +384,11 @@
         Argument* fnarg = Argument::getNth(f->parameters, k);
         assert(fnarg);
 
-        attrptr[k] = f->fty->args[k]->attrs;
+        attrptr[k] = f->fty.args[k]->attrs;
     }
 
     // reverse params?
-    if (f->fty->reverseParams)
+    if (f->fty.reverseParams)
     {
         std::reverse(attrptr.begin(), attrptr.end());
     }
@@ -500,26 +498,26 @@
         // name parameters
         llvm::Function::arg_iterator iarg = func->arg_begin();
 
-        if (f->fty->arg_sret) {
+        if (f->fty.arg_sret) {
             iarg->setName(".sret_arg");
             fdecl->ir.irFunc->retArg = iarg;
             ++iarg;
         }
 
-        if (f->fty->arg_this) {
+        if (f->fty.arg_this) {
             iarg->setName(".this_arg");
             fdecl->ir.irFunc->thisArg = iarg;
             assert(fdecl->ir.irFunc->thisArg);
             ++iarg;
         }
-        else if (f->fty->arg_nest) {
+        else if (f->fty.arg_nest) {
             iarg->setName(".nest_arg");
             fdecl->ir.irFunc->nestArg = iarg;
             assert(fdecl->ir.irFunc->nestArg);
             ++iarg;
         }
 
-        if (f->fty->arg_argptr) {
+        if (f->fty.arg_argptr) {
             iarg->setName("._arguments");
             fdecl->ir.irFunc->_arguments = iarg;
             ++iarg;
@@ -535,7 +533,7 @@
             if (fdecl->parameters && fdecl->parameters->dim > k)
             {
                 Dsymbol* argsym;
-                if (f->fty->reverseParams)
+                if (f->fty.reverseParams)
                     argsym = (Dsymbol*)fdecl->parameters->data[fdecl->parameters->dim-k-1];
                 else
                     argsym = (Dsymbol*)fdecl->parameters->data[k];
@@ -655,7 +653,7 @@
     }
 
     // give the 'this' argument storage and debug info
-    if (f->fty->arg_this)
+    if (f->fty.arg_this)
     {
         LLValue* thisvar = irfunction->thisArg;
         assert(thisvar);
@@ -685,7 +683,7 @@
     // and debug info
     if (fd->parameters)
     {
-        size_t n = f->fty->args.size();
+        size_t n = f->fty.args.size();
         assert(n == fd->parameters->dim);
         for (int i=0; i < n; ++i)
         {
@@ -708,7 +706,7 @@
             bool refout = vd->storage_class & (STCref | STCout);
             bool lazy = vd->storage_class & STClazy;
 
-            if (!refout && (!f->fty->args[i]->byref || lazy))
+            if (!refout && (!f->fty.args[i]->byref || lazy))
             {
                 // alloca a stack slot for this first class value arg
                 const LLType* argt;
@@ -720,7 +718,7 @@
 
                 // let the abi transform the argument back first
                 DImValue arg_dval(vd->type, irloc->value);
-                f->fty->getParam(vd->type, i, &arg_dval, mem);
+                f->fty.getParam(vd->type, i, &arg_dval, mem);
 
                 // set the arg var value to the alloca
                 irloc->value = mem;