diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-02-18 15:57:52 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2014-02-18 15:57:52 +0000 |
commit | aa43604648e3ffc400dbcc1adec003c096eb76ca (patch) | |
tree | 432d76d72475a18299175276963d5efe0e11d7dd /include/llvm/Object | |
parent | 39d8dcb53b806841c8455637c23549b24760ce80 (diff) | |
download | llvm-aa43604648e3ffc400dbcc1adec003c096eb76ca.tar.gz llvm-aa43604648e3ffc400dbcc1adec003c096eb76ca.tar.bz2 llvm-aa43604648e3ffc400dbcc1adec003c096eb76ca.tar.xz |
[mips] Add support for ELF64-mips and the R_MIPS_32/R_MIPS_64 relocs for it.
Summary:
This fixes several test failures when building LLVM on a MIPS host.
The failures were:
LLVM :: DebugInfo/enum.ll
LLVM :: DebugInfo/inlined-arguments.ll
LLVM :: DebugInfo/member-order.ll
LLVM :: DebugInfo/namespace.ll
LLVM :: DebugInfo/template-recursive-void.ll
LLVM :: DebugInfo/tu-composite.ll
LLVM :: DebugInfo/two-cus-from-same-file.ll
LLVM :: Linker/type-unique-simple-a.ll
LLVM :: Linker/type-unique-simple2.ll
Reviewers: jacksprat, matheusalmeida
Reviewed By: matheusalmeida
Differential Revision: http://llvm-reviews.chandlerc.com/D2721
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201582 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Object')
-rw-r--r-- | include/llvm/Object/ELFObjectFile.h | 2 | ||||
-rw-r--r-- | include/llvm/Object/RelocVisitor.h | 17 |
2 files changed, 19 insertions, 0 deletions
diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 054d8d4b65..cadf920c27 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -946,6 +946,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const { return "ELF64-s390"; case ELF::EM_SPARCV9: return "ELF64-sparc"; + case ELF::EM_MIPS: + return "ELF64-mips"; default: return "ELF64-unknown"; } diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 2e1d43e26a..225b83eff3 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -103,6 +103,16 @@ public: HasError = true; return RelocToApply(); } + } else if (FileFormat == "ELF64-mips") { + switch (RelocType) { + case llvm::ELF::R_MIPS_32: + return visitELF_MIPS_32(R, Value); + case llvm::ELF::R_MIPS_64: + return visitELF_MIPS_64(R, Value); + default: + HasError = true; + return RelocToApply(); + } } else if (FileFormat == "ELF64-aarch64") { switch (RelocType) { case llvm::ELF::R_AARCH64_ABS32: @@ -260,6 +270,13 @@ private: return RelocToApply(Res, 4); } + RelocToApply visitELF_MIPS_64(RelocationRef R, uint64_t Value) { + int64_t Addend; + getELFRelocationAddend(R, Addend); + uint64_t Res = (Value + Addend); + return RelocToApply(Res, 8); + } + // AArch64 ELF RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) { int64_t Addend = getAddend64LE(R); |