[llvm] r331838 - [RuntimeDyld][MachO] Properly handle thumb to thumb calls within a section.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Tue May 8 18:38:13 PDT 2018
Author: lhames
Date: Tue May 8 18:38:13 2018
New Revision: 331838
URL: http://llvm.org/viewvc/llvm-project?rev=331838&view=rev
Log:
[RuntimeDyld][MachO] Properly handle thumb to thumb calls within a section.
Previously thumb bits were only checked for external relocations (thumb to arm
code and vice-versa). This patch adds detection for thumb callees in the same
section asthe (also thumb) caller.
The MachO/Thumb test case is updated to cover this, and redundant checks
(handled by the MachO/ARM test) are removed.
Modified:
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOARM.h
llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/MachO_Thumb_Relocations.s
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOARM.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOARM.h?rev=331838&r1=331837&r2=331838&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOARM.h (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOARM.h Tue May 8 18:38:13 2018
@@ -47,6 +47,18 @@ public:
return Addr;
}
+ bool isAddrTargetThumb(unsigned SectionID, uint64_t Offset) {
+ auto TargetObjAddr = Sections[SectionID].getObjAddress() + Offset;
+ for (auto &KV : GlobalSymbolTable) {
+ auto &Entry = KV.second;
+ auto SymbolObjAddr =
+ Sections[Entry.getSectionID()].getObjAddress() + Entry.getOffset();
+ if (TargetObjAddr == SymbolObjAddr)
+ return (Entry.getFlags().getTargetFlags() & ARMJITSymbolFlags::Thumb);
+ }
+ return false;
+ }
+
Expected<int64_t> decodeAddend(const RelocationEntry &RE) const {
const SectionEntry &Section = Sections[RE.SectionID];
uint8_t *LocalAddress = Section.getAddressWithOffset(RE.Offset);
@@ -161,12 +173,18 @@ public:
// the value as being a thumb stub: we don't want to mix it up with an ARM
// stub targeting the same function.
if (RE.RelType == MachO::ARM_THUMB_RELOC_BR22)
- Value.IsStubThumb = TargetIsLocalThumbFunc;
+ Value.IsStubThumb = true;
if (RE.IsPCRel)
makeValueAddendPCRel(Value, RelI,
(RE.RelType == MachO::ARM_THUMB_RELOC_BR22) ? 4 : 8);
+ // If this is a non-external branch target check whether Value points to a
+ // thumb func.
+ if (!Value.SymbolName && (RelType == MachO::ARM_RELOC_BR24 ||
+ RelType == MachO::ARM_THUMB_RELOC_BR22))
+ RE.IsTargetThumbFunc = isAddrTargetThumb(Value.SectionID, Value.Offset);
+
if (RE.RelType == MachO::ARM_RELOC_BR24 ||
RE.RelType == MachO::ARM_THUMB_RELOC_BR22)
processBranchRelocation(RE, Value, Stubs);
Modified: llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/MachO_Thumb_Relocations.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/MachO_Thumb_Relocations.s?rev=331838&r1=331837&r2=331838&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/MachO_Thumb_Relocations.s (original)
+++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/ARM/MachO_Thumb_Relocations.s Tue May 8 18:38:13 2018
@@ -5,48 +5,57 @@
.section __TEXT,__text,regular,pure_instructions
.syntax unified
-# Add 'aaa' to the common symbols to make sure 'baz' isn't at the start of the
-# section. This ensures that we test VANILLA relocation addends correctly.
- .comm aaa, 4, 2
- .comm baz, 4, 2
+ .globl thumb_caller_thumb_callee
+ .p2align 1
+ .code 16
+ .thumb_func thumb_caller_thumb_callee
+thumb_caller_thumb_callee:
+ nop
+
+ .globl arm_caller_thumb_callee
+ .p2align 1
+ .code 16
+ .thumb_func arm_caller_thumb_callee
+arm_caller_thumb_callee:
+ nop
+ .globl thumb_caller_arm_callee
+ .p2align 1
+ .code 32
+thumb_caller_arm_callee:
+ nop
- .globl bar
+ .globl thumb_caller
.p2align 1
- .code 16 @ @bar
- .thumb_func bar
+ .code 16
+ .thumb_func thumb_caller
+thumb_caller:
+ nop
-bar:
-# Check lower 16-bits of section difference relocation
-# rtdyld-check: decode_operand(insn1, 1) = (foo-(nextPC+8))[15:0]
-insn1:
- movw r0, :lower16:(foo-(nextPC+8))
-# Check upper 16-bits of section difference relocation
-# rtdyld-check: decode_operand(insn2, 2) = (foo-(nextPC+8))[31:16]
-insn2:
- movt r0, :upper16:(foo-(nextPC+8))
-nextPC:
- nop
-
-# Check stub generation for external symbols by referencing a common symbol, 'baz'.
-# Check both the content of the stub, and the reference to the stub.
-# Stub should contain '0xf000f8df' (ldr.w pc, [pc]), followed by the target.
+# Check that stubs for thumb callers use thumb code (not arm), and that thumb
+# callees have the low bit set on their addresses.
#
-# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, baz)) = 0xf000f8df
-# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, baz) + 4) = baz
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, thumb_caller_thumb_callee)) = 0xf000f8df
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, thumb_caller_thumb_callee) + 4) = (thumb_caller_thumb_callee | 0x1)
+ bl thumb_caller_thumb_callee
+
+# Check that arm callees do not have the low bit set on their addresses.
#
-# rtdyld-check: decode_operand(insn3, 0) = stub_addr(MachO_Thumb.o, __text, baz) - (insn3 + 4)
-insn3:
- bl baz
-
-# Check stub generation for internal symbols by referencing 'bar'.
-# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, bar) + 4) = bar & 0xfffffffffffffffe
-insn4:
- bl bar
-
- .section __DATA,__data
- .align 2
-foo:
- .long 0
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, thumb_caller_arm_callee)) = 0xf000f8df
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, thumb_caller_arm_callee) + 4) = thumb_caller_arm_callee
+ bl thumb_caller_arm_callee
+
+ .globl arm_caller
+ .p2align 2
+ .code 32
+arm_caller:
+ nop
+
+# Check that stubs for arm callers use arm code (not thumb), and that thumb
+# callees have the low bit set on their addresses.
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, arm_caller_thumb_callee)) = 0xe51ff004
+# rtdyld-check: *{4}(stub_addr(MachO_Thumb.o, __text, arm_caller_thumb_callee) + 4) = (arm_caller_thumb_callee | 0x1)
+ bl arm_caller_thumb_callee
+ nop
.subsections_via_symbols
More information about the llvm-commits
mailing list