aboutsummaryrefslogtreecommitdiff
path: root/lib/AsmParser/LLParser.cpp
diff options
context:
space:
mode:
authorVictor Hernandez <vhernandez@apple.com>2010-01-06 17:00:21 +0000
committerVictor Hernandez <vhernandez@apple.com>2010-01-06 17:00:21 +0000
commit76bf310b7a62a0dd34cd9c90a438343f2732645d (patch)
treebda42e4580b6fa3f9a8a991551f32d6da225b75c /lib/AsmParser/LLParser.cpp
parent2973b57093b017f2e3b5f5edd0be9d4ea180f0e9 (diff)
When parsing function-local metadata, create a function-local MDNode
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92838 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser/LLParser.cpp')
-rw-r--r--lib/AsmParser/LLParser.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index a917d858f5..3ee683f7f6 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, NULL) ||
+ ParseMDNodeVector(Elts, NULL, NULL) ||
ParseToken(lltok::rbrace, "expected end of metadata node"))
return true;
@@ -1911,11 +1911,13 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
if (EatIfPresent(lltok::lbrace)) {
SmallVector<Value*, 16> Elts;
- if (ParseMDNodeVector(Elts, PFS) ||
+ bool isFunctionLocal = false;
+ if (ParseMDNodeVector(Elts, PFS, &isFunctionLocal) ||
ParseToken(lltok::rbrace, "expected end of metadata node"))
return true;
- ID.MDNodeVal = MDNode::get(Context, Elts.data(), Elts.size());
+ ID.MDNodeVal = MDNode::get(Context, Elts.data(), Elts.size(),
+ isFunctionLocal);
ID.Kind = ValID::t_MDNode;
return false;
}
@@ -2447,7 +2449,8 @@ bool LLParser::ConvertGlobalValIDToValue(const Type *Ty, ValID &ID,
/// resolved constant, metadata, or function-local value
bool LLParser::ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID,
Value *&V,
- PerFunctionState *PFS) {
+ PerFunctionState *PFS,
+ bool *isFunctionLocal) {
switch (ID.Kind) {
case ValID::t_MDNode:
if (!Ty->isMetadataTy())
@@ -2461,9 +2464,10 @@ bool LLParser::ConvertGlobalOrMetadataValIDToValue(const Type *Ty, ValID &ID,
return false;
case ValID::t_LocalID:
case ValID::t_LocalName:
- if (!PFS)
+ if (!PFS || !isFunctionLocal)
return Error(ID.Loc, "invalid use of function-local name");
if (ConvertValIDToValue(Ty, ID, V, *PFS)) return true;
+ *isFunctionLocal = true;
return false;
default:
Constant *C;
@@ -2523,7 +2527,7 @@ bool LLParser::ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
return false;
}
default:
- return ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, &PFS);
+ return ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, &PFS, NULL);
}
return V == 0;
@@ -3850,7 +3854,7 @@ int LLParser::ParseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
/// Element
/// ::= 'null' | TypeAndValue
bool LLParser::ParseMDNodeVector(SmallVectorImpl<Value*> &Elts,
- PerFunctionState *PFS) {
+ PerFunctionState *PFS, bool *isFunctionLocal) {
do {
// Null is a special case since it is typeless.
if (EatIfPresent(lltok::kw_null)) {
@@ -3862,7 +3866,7 @@ bool LLParser::ParseMDNodeVector(SmallVectorImpl<Value*> &Elts,
PATypeHolder Ty(Type::getVoidTy(Context));
ValID ID;
if (ParseType(Ty) || ParseValID(ID, PFS) ||
- ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, PFS))
+ ConvertGlobalOrMetadataValIDToValue(Ty, ID, V, PFS, isFunctionLocal))
return true;
Elts.push_back(V);