1*48173d35SDimitry Andric //===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
2*48173d35SDimitry Andric //
3*48173d35SDimitry Andric // The LLVM Compiler Infrastructure
4*48173d35SDimitry Andric //
5*48173d35SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*48173d35SDimitry Andric // License. See LICENSE.TXT for details.
7*48173d35SDimitry Andric //
8*48173d35SDimitry Andric //===----------------------------------------------------------------------===//
9*48173d35SDimitry Andric
10*48173d35SDimitry Andric #include "SparcTargetObjectFile.h"
11*48173d35SDimitry Andric #include "MCTargetDesc/SparcMCExpr.h"
12*48173d35SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
13*48173d35SDimitry Andric #include "llvm/CodeGen/MachineModuleInfoImpls.h"
14*48173d35SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
15*48173d35SDimitry Andric
16*48173d35SDimitry Andric using namespace llvm;
17*48173d35SDimitry Andric
Initialize(MCContext & Ctx,const TargetMachine & TM)18*48173d35SDimitry Andric void SparcELFTargetObjectFile::Initialize(MCContext &Ctx,
19*48173d35SDimitry Andric const TargetMachine &TM) {
20*48173d35SDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
21*48173d35SDimitry Andric InitializeELF(TM.Options.UseInitArray);
22*48173d35SDimitry Andric }
23*48173d35SDimitry Andric
getTTypeGlobalReference(const GlobalValue * GV,unsigned Encoding,const TargetMachine & TM,MachineModuleInfo * MMI,MCStreamer & Streamer) const24*48173d35SDimitry Andric const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
25*48173d35SDimitry Andric const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
26*48173d35SDimitry Andric MachineModuleInfo *MMI, MCStreamer &Streamer) const {
27*48173d35SDimitry Andric
28*48173d35SDimitry Andric if (Encoding & dwarf::DW_EH_PE_pcrel) {
29*48173d35SDimitry Andric MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
30*48173d35SDimitry Andric
31*48173d35SDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM);
32*48173d35SDimitry Andric
33*48173d35SDimitry Andric // Add information about the stub reference to ELFMMI so that the stub
34*48173d35SDimitry Andric // gets emitted by the asmprinter.
35*48173d35SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
36*48173d35SDimitry Andric if (!StubSym.getPointer()) {
37*48173d35SDimitry Andric MCSymbol *Sym = TM.getSymbol(GV);
38*48173d35SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
39*48173d35SDimitry Andric }
40*48173d35SDimitry Andric
41*48173d35SDimitry Andric MCContext &Ctx = getContext();
42*48173d35SDimitry Andric return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32,
43*48173d35SDimitry Andric MCSymbolRefExpr::create(SSym, Ctx), Ctx);
44*48173d35SDimitry Andric }
45*48173d35SDimitry Andric
46*48173d35SDimitry Andric return TargetLoweringObjectFileELF::getTTypeGlobalReference(GV, Encoding, TM,
47*48173d35SDimitry Andric MMI, Streamer);
48*48173d35SDimitry Andric }
49