mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
dc0ebcb076
which many Mips 64 ABIs use than for O64 which many if not all other target ABIs use. Most architectures have the following 64 bit relocation record format: typedef struct { Elf64_Addr r_offset; /* Address of reference */ Elf64_Xword r_info; /* Symbol index and type of relocation */ } Elf64_Rel; typedef struct { Elf64_Addr r_offset; Elf64_Xword r_info; Elf64_Sxword r_addend; } Elf64_Rela; Whereas N64 has the following format: typedef struct { Elf64_Addr r_offset;/* Address of reference */ Elf64_Word r_sym; /* Symbol index */ Elf64_Byte r_ssym; /* Special symbol */ Elf64_Byte r_type3; /* Relocation type */ Elf64_Byte r_type2; /* Relocation type */ Elf64_Byte r_type; /* Relocation type */ } Elf64_Rel; typedef struct { Elf64_Addr r_offset;/* Address of reference */ Elf64_Word r_sym; /* Symbol index */ Elf64_Byte r_ssym; /* Special symbol */ Elf64_Byte r_type3; /* Relocation type */ Elf64_Byte r_type2; /* Relocation type */ Elf64_Byte r_type; /* Relocation type */ Elf64_Sxword r_addend; } Elf64_Rela; The structure is the same size, but the r_info data element is now 5 separate elements. Besides the content aspects, endian byte reordering will be different for the area with each element being endianized separately. I treat this as generic and continue to pass r_type as an integer masking and unmasking the byte sized N64 values for N64 mode. I've implemented this and it causes no affect on other current targets. This passes make check. Jack llvm-svn: 159299
49 lines
1.8 KiB
C++
49 lines
1.8 KiB
C++
//===-- MCELFObjectTargetWriter.cpp - ELF Target Writer Subclass ----------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/MC/MCELFObjectWriter.h"
|
|
|
|
using namespace llvm;
|
|
|
|
MCELFObjectTargetWriter::MCELFObjectTargetWriter(bool Is64Bit_,
|
|
uint8_t OSABI_,
|
|
uint16_t EMachine_,
|
|
bool HasRelocationAddend_,
|
|
bool IsN64_)
|
|
: OSABI(OSABI_), EMachine(EMachine_),
|
|
HasRelocationAddend(HasRelocationAddend_), Is64Bit(Is64Bit_),
|
|
IsN64(IsN64_){
|
|
}
|
|
|
|
/// Default e_flags = 0
|
|
unsigned MCELFObjectTargetWriter::getEFlags() const {
|
|
return 0;
|
|
}
|
|
|
|
const MCSymbol *MCELFObjectTargetWriter::ExplicitRelSym(const MCAssembler &Asm,
|
|
const MCValue &Target,
|
|
const MCFragment &F,
|
|
const MCFixup &Fixup,
|
|
bool IsPCRel) const {
|
|
return NULL;
|
|
}
|
|
|
|
|
|
void MCELFObjectTargetWriter::adjustFixupOffset(const MCFixup &Fixup,
|
|
uint64_t &RelocOffset) {
|
|
}
|
|
|
|
void
|
|
MCELFObjectTargetWriter::sortRelocs(const MCAssembler &Asm,
|
|
std::vector<ELFRelocationEntry> &Relocs) {
|
|
// Sort by the r_offset, just like gnu as does.
|
|
array_pod_sort(Relocs.begin(), Relocs.end());
|
|
}
|