[lld] r199515 - [Mips] Handle R_MIPS_26 relocation. Maintaining of .plt and .got.plt
Simon Atanasyan
simon at atanasyan.com
Fri Jan 17 13:18:26 PST 2014
Author: atanasyan
Date: Fri Jan 17 15:18:26 2014
New Revision: 199515
URL: http://llvm.org/viewvc/llvm-project?rev=199515&view=rev
Log:
[Mips] Handle R_MIPS_26 relocation. Maintaining of .plt and .got.plt
sections will be implemented later.
Added:
lld/trunk/test/elf/Mips/Inputs/ext.s
lld/trunk/test/elf/Mips/r26.test
Modified:
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h Fri Jan 17 15:18:26 2014
@@ -19,7 +19,9 @@ enum {
/// \brief Do nothing but mark GOT entry as a global one.
LLD_R_MIPS_GLOBAL_GOT = 1024,
/// \brief The same as R_MIPS_GOT16 but for global symbols.
- LLD_R_MIPS_GLOBAL_GOT16 = 1025
+ LLD_R_MIPS_GLOBAL_GOT16 = 1025,
+ /// \brief The same as R_MIPS_26 but for global symbols.
+ LLD_R_MIPS_GLOBAL_26 = 1026
};
typedef llvm::object::ELFType<llvm::support::little, 2, false> Mips32ElELFType;
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationHandler.cpp Fri Jan 17 15:18:26 2014
@@ -31,6 +31,12 @@ inline int64_t calcAHL(int64_t AHI, int6
return (AHI << 16) + (int16_t)ALO;
}
+template <size_t BITS, class T> inline T signExtend(T val) {
+ if (val & (T(1) << (BITS - 1)))
+ val |= T(-1) << BITS;
+ return val;
+}
+
/// \brief R_MIPS_32
/// local/external: word32 S + A (truncate)
void reloc32(uint8_t *location, uint64_t P, uint64_t S, int64_t A) {
@@ -38,6 +44,16 @@ void reloc32(uint8_t *location, uint64_t
applyReloc(location, result);
}
+/// \brief R_MIPS_26
+/// local : ((A | ((P + 4) & 0x3F000000)) + S) >> 2
+/// external: (signâextend(A) + S) >> 2
+void reloc26(uint8_t *location, uint64_t P, uint64_t S, bool isLocal) {
+ int32_t A = (*(uint32_t*)location & 0x03FFFFFFU) << 2;
+ uint32_t result = isLocal ? (A | ((P + 4) & 0x3F000000)) : signExtend<28>(A);
+ result = (result + S) >> 2;
+ applyReloc(location, result);
+}
+
/// \brief R_MIPS_HI16
/// local/external: hi16 (AHL + S) - (short)(AHL + S) (truncate)
/// _gp_disp : hi16 (AHL + GP - P) - (short)(AHL + GP - P) (verify)
@@ -162,6 +178,9 @@ error_code MipsTargetRelocationHandler::
case R_MIPS_32:
reloc32(location, relocVAddress, targetVAddress, ref.addend());
break;
+ case R_MIPS_26:
+ reloc26(location, relocVAddress, targetVAddress, true);
+ break;
case R_MIPS_HI16:
savePairedRelocation(atom, ref);
break;
@@ -188,6 +207,9 @@ error_code MipsTargetRelocationHandler::
relocGOT16(location, relocVAddress, targetVAddress, ref.addend(),
_targetHandler.getGPDispSymAddr());
break;
+ case LLD_R_MIPS_GLOBAL_26:
+ reloc26(location, relocVAddress, targetVAddress, false);
+ break;
default: {
std::string str;
llvm::raw_string_ostream s(str);
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Fri Jan 17 15:18:26 2014
@@ -111,6 +111,9 @@ private:
return;
assert(ref.kindArch() == Reference::KindArch::Mips);
switch (ref.kindValue()) {
+ case R_MIPS_26:
+ handlePLT(ref);
+ break;
case R_MIPS_GOT16:
case R_MIPS_CALL16:
handleGOT(ref);
@@ -124,6 +127,13 @@ private:
return false;
}
+ void handlePLT(const Reference &ref) {
+ if (ref.kindValue() == R_MIPS_26 && !isLocal(ref.target()))
+ const_cast<Reference &>(ref).setKindValue(LLD_R_MIPS_GLOBAL_26);
+
+ // FIXME (simon): Create PLT entry.
+ }
+
void handleGOT(const Reference &ref) {
if (ref.kindValue() == R_MIPS_GOT16 && !isLocal(ref.target()))
const_cast<Reference &>(ref).setKindValue(LLD_R_MIPS_GLOBAL_GOT16);
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp?rev=199515&r1=199514&r2=199515&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.cpp Fri Jan 17 15:18:26 2014
@@ -195,6 +195,7 @@ void MipsTargetHandler::registerRelocati
const Registry::KindStrings MipsTargetHandler::kindStrings[] = {
LLD_KIND_STRING_ENTRY(R_MIPS_NONE),
LLD_KIND_STRING_ENTRY(R_MIPS_32),
+ LLD_KIND_STRING_ENTRY(R_MIPS_26),
LLD_KIND_STRING_ENTRY(R_MIPS_HI16),
LLD_KIND_STRING_ENTRY(R_MIPS_LO16),
LLD_KIND_STRING_ENTRY(R_MIPS_GOT16),
@@ -202,5 +203,6 @@ const Registry::KindStrings MipsTargetHa
LLD_KIND_STRING_ENTRY(R_MIPS_JALR),
LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT),
LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_GOT16),
+ LLD_KIND_STRING_ENTRY(LLD_R_MIPS_GLOBAL_26),
LLD_KIND_STRING_END
};
Added: lld/trunk/test/elf/Mips/Inputs/ext.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/Inputs/ext.s?rev=199515&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/Inputs/ext.s (added)
+++ lld/trunk/test/elf/Mips/Inputs/ext.s Fri Jan 17 15:18:26 2014
@@ -0,0 +1,46 @@
+# Assembly code defines set of externally visible labels.
+
+# Shared library generation:
+# llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \
+# -o=%t1 %p/Inputs/ext.s
+# lld -flavor gnu -target mipsel -shared -o %t2 %t1
+
+# Executable generation:
+# llvm-mc -triple=mipsel -filetype=obj -o=%t1 %p/Inputs/ext.s
+# lld -flavor gnu -target mipsel -e ext1 -o %t2 %t1
+
+ .global ext1
+ .ent ext1
+ext1:
+ nop
+ .end ext1
+
+ .global ext2
+ .ent ext2
+ext2:
+ nop
+ .end ext2
+
+ .global ext3
+ .ent ext3
+ext3:
+ nop
+ .end ext3
+
+ .global ext4
+ .ent ext4
+ext4:
+ nop
+ .end ext4
+
+ .global ext5
+ .ent ext5
+ext5:
+ nop
+ .end ext5
+
+ .global ext6
+ .ent ext6
+ext6:
+ nop
+ .end ext6
Added: lld/trunk/test/elf/Mips/r26.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/r26.test?rev=199515&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/r26.test (added)
+++ lld/trunk/test/elf/Mips/r26.test Fri Jan 17 15:18:26 2014
@@ -0,0 +1,47 @@
+# Check handling of R_MIPS_26 relocation.
+
+# Build shared library
+# RUN: llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \
+# RUN: -o=%t1 %p/Inputs/ext.s
+# RUN: lld -flavor gnu -target mipsel -shared -o %t2 %t1
+
+# Build executable
+# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t3 %s
+# RUN: llvm-objdump -r %t3 | FileCheck -check-prefix=REL %s
+# RUN: lld -flavor gnu -target mipsel -e glob -o %t4 %t3 %t2
+# RUN: llvm-objdump -disassemble %t4 | FileCheck -check-prefix=EXE %s
+
+# Object file has three R_MIPS_26 relocations
+# REL: RELOCATION RECORDS FOR [.rel.text]:
+# REL: 8 R_MIPS_26 Unknown
+# REL: 16 R_MIPS_26 Unknown
+# REL: 24 R_MIPS_26 Unknown
+
+# EXE: Disassembly of section .text:
+# EXE: glob:
+# EXE: 40014c: 09 f8 20 03 jalr $25
+# EXE: 400150: 00 00 00 00 nop
+#
+# Jump to 'loc' label address
+# EXE: 400154: 57 00 10 0c jal 4194652
+# EXE: 400158: 00 00 00 00 nop
+#
+# EXE: loc:
+# Jump to 'glob' label address
+# EXE: 40015c: 53 00 10 0c jal 4194636
+# EXE: 400160: 00 00 00 00 nop
+#
+# Jump to the first PLT entry (.plt + 32) for ext1 entry
+# EXE: 400164: 00 00 00 0c jal 0
+# EXE: 400168: 00 00 00 00 nop
+
+ .abicalls
+ .global glob
+ .ent glob
+glob:
+ jal $t9
+ jal loc
+loc:
+ jal glob
+ jal ext1
+ .end glob
More information about the llvm-commits
mailing list