Correspondence between AST and the CFG


I am just curious to find out whether any correspondence between AST nodes and CFG is maintained in clang ? For instance, is it possible to find out once a CFG is generated, what nodes in the CFG correspond to a CompoundStmt node in the AST ? I guess this correspondence will be blurred once more and more transformations are done the CFG, but if one is interested in only doing an analysis on the CFG based on some information available from the AST (for instance analyzing flow information on those CFG nodes that correspond to certain CompoundStmts, or certain try… catch sequences), is there a simple way to do it ?


Hi Prakash,

When you say "CFG", are you talking about the LLVM IR or the source-level CFGs that clang supports for some warnings and static analysis? For the latter, the source-level CFGs are just a layer on top of the original ASTs; the elements of the basic blocks are the original AST nodes.


Hi Ted,

I meant the latter. I was earlier under the impression that the CFG class, used in clang, was a layer over the LLVM IR. Thanks for the clarification (and also the doc:

One last question: is it possible to do basic block replication (and hence the underlying AST node duplication and the resulting LLVM IR generation) using the CFG class in clang, or is it a read-only structure, meant only for analysis and not transformation ?


It’s meant solely for analysis; we will eventually, but have not yet, write better APIs for transforming ASTs.


Exactly. If you want to update the CFG for a transformed AST, just build a new CFG. It’s solely meant to encode the control-flow semantics of a provided AST.