1fd5c1f94SVenkatraman Govindaraju //===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
2fd5c1f94SVenkatraman Govindaraju //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fd5c1f94SVenkatraman Govindaraju //
7fd5c1f94SVenkatraman Govindaraju //===----------------------------------------------------------------------===//
8fd5c1f94SVenkatraman Govindaraju 
9fd5c1f94SVenkatraman Govindaraju #include "SparcTargetObjectFile.h"
10fd5c1f94SVenkatraman Govindaraju #include "MCTargetDesc/SparcMCExpr.h"
11264b5d9eSZachary Turner #include "llvm/BinaryFormat/Dwarf.h"
12fd5c1f94SVenkatraman Govindaraju #include "llvm/CodeGen/MachineModuleInfoImpls.h"
13b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetLowering.h"
14*fe0006c8SSimon Pilgrim #include "llvm/Target/TargetMachine.h"
15fd5c1f94SVenkatraman Govindaraju 
16fd5c1f94SVenkatraman Govindaraju using namespace llvm;
17fd5c1f94SVenkatraman Govindaraju 
Initialize(MCContext & Ctx,const TargetMachine & TM)189b8e3d30SDavide Italiano void SparcELFTargetObjectFile::Initialize(MCContext &Ctx,
199b8e3d30SDavide Italiano                                           const TargetMachine &TM) {
209b8e3d30SDavide Italiano   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
219b8e3d30SDavide Italiano }
229b8e3d30SDavide Italiano 
getTTypeGlobalReference(const GlobalValue * GV,unsigned Encoding,const TargetMachine & TM,MachineModuleInfo * MMI,MCStreamer & Streamer) const2315b26696SRafael Espindola const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
244367c7fbSEric Christopher     const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
254367c7fbSEric Christopher     MachineModuleInfo *MMI, MCStreamer &Streamer) const {
26fd5c1f94SVenkatraman Govindaraju 
27fd5c1f94SVenkatraman Govindaraju   if (Encoding & dwarf::DW_EH_PE_pcrel) {
28fd5c1f94SVenkatraman Govindaraju     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
29fd5c1f94SVenkatraman Govindaraju 
304367c7fbSEric Christopher     MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM);
31fd5c1f94SVenkatraman Govindaraju 
32fd5c1f94SVenkatraman Govindaraju     // Add information about the stub reference to ELFMMI so that the stub
33fd5c1f94SVenkatraman Govindaraju     // gets emitted by the asmprinter.
34fd5c1f94SVenkatraman Govindaraju     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
35062a2baeSCraig Topper     if (!StubSym.getPointer()) {
36b64fb453STim Northover       MCSymbol *Sym = TM.getSymbol(GV);
37fd5c1f94SVenkatraman Govindaraju       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
38fd5c1f94SVenkatraman Govindaraju     }
39fd5c1f94SVenkatraman Govindaraju 
40fd5c1f94SVenkatraman Govindaraju     MCContext &Ctx = getContext();
4113760bd1SJim Grosbach     return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32,
4213760bd1SJim Grosbach                                MCSymbolRefExpr::create(SSym, Ctx), Ctx);
43fd5c1f94SVenkatraman Govindaraju   }
44fd5c1f94SVenkatraman Govindaraju 
454367c7fbSEric Christopher   return TargetLoweringObjectFileELF::getTTypeGlobalReference(GV, Encoding, TM,
464367c7fbSEric Christopher                                                               MMI, Streamer);
47fd5c1f94SVenkatraman Govindaraju }
48