Preliminary patch to improve dwarf EH generation - Hooks to return Personality /...
[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) &&
60       (Encoding & DW_EH_PE_pcrel)) {
61     SmallString<128> Name;
62     Mang->getNameWithPrefix(Name, GV, false);
63   const MCSymbol *Sym = getContext().CreateSymbol(Name);
64   const MCExpr *Res =
65     X86MCTargetExpr::Create(Sym, X86MCTargetExpr::GOTPCREL, getContext());
66   const MCExpr *Four = MCConstantExpr::Create(4, getContext());
67   return MCBinaryExpr::CreateAdd(Res, Four, getContext());
68   }
69
70   return TargetLoweringObjectFileMachO::
71     getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
72 }
73
74 unsigned 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
81 unsigned 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
88 unsigned 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
95 unsigned 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
102 unsigned 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
115 unsigned 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
127 unsigned 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
140 unsigned 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
153 unsigned X8632_MachoTargetObjectFile::getPersonalityEncoding() const {
154   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
155 }
156
157 unsigned X8632_MachoTargetObjectFile::getLSDAEncoding() const {
158   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
159 }
160
161 unsigned X8632_MachoTargetObjectFile::getFDEEncoding() const {
162   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
163 }
164
165 unsigned X8632_MachoTargetObjectFile::getTTypeEncoding() const {
166   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
167 }
168
169 unsigned X8664_MachoTargetObjectFile::getPersonalityEncoding() const {
170   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
171 }
172
173 unsigned X8664_MachoTargetObjectFile::getLSDAEncoding() const {
174   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
175 }
176
177 unsigned X8664_MachoTargetObjectFile::getFDEEncoding() const {
178   return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
179 }
180
181 unsigned X8664_MachoTargetObjectFile::getTTypeEncoding() const {
182   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
183 }