[llvm] r238867 - [IR/AsmWriter] Output escape sequences if the first character isdigit()
Filipe Cabecinhas
me at filcab.net
Tue Jun 2 14:25:08 PDT 2015
Author: filcab
Date: Tue Jun 2 16:25:08 2015
New Revision: 238867
URL: http://llvm.org/viewvc/llvm-project?rev=238867&view=rev
Log:
[IR/AsmWriter] Output escape sequences if the first character isdigit()
If the first character in a metadata attachment's name is a digit, it has
to be output using an escape sequence, otherwise it's not valid text IR.
Removed an over-zealous assert from LLVMContext which didn't allow this.
The rule should only apply to text IR. Actual names can have any sequence
of non-NUL bytes.
Also added some documentation on accepted names.
Bug found with AFL fuzz.
Modified:
llvm/trunk/docs/LangRef.rst
llvm/trunk/lib/IR/AsmWriter.cpp
llvm/trunk/lib/IR/LLVMContext.cpp
llvm/trunk/test/Assembler/metadata.ll
Modified: llvm/trunk/docs/LangRef.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=238867&r1=238866&r2=238867&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.rst (original)
+++ llvm/trunk/docs/LangRef.rst Tue Jun 2 16:25:08 2015
@@ -834,6 +834,11 @@ Named metadata is a collection of metada
nodes <metadata>` (but not metadata strings) are the only valid
operands for a named metadata.
+#. Named metadata are represented as a string of characters with the
+ metadata prefix. The rules for metadata names are the same as for
+ identifiers, but quoted names are not allowed. ``"\xx"`` type escapes
+ are still valid, which allows any character to be part of a name.
+
Syntax::
; Some unnamed metadata nodes, which are referenced by the named metadata.
Modified: llvm/trunk/lib/IR/AsmWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=238867&r1=238866&r2=238867&view=diff
==============================================================================
--- llvm/trunk/lib/IR/AsmWriter.cpp (original)
+++ llvm/trunk/lib/IR/AsmWriter.cpp Tue Jun 2 16:25:08 2015
@@ -2215,9 +2215,8 @@ void AssemblyWriter::printModule(const M
}
}
-void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
- Out << '!';
- StringRef Name = NMD->getName();
+static void printMetadataIdentifier(StringRef Name,
+ formatted_raw_ostream &Out) {
if (Name.empty()) {
Out << "<empty name> ";
} else {
@@ -2235,6 +2234,11 @@ void AssemblyWriter::printNamedMDNode(co
Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);
}
}
+}
+
+void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {
+ Out << '!';
+ printMetadataIdentifier(NMD->getName(), Out);
Out << " = !{";
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
if (i)
@@ -3006,9 +3010,10 @@ void AssemblyWriter::printMetadataAttach
for (const auto &I : MDs) {
unsigned Kind = I.first;
Out << Separator;
- if (Kind < MDNames.size())
- Out << "!" << MDNames[Kind];
- else
+ if (Kind < MDNames.size()) {
+ Out << "!";
+ printMetadataIdentifier(MDNames[Kind], Out);
+ } else
Out << "!<unknown kind #" << Kind << ">";
Out << ' ';
WriteAsOperandInternal(Out, I.second, &TypePrinter, &Machine, TheModule);
Modified: llvm/trunk/lib/IR/LLVMContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=238867&r1=238866&r2=238867&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContext.cpp (original)
+++ llvm/trunk/lib/IR/LLVMContext.cpp Tue Jun 2 16:25:08 2015
@@ -242,9 +242,6 @@ void LLVMContext::emitError(unsigned Loc
/// Return a unique non-zero ID for the specified metadata kind.
unsigned LLVMContext::getMDKindID(StringRef Name) const {
- assert(!std::isdigit(Name.front()) &&
- "Named metadata may not start with a digit");
-
// If this is new, assign it its ID.
return pImpl->CustomMDKindNames.insert(
std::make_pair(
Modified: llvm/trunk/test/Assembler/metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/metadata.ll?rev=238867&r1=238866&r2=238867&view=diff
==============================================================================
--- llvm/trunk/test/Assembler/metadata.ll (original)
+++ llvm/trunk/test/Assembler/metadata.ll Tue Jun 2 16:25:08 2015
@@ -22,6 +22,13 @@ define void @test3() !bar !3 {
unreachable, !bar !4
}
+; CHECK-LABEL: define void @test_attachment_name() {
+; CHECK: unreachable, !\342abc !4
+define void @test_attachment_name() {
+ ;; Escape the first character when printing text IR, since it's a digit
+ unreachable, !\34\32abc !4
+}
+
!0 = !DILocation(line: 662302, column: 26, scope: !1)
!1 = !DISubprogram(name: "foo")
!2 = distinct !{}
More information about the llvm-commits
mailing list