I've used Clang to compile a function with debug information enabled. For Instruction
s there's the handy getDebugLoc()
, but there's no such thing for Function
s. Given a Function
instance, how can I get the debug information (I'm guessing in DISubProgram
form) for it?
I've seen the guide entry explaining how that debug information is represented, and the metadata does contain a link back to the function, but there's apparently no link back. Am I supposed to iterate over all the metadata in the module?
I think you need to use the DebugInfoFinder. Here is a sample code:
DebugInfoFinder Finder;
Finder.processModule(M);
for (DebugInfoFinder::iterator i = Finder.subprogram_begin(),
e = Finder.subprogram_end();
i != e; ++i) {
DISubprogram S(*i);
if (S.getFunction() == F) {
errs() << S.getLineNumber(); << "\n";
}
}
where F is the function you are looking for.
you can use getSubprogram() as describled in doxygen: Function class
I don't think there's currently an easier way. There used to be a global metadata node that collected all function metadata entries (llvm.dbg.sp
) but it was removed a while ago in favor of llvm.dbg.cu
which reflects the DWARF structure more closely.
I suppose that the common uses of debug metadata don't require by-function lookup, and any extra information that could be removed, was removed, because saving space is important and metadata in IR is already way too big.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With