summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Sanders <daniel.sanders@imgtec.com>2016-05-12 13:39:13 +0000
committerDaniel Sanders <daniel.sanders@imgtec.com>2016-05-12 13:39:13 +0000
commit5fb391c893073547f546a88f461a0de15924c55b (patch)
tree0bcd281964c87cba887f2148c7c813a2b1aa2925
parent3a0736e279bbcde85c2d7ed026861600469a9eb7 (diff)
downloadbcm5719-llvm-5fb391c893073547f546a88f461a0de15924c55b.tar.gz
bcm5719-llvm-5fb391c893073547f546a88f461a0de15924c55b.zip
[mips][ias] Work around incorrect another microMIPS relocation evaluation exposed by r268900
As explained in r269196, microMIPS has a special case that is not correctly implemented in LLVM. If we have a symbol 'foo' which is equivalent to '.text+0x10'. The value of an R_MICROMIPS_LO16 relocation using 'foo' is 'foo+0x11' and not 'foo+0x10'. The in-place addend should therefore be 0x11. This commit reverts a little more of the effect of r268900 by keeping the symbol when the STO_MIPS_MICROMIPS flag is set for R_MIPS_GPREL32 relocations. This fixes SingleSource/UnitTests/2003-08-11-VaListArg, and SingleSource/UnitTests/2003-05-07-VarArgs for microMIPS. I believe there are additional relocations that have the same issue (e.g. R_MIPS_64, and R_MIPS_GPREL16) but for now I'm focusing on restoring our internal buildbots back to the green state we had in r268899. llvm-svn: 269294
-rw-r--r--llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp2
-rw-r--r--llvm/test/MC/Mips/relocation-xfail.s9
2 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
index e47868db1a4..a5e63856401 100644
--- a/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
+++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
@@ -518,13 +518,13 @@ bool MipsELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
case ELF::R_MIPS_16:
case ELF::R_MIPS_32:
+ case ELF::R_MIPS_GPREL32:
if (cast<MCSymbolELF>(Sym).getOther() & ELF::STO_MIPS_MICROMIPS)
return true;
// fallthrough
case ELF::R_MIPS_26:
case ELF::R_MIPS_64:
case ELF::R_MIPS_GPREL16:
- case ELF::R_MIPS_GPREL32:
case ELF::R_MIPS_PC16:
case ELF::R_MIPS_SUB:
return false;
diff --git a/llvm/test/MC/Mips/relocation-xfail.s b/llvm/test/MC/Mips/relocation-xfail.s
index 0b64378c37a..2db2c469855 100644
--- a/llvm/test/MC/Mips/relocation-xfail.s
+++ b/llvm/test/MC/Mips/relocation-xfail.s
@@ -9,12 +9,21 @@
// baz is equivalent to .text+0x8 and is recorded in the symbol table as such
// but it refers to microMIPS code so the addend must indicate this in the LSB.
// The addend must therefore be 0x9.
+// DATA-LABEL: Name: .text
+// DATA: SectionData (
// DATA: 0000: 30430000 30420009
addiu $2, $3, %got(baz)
addiu $2, $2, %lo(baz)
baz:
+// DATA-LABEL: Name: .data
+// DATA: SectionData (
.data
.word 0
bar:
.word 1
+// baz is equivalent to .text+0x8 and is recorded in the symbol table as such
+// but it refers to microMIPS code so the addend must indicate this in the LSB.
+// The addend must therefore be 0x9.
+// DATA: 0000: 00000000 00000001 00000009
+ .gpword baz
OpenPOWER on IntegriCloud