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