|
|
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++ front-end 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: * Templates:: ! 23: * Access Control:: ! 24: * Error Reporting:: ! 25: * Parser:: ! 26: * Copying Objects:: ! 27: * Exception Handling:: ! 28: * Free Store:: ! 29: * Concept Index:: ! 30: @end menu ! 31: ! 32: @node Limitations of g++, Routines, Top, Top ! 33: @section Limitations of g++ ! 34: ! 35: @itemize @bullet ! 36: @item ! 37: Limitations on input source code: 240 nesting levels with the parser ! 38: stacksize (YYSTACKSIZE) set to 500 (the default), and requires around ! 39: 16.4k swap space per nesting level. The parser needs about 2.09 * ! 40: number of nesting levels worth of stackspace. ! 41: ! 42: @cindex pushdecl_class_level ! 43: @item ! 44: I suspect there are other uses of pushdecl_class_level that do not call ! 45: set_identifier_type_value in tandem with the call to ! 46: pushdecl_class_level. It would seem to be an omission. ! 47: ! 48: @cindex access checking ! 49: @item ! 50: Access checking is unimplemented for nested types. ! 51: ! 52: @cindex @code{volatile} ! 53: @item ! 54: @code{volatile} is not implemented in general. ! 55: ! 56: @cindex pointers to members ! 57: @item ! 58: Pointers to members are only minimally supported, and there are places ! 59: where the grammar doesn't even properly accept them yet. ! 60: ! 61: @cindex multiple inheritance ! 62: @item ! 63: @code{this} will be wrong in virtual members functions defined in a ! 64: virtual base class, when they are overridden in a derived class, when ! 65: called via a non-left most object. ! 66: ! 67: An example would be: ! 68: ! 69: @example ! 70: extern "C" int printf(const char*, ...); ! 71: struct A @{ virtual void f() @{ @} @}; ! 72: struct B : virtual A @{ int b; B() : b(0) @{@} void f() @{ b++; @} @}; ! 73: struct C : B @{@}; ! 74: struct D : B @{@}; ! 75: struct E : C, D @{@}; ! 76: int main() ! 77: @{ ! 78: E e; ! 79: C& c = e; D& d = e; ! 80: c.f(); d.f(); ! 81: printf ("C::b = %d, D::b = %d\n", e.C::b, e.D::b); ! 82: return 0; ! 83: @} ! 84: @end example ! 85: ! 86: This will print out 2, 0, instead of 1,1. ! 87: ! 88: @end itemize ! 89: ! 90: @node Routines, Implementation Specifics, Limitations of g++, Top ! 91: @section Routines ! 92: ! 93: This section describes some of the routines used in the C++ front-end. ! 94: ! 95: @code{build_vtable} and @code{prepare_fresh_vtable} is used only within ! 96: the @file{cp-class.c} file, and only in @code{finish_struct} and ! 97: @code{modify_vtable_entries}. ! 98: ! 99: @code{build_vtable}, @code{prepare_fresh_vtable}, and ! 100: @code{finish_struct} are the only routines that set @code{DECL_VPARENT}. ! 101: ! 102: @code{finish_struct} can steal the virtual function table from parents, ! 103: this prohibits related_vslot from working. When finish_struct steals, ! 104: we know that ! 105: ! 106: @example ! 107: get_binfo (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (t)), t, 0) ! 108: @end example ! 109: ! 110: @noindent ! 111: will get the related binfo. ! 112: ! 113: @code{layout_basetypes} does something with the VIRTUALS. ! 114: ! 115: Supposedly (according to Tiemann) most of the breadth first searching ! 116: done, like in @code{get_base_distance} and in @code{get_binfo} was not ! 117: because of any design decision. I have since found out the at least one ! 118: part of the compiler needs the notion of depth first binfo searching, I ! 119: am going to try and convert the whole thing, it should just work. The ! 120: term left-most refers to the depth first left-most node. It uses ! 121: @code{MAIN_VARIANT == type} as the condition to get left-most, because ! 122: the things that have @code{BINFO_OFFSET}s of zero are shared and will ! 123: have themselves as their own @code{MAIN_VARIANT}s. The non-shared right ! 124: ones, are copies of the left-most one, hence if it is its own ! 125: @code{MAIN_VARIENT}, we know it IS a left-most one, if it is not, it is ! 126: a non-left-most one. ! 127: ! 128: @code{get_base_distance}'s path and distance matters in its use in: ! 129: ! 130: @itemize @bullet ! 131: @item ! 132: @code{prepare_fresh_vtable} (the code is probably wrong) ! 133: @item ! 134: @code{init_vfields} Depends upon distance probably in a safe way, ! 135: build_offset_ref might use partial paths to do further lookups, ! 136: hack_identifier is probably not properly checking access. ! 137: ! 138: @item ! 139: @code{get_first_matching_virtual} probably should check for ! 140: @code{get_base_distance} returning -2. ! 141: ! 142: @item ! 143: @code{resolve_offset_ref} should be called in a more deterministic ! 144: manner. Right now, it is called in some random contexts, like for ! 145: arguments at @code{build_method_call} time, @code{default_conversion} ! 146: time, @code{convert_arguments} time, @code{build_unary_op} time, ! 147: @code{build_c_cast} time, @code{build_modify_expr} time, ! 148: @code{convert_for_assignment} time, and ! 149: @code{convert_for_initialization} time. ! 150: ! 151: But, there are still more contexts it needs to be called in, one was the ! 152: ever simple: ! 153: ! 154: @example ! 155: if (obj.*pmi != 7) ! 156: @dots{} ! 157: @end example ! 158: ! 159: Seems that the problems were due to the fact that @code{TREE_TYPE} of ! 160: the @code{OFFSET_REF} was not a @code{OFFSET_TYPE}, but rather the type ! 161: of the referent (like @code{INTEGER_TYPE}). This problem was fixed by ! 162: changing @code{default_conversion} to check @code{TREE_CODE (x)}, ! 163: instead of only checking @code{TREE_CODE (TREE_TYPE (x))} to see if it ! 164: was @code{OFFSET_TYPE}. ! 165: ! 166: @end itemize ! 167: ! 168: @node Implementation Specifics, Glossary, Routines, Top ! 169: @section Implementation Specifics ! 170: ! 171: @itemize @bullet ! 172: @item Explicit Initialization ! 173: ! 174: The global list @code{current_member_init_list} contains the list of ! 175: mem-initializers specified in a constructor declaration. For example: ! 176: ! 177: @example ! 178: foo::foo() : a(1), b(2) @{@} ! 179: @end example ! 180: ! 181: @noindent ! 182: will initialize @samp{a} with 1 and @samp{b} with 2. ! 183: @code{expand_member_init} places each initialization (a with 1) on the ! 184: global list. Then, when the fndecl is being processed, ! 185: @code{emit_base_init} runs down the list, initializing them. It used to ! 186: be the case that g++ first ran down @code{current_member_init_list}, ! 187: then ran down the list of members initializing the ones that weren't ! 188: explicitly initialized. Things were rewritten to perform the ! 189: initializations in order of declaration in the class. So, for the above ! 190: example, @samp{a} and @samp{b} will be initialized in the order that ! 191: they were declared: ! 192: ! 193: @example ! 194: class foo @{ public: int b; int a; foo (); @}; ! 195: @end example ! 196: ! 197: @noindent ! 198: Thus, @samp{b} will be initialized with 2 first, then @samp{a} will be ! 199: initialized with 1, regardless of how they're listed in the mem-initializer. ! 200: ! 201: @item Argument Matching ! 202: ! 203: In early 1993, the argument matching scheme in @sc{gnu} C++ changed ! 204: significantly. The original code was completely replaced with a new ! 205: method that will, hopefully, be easier to understand and make fixing ! 206: specific cases much easier. ! 207: ! 208: The @samp{-fansi-overloading} option is used to enable the new code; at ! 209: some point in the future, it will become the default behavior of the ! 210: compiler. ! 211: ! 212: The file @file{cp-call.c} contains all of the new work, in the functions ! 213: @code{rank_for_overload}, @code{compute_harshness}, ! 214: @code{compute_conversion_costs}, and @code{ideal_candidate}. ! 215: ! 216: Instead of using obscure numerical values, the quality of an argument ! 217: match is now represented by clear, individual codes. The new data ! 218: structure @code{struct harshness} (it used to be an @code{unsigned} ! 219: number) contains: ! 220: ! 221: @enumerate a ! 222: @item the @samp{code} field, to signify what was involved in matching two ! 223: arguments; ! 224: @item the @samp{distance} field, used in situations where inheritance ! 225: decides which function should be called (one is ``closer'' than ! 226: another); ! 227: @item and the @samp{int_penalty} field, used by some codes as a tie-breaker. ! 228: @end enumerate ! 229: ! 230: The @samp{code} field is a number with a given bit set for each type of ! 231: code, OR'd together. The new codes are: ! 232: ! 233: @itemize @bullet ! 234: @item @code{EVIL_CODE} ! 235: The argument was not a permissible match. ! 236: ! 237: @item @code{CONST_CODE} ! 238: Currently, this is only used by @code{compute_conversion_costs}, to ! 239: distinguish when a non-@code{const} member function is called from a ! 240: @code{const} member function. ! 241: ! 242: @item @code{ELLIPSIS_CODE} ! 243: A match against an ellipsis @samp{...} is considered worse than all others. ! 244: ! 245: @item @code{USER_CODE} ! 246: Used for a match involving a user-defined conversion. ! 247: ! 248: @item @code{STD_CODE} ! 249: A match involving a standard conversion. ! 250: ! 251: @item @code{PROMO_CODE} ! 252: A match involving an integral promotion. For these, the ! 253: @code{int_penalty} field is used to handle the ARM's rule (XXX cite) ! 254: that a smaller @code{unsigned} type should promote to a @code{int}, not ! 255: to an @code{unsigned int}. ! 256: ! 257: @item @code{QUAL_CODE} ! 258: Used to mark use of qualifiers like @code{const} and @code{volatile}. ! 259: ! 260: @item @code{TRIVIAL_CODE} ! 261: Used for trivial conversions. The @samp{int_penalty} field is used by ! 262: @code{convert_harshness} to communicate further penalty information back ! 263: to @code{build_overload_call_real} when deciding which function should ! 264: be call. ! 265: @end itemize ! 266: ! 267: The functions @code{convert_to_aggr} and @code{build_method_call} use ! 268: @code{compute_conversion_costs} to rate each argument's suitability for ! 269: a given candidate function (that's how we get the list of candidates for ! 270: @code{ideal_candidate}). ! 271: ! 272: @end itemize ! 273: ! 274: @node Glossary, Macros, Implementation Specifics, Top ! 275: @section Glossary ! 276: ! 277: @table @r ! 278: @item binfo ! 279: The main data structure in the compiler used to represent the ! 280: inheritance relationships between classes. The data in the binfo can be ! 281: accessed by the BINFO_ accessor macros. ! 282: ! 283: @item vtable ! 284: @itemx virtual function table ! 285: ! 286: The virtual function table holds information used in virtual function ! 287: dispatching. In the compiler, they are usually referred to as vtables, ! 288: or vtbls. The first index is not used in the normal way, I believe it ! 289: is probably used for the virtual destructor. ! 290: ! 291: @item vfield ! 292: ! 293: vfields can be thought of as the base information needed to build ! 294: vtables. For every vtable that exists for a class, there is a vfield. ! 295: See also vtable and virtual function table pointer. When a type is used ! 296: as a base class to another type, the virtual function table for the ! 297: derived class can be based upon the vtable for the base class, just ! 298: extended to include the additional virtual methods declared in the ! 299: derived class. The virtual function table from a virtual base class is ! 300: never reused in a derived class. @code{is_normal} depends upon this. ! 301: ! 302: @item virtual function table pointer ! 303: ! 304: These are @code{FIELD_DECL}s that are pointer types that point to ! 305: vtables. See also vtable and vfield. ! 306: @end table ! 307: ! 308: @node Macros, Typical Behavior, Glossary, Top ! 309: @section Macros ! 310: ! 311: This section describes some of the macros used on trees. The list ! 312: should be alphabetical. Eventually all macros should be documented ! 313: here. There are some postscript drawings that can be used to better ! 314: understnad from of the more complex data structures, contact Mike Stump ! 315: (@code{mrs@@cygnus.com}) for information about them. ! 316: ! 317: @table @code ! 318: @item BINFO_BASETYPES ! 319: A vector of additional binfos for the types inherited by this basetype. ! 320: The binfos are fully unshared (except for virtual bases, in which ! 321: case the binfo structure is shared). ! 322: ! 323: If this basetype describes type D as inherited in C, ! 324: and if the basetypes of D are E anf F, ! 325: then this vector contains binfos for inheritance of E and F by C. ! 326: ! 327: Has values of: ! 328: ! 329: TREE_VECs ! 330: ! 331: ! 332: @item BINFO_INHERITANCE_CHAIN ! 333: Temporarily used to represent specific inheritances. It usually points ! 334: to the binfo associated with the lesser derived type, but it can be ! 335: reversed by reverse_path. For example: ! 336: ! 337: @example ! 338: Z ZbY least derived ! 339: | ! 340: Y YbX ! 341: | ! 342: X Xb most derived ! 343: ! 344: TYPE_BINFO (X) == Xb ! 345: BINFO_INHERITANCE_CHAIN (Xb) == YbX ! 346: BINFO_INHERITANCE_CHAIN (Yb) == ZbY ! 347: BINFO_INHERITANCE_CHAIN (Zb) == 0 ! 348: @end example ! 349: ! 350: Not sure is the above is really true, get_base_distance has is point ! 351: towards the most derived type, opposite from above. ! 352: ! 353: Set by build_vbase_path, recursive_bounded_basetype_p, ! 354: get_base_distance, lookup_field, lookup_fnfields, and reverse_path. ! 355: ! 356: What things can this be used on: ! 357: ! 358: TREE_VECs that are binfos ! 359: ! 360: ! 361: @item BINFO_OFFSET ! 362: The offset where this basetype appears in its containing type. ! 363: BINFO_OFFSET slot holds the offset (in bytes) from the base of the ! 364: complete object to the base of the part of the object that is allocated ! 365: on behalf of this `type'. This is always 0 except when there is ! 366: multiple inheritance. ! 367: ! 368: Used on TREE_VEC_ELTs of the binfos BINFO_BASETYPES (...) for example. ! 369: ! 370: ! 371: @item BINFO_VIRTUALS ! 372: A unique list of functions for the virtual function table. See also ! 373: TYPE_BINFO_VIRTUALS. ! 374: ! 375: What things can this be used on: ! 376: ! 377: TREE_VECs that are binfos ! 378: ! 379: ! 380: @item BINFO_VTABLE ! 381: Used to find the VAR_DECL that is the virtual function table associated ! 382: with this binfo. See also TYPE_BINFO_VTABLE. To get the virtual ! 383: function table pointer, see CLASSTYPE_VFIELD. ! 384: ! 385: What things can this be used on: ! 386: ! 387: TREE_VECs that are binfos ! 388: ! 389: Has values of: ! 390: ! 391: VAR_DECLs that are virtual function tables ! 392: ! 393: ! 394: @item BLOCK_SUPERCONTEXT ! 395: In the outermost scope of each function, it points to the FUNCTION_DECL ! 396: node. It aids in better DWARF support of inline functions. ! 397: ! 398: ! 399: @item CLASSTYPE_TAGS ! 400: CLASSTYPE_TAGS is a linked (via TREE_CHAIN) list of member classes of a ! 401: class. TREE_PURPOSE is the name, TREE_VALUE is the type (pushclass scans ! 402: these and calls pushtag on them.) ! 403: ! 404: finish_struct scans these to produce TYPE_DECLs to add to the ! 405: TYPE_FIELDS of the type. ! 406: ! 407: It is expected that name found in the TREE_PURPOSE slot is unique, ! 408: resolve_scope_to_name is one such place that depends upon this ! 409: uniqueness. ! 410: ! 411: ! 412: @item CLASSTYPE_METHOD_VEC ! 413: The following is true after finish_struct has been called (on the ! 414: class?) but not before. Before finish_struct is called, things are ! 415: different to some extent. Contains a TREE_VEC of methods of the class. ! 416: The TREE_VEC_LENGTH is the number of differently named methods plus one ! 417: for the 0th entry. The 0th entry is always allocated, and reserved for ! 418: ctors and dtors. If there are none, TREE_VEC_ELT(N,0) == NULL_TREE. ! 419: Each entry of the TREE_VEC is a FUNCTION_DECL. For each FUNCTION_DECL, ! 420: there is a DECL_CHAIN slot. If the FUNCTION_DECL is the last one with a ! 421: given name, the DECL_CHAIN slot is NULL_TREE. Otherwise it is the next ! 422: method that has the same name (but a different signature). It would ! 423: seem that it is not true that because the DECL_CHAIN slot is used in ! 424: this way, we cannot call pushdecl to put the method in the global scope ! 425: (cause that would overwrite the TREE_CHAIN slot), because they use ! 426: different _CHAINs. finish_struct_methods setups up one version of the ! 427: TREE_CHAIN slots on the FUNCTION_DECLs. ! 428: ! 429: friends are kept in TREE_LISTs, so that there's no need to use their ! 430: TREE_CHAIN slot for anything. ! 431: ! 432: Has values of: ! 433: ! 434: TREE_VECs ! 435: ! 436: ! 437: @item CLASSTYPE_VFIELD ! 438: Seems to be in the process of being renamed TYPE_VFIELD. Use on types ! 439: to get the main virtual function table pointer. To get the virtual ! 440: function table use BINFO_VTABLE (TYPE_BINFO ()). ! 441: ! 442: Has values of: ! 443: ! 444: FIELD_DECLs that are virtual function table pointers ! 445: ! 446: What things can this be used on: ! 447: ! 448: RECORD_TYPEs ! 449: ! 450: ! 451: @item DECL_CLASS_CONTEXT ! 452: Identifies the context that the _DECL was found in. For virtual function ! 453: tables, it points to the type associated with the virtual function ! 454: table. See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_FCONTEXT. ! 455: ! 456: The difference between this and DECL_CONTEXT, is that for virtuals ! 457: functions like: ! 458: ! 459: @example ! 460: struct A ! 461: @{ ! 462: virtual int f (); ! 463: @}; ! 464: ! 465: struct B : A ! 466: @{ ! 467: int f (); ! 468: @}; ! 469: ! 470: DECL_CONTEXT (A::f) == A ! 471: DECL_CLASS_CONTEXT (A::f) == A ! 472: ! 473: DECL_CONTEXT (B::f) == A ! 474: DECL_CLASS_CONTEXT (B::f) == B ! 475: @end example ! 476: ! 477: Has values of: ! 478: ! 479: RECORD_TYPEs, or UNION_TYPEs ! 480: ! 481: What things can this be used on: ! 482: ! 483: TYPE_DECLs, _DECLs ! 484: ! 485: ! 486: @item DECL_CONTEXT ! 487: Identifies the context that the _DECL was found in. Can be used on ! 488: virtual function tables to find the type associated with the virtual ! 489: function table, but since they are FIELD_DECLs, DECL_FIELD_CONTEXT is a ! 490: better access method. Internally the same as DECL_FIELD_CONTEXT, so ! 491: don't us both. See also DECL_FIELD_CONTEXT, DECL_FCONTEXT and ! 492: DECL_CLASS_CONTEXT. ! 493: ! 494: Has values of: ! 495: ! 496: RECORD_TYPEs ! 497: ! 498: ! 499: What things can this be used on: ! 500: ! 501: @display ! 502: VAR_DECLs that are virtual function tables ! 503: _DECLs ! 504: @end display ! 505: ! 506: ! 507: @item DECL_FIELD_CONTEXT ! 508: Identifies the context that the FIELD_DECL was found in. Internally the ! 509: same as DECL_CONTEXT, so don't us both. See also DECL_CONTEXT, ! 510: DECL_FCONTEXT and DECL_CLASS_CONTEXT. ! 511: ! 512: Has values of: ! 513: ! 514: RECORD_TYPEs ! 515: ! 516: What things can this be used on: ! 517: ! 518: @display ! 519: FIELD_DECLs that are virtual function pointers ! 520: FIELD_DECLs ! 521: @end display ! 522: ! 523: ! 524: @item DECL_NESTED_TYPENAME ! 525: Holds the fully qualified type name. Example, Base::Derived. ! 526: ! 527: Has values of: ! 528: ! 529: IDENTIFIER_NODEs ! 530: ! 531: What things can this be used on: ! 532: ! 533: TYPE_DECLs ! 534: ! 535: ! 536: @item DECL_NAME ! 537: ! 538: Has values of: ! 539: ! 540: @display ! 541: 0 for things that don't have names ! 542: IDENTIFIER_NODEs for TYPE_DECLs ! 543: @end display ! 544: ! 545: @item DECL_IGNORED_P ! 546: A bit that can be set to inform the debug information output routines in ! 547: the back-end that a certain _DECL node should be totally ignored. ! 548: ! 549: Used in cases where it is known that the debugging information will be ! 550: output in another file, or where a sub-type is known not to be needed ! 551: because the enclosing type is not needed. ! 552: ! 553: A compiler constructed virtual destructor in derived classes that do not ! 554: define an exlicit destructor that was defined exlicit in a base class ! 555: has this bit set as well. Also used on __FUNCTION__ and ! 556: __PRETTY_FUNCTION__ to mark they are ``compiler generated.'' c-decl and ! 557: c-lex.c both want DECL_IGNORED_P set for ``internally generated vars,'' ! 558: and ``user-invisible variable.'' ! 559: ! 560: Functions built by the C++ front-end such as default destructors, ! 561: virtual desctructors and default constructors want to be marked that ! 562: they are compiler generated, but unsure why. ! 563: ! 564: Currently, it is used in an absolute way in the C++ front-end, as an ! 565: optimization, to tell the debug information output routines to not ! 566: generate debugging information that will be output by another separately ! 567: compiled file. ! 568: ! 569: ! 570: @item DECL_VIRTUAL_P ! 571: A flag used on FIELD_DECLs and VAR_DECLs. (Documentation in tree.h is ! 572: wrong.) Used in VAR_DECLs to indicate that the variable is a vtable. ! 573: It is also used in FIELD_DECLs for vtable pointers. ! 574: ! 575: What things can this be used on: ! 576: ! 577: FIELD_DECLs and VAR_DECLs ! 578: ! 579: ! 580: @item DECL_VPARENT ! 581: Used to point to the parent type of the vtable if there is one, else it ! 582: is just the type associated with the vtable. Because of the sharing of ! 583: virtual function tables that goes on, this slot is not very useful, and ! 584: is in fact, not used in the compiler at all. It can be removed. ! 585: ! 586: What things can this be used on: ! 587: ! 588: VAR_DECLs that are virtual function tables ! 589: ! 590: Has values of: ! 591: ! 592: RECORD_TYPEs maybe UNION_TYPEs ! 593: ! 594: ! 595: @item DECL_FCONTEXT ! 596: Used to find the first baseclass in which this FIELD_DECL is defined. ! 597: See also DECL_CONTEXT, DECL_FIELD_CONTEXT and DECL_CLASS_CONTEXT. ! 598: ! 599: How it is used: ! 600: ! 601: Used when writing out debugging information about vfield and ! 602: vbase decls. ! 603: ! 604: What things can this be used on: ! 605: ! 606: FIELD_DECLs that are virtual function pointers ! 607: FIELD_DECLs ! 608: ! 609: ! 610: @item DECL_REFERENCE_SLOT ! 611: Used to hold the initialize for the reference. ! 612: ! 613: What things can this be used on: ! 614: ! 615: PARM_DECLs and VAR_DECLs that have a reference type ! 616: ! 617: ! 618: @item DECL_VINDEX ! 619: Used for FUNCTION_DECLs in two different ways. Before the structure ! 620: containing the FUNCTION_DECL is laid out, DECL_VINDEX may point to a ! 621: FUNCTION_DECL in a base class which is the FUNCTION_DECL which this ! 622: FUNCTION_DECL will replace as a virtual function. When the class is ! 623: laid out, this pointer is changed to an INTEGER_CST node which is ! 624: suitable to find an index into the virtual function table. See ! 625: get_vtable_entry as to how one can find the right index into the virtual ! 626: function table. The first index 0, of a virtual function table it not ! 627: used in the normal way, so the first real index is 1. ! 628: ! 629: DECL_VINDEX may be a TREE_LIST, that would seem to be a list of ! 630: overridden FUNCTION_DECLs. add_virtual_function has code to deal with ! 631: this when it uses the variable base_fndecl_list, but it would seem that ! 632: somehow, it is possible for the TREE_LIST to pursist until method_call, ! 633: and it should not. ! 634: ! 635: ! 636: What things can this be used on: ! 637: ! 638: FUNCTION_DECLs ! 639: ! 640: ! 641: @item DECL_SOURCE_FILE ! 642: Identifies what source file a particular declaration was found in. ! 643: ! 644: Has values of: ! 645: ! 646: "<built-in>" on TYPE_DECLs to mean the typedef is built in ! 647: ! 648: ! 649: @item DECL_SOURCE_LINE ! 650: Identifies what source line number in the source file the declaration ! 651: was found at. ! 652: ! 653: Has values of: ! 654: ! 655: @display ! 656: 0 for an undefined label ! 657: ! 658: 0 for TYPE_DECLs that are internally generated ! 659: ! 660: 0 for FUNCTION_DECLs for functions generated by the compiler ! 661: (not yet, but should be) ! 662: ! 663: 0 for ``magic'' arguments to functions, that the user has no ! 664: control over ! 665: @end display ! 666: ! 667: ! 668: @item TREE_USED ! 669: ! 670: Has values of: ! 671: ! 672: 0 for unused labels ! 673: ! 674: ! 675: @item TREE_ADDRESSABLE ! 676: A flag that is set for any type that has a constructor. ! 677: ! 678: ! 679: @item TREE_COMPLEXITY ! 680: They seem a kludge way to track recursion, poping, and pushing. They only ! 681: appear in cp-decl.c and cp-decl2.c, so the are a good candidate for ! 682: proper fixing, and removal. ! 683: ! 684: ! 685: @item TREE_PRIVATE ! 686: Set for FIELD_DECLs by finish_struct. But not uniformly set. ! 687: ! 688: The following routines do something with PRIVATE access: ! 689: build_method_call, alter_access, finish_struct_methods, ! 690: finish_struct, convert_to_aggr, CWriteLanguageDecl, CWriteLanguageType, ! 691: CWriteUseObject, compute_access, lookup_field, dfs_pushdecl, ! 692: GNU_xref_member, dbxout_type_fields, dbxout_type_method_1 ! 693: ! 694: ! 695: @item TREE_PROTECTED ! 696: The following routines do something with PROTECTED access: ! 697: build_method_call, alter_access, finish_struct, convert_to_aggr, ! 698: CWriteLanguageDecl, CWriteLanguageType, CWriteUseObject, ! 699: compute_access, lookup_field, GNU_xref_member, dbxout_type_fields, ! 700: dbxout_type_method_1 ! 701: ! 702: ! 703: @item TYPE_BINFO ! 704: Used to get the binfo for the type. ! 705: ! 706: Has values of: ! 707: ! 708: TREE_VECs that are binfos ! 709: ! 710: What things can this be used on: ! 711: ! 712: RECORD_TYPEs ! 713: ! 714: ! 715: @item TYPE_BINFO_BASETYPES ! 716: See also BINFO_BASETYPES. ! 717: ! 718: @item TYPE_BINFO_VIRTUALS ! 719: A unique list of functions for the virtual function table. See also ! 720: BINFO_VIRTUALS. ! 721: ! 722: What things can this be used on: ! 723: ! 724: RECORD_TYPEs ! 725: ! 726: ! 727: @item TYPE_BINFO_VTABLE ! 728: Points to the virtual function table associated with the given type. ! 729: See also BINFO_VTABLE. ! 730: ! 731: What things can this be used on: ! 732: ! 733: RECORD_TYPEs ! 734: ! 735: Has values of: ! 736: ! 737: VAR_DECLs that are virtual function tables ! 738: ! 739: ! 740: @item TYPE_NAME ! 741: Names the type. ! 742: ! 743: Has values of: ! 744: ! 745: @display ! 746: 0 for things that don't have names. ! 747: should be IDENTIFIER_NODE for RECORD_TYPEs UNION_TYPEs and ! 748: ENUM_TYPEs. ! 749: TYPE_DECL for RECORD_TYPEs, UNION_TYPEs and ENUM_TYPEs, but ! 750: shouldn't be. ! 751: TYPE_DECL for typedefs, unsure why. ! 752: @end display ! 753: ! 754: What things can one use this on: ! 755: ! 756: @display ! 757: TYPE_DECLs ! 758: RECORD_TYPEs ! 759: UNION_TYPEs ! 760: ENUM_TYPEs ! 761: @end display ! 762: ! 763: History: ! 764: ! 765: It currently points to the TYPE_DECL for RECORD_TYPEs, ! 766: UNION_TYPEs and ENUM_TYPEs, but it should be history soon. ! 767: ! 768: ! 769: @item TYPE_METHODS ! 770: Synonym for @code{CLASSTYPE_METHOD_VEC}. Chained together with ! 771: @code{TREE_CHAIN}. @file{dbxout.c} uses this to get at the methods of a ! 772: class. ! 773: ! 774: ! 775: @item TYPE_DECL ! 776: Used to represent typedefs, and used to represent bindings layers. ! 777: ! 778: Components: ! 779: ! 780: DECL_NAME is the name of the typedef. For example, foo would ! 781: be found in the DECL_NAME slot when @code{typedef int foo;} is ! 782: seen. ! 783: ! 784: DECL_SOURCE_LINE identifies what source line number in the ! 785: source file the declaration was found at. A value of 0 ! 786: indicates that this TYPE_DECL is just an internal binding layer ! 787: marker, and does not correspond to a user suppiled typedef. ! 788: ! 789: DECL_SOURCE_FILE ! 790: ! 791: @item TYPE_FIELDS ! 792: A linked list (via @code{TREE_CHAIN}) of member types of a class. The ! 793: list can contain @code{TYPE_DECL}s, but there can also be other things ! 794: in the list apparently. See also @code{CLASSTYPE_TAGS}. ! 795: ! 796: ! 797: @item TYPE_VIRTUAL_P ! 798: A flag used on a @code{FIELD_DECL} or a @code{VAR_DECL}, indicates it is ! 799: a virtual function table or a pointer to one. When used on a ! 800: @code{FUNCTION_DECL}, indicates that it is a virtual function. When ! 801: used on an @code{IDENTIFIER_NODE}, indicates that a function with this ! 802: same name exists and has been declared virtual. ! 803: ! 804: When used on types, it indicates that the type has virtual functions, or ! 805: is derived from one that does. ! 806: ! 807: Not sure if the above about virtual function tables is still true. See ! 808: also info on @code{DECL_VIRTUAL_P}. ! 809: ! 810: What things can this be used on: ! 811: ! 812: FIELD_DECLs, VAR_DECLs, FUNCTION_DECLs, IDENTIFIER_NODEs ! 813: ! 814: ! 815: @item VF_BASETYPE_VALUE ! 816: Get the associated type from the binfo that caused the given vfield to ! 817: exist. This is the least derived class (the most parent class) that ! 818: needed a virtual function table. It is probably the case that all uses ! 819: of this field are misguided, but they need to be examined on a ! 820: case-by-case basis. See history for more information on why the ! 821: previous statement was made. ! 822: ! 823: Set at @code{finish_base_struct} time. ! 824: ! 825: What things can this be used on: ! 826: ! 827: TREE_LISTs that are vfields ! 828: ! 829: History: ! 830: ! 831: This field was used to determine if a virtual function table's ! 832: slot should be filled in with a certain virtual function, by ! 833: checking to see if the type returned by VF_BASETYPE_VALUE was a ! 834: parent of the context in which the old virtual function existed. ! 835: This incorrectly assumes that a given type _could_ not appear as ! 836: a parent twice in a given inheritance lattice. For single ! 837: inheritance, this would in fact work, because a type could not ! 838: possibly appear more than once in an inheritance lattice, but ! 839: with multiple inheritance, a type can appear more than once. ! 840: ! 841: ! 842: @item VF_BINFO_VALUE ! 843: Identifies the binfo that caused this vfield to exist. If this vfield ! 844: is from the first direct base class that has a virtual function table, ! 845: then VF_BINFO_VALUE is NULL_TREE, otherwise it will be the binfo of the ! 846: direct base where the vfield came from. Can use @code{TREE_VIA_VIRTUAL} ! 847: on result to find out if it is a virtual base class. Related to the ! 848: binfo found by ! 849: ! 850: @example ! 851: get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) ! 852: @end example ! 853: ! 854: @noindent ! 855: where @samp{t} is the type that has the given vfield. ! 856: ! 857: @example ! 858: get_binfo (VF_BASETYPE_VALUE (vfield), t, 0) ! 859: @end example ! 860: ! 861: @noindent ! 862: will return the binfo for the the given vfield. ! 863: ! 864: May or may not be set at @code{modify_vtable_entries} time. Set at ! 865: @code{finish_base_struct} time. ! 866: ! 867: What things can this be used on: ! 868: ! 869: TREE_LISTs that are vfields ! 870: ! 871: ! 872: @item VF_DERIVED_VALUE ! 873: Identifies the type of the most derived class of the vfield, excluding ! 874: the the class this vfield is for. ! 875: ! 876: Set at @code{finish_base_struct} time. ! 877: ! 878: What things can this be used on: ! 879: ! 880: TREE_LISTs that are vfields ! 881: ! 882: ! 883: @item VF_NORMAL_VALUE ! 884: Identifies the type of the most derived class of the vfield, including ! 885: the class this vfield is for. ! 886: ! 887: Set at @code{finish_base_struct} time. ! 888: ! 889: What things can this be used on: ! 890: ! 891: TREE_LISTs that are vfields ! 892: ! 893: ! 894: @item WRITABLE_VTABLES ! 895: This is a option that can be defined when building the compiler, that ! 896: will cause the compiler to output vtables into the data segment so that ! 897: the vtables maybe written. This is undefined by default, because ! 898: normally the vtables should be unwritable. People that implement object ! 899: I/O facilities may, or people that want to change the dynamic type of ! 900: objects may want to have the vtables writable. Another way of achieving ! 901: this would be to make a copy of the vtable into writable memory, but the ! 902: drawback there is that that method only changes the type for one object. ! 903: ! 904: @end table ! 905: ! 906: @node Typical Behavior, Coding Conventions, Macros, Top ! 907: @section Typical Behavior ! 908: ! 909: @cindex parse errors ! 910: ! 911: Whenever seemingly normal code fails with errors like ! 912: @code{syntax error at `\@{'}, it's highly likely that grokdeclarator is ! 913: returning a NULL_TREE for whatever reason. ! 914: ! 915: @node Coding Conventions, Templates, Typical Behavior, Top ! 916: @section Coding Conventions ! 917: ! 918: It should never be that case that trees are modified in-place by the ! 919: back-end, @emph{unless} it is guaranteed that the semantics are the same ! 920: no matter how shared the tree structure is. @file{fold-const.c} still ! 921: has some cases where this is not true, but rms hypothesizes that this ! 922: will never be a problem. ! 923: ! 924: @node Templates, Access Control, Coding Conventions, Top ! 925: @section Templates ! 926: ! 927: g++ uses the simple approach to instantiating templates: it blindly ! 928: generates the code for each instantiation as needed. For class ! 929: templates, g++ pushes the template parameters into the namespace for the ! 930: duration of the instantiation; for function templates, it's a simple ! 931: search and replace. ! 932: ! 933: This approach does not support any of the template definition-time error ! 934: checking that is being bandied about by X3J16. It makes no attempt to deal ! 935: with name binding in a consistent way. ! 936: ! 937: Instantiation of a class template is triggered by the use of a template ! 938: class anywhere but in a straight declaration like @code{class A<int>}. ! 939: This is wrong; in fact, it should not be triggered by typedefs or ! 940: declarations of pointers. Now that explicit instantiation is supported, ! 941: this misfeature is not necessary. ! 942: ! 943: Important functions: ! 944: ! 945: @table @code ! 946: @item instantiate_class_template ! 947: This function ! 948: @end table ! 949: ! 950: @node Access Control, Error Reporting, Templates, Top ! 951: @section Access Control ! 952: The function compute_access returns one of three values: ! 953: ! 954: @table @code ! 955: @item access_public ! 956: means that the field can be accessed by the current lexical scope. ! 957: ! 958: @item access_protected ! 959: means that the field cannot be accessed by the current lexical scope ! 960: because it is protected. ! 961: ! 962: @item access_private ! 963: means that the field cannot be accessed by the current lexical scope ! 964: because it is private. ! 965: @end table ! 966: ! 967: DECL_ACCESS is used for access declarations; alter_access creates a list ! 968: of types and accesses for a given decl. ! 969: ! 970: Formerly, DECL_@{PUBLIC,PROTECTED,PRIVATE@} corresponded to the return ! 971: codes of compute_access and were used as a cache for compute_access. ! 972: Now they are not used at all. ! 973: ! 974: TREE_PROTECTED and TREE_PRIVATE are used to record the access levels ! 975: granted by the containing class. BEWARE: TREE_PUBLIC means something ! 976: completely unrelated to access control! ! 977: ! 978: @node Error Reporting, Parser, Access Control, Top ! 979: @section Error Reporting ! 980: ! 981: The C++ front-end uses a call-back mechanism to allow functions to print ! 982: out reasonable strings for types and functions without putting extra ! 983: logic in the functions where errors are found. The interface is through ! 984: the @code{cp_error} function (or @code{cp_warning}, etc.). The ! 985: syntax is exactly like that of @code{error}, except that a few more ! 986: conversions are supported: ! 987: ! 988: @itemize @bullet ! 989: @item ! 990: %C indicates a value of `enum tree_code'. ! 991: @item ! 992: %D indicates a *_DECL node. ! 993: @item ! 994: %E indicates a *_EXPR node. ! 995: @item ! 996: %L indicates a value of `enum languages'. ! 997: @item ! 998: %P indicates the name of a parameter (i.e. "this", "1", "2", ...) ! 999: @item ! 1000: %T indicates a *_TYPE node. ! 1001: @item ! 1002: %O indicates the name of an operator (MODIFY_EXPR -> "operator ="). ! 1003: ! 1004: @end itemize ! 1005: ! 1006: There is some overlap between these; for instance, any of the node ! 1007: options can be used for printing an identifier (though only @code{%D} ! 1008: tries to decipher function names). ! 1009: ! 1010: For a more verbose message (@code{class foo} as opposed to just @code{foo}, ! 1011: including the return type for functions), use @code{%#c}. ! 1012: To have the line number on the error message indicate the line of the ! 1013: DECL, use @code{cp_error_at} and its ilk; to indicate which argument you want, ! 1014: use @code{%+D}, or it will default to the first. ! 1015: ! 1016: @node Parser, Copying Objects, Error Reporting, Top ! 1017: @section Parser ! 1018: ! 1019: Some comments on the parser: ! 1020: ! 1021: The @code{after_type_declarator} / @code{notype_declarator} hack is ! 1022: necessary in order to allow redeclarations of @code{TYPENAME}s, for ! 1023: instance ! 1024: ! 1025: @example ! 1026: typedef int foo; ! 1027: class A @{ ! 1028: char *foo; ! 1029: @}; ! 1030: @end example ! 1031: ! 1032: In the above, the first @code{foo} is parsed as a @code{notype_declarator}, ! 1033: and the second as a @code{after_type_declarator}. ! 1034: ! 1035: Ambiguities: ! 1036: ! 1037: There are currently four reduce/reduce ambiguities in the parser. They are: ! 1038: ! 1039: 1) Between @code{template_parm} and ! 1040: @code{named_class_head_sans_basetype}, for the tokens @code{aggr ! 1041: identifier}. This situation occurs in code looking like ! 1042: ! 1043: @example ! 1044: template <class T> class A @{ @}; ! 1045: @end example ! 1046: ! 1047: It is ambiguous whether @code{class T} should be parsed as the ! 1048: declaration of a template type parameter named @code{T} or an unnamed ! 1049: constant parameter of type @code{class T}. Section 14.6, paragraph 3 of ! 1050: the January '94 working paper states that the first interpretation is ! 1051: the correct one. This ambiguity results in two reduce/reduce conflicts. ! 1052: ! 1053: 2) Between @code{primary} and @code{type_id} for code like @samp{int()} ! 1054: in places where both can be accepted, such as the argument to ! 1055: @code{sizeof}. Section 8.1 of the pre-San Diego working paper specifies ! 1056: that these ambiguous constructs will be interpreted as @code{typename}s. ! 1057: This ambiguity results in six reduce/reduce conflicts between ! 1058: @samp{absdcl} and @samp{functional_cast}. ! 1059: ! 1060: 3) Between @code{functional_cast} and ! 1061: @code{complex_direct_notype_declarator}, for various token strings. ! 1062: This situation occurs in code looking like ! 1063: ! 1064: @example ! 1065: int (*a); ! 1066: @end example ! 1067: ! 1068: This code is ambiguous; it could be a declaration of the variable ! 1069: @samp{a} as a pointer to @samp{int}, or it could be a functional cast of ! 1070: @samp{*a} to @samp{int}. Section 6.8 specifies that the former ! 1071: interpretation is correct. This ambiguity results in 7 reduce/reduce ! 1072: conflicts. Another aspect of this ambiguity is code like 'int (x[2]);', ! 1073: which is resolved at the '[' and accounts for 6 reduce/reduce conflicts ! 1074: between @samp{direct_notype_declarator} and ! 1075: @samp{primary}/@samp{overqualified_id}. Finally, there are 4 r/r ! 1076: conflicts between @samp{expr_or_declarator} and @samp{primary} over code ! 1077: like 'int (a);', which could probably be resolved but would also ! 1078: probably be more trouble than it's worth. In all, this situation ! 1079: accounts for 17 conflicts. Ack! ! 1080: ! 1081: The second case above is responsible for the failure to parse 'LinppFile ! 1082: ppfile (String (argv[1]), &outs, argc, argv);' (from Rogue Wave ! 1083: Math.h++) as an object declaration, and must be fixed so that it does ! 1084: not resolve until later. ! 1085: ! 1086: 4) Indirectly between @code{after_type_declarator} and @code{parm}, for ! 1087: type names. This occurs in (as one example) code like ! 1088: ! 1089: @example ! 1090: typedef int foo, bar; ! 1091: class A @{ ! 1092: foo (bar); ! 1093: @}; ! 1094: @end example ! 1095: ! 1096: What is @code{bar} inside the class definition? We currently interpret ! 1097: it as a @code{parm}, as does Cfront, but IBM xlC interprets it as an ! 1098: @code{after_type_declarator}. I believe that xlC is correct, in light ! 1099: of 7.1p2, which says "The longest sequence of @i{decl-specifiers} that ! 1100: could possibly be a type name is taken as the @i{decl-specifier-seq} of ! 1101: a @i{declaration}." However, it seems clear that this rule must be ! 1102: violated in the case of constructors. This ambiguity accounts for 8 ! 1103: conflicts. ! 1104: ! 1105: Unlike the others, this ambiguity is not recognized by the Working Paper. ! 1106: ! 1107: @node Copying Objects, Exception Handling, Parser, Top ! 1108: @section Copying Objects ! 1109: ! 1110: The generated copy assignment operator in g++ does not currently do the ! 1111: right thing for multiple inheritance involving virtual bases; it just ! 1112: calls the copy assignment operators for its direct bases. What it ! 1113: should probably do is: ! 1114: ! 1115: 1) Split up the copy assignment operator for all classes that have ! 1116: vbases into "copy my vbases" and "copy everything else" parts. Or do ! 1117: the trickiness that the constructors do to ensure that vbases don't get ! 1118: initialized by intermediate bases. ! 1119: ! 1120: 2) Wander through the class lattice, find all vbases for which no ! 1121: intermediate base has a user-defined copy assignment operator, and call ! 1122: their "copy everything else" routines. If not all of my vbases satisfy ! 1123: this criterion, warn, because this may be surprising behavior. ! 1124: ! 1125: 3) Call the "copy everything else" routine for my direct bases. ! 1126: ! 1127: If we only have one direct base, we can just foist everything off onto ! 1128: them. ! 1129: ! 1130: This issue is currently under discussion in the core reflector ! 1131: (2/28/94). ! 1132: ! 1133: @node Exception Handling, Free Store, Copying Objects, Top ! 1134: @section Exception Handling ! 1135: ! 1136: Note, exception handling in g++ is still under development. ! 1137: ! 1138: This section describes the mapping of C++ exceptions in the C++ ! 1139: front-end, into the back-end exception handling framework. ! 1140: ! 1141: The basic mechanism of exception handling in the back-end is ! 1142: unwind-protect a la elisp. This is a general, robust, and language ! 1143: independent representation for exceptions. ! 1144: ! 1145: The C++ front-end exceptions are mapping into the unwind-protect ! 1146: semantics by the C++ front-end. The mapping is describe below. ! 1147: ! 1148: Objects with RTTI support should use the RTTI information to do mapping ! 1149: and checking. Objects without RTTI, like int and const char *, have to ! 1150: use another means of matching. Currently we use the normal mangling used in ! 1151: building functions names. Int's are "i", const char * is PCc, etc... ! 1152: ! 1153: Unfortunately, the standard allows standard type conversions on throw ! 1154: parameters so they can match catch handlers. This means we need a ! 1155: mechanism to handle type conversion at run time, ICK. I read this part ! 1156: again, and it appears that we only have to be able to do a few of the ! 1157: conversions at run time, so we should be ok. ! 1158: ! 1159: In C++, all cleanups should be protected by exception regions. The ! 1160: region starts just after the reason why the cleanup is created has ! 1161: ended. For example, with an automatic variable, that has a constructor, ! 1162: it would be right after the constructor is run. The region ends just ! 1163: before the finalization is expanded. Since the backend may expand the ! 1164: cleanup multiple times along different paths, once for normal end of the ! 1165: region, once for non-local gotos, once for returns, etc, the backend ! 1166: must take special care to protect the finalization expansion, if the ! 1167: expansion is for any other reason than normal region end, and it is ! 1168: `inline' (it is inside the exception region). The backend can either ! 1169: choose to move them out of line, or it can created an exception region ! 1170: over the finalization to protect it, and in the handler associated with ! 1171: it, it would not run the finalization as it otherwise would have, but ! 1172: rather just rethrow to the outer handler, careful to skip the normal ! 1173: handler for the original region. ! 1174: ! 1175: In Ada, they will use the more runtime intensive approach of having ! 1176: fewer regions, but at the cost of additional work at run time, to keep a ! 1177: list of things that need cleanups. When a variable has finished ! 1178: construction, they add the cleanup to the list, when the come to the end ! 1179: of the lifetime of the variable, the run the list down. If the take a ! 1180: hit before the section finishes normally, they examine the list for ! 1181: actions to perform. I hope they add this logic into the back-end, as it ! 1182: would be nice to get that alternative approach in C++. ! 1183: ! 1184: On an rs6000, xlC stores exception objects on that stack, under the try ! 1185: block. When is unwinds down into a handler, the frame pointer is ! 1186: adjusted back to the normal value for the frame in which the handler ! 1187: resides, and the stack pointer is left unchanged from the time at which ! 1188: the object was throwed. This is so that there is always someplace for ! 1189: the exception object, and nothing can overwrite it, once we start ! 1190: throwing. The only bad part, is that the stack remains large. ! 1191: ! 1192: Flaws in g++'s exception handling. The stack pointer is restored from ! 1193: stack, we want to match rs6000, and propagate the stack pointer from ! 1194: time of throw, down, to the catch place. ! 1195: ! 1196: Only exact type matching of throw types works (references work also), ! 1197: catch variables cannot be used. Only works on a Sun sparc running SunOS ! 1198: 4.1.x. Unwinding to outer catch clauses works. All temps and local ! 1199: variables are cleaned up in all unwinded scopes. Completed parts of ! 1200: partially constructed objects are not cleaned up. Don't expect ! 1201: exception handling to work right if you optimize, in fact the compiler ! 1202: will probably core dump. If two EH regions are the exact same size, the ! 1203: backend cannot tell which one is first. It punts by picking the last ! 1204: one, if they tie. This is usually right. We really should stick in a ! 1205: nop, if they are the same size. ! 1206: ! 1207: If we fall off the end of a series of catch blocks, we return to the ! 1208: flow of control in a normal fasion. But this is wrong, we should ! 1209: rethrow. ! 1210: ! 1211: When we invoke the copy constructor for an exception object because it ! 1212: is passed by value, and if we take a hit (exception) inside the copy ! 1213: constructor someplace, where do we go? I have tentatively choosen to ! 1214: not catch throws by the outer block at the same unwind level, if one ! 1215: exists, but rather to allow the frame to unwind into the next series of ! 1216: handlers, if any. If this is the wrong way to do it, we will need to ! 1217: protect the rest of the handler in some fashion. Maybe just changing ! 1218: the handler's handler to protect the whole series of handlers is the ! 1219: right way to go. ! 1220: ! 1221: The EH object is copied like it should be, if it is passed by value, ! 1222: otherwise we get a reference directly to it. ! 1223: ! 1224: EH objects make it through unwinding, but are subject to being ! 1225: overwritten as they are still past the top of stack. Don't throw ! 1226: automatic objects if this is a problem. ! 1227: ! 1228: Exceptions in catch handlers now go to outer block. ! 1229: ! 1230: @node Free Store, Concept Index, Exception Handling, Top ! 1231: @section Free Store ! 1232: ! 1233: operator new [] adds a magic cookie to the beginning of arrays for which ! 1234: the number of elements will be needed by operator delete []. These are ! 1235: arrays of objects with destructors and arrays of objects that define ! 1236: operator delete [] with the optional size_t argument. This cookie can ! 1237: be examined from a program as follows: ! 1238: ! 1239: @example ! 1240: typedef unsigned long size_t; ! 1241: extern "C" int printf (const char *, ...); ! 1242: ! 1243: size_t nelts (void *p) ! 1244: @{ ! 1245: struct cookie @{ ! 1246: size_t nelts __attribute__ ((aligned (sizeof (double)))); ! 1247: @}; ! 1248: ! 1249: cookie *cp = (cookie *)p; ! 1250: --cp; ! 1251: ! 1252: return cp->nelts; ! 1253: @} ! 1254: ! 1255: struct A @{ ! 1256: ~A() @{ @} ! 1257: @}; ! 1258: ! 1259: main() ! 1260: @{ ! 1261: A *ap = new A[3]; ! 1262: printf ("%ld\n", nelts (ap)); ! 1263: @} ! 1264: @end example ! 1265: ! 1266: @node Concept Index, , Free Store, Top ! 1267: @section Concept Index ! 1268: ! 1269: @printindex cp ! 1270: ! 1271: @bye
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.