From: Victor Hernandez Date: Tue, 5 Jan 2010 22:22:14 +0000 (+0000) Subject: Re-add parsing of function-local metadata; this time with testcase. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=bf170d4c2ffd9dc99fad1fabfbf1f90f980a9782;p=oota-llvm.git Re-add parsing of function-local metadata; this time with testcase. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92793 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 99ddeb682b8..a917d858f5a 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -548,7 +548,7 @@ bool LLParser::ParseStandaloneMetadata() { ParseType(Ty, TyLoc) || ParseToken(lltok::exclaim, "Expected '!' here") || ParseToken(lltok::lbrace, "Expected '{' here") || - ParseMDNodeVector(Elts) || + ParseMDNodeVector(Elts, NULL) || ParseToken(lltok::rbrace, "expected end of metadata node")) return true; @@ -1885,7 +1885,7 @@ BasicBlock *LLParser::PerFunctionState::DefineBB(const std::string &Name, /// type implied. For example, if we parse "4" we don't know what integer type /// it has. The value will later be combined with its type and checked for /// sanity. -bool LLParser::ParseValID(ValID &ID) { +bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { ID.Loc = Lex.getLoc(); switch (Lex.getKind()) { default: return TokError("expected value token"); @@ -1911,7 +1911,7 @@ bool LLParser::ParseValID(ValID &ID) { if (EatIfPresent(lltok::lbrace)) { SmallVector Elts; - if (ParseMDNodeVector(Elts) || + if (ParseMDNodeVector(Elts, PFS) || ParseToken(lltok::rbrace, "expected end of metadata node")) return true; @@ -2444,9 +2444,10 @@ bool LLParser::ConvertGlobalValIDToValue(const Type *Ty, ValID &ID, } /// ConvertGlobalOrMetadataValIDToValue - Apply a type to a ValID to get a fully -/// resolved constant or metadata value. +/// resolved constant, metadata, or function-local value bool LLParser::ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID, - Value *&V) { + Value *&V, + PerFunctionState *PFS) { switch (ID.Kind) { case ValID::t_MDNode: if (!Ty->isMetadataTy()) @@ -2458,6 +2459,12 @@ bool LLParser::ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID, return Error(ID.Loc, "metadata value must have metadata type"); V = ID.MDStringVal; return false; + case ValID::t_LocalID: + case ValID::t_LocalName: + if (!PFS) + return Error(ID.Loc, "invalid use of function-local name"); + if (ConvertValIDToValue(Ty, ID, V, *PFS)) return true; + return false; default: Constant *C; if (ConvertGlobalValIDToValue(Ty, ID, C)) return true; @@ -2516,7 +2523,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V, return false; } default: - return ConvertGlobalOrMetadataValIDToValue(Ty, ID, V); + return ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, &PFS); } return V == 0; @@ -2525,7 +2532,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V, bool LLParser::ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS) { V = 0; ValID ID; - return ParseValID(ID) || + return ParseValID(ID, &PFS) || ConvertValIDToValue(Ty, ID, V, PFS); } @@ -3842,7 +3849,8 @@ int LLParser::ParseInsertValue(Instruction *&Inst, PerFunctionState &PFS) { /// ::= Element (',' Element)* /// Element /// ::= 'null' | TypeAndValue -bool LLParser::ParseMDNodeVector(SmallVectorImpl &Elts) { +bool LLParser::ParseMDNodeVector(SmallVectorImpl &Elts, + PerFunctionState *PFS) { do { // Null is a special case since it is typeless. if (EatIfPresent(lltok::kw_null)) { @@ -3853,8 +3861,8 @@ bool LLParser::ParseMDNodeVector(SmallVectorImpl &Elts) { Value *V = 0; PATypeHolder Ty(Type::getVoidTy(Context)); ValID ID; - if (ParseType(Ty) || ParseValID(ID) || - ConvertGlobalOrMetadataValIDToValue(Ty, ID, V)) + if (ParseType(Ty) || ParseValID(ID, PFS) || + ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, PFS)) return true; Elts.push_back(V); diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 803832f93d5..595267b7ff1 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -216,17 +216,6 @@ namespace llvm { bool ParseFunctionType(PATypeHolder &Result); PATypeHolder HandleUpRefs(const Type *Ty); - // Constants. - bool ParseValID(ValID &ID); - bool ConvertGlobalValIDToValue(const Type *Ty, ValID &ID, Constant *&V); - bool ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID, - Value *&V); - bool ParseGlobalValue(const Type *Ty, Constant *&V); - bool ParseGlobalTypeAndValue(Constant *&V); - bool ParseGlobalValueVector(SmallVectorImpl &Elts); - bool ParseMDNodeVector(SmallVectorImpl &); - - // Function Semantic Analysis. class PerFunctionState { LLParser &P; @@ -301,6 +290,16 @@ namespace llvm { bool ParseParameterList(SmallVectorImpl &ArgList, PerFunctionState &PFS); + // Constant Parsing. + bool ParseValID(ValID &ID, PerFunctionState *PFS = NULL); + bool ConvertGlobalValIDToValue(const Type *Ty, ValID &ID, Constant *&V); + bool ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID, + Value *&V, PerFunctionState *PFS); + bool ParseGlobalValue(const Type *Ty, Constant *&V); + bool ParseGlobalTypeAndValue(Constant *&V); + bool ParseGlobalValueVector(SmallVectorImpl &Elts); + bool ParseMDNodeVector(SmallVectorImpl &, PerFunctionState *PFS); + // Function Parsing. struct ArgInfo { LocTy Loc; diff --git a/test/Assembler/functionlocal-metadata.ll b/test/Assembler/functionlocal-metadata.ll new file mode 100644 index 00000000000..86beb1c0c77 --- /dev/null +++ b/test/Assembler/functionlocal-metadata.ll @@ -0,0 +1,22 @@ +; RUN: llvm-as < %s | llvm-dis | grep {ret void, !foo !0, !bar !1} + +define void @Foo(i32 %a, i32 %b) { +entry: + %0 = add i32 %a, 1 ; [#uses=1] + %two = add i32 %b, 2 ; [#uses=2] + + call void @llvm.dbg.func.start(metadata !{i32 %0}) + call void @llvm.dbg.func.start(metadata !{i32 %b, i32 %0}) + call void @llvm.dbg.func.start(metadata !{i32 %a, metadata !"foo"}) + call void @llvm.dbg.func.start(metadata !{metadata !0, i32 %two}) + + ret void, !foo !0, !bar !1 +} + +!0 = metadata !{i32 662302, i32 26, metadata !1, null} +!1 = metadata !{i32 4, metadata !"foo"} + +declare void @llvm.dbg.func.start(metadata) nounwind readnone + +!foo = !{ !0 } +!bar = !{ !1 }