[llvm-commits] [PATCH] Make X86-64 in the Large model always emit 64-bit calls

jyasskin at gmail.com jyasskin at gmail.com
Thu Nov 12 11:19:16 PST 2009


Reviewers: gohman_apple.com,

Message:
Patch at http://codereview.appspot.com/download/issue154066_1033.diff

I'm unfamiliar with the code generator, so please go over that part of
the change with a fine-toothed comb.

This patch doesn't include r86941, assuming that'll be rolled back
temporarily.

Description:
The large code model is documented at
http://www.x86-64.org/documentation/abi.pdf and says that calls should
assume their target doesn't live within the 32-bit pc-relative offset
that fits in the call instruction.

The best fix, turning off the global-address->target-global-address
conversion in X86TargetLowering::LowerCall(), breaks the lazy JIT
because it can separate the movabs(imm->reg) from the actual call
instruction. The lazy JIT receives the address of the movabs as a
relocation and needs to record the return address from the call; and
then when that call happens, it needs to patch the movabs with the
newly-compiled target. We could thread the call instruction into the
relocation and record the movabs<->call mapping explicitly, but  that
seems to require at least as much new complication in the code generator
as this change.

The second attempt defined a new CALL64i pseudo-instruction, which
expanded to a 2-instruction sequence in the assembly output and was
special-cased in the X86CodeEmitter's emitInstruction() function. That
breaks indirect calls, which stop using distinct stubs for each
lazily-compiled function.

The third attempt goes back to the first approach but makes lazy
functions _always_ go through a call stub. This works. You'd think we'd
only have to force lazy calls through a stub on difficult platforms, but
that turns out to break indirect calls through a function pointer. The
right fix for that is to distinguish between calls and address-of
operations on uncompiled functions, but that's complex enough to leave
for someone else to do.

Please review this at http://codereview.appspot.com/154066

Affected files:
   M     lib/ExecutionEngine/JIT/JITEmitter.cpp
   M     lib/Target/X86/X86CodeEmitter.cpp
   M     lib/Target/X86/X86ISelLowering.cpp
   M     lib/Target/X86/X86JITInfo.cpp
   M     test/ExecutionEngine/stubs.ll
   M     test/Makefile
   M     unittests/ExecutionEngine/JIT/JITTest.cpp
   M     utils/lit/TestFormats.py





More information about the llvm-commits mailing list