summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h16
-rw-r--r--lld/test/elf/Mips/mips32.test21
2 files changed, 34 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
index fc580da3c2c..cb1cf78d65c 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFFile.h
@@ -68,9 +68,19 @@ private:
auto *ref = new (this->_readerStorage)
ELFReference<ELFT>(&ri, ri.r_offset - symbol.st_value, this->kindArch(),
ri.getType(isMips64EL), ri.getSymbol(isMips64EL));
- int32_t addend =
- *(int16_t *)(content.data() + ri.r_offset - symbol.st_value);
- ref->setAddend(addend);
+ const uint8_t *ap = content.data() + ri.r_offset - symbol.st_value;
+ switch (ri.getType(isMips64EL)) {
+ case R_MIPS_32:
+ ref->setAddend(*(int32_t *)ap);
+ break;
+ case R_MIPS_26:
+ ref->setAddend(*(int16_t *)ap);
+ break;
+ case R_MIPS_HI16:
+ case R_MIPS_LO16:
+ ref->setAddend(*(int16_t *)ap);
+ break;
+ }
return ref;
}
};
diff --git a/lld/test/elf/Mips/mips32.test b/lld/test/elf/Mips/mips32.test
new file mode 100644
index 00000000000..7557418b666
--- /dev/null
+++ b/lld/test/elf/Mips/mips32.test
@@ -0,0 +1,21 @@
+# Check handling R_MIPS_32 relocation.
+#
+# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t-obj %s
+# RUN: lld -flavor gnu -target mipsel -o %t-exe %t-obj
+# RUN: llvm-objdump -s %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 422000 28014000 2c014200 (.@.,.B.
+
+ .global __start
+ .ent __start
+__start:
+ nop
+ .space 0x20000
+la:
+ nop
+ .end __start
+
+ .data
+ .4byte __start
+ .4byte la
OpenPOWER on IntegriCloud