blob: f104b40a31b0e459c93023a3981946f8567255cb [file] [log] [blame]
Akira Hatanaka3028d382012-08-17 21:38:47 +00001//===-- 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}