[lld] r228680 - [ELF][ARM] Add veneer generation to branch instructions
Filipe Cabecinhas
filcab at gmail.com
Tue Feb 10 14:01:50 PST 2015
Hi Denis!
This broke our Windows-based builder. Can you fix it or revert it, please?
The three tests you added fail with the same kind of problem: objdump
doesn't have the …_from_{arm,thumb} symbol.
Here's the output of one of the tests:
----------------------------------------
********************
FAIL: lld :: elf/ARM/rel-arm-jump24-veneer-b.test (20610 of 21176)
******************** TEST 'lld :: elf/ARM/rel-arm-jump24-veneer-b.test'
FAILED ********************
Script:
--
yaml2obj -format=elf -docnum 1
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test
>
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o
yaml2obj -format=elf -docnum 2
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test
>
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o
lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic
--noinhibit-exec
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o
-o
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp
llvm-objdump -s -t
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp
| FileCheck -check-prefix=B-VENEER
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test
llvm-objdump -s -t
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp
| FileCheck -check-prefix=B-ADDR
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test
--
Exit Code: 1
Command Output (stdout):
--
Command 0: "yaml2obj" "-format=elf" "-docnum" "1"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"
Command 0 Result: 0
Command 0 Output:
None
Command 0 Stderr:
Command 1: "yaml2obj" "-format=elf" "-docnum" "2"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"
Command 1 Result: 0
Command 1 Output:
None
Command 1 Stderr:
Command 2: "lld" "-flavor" "gnu" "-target" "arm" "-m" "armelf_linux_eabi"
"-Bstatic" "--noinhibit-exec"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o"
"-o"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"
Command 2 Result: 0
Command 2 Output:
Command 2 Stderr:
Undefined symbol: C runtime: _start
symbol(s) not found
Command 3: "llvm-objdump" "-s" "-t"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"
Command 3 Result: 0
Command 3 Output:
Command 3 Stderr:
Command 4: "FileCheck" "-check-prefix=B-VENEER"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"
Command 4 Result: 0
Command 4 Output:
Command 4 Stderr:
Command 5: "llvm-objdump" "-s" "-t"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"
Command 5 Result: 0
Command 5 Output:
Command 5 Stderr:
Command 6: "FileCheck" "-check-prefix=B-ADDR"
"C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"
Command 6 Result: 1
Command 6 Output:
Command 6 Stderr:
C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test:26:11:
error: expected string not found in input
# B-ADDR: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
^
<stdin>:43:1: note: scanning from here
00000000 *UND* 00000000
^
<stdin>:45:1: note: possible intended match here
00400078 g F .text 00000008 _Z1fv
^
---------------------------------------
Thanks,
Filipe
On Tue, Feb 10, 2015 at 1:31 AM, Denis Protivensky <
dprotivensky at accesssoftek.com> wrote:
> Author: denis-protivensky
> Date: Tue Feb 10 03:31:42 2015
> New Revision: 228680
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228680&view=rev
> Log:
> [ELF][ARM] Add veneer generation to branch instructions
>
> When calling ARM code from Thumb and vice versa,
> a veneer that switches instruction set should be generated.
> Added veneer generation for ARM_JUMP24 ARM_THM_JUMP24 instructions.
>
> Differential Revision: http://reviews.llvm.org/D7502
>
> Added:
> lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test
> lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test
> lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test
> Modified:
> lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp?rev=228680&r1=228679&r2=228680&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp Tue Feb 10
> 03:31:42 2015
> @@ -31,6 +31,85 @@ using namespace lld::elf;
> using namespace llvm::ELF;
>
> namespace {
> +// ARM B/BL instructions of static relocation veneer.
> +// TODO: consider different instruction set for archs below ARMv5
> +// (one as for Thumb may be used though it's less optimal).
> +const uint8_t Veneer_ARM_B_BL_StaticAtomContent[8] = {
> + 0x04, 0xf0, 0x1f, 0xe5, // ldr pc, [pc, #-4]
> + 0x00, 0x00, 0x00, 0x00 // <target_symbol_address>
> +};
> +
> +// Thumb B/BL instructions of static relocation veneer.
> +// TODO: consider different instruction set for archs above ARMv5
> +// (one as for ARM may be used since it's more optimal).
> +const uint8_t Veneer_THM_B_BL_StaticAtomContent[8] = {
> + 0x78, 0x47, // bx pc
> + 0x00, 0x00, // nop
> + 0xfe, 0xff, 0xff, 0xea // b <target_symbol_address>
> +};
> +
> +/// \brief Atoms that hold veneer code.
> +class VeneerAtom : public SimpleELFDefinedAtom {
> + StringRef _section;
> +
> +public:
> + VeneerAtom(const File &f, StringRef secName)
> + : SimpleELFDefinedAtom(f), _section(secName) {}
> +
> + Scope scope() const override { return
> DefinedAtom::scopeTranslationUnit; }
> +
> + SectionChoice sectionChoice() const override {
> + return DefinedAtom::sectionBasedOnContent;
> + }
> +
> + StringRef customSectionName() const override { return _section; }
> +
> + ContentType contentType() const override {
> + return DefinedAtom::typeCode;
> + }
> +
> + uint64_t size() const override { return rawContent().size(); }
> +
> + ContentPermissions permissions() const override { return permR_X; }
> +
> + Alignment alignment() const override { return Alignment(2); }
> +
> +#ifndef NDEBUG
> + StringRef name() const override { return _name; }
> + std::string _name;
> +#else
> + StringRef name() const override { return ""; }
> +#endif
> +};
> +
> +/// \brief Atoms that hold veneer for statically relocated
> +/// ARM B/BL instructions.
> +class Veneer_ARM_B_BL_StaticAtom : public VeneerAtom {
> +public:
> + Veneer_ARM_B_BL_StaticAtom(const File &f, StringRef secName)
> + : VeneerAtom(f, secName) {}
> +
> + ArrayRef<uint8_t> rawContent() const override {
> + return llvm::makeArrayRef(Veneer_ARM_B_BL_StaticAtomContent);
> + }
> +};
> +
> +/// \brief Atoms that hold veneer for statically relocated
> +/// Thumb B/BL instructions.
> +class Veneer_THM_B_BL_StaticAtom : public VeneerAtom {
> +public:
> + Veneer_THM_B_BL_StaticAtom(const File &f, StringRef secName)
> + : VeneerAtom(f, secName) {}
> +
> + DefinedAtom::CodeModel codeModel() const override {
> + return DefinedAtom::codeARMThumb;
> + }
> +
> + ArrayRef<uint8_t> rawContent() const override {
> + return llvm::makeArrayRef(Veneer_THM_B_BL_StaticAtomContent);
> + }
> +};
> +
> class ELFPassFile : public SimpleFile {
> public:
> ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") {
> @@ -51,12 +130,67 @@ template <class Derived> class ARMReloca
> if (ref.kindNamespace() != Reference::KindNamespace::ELF)
> return;
> assert(ref.kindArch() == Reference::KindArch::ARM);
> + switch (ref.kindValue()) {
> + case R_ARM_JUMP24:
> + case R_ARM_THM_JUMP24:
> + static_cast<Derived *>(this)->handleVeneer(atom, ref);
> + break;
> + }
> }
>
> protected:
> + std::error_code handleVeneer(const DefinedAtom &atom, const Reference
> &ref) {
> + // Target symbol and relocated place should have different
> + // instruction sets in order a veneer to be generated in between.
> + const auto *target = dyn_cast_or_null<DefinedAtom>(ref.target());
> + if (!target || target->codeModel() == atom.codeModel())
> + return std::error_code();
> +
> + // TODO: For unconditional jump instructions (R_ARM_CALL and
> R_ARM_THM_CALL)
> + // fixup isn't possible without veneer generation for archs below
> ARMv5.
> +
> + // Veneers may only be generated for STT_FUNC target symbols
> + // or for symbols located in sections different to the place of
> relocation.
> + const auto kindValue = ref.kindValue();
> + StringRef secName = atom.customSectionName();
> + if (DefinedAtom::typeCode != target->contentType() &&
> + !target->customSectionName().equals(secName)) {
> + StringRef kindValStr;
> + if (!this->_ctx.registry().referenceKindToString(
> + ref.kindNamespace(), ref.kindArch(), kindValue,
> kindValStr)) {
> + kindValStr = "unknown";
> + }
> +
> + std::string errStr =
> + (Twine("Reference of type ") + Twine(kindValue) + " (" +
> kindValStr +
> + ") from " + atom.name() + "+" + Twine(ref.offsetInAtom()) + "
> to " +
> + ref.target()->name() + "+" + Twine(ref.addend()) +
> + " cannot be effected without a veneer").str();
> +
> + llvm_unreachable(errStr.c_str());
> + }
> +
> + const Atom *veneer = nullptr;
> + switch (kindValue) {
> + case R_ARM_JUMP24:
> + veneer = static_cast<Derived *>(this)
> + ->getVeneer_ARM_B_BL(target, secName);
> + break;
> + case R_ARM_THM_JUMP24:
> + veneer = static_cast<Derived *>(this)
> + ->getVeneer_THM_B_BL(target, secName);
> + break;
> + default:
> + llvm_unreachable("Unhandled reference type for veneer generation");
> + }
> +
> + assert(veneer && "The veneer is not set");
> + const_cast<Reference &>(ref).setTarget(veneer);
> + return std::error_code();
> + }
> +
> public:
> - ARMRelocationPass(const ELFLinkingContext &ctx)
> - : _file(ctx), _ctx(ctx) {}
> + ARMRelocationPass(const ELFLinkingContext &ctx) : _file(ctx), _ctx(ctx)
> {}
>
> /// \brief Do the pass.
> ///
> @@ -99,12 +233,25 @@ public:
> handleReference(*atom, *ref);
> }
> }
> +
> + // Add all created atoms to the link.
> + uint64_t ordinal = 0;
> + for (auto &veneer : _veneerVector) {
> + veneer->setOrdinal(ordinal++);
> + mf->addAtom(*veneer);
> + }
> }
>
> protected:
> /// \brief Owner of all the Atoms created by this pass.
> ELFPassFile _file;
> const ELFLinkingContext &_ctx;
> +
> + /// \brief Map Atoms to their veneers.
> + llvm::DenseMap<const Atom *, VeneerAtom *> _veneerMap;
> +
> + /// \brief the list of veneer atoms.
> + std::vector<VeneerAtom *> _veneerVector;
> };
>
> /// This implements the static relocation model. Meaning GOT and PLT
> entries are
> @@ -118,6 +265,44 @@ class ARMStaticRelocationPass final
> public:
> ARMStaticRelocationPass(const elf::ARMLinkingContext &ctx)
> : ARMRelocationPass(ctx) {}
> +
> + /// \brief Get the veneer for ARM B/BL instructions.
> + const VeneerAtom *getVeneer_ARM_B_BL(const DefinedAtom *da,
> + StringRef secName) {
> + auto veneer = _veneerMap.find(da);
> + if (_veneerMap.end() != veneer)
> + return veneer->second;
> +
> + auto v = new (_file._alloc) Veneer_ARM_B_BL_StaticAtom(_file,
> secName);
> + v->addReferenceELF_ARM(R_ARM_ABS32, 4, da, 0);
> +#ifndef NDEBUG
> + v->_name = "__";
> + v->_name += da->name();
> + v->_name += "_from_arm";
> +#endif
> + _veneerMap[da] = v;
> + _veneerVector.push_back(v);
> + return v;
> + }
> +
> + /// \brief Get the veneer for Thumb B/BL instructions.
> + const VeneerAtom *getVeneer_THM_B_BL(const DefinedAtom *da,
> + StringRef secName) {
> + auto veneer = _veneerMap.find(da);
> + if (_veneerMap.end() != veneer)
> + return veneer->second;
> +
> + auto v = new (_file._alloc) Veneer_THM_B_BL_StaticAtom(_file,
> secName);
> + v->addReferenceELF_ARM(R_ARM_JUMP24, 4, da, 0);
> +#ifndef NDEBUG
> + v->_name = "__";
> + v->_name += da->name();
> + v->_name += "_from_thumb";
> +#endif
> + _veneerMap[da] = v;
> + _veneerVector.push_back(v);
> + return v;
> + }
> };
>
> } // end of anon namespace
>
> Added: lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test?rev=228680&view=auto
>
> ==============================================================================
> --- lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test (added)
> +++ lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test Tue Feb 10
> 03:31:42 2015
> @@ -0,0 +1,101 @@
> +# Check veneer generation for R_ARM_JUMP24 relocation (B instruction
> call).
> +
> +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
> +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
> +# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \
> +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
> +
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-VENEER %s
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-ADDR %s
> +
> +# B-VENEER: Contents of section .text:
> +# B-VENEER: 400074 010000ea
> +# Call from main:
> +# offset = 0x4 ^^
> +# call site offset PC(arm) ___Z1fv_from_arm addr
> +# 0x400074 + 0x4 + 0x8 = 0x400080
> +#
> +# Code of the veneer:
> +# B-VENEER: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5
> +# B-VENEER: 400084 79004000
> +# call addr = 0x400079 ^^
> +# call addr _Z1fv addr Thumb mode
> +# 0x400079 = 0x400078 | 0x1
> +#
> +# B-ADDR: SYMBOL TABLE:
> +# B-ADDR: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
> +# B-ADDR: 00400074 g F .text {{[0-9a-f]+}} main
> +# B-ADDR: 00400078 g F .text {{[0-9a-f]+}} _Z1fv
> +
> +# arm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content: FEFFFFEA
> + - Name: .rel.text
> + Type: SHT_REL
> + Link: .symtab
> + AddressAlign: 0x0000000000000004
> + Info: .text
> + Relocations:
> + - Offset: 0x0000000000000000
> + Symbol: _Z1fv
> + Type: R_ARM_JUMP24
> + Addend: 0
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: main
> + Type: STT_FUNC
> + Section: .text
> + - Name: _Z1fv
> +
> +# thm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content: 4FF0000318467047
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: _Z1fv
> + Type: STT_FUNC
> + Section: .text
> + Value: 0x0000000000000001
> +...
>
> Added: lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test?rev=228680&view=auto
>
> ==============================================================================
> --- lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test (added)
> +++ lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test Tue Feb 10
> 03:31:42 2015
> @@ -0,0 +1,100 @@
> +# Check veneer generation for R_ARM_JUMP24 relocation (BL<c> instruction
> call).
> +
> +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
> +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
> +# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \
> +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
> +
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=BL-VENEER %s
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=BL-ADDR %s
> +
> +# BL-VENEER: Contents of section .text:
> +# BL-VENEER: 400084 0400000b
> +# Call from main:
> +# offset = 0x10 ^^
> +# call site offset PC(arm) ___Z1fv_from_arm addr
> +# 0x400084 + 0x10 + 0x8 = 0x40009c
> +#
> +# Code of the veneer:
> +# BL-VENEER: 400094 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 95004000
> +# call addr = 0x400095 ^^
> +# call addr _Z1fv addr Thumb mode
> +# 0x400095 = 0x400094 | 0x1
> +#
> +# BL-ADDR: SYMBOL TABLE:
> +# BL-ADDR: 0040009c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
> +# BL-ADDR: 00400074 g F .text {{[0-9a-f]+}} main
> +# BL-ADDR: 00400094 g F .text {{[0-9a-f]+}} _Z1fv
> +
> +# arm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content:
> 00482DE904B08DE20030A0E3000053E3FEFFFF0B0030A0E30300A0E10088BDE8
> + - Name: .rel.text
> + Type: SHT_REL
> + Link: .symtab
> + AddressAlign: 0x0000000000000004
> + Info: .text
> + Relocations:
> + - Offset: 0x0000000000000010
> + Symbol: _Z1fv
> + Type: R_ARM_JUMP24
> + Addend: 0
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: main
> + Type: STT_FUNC
> + Section: .text
> + - Name: _Z1fv
> +
> +# thm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content: 4FF0000318467047
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: _Z1fv
> + Type: STT_FUNC
> + Section: .text
> + Value: 0x0000000000000001
> +...
>
> Added: lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test?rev=228680&view=auto
>
> ==============================================================================
> --- lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test (added)
> +++ lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test Tue Feb 10 03:31:42
> 2015
> @@ -0,0 +1,100 @@
> +# Check veneer generation for R_ARM_THM_JUMP24 relocation (B instruction
> call).
> +
> +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
> +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
> +# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \
> +# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
> +
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-VENEER %s
> +# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-ADDR %s
> +
> +# B-VENEER: Contents of section .text:
> +# B-VENEER: 400074 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8
> +# Call from main:
> +# offset = 0x0 ^^
> +# call site offset PC(thm) ___Z1fv_from_thumb addr
> +# 0x400080 + 0x0 + 0x4 = 0x400084
> +#
> +# Code of the veneer:
> +# B-VENEER: 400084 78470000 f9ffffea
> +# offset = -0x1C ^^
> +# call site offset PC(arm) _Z1fv
> +# 0x400088 + (-0x1C) + 0x8 = 0x400074
> +#
> +# B-ADDR: SYMBOL TABLE:
> +# B-ADDR: 00400084 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb
> +# B-ADDR: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
> +# B-ADDR: 00400080 g F .text {{[0-9a-f]+}} main
> +
> +# arm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content: 0030A0E30300A0E11EFF2FE1
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: _Z1fv
> + Type: STT_FUNC
> + Section: .text
> +
> +# thm.o
> +---
> +FileHeader:
> + Class: ELFCLASS32
> + Data: ELFDATA2LSB
> + Type: ET_REL
> + Machine: EM_ARM
> + Flags: [ EF_ARM_EABI_VER5 ]
> +Sections:
> + - Name: .text
> + Type: SHT_PROGBITS
> + Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
> + AddressAlign: 0x0000000000000004
> + Content: FFF7FEBF
> + - Name: .rel.text
> + Type: SHT_REL
> + Link: .symtab
> + AddressAlign: 0x0000000000000004
> + Info: .text
> + Relocations:
> + - Offset: 0x0000000000000000
> + Symbol: _Z1fv
> + Type: R_ARM_THM_JUMP24
> + Addend: 0
> + - Name: .data
> + Type: SHT_PROGBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> + - Name: .bss
> + Type: SHT_NOBITS
> + Flags: [ SHF_WRITE, SHF_ALLOC ]
> + AddressAlign: 0x0000000000000001
> + Content: ''
> +Symbols:
> + Global:
> + - Name: main
> + Type: STT_FUNC
> + Section: .text
> + Value: 0x0000000000000001
> + - Name: _Z1fv
> +...
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150210/0ab2e733/attachment.html>
More information about the llvm-commits
mailing list