<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 5, 2014 at 6:29 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Fri Dec  5 20:29:44 2014<br>
New Revision: 223574<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=223574&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=223574&view=rev</a><br>
Log:<br>
IR: Disallow function-local metadata attachments<br>
<br>
Metadata attachments to instructions cannot be function-local.<br>
<br>
This is part of PR21532.<br>
<br>
Modified:<br>
    llvm/trunk/lib/AsmParser/LLParser.cpp<br>
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
    llvm/trunk/lib/IR/Metadata.cpp<br>
    llvm/trunk/test/Feature/metadata.ll<br>
    llvm/trunk/test/Linker/metadata-a.ll<br>
    llvm/trunk/test/Linker/metadata-b.ll<br>
<br>
Modified: llvm/trunk/lib/AsmParser/LLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Fri Dec  5 20:29:44 2014<br>
@@ -62,6 +62,8 @@ bool LLParser::ValidateEndOfModule() {<br>
             NumberedMetadata[SlotNo] == nullptr)<br>
           return Error(MDList[i].Loc, "use of undefined metadata '!" +<br>
                        Twine(SlotNo) + "'");<br>
+        assert(!NumberedMetadata[SlotNo]->isFunctionLocal() &&<br>
+               "Unexpected function-local metadata");<br>
         Inst->setMetadata(MDList[i].MDKind, NumberedMetadata[SlotNo]);<br>
       }<br>
     }<br>
@@ -1529,6 +1531,8 @@ bool LLParser::ParseInstructionMetadata(<br>
       if (ParseMetadataListValue(ID, PFS))<br>
         return true;<br>
       assert(ID.Kind == ValID::t_MDNode);<br>
+      if (ID.MDNodeVal->isFunctionLocal())<br>
+        return TokError("unexpected function-local metadata");<br>
       Inst->setMetadata(MDK, ID.MDNodeVal);<br>
     } else {<br>
       unsigned NodeID = 0;<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Fri Dec  5 20:29:44 2014<br>
@@ -2359,8 +2359,12 @@ std::error_code BitcodeReader::ParseMeta<br>
           MDKindMap.find(Kind);<br>
         if (I == MDKindMap.end())<br>
           return Error(BitcodeError::InvalidID);<br>
-        Value *Node = MDValueList.getValueFwdRef(Record[i+1]);<br>
-        Inst->setMetadata(I->second, cast<MDNode>(Node));<br>
+        MDNode *Node = cast<MDNode>(MDValueList.getValueFwdRef(Record[i+1]));<br>
+        if (Node->isFunctionLocal())<br>
+          // Drop the attachment.  This used to be legal, but there's no<br>
+          // upgrade path.<br>
+          break;<br>
+        Inst->setMetadata(I->second, Node);<br>
         if (I->second == LLVMContext::MD_tbaa)<br>
           InstsWithTBAATag.push_back(Inst);<br>
       }<br>
<br>
Modified: llvm/trunk/lib/IR/Metadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Metadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/Metadata.cpp Fri Dec  5 20:29:44 2014<br>
@@ -639,6 +639,8 @@ void Instruction::setMetadata(unsigned K<br>
<br>
   // Handle the case when we're adding/updating metadata on an instruction.<br>
   if (Node) {<br>
+    assert(!Node->isFunctionLocal() &&<br>
+           "Function-local metadata cannot be attached to instructions");<br>
     LLVMContextImpl::MDMapTy &Info = getContext().pImpl->MetadataStore[this];<br>
     assert(!Info.empty() == hasMetadataHashEntry() &&<br>
            "HasMetadata bit is wonked");<br>
<br>
Modified: llvm/trunk/test/Feature/metadata.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/metadata.ll?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/metadata.ll?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Feature/metadata.ll (original)<br>
+++ llvm/trunk/test/Feature/metadata.ll Fri Dec  5 20:29:44 2014<br>
@@ -5,7 +5,7 @@ define void @foo(i32 %x) {<br>
   call void @llvm.zonk(metadata !1, i64 0, metadata !1)<br>
   store i32 0, i32* null, !whatever !0, !whatever_else !{}, !more !{metadata !"hello"}<br>
   store i32 0, i32* null, !whatever !{metadata !"hello", metadata !1, metadata !{}, metadata !2}<br>
-  ret void, !whatever !{i32 %x}<br></blockquote><div><br>Should we have a test case that includes function local metadata and tests that it gracefully fails to be parsed?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  ret void<br>
 }<br>
<br>
 declare void @llvm.zonk(metadata, i64, metadata) nounwind readnone<br>
<br>
Modified: llvm/trunk/test/Linker/metadata-a.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/metadata-a.ll?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/metadata-a.ll?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Linker/metadata-a.ll (original)<br>
+++ llvm/trunk/test/Linker/metadata-a.ll Fri Dec  5 20:29:44 2014<br>
@@ -1,15 +1,15 @@<br>
 ; RUN: llvm-link %s %p/metadata-b.ll -S -o - | FileCheck %s<br>
<br>
 ; CHECK: define void @foo(i32 %a)<br>
-; CHECK: ret void, !attach !0, !also !{i32 %a}<br>
+; CHECK: ret void, !attach !0<br>
 ; CHECK: define void @goo(i32 %b)<br>
-; CHECK: ret void, !attach !1, !and !{i32 %b}<br>
+; CHECK: ret void, !attach !1<br>
 ; CHECK: !0 = metadata !{i32 524334, void (i32)* @foo}<br>
 ; CHECK: !1 = metadata !{i32 524334, void (i32)* @goo}<br>
<br>
 define void @foo(i32 %a) nounwind {<br>
 entry:<br>
-  ret void, !attach !0, !also !{ i32 %a }<br>
+  ret void, !attach !0<br>
 }<br>
<br>
 !0 = metadata !{i32 524334, void (i32)* @foo}<br>
<br>
Modified: llvm/trunk/test/Linker/metadata-b.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/metadata-b.ll?rev=223574&r1=223573&r2=223574&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/metadata-b.ll?rev=223574&r1=223573&r2=223574&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Linker/metadata-b.ll (original)<br>
+++ llvm/trunk/test/Linker/metadata-b.ll Fri Dec  5 20:29:44 2014<br>
@@ -3,7 +3,7 @@<br>
<br>
 define void @goo(i32 %b) nounwind {<br>
 entry:<br>
-  ret void, !attach !0, !and !{ i32 %b }<br>
+  ret void, !attach !0<br>
 }<br>
<br>
 !0 = metadata !{i32 524334, void (i32)* @goo}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>