mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-10-15 19:47:01 +02: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:
@@ -625,6 +625,7 @@ VarDeclaration::VarDeclaration(Loc loc, Type *type, Identifier *id, Initializer
|
||||
// LDC
|
||||
anonDecl = NULL;
|
||||
offset2 = 0;
|
||||
nakedUse = false;
|
||||
}
|
||||
|
||||
Dsymbol *VarDeclaration::syntaxCopy(Dsymbol *s)
|
||||
|
||||
@@ -274,6 +274,7 @@ struct VarDeclaration : Declaration
|
||||
// LDC
|
||||
AnonDeclaration* anonDecl;
|
||||
unsigned offset2;
|
||||
bool nakedUse;
|
||||
};
|
||||
|
||||
/**************************************************************/
|
||||
|
||||
+1
-1
@@ -888,7 +888,7 @@ int main(int argc, char *argv[])
|
||||
global.params.cpu = ARCHthumb;
|
||||
}
|
||||
else {
|
||||
assert(0 && "Invalid arch");
|
||||
error("invalid cpu architecture specified: %s", global.params.llvmArch);
|
||||
}
|
||||
|
||||
assert(global.params.cpu != ARCHinvalid);
|
||||
|
||||
@@ -161,6 +161,9 @@ struct Statement : Object
|
||||
// Back end
|
||||
virtual void toIR(IRState *irs);
|
||||
|
||||
// LDC
|
||||
virtual void toNakedIR(IRState *irs);
|
||||
|
||||
// Avoid dynamic_cast
|
||||
virtual DeclarationStatement *isDeclarationStatement() { return NULL; }
|
||||
virtual CompoundStatement *isCompoundStatement() { return NULL; }
|
||||
@@ -185,6 +188,9 @@ struct ExpStatement : Statement
|
||||
Statement *inlineScan(InlineScanState *iss);
|
||||
|
||||
void toIR(IRState *irs);
|
||||
|
||||
// LDC
|
||||
void toNakedIR(IRState *irs);
|
||||
};
|
||||
|
||||
struct CompileStatement : Statement
|
||||
@@ -234,6 +240,9 @@ struct CompoundStatement : Statement
|
||||
|
||||
virtual void toIR(IRState *irs);
|
||||
|
||||
// LDC
|
||||
virtual void toNakedIR(IRState *irs);
|
||||
|
||||
virtual CompoundStatement *isCompoundStatement() { return this; }
|
||||
};
|
||||
|
||||
@@ -844,6 +853,7 @@ struct LabelStatement : Statement
|
||||
|
||||
// LDC
|
||||
bool asmLabel; // for labels inside inline assembler
|
||||
void toNakedIR(IRState *irs);
|
||||
};
|
||||
|
||||
struct LabelDsymbol : Dsymbol
|
||||
@@ -876,6 +886,8 @@ struct AsmStatement : Statement
|
||||
// LDC
|
||||
// non-zero if this is a branch, contains the target labels identifier
|
||||
Identifier* isBranchToLabel;
|
||||
|
||||
void toNakedIR(IRState *irs);
|
||||
};
|
||||
|
||||
struct AsmBlockStatement : CompoundStatement
|
||||
@@ -892,6 +904,7 @@ struct AsmBlockStatement : CompoundStatement
|
||||
AsmBlockStatement *isAsmBlockStatement() { return this; }
|
||||
|
||||
void toIR(IRState *irs);
|
||||
void toNakedIR(IRState *irs);
|
||||
};
|
||||
|
||||
#endif /* DMD_STATEMENT_H */
|
||||
|
||||
Reference in New Issue
Block a user