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