xref: /src/contrib/llvm-project/llvm/lib/Target/X86/X86TargetObjectFile.cpp (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
163faed5bSDimitry Andric //===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===//
259850d08SRoman Divacky //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
659850d08SRoman Divacky //
759850d08SRoman Divacky //===----------------------------------------------------------------------===//
859850d08SRoman Divacky 
959850d08SRoman Divacky #include "X86TargetObjectFile.h"
107ab83427SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
11c6910277SRoman Divacky #include "llvm/MC/MCExpr.h"
125a5ac124SDimitry Andric #include "llvm/MC/MCValue.h"
13cfca06d7SDimitry Andric #include "llvm/Target/TargetMachine.h"
144a16efa3SDimitry Andric 
1559850d08SRoman Divacky using namespace llvm;
166fe5c7aaSRoman Divacky using namespace dwarf;
1759850d08SRoman Divacky 
getTTypeGlobalReference(const GlobalValue * GV,unsigned Encoding,const TargetMachine & TM,MachineModuleInfo * MMI,MCStreamer & Streamer) const185ca98fd9SDimitry Andric const MCExpr *X86_64MachoTargetObjectFile::getTTypeGlobalReference(
19b915e9e0SDimitry Andric     const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
20b915e9e0SDimitry Andric     MachineModuleInfo *MMI, MCStreamer &Streamer) const {
2159850d08SRoman Divacky 
2259850d08SRoman Divacky   // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
2359850d08SRoman Divacky   // is an indirect pc-relative reference.
245ca98fd9SDimitry Andric   if ((Encoding & DW_EH_PE_indirect) && (Encoding & DW_EH_PE_pcrel)) {
25b915e9e0SDimitry Andric     const MCSymbol *Sym = TM.getSymbol(GV);
2659850d08SRoman Divacky     const MCExpr *Res =
2785d8b2bbSDimitry Andric       MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
2885d8b2bbSDimitry Andric     const MCExpr *Four = MCConstantExpr::create(4, getContext());
2985d8b2bbSDimitry Andric     return MCBinaryExpr::createAdd(Res, Four, getContext());
3059850d08SRoman Divacky   }
3159850d08SRoman Divacky 
325ca98fd9SDimitry Andric   return TargetLoweringObjectFileMachO::getTTypeGlobalReference(
33b915e9e0SDimitry Andric       GV, Encoding, TM, MMI, Streamer);
346fe5c7aaSRoman Divacky }
356fe5c7aaSRoman Divacky 
getCFIPersonalitySymbol(const GlobalValue * GV,const TargetMachine & TM,MachineModuleInfo * MMI) const365ca98fd9SDimitry Andric MCSymbol *X86_64MachoTargetObjectFile::getCFIPersonalitySymbol(
37b915e9e0SDimitry Andric     const GlobalValue *GV, const TargetMachine &TM,
386b943ff3SDimitry Andric     MachineModuleInfo *MMI) const {
39b915e9e0SDimitry Andric   return TM.getSymbol(GV);
406b943ff3SDimitry Andric }
4158b69754SDimitry Andric 
getIndirectSymViaGOTPCRel(const GlobalValue * GV,const MCSymbol * Sym,const MCValue & MV,int64_t Offset,MachineModuleInfo * MMI,MCStreamer & Streamer) const425a5ac124SDimitry Andric const MCExpr *X86_64MachoTargetObjectFile::getIndirectSymViaGOTPCRel(
431d5ae102SDimitry Andric     const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
441d5ae102SDimitry Andric     int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
455a5ac124SDimitry Andric   // On Darwin/X86-64, we need to use foo@GOTPCREL+4 to access the got entry
465a5ac124SDimitry Andric   // from a data section. In case there's an additional offset, then use
475a5ac124SDimitry Andric   // foo@GOTPCREL+4+<offset>.
485a5ac124SDimitry Andric   unsigned FinalOff = Offset+MV.getConstant()+4;
495a5ac124SDimitry Andric   const MCExpr *Res =
5085d8b2bbSDimitry Andric     MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
5185d8b2bbSDimitry Andric   const MCExpr *Off = MCConstantExpr::create(FinalOff, getContext());
5285d8b2bbSDimitry Andric   return MCBinaryExpr::createAdd(Res, Off, getContext());
5358b69754SDimitry Andric }
54f8af5cf6SDimitry Andric 
getDebugThreadLocalSymbol(const MCSymbol * Sym) const555a5ac124SDimitry Andric const MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(
56f8af5cf6SDimitry Andric     const MCSymbol *Sym) const {
5785d8b2bbSDimitry Andric   return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
58f8af5cf6SDimitry Andric }
59b1c73532SDimitry Andric 
getIndirectSymViaGOTPCRel(const GlobalValue * GV,const MCSymbol * Sym,const MCValue & MV,int64_t Offset,MachineModuleInfo * MMI,MCStreamer & Streamer) const604df029ccSDimitry Andric const MCExpr *X86_64ELFTargetObjectFile::getIndirectSymViaGOTPCRel(
61b1c73532SDimitry Andric     const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
62b1c73532SDimitry Andric     int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
63b1c73532SDimitry Andric   int64_t FinalOffset = Offset + MV.getConstant();
64b1c73532SDimitry Andric   const MCExpr *Res =
65b1c73532SDimitry Andric       MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
66b1c73532SDimitry Andric   const MCExpr *Off = MCConstantExpr::create(FinalOffset, getContext());
67b1c73532SDimitry Andric   return MCBinaryExpr::createAdd(Res, Off, getContext());
68b1c73532SDimitry Andric }
69