As a precondition for other compile speed improvements, I've been rewriting the way that GCC represents attributes. The result is a medium-size patch that touches every language and many targets (a surprising number of targets don't define any special attributes at all). The basic principle is that DECL_ATTRIBUTES and TREE_ATTRIBUTES now point to an attribute_list: /* A structure representing 'attributes' on a DECL or TYPE node. Each attribute has a NAME (an IDENTIFIER_NODE) and possibly a VALUE. */ struct one_attribute GTY(()) { tree name; tree value; }; /* A counted list of attributes. */ struct attribute_list_s GTY(()) { attribute_count n_attributes; /* There are 16 bits free here. */ struct one_attribute GTY((length ("%h.n_attributes"))) attribs[1]; }; This has many benefits, mostly flowing from the fact that it's not a TREE_LIST any more. 1. Do we think this would be acceptable for stage 3, or should I make a branch? 2. Would anyone be interested in helping me test it, especially on the more difficult architectures like alpha-vms or i386-netware? diffstat on my current patch looks like: ada/gigi.h | 2 ada/utils.c | 2 attribs.c | 347 ++++++++++++++++++++++++++------------------- builtin-attrs.def | 62 +++----- c-common.c | 116 +++++++++------ c-common.h | 4 c-decl.c | 76 +++++---- c-format.c | 25 +-- c-objc-common.c | 4 c-parse.in | 98 ++++++------ c-pragma.c | 10 - c-tree.h | 28 +-- c-typeck.c | 12 - cgraphunit.c | 2 config/alpha/alpha.c | 6 config/arm/arm.c | 37 ++-- config/arm/pe.c | 12 - config/avr/avr.c | 14 - config/c4x/c4x.c | 6 config/frv/frv.c | 2 config/h8300/h8300.c | 35 ---- config/i386/i386.c | 42 ++--- config/i386/netware.c | 8 - config/i386/winnt.c | 22 +- config/ia64/ia64.c | 10 - config/ip2k/ip2k.c | 5 config/m32r/m32r.c | 10 - config/m68hc11/m68hc11.c | 28 +-- config/m68k/m68k.c | 5 config/mcore/mcore.c | 6 config/ns32k/ns32k.c | 4 config/rs6000/rs6000.c | 22 +- config/sh/sh.c | 10 - config/sh/symbian.c | 28 +-- config/sol2.c | 8 - config/stormy16/stormy16.c | 6 config/v850/v850.c | 20 -- coretypes.h | 6 cp/call.c | 2 cp/class.c | 2 cp/cp-tree.h | 29 ++- cp/decl.c | 59 +++---- cp/decl.h | 2 cp/decl2.c | 14 - cp/friend.c | 2 cp/method.c | 4 cp/name-lookup.c | 10 - cp/name-lookup.h | 2 cp/optimize.c | 2 cp/parser.c | 176 ++++++++++++---------- cp/pt.c | 2 cp/tree.c | 4 cp/typeck.c | 8 - fold-const.c | 4 gengtype-lex.l | 6 integrate.c | 9 - java/decl.c | 46 ++--- java/java-tree.h | 2 java/jcf-reader.c | 12 - langhooks.c | 4 langhooks.h | 2 objc/objc-act.c | 90 ++++++----- passes.c | 5 print-tree.c | 23 ++ system.h | 2 target-def.h | 4 target.h | 10 - targhooks.c | 10 + targhooks.h | 4 tree-browser.c | 9 - tree-inline.c | 6 tree.c | 307 +++++++++++++++++++++++++-------------- tree.h | 81 ++++++++-- treelang/treetree.c | 6 varasm.c | 6 75 files changed, 1171 insertions, 935 deletions