diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index bdcb7216a56..d3c42be5e6c 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -24,7 +24,9 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/Mangler.h" #include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" @@ -1426,3 +1428,30 @@ bool TargetLoweringBase::isLegalAddressingMode(const AddrMode &AM, return true; } + +void TargetLoweringBase::getNameWithPrefix(SmallVectorImpl<char> &Name, + const GlobalValue *GV, + Mangler &Mang, + bool MayAlwaysUsePrivate) const { + if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) { + // Simple case: If GV is not private, it is not important to find out if + // private labels are legal in this case or not. + Mang.getNameWithPrefix(Name, GV, false); + return; + } + SectionKind GVKind = + TargetLoweringObjectFile::getKindForGlobal(GV, getTargetMachine()); + const TargetLoweringObjectFile &TLOF = getObjFileLowering(); + const MCSection *TheSection = + TLOF.SectionForGlobal(GV, GVKind, Mang, getTargetMachine()); + bool CannotUsePrivateLabel = TLOF.isSectionAtomizableBySymbols(*TheSection); + Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel); +} + +MCSymbol *TargetLoweringBase::getSymbol(const GlobalValue *GV, + Mangler &Mang) const { + SmallString<60> NameStr; + getNameWithPrefix(NameStr, GV, Mang); + const TargetLoweringObjectFile &TLOF = getObjFileLowering(); + return TLOF.getContext().GetOrCreateSymbol(NameStr.str()); +} |