[cfe-dev] Getting function body from CallExpr (function definition in .h, implementation in .c)

David Come via cfe-dev cfe-dev at lists.llvm.org
Tue Jul 12 23:25:35 PDT 2016


 

Hi, 

The compiler only knows what it has parsed. So unless you parse impl.c
and then merge the AST, you can't get the function's body C. 

Because it is enough for any compiler in main.c to know that  foo is a
function with no argument returning nothing. Its body is irrelevant for
compiling main.c to an object file. You could have its source code (like
you do in your example) or it could be in a library, it only matters
when linking. 

I know the API has some utilities for merging ASTs together
(ASTMergeAction). 

David. 

Le 2016-07-13 03:45, Himanshu via cfe-dev a écrit : 

> Hi All,  
> 
> I have looked thru the previous posts on this topic in the mailing-list archives, and still can't get things to work. Hence the repost --- for which I apologize.  
> 
> I would like to get the body of a called function when visiting a CallExpr.  
> I create a recursive AST visitor, and handle the translation units correctly (to the best of my knowledge), and still am not able to get the body. The function is declared in a header file and implemented in a .c file. For brevity, I am recreating a toy example here:  
> 
> def.h:  
> void foo(); 
> 
> impl.c:  
> #include "def.h" 
> 
> void foo(){ 
> printf("in func foo\n"); 
> } 
> 
> main.c:  
> #include "def.h" 
> 
> int main(){ 
> foo(); 
> } 
> 
> Running my Visitor code here is able to parse the call expression, but returns nullptr on  
> callexpr->getDirectCallee()->getBody(). Similarly, callexpr->getDirectCallee()->hasBody()  
> returns false.  
> Could anyone kindly suggest what should I do?  
> 
> Here is the simplified code for my visitor:  class FVisitor : public RecursiveASTVisitor<FVisitor> {
> public:
> bool VisitCallExpr(CallExpr *C){
> const FunctionDecl *FD = C->getDirectCallee();
> // try both variants of getBody
> if(FD->getBody())
> cout << "found body"<<endl;
> else if(FD->getBody(FD))
> cout << "found body"<<endl;
> return true;
> }
> }; 
> 
> Thanks, 
> 
> -- 
> Himanshu 
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-- 

David Come 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160713/2b9ecd23/attachment.html>


More information about the cfe-dev mailing list