Right now there is no documentation for the GCC tree -> rtl interfaces
(or more generally the interfaces for adding new languages).

Such documentation would be of great benefit to the project.  Until such
time as we can formally start documenting the interface this file will
serve as a repository for information on these interface and any incompatable
changes we've made.

Jun 10, 1998:
  The interface to lang_decode_option has changed. It now uses and argc/argv
  interface to allow for options that use more than one input string. The new
  declaration is: int lang_decode_option (int argc, char** argv). It now
  returns the number of input strings processed, or 0 if the option is
  unknown.

Jun  7, 1998:
  Front-ends must now define lang_init_options.  It is safe for this
  function to do nothing.  See c-lang.c.

Apr 21, 1998:
  Front ends which link with c-common or other files from the C/C++
  front-ends may need to handle TI types.  Look for references to
  [unsigned]int_DI_type_node in your front end.  If you have references
  to these variables, you'll need up update the front end.

  To update the front end you must mirror all the code which currently
  deals with intDI_type_node to also handle intTI_type_node.


Apr 7, 1998:
  The interface between toplev.c and the language front ends for opening the
  source file has changed:

  o init_lex() has been renamed to init_parse (char *filename) where filename
    is the name of the source file.
  o The code in toplev.c which opened the source file should be moved to
    the new init_parse function.
  o toplev.c now calls finish_parse() instead of closing the source file
    using fclose(). This should now be done in finish_parse, if necessary.

Apr 1, 1998:
  Front-ends must now define lang_print_xnode.  It is safe for this
  function to do nothing.  See c-lang.c.

Feb 1, 1998:

  GCC used to store structure sizes & offsets to elements as bitsize
  quantities.  This causes problems because a structure can only be
  (target memsize / 8) bytes long (this may effect arrays too).  This
  is particularly problematical on machines with small address spaces.

  So:

    All trees that represent sizes in bits should have a TREE_TYPE of
    bitsizetype (rather than sizetype).

    Accordingly, when such values are computed / initialized, care has to
    be takes to use / compute the proper type.

    When a size in bits is converted into a size in bytes, which is expressed
    in trees, care should be taken to change the tree's type again to sizetype.

    We've updated C, C++, Fortran & Objective-C to work with the new
    scheme.  Other languages will need to be updated accordingly.
    Contact amylaar@cygnus.com for additional information.

?? 1997:

  In an effort to decrease cache thrashing and useless loads we've changed the
  third argument to the DEFTREECODE macro to be a single char.  This will
  effect languages that defined their own tree codes (usually in a .def file).

  Old way:

    DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", "d", 0)

  New way:

    DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
