Как получить имя битового поля, на которое ссылается BIT_FIELD_REF? - PullRequest
4 голосов
/ 17 февраля 2012

Я хочу получить имя поля, с которым оно было объявлено, из представления GENERIC.У меня есть дерево BIT_FIELD_REF, и DECL_NAME равно нулю.Например,

struct {
    int a;
    unsigned b:1;
} s;

...
if (s.b)
    ...

Для sb я получу BIT_FIELD_REF, и нет очевидного способа получить «b», которое является исходным именем поля.Как это сделать?

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Попробуйте call debug_c_tree (tree_var) или call debug_tree (tree_var) из GDB и посмотрите, знает ли это имя.Если это так, перепроектируйте симпатичный принтер.

0 голосов
/ 02 марта 2012

Что именно я делал: исследуя вещи в tree-dump.c В итоге я понял, что имена битовых полей, в которых они известны, происходят из DIE структуры и их трудно отследить.

Тогда я решилчтобы получить имя из типа BIT_FIELD_REF аргумент 0 (ссылка на структуру), который является RECORD_TYPE и в нем хранятся размеры и смещения всех полей.

Проблема заключалась в том, чтобы понять, что BIT_FIELD_REF не делает 't ссылается на сами биты: он используется как BIT_FIELD_REF & INTEGER_CST, где константа действует как маска.Поняв это, я быстро вычислил смещения и получил имя от типа.

...