Mercurial > projects > ldc
changeset 1053:11e28922ac76
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]; } }
}}}
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 08 Mar 2009 00:57:58 +0100 |
parents | 12ea38902e83 |
children | a3d7288c4473 |
files | gen/asm-x86-64.h gen/asmstmt.cpp |
diffstat | 2 files changed, 22 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/asm-x86-64.h Sat Mar 07 19:38:00 2009 +0100 +++ b/gen/asm-x86-64.h Sun Mar 08 00:57:58 2009 +0100 @@ -2144,11 +2144,8 @@ ( ( 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. */
--- a/gen/asmstmt.cpp Sat Mar 07 19:38:00 2009 +0100 +++ b/gen/asmstmt.cpp Sun Mar 08 00:57:58 2009 +0100 @@ -415,6 +415,26 @@ 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