Annotation of gcc/g++int.texi, revision 1.1

1.1     ! root        1: @node internals
        !             2: @chapter Internal Architecture of the Compiler
        !             3: 
        !             4: This is meant to describe the C++ frontend for gcc in detail.
        !             5: Questions and comments to [email protected].
        !             6: 
        !             7: @index delete, two argument
        !             8: For two argument delete, the second argument is always calculated by
        !             9: ``virtual_size ='' in the source.  It currently has a problem, in that
        !            10: object size is not calculated by the virtual destructor and passed back
        !            11: for the second parameter to delete.  Destructors need to return a value
        !            12: just like constructors.
        !            13: 
        !            14: @index visibility checking
        !            15: Visibility checking in general is unimplemented, there are a few cases
        !            16: where it is implemented.  grok_enum_decls should be used in more places
        !            17: to do visibility checking, but this is only the tip of a bigger problem.
        !            18: 
        !            19: @index volatile
        !            20: volatile is not implemented in general.
        !            21: 
        !            22: @index const
        !            23: const is completely implemented except for function overload selection.
        !            24: 
        !            25: @index protected base classes
        !            26: Protected base classes are not fully implemented.
        !            27: 
        !            28: @item BLOCK_SUPERCONTEXT
        !            29: In the outermost scope of each function, it points to the FUNCTION_DECL
        !            30: node.  It aids in better DWARF support of inline functions.
        !            31: 
        !            32: @item DECL_CLASS_CONTEXT
        !            33: Identifys the context that the _DECL was found in.
        !            34: 
        !            35: Has values of:
        !            36: 
        !            37:        RECORD_TYPE, or UNION_TYPE.
        !            38: 
        !            39: What things can this be used on:
        !            40: 
        !            41:        TYPE_DECLs, *_DECLs
        !            42: 
        !            43: @item DECL_NESTED_TYPENAME
        !            44: Holds the fully qualified type name.  Example, Base::Derived.
        !            45: 
        !            46: Has values of:
        !            47: 
        !            48:        IDENTIFIER_NODE
        !            49: 
        !            50: What things can this be used on:
        !            51: 
        !            52:        TYPE_DECLs
        !            53: 
        !            54: @item TYPE_NAME
        !            55: Names the type.
        !            56: 
        !            57: Has values of:
        !            58: 
        !            59:        0 for things that don't have names.
        !            60:        should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and ENUM_TYPEs.
        !            61:        TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but shouldn't
        !            62:                be.
        !            63:        TYPE_DECL for typedefs, unsure why.
        !            64: 
        !            65: What things can one use this on:
        !            66: 
        !            67:        TYPE_DECLs
        !            68:        RECORD_TYPEs
        !            69:        UNION_TYPEs
        !            70:        ENUM_TYPEs
        !            71: 
        !            72: How is it used:
        !            73: 
        !            74:        Used by dwarfout.c to fetch the name of structs, unoins and enums
        !            75:        to create AT_name fields.
        !            76: 
        !            77: History:
        !            78: 
        !            79:        It currently points to the TYPE_DECL for RECORD_TYPEs,
        !            80:        UNION_TYPEs and ENUM_TYPEs, but it should be history soon.
        !            81: 
        !            82: @item DECL_NAME
        !            83: 
        !            84: Has values of:
        !            85: 
        !            86:        0 for things that don't have names.
        !            87:        IDENTIFIER_NODE for TYPE_DECLs.
        !            88: 
        !            89: @item TYPE_DECL
        !            90: Used to represent typedefs, and used to represent bindings layers.
        !            91: 
        !            92: Components:
        !            93: 
        !            94:        DECL_NAME is the name of the typedef.  For example, foo would
        !            95:        be found in the DECL_NAME slot when @code{typedef int foo;} is
        !            96:        seen.
        !            97: 
        !            98:        DECL_SOURCE_LINE identifies what source line number in the
        !            99:        source file the declaration was found at.  A value of 0
        !           100:        indicates that this TYPE_DECL is just an internal binding layer
        !           101:        marker, and does not correspond to a user suppiled typedef.
        !           102: 
        !           103:        DECL_SOURCE_FILE @xref{DECL_SOURCE_FILE}.
        !           104: 
        !           105: @item DECL_IGNORED_P
        !           106: A bit that can be set to inform the debug information output routines in
        !           107: the backend that a certain _DECL node should be totally ignored.
        !           108: 
        !           109: Used in cases where it is known that the debugging information will be
        !           110: output in another file, or where a sub-type is known not to be needed
        !           111: because the enclosing type is not needed.
        !           112: 
        !           113: A compiler constructed virtual destructor in derived classes that do not
        !           114: define an exlicit destructor that was defined exlicit in a base class
        !           115: has this bit set as well.  Also used on __FUNCTION__ and
        !           116: __PRETTY_FUNCTION__ to mark they are ``compiler generated.''  c-decl and
        !           117: c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,''
        !           118: and ``user-invisible variable.''
        !           119: 
        !           120: Functions built by the C++ front-end such as default destructors,
        !           121: virtual desctructors and default constructors want to be marked that
        !           122: they are compiler generated, but unsure why.
        !           123: 
        !           124: Currently, it is used in an absolute way in the C++ front-end, as an
        !           125: optimization, to tell the debug information output routines to not
        !           126: generate debugging information that will be output by another separately
        !           127: compiled file.
        !           128: 
        !           129: @findex DECL_SOURCE_FILE
        !           130: @item DECL_SOURCE_FILE
        !           131: Identifies what source file a particular declaration was found in.
        !           132: 
        !           133: Has values of:
        !           134: 
        !           135:        "<built-in>" on TYPE_DECLs to mean the typedef is built in.
        !           136: 
        !           137: @item DECL_SOURCE_LINE
        !           138: Identifies what source line number in the source file the declaration
        !           139: was found at.
        !           140: 
        !           141: Has values of:
        !           142: 
        !           143:        0 for an undefined label.
        !           144: 
        !           145:        0 for TYPE_DECLs that are internally generated.
        !           146: 
        !           147:        0 for FUNCTION_DECLs for functions generated by the compiler.
        !           148:                (not yet, but should be.)
        !           149: 
        !           150: @item DECL_VIRTUAL_P
        !           151: A flag used on FIELD_DECLs and VAR_DECLs.  (Documentation in tree.h is
        !           152: wrong.)  Used in VAR_DECLs to indicate that the variable is a vtable.
        !           153: It is also used in FIELD_DECLs for vtable pointers.
        !           154: 
        !           155: What things can this be used on:
        !           156: 
        !           157:        FIELD_DECLs and VAR_DECLs.
        !           158: 
        !           159: @item DECL_VINDEX
        !           160: Used for FUNCTION_DECLs in two different ways.  Before the structure
        !           161: containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a
        !           162: FUNCTION_DECL in a base class which is the FUNCTION_DECL which this
        !           163: FUNCTION_DECL will replace as a virtual function.  When the class is
        !           164: laid out, this pointer is changed to an INTEGER_CST node which is
        !           165: suitable for use as an index into the virtual function table.
        !           166: 
        !           167: DECL_VINDEX may be a TREE_LIST, that would seem to be a list of
        !           168: overridden FUNCTION_DECLs.  add_virtual_function has code to deal with
        !           169: this when it uses the variable base_fndecl_list, but it would seem that
        !           170: somehow, it is possible for the TREE_LIST to pursist until method_call,
        !           171: and it should not.
        !           172: 
        !           173: @item TREE_USED
        !           174: 
        !           175: Has values of:
        !           176: 
        !           177:        0 for unused labels.
        !           178: 
        !           179: @item TREE_ADDRESSABLE
        !           180: A flag that is set for any type that has a constructor.
        !           181: 
        !           182: @item CLASSTYPE_METHOD_VEC
        !           183: The following is true after finish_struct has been called (on the
        !           184: class?) but not before.  Before finish_struct is called, things are
        !           185: different to some extent.  Contains a TREE_VEC of methods of the class.
        !           186: The TREE_VEC_LENGTH is the number of differently named methods plus one
        !           187: for the 0th entry.  The 0th entry is always allocated, and reserved for
        !           188: ctors and dtors.  If there are none, TREE_VEC_ELT(N,0) == NULL_TREE.
        !           189: Each entry of the TREE_VEC is a FUNCTION_DECL.  For each FUNCTION_DECL,
        !           190: there is a DECL_CHAIN slot.  If the FUNCTION_DECL is the last one with a
        !           191: given name, the DECL_CHAIN slot is NULL_TREE.  Otherwise it is the next
        !           192: method that has the same name (but a different signature).  It would
        !           193: seem that it is not true that because the DECL_CHAIN slot is used in
        !           194: this way, we cannot call pushdecl to put the method in the global scope
        !           195: (cause that would overwrite the TREE_CHAIN slot), because they use
        !           196: different _CHAINs.
        !           197: 
        !           198: friends are kept in TREE_LISTs, so that there's no need to use their
        !           199: TREE_CHAIN slot for anything.
        !           200: 
        !           201: Has values of:
        !           202: 
        !           203:        TREE_VEC
        !           204:        
        !           205: @item TYPE_METHOD
        !           206: Related to CLASSTYPE_METHOD_VEC.  Chained together with TREE_CHAIN.
        !           207: dbxout.c uses this to get at the methods of a class.
        !           208: 
        !           209: @item CLASSTYPE_TAGS
        !           210: CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a
        !           211: class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans
        !           212: these and calls pushtag on them.)
        !           213: 
        !           214: finish_struct scans these to produce TYPE_DECLs to add to the
        !           215: TYPE_FIELDS of the type.
        !           216: 
        !           217: It is expected that name found in the TREE_PURPOSE slot is unique,
        !           218: resolve_scope_to_name is one such place that depends upon this
        !           219: uniqueness.
        !           220: 
        !           221: @item TYPE_FIELDS
        !           222: TYPE_FIELDS is a linked list (via TREE_CHAIN) of member types of a
        !           223: class.  The list can contain TYPE_DECLs, but there can also be other
        !           224: things in the list apparently.  See also CLASSTYPE_TAGS.
        !           225: 
        !           226: @item TREE_PRIVATE
        !           227: Set for FIELD_DECLs by finish_struct.  But not uniformly set.
        !           228: 
        !           229: The following routines do something with PRIVATE visibility:
        !           230: build_method_call, alter_visibility, finish_struct_methods,
        !           231: finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType,
        !           232: CWriteUseObject, compute_visibility, lookup_field, dfs_pushdecl,
        !           233: GNU_xref_member, dbxout_type_fields, dbxout_type_method_1
        !           234: 
        !           235: @item TREE_PROTECTED
        !           236: The following routines do something with PROTECTED visibility:
        !           237: build_method_call, alter_visibility, finish_struct, convert_to_aggr,
        !           238: CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject,
        !           239: compute_visibility, lookup_field, GNU_xref_member, dbxout_type_fields,
        !           240: dbxout_type_method_1

unix.superglobalmegacorp.com

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