diff options
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 17 | ||||
-rw-r--r-- | llvm/test/MC/Mips/elf-N32.s | 22 |
2 files changed, 39 insertions, 0 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index b37a950908e..eef2757b93b 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1131,6 +1131,23 @@ void ELFObjectWriter::writeRelocations(const MCAssembler &Asm, if (hasRelocationAddend()) write(uint32_t(Entry.Addend)); + + if (TargetObjectWriter->getEMachine() == ELF::EM_MIPS) { + if (uint32_t RType = TargetObjectWriter->getRType2(Entry.Type)) { + write(uint32_t(Entry.Offset)); + + ERE32.setSymbolAndType(0, RType); + write(ERE32.r_info); + write(uint32_t(0)); + } + if (uint32_t RType = TargetObjectWriter->getRType3(Entry.Type)) { + write(uint32_t(Entry.Offset)); + + ERE32.setSymbolAndType(0, RType); + write(ERE32.r_info); + write(uint32_t(0)); + } + } } } } diff --git a/llvm/test/MC/Mips/elf-N32.s b/llvm/test/MC/Mips/elf-N32.s new file mode 100644 index 00000000000..34a0cd0f8be --- /dev/null +++ b/llvm/test/MC/Mips/elf-N32.s @@ -0,0 +1,22 @@ +// Check generation of N32 ABI relocations. + +// RUN: llvm-mc -filetype=obj -triple=mips64-linux-gnu -mcpu=mips3 \ +// RUN: -target-abi=n32 %s -o - | llvm-readobj -r | FileCheck %s + +// CHECK: Relocations [ +// CHECK-NEXT: Section (3) .rela.text { +// CHECK-NEXT: 0x0 R_MIPS_GPREL16 foo 0x4 +// CHECK-NEXT: 0x0 R_MIPS_SUB - 0x0 +// CHECK-NEXT: 0x0 R_MIPS_HI16 - 0x0 +// CHECK-NEXT: 0x4 R_MIPS_GPREL16 foo 0x4 +// CHECK-NEXT: 0x4 R_MIPS_SUB - 0x0 +// CHECK-NEXT: 0x4 R_MIPS_LO16 - 0x0 +// CHECK-NEXT: } + + .globl foo + .ent foo +foo: + lui $gp, %hi(%neg(%gp_rel(foo+4))) + addiu $gp, $gp, %lo(%neg(%gp_rel(foo+4))) + daddu $gp, $gp, $25 + .end foo |