Our C++ compilers implement various C++ ABIs that can be optionally enabled. The main supported ABIs are the MS ABI and the Itanium C++ ABI. These ABIs are very different in terms of execution speed, the size of generated code and data (vtables, RTTI descriptors) etc. Offering several different implementations enable the programmer to choose (those that are not bound to an ABI by existing libraries) the best suited to their application.
Our C++ compilers ship with an implementation of the Itanium C++ ABI according to the specification described here. This ABI is also implemented by gcc which our compilers are link- compatible with.
The gcc implementation of this ABI generates for each constructor and destructor definition a C1/C2 or D1/D2 function respectively. For types that do not have virtual base classes the C1 and C2 definitions are identical (so are D1 and D2 for those types) which causes unneccessary code duplication. This duplication is very undesirable especially on systems with tight code size constraints, for example on the PS3 SPU.
Our compilers provide a command line option to disable this code duplication and generate C1/C2 and D1/D2 function only where needed.