blob: ac3a54758ebd6948b8d3cfa6f751b394a410aff9 [file] [log] [blame]
Akira Hatanakab862f092012-08-20 17:53:24 +00001//===-- MipsELFWriterInfo.cpp - ELF Writer Info for the Mips backend ------===//
Akira Hatanaka3028d382012-08-17 21:38:47 +00002//
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_) {
Akira Hatanakab862f092012-08-20 17:53:24 +000030 EMachine = EM_MIPS;
31}
Akira Hatanaka3028d382012-08-17 21:38:47 +000032
33MipsELFWriterInfo::~MipsELFWriterInfo() {}
34
35unsigned MipsELFWriterInfo::getRelocationType(unsigned MachineRelTy) const {
Akira Hatanakab862f092012-08-20 17:53:24 +000036 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 }
Akira Hatanaka3028d382012-08-17 21:38:47 +000048}
49
50long int MipsELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy,
Akira Hatanakab862f092012-08-20 17:53:24 +000051 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 }
Akira Hatanaka3028d382012-08-17 21:38:47 +000057}
58
59unsigned MipsELFWriterInfo::getRelocationTySize(unsigned RelTy) const {
Akira Hatanakab862f092012-08-20 17:53:24 +000060 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 }
Akira Hatanaka3028d382012-08-17 21:38:47 +000067}
68
69bool MipsELFWriterInfo::isPCRelativeRel(unsigned RelTy) const {
Akira Hatanakab862f092012-08-20 17:53:24 +000070 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 }
Akira Hatanaka3028d382012-08-17 21:38:47 +000078}
79
80unsigned MipsELFWriterInfo::getAbsoluteLabelMachineRelTy() const {
81 return Mips::reloc_mips_26;
82}
83
84long int MipsELFWriterInfo::computeRelocation(unsigned SymOffset,
Akira Hatanakab862f092012-08-20 17:53:24 +000085 unsigned RelOffset,
86 unsigned RelTy) const {
Akira Hatanaka3028d382012-08-17 21:38:47 +000087
88 if (RelTy == ELF::R_MIPS_GOT16)
89 return SymOffset - (RelOffset + 4);
90
91 llvm_unreachable("computeRelocation unknown for this relocation type");
92}