mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 08:23:21 +01:00
045c5fae3d
When the RuntimeDyldELF::processRelocationRef routine finds the target symbol of a relocation in the local or global symbol table, it performs a section-relative relocation: Value.SectionID = lsi->second.first; Value.Addend = lsi->second.second; At this point, however, any Addend that might have been specified in the original relocation record is lost. This is somewhat difficult to trigger for relocations within the code section since they usually do not contain non-zero Addends (when built with the default JIT code model, in any case). However, the problem can be reliably triggered by a relocation within the data section caused by code like: int test[2] = { -1, 0 }; int *p = &test[1]; The initializer of "p" will need a relocation to "test + 4". On platforms using RelA relocations this means an Addend of 4 is required. Current code ignores this addend when processing the relocation, resulting in incorrect execution. Fixed by taking the Addend into account when processing relocations to symbols found in the local or global symbol table. Tested on x86_64-linux and powerpc64-linux. llvm-svn: 178869
26 lines
455 B
LLVM
26 lines
455 B
LLVM
; RUN: %lli_mcjit %s
|
|
;
|
|
; Verify relocations to global symbols with addend work correctly.
|
|
;
|
|
; Compiled from this C code:
|
|
;
|
|
; int test[2] = { -1, 0 };
|
|
; int *p = &test[1];
|
|
;
|
|
; int main (void)
|
|
; {
|
|
; return *p;
|
|
; }
|
|
;
|
|
|
|
@test = global [2 x i32] [i32 -1, i32 0], align 4
|
|
@p = global i32* getelementptr inbounds ([2 x i32]* @test, i64 0, i64 1), align 8
|
|
|
|
define i32 @main() {
|
|
entry:
|
|
%0 = load i32** @p, align 8
|
|
%1 = load i32* %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|