summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/ELFObjectWriter.cpp
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2017-09-21 14:04:53 +0000
committerSimon Atanasyan <simon@atanasyan.com>2017-09-21 14:04:53 +0000
commitede43b71f802ad65c030557876939bcc1f7636b8 (patch)
tree30d14b9ac3a47c78e1c1294e5ccdd937acc7db27 /llvm/lib/MC/ELFObjectWriter.cpp
parent9f676a7798cc7f2ee61513c94c59ad699341a109 (diff)
downloadbcm5719-llvm-ede43b71f802ad65c030557876939bcc1f7636b8.tar.gz
bcm5719-llvm-ede43b71f802ad65c030557876939bcc1f7636b8.zip
[mips] Implement generation of relocations "chains" used by N32 ABI
In case of using a "nested" relocation expressions like this `%hi(%neg(%gp_rel()))`, N32 ABI requires generation of three consecutive relocations. That differs from the N64 ABI case where all relocations are packed into the single relocation record. llvm-svn: 313879
Diffstat (limited to 'llvm/lib/MC/ELFObjectWriter.cpp')
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp17
1 files changed, 17 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));
+ }
+ }
}
}
}
OpenPOWER on IntegriCloud