diff options
| author | Matheus Almeida <matheus.almeida@imgtec.com> | 2014-04-30 11:21:10 +0000 |
|---|---|---|
| committer | Matheus Almeida <matheus.almeida@imgtec.com> | 2014-04-30 11:21:10 +0000 |
| commit | c0284d118f730e343d75762118385593e5aa6ce4 (patch) | |
| tree | 854dfd5747ad145e2a68b998fc55b0850efbba4f | |
| parent | 970c4a8d3571900c9c016ab89870ccebf5ff521d (diff) | |
| download | bcm5719-llvm-c0284d118f730e343d75762118385593e5aa6ce4.tar.gz bcm5719-llvm-c0284d118f730e343d75762118385593e5aa6ce4.zip | |
[mips] Emit all three relocation operations for each relocation entry on Mips64 big-endian systems.
Summary:
The N64 ABI allows up to three operations to be specified per relocation record
independently of the endianness.
Reviewers: dsanders
Reviewed By: dsanders
Differential Revision: http://reviews.llvm.org/D3529
llvm-svn: 207636
| -rw-r--r-- | llvm/include/llvm/Object/ELF.h | 13 | ||||
| -rw-r--r-- | llvm/test/MC/Mips/elf-N64.s | 1 | ||||
| -rw-r--r-- | llvm/test/MC/Mips/elf-gprel-32-64.s | 3 |
3 files changed, 16 insertions, 1 deletions
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index bc9cc673cb1..a9989c2a800 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -317,6 +317,11 @@ public: ELFFile(MemoryBuffer *Object, error_code &ec); + bool isMipsELF64() const { + return Header->e_machine == ELF::EM_MIPS && + Header->getFileClass() == ELF::ELFCLASS64; + } + bool isMips64EL() const { return Header->e_machine == ELF::EM_MIPS && Header->getFileClass() == ELF::ELFCLASS64 && @@ -537,10 +542,16 @@ StringRef ELFFile<ELFT>::getRelocationTypeName(uint32_t Type) const { template <class ELFT> void ELFFile<ELFT>::getRelocationTypeName(uint32_t Type, SmallVectorImpl<char> &Result) const { - if (!isMips64EL()) { + if (!isMipsELF64()) { StringRef Name = getRelocationTypeName(Type); Result.append(Name.begin(), Name.end()); } else { + // The Mips N64 ABI allows up to three operations to be specified per + // relocation record. Unfortunately there's no easy way to test for the + // presence of N64 ELFs as they have no special flag that identifies them + // as being N64. We can safely assume at the moment that all Mips + // ELFCLASS64 ELFs are N64. New Mips64 ABIs should provide enough + // information to disambiguate between old vs new ABIs. uint8_t Type1 = (Type >> 0) & 0xFF; uint8_t Type2 = (Type >> 8) & 0xFF; uint8_t Type3 = (Type >> 16) & 0xFF; diff --git a/llvm/test/MC/Mips/elf-N64.s b/llvm/test/MC/Mips/elf-N64.s index 3c01803d2a9..bf6ebd73091 100644 --- a/llvm/test/MC/Mips/elf-N64.s +++ b/llvm/test/MC/Mips/elf-N64.s @@ -1,4 +1,5 @@ // RUN: llvm-mc -filetype=obj -triple=mips64el-pc-linux -mcpu=mips64 %s -o - | llvm-readobj -r | FileCheck %s +// RUN: llvm-mc -filetype=obj -triple=mips64-pc-linux -mcpu=mips64 %s -o - | llvm-readobj -r | FileCheck %s // Check for N64 relocation production. // Check that the appropriate relocations were created. diff --git a/llvm/test/MC/Mips/elf-gprel-32-64.s b/llvm/test/MC/Mips/elf-gprel-32-64.s index ae75197a4fc..2f5ac6652a3 100644 --- a/llvm/test/MC/Mips/elf-gprel-32-64.s +++ b/llvm/test/MC/Mips/elf-gprel-32-64.s @@ -1,6 +1,9 @@ // RUN: llvm-mc -filetype=obj -triple=mips64el-pc-linux -mcpu=mips64 %s -o - \ // RUN: | llvm-readobj -r \ // RUN: | FileCheck %s +// RUN: llvm-mc -filetype=obj -triple=mips64-pc-linux -mcpu=mips64 %s -o - \ +// RUN: | llvm-readobj -r \ +// RUN: | FileCheck %s // Check that the appropriate relocations were created. |

