[llvm-commits] [llvm] r74630 - in /llvm/trunk: lib/AsmParser/LLParser.cpp lib/AsmParser/LLParser.h lib/VMCore/AsmWriter.cpp test/Feature/mdnode2.ll

Devang Patel devang.patel at gmail.com
Wed Jul 1 23:17:57 PDT 2009


On Wed, Jul 1, 2009 at 9:15 PM, Nick Lewycky<nicholas at mxc.ca> wrote:
> Hi Devang, I have a concern about this patch.
>
> You're assigning the numbers as you go while printing instead of storing
> them as a vector in the Module. This has the exact same behaviour when
> you print out the entire module, but I'm worried that if you "cout <<
> Inst1; cout << Inst2;" where Inst1 and Inst2 both refer to two different
> metadata nodes then the numbering will reuse !0.
>
> If you want to avoid keeping a vector<MDNode> in the Module,

I'd like to avoid it, if possible.

> the best
> thing to do would be to only use numbered metadata when printing the
> whole module and otherwise print out the full contents of the metadata node.

I think that's what happens. If you have a test case handy, pl. send it to me.

-
Devang
>
> That should be pretty easy to verify by adding a unit test to
> unittests/VMCore/MetadataTest.cpp.
>
> Nick
>
> Devang Patel wrote:
>> Author: dpatel
>> Date: Wed Jul  1 14:21:12 2009
>> New Revision: 74630
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=74630&view=rev
>> Log:
>> Support stand alone metadata syntax.
>>
>> !0 = constant metadata !{i32 21, i32 22}
>> @llvm.blah = constant metadata !{i32 1000, i16 200, metadata !0}
>>
>>
>> Added:
>>     llvm/trunk/test/Feature/mdnode2.ll
>> Modified:
>>     llvm/trunk/lib/AsmParser/LLParser.cpp
>>     llvm/trunk/lib/AsmParser/LLParser.h
>>     llvm/trunk/lib/VMCore/AsmWriter.cpp
>>
>> Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=74630&r1=74629&r2=74630&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Wed Jul  1 14:21:12 2009
>> @@ -109,6 +109,7 @@
>>      case lltok::StringConstant: // FIXME: REMOVE IN LLVM 3.0
>>      case lltok::LocalVar:   if (ParseNamedType()) return true; break;
>>      case lltok::GlobalVar:  if (ParseNamedGlobal()) return true; break;
>> +    case lltok::Metadata:   if (ParseStandaloneMetadata()) return true; break;
>>
>>      // The Global variable production with no name can have many different
>>      // optional leading prefixes, the production is:
>> @@ -355,6 +356,34 @@
>>    return ParseAlias(Name, NameLoc, Visibility);
>>  }
>>
>> +/// ParseStandaloneMetadata:
>> +///   !42 = !{...}
>> +bool LLParser::ParseStandaloneMetadata() {
>> +  assert(Lex.getKind() == lltok::Metadata);
>> +  Lex.Lex();
>> +  unsigned MetadataID = 0;
>> +  if (ParseUInt32(MetadataID))
>> +    return true;
>> +  if (MetadataCache.find(MetadataID) != MetadataCache.end())
>> +    return TokError("Metadata id is already used");
>> +  if (ParseToken(lltok::equal, "expected '=' here"))
>> +    return true;
>> +
>> +  LocTy TyLoc;
>> +  bool IsConstant;
>> +  PATypeHolder Ty(Type::VoidTy);
>> +  if (ParseGlobalType(IsConstant) ||
>> +      ParseType(Ty, TyLoc))
>> +    return true;
>> +
>> +  Constant *Init = 0;
>> +  if (ParseGlobalValue(Ty, Init))
>> +      return true;
>> +
>> +  MetadataCache[MetadataID] = Init;
>> +  return false;
>> +}
>> +
>>  /// ParseAlias:
>>  ///   ::= GlobalVar '=' OptionalVisibility 'alias' OptionalLinkage Aliasee
>>  /// Aliasee
>> @@ -1596,6 +1625,17 @@
>>        return false;
>>      }
>>
>> +    // Standalone metadata reference
>> +    // !{ ..., !42, ... }
>> +    unsigned MID = 0;
>> +    if (!ParseUInt32(MID)) {
>> +      std::map<unsigned, Constant *>::iterator I = MetadataCache.find(MID);
>> +      if (I == MetadataCache.end())
>> +     return TokError("Unknown metadata reference");
>> +      ID.ConstantVal = I->second;
>> +      return false;
>> +    }
>> +
>>      // MDString:
>>      //   ::= '!' STRINGCONSTANT
>>      std::string Str;
>>
>> Modified: llvm/trunk/lib/AsmParser/LLParser.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=74630&r1=74629&r2=74630&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/AsmParser/LLParser.h (original)
>> +++ llvm/trunk/lib/AsmParser/LLParser.h Wed Jul  1 14:21:12 2009
>> @@ -43,7 +43,8 @@
>>      std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes;
>>      std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs;
>>      std::vector<PATypeHolder> NumberedTypes;
>> -
>> +    /// MetadataCache - This map keeps track of parsed metadata constants.
>> +    std::map<unsigned, Constant *> MetadataCache;
>>      struct UpRefRecord {
>>        /// Loc - This is the location of the upref.
>>        LocTy Loc;
>> @@ -139,6 +140,7 @@
>>      bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage,
>>                       bool HasLinkage, unsigned Visibility);
>>      bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility);
>> +    bool ParseStandaloneMetadata();
>>
>>      // Type Parsing.
>>      bool ParseType(PATypeHolder &Result, bool AllowVoid = false);
>>
>> Modified: llvm/trunk/lib/VMCore/AsmWriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/AsmWriter.cpp?rev=74630&r1=74629&r2=74630&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/AsmWriter.cpp (original)
>> +++ llvm/trunk/lib/VMCore/AsmWriter.cpp Wed Jul  1 14:21:12 2009
>> @@ -35,6 +35,7 @@
>>  #include "llvm/Support/raw_ostream.h"
>>  #include <algorithm>
>>  #include <cctype>
>> +#include <map>
>>  using namespace llvm;
>>
>>  // Make virtual table appear in this compilation unit.
>> @@ -945,25 +946,6 @@
>>      return;
>>    }
>>
>> -  if (const MDNode *N = dyn_cast<MDNode>(CV)) {
>> -    Out << "!{";
>> -    for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end();
>> -         I != E;) {
>> -      if (!*I) {
>> -        Out << "null";
>> -      } else {
>> -        TypePrinter.print((*I)->getType(), Out);
>> -        Out << ' ';
>> -        WriteAsOperandInternal(Out, *I, TypePrinter, Machine);
>> -      }
>> -
>> -      if (++I != E)
>> -        Out << ", ";
>> -    }
>> -    Out << "}";
>> -    return;
>> -  }
>> -
>>    if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
>>      Out << CE->getOpcodeName();
>>      if (CE->isCompare())
>> @@ -1092,10 +1074,14 @@
>>    TypePrinting TypePrinter;
>>    AssemblyAnnotationWriter *AnnotationWriter;
>>    std::vector<const Type*> NumberedTypes;
>> +
>> +  // Each MDNode is assigned unique MetadataIDNo.
>> +  std::map<const MDNode *, unsigned> MDNodes;
>> +  unsigned MetadataIDNo;
>>  public:
>>    inline AssemblyWriter(raw_ostream &o, SlotTracker &Mac, const Module *M,
>>                          AssemblyAnnotationWriter *AAW)
>> -    : Out(o), Machine(Mac), TheModule(M), AnnotationWriter(AAW) {
>> +    : Out(o), Machine(Mac), TheModule(M), AnnotationWriter(AAW), MetadataIDNo(0) {
>>      AddModuleTypesToPrinter(TypePrinter, NumberedTypes, M);
>>    }
>>
>> @@ -1124,6 +1110,7 @@
>>    void printModule(const Module *M);
>>    void printTypeSymbolTable(const TypeSymbolTable &ST);
>>    void printGlobal(const GlobalVariable *GV);
>> +  void printMDNode(const MDNode *Node, bool StandAlone);
>>    void printAlias(const GlobalAlias *GV);
>>    void printFunction(const Function *F);
>>    void printArgument(const Argument *FA, Attributes Attrs);
>> @@ -1264,6 +1251,28 @@
>>  }
>>
>>  void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
>> +  if (GV->hasInitializer())
>> +    // If GV is initialized using Metadata then separate out metadata
>> +    // operands used by the initializer. Note, MDNodes are not cyclic.
>> +    if (MDNode *N = dyn_cast<MDNode>(GV->getInitializer())) {
>> +      SmallVector<const MDNode *, 4> WorkList;
>> +      // Collect MDNodes used by the initializer.
>> +      for (MDNode::const_elem_iterator I = N->elem_begin(), E = N->elem_end();
>> +        I != E; ++I) {
>> +     const Value *TV = *I;
>> +     if (TV)
>> +       if (const MDNode *NN = dyn_cast<MDNode>(TV))
>> +         WorkList.push_back(NN);
>> +      }
>> +
>> +      // Print MDNodes used by the initializer.
>> +      while (!WorkList.empty()) {
>> +     const MDNode *N = WorkList.back(); WorkList.pop_back();
>> +     printMDNode(N, true);
>> +     Out << '\n';
>> +      }
>> +    }
>> +
>>    if (GV->hasName()) {
>>      PrintLLVMName(Out, GV);
>>      Out << " = ";
>> @@ -1283,7 +1292,10 @@
>>
>>    if (GV->hasInitializer()) {
>>      Out << ' ';
>> -    writeOperand(GV->getInitializer(), false);
>> +    if (MDNode *N = dyn_cast<MDNode>(GV->getInitializer()))
>> +      printMDNode(N, false);
>> +    else
>> +      writeOperand(GV->getInitializer(), false);
>>    }
>>
>>    if (GV->hasSection())
>> @@ -1295,6 +1307,42 @@
>>    Out << '\n';
>>  }
>>
>> +void AssemblyWriter::printMDNode(const MDNode *Node,
>> +                              bool StandAlone) {
>> +  std::map<const MDNode *, unsigned>::iterator MI = MDNodes.find(Node);
>> +  // If this node is already printed then just refer it using its Metadata
>> +  // id number.
>> +  if (MI != MDNodes.end()) {
>> +    Out << "metadata !" << MI->second;
>> +    return;
>> +  }
>> +
>> +  if (StandAlone) {
>> +    // Print standalone MDNode.
>> +    // !42 = !{ ... }
>> +    Out << "!" << MetadataIDNo << " = ";
>> +    Out << "constant metadata ";
>> +  }
>> +  Out << "!{";
>> +  for (MDNode::const_elem_iterator I = Node->elem_begin(), E = Node->elem_end();
>> +       I != E;) {
>> +    const Value *TV = *I;
>> +    if (!TV)
>> +      Out << "null";
>> +    else if (const MDNode *N = dyn_cast<MDNode>(TV))
>> +      printMDNode(N, StandAlone);
>> +    else if (!*I)
>> +      Out << "null";
>> +    else
>> +      writeOperand(*I, true);
>> +    if (++I != E)
>> +      Out << ", ";
>> +  }
>> +  Out << "}";
>> +
>> +  MDNodes[Node] = MetadataIDNo++;
>> +}
>> +
>>  void AssemblyWriter::printAlias(const GlobalAlias *GA) {
>>    // Don't crash when dumping partially built GA
>>    if (!GA->hasName())
>>
>> Added: llvm/trunk/test/Feature/mdnode2.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/mdnode2.ll?rev=74630&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/Feature/mdnode2.ll (added)
>> +++ llvm/trunk/test/Feature/mdnode2.ll Wed Jul  1 14:21:12 2009
>> @@ -0,0 +1,7 @@
>> +; RUN: llvm-as < %s | llvm-dis > %t.ll
>> +; RUN: grep "!0 = constant metadata !{i32 21, i32 22}" %t.ll
>> +; RUN: grep "!1 = constant metadata !{i32 23, i32 24}" %t.ll
>> +; RUN: grep "@llvm.blah = constant metadata !{i32 1000, i16 200, metadata !1, metadata !0}" %t.ll
>> +!0 = constant metadata !{i32 21, i32 22}
>> +!1 = constant metadata !{i32 23, i32 24}
>> + at llvm.blah = constant metadata !{i32 1000, i16 200, metadata !1, metadata !0}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
-
Devang




More information about the llvm-commits mailing list