mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-02-02 21:13:13 +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,7 +15,6 @@
|
||||
#include <cassert>
|
||||
#include <deque>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <cstring>
|
||||
|
||||
//#include "d-lang.h"
|
||||
@@ -157,6 +156,8 @@ Statement *AsmStatement::semantic(Scope *sc)
|
||||
if (err)
|
||||
fatal();
|
||||
|
||||
//puts(toChars());
|
||||
|
||||
sc->func->inlineAsm = 1;
|
||||
sc->func->inlineStatus = ILSno; // %% not sure
|
||||
// %% need to set DECL_UNINLINABLE too?
|
||||
@@ -699,3 +700,35 @@ Statement *AsmBlockStatement::semantic(Scope *sc)
|
||||
|
||||
return CompoundStatement::semantic(sc);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void AsmStatement::toNakedIR(IRState *p)
|
||||
{
|
||||
Logger::println("AsmStatement::toNakedIR(): %s", loc.toChars());
|
||||
LOG_SCOPE;
|
||||
|
||||
// is there code?
|
||||
if (!asmcode)
|
||||
return;
|
||||
AsmCode * code = (AsmCode *) asmcode;
|
||||
|
||||
// build asm stmt
|
||||
std::ostringstream& asmstr = p->nakedAsm;
|
||||
asmstr << "\t";
|
||||
asmstr.write(code->insnTemplate, code->insnTemplateLen);
|
||||
asmstr << std::endl;
|
||||
}
|
||||
|
||||
void AsmBlockStatement::toNakedIR(IRState *p)
|
||||
{
|
||||
Logger::println("AsmBlockStatement::toNakedIR(): %s", loc.toChars());
|
||||
LOG_SCOPE;
|
||||
|
||||
// do asm statements
|
||||
for (unsigned i=0; i<statements->dim; i++)
|
||||
{
|
||||
Statement* s = (Statement*)statements->data[i];
|
||||
if (s) s->toNakedIR(p);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user