Mercurial > projects > ldc
diff gen/toir.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 | a4fcc13da3cd |
children | 5e3bb0c3ea8b |
line wrap: on
line diff
--- a/gen/toir.cpp Mon Feb 02 02:35:44 2009 +0100 +++ b/gen/toir.cpp Tue Feb 03 08:54:57 2009 +0100 @@ -8,7 +8,6 @@ #include <stdio.h> #include <math.h> -#include <sstream> #include <fstream> #include <iostream> @@ -205,6 +204,7 @@ { Logger::print("VarExp::toConstElem: %s | %s\n", toChars(), type->toChars()); LOG_SCOPE; + if (StaticStructInitDeclaration* sdecl = var->isStaticStructInitDeclaration()) { // this seems to be the static initialiser for structs @@ -216,7 +216,8 @@ assert(ts->sym->ir.irStruct->constInit); return ts->sym->ir.irStruct->constInit; } - else if (TypeInfoDeclaration* ti = var->isTypeInfoDeclaration()) + + if (TypeInfoDeclaration* ti = var->isTypeInfoDeclaration()) { const LLType* vartype = DtoType(type); LLConstant* m = DtoTypeInfoOf(ti->tinfo, false); @@ -224,15 +225,17 @@ m = llvm::ConstantExpr::getBitCast(m, vartype); return m; } - else if (VarDeclaration* vd = var->isVarDeclaration()) + + VarDeclaration* vd = var->isVarDeclaration(); + if (vd && vd->isConst() && vd->init) { // return the initializer - assert(vd->init); return DtoConstInitializer(loc, type, vd->init); } + // fail - assert(0 && "Unsupported const VarExp kind"); - return NULL; + error("non-constant expression %s", toChars()); + return llvm::UndefValue::get(DtoType(type)); } //////////////////////////////////////////////////////////////////////////////////////////