libclang CXCursors隐藏了openmp指令的主体吗?

我试图为openmp代码编写一个linter,但是libclang隐藏了openmp指令的主体。我的问题与llvm邮件列表中的this未回答问题相同。

我看了看clang的文本ast-dump,似乎需要我提供的信息。但是,当我使用二进制转储创建一个CXCursor以使用libclang库在树上进行迭代时,openmp指令捕获的子树似乎变成了“未公开的语句”。

我尝试使用clang的parseTranslationUnit函数在内部生成AST,但结果是相同的。这是libclang的限制,还是我做错了什么?以下是我的代码的快照,文本AST转储以及用于生成它的命令,以及通过使用libclang进行AST操作获得的输出。谢谢!

AST Walker:

#include <iostream>
#include <stdlib.h>
#include <clang-c/Index.h>
using namespace std;

int main(int argc,char** argv)
{
  CXIndex index = clang_createIndex(0,0);
  CXTranslationUnit unit = clang_createTranslationUnit(index,argv[1]); //.ast filename
  if (unit == nullptr)
  {
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }
  printf("%d\n",clang_getNumDiagnostics(unit));
  for (unsigned I = 0,N = clang_getNumDiagnostics(unit); I != N; ++I) { 
    CXDiagnostic Diag = clang_getDiagnostic(unit,I);
    CXString String = clang_formatDiagnostic(Diag,clang_defaultDiagnosticDisplayOptions());
    fprintf(stderr,"%s\n",clang_getcString(String));
    clang_disposeString(String);
}
  CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,[](CXCursor c,CXCursor parent,CXClientData client_data)
    {
      if(clang_Location_isFromMainFile(clang_getcursorLocation(c))){
        unsigned loc = -1;
        clang_getExpansionLocation(clang_getcursorLocation(c),NULL,&loc,NULL);
        printf("%d: ",loc);
        cout << clang_getcString(clang_getcursorSpelling(c))<< '+' << clang_getcString(clang_getcursorKindSpelling(clang_getcursorKind(c))) << endl;
      }
      return CXChildVisit_Recurse;
    },nullptr);
  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
}

测试文件:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc,char *argv[]) 
{
int nthreads,tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel
  {

  /* Obtain thread number */
  tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n",tid);

  /* Only master thread does this */
  if (tid == 0) 
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n",nthreads);
    }

  }  /* All threads join master thread and disband */

}

文本AST:

`-FunctionDecl 0x7fbcd785a140 <helloworld.c:17:1,line:38:1> line:17:5 main 'int (int,char **)'
  |-ParmVarDecl 0x7fbcd7859f38 <col:11,col:15> col:15 argc 'int'
  |-ParmVarDecl 0x7fbcd785a020 <col:21,col:32> col:27 argv 'char **':'char **'
  `-CompoundStmt 0x7fbcd785cd18 <line:18:1,line:38:1>
    |-DeclStmt 0x7fbcd785a308 <line:19:1,col:18>
    | |-VarDecl 0x7fbcd785a208 <col:1,col:5> col:5 used nthreads 'int'
    | `-VarDecl 0x7fbcd785a288 <col:1,col:15> col:15 used tid 'int'
    `-OMPParallelDirective 0x7fbcd785cce0 <line:22:1,col:44>
      |-OMPPrivateclause 0x7fbcd785c538 <col:22,col:43>
      | |-DeclRefExpr 0x7fbcd785a320 <col:30> 'int' lvalue Var 0x7fbcd785a208 'nthreads' 'int'
      | `-DeclRefExpr 0x7fbcd785a340 <col:40> 'int' lvalue Var 0x7fbcd785a288 'tid' 'int'
      `-CapturedStmt 0x7fbcd785ccb8 <line:23:3,line:36:3>
        `-CapturedDecl 0x7fbcd785c650 <<invalid sloc>> <invalid sloc> nothrow
          |-CompoundStmt 0x7fbcd785cc90 <line:23:3,line:36:3> openmp_structured_block
          | |-BinaryOperator 0x7fbcd785c8f0 <line:26:3,col:28> 'int' '='
          | | |-DeclRefExpr 0x7fbcd785c848 <col:3> 'int' lvalue Var 0x7fbcd785a288 'tid' 'int'
          | | `-CallExpr 0x7fbcd785c8d0 <col:9,col:28> 'int'
          | |   `-ImplicitCastExpr 0x7fbcd785c8b8 <col:9> 'int (*)(void)' <FunctionToPointerDecay>
          | |     `-DeclRefExpr 0x7fbcd785c868 <col:9> 'int (void)' Function 0x7fbcd781f590 'omp_get_thread_num' 'int (void)'
          | |-CallExpr 0x7fbcd785c9d0 <line:27:3,col:47> 'int'
          | | |-ImplicitCastExpr 0x7fbcd785c9b8 <col:3> 'int (*)(const char *,...)' <FunctionToPointerDecay>
          | | | `-DeclRefExpr 0x7fbcd785c910 <col:3> 'int (const char *,...)' Function 0x7fbcd7847550 'printf' 'int (const char *,...)'
          | | |-ImplicitCastExpr 0x7fbcd785ca18 <col:10> 'const char *' <NoOp>
          | | | `-ImplicitCastExpr 0x7fbcd785ca00 <col:10> 'char *' <ArrayToPointerDecay>
          | | |   `-StringLiteral 0x7fbcd785c930 <col:10> 'char [30]' lvalue "Hello World from thread = %d\n"
          | | `-ImplicitCastExpr 0x7fbcd785ca30 <col:44> 'int' <LValueToRValue>
          | |   `-DeclRefExpr 0x7fbcd785c968 <col:44> 'int' lvalue Var 0x7fbcd785a288 'tid' 'int'
          | `-IfStmt 0x7fbcd785cc78 <line:30:3,line:34:5>
          |   |-BinaryOperator 0x7fbcd785caa0 <line:30:7,col:14> 'int' '=='
          |   | |-ImplicitCastExpr 0x7fbcd785ca88 <col:7> 'int' <LValueToRValue>
          |   | | `-DeclRefExpr 0x7fbcd785ca48 <col:7> 'int' lvalue Var 0x7fbcd785a288 'tid' 'int'
          |   | `-IntegerLiteral 0x7fbcd785ca68 <col:14> 'int' 0
          |   `-CompoundStmt 0x7fbcd785cc58 <line:31:5,line:34:5>
          |     |-BinaryOperator 0x7fbcd785cb38 <line:32:5,col:36> 'int' '='
          |     | |-DeclRefExpr 0x7fbcd785cac0 <col:5> 'int' lvalue Var 0x7fbcd785a208 'nthreads' 'int'
          |     | `-CallExpr 0x7fbcd785cb18 <col:16,col:36> 'int'
          |     |   `-ImplicitCastExpr 0x7fbcd785cb00 <col:16> 'int (*)(void)' <FunctionToPointerDecay>
          |     |     `-DeclRefExpr 0x7fbcd785cae0 <col:16> 'int (void)' Function 0x7fbcd781f090 'omp_get_num_threads' 'int (void)'
          |     `-CallExpr 0x7fbcd785cbe0 <line:33:5,col:48> 'int'
          |       |-ImplicitCastExpr 0x7fbcd785cbc8 <col:5> 'int (*)(const char *,...)' <FunctionToPointerDecay>
          |       | `-DeclRefExpr 0x7fbcd785cb58 <col:5> 'int (const char *,...)'
          |       |-ImplicitCastExpr 0x7fbcd785cc28 <col:12> 'const char *' <NoOp>
          |       | `-ImplicitCastExpr 0x7fbcd785cc10 <col:12> 'char *' <ArrayToPointerDecay>
          |       |   `-StringLiteral 0x7fbcd785cb78 <col:12> 'char [24]' lvalue "Number of threads = %d\n"
          |       `-ImplicitCastExpr 0x7fbcd785cc40 <col:40> 'int' <LValueToRValue>

生成AST的命令(将二进制文件更改为“ emit-ast”):

clang -fopenmp -Xclang -ast-dump -L/usr/local/lib helloworld.c

程序输出:

0
13: omp.h+inclusion directive
14: stdio.h+inclusion directive
15: stdlib.h+inclusion directive
17: main+FunctionDecl
17: argc+ParmDecl
17: argv+ParmDecl
18: +CompoundStmt
19: +DeclStmt
19: nthreads+VarDecl
19: tid+VarDecl
22: +OMPParallelDirective
23: +UnexposedStmt
26: tid+DeclRefExpr
32: nthreads+DeclRefExpr
kyj09 回答:libclang CXCursors隐藏了openmp指令的主体吗?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3113310.html

大家都在问