//===-- MipsELFWriterInfo.cpp - ELF Writer Info for the Mips backend ------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements ELF writer information for the Mips backend. // //===----------------------------------------------------------------------===// #include "MipsELFWriterInfo.h" #include "MipsRelocations.h" #include "llvm/Function.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/DataLayout.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/ELF.h" using namespace llvm; //===----------------------------------------------------------------------===// // Implementation of the MipsELFWriterInfo class //===----------------------------------------------------------------------===// MipsELFWriterInfo::MipsELFWriterInfo(bool is64Bit_, bool isLittleEndian_) : TargetELFWriterInfo(is64Bit_, isLittleEndian_) { EMachine = EM_MIPS; } MipsELFWriterInfo::~MipsELFWriterInfo() {} unsigned MipsELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { switch(MachineRelTy) { case Mips::reloc_mips_pc16: return ELF::R_MIPS_GOT16; case Mips::reloc_mips_hi: return ELF::R_MIPS_HI16; case Mips::reloc_mips_lo: return ELF::R_MIPS_LO16; case Mips::reloc_mips_26: return ELF::R_MIPS_26; default: llvm_unreachable("unknown Mips machine relocation type"); } } long int MipsELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy, long int Modifier) const { switch(RelTy) { case ELF::R_MIPS_26: return Modifier; default: llvm_unreachable("unknown Mips relocation type"); } } unsigned MipsELFWriterInfo::getRelocationTySize(unsigned RelTy) const { switch(RelTy) { case ELF::R_MIPS_GOT16: case ELF::R_MIPS_26: return 32; default: llvm_unreachable("unknown Mips relocation type"); } } bool MipsELFWriterInfo::isPCRelativeRel(unsigned RelTy) const { switch(RelTy) { case ELF::R_MIPS_GOT16: return true; case ELF::R_MIPS_26: return false; default: llvm_unreachable("unknown Mips relocation type"); } } unsigned MipsELFWriterInfo::getAbsoluteLabelMachineRelTy() const { return Mips::reloc_mips_26; } long int MipsELFWriterInfo::computeRelocation(unsigned SymOffset, unsigned RelOffset, unsigned RelTy) const { if (RelTy == ELF::R_MIPS_GOT16) return SymOffset - (RelOffset + 4); llvm_unreachable("computeRelocation unknown for this relocation type"); }