Revert Anton's most recent EH patch (r96637), since it breaks a lot of
[oota-llvm.git] / lib / Target / X86 / X86TargetObjectFile.cpp
1 //===-- 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
10 #include "X86MCTargetExpr.h"
11 #include "X86TargetObjectFile.h"
12 #include "X86TargetMachine.h"
13 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
14 #include "llvm/MC/MCContext.h"
15 #include "llvm/Target/Mangler.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/Support/Dwarf.h"
18 using namespace llvm;
19 using namespace dwarf;
20
21 const MCExpr *X8632_MachoTargetObjectFile::
22 getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
23                              MachineModuleInfo *MMI, unsigned Encoding) const {
24   // The mach-o version of this method defaults to returning a stub reference.
25
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);
47   }
48
49   return TargetLoweringObjectFileMachO::
50     getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
51 }
52
53 const MCExpr *X8664_MachoTargetObjectFile::
54 getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
55                            MachineModuleInfo *MMI, unsigned Encoding) const {
56
57   // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
58   // is an indirect pc-relative reference.
59   if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
60     SmallString<128> Name;
61     Mang->getNameWithPrefix(Name, GV, false);
62     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());
67   }
68
69   return TargetLoweringObjectFileMachO::
70     getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
71 }
72
73 unsigned 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
80 unsigned 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
87 unsigned 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
94 unsigned 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
101 unsigned 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
114 unsigned 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
126 unsigned 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
139 unsigned 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
152 unsigned X8632_MachoTargetObjectFile::getPersonalityEncoding() const {
153   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
154 }
155
156 unsigned X8632_MachoTargetObjectFile::getLSDAEncoding() const {
157   return DW_EH_PE_pcrel;
158 }
159
160 unsigned X8632_MachoTargetObjectFile::getFDEEncoding() const {
161   return DW_EH_PE_pcrel;
162 }
163
164 unsigned X8632_MachoTargetObjectFile::getTTypeEncoding() const {
165   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
166 }
167
168 unsigned X8664_MachoTargetObjectFile::getPersonalityEncoding() const {
169   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
170 }
171
172 unsigned X8664_MachoTargetObjectFile::getLSDAEncoding() const {
173   return DW_EH_PE_pcrel;
174 }
175
176 unsigned X8664_MachoTargetObjectFile::getFDEEncoding() const {
177   return DW_EH_PE_pcrel;
178 }
179
180 unsigned X8664_MachoTargetObjectFile::getTTypeEncoding() const {
181   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
182 }