blob: d1ee3fcbdae7c042d8f93e5545681673b5a30f09 [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 Korobeynikov46885de2010-02-15 22:38:10 +000059 if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
Anton Korobeynikov9184b252010-02-15 22:35:59 +000060 SmallString<128> Name;
61 Mang->getNameWithPrefix(Name, GV, false);
Anton Korobeynikov46885de2010-02-15 22:38:10 +000062 const MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
63 const MCExpr *Res =
64 X86MCTargetExpr::Create(Sym, X86MCTargetExpr::GOTPCREL, getContext());
65 const MCExpr *Four = MCConstantExpr::Create(4, getContext());
66 return MCBinaryExpr::CreateAdd(Res, Four, getContext());
Anton Korobeynikov9184b252010-02-15 22:35:59 +000067 }
68
69 return TargetLoweringObjectFileMachO::
70 getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
Chris Lattner8c6ed052009-09-16 01:46:41 +000071}
72
Anton Korobeynikov9184b252010-02-15 22:35:59 +000073unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const {
74 if (TM.getRelocationModel() == Reloc::PIC_)
75 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
76 else
77 return DW_EH_PE_absptr;
78}
79
80unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const {
81 if (TM.getRelocationModel() == Reloc::PIC_)
82 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
83 else
84 return DW_EH_PE_absptr;
85}
86
87unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const {
88 if (TM.getRelocationModel() == Reloc::PIC_)
89 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
90 else
91 return DW_EH_PE_absptr;
92}
93
94unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const {
95 if (TM.getRelocationModel() == Reloc::PIC_)
96 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
97 else
98 return DW_EH_PE_absptr;
99}
100
101unsigned X8664_ELFTargetObjectFile::getPersonalityEncoding() const {
102 CodeModel::Model Model = TM.getCodeModel();
103 if (TM.getRelocationModel() == Reloc::PIC_)
104 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small ||
105 Model == CodeModel::Medium ?
106 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
107
108 if (Model == CodeModel::Small || Model == CodeModel::Medium)
109 return DW_EH_PE_udata4;
110
111 return DW_EH_PE_absptr;
112}
113
114unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const {
115 CodeModel::Model Model = TM.getCodeModel();
116 if (TM.getRelocationModel() == Reloc::PIC_)
117 return DW_EH_PE_pcrel | (Model == CodeModel::Small ?
118 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
119
120 if (Model == CodeModel::Small)
121 return DW_EH_PE_udata4;
122
123 return DW_EH_PE_absptr;
124}
125
126unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const {
127 CodeModel::Model Model = TM.getCodeModel();
128 if (TM.getRelocationModel() == Reloc::PIC_)
129 return DW_EH_PE_pcrel | (Model == CodeModel::Small ||
130 Model == CodeModel::Medium ?
131 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
132
133 if (Model == CodeModel::Small || Model == CodeModel::Medium)
134 return DW_EH_PE_udata4;
135
136 return DW_EH_PE_absptr;
137}
138
139unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {
140 CodeModel::Model Model = TM.getCodeModel();
141 if (TM.getRelocationModel() == Reloc::PIC_)
142 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small ||
143 Model == CodeModel::Medium ?
144 DW_EH_PE_sdata4 : DW_EH_PE_sdata8);
145
146 if (Model == CodeModel::Small)
147 return DW_EH_PE_udata4;
148
149 return DW_EH_PE_absptr;
150}
151
152unsigned X8632_MachoTargetObjectFile::getPersonalityEncoding() const {
153 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
154}
155
156unsigned X8632_MachoTargetObjectFile::getLSDAEncoding() const {
157 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
158}
159
160unsigned X8632_MachoTargetObjectFile::getFDEEncoding() const {
161 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
162}
163
164unsigned X8632_MachoTargetObjectFile::getTTypeEncoding() const {
165 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
166}
167
168unsigned X8664_MachoTargetObjectFile::getPersonalityEncoding() const {
169 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
170}
171
172unsigned X8664_MachoTargetObjectFile::getLSDAEncoding() const {
173 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
174}
175
176unsigned X8664_MachoTargetObjectFile::getFDEEncoding() const {
177 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
178}
179
180unsigned X8664_MachoTargetObjectFile::getTTypeEncoding() const {
181 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
182}