Annotation of GNUtools/cc/g++int.texi, revision 1.1

1.1     ! root        1: \input texinfo  @c -*-texinfo-*-
        !             2: @c %**start of header 
        !             3: @setfilename g++int.info
        !             4: @settitle G++ internals
        !             5: @setchapternewpage odd
        !             6: @c %**end of header
        !             7:      
        !             8: @node Top, Limitations of g++, (dir), (dir)
        !             9: @chapter Internal Architecture of the Compiler
        !            10: 
        !            11: This is meant to describe the C++ frontend for gcc in detail.
        !            12: Questions and comments to mrs@@cygnus.com.
        !            13: 
        !            14: @menu
        !            15: * Limitations of g++::          
        !            16: * Routines::                    
        !            17: * Implementation Specifics::    
        !            18: * Glossary::                    
        !            19: * Macros::                      
        !            20: * Typical Behavior::            
        !            21: * Coding Conventions::          
        !            22: * Error Reporting::             
        !            23: * Concept Index::               
        !            24: @end menu
        !            25: 
        !            26: @node Limitations of g++, Routines, Top, Top
        !            27: @section Limitations of g++
        !            28: 
        !            29: @itemize @bullet
        !            30: @item
        !            31: Limitations on input source code: 240 nesting levels with the parser
        !            32: stacksize (YYSTACKSIZE) set to 500 (the default), and requires around
        !            33: 16.4k swap space per nesting level.  The parser needs about 2.09 *
        !            34: number of nesting levels worth of stackspace.
        !            35: 
        !            36: @cindex pushdecl_class_level
        !            37: @item
        !            38: I suspect there are other uses of pushdecl_class_level that do not call
        !            39: set_identifier_type_value in tandem with the call to
        !            40: pushdecl_class_level.  It would seem to be an omission.
        !            41: 
        !            42: @cindex delete, two argument
        !            43: @item
        !            44: For two argument delete, the second argument is always calculated by
        !            45: ``virtual_size ='' in the source.  It currently has a problem, in that
        !            46: object size is not calculated by the virtual destructor and passed back
        !            47: for the second parameter to delete.  Destructors need to return a value
        !            48: just like constructors.  ANSI C++ Jun 5 92 wp 12.5.6
        !            49: 
        !            50: The second argument is magically deleted in build_method_call, if it is
        !            51: not used.  It needs to be deleted for global operator delete also.
        !            52: 
        !            53: @cindex visibility checking
        !            54: @item
        !            55: Visibility checking in general is unimplemented, there are a few cases
        !            56: where it is implemented.  grok_enum_decls should be used in more places
        !            57: to do visibility checking, but this is only the tip of a bigger problem.
        !            58: 
        !            59: @cindex @code{volatile}
        !            60: @item
        !            61: @code{volatile} is not implemented in general.
        !            62: 
        !            63: @cindex pointers to members
        !            64: @item
        !            65: Pointers to members are only minimally supported, and there are places
        !            66: where the grammar doesn't even properly accept them yet.
        !            67: 
        !            68: @end itemize
        !            69: 
        !            70: @node Routines, Implementation Specifics, Limitations of g++, Top
        !            71: @section Routines
        !            72: 
        !            73: This section describes some of the routines used in the C++ front-end.
        !            74: 
        !            75: @code{build_vtable} and @code{prepare_fresh_vtable} is used only within
        !            76: the @file{cp-class.c} file, and only in @code{finish_struct} and
        !            77: @code{modify_vtable_entries}.
        !            78: 
        !            79: @code{build_vtable}, @code{prepare_fresh_vtable}, and
        !            80: @code{finish_struct} are the only routines that set @code{DECL_VPARENT}.
        !            81: 
        !            82: @code{finish_struct} can steal the virtual function table from parents,
        !            83: this prohibits related_vslot from working.  When finish_struct steals,
        !            84: we know that
        !            85: 
        !            86: @example
        !            87: get_binfo (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (t)), t, 0)
        !            88: @end example
        !            89: 
        !            90: @noindent
        !            91: will get the related binfo.
        !            92: 
        !            93: @code{layout_basetypes} does something with the VIRTUALS.
        !            94: 
        !            95: Supposedly (according to Tiemann) most of the breadth first searching
        !            96: done, like in @code{get_base_distance} and in @code{get_binfo} was not
        !            97: because of any design decision.  I have since found out the at least one
        !            98: part of the compiler needs the notion of depth first binfo searching, I
        !            99: am going to try and convert the whole thing, it should just work.  The
        !           100: term left-most refers to the depth first left-most node.  It uses
        !           101: @code{MAIN_VARIANT == type} as the condition to get left-most, because
        !           102: the things that have @code{BINFO_OFFSET}s of zero are shared and will
        !           103: have themselves as their own @code{MAIN_VARIANT}s.  The non-shared right
        !           104: ones, are copies of the left-most one, hence if it is its own
        !           105: @code{MAIN_VARIENT}, we know it IS a left-most one, if it is not, it is
        !           106: a non-left-most one.
        !           107: 
        !           108: @code{get_base_distance}'s path and distance matters in its use in:
        !           109: 
        !           110: @itemize @bullet
        !           111: @item
        !           112: @code{prepare_fresh_vtable} (the code is probably wrong)
        !           113: @item
        !           114: @code{init_vfields} Depends upon distance probably in a safe way,
        !           115: build_offset_ref might use partial paths to do further lookups,
        !           116: hack_identifier is probably not properly checking visibility.
        !           117: 
        !           118: @item
        !           119: @code{get_first_matching_virtual} probably should check for
        !           120: @code{get_base_distance} returning -2.
        !           121: 
        !           122: @item
        !           123: @code{resolve_offset_ref} should be called in a more deterministic
        !           124: manner.  Right now, it is called in some random contexts, like for
        !           125: arguments at @code{build_method_call} time, @code{default_conversion}
        !           126: time, @code{convert_arguments} time, @code{build_unary_op} time,
        !           127: @code{build_c_cast} time, @code{build_modify_expr} time,
        !           128: @code{convert_for_assignment} time, and
        !           129: @code{convert_for_initialization} time.
        !           130: 
        !           131: But, there are still more contexts it needs to be called in, one was the
        !           132: ever simple:
        !           133: 
        !           134: @example
        !           135: if (obj.*pmi != 7)
        !           136:    @dots{}
        !           137: @end example
        !           138: 
        !           139: Seems that the problems were due to the fact that @code{TREE_TYPE} of
        !           140: the @code{OFFSET_REF} was not a @code{OFFSET_TYPE}, but rather the type
        !           141: of the referent (like @code{INTEGER_TYPE}).  This problem was fixed by
        !           142: changing @code{default_conversion} to check @code{TREE_CODE (x)},
        !           143: instead of only checking @code{TREE_CODE (TREE_TYPE (x))} to see if it
        !           144: was @code{OFFSET_TYPE}.
        !           145: 
        !           146: @end itemize
        !           147: 
        !           148: @node Implementation Specifics, Glossary, Routines, Top
        !           149: @section Implementation Specifics
        !           150: 
        !           151: @itemize @bullet
        !           152: @item Explicit Initialization
        !           153: 
        !           154: The global list @code{current_member_init_list} contains the list of
        !           155: mem-initializers specified in a constructor declaration.  For example:
        !           156: 
        !           157: @example
        !           158: foo::foo() : a(1), b(2) @{@}
        !           159: @end example
        !           160: 
        !           161: @noindent
        !           162: will initialize @samp{a} with 1 and @samp{b} with 2.
        !           163: @code{expand_member_init} places each initialization (a with 1) on the
        !           164: global list.  Then, when the fndecl is being processed,
        !           165: @code{emit_base_init} runs down the list, initializing them.  It used to
        !           166: be the case that g++ first ran down @code{current_member_init_list},
        !           167: then ran down the list of members initializing the ones that weren't
        !           168: explicitly initialized.  Things were rewritten to perform the
        !           169: initializations in order of declaration in the class.  So, for the above
        !           170: example, @samp{a} and @samp{b} will be initialized in the order that
        !           171: they were declared:
        !           172: 
        !           173: @example
        !           174: class foo @{ public: int b; int a; foo (); @};
        !           175: @end example
        !           176: 
        !           177: @noindent
        !           178: Thus, @samp{b} will be initialized with 2 first, then @samp{a} will be
        !           179: initialized with 1, regardless of how they're listed in the mem-initializer.
        !           180: 
        !           181: @item Argument Matching
        !           182: 
        !           183: In early 1993, the argument matching scheme in @sc{gnu} C++ changed
        !           184: significantly.  The original code was completely replaced with a new
        !           185: method that will, hopefully, be easier to understand and make fixing
        !           186: specific cases much easier.
        !           187: 
        !           188: The @samp{-fansi-overloading} option is used to enable the new code; at
        !           189: some point in the future, it will become the default behavior of the
        !           190: compiler.
        !           191: 
        !           192: The file @file{cp-call.c} contains all of the new work, in the functions
        !           193: @code{rank_for_overload}, @code{compute_harshness},
        !           194: @code{compute_conversion_costs}, and @code{ideal_candidate}.
        !           195: 
        !           196: Instead of using obscure numerical values, the quality of an argument
        !           197: match is now represented by clear, individual codes.  The new data
        !           198: structure @code{struct harshness} (it used to be an @code{unsigned}
        !           199: number) contains:
        !           200: 
        !           201: @enumerate a
        !           202: @item the @samp{code} field, to signify what was involved in matching two
        !           203: arguments;
        !           204: @item the @samp{distance} field, used in situations where inheritance
        !           205: decides which function should be called (one is ``closer'' than
        !           206: another);
        !           207: @item and the @samp{int_penalty} field, used by some codes as a tie-breaker.
        !           208: @end enumerate
        !           209: 
        !           210: The @samp{code} field is a number with a given bit set for each type of
        !           211: code, OR'd together.  The new codes are:
        !           212: 
        !           213: @itemize @bullet
        !           214: @item @code{EVIL_CODE}
        !           215: The argument was not a permissible match.
        !           216: 
        !           217: @item @code{CONST_CODE}
        !           218: Currently, this is only used by @code{compute_conversion_costs}, to
        !           219: distinguish when a non-@code{const} member function is called from a
        !           220: @code{const} member function.
        !           221: 
        !           222: @item @code{ELLIPSIS_CODE}
        !           223: A match against an ellipsis @samp{...} is considered worse than all others.
        !           224: 
        !           225: @item @code{USER_CODE}
        !           226: Used for a match involving a user-defined conversion.
        !           227: 
        !           228: @item @code{STD_CODE}
        !           229: A match involving a standard conversion.
        !           230: 
        !           231: @item @code{PROMO_CODE}
        !           232: A match involving an integral promotion.  For these, the
        !           233: @code{int_penalty} field is used to handle the ARM's rule (XXX cite)
        !           234: that a smaller @code{unsigned} type should promote to a @code{int}, not
        !           235: to an @code{unsigned int}.
        !           236: 
        !           237: @item @code{QUAL_CODE}
        !           238: Used to mark use of qualifiers like @code{const} and @code{volatile}.
        !           239: 
        !           240: @item @code{TRIVIAL_CODE}
        !           241: Used for trivial conversions.  The @samp{int_penalty} field is used by
        !           242: @code{convert_harshness} to communicate further penalty information back
        !           243: to @code{build_overload_call_real} when deciding which function should
        !           244: be call.
        !           245: @end itemize
        !           246: 
        !           247: The functions @code{convert_to_aggr} and @code{build_method_call} use
        !           248: @code{compute_conversion_costs} to rate each argument's suitability for
        !           249: a given candidate function (that's how we get the list of candidates for
        !           250: @code{ideal_candidate}).
        !           251: 
        !           252: @end itemize
        !           253: 
        !           254: @node Glossary, Macros, Implementation Specifics, Top
        !           255: @section Glossary
        !           256: 
        !           257: @table @r
        !           258: @item binfo
        !           259: The main data structure in the compiler used to represent the
        !           260: inheritance relationships between classes.  The data in the binfo can be
        !           261: accessed by the BINFO_ accessor macros.
        !           262: 
        !           263: @item vtable
        !           264: @itemx virtual function table
        !           265: 
        !           266: The virtual function table holds information used in virtual function
        !           267: dispatching.  In the compiler, they are usually referred to as vtables,
        !           268: or vtbls.  The first index is not used in the normal way, I believe it
        !           269: is probably used for the virtual destructor.
        !           270: 
        !           271: @item vfield
        !           272: 
        !           273: vfields can be thought of as the base information needed to build
        !           274: vtables.  For every vtable that exists for a class, there is a vfield.
        !           275: See also vtable and virtual function table pointer.  When a type is used
        !           276: as a base class to another type, the virtual function table for the
        !           277: derived class can be based upon the vtable for the base class, just
        !           278: extended to include the additional virtual methods declared in the
        !           279: derived class.
        !           280: 
        !           281: @item virtual function table pointer
        !           282: 
        !           283: These are @code{FIELD_DECL}s that are pointer types that point to
        !           284: vtables.  See also vtable and vfield.
        !           285: @end table
        !           286: 
        !           287: @node Macros, Typical Behavior, Glossary, Top
        !           288: @section Macros
        !           289: 
        !           290: This section describes some of the macros used on trees.  The list
        !           291: should be alphabetical.  Eventually all macros should be documented
        !           292: here.  There are some postscript drawings that can be used to better
        !           293: understnad from of the more complex data structures, contact Mike Stump
        !           294: (@code{mrs@@cygnus.com}) for information about them.
        !           295: 
        !           296: @table @code
        !           297: @item BINFO_BASETYPES
        !           298: A vector of additional binfos for the types inherited by this basetype.
        !           299: The binfos are fully unshared (except for virtual bases, in which
        !           300: case the binfo structure is shared).
        !           301: 
        !           302:    If this basetype describes type D as inherited in C,
        !           303:    and if the basetypes of D are E anf F,
        !           304:    then this vector contains binfos for inheritance of E and F by C.
        !           305: 
        !           306: Has values of:
        !           307: 
        !           308:        TREE_VECs
        !           309: 
        !           310: 
        !           311: @item BINFO_INHERITANCE_CHAIN
        !           312: Temporarily used to represent specific inheritances.  It usually points
        !           313: to the binfo associated with the lesser derived type, but it can be
        !           314: reversed by reverse_path.  For example:
        !           315: 
        !           316: @example
        !           317:        Z ZbY   least derived
        !           318:        |
        !           319:        Y YbX
        !           320:        |
        !           321:        X Xb    most derived
        !           322: 
        !           323: TYPE_BINFO (X) == Xb
        !           324: BINFO_INHERITANCE_CHAIN (Xb) == YbX
        !           325: BINFO_INHERITANCE_CHAIN (Yb) == ZbY
        !           326: BINFO_INHERITANCE_CHAIN (Zb) == 0
        !           327: @end example
        !           328: 
        !           329: Not sure is the above is really true, get_base_distance has is point
        !           330: towards the most derived type, opposite from above.
        !           331: 
        !           332: Set by build_vbase_path, recursive_bounded_basetype_p,
        !           333: get_base_distance, lookup_field, lookup_fnfields, and reverse_path.
        !           334: 
        !           335: What things can this be used on:
        !           336: 
        !           337:        TREE_VECs that are binfos
        !           338: 
        !           339: 
        !           340: @item BINFO_OFFSET
        !           341: The offset where this basetype appears in its containing type.
        !           342: BINFO_OFFSET slot holds the offset (in bytes) from the base of the
        !           343: complete object to the base of the part of the object that is allocated
        !           344: on behalf of this `type'.  This is always 0 except when there is
        !           345: multiple inheritance.
        !           346: 
        !           347: Used on TREE_VEC_ELTs of the binfos BINFO_BASETYPES (...) for example.
        !           348: 
        !           349: 
        !           350: @item BINFO_VIRTUALS
        !           351: A unique list of functions for the virtual function table.  See also
        !           352: TYPE_BINFO_VIRTUALS.
        !           353: 
        !           354: What things can this be used on:
        !           355: 
        !           356:        TREE_VECs that are binfos
        !           357: 
        !           358: 
        !           359: @item BINFO_VTABLE
        !           360: Used to find the VAR_DECL that is the virtual function table associated
        !           361: with this binfo.  See also TYPE_BINFO_VTABLE.  To get the virtual
        !           362: function table pointer, see CLASSTYPE_VFIELD.
        !           363: 
        !           364: What things can this be used on:
        !           365: 
        !           366:        TREE_VECs that are binfos
        !           367: 
        !           368: Has values of:
        !           369: 
        !           370:        VAR_DECLs that are virtual function tables
        !           371: 
        !           372: 
        !           373: @item BLOCK_SUPERCONTEXT
        !           374: In the outermost scope of each function, it points to the FUNCTION_DECL
        !           375: node.  It aids in better DWARF support of inline functions.
        !           376: 
        !           377: 
        !           378: @item CLASSTYPE_TAGS
        !           379: CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a
        !           380: class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans
        !           381: these and calls pushtag on them.)
        !           382: 
        !           383: finish_struct scans these to produce TYPE_DECLs to add to the
        !           384: TYPE_FIELDS of the type.
        !           385: 
        !           386: It is expected that name found in the TREE_PURPOSE slot is unique,
        !           387: resolve_scope_to_name is one such place that depends upon this
        !           388: uniqueness.
        !           389: 
        !           390: 
        !           391: @item CLASSTYPE_METHOD_VEC
        !           392: The following is true after finish_struct has been called (on the
        !           393: class?) but not before.  Before finish_struct is called, things are
        !           394: different to some extent.  Contains a TREE_VEC of methods of the class.
        !           395: The TREE_VEC_LENGTH is the number of differently named methods plus one
        !           396: for the 0th entry.  The 0th entry is always allocated, and reserved for
        !           397: ctors and dtors.  If there are none, TREE_VEC_ELT(N,0) == NULL_TREE.
        !           398: Each entry of the TREE_VEC is a FUNCTION_DECL.  For each FUNCTION_DECL,
        !           399: there is a DECL_CHAIN slot.  If the FUNCTION_DECL is the last one with a
        !           400: given name, the DECL_CHAIN slot is NULL_TREE.  Otherwise it is the next
        !           401: method that has the same name (but a different signature).  It would
        !           402: seem that it is not true that because the DECL_CHAIN slot is used in
        !           403: this way, we cannot call pushdecl to put the method in the global scope
        !           404: (cause that would overwrite the TREE_CHAIN slot), because they use
        !           405: different _CHAINs.  finish_struct_methods setups up one version of the
        !           406: TREE_CHAIN slots on the FUNCTION_DECLs.
        !           407: 
        !           408: friends are kept in TREE_LISTs, so that there's no need to use their
        !           409: TREE_CHAIN slot for anything.
        !           410: 
        !           411: Has values of:
        !           412: 
        !           413:        TREE_VECs
        !           414:        
        !           415: 
        !           416: @item CLASSTYPE_VFIELD
        !           417: Seems to be in the process of being renamed TYPE_VFIELD.  Use on types
        !           418: to get the main virtual function table pointer.  To get the virtual
        !           419: function table use BINFO_VTABLE (TYPE_BINFO ()).
        !           420: 
        !           421: Has values of:
        !           422: 
        !           423:        FIELD_DECLs that are virtual function table pointers
        !           424: 
        !           425: What things can this be used on:
        !           426: 
        !           427:        RECORD_TYPEs
        !           428: 
        !           429: 
        !           430: @item DECL_CLASS_CONTEXT
        !           431: Identifys the context that the _DECL was found in.  For virtual function
        !           432: tables, it points to the type associated with the virtual function
        !           433: table.  See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_FCONTEXT.
        !           434: 
        !           435: The difference between this and DECL_CONTEXT, is that for virtuals
        !           436: functions like:
        !           437: 
        !           438: @example
        !           439: struct A
        !           440: @{
        !           441:   virtual int f ();
        !           442: @};
        !           443: 
        !           444: struct B : A
        !           445: @{
        !           446:   int f ();
        !           447: @};
        !           448: 
        !           449: DECL_CONTEXT (A::f) == A
        !           450: DECL_CLASS_CONTEXT (A::f) == A
        !           451: 
        !           452: DECL_CONTEXT (B::f) == A
        !           453: DECL_CLASS_CONTEXT (B::f) == B
        !           454: @end example
        !           455: 
        !           456: Has values of:
        !           457: 
        !           458:        RECORD_TYPEs, or UNION_TYPEs
        !           459: 
        !           460: What things can this be used on:
        !           461: 
        !           462:        TYPE_DECLs, _DECLs
        !           463: 
        !           464: 
        !           465: @item DECL_CONTEXT
        !           466: Identifys the context that the _DECL was found in.  Can be used on
        !           467: virtual function tables to find the type associated with the virtual
        !           468: function table, but since they are FIELD_DECLs, DECL_FIELD_CONTEXT is a
        !           469: better access method.  Internally the same as DECL_FIELD_CONTEXT, so
        !           470: don't us both.  See also DECL_FIELD_CONTEXT, DECL_FCONTEXT and
        !           471: DECL_CLASS_CONTEXT.
        !           472: 
        !           473: Has values of:
        !           474: 
        !           475:        RECORD_TYPEs
        !           476: 
        !           477: 
        !           478: What things can this be used on:
        !           479: 
        !           480: @display
        !           481: VAR_DECLs that are virtual function tables
        !           482: _DECLs
        !           483: @end display
        !           484: 
        !           485: 
        !           486: @item DECL_FIELD_CONTEXT
        !           487: Identifys the context that the FIELD_DECL was found in.  Internally the
        !           488: same as DECL_CONTEXT, so don't us both.  See also DECL_CONTEXT,
        !           489: DECL_FCONTEXT and DECL_CLASS_CONTEXT.
        !           490: 
        !           491: Has values of:
        !           492: 
        !           493:        RECORD_TYPEs
        !           494: 
        !           495: What things can this be used on:
        !           496: 
        !           497: @display
        !           498: FIELD_DECLs that are virtual function pointers
        !           499: FIELD_DECLs
        !           500: @end display
        !           501: 
        !           502: 
        !           503: @item DECL_NESTED_TYPENAME
        !           504: Holds the fully qualified type name.  Example, Base::Derived.
        !           505: 
        !           506: Has values of:
        !           507: 
        !           508:        IDENTIFIER_NODEs
        !           509: 
        !           510: What things can this be used on:
        !           511: 
        !           512:        TYPE_DECLs
        !           513: 
        !           514: 
        !           515: @item DECL_NAME
        !           516: 
        !           517: Has values of:
        !           518: 
        !           519: @display
        !           520: 0 for things that don't have names
        !           521: IDENTIFIER_NODEs for TYPE_DECLs
        !           522: @end display
        !           523: 
        !           524: @item DECL_IGNORED_P
        !           525: A bit that can be set to inform the debug information output routines in
        !           526: the backend that a certain _DECL node should be totally ignored.
        !           527: 
        !           528: Used in cases where it is known that the debugging information will be
        !           529: output in another file, or where a sub-type is known not to be needed
        !           530: because the enclosing type is not needed.
        !           531: 
        !           532: A compiler constructed virtual destructor in derived classes that do not
        !           533: define an exlicit destructor that was defined exlicit in a base class
        !           534: has this bit set as well.  Also used on __FUNCTION__ and
        !           535: __PRETTY_FUNCTION__ to mark they are ``compiler generated.''  c-decl and
        !           536: c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,''
        !           537: and ``user-invisible variable.''
        !           538: 
        !           539: Functions built by the C++ front-end such as default destructors,
        !           540: virtual desctructors and default constructors want to be marked that
        !           541: they are compiler generated, but unsure why.
        !           542: 
        !           543: Currently, it is used in an absolute way in the C++ front-end, as an
        !           544: optimization, to tell the debug information output routines to not
        !           545: generate debugging information that will be output by another separately
        !           546: compiled file.
        !           547: 
        !           548: 
        !           549: @item DECL_VIRTUAL_P
        !           550: A flag used on FIELD_DECLs and VAR_DECLs.  (Documentation in tree.h is
        !           551: wrong.)  Used in VAR_DECLs to indicate that the variable is a vtable.
        !           552: It is also used in FIELD_DECLs for vtable pointers.
        !           553: 
        !           554: What things can this be used on:
        !           555: 
        !           556:        FIELD_DECLs and VAR_DECLs
        !           557: 
        !           558: 
        !           559: @item DECL_VPARENT
        !           560: Used to point to the parent type of the vtable if there is one, else it
        !           561: is just the type associated with the vtable.  Because of the sharing of
        !           562: virtual function tables that goes on, this slot is not very useful, and
        !           563: is in fact, not used in the compiler at all.  It can be removed.
        !           564: 
        !           565: What things can this be used on:
        !           566: 
        !           567:        VAR_DECLs that are virtual function tables
        !           568: 
        !           569: Has values of:
        !           570: 
        !           571:        RECORD_TYPEs maybe UNION_TYPEs
        !           572: 
        !           573: 
        !           574: @item DECL_FCONTEXT
        !           575: Used to find the first baseclass in which this FIELD_DECL is defined.
        !           576: See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_CLASS_CONTEXT.
        !           577: 
        !           578: How it is used:
        !           579: 
        !           580:        Used when writing out debugging information about vfield and
        !           581:        vbase decls.
        !           582: 
        !           583: What things can this be used on:
        !           584: 
        !           585:        FIELD_DECLs that are virtual function pointers
        !           586:        FIELD_DECLs
        !           587: 
        !           588: 
        !           589: @item DECL_REFERENCE_SLOT
        !           590: Used to hold the initialize for the reference.
        !           591: 
        !           592: What things can this be used on:
        !           593: 
        !           594:        PARM_DECLs and VAR_DECLs that have a reference type
        !           595: 
        !           596: 
        !           597: @item DECL_VINDEX
        !           598: Used for FUNCTION_DECLs in two different ways.  Before the structure
        !           599: containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a
        !           600: FUNCTION_DECL in a base class which is the FUNCTION_DECL which this
        !           601: FUNCTION_DECL will replace as a virtual function.  When the class is
        !           602: laid out, this pointer is changed to an INTEGER_CST node which is
        !           603: suitable to find an index into the virtual function table.  See
        !           604: get_vtable_entry as to how one can find the right index into the virtual
        !           605: function table.  The first index 0, of a virtual function table it not
        !           606: used in the normal way, so the first real index is 1.
        !           607: 
        !           608: DECL_VINDEX may be a TREE_LIST, that would seem to be a list of
        !           609: overridden FUNCTION_DECLs.  add_virtual_function has code to deal with
        !           610: this when it uses the variable base_fndecl_list, but it would seem that
        !           611: somehow, it is possible for the TREE_LIST to pursist until method_call,
        !           612: and it should not.
        !           613: 
        !           614: 
        !           615: What things can this be used on:
        !           616: 
        !           617:        FUNCTION_DECLs
        !           618: 
        !           619: 
        !           620: @item DECL_SOURCE_FILE
        !           621: Identifies what source file a particular declaration was found in.
        !           622: 
        !           623: Has values of:
        !           624: 
        !           625:        "<built-in>" on TYPE_DECLs to mean the typedef is built in
        !           626: 
        !           627: 
        !           628: @item DECL_SOURCE_LINE
        !           629: Identifies what source line number in the source file the declaration
        !           630: was found at.
        !           631: 
        !           632: Has values of:
        !           633: 
        !           634: @display
        !           635: 0 for an undefined label
        !           636: 
        !           637: 0 for TYPE_DECLs that are internally generated
        !           638: 
        !           639: 0 for FUNCTION_DECLs for functions generated by the compiler
        !           640:        (not yet, but should be)
        !           641: 
        !           642: 0 for ``magic'' arguments to functions, that the user has no
        !           643:        control over
        !           644: @end display
        !           645: 
        !           646: 
        !           647: @item TREE_USED
        !           648: 
        !           649: Has values of:
        !           650: 
        !           651:        0 for unused labels
        !           652: 
        !           653: 
        !           654: @item TREE_ADDRESSABLE
        !           655: A flag that is set for any type that has a constructor.
        !           656: 
        !           657: 
        !           658: @item TREE_COMPLEXITY
        !           659: They seem a kludge way to track recursion, poping, and pushing.  They only
        !           660: appear in cp-decl.c and cp-decl2.c, so the are a good candidate for
        !           661: proper fixing, and removal.
        !           662: 
        !           663: 
        !           664: @item TREE_PRIVATE
        !           665: Set for FIELD_DECLs by finish_struct.  But not uniformly set.
        !           666: 
        !           667: The following routines do something with PRIVATE visibility:
        !           668: build_method_call, alter_visibility, finish_struct_methods,
        !           669: finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType,
        !           670: CWriteUseObject, compute_visibility, lookup_field, dfs_pushdecl,
        !           671: GNU_xref_member, dbxout_type_fields, dbxout_type_method_1
        !           672: 
        !           673: 
        !           674: @item TREE_PROTECTED
        !           675: The following routines do something with PROTECTED visibility:
        !           676: build_method_call, alter_visibility, finish_struct, convert_to_aggr,
        !           677: CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject,
        !           678: compute_visibility, lookup_field, GNU_xref_member, dbxout_type_fields,
        !           679: dbxout_type_method_1
        !           680: 
        !           681: 
        !           682: @item TYPE_BINFO
        !           683: Used to get the binfo for the type.
        !           684: 
        !           685: Has values of:
        !           686: 
        !           687:        TREE_VECs that are binfos
        !           688: 
        !           689: What things can this be used on:
        !           690: 
        !           691:        RECORD_TYPEs
        !           692: 
        !           693: 
        !           694: @item TYPE_BINFO_BASETYPES
        !           695: See also BINFO_BASETYPES.
        !           696: 
        !           697: @item TYPE_BINFO_VIRTUALS
        !           698: A unique list of functions for the virtual function table.  See also
        !           699: BINFO_VIRTUALS.
        !           700: 
        !           701: What things can this be used on:
        !           702: 
        !           703:        RECORD_TYPEs
        !           704: 
        !           705: 
        !           706: @item TYPE_BINFO_VTABLE
        !           707: Points to the virtual function table associated with the given type.
        !           708: See also BINFO_VTABLE.
        !           709: 
        !           710: What things can this be used on:
        !           711: 
        !           712:        RECORD_TYPEs
        !           713: 
        !           714: Has values of:
        !           715: 
        !           716:        VAR_DECLs that are virtual function tables
        !           717: 
        !           718: 
        !           719: @item TYPE_NAME
        !           720: Names the type.
        !           721: 
        !           722: Has values of:
        !           723: 
        !           724: @display
        !           725: 0 for things that don't have names.
        !           726: should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and 
        !           727:         ENUM_TYPEs.
        !           728: TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but 
        !           729:         shouldn't be.
        !           730: TYPE_DECL for typedefs, unsure why.
        !           731: @end display
        !           732: 
        !           733: What things can one use this on:
        !           734: 
        !           735: @display
        !           736: TYPE_DECLs
        !           737: RECORD_TYPEs
        !           738: UNION_TYPEs
        !           739: ENUM_TYPEs
        !           740: @end display
        !           741: 
        !           742: History:
        !           743: 
        !           744:        It currently points to the TYPE_DECL for RECORD_TYPEs,
        !           745:        UNION_TYPEs and ENUM_TYPEs, but it should be history soon.
        !           746: 
        !           747: 
        !           748: @item TYPE_METHODS
        !           749: Synonym for @code{CLASSTYPE_METHOD_VEC}.  Chained together with
        !           750: @code{TREE_CHAIN}.  @file{dbxout.c} uses this to get at the methods of a
        !           751: class.
        !           752: 
        !           753: 
        !           754: @item TYPE_DECL
        !           755: Used to represent typedefs, and used to represent bindings layers.
        !           756: 
        !           757: Components:
        !           758: 
        !           759:        DECL_NAME is the name of the typedef.  For example, foo would
        !           760:        be found in the DECL_NAME slot when @code{typedef int foo;} is
        !           761:        seen.
        !           762: 
        !           763:        DECL_SOURCE_LINE identifies what source line number in the
        !           764:        source file the declaration was found at.  A value of 0
        !           765:        indicates that this TYPE_DECL is just an internal binding layer
        !           766:        marker, and does not correspond to a user suppiled typedef.
        !           767: 
        !           768:        DECL_SOURCE_FILE
        !           769: 
        !           770: @item TYPE_FIELDS
        !           771: A linked list (via @code{TREE_CHAIN}) of member types of a class.  The
        !           772: list can contain @code{TYPE_DECL}s, but there can also be other things
        !           773: in the list apparently.  See also @code{CLASSTYPE_TAGS}.
        !           774: 
        !           775: 
        !           776: @item TYPE_VIRTUAL_P
        !           777: A flag used on a @code{FIELD_DECL} or a @code{VAR_DECL}, indicates it is
        !           778: a virtual function table or a pointer to one.  When used on a
        !           779: @code{FUNCTION_DECL}, indicates that it is a virtual function.  When
        !           780: used on an @code{IDENTIFIER_NODE}, indicates that a function with this
        !           781: same name exists and has been declared virtual.
        !           782: 
        !           783: When used on types, it indicates that the type has virtual functions, or
        !           784: is derived from one that does.
        !           785: 
        !           786: Not sure if the above about virtual function tables is still true.  See
        !           787: also info on @code{DECL_VIRTUAL_P}.
        !           788: 
        !           789: What things can this be used on:
        !           790: 
        !           791:        FIELD_DECLs, VAR_DECLs, FUNCTION_DECLs, IDENTIFIER_NODEs
        !           792: 
        !           793: 
        !           794: @item VF_BASETYPE_VALUE
        !           795: Get the associated type from the binfo that caused the given vfield to
        !           796: exist.  This is the least derived class (the most parent class) that
        !           797: needed a virtual function table.  It is probably the case that all uses
        !           798: of this field are misguided, but they need to be examined on a
        !           799: case-by-case basis.  See history for more information on why the
        !           800: previous statement was made.
        !           801: 
        !           802: What things can this be used on:
        !           803: 
        !           804:        TREE_LISTs that are vfields
        !           805: 
        !           806: History:
        !           807: 
        !           808:        This field was used to determine if a virtual function table's
        !           809:        slot should be filled in with a certain virtual function, by
        !           810:        checking to see if the type returned by VF_BASETYPE_VALUE was a
        !           811:        parent of the context in which the old virtual function existed.
        !           812:        This incorrectly assumes that a given type _could_ not appear as
        !           813:        a parent twice in a given inheritance lattice.  For single
        !           814:        inheritance, this would in fact work, because a type could not
        !           815:        possibly appear more than once in an inheritance lattice, but
        !           816:        with multiple inheritance, a type can appear more than once.
        !           817: 
        !           818: 
        !           819: @item VF_BINFO_VALUE
        !           820: Identifies the binfo that caused this vfield to exist.  Can use
        !           821: @code{TREE_VIA_VIRTUAL} on result to find out if it is a virtual base
        !           822: class.  Related to the binfo found by
        !           823: 
        !           824: @example
        !           825: get_binfo (VF_BASETYPE_VALUE (vfield), t, 0)
        !           826: @end example
        !           827: 
        !           828: @noindent
        !           829: where @samp{t} is the type that has the given vfield.
        !           830: 
        !           831: @example
        !           832: get_binfo (VF_BASETYPE_VALUE (vfield), t, 0)
        !           833: @end example
        !           834: 
        !           835: @noindent
        !           836: will return the binfo for the the given vfield.
        !           837: 
        !           838: May or may not be set at @code{modify_vtable_entries} time.  Set at
        !           839: @code{finish_base_struct} time.
        !           840: 
        !           841: What things can this be used on:
        !           842: 
        !           843:        TREE_LISTs that are vfields
        !           844: 
        !           845: 
        !           846: @item VF_DERIVED_VALUE
        !           847: Identifies the type of the most derived class of the vfield, excluding
        !           848: the the class this vfield is for.
        !           849: 
        !           850: What things can this be used on:
        !           851: 
        !           852:        TREE_LISTs that are vfields
        !           853: 
        !           854: 
        !           855: @item VF_NORMAL_VALUE
        !           856: Identifies the type of the most derived class of the vfield, including
        !           857: the class this vfield is for.
        !           858: 
        !           859: What things can this be used on:
        !           860: 
        !           861:        TREE_LISTs that are vfields
        !           862: 
        !           863: 
        !           864: @item WRITABLE_VTABLES
        !           865: This is a option that can be defined when building the compiler, that
        !           866: will cause the compiler to output vtables into the data segment so that
        !           867: the vtables maybe written.  This is undefined by default, because
        !           868: normally the vtables should be unwritable.  People that implement object
        !           869: I/O facilities may, or people that want to change the dynamic type of
        !           870: objects may want to have the vtables writable.  Another way of achieving
        !           871: this would be to make a copy of the vtable into writable memory, but the
        !           872: drawback there is that that method only changes the type for one object.
        !           873: 
        !           874: @end table
        !           875: 
        !           876: @node Typical Behavior, Coding Conventions, Macros, Top
        !           877: @section Typical Behavior
        !           878: 
        !           879: @cindex parse errors
        !           880: 
        !           881: Whenever seemingly normal code fails with errors like
        !           882: @code{syntax error at `\@{'}, it's highly likely that grokdeclarator is
        !           883: returning a NULL_TREE for whatever reason.
        !           884: 
        !           885: @node Coding Conventions, Error Reporting, Typical Behavior, Top
        !           886: @section Coding Conventions
        !           887: 
        !           888: It should never be that case that trees are modified in-place by the
        !           889: back-end, @emph{unless} it is guaranteed that the semantics are the same
        !           890: no matter how shared the tree structure is.  @file{fold-const.c} still
        !           891: has some cases where this is not true, but rms hypothesizes that this
        !           892: will never be a problem.
        !           893: 
        !           894: @node Error Reporting, Concept Index, Coding Conventions, Top
        !           895: @section Error Reporting
        !           896: 
        !           897: The C++ frontend uses a call-back mechanism to allow functions to print
        !           898: out reasonable strings for types and functions without putting extra
        !           899: logic in the functions where errors are found.  The interface is through
        !           900: the @code{lang_error} function (or @code{lang_warning}, etc.).  The
        !           901: syntax is exactly like that of @code{error}, except that a few more
        !           902: conversions are supported:
        !           903: 
        !           904: @itemize @bullet
        !           905: @item
        !           906: %D indicates a *_DECL node
        !           907: @item
        !           908: %T indicates a *_TYPE node
        !           909: @item
        !           910: %E indicates a *_EXPR node (currently only used for default parameters
        !           911: in FUNCTION_DECLs)
        !           912: @end itemize
        !           913: 
        !           914: For a more verbose message (@code{class foo} as opposed to just @code{foo},
        !           915: including the return type for functions), use %#c.
        !           916: To have the line number on the error message indicate the line of the
        !           917: DECL, use @code{lang_error_at} and its ilk.
        !           918: 
        !           919: @node Concept Index,  , Error Reporting, Top
        !           920: @section Concept Index
        !           921: 
        !           922: @printindex cp
        !           923: 
        !           924: @bye

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.