1//===-- MipsELFWriterInfo.cpp - ELF Writer Info for the Mips backend ------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements ELF writer information for the Mips backend. 11// 12//===----------------------------------------------------------------------===// 13 14#include "MipsELFWriterInfo.h" 15#include "MipsRelocations.h" 16#include "llvm/Function.h" 17#include "llvm/Support/ErrorHandling.h" 18#include "llvm/Target/TargetData.h" 19#include "llvm/Target/TargetMachine.h" 20#include "llvm/Support/ELF.h" 21 22using namespace llvm; 23 24//===----------------------------------------------------------------------===// 25// Implementation of the MipsELFWriterInfo class 26//===----------------------------------------------------------------------===// 27 28MipsELFWriterInfo::MipsELFWriterInfo(bool is64Bit_, bool isLittleEndian_) 29 : TargetELFWriterInfo(is64Bit_, isLittleEndian_) { 30 EMachine = EM_MIPS; 31} 32 33MipsELFWriterInfo::~MipsELFWriterInfo() {} 34 35unsigned MipsELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { 36 switch(MachineRelTy) { 37 case Mips::reloc_mips_pc16: 38 return ELF::R_MIPS_GOT16; 39 case Mips::reloc_mips_hi: 40 return ELF::R_MIPS_HI16; 41 case Mips::reloc_mips_lo: 42 return ELF::R_MIPS_LO16; 43 case Mips::reloc_mips_26: 44 return ELF::R_MIPS_26; 45 default: 46 llvm_unreachable("unknown Mips machine relocation type"); 47 } 48} 49 50long int MipsELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy, 51 long int Modifier) const { 52 switch(RelTy) { 53 case ELF::R_MIPS_26: return Modifier; 54 default: 55 llvm_unreachable("unknown Mips relocation type"); 56 } 57} 58 59unsigned MipsELFWriterInfo::getRelocationTySize(unsigned RelTy) const { 60 switch(RelTy) { 61 case ELF::R_MIPS_GOT16: 62 case ELF::R_MIPS_26: 63 return 32; 64 default: 65 llvm_unreachable("unknown Mips relocation type"); 66 } 67} 68 69bool MipsELFWriterInfo::isPCRelativeRel(unsigned RelTy) const { 70 switch(RelTy) { 71 case ELF::R_MIPS_GOT16: 72 return true; 73 case ELF::R_MIPS_26: 74 return false; 75 default: 76 llvm_unreachable("unknown Mips relocation type"); 77 } 78} 79 80unsigned MipsELFWriterInfo::getAbsoluteLabelMachineRelTy() const { 81 return Mips::reloc_mips_26; 82} 83 84long int MipsELFWriterInfo::computeRelocation(unsigned SymOffset, 85 unsigned RelOffset, 86 unsigned RelTy) const { 87 88 if (RelTy == ELF::R_MIPS_GOT16) 89 return SymOffset - (RelOffset + 4); 90 91 llvm_unreachable("computeRelocation unknown for this relocation type"); 92} 93