xref: /src/contrib/llvm-project/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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