119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- ARMELFWriterInfo.cpp - ELF Writer Info for the ARM backend --------===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements ELF writer information for the ARM backend. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "ARMELFWriterInfo.h" 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "ARMRelocations.h" 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Function.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetData.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetMachine.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ELF.h" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm; 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Implementation of the ARMELFWriterInfo class 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanARMELFWriterInfo::ARMELFWriterInfo(TargetMachine &TM) 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : TargetELFWriterInfo(TM.getTargetData()->getPointerSizeInBits() == 64, 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TM.getTargetData()->isLittleEndian()) { 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanARMELFWriterInfo::~ARMELFWriterInfo() {} 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned ARMELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (MachineRelTy) { 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_absolute: 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_relative: 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_cp_entry: 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_vfp_cp_entry: 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_machine_cp_entry: 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_jt_base: 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_pic_jt: 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && "unsupported ARM relocation type"); break; 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_branch: return ELF::R_ARM_CALL; break; 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_movt: return ELF::R_ARM_MOVT_ABS; break; 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case ARM::reloc_arm_movw: return ELF::R_ARM_MOVW_ABS_NC; break; 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman llvm_unreachable("unknown ARM relocation type"); break; 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 0; 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanlong int ARMELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy, 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman long int Modifier) const { 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && "ARMELFWriterInfo::getDefaultAddendForRelTy() not implemented"); 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 0; 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned ARMELFWriterInfo::getRelocationTySize(unsigned RelTy) const { 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && "ARMELFWriterInfo::getRelocationTySize() not implemented"); 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 0; 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool ARMELFWriterInfo::isPCRelativeRel(unsigned RelTy) const { 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && "ARMELFWriterInfo::isPCRelativeRel() not implemented"); 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 1; 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() const { 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() not implemented"); 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 0; 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanlong int ARMELFWriterInfo::computeRelocation(unsigned SymOffset, 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned RelOffset, 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned RelTy) const { 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(0 && 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "ARMELFWriterInfo::getAbsoluteLabelMachineRelTy() not implemented"); 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return 0; 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 84