On 3/14/07, Doug Gregor <[EMAIL PROTECTED]> wrote:
Hi Mike,
[I'm replying in this thread to the Objective-C patch you posted in
the type-traits discussion, because both that post and this one are
about reducing the number of tree codes]
On 3/13/07, Mike Stump <[EMAIL PROTECTED]> wrote:
> I just converted the Objective-C front-end to free up enough tree
> codes so that Objective-C++ can compile again. I know it can be
> done. If you want a new tree code, you can convert some other tree
> code into a subcode. pick one one.
Thanks for doing this!
> For ideas, please see the below patch. I glanced at the C++ front
> end, I see 8 tree codes (all the tcc_type codes) that you can reclaim
> using the technique below.
>
> For those that want to begin reviewing it, have at it, I'd be
> interested in, do we even want to go in this direction (we don't have
> hard numbers on the compile time costs yet, I don't think)? If so,
> any better way to do this in the short term?
Emboldened by your patch, I took a quick swing at introducing subcodes
for the simplest tcc_type node in the C++ front end - TYPEOF_TYPE. The
patch is attached. Here are some observations:
- C++ already uses the LANG_TYPE tree code, although certainly not
the way it was intended: UNKNOWN_TYPE is #define'd to LANG_TYPE. This
is probably keeping Objective-C++ from working with your patch (I
didn't try it).
- C++ already uses TYPE_LANG_SPECIFIC, for class types and for
pointers to member functions. Those are both based on RECORD_TYPE
nodes (ugh). That's okay: it turns out that we can use
TYPE_LANG_SPECIFIC for RECORD_TYPE nodes and LANG_TYPE nodes with no
problems whatsoever.
- If C++ uses LANG_TYPE, and Objective C uses LANG_TYPE, we're
heading for a collision with Objective-C++. Either we'll need use
different top-level codes (LANG_TYPE vs. OBJC_LANG_TYPE, for example),
or we need to consolidate LANG_TYPE by making the subtype codes
extensible by Objective-C++ (just like normal tree codes are). The
latter seems like the right thing to do.
- We're also heading toward collisions with lang_type_class, etc.,
but those are easy to fix.
- It doesn't seem to happen in the Objective-C front end, but in the
C++ front end we have a lot of large switches on the TREE_CODE of a
type. With subcodes, these switches become very clunky. We go from
something like this:
switch (TREE_CODE (t))
{
case TYPEOF_TYPE:
/* Handle `typeof' */
break;
default:
/* Default case */
break;
}
to a two-level solution:
switch (TREE_CODE (t))
{
case LANG_TYPE:
switch (LANG_TYPE_SUBCODE (t))
{
case TYPEOF_TYPE_SUBCODE:
/* Handle `typeof' */
break;
default:
/* Default case. */
break;
}
break;
default:
/* Default case */
break;
}
#define LANG_TYPE_CODE (t) (TREE_CODE (t) == LANG_TYPE ?
LANG_TYPE_SUBCODE (t) : INVALID_SUBCODE)
and then INVALID_SUBCODE will fall through to the default case as well.
Richard.