We are implementing points-to analysis in GCC 4.7.2 and need to distinguish between pointers to scalars and the pointers to structures. This distinction by using the TYPE (TREE_TYPE) hierarchy of the tree node of the pointer. We have two questions:
(a) Is it sufficient to check for the presence of RECORD_TYPE in type hierarchy? (b) Is it safe to assume that the RECORD_TYPE always appears as a leaf node in the type description of any pointer to structure? As an example, the tree nodes of a pointer to an integer (y) and a pointer to a structure (f) below. It seems to support our hunch. For example, the tree node of y which is a pointer to an integer is as follows: <var_decl 0x405c8ea0 y type <pointer_type 0x40524a80 type <integer_type 0x40524360 int public SI size <integer_cst 0x40514578 constant 32> unit size <integer_cst 0x40514594 constant 4> align 32 symtab 0 alias set 3 canonical type 0x40524360 precision 32 min <integer_cst 0x405148a4 -2147483648> max <integer_cst 0x405148c0 2147483647> pointer_to_this <pointer_type 0x40524a80>> unsigned SI size <integer_cst 0x40514578 constant 32> unit size <integer_cst 0x40514594 constant 4> align 32 symtab 0 alias set 2 canonical type 0x40524a80 pointer_to_this <pointer_type 0x405cf300>> used static unsigned SI file struct0.c line 15 col 11 size <integer_cst 0x40514578 type <integer_type 0x40524060 bitsizetype> constant 32> unit size <integer_cst 0x40514594 type <integer_type 0x40524000 sizetype> constant 4> align 32 context <translation_unit_decl 0x40529804 D.2319> (mem/f/c:SI (symbol_ref:SI ("y") [flags 0x2] <var_decl 0x405c8ea0 y>) [2 y+0 S4 A32])> _ _ Similarly, the tree node of f which is a pointer to a structure is as follows: <var_decl 0x405c8f60 f type <pointer_type 0x405cf1e0 type <*record_type* 0x405cf060 list BLK size <integer_cst 0x40514c08 constant 96> unit size <integer_cst 0x40514c24 constant 12> align 32 symtab 0 alias set 4 canonical type 0x405cf060 fields <field_decl 0x405220b8 val> context <translation_unit_decl 0x40529804 D.2319> pointer_to_this <pointer_type 0x405cf1e0> chain <type_decl 0x40529870 list>> public unsigned SI size <integer_cst 0x40514578 constant 32> unit size <integer_cst 0x40514594 constant 4> align 32 symtab 0 alias set 2 canonical type 0x405cf1e0 pointer_to_this <pointer_type 0x405cf5a0>> used static unsigned SI file struct0.c line 14 col 25 size <integer_cst 0x40514578 type <integer_type 0x40524060 bitsizetype> constant 32> unit size <integer_cst 0x40514594 type <integer_type 0x40524000 sizetype> constant 4> align 32 context <translation_unit_decl 0x40529804 D.2319> (mem/f/c:SI (symbol_ref:SI ("f") [flags 0x2] <var_decl 0x405c8f60 f>) [2 f+0 S4 A32])> Thanks and regards, Uday Khedker.