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.

Reply via email to