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.
