diff gen/functions.cpp @ 454:283d113d4753

Added generation of the llvm 'sret' parameter attribute where applicable. Fixed some wrong argument handling code when setting parameter attributes. Updated the tango unittest script in the tango patch, does not work yet, all modules don't compile...
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sat, 02 Aug 2008 02:54:57 +0200
parents 30ef3c7bddca
children d3d3519b72e8
line wrap: on
line diff
--- a/gen/functions.cpp	Sat Aug 02 01:23:53 2008 +0200
+++ b/gen/functions.cpp	Sat Aug 02 02:54:57 2008 +0200
@@ -158,11 +158,10 @@
             at = getPtrToType(DtoType(ltd));
             Logger::cout() << "lazy updated to: " << *at << '\n';
             paramvec.back() = at;
+            // lazy doesn't need byval as the delegate is not visible to the user
         }
     }
 
-    //warning("set %d byval args for type: %s", nbyval, f->toChars());
-
     // construct function type
     bool isvararg = !(typesafeVararg || arrayVararg) && f->varargs;
     llvm::FunctionType* functype = llvm::FunctionType::get(actualRettype, paramvec, isvararg);
@@ -306,8 +305,6 @@
 
 static void set_param_attrs(TypeFunction* f, llvm::Function* func, FuncDeclaration* fdecl)
 {
-    assert(f->parameters);
-
     int llidx = 1;
     if (f->llvmRetInPtr) ++llidx;
     if (f->llvmUsesThis) ++llidx;
@@ -328,6 +325,14 @@
         attrs.push_back(PAWI);
     }
 
+    // set sret param
+    if (f->llvmRetInPtr)
+    {
+        PAWI.Index = 1;
+        PAWI.Attrs = llvm::ParamAttr::StructRet;
+        attrs.push_back(PAWI);
+    }
+
     // set byval attrs on implicit main arg
     if (fdecl->isMain() && Argument::dim(f->parameters) == 0)
     {
@@ -338,9 +343,9 @@
     }
 
     // set attrs on the rest of the arguments
-    for (; llidx <= funcNumArgs && f->parameters->dim > k; ++llidx,++k)
+    for (; llidx <= funcNumArgs && Argument::dim(f->parameters) > k; ++llidx,++k)
     {
-        Argument* fnarg = (Argument*)f->parameters->data[k];
+        Argument* fnarg = Argument::getNth(f->parameters, k);
         assert(fnarg);
 
         PAWI.Index = llidx;
@@ -428,7 +433,7 @@
     assert(llvm::isa<llvm::FunctionType>(f->ir.type->get()));
 
     // parameter attributes
-    if (f->parameters && !fdecl->isIntrinsic()) {
+    if (!fdecl->isIntrinsic()) {
         set_param_attrs(f, func, fdecl);
     }
 
@@ -458,7 +463,7 @@
             ++iarg;
         }
         if (f->llvmUsesThis) {
-            iarg->setName("this");
+            iarg->setName(fdecl->isNested()?".context":"this");
             fdecl->ir.irFunc->thisVar = iarg;
             assert(fdecl->ir.irFunc->thisVar);
             ++iarg;