IR: Give function GlobalValue::getRealLinkageName() a less misleading name: dropLLVMManglingEscape().
This function gives the wrong answer on some non-ELF platforms in some cases. The function that does the right thing lives in Mangler.h. To try to discourage people from using this function, give it a different name. Differential Revision: https://reviews.llvm.org/D33162 llvm-svn: 303134
This commit is contained in:
parent
515d1a6804
commit
6f0ecca3b5
|
@ -441,10 +441,14 @@ protected:
|
|||
void copyAttributesFrom(const GlobalValue *Src);
|
||||
|
||||
public:
|
||||
/// If special LLVM prefix that is used to inform the asm printer to not emit
|
||||
/// usual symbol prefix before the symbol name is used then return linkage
|
||||
/// name after skipping this special LLVM prefix.
|
||||
static StringRef getRealLinkageName(StringRef Name) {
|
||||
/// If the given string begins with the GlobalValue name mangling escape
|
||||
/// character '\1', drop it.
|
||||
///
|
||||
/// This function applies a specific mangling that is used in PGO profiles,
|
||||
/// among other things. If you're trying to get a symbol name for an
|
||||
/// arbitrary GlobalValue, this is not the function you're looking for; see
|
||||
/// Mangler.h.
|
||||
static StringRef dropLLVMManglingEscape(StringRef Name) {
|
||||
if (!Name.empty() && Name[0] == '\1')
|
||||
return Name.substr(1);
|
||||
return Name;
|
||||
|
|
|
@ -101,7 +101,7 @@ void MappingTraits<DiagnosticInfoOptimizationBase *>::mapping(
|
|||
// These are read-only for now.
|
||||
DiagnosticLocation DL = OptDiag->getLocation();
|
||||
StringRef FN =
|
||||
GlobalValue::getRealLinkageName(OptDiag->getFunction().getName());
|
||||
GlobalValue::dropLLVMManglingEscape(OptDiag->getFunction().getName());
|
||||
|
||||
StringRef PassName(OptDiag->PassName);
|
||||
io.mapRequired("Pass", PassName);
|
||||
|
|
|
@ -540,7 +540,7 @@ static StringRef sanitizeFunctionName(StringRef funcName) {
|
|||
|
||||
// Check for \01 prefix that is used to mangle __asm declarations and
|
||||
// strip it if present.
|
||||
return GlobalValue::getRealLinkageName(funcName);
|
||||
return GlobalValue::dropLLVMManglingEscape(funcName);
|
||||
}
|
||||
|
||||
bool TargetLibraryInfoImpl::getLibFunc(StringRef funcName,
|
||||
|
|
|
@ -767,7 +767,7 @@ void CodeViewDebug::emitDebugInfoForFunction(const Function *GV,
|
|||
|
||||
// If our DISubprogram name is empty, use the mangled name.
|
||||
if (FuncName.empty())
|
||||
FuncName = GlobalValue::getRealLinkageName(GV->getName());
|
||||
FuncName = GlobalValue::dropLLVMManglingEscape(GV->getName());
|
||||
|
||||
// Emit a symbol subsection, required by VS2012+ to find function boundaries.
|
||||
OS.AddComment("Symbol subsection for " + Twine(FuncName));
|
||||
|
@ -2202,7 +2202,7 @@ void CodeViewDebug::emitDebugInfoForGlobals() {
|
|||
if (GV->hasComdat()) {
|
||||
MCSymbol *GVSym = Asm->getSymbol(GV);
|
||||
OS.AddComment("Symbol subsection for " +
|
||||
Twine(GlobalValue::getRealLinkageName(GV->getName())));
|
||||
Twine(GlobalValue::dropLLVMManglingEscape(GV->getName())));
|
||||
switchToDebugSectionForSymbol(GVSym);
|
||||
EndLabel = beginCVSubsection(ModuleDebugFragmentKind::Symbols);
|
||||
// FIXME: emitDebugInfoForGlobal() doesn't handle DIExpressions.
|
||||
|
|
|
@ -647,7 +647,7 @@ void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
|
|||
addString(Die,
|
||||
DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
|
||||
: dwarf::DW_AT_MIPS_linkage_name,
|
||||
GlobalValue::getRealLinkageName(LinkageName));
|
||||
GlobalValue::dropLLVMManglingEscape(LinkageName));
|
||||
}
|
||||
|
||||
void DwarfUnit::addTemplateParams(DIE &Buffer, DINodeArray TParams) {
|
||||
|
|
|
@ -101,7 +101,7 @@ void WinException::beginFunction(const MachineFunction *MF) {
|
|||
// functions may still refer to it.
|
||||
const WinEHFuncInfo &FuncInfo = *MF->getWinEHFuncInfo();
|
||||
StringRef FLinkageName =
|
||||
GlobalValue::getRealLinkageName(MF->getFunction()->getName());
|
||||
GlobalValue::dropLLVMManglingEscape(MF->getFunction()->getName());
|
||||
emitEHRegistrationOffsetLabel(FuncInfo, FLinkageName);
|
||||
}
|
||||
shouldEmitLSDA = hasEHFunclets;
|
||||
|
@ -174,7 +174,7 @@ static MCSymbol *getMCSymbolForMBB(AsmPrinter *Asm,
|
|||
// their funclet entry block's number.
|
||||
const MachineFunction *MF = MBB->getParent();
|
||||
const Function *F = MF->getFunction();
|
||||
StringRef FuncLinkageName = GlobalValue::getRealLinkageName(F->getName());
|
||||
StringRef FuncLinkageName = GlobalValue::dropLLVMManglingEscape(F->getName());
|
||||
MCContext &Ctx = MF->getContext();
|
||||
StringRef HandlerPrefix = MBB->isCleanupFuncletEntry() ? "dtor" : "catch";
|
||||
return Ctx.getOrCreateSymbol("?" + HandlerPrefix + "$" +
|
||||
|
@ -252,7 +252,7 @@ void WinException::endFunclet() {
|
|||
!CurrentFuncletEntry->isCleanupFuncletEntry()) {
|
||||
// If this is a C++ catch funclet (or the parent function),
|
||||
// emit a reference to the LSDA for the parent function.
|
||||
StringRef FuncLinkageName = GlobalValue::getRealLinkageName(F->getName());
|
||||
StringRef FuncLinkageName = GlobalValue::dropLLVMManglingEscape(F->getName());
|
||||
MCSymbol *FuncInfoXData = Asm->OutContext.getOrCreateSymbol(
|
||||
Twine("$cppxdata$", FuncLinkageName));
|
||||
Asm->OutStreamer->EmitValue(create32bitRef(FuncInfoXData), 4);
|
||||
|
@ -536,7 +536,7 @@ void WinException::emitCSpecificHandlerTable(const MachineFunction *MF) {
|
|||
// Emit a label assignment with the SEH frame offset so we can use it for
|
||||
// llvm.x86.seh.recoverfp.
|
||||
StringRef FLinkageName =
|
||||
GlobalValue::getRealLinkageName(MF->getFunction()->getName());
|
||||
GlobalValue::dropLLVMManglingEscape(MF->getFunction()->getName());
|
||||
MCSymbol *ParentFrameOffset =
|
||||
Ctx.getOrCreateParentFrameOffsetSymbol(FLinkageName);
|
||||
const MCExpr *MCOffset =
|
||||
|
@ -635,7 +635,7 @@ void WinException::emitCXXFrameHandler3Table(const MachineFunction *MF) {
|
|||
auto &OS = *Asm->OutStreamer;
|
||||
const WinEHFuncInfo &FuncInfo = *MF->getWinEHFuncInfo();
|
||||
|
||||
StringRef FuncLinkageName = GlobalValue::getRealLinkageName(F->getName());
|
||||
StringRef FuncLinkageName = GlobalValue::dropLLVMManglingEscape(F->getName());
|
||||
|
||||
SmallVector<std::pair<const MCExpr *, int>, 4> IPToStateTable;
|
||||
MCSymbol *FuncInfoXData = nullptr;
|
||||
|
@ -942,7 +942,7 @@ void WinException::emitEHRegistrationOffsetLabel(const WinEHFuncInfo &FuncInfo,
|
|||
void WinException::emitExceptHandlerTable(const MachineFunction *MF) {
|
||||
MCStreamer &OS = *Asm->OutStreamer;
|
||||
const Function *F = MF->getFunction();
|
||||
StringRef FLinkageName = GlobalValue::getRealLinkageName(F->getName());
|
||||
StringRef FLinkageName = GlobalValue::dropLLVMManglingEscape(F->getName());
|
||||
|
||||
bool VerboseAsm = OS.isVerboseAsm();
|
||||
auto AddComment = [&](const Twine &Comment) {
|
||||
|
|
|
@ -5645,7 +5645,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||
int FI = FuncInfo.StaticAllocaMap[Slot];
|
||||
MCSymbol *FrameAllocSym =
|
||||
MF.getMMI().getContext().getOrCreateFrameAllocSymbol(
|
||||
GlobalValue::getRealLinkageName(MF.getName()), Idx);
|
||||
GlobalValue::dropLLVMManglingEscape(MF.getName()), Idx);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, dl,
|
||||
TII->get(TargetOpcode::LOCAL_ESCAPE))
|
||||
.addSym(FrameAllocSym)
|
||||
|
@ -5666,7 +5666,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||
unsigned IdxVal = unsigned(Idx->getLimitedValue(INT_MAX));
|
||||
MCSymbol *FrameAllocSym =
|
||||
MF.getMMI().getContext().getOrCreateFrameAllocSymbol(
|
||||
GlobalValue::getRealLinkageName(Fn->getName()), IdxVal);
|
||||
GlobalValue::dropLLVMManglingEscape(Fn->getName()), IdxVal);
|
||||
|
||||
// Create a MCSymbol for the label to avoid any target lowering
|
||||
// that would make this PC relative.
|
||||
|
|
|
@ -204,7 +204,7 @@ DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, const Value *V
|
|||
// Only include names that correspond to user variables. FIXME: we should use
|
||||
// debug info if available to get the name of the user variable.
|
||||
if (isa<llvm::Argument>(V) || isa<GlobalValue>(V))
|
||||
Val = GlobalValue::getRealLinkageName(V->getName());
|
||||
Val = GlobalValue::dropLLVMManglingEscape(V->getName());
|
||||
else if (isa<Constant>(V)) {
|
||||
raw_string_ostream OS(Val);
|
||||
V->printAsOperand(OS, /*PrintType=*/false);
|
||||
|
|
|
@ -973,7 +973,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
|||
// this value. If not, no need to preserve any ThinLTO copies.
|
||||
!Res.second.IRName.empty())
|
||||
GUIDPreservedSymbols.insert(GlobalValue::getGUID(
|
||||
GlobalValue::getRealLinkageName(Res.second.IRName)));
|
||||
GlobalValue::dropLLVMManglingEscape(Res.second.IRName)));
|
||||
}
|
||||
|
||||
auto DeadSymbols =
|
||||
|
@ -993,7 +993,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
|||
if (Res.second.IRName.empty())
|
||||
continue;
|
||||
auto GUID = GlobalValue::getGUID(
|
||||
GlobalValue::getRealLinkageName(Res.second.IRName));
|
||||
GlobalValue::dropLLVMManglingEscape(Res.second.IRName));
|
||||
// Mark exported unless index-based analysis determined it to be dead.
|
||||
if (!DeadSymbols.count(GUID))
|
||||
ExportedGUIDs.insert(GUID);
|
||||
|
|
|
@ -19119,7 +19119,7 @@ static SDValue recoverFramePointer(SelectionDAG &DAG, const Function *Fn,
|
|||
// registration, or the .set_setframe offset.
|
||||
MCSymbol *OffsetSym =
|
||||
MF.getMMI().getContext().getOrCreateParentFrameOffsetSymbol(
|
||||
GlobalValue::getRealLinkageName(Fn->getName()));
|
||||
GlobalValue::dropLLVMManglingEscape(Fn->getName()));
|
||||
SDValue OffsetSymVal = DAG.getMCSymbol(OffsetSym, PtrVT);
|
||||
SDValue ParentFrameOffset =
|
||||
DAG.getNode(ISD::LOCAL_RECOVER, dl, PtrVT, OffsetSymVal);
|
||||
|
@ -19964,7 +19964,7 @@ static SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, const X86Subtarget &Subtarget
|
|||
SDValue Op1 = Op.getOperand(1);
|
||||
auto *Fn = cast<Function>(cast<GlobalAddressSDNode>(Op1)->getGlobal());
|
||||
MCSymbol *LSDASym = MF.getMMI().getContext().getOrCreateLSDASymbol(
|
||||
GlobalValue::getRealLinkageName(Fn->getName()));
|
||||
GlobalValue::dropLLVMManglingEscape(Fn->getName()));
|
||||
|
||||
// Generate a simple absolute symbol reference. This intrinsic is only
|
||||
// supported on 32-bit Windows, which isn't PIC.
|
||||
|
|
|
@ -398,7 +398,7 @@ Function *WinEHStatePass::generateLSDAInEAXThunk(Function *ParentFunc) {
|
|||
/*isVarArg=*/false);
|
||||
Function *Trampoline =
|
||||
Function::Create(TrampolineTy, GlobalValue::InternalLinkage,
|
||||
Twine("__ehhandler$") + GlobalValue::getRealLinkageName(
|
||||
Twine("__ehhandler$") + GlobalValue::dropLLVMManglingEscape(
|
||||
ParentFunc->getName()),
|
||||
TheModule);
|
||||
BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", Trampoline);
|
||||
|
|
|
@ -1686,7 +1686,7 @@ AddressSanitizerModule::CreateMetadataGlobal(Module &M, Constant *Initializer,
|
|||
: GlobalVariable::PrivateLinkage;
|
||||
GlobalVariable *Metadata = new GlobalVariable(
|
||||
M, Initializer->getType(), false, Linkage, Initializer,
|
||||
Twine("__asan_global_") + GlobalValue::getRealLinkageName(OriginalName));
|
||||
Twine("__asan_global_") + GlobalValue::dropLLVMManglingEscape(OriginalName));
|
||||
Metadata->setSection(getGlobalMetadataSection());
|
||||
return Metadata;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue