mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
X86: handle external tail calls in Windows JIT
If there was a tail call, we would incorrectly handle the relocation. It would end up indexing into the array with an incorrect section id. The symbol was external to the module, so the Section ID was UNDEFINED (-1). We would then index the SmallVector with this ID, triggering an assertion. Use the Value rather than the section load address in this case. llvm-svn: 275442
This commit is contained in:
parent
2fcb5c4212
commit
f5a822f094
@ -174,8 +174,10 @@ public:
|
|||||||
}
|
}
|
||||||
case COFF::IMAGE_REL_I386_REL32: {
|
case COFF::IMAGE_REL_I386_REL32: {
|
||||||
// 32-bit relative displacement to the target.
|
// 32-bit relative displacement to the target.
|
||||||
uint64_t Result = Sections[RE.Sections.SectionA].getLoadAddress() -
|
uint64_t Result = RE.Sections.SectionA == static_cast<uint32_t>(-1)
|
||||||
Section.getLoadAddress() + RE.Addend - 4 - RE.Offset;
|
? Value
|
||||||
|
: Sections[RE.Sections.SectionA].getLoadAddress();
|
||||||
|
Result = Result - Section.getLoadAddress() + RE.Addend - 4 - RE.Offset;
|
||||||
assert(static_cast<int32_t>(Result) <= INT32_MAX &&
|
assert(static_cast<int32_t>(Result) <= INT32_MAX &&
|
||||||
"relocation overflow");
|
"relocation overflow");
|
||||||
assert(static_cast<int32_t>(Result) >= INT32_MIN &&
|
assert(static_cast<int32_t>(Result) >= INT32_MIN &&
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// RUN: llvm-mc -triple i686-windows -filetype obj -o %t.obj %s
|
// RUN: llvm-mc -triple i686-windows -filetype obj -o %t.obj %s
|
||||||
// RUN: llvm-rtdyld -triple i686-windows -dummy-extern _OutputDebugStringA@4=0xfffffffe -dummy-extern _ExitProcess@4=0xffffffff -verify -check=%s %t.obj
|
// RUN: llvm-rtdyld -triple i686-windows -dummy-extern _printf=0xfffffffd -dummy-extern _OutputDebugStringA@4=0xfffffffe -dummy-extern _ExitProcess@4=0xffffffff -verify -check=%s %t.obj
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
@ -13,7 +13,9 @@ rel1:
|
|||||||
call _function // IMAGE_REL_I386_REL32
|
call _function // IMAGE_REL_I386_REL32
|
||||||
# rtdyld-check: decode_operand(rel1, 0) = (_function-_main-4-1)
|
# rtdyld-check: decode_operand(rel1, 0) = (_function-_main-4-1)
|
||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
retl
|
rel12:
|
||||||
|
jmp _printf
|
||||||
|
# rtdyld-check: decode_operand(rel12, 0)[31:0] = (_printf-_main-4-8)
|
||||||
|
|
||||||
.def _function
|
.def _function
|
||||||
.scl 2
|
.scl 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user