X86TargetObjectFile.cpp revision 293d592bf9cff6c3679998dde32f3cfd3cd53bc4
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 *X8664_MachoTargetObjectFile::
22getSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
23                           MachineModuleInfo *MMI, unsigned Encoding) const {
24
25  // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
26  // is an indirect pc-relative reference.
27  if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
28    SmallString<128> Name;
29    Mang->getNameWithPrefix(Name, GV, false);
30    const MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
31    const MCExpr *Res =
32      X86MCTargetExpr::Create(Sym, X86MCTargetExpr::GOTPCREL, getContext());
33    const MCExpr *Four = MCConstantExpr::Create(4, getContext());
34    return MCBinaryExpr::CreateAdd(Res, Four, getContext());
35  }
36
37  return TargetLoweringObjectFileMachO::
38    getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
39}
40
41unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const {
42  if (TM.getRelocationModel() == Reloc::PIC_)
43    return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
44  else
45    return DW_EH_PE_absptr;
46}
47
48unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const {
49  if (TM.getRelocationModel() == Reloc::PIC_)
50    return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
51  else
52    return DW_EH_PE_absptr;
53}
54
55unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const {
56  if (TM.getRelocationModel() == Reloc::PIC_)
57    return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
58  else
59    return DW_EH_PE_absptr;
60}
61
62unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const {
63  if (TM.getRelocationModel() == Reloc::PIC_)
64    return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
65  else
66    return DW_EH_PE_absptr;
67}
68
69unsigned 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);
75
76  if (Model == CodeModel::Small || Model == CodeModel::Medium)
77    return DW_EH_PE_udata4;
78
79  return DW_EH_PE_absptr;
80}
81
82unsigned 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);
87
88  if (Model == CodeModel::Small)
89    return DW_EH_PE_udata4;
90
91  return DW_EH_PE_absptr;
92}
93
94unsigned 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);
100
101  if (Model == CodeModel::Small || Model == CodeModel::Medium)
102    return DW_EH_PE_udata4;
103
104  return DW_EH_PE_absptr;
105}
106
107unsigned 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);
113
114  if (Model == CodeModel::Small)
115    return DW_EH_PE_udata4;
116
117  return DW_EH_PE_absptr;
118}
119