[lld] r177970 - [ELF][Hexagon] add GOTREL/GOT relocations
Shankar Easwaran
shankare at codeaurora.org
Mon Mar 25 19:20:56 PDT 2013
Author: shankare
Date: Mon Mar 25 21:20:56 2013
New Revision: 177970
URL: http://llvm.org/viewvc/llvm-project?rev=177970&view=rev
Log:
[ELF][Hexagon] add GOTREL/GOT relocations
Added:
lld/trunk/test/elf/Hexagon/dynlib-gotoff.test
Modified:
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp
lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp?rev=177970&r1=177969&r2=177970&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.cpp Mon Mar 25 21:20:56 2013
@@ -206,6 +206,35 @@ int relocHexGOT11_X(uint8_t *location, u
return 0;
}
+int relocHexGOTREL(uint8_t *location, uint64_t P, uint64_t S, uint64_t A,
+ uint64_t GOT, int shiftBits = 0) {
+ uint32_t result = (uint32_t)((S + A - GOT) >> shiftBits);
+ result = lld::scatterBits<uint32_t>(result, FINDV4BITMASK(location));
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
+ result |
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);
+ return 0;
+}
+
+int relocHexGOTREL_HILO16(uint8_t *location, uint64_t P, uint64_t S, uint64_t A,
+ uint64_t GOT, int shiftBits = 0) {
+ uint32_t result = (uint32_t)((S + A - GOT) >> shiftBits);
+ result = lld::scatterBits<uint32_t>(result, 0x00c03fff);
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
+ result |
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);
+ return 0;
+}
+
+int relocHexGOTREL_32(uint8_t *location, uint64_t P, uint64_t S, uint64_t A,
+ uint64_t GOT) {
+ uint32_t result = (uint32_t)(S + A - GOT);
+ *reinterpret_cast<llvm::support::ulittle32_t *>(location) =
+ result |
+ (uint32_t) * reinterpret_cast<llvm::support::ulittle32_t *>(location);
+ return 0;
+}
+
} // end anon namespace
ErrorOr<void> HexagonTargetRelocationHandler::applyRelocation(
@@ -288,6 +317,18 @@ ErrorOr<void> HexagonTargetRelocationHan
case R_HEX_JMP_SLOT:
case R_HEX_GLOB_DAT:
break;
+ case R_HEX_GOTREL_32:
+ relocHexGOTREL_32(location, relocVAddress, targetVAddress, ref.addend(),
+ _targetHandler.getGOTSymAddr());
+ break;
+ case R_HEX_GOTREL_LO16:
+ relocHexGOTREL_HILO16(location, relocVAddress, targetVAddress, ref.addend(),
+ _targetHandler.getGOTSymAddr());
+ break;
+ case R_HEX_GOTREL_HI16:
+ relocHexGOTREL_HILO16(location, relocVAddress, targetVAddress, ref.addend(),
+ _targetHandler.getGOTSymAddr(), 16);
+ break;
case R_HEX_GOT_LO16:
relocHexGOTLO16(location, targetVAddress);
break;
@@ -309,6 +350,16 @@ ErrorOr<void> HexagonTargetRelocationHan
case R_HEX_GOT_11_X:
relocHexGOT11_X(location, targetVAddress);
break;
+ case R_HEX_GOTREL_32_6_X:
+ relocHexGOTREL(location, relocVAddress, targetVAddress, ref.addend(),
+ _targetHandler.getGOTSymAddr(), 6);
+ break;
+ case R_HEX_GOTREL_16_X:
+ case R_HEX_GOTREL_11_X:
+ relocHexGOTREL(location, relocVAddress, targetVAddress, ref.addend(),
+ _targetHandler.getGOTSymAddr());
+ break;
+
case lld::Reference::kindLayoutAfter:
case lld::Reference::kindLayoutBefore:
case lld::Reference::kindInGroup:
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h?rev=177970&r1=177969&r2=177970&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonRelocationHandler.h Mon Mar 25 21:20:56 2013
@@ -25,15 +25,16 @@ class HexagonTargetRelocationHandler LLV
public TargetRelocationHandler<HexagonELFType> {
public:
HexagonTargetRelocationHandler(
- const HexagonTargetInfo &ti,
+ const HexagonTargetInfo &ti, const HexagonTargetHandler &tH,
const HexagonTargetLayout<HexagonELFType> &layout)
- : _targetInfo(ti), _targetLayout(layout) {}
+ : _targetInfo(ti), _targetHandler(tH), _targetLayout(layout) {}
virtual ErrorOr<void>
applyRelocation(ELFWriter &, llvm::FileOutputBuffer &, const AtomLayout &,
const Reference &) const;
private:
const HexagonTargetInfo &_targetInfo;
+ const HexagonTargetHandler &_targetHandler;
const HexagonTargetLayout<HexagonELFType> &_targetLayout;
};
} // elf
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp?rev=177970&r1=177969&r2=177970&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.cpp Mon Mar 25 21:20:56 2013
@@ -18,7 +18,7 @@ using namespace llvm::ELF;
HexagonTargetHandler::HexagonTargetHandler(HexagonTargetInfo &targetInfo)
: DefaultTargetHandler(targetInfo), _targetLayout(targetInfo),
- _relocationHandler(targetInfo, _targetLayout),
+ _relocationHandler(targetInfo, *this, _targetLayout),
_hexagonRuntimeFile(targetInfo) {}
namespace {
Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=177970&r1=177969&r2=177970&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Mon Mar 25 21:20:56 2013
@@ -195,7 +195,7 @@ public:
}
}
- uint64_t getGOTSymAddr() { return _gotSymAtom->_virtualAddr; }
+ uint64_t getGOTSymAddr() const { return _gotSymAtom->_virtualAddr; }
private:
HexagonTargetLayout<HexagonELFType> _targetLayout;
Added: lld/trunk/test/elf/Hexagon/dynlib-gotoff.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Hexagon/dynlib-gotoff.test?rev=177970&view=auto
==============================================================================
--- lld/trunk/test/elf/Hexagon/dynlib-gotoff.test (added)
+++ lld/trunk/test/elf/Hexagon/dynlib-gotoff.test Mon Mar 25 21:20:56 2013
@@ -0,0 +1,235 @@
+RUN: lld -core -target hexagon %p/Inputs/dynobj.o \
+RUN: -output=%t -emit-yaml -noinhibit-exec -output-type=shared
+RUN: FileCheck -check-prefix=CHECKGOTPLT %s < %t
+
+ - name: __got_c
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 2^3
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .got
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_GLOB_DAT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: c
+ - name: __got_shankar
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 2^3
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .got
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_GLOB_DAT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: shankar
+ - name: __got_fn
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 2^3
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: .PLT0
+ - name: __got_fn1
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 2^3
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn1
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: .PLT0
+ - name: __got_fn2
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 2^3
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn2
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: .PLT0
+CHECKGOTPLT: - name: .text
+CHECKGOTPLT: alignment: 2^2
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .text
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn2
+CHECKGOTPLT: - name: fn2
+CHECKGOTPLT: scope: global
+CHECKGOTPLT: content: [ 00, C0, 9D, A0, 00, C0, 00, 78, 1E, C0, 1E, 96 ]
+CHECKGOTPLT: alignment: 2^2
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .text
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: .text
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn1
+CHECKGOTPLT: - name: fn1
+CHECKGOTPLT: scope: global
+CHECKGOTPLT: content: [ 00, C0, 9D, A0, 00, C0, 00, 78, 1E, C0, 1E, 96 ]
+CHECKGOTPLT: alignment: 2^2
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .text
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn2
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn
+CHECKGOTPLT: - name: fn
+CHECKGOTPLT: scope: global
+CHECKGOTPLT: content: [ 01, C0, 9D, A0, 01, D8, 9D, A1, 00, 40, 00, 00,
+CHECKGOTPLT: 18, C0, 49, 6A, 00, 40, 00, 00, 00, C0, 49, 6A,
+CHECKGOTPLT: 0A, C0, 40, 3C, 00, 40, 00, 00, 00, C0, 49, 6A,
+CHECKGOTPLT: 14, C0, 40, 3C, 00, 40, 00, 00, 00, C0, 98, 91,
+CHECKGOTPLT: 0A, C0, 40, 3C, 00, 40, 00, 00, 00, C0, 98, 91,
+CHECKGOTPLT: 14, C0, 40, 3C, 00, C0, 00, 78, 38, C0, 9D, 91,
+CHECKGOTPLT: 1E, C0, 1E, 96 ]
+CHECKGOTPLT: alignment: 2^2
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .text
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 8
+CHECKGOTPLT: target: _GLOBAL_OFFSET_TABLE_
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 12
+CHECKGOTPLT: target: _GLOBAL_OFFSET_TABLE_
+CHECKGOTPLT: addend: 4
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 16
+CHECKGOTPLT: target: .sbss.4
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 20
+CHECKGOTPLT: target: .sbss.4
+CHECKGOTPLT: addend: 4
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 28
+CHECKGOTPLT: target: .sbss.4
+CHECKGOTPLT: addend: 4
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 32
+CHECKGOTPLT: target: .sbss.4
+CHECKGOTPLT: addend: 8
+CHECKGOTPLT: - kind: R_HEX_GOT_32_6_X
+CHECKGOTPLT: offset: 40
+ target: __got_c
+CHECKGOTPLT: - kind: R_HEX_GOT_11_X
+CHECKGOTPLT: offset: 44
+ target: __got_c
+CHECKGOTPLT: - kind: R_HEX_GOT_32_6_X
+CHECKGOTPLT: offset: 52
+ target: __got_shankar
+CHECKGOTPLT: - kind: R_HEX_GOT_11_X
+CHECKGOTPLT: offset: 56
+ target: __got_shankar
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn1
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn3
+CHECKGOTPLT: - name: fn3
+CHECKGOTPLT: scope: global
+CHECKGOTPLT: content: [ 00, C0, 9D, A0, 00, C0, 00, 5A, 00, C0, 00, 5A,
+CHECKGOTPLT: 00, C0, 00, 5A, 00, C0, 00, 78, 1E, C0, 1E, 96 ]
+CHECKGOTPLT: alignment: 2^2
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .text
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B22_PCREL
+CHECKGOTPLT: offset: 4
+ target: __plt_fn
+CHECKGOTPLT: - kind: R_HEX_B22_PCREL
+CHECKGOTPLT: offset: 8
+ target: __plt_fn1
+CHECKGOTPLT: - kind: R_HEX_B22_PCREL
+CHECKGOTPLT: offset: 12
+ target: __plt_fn2
+CHECKGOTPLT: - kind: <unknown>
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn
+ - name: .PLT0
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 1C, C0, 49, 6A, 0E, 42, 9C, E2,
+CHECKGOTPLT: 4F, 40, 9C, 91, 3C, C0, 9C, 91, 0E, 42, 0E, 8C,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 2^4
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got0
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got0
+ - name: __plt_fn
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 2^4
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn
+CHECKGOTPLT: addend: 4
+ - name: __plt_fn1
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 2^4
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn1
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn1
+CHECKGOTPLT: addend: 4
+ - name: __plt_fn2
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 2^4
+CHECKGOTPLT: section-choice: custom-required
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn2
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn2
+CHECKGOTPLT: addend: 4
More information about the llvm-commits
mailing list