1262261Sdim//===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
2262261Sdim//
3262261Sdim//                     The LLVM Compiler Infrastructure
4262261Sdim//
5262261Sdim// This file is distributed under the University of Illinois Open Source
6262261Sdim// License. See LICENSE.TXT for details.
7262261Sdim//
8262261Sdim//===----------------------------------------------------------------------===//
9262261Sdim
10262261Sdim#include "SparcTargetObjectFile.h"
11262261Sdim#include "MCTargetDesc/SparcMCExpr.h"
12262261Sdim#include "llvm/CodeGen/MachineModuleInfoImpls.h"
13262261Sdim#include "llvm/Support/Dwarf.h"
14262261Sdim#include "llvm/Target/Mangler.h"
15262261Sdim
16262261Sdimusing namespace llvm;
17262261Sdim
18262261Sdim
19262261Sdimconst MCExpr *SparcELFTargetObjectFile::
20262261SdimgetTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
21262261Sdim                        MachineModuleInfo *MMI, unsigned Encoding,
22262261Sdim                        MCStreamer &Streamer) const {
23262261Sdim
24262261Sdim  if (Encoding & dwarf::DW_EH_PE_pcrel) {
25262261Sdim    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
26262261Sdim
27262261Sdim    //MCSymbol *SSym = getSymbolWithGlobalValueBase(*Mang, GV, ".DW.stub");
28262261Sdim    SmallString<60> NameStr;
29262261Sdim    Mang->getNameWithPrefix(NameStr, GV, true);
30262261Sdim    NameStr.append(".DW.stub");
31262261Sdim    MCSymbol *SSym = getContext().GetOrCreateSymbol(NameStr.str());
32262261Sdim
33262261Sdim    // Add information about the stub reference to ELFMMI so that the stub
34262261Sdim    // gets emitted by the asmprinter.
35262261Sdim    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
36262261Sdim    if (StubSym.getPointer() == 0) {
37262261Sdim      MCSymbol *Sym = getSymbol(*Mang, GV);
38262261Sdim      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
39262261Sdim    }
40262261Sdim
41262261Sdim    MCContext &Ctx = getContext();
42262261Sdim    return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
43262261Sdim                               MCSymbolRefExpr::Create(SSym, Ctx), Ctx);
44262261Sdim  }
45262261Sdim
46262261Sdim  return TargetLoweringObjectFileELF::
47262261Sdim    getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
48262261Sdim}
49