Hi folks. Under Diego's loving whip, I've been taking a look at GIMPLE tuples, and have come up with a possible layout for the data structures representing the tuples. It's a mix between what Mark and Diego's originally suggested along with a few other things ;-).
Still missing are labels and gimple temporaries, but this should get the ball going. I'm anxious to see what people think and suggest. Cheers. Aldy /* All tree structures, including the gimple IL, derive from this base structure. */ struct tree_base GTY(()) { ENUM_BITFIELD(tree_code) code : 8; unsigned side_effects_flag : 1; unsigned constant_flag : 1; unsigned addressable_flag : 1; unsigned volatile_flag : 1; unsigned readonly_flag : 1; unsigned unsigned_flag : 1; unsigned asm_written_flag: 1; unsigned nowarning_flag : 1; unsigned used_flag : 1; unsigned nothrow_flag : 1; unsigned static_flag : 1; unsigned public_flag : 1; unsigned private_flag : 1; unsigned protected_flag : 1; unsigned deprecated_flag : 1; unsigned invariant_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; unsigned lang_flag_3 : 1; unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned visited : 1; }; /* This structure is for generic trees. */ struct tree_common GTY(()) { struct tree_base base; tree chain; tree type; union tree_ann_d *ann; }; /* Gimple statements. This includes modify statements (what GENERIC calls MODIFY_EXPR), labels, calls, gotos, etc, as well as OpenMP directives. */ struct gimple_stmt GTY(()) { struct tree_base base; source_locus locus; struct tree_base *operands[1]; }; /* Gimple expressions. This includes binary and unary expressions, and conditional expressions. */ struct gimple_expr GTY(()) { struct tree_base base; tree type; struct gimple_expr *operands[1]; }; /* OpenMP clauses (error, private, shared, etc). */ struct gimple_omp_clause GTY(()) { struct tree_base base; enum omp_clause_code code; union omp_clause_subcode { enum omp_clause_default_kind default_kind; enum omp_clause_schedule_kind schedule_kind; enum tree_code reduction_code; } GTY ((skip)) subcode; struct tree_base ops[1]; }; /* Gimple SSA names. This is the similar to ``tree_ssa_name'' in GENERIC except we save a `tree_ann_d', and a `type'. We also move `ptr_info' and `value_handle' to on-the-side arrays indexed by SSA names (or hash tables). */ struct gimple_ssa_name { struct tree_base base; tree var; /* `type' is in TREE_TYPE (var) */ struct gimple_stmt def_stmt; unsigned int version; struct ssa_use_operand_d imm_uses; };