mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-26 01:23:13 +01:00
Always pass an address expression (not a var expression) to asm operands of
type Arg_Memory.
This fixes the following code:
{{{
void f(real x) { asm { fld x[RBP]; } }
void g(int x) { asm { mov EAX, x[RBP]; } }
}}}
This commit is contained in:
@@ -2144,11 +2144,8 @@ namespace AsmParserx8664
|
||||
( ( operand->baseReg == Reg_ESP || ( operand->baseReg == Reg_RSP ) ) && ! sc->func->naked ) ) )
|
||||
{
|
||||
|
||||
if ( mode == Mode_Output )
|
||||
{
|
||||
e = new AddrExp ( 0, e );
|
||||
e->type = decl->type->pointerTo();
|
||||
}
|
||||
e = new AddrExp ( 0, e );
|
||||
e->type = decl->type->pointerTo();
|
||||
|
||||
#if !IN_LLVM
|
||||
/* DMD uses the same frame offsets for naked functions. */
|
||||
|
||||
@@ -415,6 +415,26 @@ assert(0);
|
||||
asmblock->clobs.insert(clobstr);
|
||||
}
|
||||
|
||||
if (Logger::enabled()) {
|
||||
typedef std::deque<LLValue*>::iterator It;
|
||||
{
|
||||
Logger::println("Output values:");
|
||||
LOG_SCOPE
|
||||
size_t i = 0;
|
||||
for (It I = output_values.begin(), E = output_values.end(); I != E; ++I) {
|
||||
Logger::cout() << "Out " << i++ << " = " << **I << '\n';
|
||||
}
|
||||
}
|
||||
{
|
||||
Logger::println("Input values:");
|
||||
LOG_SCOPE
|
||||
size_t i = 0;
|
||||
for (It I = input_values.begin(), E = input_values.end(); I != E; ++I) {
|
||||
Logger::cout() << "In " << i++ << " = " << **I << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// excessive commas are removed later...
|
||||
|
||||
// push asm statement
|
||||
|
||||
Reference in New Issue
Block a user