1234353Sdim//===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===// 2198090Srdivacky// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6198090Srdivacky// 7198090Srdivacky//===----------------------------------------------------------------------===// 8198090Srdivacky 9198090Srdivacky#include "X86TargetObjectFile.h" 10276479Sdim#include "llvm/ADT/StringExtras.h" 11321369Sdim#include "llvm/BinaryFormat/COFF.h" 12321369Sdim#include "llvm/BinaryFormat/Dwarf.h" 13327952Sdim#include "llvm/CodeGen/TargetLowering.h" 14276479Sdim#include "llvm/IR/Mangler.h" 15276479Sdim#include "llvm/IR/Operator.h" 16198090Srdivacky#include "llvm/MC/MCContext.h" 17205218Srdivacky#include "llvm/MC/MCExpr.h" 18276479Sdim#include "llvm/MC/MCSectionCOFF.h" 19239462Sdim#include "llvm/MC/MCSectionELF.h" 20288943Sdim#include "llvm/MC/MCValue.h" 21249423Sdim 22198090Srdivackyusing namespace llvm; 23203954Srdivackyusing namespace dwarf; 24198090Srdivacky 25276479Sdimconst MCExpr *X86_64MachoTargetObjectFile::getTTypeGlobalReference( 26314564Sdim const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, 27314564Sdim MachineModuleInfo *MMI, MCStreamer &Streamer) const { 28203954Srdivacky 29198090Srdivacky // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which 30198090Srdivacky // is an indirect pc-relative reference. 31276479Sdim if ((Encoding & DW_EH_PE_indirect) && (Encoding & DW_EH_PE_pcrel)) { 32314564Sdim const MCSymbol *Sym = TM.getSymbol(GV); 33203954Srdivacky const MCExpr *Res = 34288943Sdim MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext()); 35288943Sdim const MCExpr *Four = MCConstantExpr::create(4, getContext()); 36288943Sdim return MCBinaryExpr::createAdd(Res, Four, getContext()); 37203954Srdivacky } 38203954Srdivacky 39276479Sdim return TargetLoweringObjectFileMachO::getTTypeGlobalReference( 40314564Sdim GV, Encoding, TM, MMI, Streamer); 41198090Srdivacky} 42198090Srdivacky 43276479SdimMCSymbol *X86_64MachoTargetObjectFile::getCFIPersonalitySymbol( 44314564Sdim const GlobalValue *GV, const TargetMachine &TM, 45276479Sdim MachineModuleInfo *MMI) const { 46314564Sdim return TM.getSymbol(GV); 47221345Sdim} 48239462Sdim 49288943Sdimconst MCExpr *X86_64MachoTargetObjectFile::getIndirectSymViaGOTPCRel( 50360784Sdim const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, 51360784Sdim int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const { 52288943Sdim // On Darwin/X86-64, we need to use foo@GOTPCREL+4 to access the got entry 53288943Sdim // from a data section. In case there's an additional offset, then use 54288943Sdim // foo@GOTPCREL+4+<offset>. 55288943Sdim unsigned FinalOff = Offset+MV.getConstant()+4; 56288943Sdim const MCExpr *Res = 57288943Sdim MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext()); 58288943Sdim const MCExpr *Off = MCConstantExpr::create(FinalOff, getContext()); 59288943Sdim return MCBinaryExpr::createAdd(Res, Off, getContext()); 60288943Sdim} 61288943Sdim 62288943Sdimconst MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol( 63288943Sdim const MCSymbol *Sym) const { 64288943Sdim return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext()); 65288943Sdim} 66288943Sdim 67239462Sdimvoid 68314564SdimX86FreeBSDTargetObjectFile::Initialize(MCContext &Ctx, 69314564Sdim const TargetMachine &TM) { 70314564Sdim TargetLoweringObjectFileELF::Initialize(Ctx, TM); 71314564Sdim InitializeELF(TM.Options.UseInitArray); 72314564Sdim} 73314564Sdim 74314564Sdimvoid 75314564SdimX86FuchsiaTargetObjectFile::Initialize(MCContext &Ctx, 76314564Sdim const TargetMachine &TM) { 77314564Sdim TargetLoweringObjectFileELF::Initialize(Ctx, TM); 78314564Sdim InitializeELF(TM.Options.UseInitArray); 79314564Sdim} 80314564Sdim 81314564Sdimvoid 82288943SdimX86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx, 83288943Sdim const TargetMachine &TM) { 84239462Sdim TargetLoweringObjectFileELF::Initialize(Ctx, TM); 85239462Sdim InitializeELF(TM.Options.UseInitArray); 86239462Sdim} 87261991Sdim 88321369Sdimvoid X86SolarisTargetObjectFile::Initialize(MCContext &Ctx, 89321369Sdim const TargetMachine &TM) { 90321369Sdim TargetLoweringObjectFileELF::Initialize(Ctx, TM); 91321369Sdim InitializeELF(TM.Options.UseInitArray); 92321369Sdim} 93