From: Duncan P. N. Exon Smith Date: Sat, 6 Dec 2014 02:29:44 +0000 (+0000) Subject: IR: Disallow function-local metadata attachments X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=09ba28c27c1d606d25924cf36927d433d7b2dc8c;p=oota-llvm.git IR: Disallow function-local metadata attachments Metadata attachments to instructions cannot be function-local. This is part of PR21532. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223574 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 93eb490619f..f44af673fcd 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -62,6 +62,8 @@ bool LLParser::ValidateEndOfModule() { NumberedMetadata[SlotNo] == nullptr) return Error(MDList[i].Loc, "use of undefined metadata '!" + Twine(SlotNo) + "'"); + assert(!NumberedMetadata[SlotNo]->isFunctionLocal() && + "Unexpected function-local metadata"); Inst->setMetadata(MDList[i].MDKind, NumberedMetadata[SlotNo]); } } @@ -1529,6 +1531,8 @@ bool LLParser::ParseInstructionMetadata(Instruction *Inst, if (ParseMetadataListValue(ID, PFS)) return true; assert(ID.Kind == ValID::t_MDNode); + if (ID.MDNodeVal->isFunctionLocal()) + return TokError("unexpected function-local metadata"); Inst->setMetadata(MDK, ID.MDNodeVal); } else { unsigned NodeID = 0; diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 9f6d02f88db..72f823c2e3e 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -2359,8 +2359,12 @@ std::error_code BitcodeReader::ParseMetadataAttachment() { MDKindMap.find(Kind); if (I == MDKindMap.end()) return Error(BitcodeError::InvalidID); - Value *Node = MDValueList.getValueFwdRef(Record[i+1]); - Inst->setMetadata(I->second, cast(Node)); + MDNode *Node = cast(MDValueList.getValueFwdRef(Record[i+1])); + if (Node->isFunctionLocal()) + // Drop the attachment. This used to be legal, but there's no + // upgrade path. + break; + Inst->setMetadata(I->second, Node); if (I->second == LLVMContext::MD_tbaa) InstsWithTBAATag.push_back(Inst); } diff --git a/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 45d61a15a6b..e5dfaec74e5 100644 --- a/lib/IR/Metadata.cpp +++ b/lib/IR/Metadata.cpp @@ -639,6 +639,8 @@ void Instruction::setMetadata(unsigned KindID, MDNode *Node) { // Handle the case when we're adding/updating metadata on an instruction. if (Node) { + assert(!Node->isFunctionLocal() && + "Function-local metadata cannot be attached to instructions"); LLVMContextImpl::MDMapTy &Info = getContext().pImpl->MetadataStore[this]; assert(!Info.empty() == hasMetadataHashEntry() && "HasMetadata bit is wonked"); diff --git a/test/Feature/metadata.ll b/test/Feature/metadata.ll index 2a857bb9c6b..f83b7fe9c32 100644 --- a/test/Feature/metadata.ll +++ b/test/Feature/metadata.ll @@ -5,7 +5,7 @@ define void @foo(i32 %x) { call void @llvm.zonk(metadata !1, i64 0, metadata !1) store i32 0, i32* null, !whatever !0, !whatever_else !{}, !more !{metadata !"hello"} store i32 0, i32* null, !whatever !{metadata !"hello", metadata !1, metadata !{}, metadata !2} - ret void, !whatever !{i32 %x} + ret void } declare void @llvm.zonk(metadata, i64, metadata) nounwind readnone diff --git a/test/Linker/metadata-a.ll b/test/Linker/metadata-a.ll index 5a9d2e40b94..76a8c8cbfc7 100644 --- a/test/Linker/metadata-a.ll +++ b/test/Linker/metadata-a.ll @@ -1,15 +1,15 @@ ; RUN: llvm-link %s %p/metadata-b.ll -S -o - | FileCheck %s ; CHECK: define void @foo(i32 %a) -; CHECK: ret void, !attach !0, !also !{i32 %a} +; CHECK: ret void, !attach !0 ; CHECK: define void @goo(i32 %b) -; CHECK: ret void, !attach !1, !and !{i32 %b} +; CHECK: ret void, !attach !1 ; CHECK: !0 = metadata !{i32 524334, void (i32)* @foo} ; CHECK: !1 = metadata !{i32 524334, void (i32)* @goo} define void @foo(i32 %a) nounwind { entry: - ret void, !attach !0, !also !{ i32 %a } + ret void, !attach !0 } !0 = metadata !{i32 524334, void (i32)* @foo} diff --git a/test/Linker/metadata-b.ll b/test/Linker/metadata-b.ll index ef0270af075..35d4f66ccba 100644 --- a/test/Linker/metadata-b.ll +++ b/test/Linker/metadata-b.ll @@ -3,7 +3,7 @@ define void @goo(i32 %b) nounwind { entry: - ret void, !attach !0, !and !{ i32 %b } + ret void, !attach !0 } !0 = metadata !{i32 524334, void (i32)* @goo}