blob: 3f26ed15b284e6095e9b67dcd564471003637db1 [file] [log] [blame]
Wesley Peck4e9141f2010-10-21 03:57:26 +00001//===-- MBlazeELFWriterInfo.cpp - ELF Writer Info for the MBlaze 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 MBlaze backend.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MBlazeELFWriterInfo.h"
15#include "MBlazeRelocations.h"
16#include "llvm/Function.h"
Wesley Peck4b047132010-11-21 22:06:28 +000017#include "llvm/Support/ELF.h"
Wesley Peck4e9141f2010-10-21 03:57:26 +000018#include "llvm/Support/ErrorHandling.h"
19#include "llvm/Target/TargetData.h"
20#include "llvm/Target/TargetMachine.h"
21
22using namespace llvm;
23
24//===----------------------------------------------------------------------===//
25// Implementation of the MBlazeELFWriterInfo class
26//===----------------------------------------------------------------------===//
27
28MBlazeELFWriterInfo::MBlazeELFWriterInfo(TargetMachine &TM)
29 : TargetELFWriterInfo(TM.getTargetData()->getPointerSizeInBits() == 64,
30 TM.getTargetData()->isLittleEndian()) {
31}
32
33MBlazeELFWriterInfo::~MBlazeELFWriterInfo() {}
34
35unsigned MBlazeELFWriterInfo::getRelocationType(unsigned MachineRelTy) const {
Wesley Peck0a67d922010-11-08 19:40:01 +000036 switch (MachineRelTy) {
Wesley Peck4e9141f2010-10-21 03:57:26 +000037 case MBlaze::reloc_pcrel_word:
Wesley Peck4b047132010-11-21 22:06:28 +000038 return ELF::R_MICROBLAZE_64_PCREL;
Wesley Peck4e9141f2010-10-21 03:57:26 +000039 case MBlaze::reloc_absolute_word:
Wesley Peck4b047132010-11-21 22:06:28 +000040 return ELF::R_MICROBLAZE_NONE;
Wesley Peck4e9141f2010-10-21 03:57:26 +000041 default:
42 llvm_unreachable("unknown mblaze machine relocation type");
43 }
44 return 0;
45}
46
47long int MBlazeELFWriterInfo::getDefaultAddendForRelTy(unsigned RelTy,
48 long int Modifier) const {
Wesley Peck0a67d922010-11-08 19:40:01 +000049 switch (RelTy) {
Wesley Peck4b047132010-11-21 22:06:28 +000050 case ELF::R_MICROBLAZE_32_PCREL:
Wesley Peck4e9141f2010-10-21 03:57:26 +000051 return Modifier - 4;
Wesley Peck4b047132010-11-21 22:06:28 +000052 case ELF::R_MICROBLAZE_32:
Wesley Peck4e9141f2010-10-21 03:57:26 +000053 return Modifier;
54 default:
55 llvm_unreachable("unknown mblaze relocation type");
56 }
57 return 0;
58}
59
60unsigned MBlazeELFWriterInfo::getRelocationTySize(unsigned RelTy) const {
61 // FIXME: Most of these sizes are guesses based on the name
Wesley Peck0a67d922010-11-08 19:40:01 +000062 switch (RelTy) {
Wesley Peck4b047132010-11-21 22:06:28 +000063 case ELF::R_MICROBLAZE_32:
64 case ELF::R_MICROBLAZE_32_PCREL:
65 case ELF::R_MICROBLAZE_32_PCREL_LO:
66 case ELF::R_MICROBLAZE_32_LO:
67 case ELF::R_MICROBLAZE_SRO32:
68 case ELF::R_MICROBLAZE_SRW32:
69 case ELF::R_MICROBLAZE_32_SYM_OP_SYM:
70 case ELF::R_MICROBLAZE_GOTOFF_32:
Wesley Peck4e9141f2010-10-21 03:57:26 +000071 return 32;
72
Wesley Peck4b047132010-11-21 22:06:28 +000073 case ELF::R_MICROBLAZE_64_PCREL:
74 case ELF::R_MICROBLAZE_64:
75 case ELF::R_MICROBLAZE_GOTPC_64:
76 case ELF::R_MICROBLAZE_GOT_64:
77 case ELF::R_MICROBLAZE_PLT_64:
78 case ELF::R_MICROBLAZE_GOTOFF_64:
Wesley Peck4e9141f2010-10-21 03:57:26 +000079 return 64;
80 }
81
82 return 0;
83}
84
85bool MBlazeELFWriterInfo::isPCRelativeRel(unsigned RelTy) const {
86 // FIXME: Most of these are guesses based on the name
Wesley Peck0a67d922010-11-08 19:40:01 +000087 switch (RelTy) {
Wesley Peck4b047132010-11-21 22:06:28 +000088 case ELF::R_MICROBLAZE_32_PCREL:
89 case ELF::R_MICROBLAZE_64_PCREL:
90 case ELF::R_MICROBLAZE_32_PCREL_LO:
91 case ELF::R_MICROBLAZE_GOTPC_64:
Wesley Peck4e9141f2010-10-21 03:57:26 +000092 return true;
93 }
94
95 return false;
96}
97
98unsigned MBlazeELFWriterInfo::getAbsoluteLabelMachineRelTy() const {
99 return MBlaze::reloc_absolute_word;
100}
101
102long int MBlazeELFWriterInfo::computeRelocation(unsigned SymOffset,
103 unsigned RelOffset,
104 unsigned RelTy) const {
Wesley Peck4b047132010-11-21 22:06:28 +0000105 if (RelTy == ELF::R_MICROBLAZE_32_PCREL || ELF::R_MICROBLAZE_64_PCREL)
Wesley Peck4e9141f2010-10-21 03:57:26 +0000106 return SymOffset - (RelOffset + 4);
107 else
108 assert("computeRelocation unknown for this relocation type");
109
110 return 0;
111}