Skip to content

Commit

Permalink
[mips] Emit all three relocation operations for each relocation entry…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
Matheus Almeida committed Apr 30, 2014
1 parent 970c4a8 commit c0284d1
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
13 changes: 12 additions & 1 deletion llvm/include/llvm/Object/ELF.h
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,11 @@ class ELFFile {

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 &&
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions llvm/test/MC/Mips/elf-N64.s
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
3 changes: 3 additions & 0 deletions llvm/test/MC/Mips/elf-gprel-32-64.s
Original file line number Diff line number Diff line change
@@ -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.

Expand Down

0 comments on commit c0284d1

Please sign in to comment.