[cfe-dev] libtooling fails to traverse TranslationUnitDecl

Manasij Mukherjee manasij7479 at gmail.com
Sun Jan 4 00:16:47 PST 2015


Your code works in clang 3.5 after making the API changes.
Not sure why it does not in your version.
Maybe upgrade ?

On Sat, Jan 3, 2015 at 8:46 PM, Manuel Klimek <klimek at google.com> wrote:

> At a first glance this looks like it should work.
>
> On Mon Dec 29 2014 at 7:26:26 AM xiaohui chen <xchen198812 at gmail.com>
> wrote:
>
>> sorry, i  forget to attach my test.c file
>> ===================
>> void do_math() {
>> }
>>
>>
>> On Sun, Dec 28, 2014 at 11:46 PM, xiaohui chen <xchen198812 at gmail.com>
>> wrote:
>>
>>> HI there:
>>>
>>> My clang is 3.4.1 . I have a very simple libtooling code which just
>>> visit the functiondecl.
>>> but   function "bool VisitFunctionDecl(FunctionDecl *func)" is never
>>> called in line 35, who can answer me?
>>>
>>> please see the following output, even i can output the AST in line 53.
>>>
>>>
>>> ===============================================================================
>>>  llvm/tools/clang/tools/example$ ./Example test.c --
>>> TranslationUnitDecl 0x3225610 <<invalid sloc>><look for declarations>
>>> |-TypedefDecl 0x3225b20 <<invalid sloc>> __int128_t '__int128'<look for
>>> declarations>
>>> |-TypedefDecl 0x3225b80 <<invalid sloc>> __uint128_t 'unsigned
>>> __int128'<look for declarations>
>>> |-TypedefDecl 0x3225ed0 <<invalid sloc>> __builtin_va_list
>>> '__va_list_tag [1]'<look for declarations>
>>> `-FunctionDecl 0x3225f70
>>> </home/xiaohui/llvm/llvm/tools/clang/tools/example/test.c:1:1, line:2:1>
>>> do_math 'void ()'
>>>   `-CompoundStmt 0x3226018 <line:1:16, line:2:1>
>>>
>>> Found 0 functions.
>>>
>>>
>>> ===============================================================================
>>>
>>> 1 #include "clang/Driver/Options.h"
>>>   2 #include "clang/AST/AST.h"
>>>   3 #include "clang/AST/ASTContext.h"
>>>   4 #include "clang/AST/ASTConsumer.h"
>>>   5 #include "clang/AST/RecursiveASTVisitor.h"
>>>   6 #include "clang/Frontend/ASTConsumers.h"
>>>   7 #include "clang/Frontend/FrontendActions.h"
>>>   8 #include "clang/Frontend/CompilerInstance.h"
>>>   9 #include "clang/Tooling/CommonOptionsParser.h"
>>>  10 #include "clang/Tooling/Tooling.h"
>>>  11 #include "clang/Rewrite/Core/Rewriter.h"
>>>  12 #include "llvm/Support/raw_ostream.h"
>>>  13
>>>  14 using namespace std;
>>>  15 using namespace clang;
>>>  16 using namespace clang::driver;
>>>  17 using namespace clang::tooling;
>>>  18 using namespace llvm;
>>>  19
>>>  20 Rewriter rewriter;
>>>  21 int numFunctions = 0;
>>>  22
>>>  23
>>>  24 class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> {
>>>  25 private:
>>>  26     ASTContext *astContext; // used for getting additional AST info
>>>  27
>>>  28 public:
>>>  29     explicit ExampleVisitor(CompilerInstance *CI)
>>>  30       : astContext(&(CI->getASTContext())) // initialize private
>>> members
>>>  31     {
>>>  32         rewriter.setSourceMgr(astContext->getSourceManager(),
>>> astContext->getLangOpts());
>>>  33     }
>>>  34
>>>  35      bool VisitFunctionDecl(FunctionDecl *func) {
>>>  36         numFunctions++;
>>>  37         return true;
>>>  38     }
>>> 39 };
>>>  40
>>>  41 class ExampleASTConsumer : public ASTConsumer {
>>>  42 private:
>>>  43     ExampleVisitor *visitor; // doesn't have to be private
>>>  44
>>>  45 public:
>>>  46     // override the constructor in order to pass CI
>>>  47     explicit ExampleASTConsumer(CompilerInstance *CI)
>>>  48         : visitor(new ExampleVisitor(CI)) // initialize the visitor
>>>  49     { }
>>>  50
>>>  51     // override this to call our ExampleVisitor on the entire source
>>> file
>>>  52     virtual void HandleTranslationUnit(ASTContext &Context) {
>>>  53            Context.getTranslationUnitDecl()->dump();
>>>  54
>>>  55       visitor->TraverseDecl(Context.getTranslationUnitDecl());
>>>  56     }
>>>  57
>>>  58 };
>>>  59
>>>  60 class ExampleFrontendAction : public ASTFrontendAction {
>>>  61 public:
>>>  62     virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
>>> StringRef file) {
>>>  63         return new ExampleASTConsumer(&CI); // pass CI pointer to
>>> ASTConsumer
>>>  64     }
>>>  65 };
>>>  66
>>>  67 int main(int argc, const char **argv) {
>>>  68     CommonOptionsParser op(argc, argv);
>>>  69     ClangTool Tool(op.getCompilations(), op.getSourcePathList());
>>>  70
>>>  71     int result =
>>> Tool.run(newFrontendActionFactory<ExampleFrontendAction>());
>>>  72
>>>  73     errs() << "\nFound " << numFunctions << " functions.\n\n";
>>>  74     return result;
>>>  75 }
>>>
>>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150104/8b1ce5e8/attachment.html>


More information about the cfe-dev mailing list