Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
------------------------------------------------------------------------ r329335 | lhames | 2018-04-05 12:37:05 -0700 (Thu, 05 Apr 2018) | 15 lines [RuntimeDyld][PowerPC] Use global entry points for calls between sections. Functions in different objects may use different TOCs, so calls between such functions should use the global entry point of the callee which updates the TOC pointer. This should fix a bug that the Numba developers encountered (see numba/numba#2451). Patch by Olexa Bilaniuk. Thanks Olexa! No RuntimeDyld checker test case yet as I am not familiar enough with how RuntimeDyldELF fixes up call-sites, but I do not want to hold up landing this. I will continue to work on it and see if I can rope some powerpc experts in. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r329355 | lhames | 2018-04-05 14:56:55 -0700 (Thu, 05 Apr 2018) | 4 lines [RuntimeDyld][PowerPC] Add a test case for r329335. Checks that calls to different sections go to the function's global entry point, rather than the local one. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r329573 | krasimir | 2018-04-09 07:29:23 -0700 (Mon, 09 Apr 2018) | 11 lines [RuntimeDyld][PowerPC] Fix a newly added test in r329355 Summary: The bit widths are wrong. Reviewers: bkramer, lhames, hans Reviewed By: hans Subscribers: hans, nemanjai, kbarton, llvm-commits Differential Revision: https://reviews.llvm.org/D45361 ------------------------------------------------------------------------ llvm-svn: 331715
- Loading branch information
Showing
3 changed files
with
102 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
llvm/test/ExecutionEngine/RuntimeDyld/PowerPC/Inputs/ppc64_elf_module_b.s
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# This module contains a function with its local and global entry points | ||
# exposed. It is used by the ppc64_elf test to verify that functions with | ||
# different TOCs are called via their global entry points. | ||
.text | ||
.abiversion 2 | ||
.file "ppc64_elf_module_b.ll" | ||
.section .rodata.cst4,"aM",@progbits,4 | ||
.p2align 2 # -- Begin function foo | ||
.LCPI0_0: | ||
.long 1093664768 # float 11 | ||
.text | ||
.globl foo | ||
.p2align 4 | ||
.type foo,@function | ||
.Lfunc_toc0: # @foo | ||
.quad .TOC.-foo_gep | ||
foo: | ||
.Lfunc_begin0: | ||
.cfi_startproc | ||
.globl foo_gep | ||
foo_gep: | ||
ld 2, .Lfunc_toc0-foo_gep(12) | ||
add 2, 2, 12 | ||
.globl foo_lep | ||
foo_lep: | ||
.localentry foo, foo_lep-foo_gep | ||
# %bb.0: | ||
addis 3, 2, .LC0@toc@ha | ||
ld 3, .LC0@toc@l(3) | ||
lfsx 1, 0, 3 | ||
blr | ||
.long 0 | ||
.quad 0 | ||
.Lfunc_end0: | ||
.size foo, .Lfunc_end0-.Lfunc_begin0 | ||
.cfi_endproc | ||
# -- End function | ||
.section .toc,"aw",@progbits | ||
.LC0: | ||
.tc .LCPI0_0[TC],.LCPI0_0 | ||
|
||
.section ".note.GNU-stack","",@progbits |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# RUN: rm -rf %t && mkdir -p %t | ||
# RUN: llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj -o %t/ppc64_elf.o %s | ||
# RUN: llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj -o %t/ppc64_elf_module_b.o %S/Inputs/ppc64_elf_module_b.s | ||
# RUN: llvm-rtdyld -triple=powerpc64le-unknown-linux-gnu -verify -check=%s %t/ppc64_elf.o %t/ppc64_elf_module_b.o | ||
|
||
.text | ||
.abiversion 2 | ||
.file "Module2.ll" | ||
.globl bar # -- Begin function bar | ||
.p2align 4 | ||
.type bar,@function | ||
.Lfunc_toc0: # @bar | ||
.quad .TOC.-.Lfunc_gep0 | ||
bar: | ||
.Lfunc_begin0: | ||
.cfi_startproc | ||
.Lfunc_gep0: | ||
ld 2, .Lfunc_toc0-.Lfunc_gep0(12) | ||
add 2, 2, 12 | ||
.Lfunc_lep0: | ||
.localentry bar, .Lfunc_lep0-.Lfunc_gep0 | ||
# %bb.0: | ||
mflr 0 | ||
std 0, 16(1) | ||
stdu 1, -32(1) | ||
.cfi_def_cfa_offset 32 | ||
.cfi_offset lr, 16 | ||
# rtdyld-check: (*{4}(stub_addr(ppc64_elf.o, .text, foo) + 0)) [15:0] = foo_gep [63:48] | ||
# rtdyld-check: (*{4}(stub_addr(ppc64_elf.o, .text, foo) + 4)) [15:0] = foo_gep [47:32] | ||
# rtdyld-check: (*{4}(stub_addr(ppc64_elf.o, .text, foo) + 12)) [15:0] = foo_gep [31:16] | ||
# rtdyld-check: (*{4}(stub_addr(ppc64_elf.o, .text, foo) + 16)) [15:0] = foo_gep [15:0] | ||
# rtdyld-check: decode_operand(foo_call, 0) = (stub_addr(ppc64_elf.o, .text, foo) - foo_call) >> 2 | ||
foo_call: | ||
bl foo | ||
nop | ||
addi 1, 1, 32 | ||
ld 0, 16(1) | ||
mtlr 0 | ||
blr | ||
.long 0 | ||
.quad 0 | ||
.Lfunc_end0: | ||
.size bar, .Lfunc_end0-.Lfunc_begin0 | ||
.cfi_endproc | ||
# -- End function | ||
|
||
.section ".note.GNU-stack","",@progbits |