mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
Take care of special characters while creating named MDNode name to hold function specific local variable's info.
This fixes radar 8653152. I am checking in testcase as a separate check-in. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1156,6 +1156,39 @@ DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
return DIGlobalVariable(Node);
|
||||
}
|
||||
|
||||
/// fixupObjcLikeName - Replace contains special characters used
|
||||
/// in a typical Objective-C names with '.' in a given string.
|
||||
static void fixupObjcLikeName(std::string &Str) {
|
||||
for (size_t i = 0, e = Str.size(); i < e; ++i) {
|
||||
char C = Str[i];
|
||||
if (C == '[' || C == ']' || C == ' ' || C == ':')
|
||||
Str[i] = '.';
|
||||
}
|
||||
}
|
||||
|
||||
/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
|
||||
/// to hold function specific information.
|
||||
NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
|
||||
SmallString<32> Out;
|
||||
if (FuncName.find('[') == StringRef::npos)
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName)
|
||||
.toStringRef(Out));
|
||||
std::string Name = FuncName;
|
||||
fixupObjcLikeName(Name);
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name)
|
||||
.toStringRef(Out));
|
||||
}
|
||||
|
||||
/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
|
||||
/// suitable to hold function specific information.
|
||||
NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
|
||||
if (FuncName.find('[') == StringRef::npos)
|
||||
return M.getNamedMetadata(Twine("llvm.dbg.lv.", FuncName));
|
||||
std::string Name = FuncName;
|
||||
fixupObjcLikeName(Name);
|
||||
return M.getNamedMetadata(Twine("llvm.dbg.lv.", Name));
|
||||
}
|
||||
|
||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
||||
DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
@ -1185,9 +1218,8 @@ DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
if (FName.startswith(StringRef(&One, 1)))
|
||||
FName = FName.substr(1);
|
||||
|
||||
SmallString<32> Out;
|
||||
NamedMDNode *FnLocals =
|
||||
M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FName).toStringRef(Out));
|
||||
|
||||
NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, FName);
|
||||
FnLocals->addOperand(Node);
|
||||
}
|
||||
return DIVariable(Node);
|
||||
|
Reference in New Issue
Block a user