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