I’m working with LLVM/Clang and I’m trying to use the clang::CodeGenOptions::EmitDeclMetadata feature. There really arnt docs for anything like this so thanks to lldb/Expression/ClangExpressionParser.cpp I now know how to enable this feature. Can anyone point me to a usage of this? I’m not entirely sure how it should work and nothing stood out to me.
We typically enable a certain set of options by default with our expression parser by setting the hard coded option manually. See the "ClangExpressionParser::ClangExpressionParser(...)" constructor functions. If you look at the current sources we currently enable this:
238 // Set CodeGen options
239 m_compiler->getCodeGenOpts().EmitDeclMetadata = true;
240 m_compiler->getCodeGenOpts().InstrumentFunctions = false;
Sorry, guess I should of been more specific. Those lines I found, Im just not sure how they are used.
After those are enabled, how could something like a Pass take advantage of it and get a Decl for something it finds? I browsed the code and didnt notice anything special for this, not sure what I missing.
I am not sure what this answer that one, I think the llvm mailing lists would be much better able to answer your question.
EmitDeclMetadata generates a mapping from values in the IR that Clang emits to their original Clang ASTs. In an expression like
(lldb) expr a
Clang asks LLDB about “a” and LLDB returns a variety of Decls (maybe one for a(), a function, and one for a, a variable). Clang sorts out which one it needs, and uses the metadata to indicate which Decl it actually ended up using. Later when LLDB sees the Decl in the metadata for the emitted IR, it can use ClangExpressionDeclMap to locate the corresponding LLDB entity (say, a VariableSP), and use information about that entity when actually running the expression.
InstrumentFunctions was (and may still be) enabled by default, and added calls to __cyg_profile_func_enter/__cyg_profile_func_exit at the boundaries of each emitted function. We have no use for these calls, and they were generating undefined references. I disabled them.
Sorry for the delay.
Unfortunately the LLVM/Clang mailing list and IRC channel is not much help, no one seems to be familiar with this functionality. I’m trying to use this in a Pass and I’m assuming I would need to call CodeGen a 2nd time(since I doubt I could set that option in time before its ran), but I dont understand any potential consequences from this.
Any advice? Anyone happen to know of some code where this is being done(I’m not entirely sure how to call CodeGen again)?