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 "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" 19 using namespace llvm; 20 using namespace dwarf; 21 22 const MCExpr *X8664_MachoTargetObjectFile:: 23 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 24 MachineModuleInfo *MMI, unsigned Encoding, 25 MCStreamer &Streamer) const { 26 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); 31 const MCExpr *Res = 32 MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext()); 33 const MCExpr *Four = MCConstantExpr::Create(4, getContext()); 34 return MCBinaryExpr::CreateAdd(Res, Four, getContext()); 35 } 36 37 return TargetLoweringObjectFileMachO:: 38 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 39 } 40 41 MCSymbol *X8664_MachoTargetObjectFile:: 42 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 43 MachineModuleInfo *MMI) const { 44 return Mang->getSymbol(GV); 45 } 46 47 unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const { 48 if (TM.getRelocationModel() == Reloc::PIC_) 49 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 50 else 51 return DW_EH_PE_absptr; 52 } 53 54 unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const { 55 if (TM.getRelocationModel() == Reloc::PIC_) 56 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 57 else 58 return DW_EH_PE_absptr; 59 } 60 61 unsigned X8632_ELFTargetObjectFile::getFDEEncoding(bool FDE) const { 62 if (TM.getRelocationModel() == Reloc::PIC_) 63 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 64 else 65 return DW_EH_PE_absptr; 66 } 67 68 unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const { 69 if (TM.getRelocationModel() == Reloc::PIC_) 70 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 71 else 72 return DW_EH_PE_absptr; 73 } 74 75 unsigned X8664_ELFTargetObjectFile::getPersonalityEncoding() const { 76 CodeModel::Model Model = TM.getCodeModel(); 77 if (TM.getRelocationModel() == Reloc::PIC_) 78 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small || 79 Model == CodeModel::Medium ? 80 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 81 82 if (Model == CodeModel::Small || Model == CodeModel::Medium) 83 return DW_EH_PE_udata4; 84 85 return DW_EH_PE_absptr; 86 } 87 88 unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const { 89 CodeModel::Model Model = TM.getCodeModel(); 90 if (TM.getRelocationModel() == Reloc::PIC_) 91 return DW_EH_PE_pcrel | (Model == CodeModel::Small ? 92 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 93 94 if (Model == CodeModel::Small) 95 return DW_EH_PE_udata4; 96 97 return DW_EH_PE_absptr; 98 } 99 100 unsigned X8664_ELFTargetObjectFile::getFDEEncoding(bool CFI) const { 101 if (CFI) 102 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 103 104 if (TM.getRelocationModel() == Reloc::PIC_) 105 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 106 107 return DW_EH_PE_udata4; 108 } 109 110 unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const { 111 CodeModel::Model Model = TM.getCodeModel(); 112 if (TM.getRelocationModel() == Reloc::PIC_) 113 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small || 114 Model == CodeModel::Medium ? 115 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 116 117 if (Model == CodeModel::Small) 118 return DW_EH_PE_udata4; 119 120 return DW_EH_PE_absptr; 121 } 122