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