mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207636 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -317,6 +317,11 @@ public:
|
|||||||
|
|
||||||
ELFFile(MemoryBuffer *Object, error_code &ec);
|
ELFFile(MemoryBuffer *Object, error_code &ec);
|
||||||
|
|
||||||
|
bool isMipsELF64() const {
|
||||||
|
return Header->e_machine == ELF::EM_MIPS &&
|
||||||
|
Header->getFileClass() == ELF::ELFCLASS64;
|
||||||
|
}
|
||||||
|
|
||||||
bool isMips64EL() const {
|
bool isMips64EL() const {
|
||||||
return Header->e_machine == ELF::EM_MIPS &&
|
return Header->e_machine == ELF::EM_MIPS &&
|
||||||
Header->getFileClass() == ELF::ELFCLASS64 &&
|
Header->getFileClass() == ELF::ELFCLASS64 &&
|
||||||
@@ -537,10 +542,16 @@ StringRef ELFFile<ELFT>::getRelocationTypeName(uint32_t Type) const {
|
|||||||
template <class ELFT>
|
template <class ELFT>
|
||||||
void ELFFile<ELFT>::getRelocationTypeName(uint32_t Type,
|
void ELFFile<ELFT>::getRelocationTypeName(uint32_t Type,
|
||||||
SmallVectorImpl<char> &Result) const {
|
SmallVectorImpl<char> &Result) const {
|
||||||
if (!isMips64EL()) {
|
if (!isMipsELF64()) {
|
||||||
StringRef Name = getRelocationTypeName(Type);
|
StringRef Name = getRelocationTypeName(Type);
|
||||||
Result.append(Name.begin(), Name.end());
|
Result.append(Name.begin(), Name.end());
|
||||||
} else {
|
} 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 Type1 = (Type >> 0) & 0xFF;
|
||||||
uint8_t Type2 = (Type >> 8) & 0xFF;
|
uint8_t Type2 = (Type >> 8) & 0xFF;
|
||||||
uint8_t Type3 = (Type >> 16) & 0xFF;
|
uint8_t Type3 = (Type >> 16) & 0xFF;
|
||||||
|
@@ -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=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 for N64 relocation production.
|
||||||
// Check that the appropriate relocations were created.
|
// Check that the appropriate relocations were created.
|
||||||
|
@@ -1,6 +1,9 @@
|
|||||||
// RUN: llvm-mc -filetype=obj -triple=mips64el-pc-linux -mcpu=mips64 %s -o - \
|
// RUN: llvm-mc -filetype=obj -triple=mips64el-pc-linux -mcpu=mips64 %s -o - \
|
||||||
// RUN: | llvm-readobj -r \
|
// RUN: | llvm-readobj -r \
|
||||||
// RUN: | FileCheck %s
|
// 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.
|
// Check that the appropriate relocations were created.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user