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:
Frits van Bommel
2009-03-08 00:57:58 +01:00
parent 95f12f04f1
commit 2687d58198
2 changed files with 22 additions and 5 deletions

View File

@@ -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. */

View File

@@ -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