Clang Ast Получить атрибут Cinit для детей, которые инициализируют узел - PullRequest
0 голосов
/ 16 мая 2019

У меня есть следующий простой код C

int result1 = 1;
int result2 = 2;

void *p[] =
{
    &result1,
    &result2
};

result1 и result2 инициализируют массив p своими адресами.Дамп AST, использующий clang, для этого кода:

TranslationUnitDecl 0x5581fd31a1d8 <<invalid sloc>> <invalid sloc>
|-VarDecl 0x5581fd31ae68 <1.c:2:1, col:15> col:5 used result1 'int' cinit
| `-IntegerLiteral 0x5581fd373e40 <col:15> 'int' 1
|-VarDecl 0x5581fd373e78 <line:3:1, col:15> col:5 used result2 'int' cinit
| `-IntegerLiteral 0x5581fd373ed8 <col:15> 'int' 2
`-VarDecl 0x5581fd373f50 <line:5:1, line:9:1> line:5:7 p 'void *[2]' cinit
  `-InitListExpr 0x5581fd3740c0 <line:6:1, line:9:1> 'void *[2]'
    |-ImplicitCastExpr 0x5581fd374100 <line:7:5, col:6> 'void *' <BitCast>
    | `-UnaryOperator 0x5581fd374008 <col:5, col:6> 'int *' prefix '&'
    |   `-DeclRefExpr 0x5581fd373fb0 <col:6> 'int' lvalue Var 0x5581fd31ae68 'result1' 'int'
    `-ImplicitCastExpr 0x5581fd374120 <line:8:5, col:6> 'void *' <BitCast>
      `-UnaryOperator 0x5581fd374050 <col:5, col:6> 'int *' prefix '&'
        `-DeclRefExpr 0x5581fd374028 <col:6> 'int' lvalue Var 0x5581fd373e78 'result2' 'int'

в дампе ast мы видим, что p имеет атрибут cinit (инициализация в стиле C с присваиванием.), Но инициализаторы - это его дети.Я хотел бы знать, есть ли "простой" способ использования clang API для получения для такого узла cinit дочерних элементов, которые его инициализируют?Узлы, которые инициализируют этот узел, не являются его дочерними, а являются потомками.

Я не хочу проверять для каждого DeclRefExpr, если один из его родителей имеет атрибут cinit.В большой базе кода это может повлиять на производительность обхода AST.

...