xref: /llvm-project/llvm/lib/Target/X86/X86TargetObjectFile.cpp (revision 9baeb02000660bd570c9f3aaef21380a2489464c)
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