clean up some really strange code.
[oota-llvm.git] / lib / AsmParser / LLParser.cpp
index 3a2d24440dc19894094fe4fa0173295473daefca..9de1cafb5e07b205a4a8fcbb65adeab13968e00f 100644 (file)
@@ -463,42 +463,43 @@ bool LLParser::ParseNamedGlobal() {
 
 // MDString:
 //   ::= '!' STRINGCONSTANT
-bool LLParser::ParseMDString(MetadataBase *&MDS) {
+bool LLParser::ParseMDString(MDString *&Result) {
   std::string Str;
   if (ParseStringConstant(Str)) return true;
-  MDS = MDString::get(Context, Str);
+  Result = MDString::get(Context, Str);
   return false;
 }
 
 // MDNode:
 //   ::= '!' MDNodeNumber
-bool LLParser::ParseMDNode(MetadataBase *&Node) {
+bool LLParser::ParseMDNode(MDNode *&Result) {
   // !{ ..., !42, ... }
   unsigned MID = 0;
-  if (ParseUInt32(MID))  return true;
+  if (ParseUInt32(MID)) return true;
 
   // Check existing MDNode.
-  std::map<unsigned, WeakVH>::iterator I = MetadataCache.find(MID);
+  std::map<unsigned, TrackingVH<MDNode> >::iterator I = MetadataCache.find(MID);
   if (I != MetadataCache.end()) {
-    Node = cast<MetadataBase>(I->second);
+    Result = I->second;
     return false;
   }
 
   // Check known forward references.
-  std::map<unsigned, std::pair<WeakVH, LocTy> >::iterator
+  std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> >::iterator
     FI = ForwardRefMDNodes.find(MID);
   if (FI != ForwardRefMDNodes.end()) {
-    Node = cast<MetadataBase>(FI->second.first);
+    Result = FI->second.first;
     return false;
   }
 
-  // Create MDNode forward reference
-  SmallVector<Value *, 1> Elts;
+  // Create MDNode forward reference.
+
+  // FIXME: This is not unique enough!
   std::string FwdRefName = "llvm.mdnode.fwdref." + utostr(MID);
-  Elts.push_back(MDString::get(Context, FwdRefName));
-  MDNode *FwdNode = MDNode::get(Context, Elts.data(), Elts.size());
+  Value *V = MDString::get(Context, FwdRefName));
+  MDNode *FwdNode = MDNode::get(Context, &V, 1);
   ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc());
-  Node = FwdNode;
+  Result = FwdNode;
   return false;
 }
 
@@ -521,10 +522,12 @@ bool LLParser::ParseNamedMetadata() {
   Lex.Lex();
   SmallVector<MetadataBase *, 8> Elts;
   do {
-    if (Lex.getKind() != lltok::Metadata)
-      return TokError("Expected '!' here");
+    if (ParseToken(lltok::Metadata, "Expected '!' here"))
+      return true;
     Lex.Lex();
-    MetadataBase *N = 0;
+    
+    // FIXME: This rejects MDStrings.  Are they legal in an named MDNode or not?
+    MDNode *N = 0;
     if (ParseMDNode(N)) return true;
     Elts.push_back(N);
   } while (EatIfPresent(lltok::comma));
@@ -544,7 +547,7 @@ bool LLParser::ParseStandaloneMetadata() {
   unsigned MetadataID = 0;
   if (ParseUInt32(MetadataID))
     return true;
-  if (MetadataCache.find(MetadataID) != MetadataCache.end())
+  if (MetadataCache.count(MetadataID))
     return TokError("Metadata id is already used");
   if (ParseToken(lltok::equal, "expected '=' here"))
     return true;
@@ -561,6 +564,7 @@ bool LLParser::ParseStandaloneMetadata() {
   if (Lex.getKind() != lltok::lbrace)
     return TokError("Expected '{' here");
 
+  // FIXME: This doesn't make sense here.
   SmallVector<Value *, 16> Elts;
   if (ParseMDNodeVector(Elts)
       || ParseToken(lltok::rbrace, "expected end of metadata node"))
@@ -568,11 +572,10 @@ bool LLParser::ParseStandaloneMetadata() {
 
   MDNode *Init = MDNode::get(Context, Elts.data(), Elts.size());
   MetadataCache[MetadataID] = Init;
-  std::map<unsigned, std::pair<WeakVH, LocTy> >::iterator
+  std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> >::iterator
     FI = ForwardRefMDNodes.find(MetadataID);
   if (FI != ForwardRefMDNodes.end()) {
-    MDNode *FwdNode = cast<MDNode>(FI->second.first);
-    FwdNode->replaceAllUsesWith(Init);
+    FI->second.first->replaceAllUsesWith(Init);
     ForwardRefMDNodes.erase(FI);
   }
 
@@ -599,14 +602,16 @@ bool LLParser::ParseInlineMetadata(Value *&V, PerFunctionState &PFS) {
     return false;
   }
 
+  // FIXME: This can't possibly work at all.  r90497
+  
   // Standalone metadata reference
   // !{ ..., !42, ... }
-  if (!ParseMDNode((MetadataBase *&)V))
+  if (!ParseMDNode((MDNode *&)V))
     return false;
 
   // MDString:
   // '!' STRINGCONSTANT
-  if (ParseMDString((MetadataBase *&)V)) return true;
+  if (ParseMDString((MDString *&)V)) return true;
   return false;
 }
 
@@ -1118,11 +1123,11 @@ bool LLParser::ParseOptionalCustomMetadata() {
       return TokError("expected '!' here");
     Lex.Lex();
 
-    MetadataBase *Node;
+    MDNode *Node;
     if (ParseMDNode(Node)) return true;
 
     unsigned MDK = M->getMDKindID(Name.c_str());
-    MDsOnInst.push_back(std::make_pair(MDK, cast<MDNode>(Node)));
+    MDsOnInst.push_back(std::make_pair(MDK, Node));
 
     // If this is the end of the list, we're done.
     if (!EatIfPresent(lltok::comma))
@@ -1937,6 +1942,8 @@ bool LLParser::ParseValID(ValID &ID) {
   case lltok::Metadata: {  // !{...} MDNode, !"foo" MDString
     ID.Kind = ValID::t_Metadata;
     Lex.Lex();
+    
+    // FIXME: This doesn't belong here.
     if (Lex.getKind() == lltok::lbrace) {
       SmallVector<Value*, 16> Elts;
       if (ParseMDNodeVector(Elts) ||
@@ -1949,12 +1956,13 @@ bool LLParser::ParseValID(ValID &ID) {
 
     // Standalone metadata reference
     // !{ ..., !42, ... }
-    if (!ParseMDNode(ID.MetadataVal))
+    // FIXME: Split MetadataVal into one for MDNode and one for MDString.
+    if (!ParseMDNode((MDNode*&)ID.MetadataVal))
       return false;
 
     // MDString:
     //   ::= '!' STRINGCONSTANT
-    if (ParseMDString(ID.MetadataVal)) return true;
+    if (ParseMDString((MDString*&)ID.MetadataVal)) return true;
     ID.Kind = ValID::t_Metadata;
     return false;
   }
@@ -3842,6 +3850,7 @@ bool LLParser::ParseMDNodeVector(SmallVectorImpl<Value*> &Elts) {
   Lex.Lex();
   do {
     Value *V = 0;
+    // FIXME: REWRITE.
     if (Lex.getKind() == lltok::kw_null) {
       Lex.Lex();
       V = 0;
@@ -3850,11 +3859,11 @@ bool LLParser::ParseMDNodeVector(SmallVectorImpl<Value*> &Elts) {
       if (ParseType(Ty)) return true;
       if (Lex.getKind() == lltok::Metadata) {
         Lex.Lex();
-        MetadataBase *Node = 0;
+        MDNode *Node = 0;
         if (!ParseMDNode(Node))
           V = Node;
         else {
-          MetadataBase *MDS = 0;
+          MDString *MDS = 0;
           if (ParseMDString(MDS)) return true;
           V = MDS;
         }