Can creating new forms of debug info metadata be simplified?

Hi list,

Let’s talk about adding a new type of debug info metadata. Here are the steps (at minimum - probably incomplete) one needs to take:

  1. Create a new class in the hierarchy
  2. Implement two forms of MD_NODE_GET
  3. Specialize MDNodeKeyImpl
  4. Modify LLParser.cpp and add serialization code for your special type
  5. Modify AsmWriter.cpp and add serialization code for your special type

I believe we can accomplish everything needed for debug info with just step 1 using a pattern found in Boost Serialization. Imagine a new API based on this concept:

class DIMyFancyType : public MDNode {
  StringRef FileName;

  template<typename Visitor>
  void visit(Visitor & v) {
     DINode::visit(s); // or not, if you stay true to boost.serialization
     v.name("DIMyFancyType");
     v.property("FileName",FileName);
  }
};

With this, we could implement steps 2-5 using a little bit of template meta-programming and we could also implement escape hatches where needed to get more specific, allowing us to keep many things in one place.

I imagine since there is now a .def file for the metadata (very useful!) that this is on somebody’s mind and not just my own, so I’m curious about what people think. I realize that “new forms of debug metadata” is possibly not a very popular use case as there has been only one new kind added in the last few years. However, in my humble opinion, it would make it easier to add richer information allowing those of us extending LLVM to create better debuggers/debugging experiences.

Thanks for your time!