1 //===-- llvm/Target/X86/X86TargetObjectFile.cpp - X86 Object Info ---------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "X86TargetObjectFile.h"
11 #include "X86TargetMachine.h"
12 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
13 #include "llvm/MC/MCContext.h"
14 #include "llvm/MC/MCExpr.h"
15 #include "llvm/MC/MCSectionMachO.h"
16 #include "llvm/Target/Mangler.h"
17 #include "llvm/ADT/SmallString.h"
18 #include "llvm/Support/Dwarf.h"
20 using namespace dwarf
;
22 const MCExpr
*X8664_MachoTargetObjectFile::
23 getExprForDwarfGlobalReference(const GlobalValue
*GV
, Mangler
*Mang
,
24 MachineModuleInfo
*MMI
, unsigned Encoding
,
25 MCStreamer
&Streamer
) const {
27 // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
28 // is an indirect pc-relative reference.
29 if (Encoding
& (DW_EH_PE_indirect
| DW_EH_PE_pcrel
)) {
30 const MCSymbol
*Sym
= Mang
->getSymbol(GV
);
32 MCSymbolRefExpr::Create(Sym
, MCSymbolRefExpr::VK_GOTPCREL
, getContext());
33 const MCExpr
*Four
= MCConstantExpr::Create(4, getContext());
34 return MCBinaryExpr::CreateAdd(Res
, Four
, getContext());
37 return TargetLoweringObjectFileMachO::
38 getExprForDwarfGlobalReference(GV
, Mang
, MMI
, Encoding
, Streamer
);
41 unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const {
42 if (TM
.getRelocationModel() == Reloc::PIC_
)
43 return DW_EH_PE_indirect
| DW_EH_PE_pcrel
| DW_EH_PE_sdata4
;
45 return DW_EH_PE_absptr
;
48 unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const {
49 if (TM
.getRelocationModel() == Reloc::PIC_
)
50 return DW_EH_PE_pcrel
| DW_EH_PE_sdata4
;
52 return DW_EH_PE_absptr
;
55 unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const {
56 if (TM
.getRelocationModel() == Reloc::PIC_
)
57 return DW_EH_PE_pcrel
| DW_EH_PE_sdata4
;
59 return DW_EH_PE_absptr
;
62 unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const {
63 if (TM
.getRelocationModel() == Reloc::PIC_
)
64 return DW_EH_PE_indirect
| DW_EH_PE_pcrel
| DW_EH_PE_sdata4
;
66 return DW_EH_PE_absptr
;
69 unsigned X8664_ELFTargetObjectFile::getPersonalityEncoding() const {
70 CodeModel::Model Model
= TM
.getCodeModel();
71 if (TM
.getRelocationModel() == Reloc::PIC_
)
72 return DW_EH_PE_indirect
| DW_EH_PE_pcrel
| (Model
== CodeModel::Small
||
73 Model
== CodeModel::Medium
?
74 DW_EH_PE_sdata4
: DW_EH_PE_sdata8
);
76 if (Model
== CodeModel::Small
|| Model
== CodeModel::Medium
)
77 return DW_EH_PE_udata4
;
79 return DW_EH_PE_absptr
;
82 unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const {
83 CodeModel::Model Model
= TM
.getCodeModel();
84 if (TM
.getRelocationModel() == Reloc::PIC_
)
85 return DW_EH_PE_pcrel
| (Model
== CodeModel::Small
?
86 DW_EH_PE_sdata4
: DW_EH_PE_sdata8
);
88 if (Model
== CodeModel::Small
)
89 return DW_EH_PE_udata4
;
91 return DW_EH_PE_absptr
;
94 unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const {
95 CodeModel::Model Model
= TM
.getCodeModel();
96 if (TM
.getRelocationModel() == Reloc::PIC_
)
97 return DW_EH_PE_pcrel
| (Model
== CodeModel::Small
||
98 Model
== CodeModel::Medium
?
99 DW_EH_PE_sdata4
: DW_EH_PE_sdata8
);
101 if (Model
== CodeModel::Small
|| Model
== CodeModel::Medium
)
102 return DW_EH_PE_udata4
;
104 return DW_EH_PE_absptr
;
107 unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const {
108 CodeModel::Model Model
= TM
.getCodeModel();
109 if (TM
.getRelocationModel() == Reloc::PIC_
)
110 return DW_EH_PE_indirect
| DW_EH_PE_pcrel
| (Model
== CodeModel::Small
||
111 Model
== CodeModel::Medium
?
112 DW_EH_PE_sdata4
: DW_EH_PE_sdata8
);
114 if (Model
== CodeModel::Small
)
115 return DW_EH_PE_udata4
;
117 return DW_EH_PE_absptr
;