blob: be01b5f401aa861e6fcbfd6cbc5c59d00786e67a [file] [log] [blame]
Chris Lattner8c6ed052009-09-16 01:46:41 +00001//===-- llvm/Target/X86/X86TargetObjectFile.cpp - X86 Object Info ---------===//
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
Chris Lattner25ceb5f2010-02-08 22:09:08 +000010#include "X86MCTargetExpr.h"
Anton Korobeynikov9184b252010-02-15 22:35:59 +000011#include "X86TargetObjectFile.h"
12#include "X86TargetMachine.h"
Chris Lattner45111d12010-01-16 21:57:06 +000013#include "llvm/CodeGen/MachineModuleInfoImpls.h"
Chris Lattner228252f2009-09-18 20:22:52 +000014#include "llvm/MC/MCContext.h"
Chris Lattner45111d12010-01-16 21:57:06 +000015#include "llvm/Target/Mangler.h"
16#include "llvm/ADT/SmallString.h"
Anton Korobeynikov9184b252010-02-15 22:35:59 +000017#include "llvm/Support/Dwarf.h"
Chris Lattner8c6ed052009-09-16 01:46:41 +000018using namespace llvm;
Anton Korobeynikov9184b252010-02-15 22:35:59 +000019using namespace dwarf;
Chris Lattner8c6ed052009-09-16 01:46:41 +000020
Chris Lattner228252f2009-09-18 20:22:52 +000021const MCExpr *X8632_MachoTargetObjectFile::
22getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
Anton Korobeynikov9184b252010-02-15 22:35:59 +000023 MachineModuleInfo *MMI, unsigned Encoding) const {
Chris Lattner228252f2009-09-18 20:22:52 +000024 // The mach-o version of this method defaults to returning a stub reference.
Anton Korobeynikov9184b252010-02-15 22:35:59 +000025
26 if (Encoding & DW_EH_PE_indirect) {
27 MachineModuleInfoMachO &MachOMMI =
28 MMI->getObjFileInfo<MachineModuleInfoMachO>();
29
30 SmallString<128> Name;
31 Mang->getNameWithPrefix(Name, GV, true);
32 Name += "$non_lazy_ptr";
33
34 // Add information about the stub reference to MachOMMI so that the stub
35 // gets emitted by the asmprinter.
36 MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
37 MCSymbol *&StubSym = MachOMMI.getGVStubEntry(Sym);
38 if (StubSym == 0) {
39 Name.clear();
40 Mang->getNameWithPrefix(Name, GV, false);
41 StubSym = getContext().GetOrCreateSymbol(Name.str());
42 }
43
44 return TargetLoweringObjectFile::
45 getSymbolForDwarfReference(Sym, MMI,
46 Encoding & ~dwarf::DW_EH_PE_indirect);
Chris Lattner228252f2009-09-18 20:22:52 +000047 }
Anton Korobeynikov9184b252010-02-15 22:35:59 +000048
49 return TargetLoweringObjectFileMachO::
50 getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
Chris Lattner228252f2009-09-18 20:22:52 +000051}
52
Chris Lattner8c6ed052009-09-16 01:46:41 +000053const MCExpr *X8664_MachoTargetObjectFile::
54getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
Anton Korobeynikov9184b252010-02-15 22:35:59 +000055 MachineModuleInfo *MMI, unsigned Encoding) const {
56
Chris Lattner8c6ed052009-09-16 01:46:41 +000057 // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
58 // is an indirect pc-relative reference.
Anton Korobeynikov9184b252010-02-15 22:35:59 +000059 if ((Encoding & DW_EH_PE_indirect) &&
60 (Encoding & DW_EH_PE_pcrel)) {
61 SmallString<128> Name;
62 Mang->getNameWithPrefix(Name, GV, false);
Chris Lattner25ceb5f2010-02-08 22:09:08 +000063 const MCSymbol *Sym = getContext().CreateSymbol(Name);
Chris Lattner8c6ed052009-09-16 01:46:41 +000064 const MCExpr *Res =
Chris Lattner25ceb5f2010-02-08 22:09:08 +000065 X86MCTargetExpr::Create(Sym, X86MCTargetExpr::GOTPCREL, getContext());
Chris Lattner8c6ed052009-09-16 01:46:41 +000066 const MCExpr *Four = MCConstantExpr::Create(4, getContext());
67 return MCBinaryExpr::CreateAdd(Res, Four, getContext());
Anton Korobeynikov9184b252010-02-15 22:35:59 +000068 }
69
70 return TargetLoweringObjectFileMachO::
71 getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
Chris Lattner8c6ed052009-09-16 01:46:41 +000072}
73
Anton Korobeynikov9184b252010-02-15 22:35:59 +000074unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const {
75 if (TM.getRelocationModel() == Reloc::PIC_)
76 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
77 else
78 return DW_EH_PE_absptr;
79}
80
81unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const {
82 if (TM.getRelocationModel() == Reloc::PIC_)
83 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
84 else
85 return DW_EH_PE_absptr;
86}
87
88unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const {
89 if (TM.getRelocationModel() == Reloc::PIC_)
90 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
91 else
92 return DW_EH_PE_absptr;
93}
94
95unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const {
96 if (TM.getRelocationModel() == Reloc::PIC_)
97 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
98 else
99 return DW_EH_PE_absptr;
100}
101
102unsigned X8664_ELFTargetObjectFile::getPersonalityEncoding() const {
103 CodeModel::Model Model = TM.getCodeModel();
104 if (TM.getRelocationModel() == Reloc::PIC_)
105 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small ||
106 Model == CodeModel::Medium ?
107 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
108
109 if (Model == CodeModel::Small || Model == CodeModel::Medium)
110 return DW_EH_PE_udata4;
111
112 return DW_EH_PE_absptr;
113}
114
115unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const {
116 CodeModel::Model Model = TM.getCodeModel();
117 if (TM.getRelocationModel() == Reloc::PIC_)
118 return DW_EH_PE_pcrel | (Model == CodeModel::Small ?
119 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
120
121 if (Model == CodeModel::Small)
122 return DW_EH_PE_udata4;
123
124 return DW_EH_PE_absptr;
125}
126
127unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const {
128 CodeModel::Model Model = TM.getCodeModel();
129 if (TM.getRelocationModel() == Reloc::PIC_)
130 return DW_EH_PE_pcrel | (Model == CodeModel::Small ||
131 Model == CodeModel::Medium ?
132 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
133
134 if (Model == CodeModel::Small || Model == CodeModel::Medium)
135 return DW_EH_PE_udata4;
136
137 return DW_EH_PE_absptr;
138}
139
140unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {
141 CodeModel::Model Model = TM.getCodeModel();
142 if (TM.getRelocationModel() == Reloc::PIC_)
143 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small ||
144 Model == CodeModel::Medium ?
145 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
146
147 if (Model == CodeModel::Small)
148 return DW_EH_PE_udata4;
149
150 return DW_EH_PE_absptr;
151}
152
153unsigned X8632_MachoTargetObjectFile::getPersonalityEncoding() const {
154 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
155}
156
157unsigned X8632_MachoTargetObjectFile::getLSDAEncoding() const {
158 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
159}
160
161unsigned X8632_MachoTargetObjectFile::getFDEEncoding() const {
162 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
163}
164
165unsigned X8632_MachoTargetObjectFile::getTTypeEncoding() const {
166 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
167}
168
169unsigned X8664_MachoTargetObjectFile::getPersonalityEncoding() const {
170 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
171}
172
173unsigned X8664_MachoTargetObjectFile::getLSDAEncoding() const {
174 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
175}
176
177unsigned X8664_MachoTargetObjectFile::getFDEEncoding() const {
178 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
179}
180
181unsigned X8664_MachoTargetObjectFile::getTTypeEncoding() const {
182 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
183}