1fd5c1f94SVenkatraman Govindaraju //===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===// 2fd5c1f94SVenkatraman Govindaraju // 3fd5c1f94SVenkatraman Govindaraju // The LLVM Compiler Infrastructure 4fd5c1f94SVenkatraman Govindaraju // 5fd5c1f94SVenkatraman Govindaraju // This file is distributed under the University of Illinois Open Source 6fd5c1f94SVenkatraman Govindaraju // License. See LICENSE.TXT for details. 7fd5c1f94SVenkatraman Govindaraju // 8fd5c1f94SVenkatraman Govindaraju //===----------------------------------------------------------------------===// 9fd5c1f94SVenkatraman Govindaraju 10fd5c1f94SVenkatraman Govindaraju #include "SparcTargetObjectFile.h" 11fd5c1f94SVenkatraman Govindaraju #include "MCTargetDesc/SparcMCExpr.h" 12264b5d9eSZachary Turner #include "llvm/BinaryFormat/Dwarf.h" 13fd5c1f94SVenkatraman Govindaraju #include "llvm/CodeGen/MachineModuleInfoImpls.h" 14*b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetLowering.h" 15fd5c1f94SVenkatraman Govindaraju 16fd5c1f94SVenkatraman Govindaraju using namespace llvm; 17fd5c1f94SVenkatraman Govindaraju 189b8e3d30SDavide Italiano void SparcELFTargetObjectFile::Initialize(MCContext &Ctx, 199b8e3d30SDavide Italiano const TargetMachine &TM) { 209b8e3d30SDavide Italiano TargetLoweringObjectFileELF::Initialize(Ctx, TM); 219b8e3d30SDavide Italiano InitializeELF(TM.Options.UseInitArray); 229b8e3d30SDavide Italiano } 239b8e3d30SDavide Italiano 2415b26696SRafael Espindola const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference( 254367c7fbSEric Christopher const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, 264367c7fbSEric Christopher MachineModuleInfo *MMI, MCStreamer &Streamer) const { 27fd5c1f94SVenkatraman Govindaraju 28fd5c1f94SVenkatraman Govindaraju if (Encoding & dwarf::DW_EH_PE_pcrel) { 29fd5c1f94SVenkatraman Govindaraju MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 30fd5c1f94SVenkatraman Govindaraju 314367c7fbSEric Christopher MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM); 32fd5c1f94SVenkatraman Govindaraju 33fd5c1f94SVenkatraman Govindaraju // Add information about the stub reference to ELFMMI so that the stub 34fd5c1f94SVenkatraman Govindaraju // gets emitted by the asmprinter. 35fd5c1f94SVenkatraman Govindaraju MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 36062a2baeSCraig Topper if (!StubSym.getPointer()) { 37b64fb453STim Northover MCSymbol *Sym = TM.getSymbol(GV); 38fd5c1f94SVenkatraman Govindaraju StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 39fd5c1f94SVenkatraman Govindaraju } 40fd5c1f94SVenkatraman Govindaraju 41fd5c1f94SVenkatraman Govindaraju MCContext &Ctx = getContext(); 4213760bd1SJim Grosbach return SparcMCExpr::create(SparcMCExpr::VK_Sparc_R_DISP32, 4313760bd1SJim Grosbach MCSymbolRefExpr::create(SSym, Ctx), Ctx); 44fd5c1f94SVenkatraman Govindaraju } 45fd5c1f94SVenkatraman Govindaraju 464367c7fbSEric Christopher return TargetLoweringObjectFileELF::getTTypeGlobalReference(GV, Encoding, TM, 474367c7fbSEric Christopher MMI, Streamer); 48fd5c1f94SVenkatraman Govindaraju } 49