diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2017-09-21 14:04:53 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2017-09-21 14:04:53 +0000 |
commit | ede43b71f802ad65c030557876939bcc1f7636b8 (patch) | |
tree | 30d14b9ac3a47c78e1c1294e5ccdd937acc7db27 /llvm/lib/MC/ELFObjectWriter.cpp | |
parent | 9f676a7798cc7f2ee61513c94c59ad699341a109 (diff) | |
download | bcm5719-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.cpp | 17 |
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)); + } + } } } } |