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