diff gen/toobj.cpp @ 920:545f54041d91

Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :) Fixed align N; in asm blocks. Fixed inreg parameter passing on x86 for ref/out params. Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 03 Feb 2009 08:54:57 +0100
parents c76f74d09fb1
children d3a6f1a96731
line wrap: on
line diff
--- a/gen/toobj.cpp	Mon Feb 02 02:35:44 2009 +0100
+++ b/gen/toobj.cpp	Tue Feb 03 08:54:57 2009 +0100
@@ -914,22 +914,13 @@
 
         Logger::println("parent: %s (%s)", parent->toChars(), parent->kind());
 
-        // handle static local variables
-        bool static_local = false;
     #if DMDV2
         // not sure why this is only needed for d2
         bool _isconst = isConst() && init;
     #else
         bool _isconst = isConst();
     #endif
-        Dsymbol* par = toParent2();
-        if (par && par->isFuncDeclaration())
-        {
-            static_local = true;
-            if (init && init->isExpInitializer()) {
-                _isconst = false;
-            }
-        }
+
 
         Logger::println("Creating global variable");
 
@@ -943,10 +934,12 @@
         if (Logger::enabled())
             Logger::cout() << *gvar << '\n';
 
-        if (static_local)
-            DtoConstInitGlobal(this);
-        else
-            gIR->constInitList.push_back(this);
+        // if this global is used from a nested function, this is necessary or
+        // optimization could potentially remove the global (if it's the only use)
+        if (nakedUse)
+            gIR->usedArray.push_back(DtoBitCast(gvar, getVoidPtrType()));
+
+        gIR->constInitList.push_back(this);
     }
     else
     {