SparcTargetObjectFile.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "SparcTargetObjectFile.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "MCTargetDesc/SparcMCExpr.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "llvm/CodeGen/MachineModuleInfoImpls.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "llvm/Support/Dwarf.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Target/TargetLowering.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace llvm;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TargetMachine &TM, MachineModuleInfo *MMI,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCStreamer &Streamer) const {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Encoding & dwarf::DW_EH_PE_pcrel) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang, TM);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add information about the stub reference to ELFMMI so that the stub
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // gets emitted by the asmprinter.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!StubSym.getPointer()) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MCSymbol *Sym = TM.getSymbol(GV, Mang);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MCContext &Ctx = getContext();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               MCSymbolRefExpr::Create(SSym, Ctx), Ctx);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TargetLoweringObjectFileELF::getTTypeGlobalReference(
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GV, Encoding, Mang, TM, MMI, Streamer);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)