On Wed, Apr 13, 2005 at 01:55:07PM -0700, James E Wilson wrote: > Martin Koegler wrote: > > tree type = TREE_TYPE (*node); > > tree attr = tree_cons (name, args, TYPE_ATTRIBUTES (type)); > > tree newtype = build_type_attribute_variant (type, attr); > > TYPE_MAIN_VARIANT (newtype) = TYPE_MAIN_VARIANT (type); > > TREE_TYPE (*node) = newtype; > > You shouldn't be trying to build your own types in a machine dependent > attribute handler function. The compiler's type system is determined by > front-ends mainly, and some middle-end infrastructure, and isn't your > domain to mess with. This stuff is subject to change, at which point > your code may break. > > There are a number of subtleties in the type system relating to arrays, > so it isn't surprising that you are having trouble with them. For > instance, you can't apply some kinds of type modifiers to array types, > they have to be applied to the array element types instead. > > I think the problem with your code is that you are setting > TYPE_MAIN_VARIANT to point at the original type. TYPE_MAIN_VARIANT is > only supposed to be used in the presence of type qualifiers like const > and volatile, to point at the unqualified type. But you have no type > qualifiers here, and hence TYPE_MAIN_VARIANT should point at itself.
I changed the attribute handler to only return NULL_TREE in any case, but the result is still the same (using the same gcc core). The problem seems to be, that in the code gen_type_die (type, context_die); /* We have to get the type_main_variant here (and pass that to the `lookup_type_die' routine) because the ..._TYPE node we have might simply be a *copy* of some original type node (where the copy was created to help us keep track of typedef names) and that copy might have a different TYPE_UID from the original ..._TYPE node. */ if (TREE_CODE (type) != VECTOR_TYPE) mod_type_die = lookup_type_die (type_main_variant (type)); gen_type_type does not change TYPE_SYMTAB_DIE(type), so the following lookup fails (type has the same value as type_main_variant (type)). gen_type_die does the following in this case: gen_type_die calls gen_decl_die (TYPE_NAME (type), context_die). gen_decl_die calls gen_typedef_die passing TYPE_NAME(type) (which is the GROUP9_T). gen_typedef_die immediatly returns, because this type has already been written. Here dumps of the types, while compiling typedef unsigned char GROUP9_T[3]; typedef GROUP9_T EGROUP9_T __attribute ((eeprom)); with dwarf2 debugging output. When calling, the attribute handler, the type looks so: Breakpoint 1, m68hc05_handle_eeprom_attribute (node=0xb7f51220, name=0xb7f74bc8, args=0x0, flags=0, no_add_attrs=0xbff60c8b "") at ../.././gcc/config/m68hc05/m68hc05.c:1690 1690 return NULL_TREE; (gdb) call debug_tree(*node) <array_type 0xb7f14e58 GROUP9_T type <integer_type 0xb7f081b0 unsigned char asm_written public unsigned QI size <integer_cst 0xb7eff0f0 constant invariant 8> unit size <integer_cst 0xb7eff108 constant invariant 1> align 8 symtab -1208530080 alias set -1 precision 8 min <integer_cst 0xb7eff168 0> max <integer_cst 0xb7eff180 255> pointer_to_this <pointer_type 0xb7f140d8>> BLK size <integer_cst 0xb7eff0c0 type <integer_type 0xb7f080d8 bit_size_type> constant invariant 24> unit size <integer_cst 0xb7eff018 type <integer_type 0xb7f0806c short unsigned int> constant invariant 3> align 8 symtab -1208567256 alias set -1 domain <integer_type 0xb7f08000 type <integer_type 0xb7f0806c short unsigned int public unsigned sizetype HI size <integer_cst 0xb7eff1f8 constant invariant 16> unit size <integer_cst 0xb7eff210 constant invariant 2> align 8 symtab -1208530132 alias set -1 precision 16 min <integer_cst 0xb7eff240 0> max <integer_cst 0xb7eff1e0 65535>> HI size <integer_cst 0xb7eff1f8 16> unit size <integer_cst 0xb7eff210 2> align 8 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7eff090 0> max <integer_cst 0xb7eff210 2>>> In modified_type_die, the qualified type looks so: (gdb) call debug_tree(qualified_type) <array_type 0xb7f51288 GROUP9_T type <integer_type 0xb7f081b0 unsigned char asm_written public unsigned QI size <integer_cst 0xb7eff0f0 constant invariant 8> unit size <integer_cst 0xb7eff108 constant invariant 1> align 8 symtab -1208530080 alias set -1 precision 8 min <integer_cst 0xb7eff168 0> max <integer_cst 0xb7eff180 255> pointer_to_this <pointer_type 0xb7f140d8>> BLK size <integer_cst 0xb7eff0c0 type <integer_type 0xb7f080d8 bit_size_type> constant invariant 24> unit size <integer_cst 0xb7eff018 type <integer_type 0xb7f0806c short unsigned int> constant invariant 3> align 8 symtab 0 alias set -1 attributes <tree_list 0xb7f77438 purpose <identifier_node 0xb7f74bc8 eeprom>> domain <integer_type 0xb7f08000 type <integer_type 0xb7f0806c short unsigned int public unsigned sizetype HI size <integer_cst 0xb7eff1f8 constant invariant 16> unit size <integer_cst 0xb7eff210 constant invariant 2> align 8 symtab -1208530132 alias set -1 precision 16 min <integer_cst 0xb7eff240 0> max <integer_cst 0xb7eff1e0 65535>> HI size <integer_cst 0xb7eff1f8 16> unit size <integer_cst 0xb7eff210 2> align 8 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7eff090 0> max <integer_cst 0xb7eff210 2>>> The typename of the type looks: (gdb) call debug_tree(type_name) <type_decl 0xb7f146c0 GROUP9_T type <array_type 0xb7f14e58 GROUP9_T type <integer_type 0xb7f081b0 unsigned char asm_written public unsigned QI size <integer_cst 0xb7eff0f0 constant invariant 8> unit size <integer_cst 0xb7eff108 constant invariant 1> align 8 symtab -1208530080 alias set -1 precision 8 min <integer_cst 0xb7eff168 0> max <integer_cst 0xb7eff180 255> pointer_to_this <pointer_type 0xb7f140d8>> BLK size <integer_cst 0xb7eff0c0 constant invariant 24> unit size <integer_cst 0xb7eff018 constant invariant 3> align 8 symtab -1208567256 alias set -1 domain <integer_type 0xb7f08000 type <integer_type 0xb7f0806c short unsigned int> HI size <integer_cst 0xb7eff1f8 constant invariant 16> unit size <integer_cst 0xb7eff210 constant invariant 2> align 8 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7eff090 0> max <integer_cst 0xb7eff210 2>>> asm_written VOID file x.c line 1 align 1 result <array_type 0xb7f11144 type <integer_type 0xb7f081b0 unsigned char> asm_written BLK size <integer_cst 0xb7eff0c0 24> unit size <integer_cst 0xb7eff018 3> align 8 symtab -1208530236 alias set -1 domain <integer_type 0xb7f08000>>> DECL_ORIGINAL_TYPE (TYPE_NAME (qualified_type)) is <array_type 0xb7f11144 type <integer_type 0xb7f081b0 unsigned char asm_written public unsigned QI size <integer_cst 0xb7eff0f0 constant invariant 8> unit size <integer_cst 0xb7eff108 constant invariant 1> align 8 symtab -1208530080 alias set -1 precision 8 min <integer_cst 0xb7eff168 0> max <integer_cst 0xb7eff180 255> pointer_to_this <pointer_type 0xb7f140d8>> asm_written BLK size <integer_cst 0xb7eff0c0 type <integer_type 0xb7f080d8 bit_size_type> constant invariant 24> unit size <integer_cst 0xb7eff018 type <integer_type 0xb7f0806c short unsigned int> constant invariant 3> align 8 symtab -1208530236 alias set -1 domain <integer_type 0xb7f08000 type <integer_type 0xb7f0806c short unsigned int public unsigned sizetype HI size <integer_cst 0xb7eff1f8 constant invariant 16> unit size <integer_cst 0xb7eff210 constant invariant 2> align 8 symtab -1208530132 alias set -1 precision 16 min <integer_cst 0xb7eff240 0> max <integer_cst 0xb7eff1e0 65535>> HI size <integer_cst 0xb7eff1f8 16> unit size <integer_cst 0xb7eff210 2> align 8 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7eff090 0> max <integer_cst 0xb7eff210 2>>> The TYPE_MAIN_VARIANT is: (gdb) call debug_tree(type->type.main_variant) <array_type 0xb7f51288 GROUP9_T type <integer_type 0xb7f081b0 unsigned char asm_written public unsigned QI size <integer_cst 0xb7eff0f0 constant invariant 8> unit size <integer_cst 0xb7eff108 constant invariant 1> align 8 symtab -1208530080 alias set -1 precision 8 min <integer_cst 0xb7eff168 0> max <integer_cst 0xb7eff180 255> pointer_to_this <pointer_type 0xb7f140d8>> BLK size <integer_cst 0xb7eff0c0 type <integer_type 0xb7f080d8 bit_size_type> constant invariant 24> unit size <integer_cst 0xb7eff018 type <integer_type 0xb7f0806c short unsigned int> constant invariant 3> align 8 symtab 0 alias set -1 attributes <tree_list 0xb7f77438 purpose <identifier_node 0xb7f74bc8 eeprom>> domain <integer_type 0xb7f08000 type <integer_type 0xb7f0806c short unsigned int public unsigned sizetype HI size <integer_cst 0xb7eff1f8 constant invariant 16> unit size <integer_cst 0xb7eff210 constant invariant 2> align 8 symtab -1208530132 alias set -1 precision 16 min <integer_cst 0xb7eff240 0> max <integer_cst 0xb7eff1e0 65535>> HI size <integer_cst 0xb7eff1f8 16> unit size <integer_cst 0xb7eff210 2> align 8 symtab 0 alias set -1 precision 16 min <integer_cst 0xb7eff090 0> max <integer_cst 0xb7eff210 2>>> mfg Martin Kögler [EMAIL PROTECTED] PS: Please CC me on replies.