C++ ABI Open Issues
Revised 17 November 2000
[001110] Reopened and reclosed A-5. Closed A-30, A-31, D-14, D-18, G-4.
[001107] New issues A-30, A-31. D-18.
[000901] Closed C-19.
The issues below make use of the following definitions:
call | Function call interface, i.e. call linkage |
data | Data layout |
lib | Runtime library support |
lif | Library interface, i.e. API |
g | Potential gABI impact |
ps | Potential psABI impact |
source | Source code conventions (i.e. API, not ABI) |
tools | May affect how program construction tools interact |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-1 | Vptr location | data | closed | SGI | 990520 | 990624 |
Summary: Where is the Vptr stored in an object (first or last are the usual answers). | ||||||
Resolution : First. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-2 | Virtual base classes | data | closed | SGI | 990520 | 990624 |
Summary: Where are the virtual base subobjects placed in the class layout? How are data member accesses to them handled? | ||||||
Resolution : Virtual base subobjects are normally placed at the end (see issue A-9). The Vtable will contain an offset to the beginning of the base object for use by member accesses to them (see issue B-6). |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-3 | Multiple inheritance | data | closed | SGI | 990520 | 990701 |
Summary: Define the class layout in the presence of multiple base classes. | ||||||
Resolution : See the class layout description in closed issue A-9. Briefly, empty bases will normally go at offset zero, non-virtual base classes at the beginning, and virtual base classes at the end. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-4 | Empty base classes | data | closed | SGI | 990520 | 990624 |
Summary: Where are empty base classes allocated? | ||||||
Resolution : At offset zero if possible. See A-9. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-5 | Empty parameters | data | closed | SGI | 990520 | 001117 |
Summary: When passing a parameter with an empty class type by value, what is the convention? | ||||||
Resolution : Except for cases of non-trivial copy constructors (see C-7), and parameters in the variable part of varargs lists, A single parameter slot will be allocated to empty parameters, as though they were a struct containing a single character. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-6 | RTTI .o representation | data call ps | closed | SGI | 990520 | 991028 |
Summary:
Define the data structure to be used for RTTI, that is:
| ||||||
Resolution : Defined in the Draft C++ ABI for IA-64 document. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-7 | Vptr sharing with primary base class | data | closed | HP | 990603 | 990729 |
Summary: It is in general possible to share the virtual pointer with a dynamic base class (the primary base class). Which base class do we use for this? | ||||||
Resolution : Share with the first non-virtual dynamic base class, or if none with the first nearly empty virtual base class. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-8 | (Virtual) base class alignment | data | closed | HP | 990603 | 990624 |
Summary: A (virtual) base class may have a larger alignment constraint than a derived class. Do we agree to extend the alignment constraint to the derived class? | ||||||
Resolution : The derived class will have at least the alignment of any base class. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-9 | Sorting fields as allowed by [class.mem]/12 | data | closed | HP | 990603 | 990624 |
Summary: The standard constrains ordering of class members in memory only if they are not separated by an access clause. Do we use an access clause as an opportunity to fill the gaps left by padding? | ||||||
Resolution : See the Draft C++ ABI for IA-64 . |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-10 | Class parameters in registers | call | closed | HP | 990603 | 990701 |
Summary:
The C ABI specifies that small structs are passed in registers.
Does this apply to small non-POD C++ objects passed by value?
What about the copy constructor and this pointer in that case?
| ||||||
Resolution : Non-POD C++ objects are passed like C structs, except for cases with non-trivial copy constructors identified in C-7. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-11 | Pointers to member functions | data | closed | Cygnus | 990603 | 990812 |
Summary: How should pointers to member functions be represented? | ||||||
Resolution: As a pair of values, a "pointer" and a this adjustment. See the closed list for a more detailed description. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-12 | Merging secondary vtables | data | closed | Sun | 990610 | 990805 |
Summary: Sun merges the secondary Vtables for a class (i.e. those for non-primary base classes) with the primary Vtable by appending them. This allows their reference via the primary Vtable entry symbol, minimizing the number of external symbols required in linking, in the GOT, etc. | ||||||
Resolution: Concatenate the Vtables associated with a class in the same order that the corresponding base subobjects are allocated in the object. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-13 | Parameter struct field promotion | call | closed | SGI | 990603 | 990701 |
Summary: It is possible to pass small classes either as memory images, as is specified by the base ABI for C structs, or as a sequence of parameters, one for each member. Which should be done, and if the latter, what are the rules for identifying "small" classes? | ||||||
Resolution: No special treatment will be specified by the ABI. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-14 | Pointers to data members | data | closed | SGI | 990729 | 990805 |
Summary: How should pointers to data members be represented? | ||||||
Resolution: Represented as one plus the offset from the base address. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-15 | Empty bit-fields | data | closed | CodeSourcery | 991214 | 000106 |
Summary: How are zero-length bit-fields handled? | ||||||
Resolution: Zero-length bit-fields do not prevent a class from being considered empty or nearly empty. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-16 | Nearly empty virtual bases | data | closed | SGI | 991228 | 000106 |
Summary: May a class with non-empty, non-primary, virtual base classes be treated as nearly empty (and thus eligible to be a primary base) if its only non-vptr data is in its virtual base classes? | ||||||
Resolution: Virtual base classes do not prevent a class from being considered nearly empty. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-17 | Primary indirect virtual base allocation | data | closed | SGI | 991228 | 000113 |
Summary: When a nearly empty virtual base class A is allocated as the primary base class of class B, and then B is allocated as a base class of C, should A (i.e. its vptr) be separately allocated in C, or should its first occurrence in a previously allocated base B be used as its allocation in C? | ||||||
Resolution: Do not reallocate a nearly empty virtual base class that is the primary base class of any other base class, direct or indirect. Use the first primary base class instance in the inheritance hierarchy as its allocation, in the usual depth-first, left-to-right order. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-18 | Virtual base alignment | data | closed | SGI | 991228 | 000113 |
Summary: Should virtual bases have a different effect on class alignment than other components? | ||||||
Resolution: Yes. When allocating the non-virtual part of a base class, use its non-virtual allignment, i.e. ignoring its virtual bases' contributions. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-19 | Primary indirect virtual base choice | data | closed | All | 000106 | 000120 |
Summary: In allocating class C, when the first nearly empty virtual base class A is allocated as the primary base class of a later nearly empty virtual base class B, should A or B become the primary base class of C? | ||||||
Resolution: Do not use a virtual base as primary if it is already a primary base of some other direct or indirect base, unless such are the only candidates. In either case, use the first candidate in depth-first, left-to-right order in the inheritance graph. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-20 | Operator new array cookies | data | closed | All | 000113 | 000120 |
Summary: When operator new is used to create a new dynamic-length array, a cookie must be stored to remember the allocated length so that it can be deallocated correctly. | ||||||
Resolution: In principle, place cookie immediately before array, aligned naturally. Use no cookie for element types with no destructors. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-21 | Placement new array cookies | data | closed | All | 000113 | 000217 |
Summary: Same issue as A-20, except that for placement new, the user supplies already-allocated space. Therefore, there is a conflict between wanting to make delete() work on arrays created in this way, and wanting to avoid surprising users who haven't allocated enough space for the cookie. Also, are cookies allocated if there is no destructor? | ||||||
Resolution:
Use no cookie for element types with no destructors,
nor for ::operator new(size_t, void*) .
Otherwise, use a cookie as in issue A-20.
See the Draft C++ ABI for IA-64.
|
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-22 | RTTI for reference types | data | closed | CodeSourcery | 000119 | 000203 |
Summary: __reference_type_info does not appear to be necessary. | ||||||
Resolution: Remove it. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-23 | RTTI class descriptors | data | closed | CodeSourcery | 000124 | 000302 |
Summary: Resolve several questions about the RTTI representation of class types. | ||||||
Resolution: See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-24 | RTTI for incomplete types | data | closed | CodeSourcery | 000126 | 000330 |
Summary: How does RTTI represent incomplete types? | ||||||
Resolution: Use class_type_info distinct from the complete type copy, add a flag to pointer_type_info if it points to incomplete type RTTI, and do mangled name comparison if an incomplete pointer is involved. See the writeup in the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-25 | Excess-width bitfields | data | closed | IBM | 000204 | 000217 |
Summary:
C++ allows bitfields with a larger size specified than that required by
the declared type, e.g. int f: 64 .
How should they be allocated?
| ||||||
Resolution: Allocate the field with alignment determined as though it were the largest integer type that fits in the specified size, and use the first bits available in the field (lowest order for little endian IA-64) for the actual data. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-26 | NULL pointers to member functions | data | closed | CodeSourcery | 000221 | 000302 |
Summary: How are NULL pointers to member functions represented? | ||||||
Resolution:
A NULL pointer is represented by a 0 value of ptr ,
and the value of adj is irrelevant.
|
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-27 | NULL pointers to data members | data | closed | CodeSourcery | 000222 | 000302 |
Summary: How are NULL pointers to member data represented? | ||||||
Resolution: A NULL pointer is represented by the value -1. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-28 | RTTI equality testing | data | closed | CodeSourcery | 000406 | 000504 |
Summary: Can we get back the ability to do a simple test for RTTI equality? | ||||||
Resolution: Mangle the name NTBS for std::type_info separately, emit it in its own COMDAT, and use it instead of the RTTI struct, at least if the incomplete flags are set in pointer types. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-29 | RTTI pointer-to-member | data | closed | CodeSourcery | 000407 | 000504 |
Summary: Derive __pointer_to_member_type_info from __pointer_type_info. | ||||||
Resolution: Derive __pointer_to_member_type_info and __pointer_type_info from a common base class __pbase_type_info. Add a new flag to __pbase_type_info indicating that the class of a pointer-to-member is incomplete (propagated up a chain of pointers). |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-30 | RTTI portability | data | closed | HUB | 001012 | 001109 |
Summary: What must be specified to produce RTTI portability? Are member layouts specified? Names? Virtual functions? | ||||||
Resolution: Data members of the ABI-defined type_info derived classes must be allocated as specified, and their names are normative. Virtual functions, beyond the Standard-specified destructor, are implementation-specific, and may not be referenced outside the compiler and system vendors' runtime libraries. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
A-31 | Overlaying tail padding | data | closed | CodeSourcery | 001019 | 001109 |
Summary: Should we change the decision to overlay tail padding in class layout? For volatile members? In general? | ||||||
Resolution: The overlaying of tail padding is eliminated, but we will retain the treatment of empty bases. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-1 | Adjustment of "this" pointer (e.g. thunks) | data call | closed | SGI | 990520 | 991202 |
Summary: There are several methods for adjusting the this pointer for a member function call, including thunks or offsets located in the vtable. We need to agree on the mechanism used, and on the location of offsets, if any are needed. To maximize performance on IA64, a slightly unusual approach such as using secondary entry points to perform the adjustment may actually prove interesting. | ||||||
Resolution: See the writeup in the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-2 | Covariant return types | call | closed | SGI | 990520 | 990722 |
Summary: There are several methods for adjusting the 'this' pointer of the returned value for member functions with covariant return types. We need to decide how this is done. Return thunks might be especially costly on IA64, so a solution based on returning multiple pointers may prove more interesting. | ||||||
Resolution: Provide a separate Vtable entry for each return type. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-3 | Allowed caching of vtable contents | call | closed | HP | 990603 | 990805 |
Summary: The contents of the vtable can sometimes be modified, but the concensus is that it is nonetheless always allowed to "cache" elements, i.e. to retain them in registers and reuse them, whenever it is really useful. However, this may sometimes break "beyond the standard" code, such as code loading a shared library that replaces a virtual function. Can we all agree when caching is allowed? | ||||||
Resolution: Caching is allowed within a member function. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-4 | Function descriptors in vtable | data | closed | HP | 990603 | 990805 |
Summary: For a runtime architecture where the caller is expected to load the GP of the callee (if it is in, or may be in, a different DSO), e.g. HP/UX, what should vtable entries contain? One possibility is to put a function address/GP pair in the vtable. Another is to include only the address of a thunk which loads the GP before doing the actual call. | ||||||
Resolution: The Vtable will contain a function address/GP pair. |
[991007 All] Note that, though this issue was closed, it may prove necessary to reopen it if the underlying C ABI treatment of function pointers changes.
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-5 | Where are vtables emitted? | data | closed | HP | 990603 | 991118 |
Summary: In C++, there are various things with external linkage that can be defined in multiple translation units, while the ODR requires that the program behave as if there were only a single definition. From the user's standpoint, this applies to inlines and templates. From the implementation's perspective, it also applies to things like vtables and RTTI info. (We call this vague linkage.) | ||||||
Resolution: Vtables will be emitted with the key function (first virtual function that is not inline at the point of class definition), if any. If no key function, emit everywhere used (i.e. referred to by name). Place in a comdat group in all cases. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-6 | Virtual function table layout | data | closed | SGI | 990520 | 991028 |
Summary: What is the layout of the Vtable? | ||||||
Resolution: See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-7 | Objects and Vtables in shared memory | data | closed | HP | 990624 | 990805 |
Summary: Is it possible to allocate objects in shared memory? For dynamic objects, this implies that the Vtable must also be in shared memory. | ||||||
Resolution: No special representation is useful in support of shared memory. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-8 | dynamic_cast | data | closed | SGI | 990628 | 991014 |
Summary: What information to we put in the vtable to enable (a) dynamic_cast from pointer-to-base to pointer-to-derived (including detection of ambiguous base classes) and (b) dynamic_cast to void*? | ||||||
Resolution: The vtable will contain an offset to the beginning of the complete object, and a pointer to the typeinfo object. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-9 | Primary base vtable embedding | data | closed | Cygnus | 000217 | 000302 |
Summary: Resolve the embedding of the vtable for the primary base class in the derived class vtable. | ||||||
Resolution: Any class with virtual bases shall contain vbase pointers for all of its virtual bases. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
B-10 | Pure virtual runtime | call | closed | CodeSourcery | 000629 | 000706 |
Summary: Define a runtime proxy routine for pure virtual functions. | ||||||
Resolution: Define such a runtime routine, with implementation-defined behavior. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-1 | Interaction with .init/.fini | lif ps | closed | SGI | 990520 | 991202 |
Summary:
Static objects with dynamic constructors must be constructed at
intialization time.
This is done via the executable object initialization functions that
are identified (in ELF) by the DT_INIT and DT_INIT_ARRAY dynamic tags.
How should the compiler identify the constructors to be called in this way?
One traditional mechanism is to put calls in a .init section.
Another, used by HP, is to put function addresses in a .init_array section.
The dual question arises for static object destructors. Again, the extant mechanisms include putting calls in a .fini section, or putting function addresses in a .fini_array section. Finally, which mechanism (DT_INIT or DT_INIT_ARRAY, or the FINI versions) should be used in linked objects? The gABI, and the IA-64 psABI, will support both, with DT_INIT being executed before the DT_INIT_ARRAY elements. | ||||||
Resolution: Use .init_array and .fini_array sections. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-2 | Order of ctors/dtors w.r.t. link | lif ps | closed | HP | 990603 | 000817 |
Summary: Given that the compiler has identified constructor/destructor calls for static objects in each relocatable object, in what order should the static linker combine them in the linked executable object? (The initialization order determines the finalization order, as its opposite.) | ||||||
Resolution: Accepted method based on IBM's specification. See Draft C++ ABI for IA-64, Section 3.3.4. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-3 | Order of ctors/dtors w.r.t. DSOs | ps | closed | HP | 990603 | 000504 |
Summary:
Given the constructor/destructor calls for each executable object
comprising a program, what is the order of execution between objects?
For constructors, there is not much question:
unless we choose some explicit means of control,
file-scope objects will be initialized by the DT_INIT/DT_INITARRAY
functions in the order determined by the base ABI order rules,
and local objects will be initialized in the order their containing
scopes are entered.
For destructors, the Standard requires opposite-order destruction, which implies a runtime structure to keep track of the order. Furthermore, the potential for dynamic unloading of a DSO (e.g. by dlclose) requires a mechanism for early destruction of a subset. | ||||||
Resolution: Accept SGI proposal for a simple API which registers destructors and atexit calls. Subsequently, accept proposal to eliminate call to __cxa_finalize when program exits. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-4 | Construction vtables | call | closed | Cygnus | 990603 | 000504 |
Summary: When calling a virtual function from the constructor/destructor of a base subobject, the version specific to the base type is required, unlike the typical case when calling such a vfunc for the full object from some other context. Since the pointer for that vfunc in the the subobject's sub-vtable of the full object's vtable is the full object version, some other means is required for accessing the correct vfunc. | ||||||
Resolution: Accept Compaq proposal as currently documented in the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-5 | Calling destructors | call | closed | Sun | 990603 | 991104 |
Summary: What is the calling convention for destructors? Do virtual destructors require special treatment? Is delete() integrated with the destructor call or separate? How is delete() handled when invoked on a base subobject? | ||||||
Resolution: Destructors are called with a reference to this. Virtual destructors have two versions, and two entries in the vtable, one that deletes the object after destruction, and one that doesn't. There is a third version that does not delete the object, and is not in-charge, i.e. does not destroy any base objects; it is not called via the vtable. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-6 | Extra parameters to constructors | call | closed | Cygnus | 990603 | 991104 |
Summary: When calling constructors for classes with virtual bases, what information about the treatment of virtual base subobjects in the full class, or about object allocation, must be transmitted to the constructor in parameters? | ||||||
Resolution: None. Two versions, and two entrypoints, of the constructor will be created: one that calls the virtual base subobject constructor (in-charge), and one that does not. Object allocation will be done by the caller. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-7 | Passing value parameters by reference | call | closed | All | 990624 | 990805 |
Summary: It may be desirable in some cases where a type has a non-trivial copy constructor to pass value parameters of that type by performing the copy at the call site and passing a reference. | ||||||
Resolution: Whenever a class type has a non-trivial copy constructor, pass value parameters of that type by performing the copy at the call site and passing a reference. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-8 | Returning classes with non-trival copy constructors | call | closed | All | 990625 | 990722 |
Summary: How do we return classes with non-trivial copy constructors? | ||||||
Resolution: The caller allocates space, and passes a pointer as an implicit first parameter (prior to the implicit this parameter). |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-9 | Passing parameters with ctors/dtors | call | closed | All | 991028 | 991104 |
Summary: Where do allocation, construction, destruction, and deallocation occur for value parameters? | ||||||
Resolution: closed issues list. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-10 | Synthesized copy assignments | call | closed | All | 991028 | 991028 |
Summary: Should we specify special treatment for synthesized copy assignments, to avoid multiple copies of virtual bases? | ||||||
Resolution: No. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-11 | Array constructors/destructors | call | closed | Cygnus | 000130 | 000309 |
Summary:
How are constructors/destructors run for arrays?
Many compilers use a __vec_new function;
g++ doesn't, to allow for inlining of constructors.
| ||||||
Resolution: Define standard library entries for array construction/destruction. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-12 | Constructor return values | call | closed | Cygnus | 000130 | 000309 |
Summary: What is the return value of a constructor? Void, this, ...? | ||||||
Resolution: Void. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-13 | Allocating constructors | call | closed | HP | 000309 | 000803 |
Summary: Should we define allocating constructors? | ||||||
Resolution: Their use is optional. Their name mangling is specified. If used, they must be emitted everywhere referenced as a COMDAT group (Draft ABI section 5.2.5). |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-14 | Local-scope dynamic constructors | data | closed | all | 000309 | 000511 |
Summary: The Standard requires that local static objects with dynamic constructors be initialized exactly once, the first time the containing scope is entered. This requires a data object to serve as a guard variable; define its content or interface. | ||||||
Resolution: The size of the guard variable is 64 bits. The low-order byte shall contains a boolean initialization flag. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-15 | Alternate array allocators | call | closed | CodeSourcery | 000628 | 000720 |
Summary:
Allow alternate allocators/deallocators to
__cxa_vec_new and __cxa_vec_delete .
| ||||||
Resolution: Add two new allocators, and two new deallocators, with one of each pair using a simple user deallocator and one using a user deallocator requiring a size. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-16 | Copy constructor runtime | call | closed | CodeSourcery | 000628 | 000720 |
Summary: Define a runtime support routine for copy constructors. | ||||||
Resolution: Add a new runtime for vector copy construction. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-17 | Uncatch exception runtime | call | tabled | all | 000706 | 000720 |
Summary: Define a runtime support routine to uncatch the current exception. |
[000706 All] This comes up in the context of the sample code in C-16, i.e. the call to g++'s routine __uncatch_exception(), which backs out the current exception so that another one won't cause termination. This is possible with the current APIs, but a single call is simpler, will appear in various contexts, and is not performance sensitive, so needn't be an inline sequence.
[000720 All] We believe that all calls to this functionality come from the implementation runtime rather than from the compiled code, so the interface does not need to be exposed. The issue is tabled unless and until someone determines otherwise.
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-18 | Result buffers | call | closed | SGI | 000724 | 000817 |
Summary: Should buffers for results with non-trivial copy constructors be passed as a dummy first parameter, or in r8 as specified by the psABI for long structured results? | ||||||
Resolution: All results with non-trivial copy constructors or destructors will be returned in buffers allocated by the caller, with their addresses passed as an implicit first parameter. Other structure results too large for the return registers are returned in a buffer created by the caller, with the buffer address passed in r8. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
C-19 | NULL ctor/dtor API parameters | call | closed | CodeSourcery | 000806 | 000831 |
Summary: Allow NULL constructor/destructor parameters whereever it makes sense in the Section 3.3 APIs. | ||||||
Resolution: Accepted as proposed. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-0 | Exception handling framework | lib ps | closed | SGI | 990520 | 991216 |
Summary: Define the general framework for exception handling, including Level I (psABI unwinding API) and Level II (C++ ABI exception handling API). | ||||||
Resolution: See the HP proposal, accepted as a working paper, and discussions in the closed issues page. |
[990715 Cygnus -- Jason] The languge-specific part of the EH stack in g++ contains these elements:
void *value; // pointer to the thrown object, or the thrown value
// itself if a pointer
void *type; // pointer to the type_info node for the thrown object
void (*cleanup)(void *, int) // pointer to the dtor for the object
bool caught; // has this exception been caught since its last throw?
long handlers; // how many catch handlers are active for this exception
Both 'caught' and 'handlers' are needed to handle rethrowing and catching within a catch block.
Language interaction is handled by recording the language of both the exception region and the thrown exception. Each thrown exception also includes a pointer to a language-specific matching function which is called to compare the types of the exception and handler.
[991209 all] Observe that this issue is part of a level 3 specification, i.e. part of a common runtime specification, but not strictly part of the ABI. It is described as part of the EH working paper from HP.
[991216 all]
The __typeinfo
type defined in 7.6 of the working paper
should be replaced by the ABI standard type_info
.
The treatment of predefined types must be specified.
[000126 editor]
This issue is effectively closed by virtue of accepting the working
paper (D-0),
but I will not close it officially until the
working paper
reflects the __typeinfo
change.
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-2 | Unwind personality routines | lib ps | closed | SGI | 990520 | 000106 |
Summary: The IA-64 runtime conventions provide for a personality routine pointer for language-specific actions when unwinding the stack. They do not specify its interface. There are typically two required actions for C++: locating a handler (non-destructively) and destroying automatic objects while unwinding. This issue involves specification of the API (see also D-3). | ||||||
Resolution: See the exception handling specification, level 1, and the working paper. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-3 | Unwind process clarification | lib ps | closed | SGI | 990520 | 000106 |
Summary: The IA-64 runtime conventions provide for a personality routine pointer for language-specific actions when unwinding the stack. However, they are quite muddy about the precise sequence of calls. This issue involves specification of unwind process (see also D-2). | ||||||
Resolution: See the exception handling specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-4 | Unwind routines nested? | lib ps | closed | SGI | 990520 | 991209 |
Summary: The IA-64 runtime conventions call for the unwind personality routine to behave like a routine nested in the routine raising an exception. Is that the preferred definition? | ||||||
Resolution: This is not required, nor included in the proposed common implementation. However, a conforming implementation could add this option in the personality routine and tables. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-5 | Interaction with other languages (e.g. Java) | lib ps | closed | HP | 990603 | 991007 |
Summary: The IA64 exceptions handling framework is largely language independent. What is the behaviour of a C++ runtime receiving, for instance, an exception thrown from Java? Does it call terminate()? Does it allow the exception to pass through C++ code with destructors if there is no catch clause? Does it allow the exception to be caught in a catch(...) provided this catch(...) ends with a rethrow? Does it allow even more? | ||||||
Resolution: In general, foreign exceptions will cause normal destructor invocation and other cleanup in C++ code, and will pass through C++ frames except where explicit exception specifications do not allow them. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-6 | Allow resumption in other languages? | lib ps | closed | HP | 990603 | 991007 |
Summary: The exception handling framework requires the interaction of the runtime of all the languages "on the stack" during exception processing. Some of these languages may have very different exception handling semantics. What are the constraints we impose on the C++ exception handling runtime to preserve the relative language neutrality of the EH framework? Example: do we allow a handler to cleanup and resume at the point where the exception was thrown? | ||||||
Resolution: Moot -- resume-type exceptions are more appropriately handled by registering trap handlers and processing them in place. No interaction with stack traceback should be necessary. |
[990908 SGI -- Jim] The typical case of cleanup and resume is floating point trap handling, which is normally handled entirely in the original FP trap handler. Is there an example where stack walkback must occur to identify the handler, but resumption at the point-of-exception is required? I can't think of any, and I think the model of registering a trap handler is preferable for such purposes.
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-7 | Interaction with signals or asynch events | lib ps | closed | HP | 990603 | 991209 |
Summary:
The Standard says that the behavior of anything other than
"pure C code" (POF) is implementation defined,
and warns (in a note) against using EH in a signal handler.
We should define what is supported,
possibly explicitly stating that signal handler code must be a POF.
We could allow any feature but exception handling to be used.
We could allow some EH routines to be called
(for instance, uncaught_exception() ).
Or we could allow even an exception to be thrown,
if it does not exit the handler.
| ||||||
Resolution: This ABI requires no support beyond the Standard requirements. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-8 | Interaction with threads packages | lib ps | closed | SGI | 990603 | 000106 |
Summary:
What happens when an exception is not caught in the thread where raised?
What does uncaught_exception()
return if another thread is currently processing an exception?
| ||||||
Resolution:
With one exception, exception handling is entirely per-thread --
exceptions must be caught in the thread where raised,
and queries about them (e.g. uncaught_exception() )
are answered only with respect to the thread doing the query.
The only global exception behavior is handler registration --
see issue D-15.
|
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-9 | longjmp interaction | lib ps | closed | IBM | 990908 | 000113 |
Summary: Does longjmp run destructors? | ||||||
Resolution: Define an alternate routine, longjmp_unwind in namespace abi, defined in new header cxxabi.h, which always does full cleanup during unwinding. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-10 | psABI proposal | lib ps | closed | all | 991216 | 000120 |
Summary: Solidify the Level I (psABI) specification and submit it to the base ABI group. | ||||||
Resolution: See the exception handling specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-11 | pthreads interface | lib ps | closed | all | 991216 | 000203 |
Summary: Certain pthreads functionality is a prerequisite, e.g. to acquire thread-local storage. The ABI should specify the requirements, along with the expected stub behavior when the pthreads library is not present. | ||||||
Resolution: No specification necessary. This is Level 3 material. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-12 | Table location | lib ps | closed | all | 991216 | 000504 |
Summary: Determine constraints on the location of the unwind table and the unwind information table. | ||||||
Resolution: The unwind tables must reside in the text segment they describe. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-13 | _Unwind_ForcedUnwind | lib ps | closed | all | 991216 | 000120 |
Summary: Define the interface of _Unwind_ForcedUnwind. | ||||||
Resolution: See the exception handling specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-14 | __cxa_begin/end_catch | lib | closed | all | 991216 | 001109 |
Summary:
Define the interfaces of __cxa_begin_catch
and __cxa_end_catch .
| ||||||
Resolution: See the exception handling specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-15 | Terminate handler and threads | lib | closed | all | 991216 | 000106 |
Summary: Define how the terminate and unexpected handler registration interacts with threads. | ||||||
Resolution: Handler registration applies to all threads. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-16 | Exception specifications | lib | closed | all | 991216 | 000113 |
Summary: How is the type list for an exception specification represented in the action records? | ||||||
Resolution: As specified in the HP document |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-17 | bad_cast, bad_typeid runtime | call | closed | CodeSourcery | 000629 | 000706 |
Summary: Define runtime support routines for throwing bad_cast and bad_typeid exceptions. | ||||||
Resolution: Accepted as proposed originally. See draft EH Specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
D-18 | __cxa_throw_type_info | lib | closed | all | 001012 | 001109 |
Summary:
Should we replace the __cxa_throw_type_info pointer in the exception
object by a pair of pointers to a std::type_info and a
destructor?
| ||||||
Resolution: Make the replacement. See Sections 2.2.1 and 2.4.3 of the See draft EH Specification. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
E | Template Instantiation Model | |||||
E-1 | When does instantiation occur? | tools | closed | SGI | 990520 | 000511 |
Summary: There are two principal models for instantiation. The early instantiation (or Borland) model performs all instantiation at compile time, potentially resulting in extra copies which are removed at link time. The pre-link instantiation model identifies the required instantiations prior to linking and instantiates them via a special compile step. | ||||||
Resolution: Non-export templates are instantiated where referenced in COMDAT groups. See the Draft C++ ABI for IA-64. |
[000413 All]
[000423 EDG -- Daveed] I cannot say much yet, since we're still very actively working on this. There are at least two ABI issues. First, as you note, the location of template emission (which is somewhat more flexible with COMDATs). Second, there is potential for a whole bunch of previously internally linked items to need to be promoted to external linkage, while maintaining the general impression of not colliding with other "static" entities.
[000511 All]
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
E-3 | Template repository | tools | closed | HP | 990603 | 000511 |
Summary: Independent of the template instantiation model, we need to make sure that whatever template persistent storage is used by one vendor does not interact negatively with other vendors' mechanisms. Issues: (1) Avoiding conflict on the name of any repository. (2) If .o files are used, describe how this information is to be preserved, ignored, etc. (3) Evaluate if tools such as make, ld, ar, or others, can break because .o files get written at unexpected times. | ||||||
Resolution: COMDAT emission and naming for non-export templates is specified in the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-1 | Mangling convention | call | closed | SGI | 990520 | 000330 |
Summary: What rules shall be used for mangling names, i.e. for encoding the information other than the source-level object name necessary to resolve overloading? | ||||||
Resolution: See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-2 | Mangled name size | call g | closed | SGI | 990520 | 000511 |
Summary:
Typical name mangling schemes to date typically begin to produce very
long names. SGI routinely encounters multi-kilobyte names,
and increasing usage of namespaces and templates will make them worse.
This has a negative impact on object file size, and on linker speed.
SGI has considered solutions to this problem including modified string tables and/or symbol tables to eliminate redundancy. Cygnus, HP, and Sun have also considered or implemented approaches which at least mitigate it. | ||||||
Resolution: The current mangling solution is considered an adequate solution to this problem. |
[991028 all] In a number of cases, the Standard requires consistent definitions in different places, even in different files, but does not require the implementation to detect and report inconsistency. With a small amount of extra information, the linker could often detect and report such inconsistencies. Also, there are cases where the linker can already detect a problem, but could provide a better diagnostic with more information.
Several examples are:
[000406 all]
[000417 Compaq -- Coleen]
Each class template partial specialization is a distinct template and definitions shall be provided for the members of a template partial specialization (temp.class.spec.mfunc).
Note that the end of paragraph 1 in this section says "no diagnostic is required", but does that mean if a template instantiation can be linked instead of a specialization and not violate the standard? Or does that only mean that the compiler/linker is not required to diagnose the error and can call the wrong version of the function?
The argument against making partial instantiations link incompatible with is that users may depend on linking in the template instantiation when the definition of partial instantiation is not available. Two points:
<template-args> ::= I <template-arg>+ E
<template-arg> ::= <type> # type
<template-arg> ::= D <type> E # partially specialize'D'
<template-arg> ::= L <type> <value number> E # literal
<template-arg> ::= LZ <encoding> E # external name
<template-arg> ::= X <expression> E # expression
//
// Example of partial specialization [not] linking against template
// instantiation.
//
// spec.h
extern "C" int printf(const char *,...);
template <class T> class X {
public:
void f(); // { printf("X<T>::f called\n"); }
};
// spec1.cxx
#include "spec.h"
main()
{
X<int> t;
t.f();
}
// spec2.cxx
#include "spec.h"
template <> class X<int> {
public:
void f();
};
template <> void X<int>::f() { printf("X<int>::f();\n"); }
void foo()
{
X<int> x;
x.f();
}
//
// EDG/Compaq C++
% exx spec1.cxx spec2.cxx
spec1.cxx:
spec2.cxx:
ld:
Unresolved:
X<int>::f(void)
//
// Sun
33% CC spec1.cxx spec2.cxx
spec1.cxx:
spec2.cxx:
34% a.out
X<int>::f();
// G++
781% g++ spec1.cxx spec2.cxx
782% a.out
X<int>::f();
[000417 CodeSourcery -- Mark]
and
template <class T> void f(T);
template <> void f<int>(int) { }
(the first a specialization, the second instantiation),
would be mangled separately.
If I misunderstood, then I apologize,
and only some of it what follows is relevant.
template <class T> void f(T) { }
template void f<int>(int);
Here are my objections:
[000418 SGI -- John]
template <class T> struct X { void foo();};
template <class T> struct X<T*> { void foo();};
template <> struct X<int*> { void foo();};
A program that declares
and invokes x.foo()
will thereby reference a function with the signature
X<int*> x;
void X<int*>::foo(void).
Three different functions can be invoked, depending on whether the program includes just the first declaration, just the first and second, or the first and third (with or without the second). Colleen's mangling scheme clearly distinguishes the first and third cases, but for the second case is forced to pick one of the other two manglings. It cannot distinguish all three.
[000504 All]
Mark suggested an alternate method which hashes the information to be matched. He has seen an implementation that used a strong hash that included everything strictly required to match, and a weak hash that treated things that would usually work if mixed the same (e.g. signed/unsigned integers of a particular size). This has the advantage over the SGI method of being potentially much smaller, and therefore faster to check. It has the disadvantage of being less flexible, since only those combinations of attributes included in the hash can be checked, and the checker is not able to provide a specific error message.
Either approach is implementable as an optional added ELF section, and objects with the section can be mixed arbitrarily with those without, causing no problems other than potentially missed checking. A decision is therefore not urgent, and we agreed to consider the possibilities over the upcoming break, and address this issue further in the summer.
[000803 all] There is no current interest in tackling this. Table the issue.
[000330 all] We discussed this subject right after that of mangling the return type of all functions. In both cases there is significant concern that we would break enough "working" but incorrect code to create significant customer problems. We agreed to think about this issue for a short while (a week or two), and try to get some data to evaluate the risk, since doing either of these would also help catch problems. Jim will also extract the SGI interface specification ELF section, look at adding throw specifications to it, and distribute it for consideration.
[000504 All]
[000803 all] There is no current interest in tackling this. Table the issue.
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-5 | ILP32 vs. LP64 | call | closed | HP | 000210 | 000824 |
Summary: This ABI focusses on the LP64 data model. What should we do (if anything) to support (a) compatibility between different vendors' ILP32 compilers (b) compatibility between ILP32 and LP64? | ||||||
Resolution: Withdrawn -- no action. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-6 | Demangling | lib | closed | Cygnus | 000210 | 000504 |
Summary: Users may sometimes want to get demangled names. Should we provide an entry point for calling a demangler? | ||||||
Resolution: Provide a simple demangler interface callable from C. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-7 | Mangling statics | call | closed | HP | 000223 | 000504 |
Summary: What, if anything, should we do about mangling the names of objects in static functions in case a compiler chooses to inline them? | ||||||
Resolution: Local objects are mangled with the name of the containing function followed by a discriminator, consisting of the object name and possibly a sequence ID. Strings are mangled with a discriminator consisting of "s" followed by a sequence ID. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-8 | Identifiers with unicode letters | call | closed | HU-Berlin | 000323 | 000413 |
Summary: How should we mangle names containing unicode letters? | ||||||
Resolution: Follow the underlying C ABI. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-9 | Strings with unicode letters | call | closed | HU-Berlin | 000323 | 000413 |
Summary: How should we handle the object file representation of narrow and wide string literals containing unicode letters? | ||||||
Resolution: Follow the underlying C ABI. |
# | Issue | Class | Status | Source | Opened | Closed | |
---|---|---|---|---|---|---|---|
F-10 | Mangling function return types | call | closed | all | 000330 | 000413 | |
Summary: Should we always mangle the return type of a function? | |||||||
Resolution: No. It is mangled only for template instantiations/specializations. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
F-11 | Hash for local strings | call | closed | all | 000330 | 000504 |
Summary: How should we hash strings for local name mangling? | ||||||
Resolution: Strings are mangled with a discriminator consisting of "s" followed by a sequence ID. See the Draft C++ ABI for IA-64. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-1 | Basic command line options | tools | closed | HP | 990603 | 000824 |
Summary: Can we agree on basic command line options (compiler and linker) for fundamental functionality, possibly allowing portable makefiles? | ||||||
Resolution: Withdrawn -- no action. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-2 | Detection of ODR violations | call | closed | Sun | 990603 | 000504 |
Summary: [Sun] (See also F-3.) | ||||||
Resolution: This is a duplicate. See F-3, F-4, F-10. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-3 | Inlined routine linkage | call | closed | Sun | 990603 | 991202 |
Summary: Inline routines with external linkage require a method of handling vague linkage (see B-5 for definition) for the out-of-line instance, as well as for any static data they contain. The latter includes string constants per [7.1.2]/4. | ||||||
Resolution: Out-of-line instances are emitted where required, using COMDAT (issue B-5). Static data referenced will be placed in COMDAT sections as well. The names of each are addressed as part of mangling (issue F-1). Strings will be emitted in SHT_MERGE/SHT_STRING sections, with the static linker responsible for removing duplicates. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-4 | Dynamic init of local static objects and multithreading | call | closed | SCO | 990607 | 001109 |
Summary: The Standard requires that local static objects with dynamic constructors be initialized exactly once, the first time the containing scope is entered. Multi-threading renders the simple check of a flag before initialization inadequate to prevent multiple initialization. Should the ABI require locking for this purpose, and if so, what are the necessary interfaces? In addition to the locking of the initialization, special exception handling treatment is required to deal with an exception during construction. | ||||||
Resolution: The ABI will specify an 8-byte guard variable, with one byte used for the initialization flag, and the others available for use by a threading package for locking. ABI routines are specified for acquiring and releasing the lock. See ABI section 3.3.2. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-5 | Varargs routine interface | call | closed | HU-B | 990810 | 991014 |
Summary: The underlying C ABI defines conventions for calling varargs routines. Does C++ need, or would it benefit from, any modifications or special cases? How should we pass references or class objects? Is any runtime library support required? | ||||||
Resolution: No special cases required -- C++ will follow the C varargs ABI. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
G-6 | bool parameters | call | closed | all | 991104 | 991202 |
Summary: How should we pass bool parameters on IA-64? Choices are to pass them like ABI ints, or in predicate registers or register pairs. | ||||||
Resolution: No special treatment -- pass bool like char. |
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
H-1 | Runtime library DSO name | tools | closed | SGI | 990616 | 000817 |
Summary:
Determine the name of the common C++ runtime library DSO,
e.g. libC.so .
If there are to be vendor-specific support libraries which must coexist
in programs from mixed sources, identify naming convention for them.
| ||||||
Resolution:
The runtime library will be named libcxa.so .
|
# | Issue | Class | Status | Source | Opened | Closed |
---|---|---|---|---|---|---|
H-2 | Runtime library API | lif | open | SGI | 990616 | |
Summary: Define the required entrypoints in the common C++ runtime library DSO, and their prototypes. |
[000413 All]
[000830] Closed C-2, C-18, F-5, G-1, H-1. Additions to G-4, C-19.
[000808] New issues C-18, C-19. Closed C-13. Tabled F-3, F-4. Additions to C-2, G-4.
[000728] Closed C-15, C-16. Tabled C-17. Additions to C-2.
[000706] Reopened G-4. New issue C-17. Closed B-10, D-17. Additions to C-15, C-16.
[000628] New issues B-10, C-15, C-16, D-17.
[000511] Closed C-14, E-1, E-3, F-2, G-4. Additions to E-2 (tabled).
[000504] Closed A-28, A-29, C-3, C-4, F-6, F-7, F-11, G-2. Additions to C-2, F-1 (closed), F-2, F-3, F-4, F-10.
[000424] Additions to F-3, F-6.
[000419] Additions to A-28, A-29, E-2, F-3, F-6, H-2. Closed F-8, F-9, F-10.
[000407] New issue A-28, A-29. Additions to D-12, F-3, F-6, F-8, F-9, F-11.
[000330] Additions to F-4, F-6. Closed A-24, F-1.
[000323] New issues F-8, F-9. Additions to C-4, F-1.
[000321] Additions to F-1, F-6.
[000313] New issues C-13, C-14. Closed C-11, C-12. Additions to A-24, C-4, F-1.
[000308] Closed A-26, A-27, B-9. Add Limits section to ABI layout document.
[000302] Additions to closed A-20, A-21. Additions to C-11,
[000228] New issues A-26, A-27, F-7.
[000214] Closed A-21, A-25. Additions to A-23, C-4, F-1, F-5. New issue B-9.
[000214] Additions to A-21, A-23, A-24, F-1. New issue F-5.
[000204] Closed A-22, D-11. Additions to A-23, A-24, D-12. New issue A-25.
[000131] Additions to A-20, A-21, D-11, F-1. New issues A-22, A-23, A-24, C-11, C-12.
[000121] Fix links. Closed A-19, A-20, D-10, D-13. Additions to A-21, D-1, D-11, D-12, D-14.
[000120] Closed A-17, A-18, D-9, D-16. Additions to A-19. New issues A-20, A-21.
[000112] Closed A-15, A-16, D-2, D-3, D-8, D-15. Additions to A-17, A-18, D-9, D-11, D-13, D-14, D-16. New issue A-19 (split from A-17).
[000105] Closed D-0. Additions to D-1, D-9. New issues D-10 to D-16.
[000103] Additions to A-17.
[991230] Clarify definition of nearly empty class.
[991221] New issues A-15, A-16, A-17, A-18. Reopened C-3. Additions to C-3 (closed).
[991209] Additions to D-1, D-2, D-3. Closed D-4, D-7.
[991202] Additions to B-4 (closed), C-2, D-*. Closed B-1, C-1, C-3, G-3, G-6.
[991129] Additions to B-1, F-2, G-3. Closed B-5.
[991104] New issue G-6. Additions to C-4. Closed C-5, C-6, C-9.
[991028] Opened C-9, C-10. Closed A-6, B-6, C-10. Additions to C-5, C-6, F-1, F-2, F-3.
[991026] Additions to F-1.
[991012] Closed B-8, G-5. Additions to A-6, B-5, C-5.
[991012] Closed D-5, D-6. Additions to B-4, B-5, D-7.
[991005] New issue F-4. Additions to A-6, B-5, B-6, C-4, D-5, D-7.
[990929] Additions to D-*, D-9.
[990914] Additions to B-1, D-*, D-9.
[990908] New issue D-9. Additions to B-1, D-*, D-2, D-4, D-5, D-6.
[990901] Additions to A-6, B-6.
[990825] Additions to A-6, B-6, C-5, D-*.
[990813] Closed A-11. Additions to A-6, B-1, B-6, B-8, C-2, G-5.
[990810] New issue G-5. Additions to B-6, C-2, C-3.
[990805] Closed A-12, A-14, B-3, B-4, B-7, C-7. Additions to A-6, A-11, B-1, B-6, F-1.
[990729] Closed A-7. Additions to A-11, A-12, C-2. Summary added for A-12. New issue A-14.
[990727] Closed B-2, C-8. Additions to A-9 (closed), C-2. Summaries added for C-4, C-6, D-1 to D-4.
[990720] Additions to B-2, B-5, C-2, D-1.
[990701] Closed A-3, A-5, A-10, A-13. Additions to A-6, B-6, B-7, B-8, C-2, C-7.
[990625] Closed A-1, A-2, A-4, A-8, A-9. Additions to A-3, A-5, A-7, B-4, B-5, B-7, G-3, G-4. New issues B-6, B-7, B-8, C-7, C-8.
[990616] Added HP summaries. Added sketchy notes from 990610 discussions (A and B issues). A-10 was intended by HP as something different than I described, so it was renamed, and a new issue A-13 opened as an SGI issue. HP did not submit A-12, so relabeled as Sun's (is that right?). Added library interface issues, H-1 and H-2.