X86TargetObjectFile.cpp revision 9184b25fa543a900463215c11635c2c014ddb623
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"
18using namespace llvm;
19using namespace dwarf;
20
21const MCExpr *X8632_MachoTargetObjectFile::
22getSymbolForDwarfGlobalReference(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
53const MCExpr *X8664_MachoTargetObjectFile::
54getSymbolForDwarfGlobalReference(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
74unsigned 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}
184