mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Teach the .ll parser to handle named metadata with non-simple names.
Unfortunately we can't follow what the rest of the language does (wrapping it in double-quotes) because that would cause an ambiguity with metadata strings, so instead we escape any unusual characters with \xx escaping. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133050 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7a10ab7d6f
commit
9100a78bce
@ -422,13 +422,15 @@ static bool JustWhitespaceNewLine(const char *&Ptr) {
|
||||
/// !
|
||||
lltok::Kind LLLexer::LexExclaim() {
|
||||
// Lex a metadata name as a MetadataVar.
|
||||
if (isalpha(CurPtr[0])) {
|
||||
if (isalpha(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' ||
|
||||
CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') {
|
||||
++CurPtr;
|
||||
while (isalnum(CurPtr[0]) || CurPtr[0] == '-' || CurPtr[0] == '$' ||
|
||||
CurPtr[0] == '.' || CurPtr[0] == '_')
|
||||
CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\')
|
||||
++CurPtr;
|
||||
|
||||
StrVal.assign(TokStart+1, CurPtr); // Skip !
|
||||
UnEscapeLexed(StrVal);
|
||||
return lltok::MetadataVar;
|
||||
}
|
||||
return lltok::exclaim;
|
||||
|
@ -1401,7 +1401,25 @@ void AssemblyWriter::printModule(const Module *M) {
|
||||
}
|
||||
|
||||
void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
|
||||
Out << "!" << NMD->getName() << " = !{";
|
||||
Out << '!';
|
||||
StringRef Name = NMD->getName();
|
||||
if (Name.empty()) {
|
||||
Out << "<empty name> ";
|
||||
} else {
|
||||
if (isalpha(Name[0]) || Name[0] == '-' || Name[0] == '$' ||
|
||||
Name[0] == '.' || Name[0] == '_')
|
||||
Out << Name[0];
|
||||
else
|
||||
Out << '\\' << hexdigit(Name[0] >> 4) << hexdigit(Name[0] & 0x0F);
|
||||
for (unsigned i = 1, e = Name.size(); i != e; ++i) {
|
||||
unsigned char C = Name[i];
|
||||
if (isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_')
|
||||
Out << C;
|
||||
else
|
||||
Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
|
||||
}
|
||||
}
|
||||
Out << " = !{";
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
if (i) Out << ", ";
|
||||
int Slot = Machine.getMetadataSlot(NMD->getOperand(i));
|
||||
|
Loading…
Reference in New Issue
Block a user