mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-28 01:23:14 +01:00
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.
This commit is contained in:
15
gen/toir.cpp
15
gen/toir.cpp
@@ -8,7 +8,6 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
@@ -205,6 +204,7 @@ LLConstant* VarExp::toConstElem(IRState* p)
|
||||
{
|
||||
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 @@ LLConstant* VarExp::toConstElem(IRState* p)
|
||||
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 @@ LLConstant* VarExp::toConstElem(IRState* p)
|
||||
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));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user