=============== Runtime Library =============== The runtime library routines provide basic runtime support. The source for these routines is in the ``lib_src`` directory of the release structure. "Basic" runtime support means support for operations built in to the C++ language, like ``new`` and ``delete``, and for operations for which code is generated by IL lowering, e.g., array initialization. (This includes code generated by the lowering of C99 constructs.) It does not mean support for all libraries required by the C++ standard, e.g., ``iostream``\ s. The front end supports two different runtime models. A configuration macro is used to select the runtime model to be used. The models supported are the IA-64 ABI and one that is an extension of the one used with *cfront*. The IA-64 model is a complete implementation of the IA-64 ABI, except that the exception handling implementation does not conform to the ABI (because producing a conforming implementation of exception handling requires back end support). The *cfront* runtime model is generally compatible with the one used by *cfront* version 3.0.2, and in fact the code generated by the front end in *cfront* object code compatibility mode will work with the libraries supplied with *cfront* (with one exception that is described below). Another way of saying the same thing: The runtime library is an independent implementation of the runtime interface defined by *cfront*. One incompatibility between our runtime support library and the one provided with *cfront* is the handling of static destructors. The *cfront* static destruction mechanism does not conform to the C++ standard, which requires all static objects, including local static objects, to be destroyed in the reverse order of construction. The EDG static destruction mechanism relies on a new data structure called the needed destructions list. If a *cfront* runtime library is to be used, the ``dtor_list.o`` file from the EDG library must be included when a program is linked. This may be done by explicitly including ``dtor_list.o`` in the link command generated by the driver, or by adding ``dtor_list.o`` to the library file containing the *cfront* libraries. In the area of exception handling, there is no standard *cfront* runtime model (because no version of *cfront* that supports exception handling was released by USL), so the model is invented by EDG, drawing on some published aspects of the implementation done by Hewlett-Packard. The runtime routines should be considered to be a sample implementation of a runtime library. They are believed to be complete and to work correctly, but they might require adaptation to make them work correctly in a given environment, or to make them compatible with other runtime libraries or conventions on the target system. In particular, if runtime compatibility with *cfront* is not required, there are probably better ways of doing some of these things. Also, the target system may provide efficient support for things that can only be done in a clumsy way in a portable runtime library, e.g., getting start-up initialization code run automatically at the beginning of execution. The ``--building_runtime`` option ================================= Like the front end, the runtime contains a number of configuration flags. In many cases, it is essential that the same values be used by both the front end and the runtime with which the generated code will be linked. To help make sure the runtime is configured properly the ``--building_runtime`` option should be specified when compiling the runtime. This causes additional preprocessing macros to be defined that pass the value of certain configuration flags from the front end to the runtime. The following preprocessing macros are defined when the ``--building_runtime`` option is used: .. list-table:: * - | ``__EDG_JMP_BUF_ELEMENT_TYPE`` | - | The name of the integer or floating point type that is used as the element type of the ``jmp_buf`` array used by ``setjmp``. * - | ``__EDG_JMP_BUF_NUM_ELEMENTS`` | - | The number of elements in the ``jmp_buf`` array used by ``setjmp``. * - | ``__EDG_DELTA_TYPE`` - | The name of the integer type that is used to represent the offset in a virtual function table entry. * - | ``__EDG_VIRTUAL_FUNCTION_INDEX_TYPE`` | - | The name of the integer type that is used to represent the index field in a virtual function table entry. * - | ``__EDG_VAR_HANDLE_TYPE`` | - | The name of the integer type that is used to represent a "handle" in exception handling tables. Defined only when ``GENERATE_EH_TABLES`` is TRUE. * - | ``__EDG_REGION_NUMBER_TYPE`` | - | The type of a region number field in the exception handling tables. Defined only when ``GENERATE_EH_TABLES`` is TRUE. * - | ``__EDG_ETS_FLAG_TYPE`` | - | The type used to pass exception types flags to the runtime library. Defined only when ``GENERATE_EH_TABLES`` is TRUE. * - | ``__EDG_NULL_EH_REGION_NUMBER`` | - | The value used as the null region number value in the exception handling tables. Defined only when ``GENERATE_EH_TABLES`` is TRUE. * - | ``__EDG_LOWER_VARIABLE_LENGTH_ARRAYS`` | - | Indicates whether or not the front end is configured to lower variable-length arrays. Set to the value of ``(VLA_ALLOWED && LOWER_VARIABLE_LENGTH_ARRAYS)`` in the front end. * - | ``__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES`` | - | Non-zero when the variant representation of array cookies is used in the IA-64 ABI. Defined only when ``IA64_ABI`` is TRUE. * - | ``__EDG_ELEM_COUNT_PARAM_TYPE`` | - | The type used to represent the ``number_of_elements`` argument in the Cfront-like ABI. Defined only when ``IA64_ABI`` is FALSE. * - | ``__EDG_ABI_COMPATIBILITY_VERSION`` | - | The value of ``ABI_COMPATIBILITY_VERSION`` used when the front end was built. * - | ``__EDG_ABI_CHANGES_FOR_RTTI`` | - | The value of ``ABI_CHANGES_FOR_RTTI`` used when the front end was built. * - | ``__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE`` | - | The value of ``ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE`` used when the front end was built. * - | ``__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE`` | - | The value of ``ABI_CHANGES_FOR_PLACEMENT_DELETE`` used when the front end was built. * - | ``__EDG_BSD`` - | The value of the ``__BSD__`` macro when the front end was built. * - | ``__EDG_SYSV`` - | The value of the ``__SYSV__`` macro when the front end was built. * - | ``__EDG_ANSIC`` - | The value of the\ ``__ANSIC__`` macro when the front end was built. * - | ``__EDG_CPP11_IL_EXTENSIONS_SUPPORTED`` - | The value of ``CPP11_IL_EXTENSIONS_SUPPORTED`` when the front end was built.