15ca98fd9SDimitry Andric //===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
25ca98fd9SDimitry Andric //
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
65ca98fd9SDimitry Andric //
75ca98fd9SDimitry Andric //===----------------------------------------------------------------------===//
85ca98fd9SDimitry Andric
95ca98fd9SDimitry Andric #include "SparcTargetObjectFile.h"
105ca98fd9SDimitry Andric #include "MCTargetDesc/SparcMCExpr.h"
117ab83427SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
125ca98fd9SDimitry Andric #include "llvm/CodeGen/MachineModuleInfoImpls.h"
13044eb2f6SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
14cfca06d7SDimitry Andric #include "llvm/Target/TargetMachine.h"
155ca98fd9SDimitry Andric
165ca98fd9SDimitry Andric using namespace llvm;
175ca98fd9SDimitry Andric
Initialize(MCContext & Ctx,const TargetMachine & TM)1808bbd35aSDimitry Andric void SparcELFTargetObjectFile::Initialize(MCContext &Ctx,
1908bbd35aSDimitry Andric const TargetMachine &TM) {
2008bbd35aSDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
2108bbd35aSDimitry Andric }
2208bbd35aSDimitry Andric
getTTypeGlobalReference(const GlobalValue * GV,unsigned Encoding,const TargetMachine & TM,MachineModuleInfo * MMI,MCStreamer & Streamer) const235ca98fd9SDimitry Andric const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
24b915e9e0SDimitry Andric const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
25b915e9e0SDimitry Andric MachineModuleInfo *MMI, MCStreamer &Streamer) const {
265ca98fd9SDimitry Andric
275ca98fd9SDimitry Andric if (Encoding & dwarf::DW_EH_PE_pcrel) {
285ca98fd9SDimitry Andric MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
295ca98fd9SDimitry Andric
30b915e9e0SDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM);
315ca98fd9SDimitry Andric
325ca98fd9SDimitry Andric // Add information about the stub reference to ELFMMI so that the stub
335ca98fd9SDimitry Andric // gets emitted by the asmprinter.
345ca98fd9SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
355ca98fd9SDimitry Andric if (!StubSym.getPointer()) {
36b915e9e0SDimitry Andric MCSymbol *Sym = TM.getSymbol(GV);
375ca98fd9SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
385ca98fd9SDimitry Andric }
395ca98fd9SDimitry Andric
405ca98fd9SDimitry Andric MCContext &Ctx = getContext();
4185d8b2bbSDimitry Andric return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32,
4285d8b2bbSDimitry Andric MCSymbolRefExpr::create(SSym, Ctx), Ctx);
435ca98fd9SDimitry Andric }
445ca98fd9SDimitry Andric
45b915e9e0SDimitry Andric return TargetLoweringObjectFileELF::getTTypeGlobalReference(GV, Encoding, TM,
46b915e9e0SDimitry Andric MMI, Streamer);
475ca98fd9SDimitry Andric }
48