Left Up Ausnahmenbehandlung

Erkenntnisse aus der Analyse der g++-Implementierung

Sprachabhängige und Sprachunabhängige Teile

Die libsup++ umfaßt die Verwaltung der Runtime-Typeinformation von C++ und den Exception-Wrapper.

Damit man den Mechanismus sprachübergreifend nutzen kann, d.h. aus verschiedenen Sprachen generierte Objektdateien zusammenlinken kann, ist der Kern sprachunabhängig in ist in gcc/unwind*.{h,c,inc}

Zusammenhang mit Threads

Natürlich braucht man gemeinsame Variablen und muß daher Koordinieren. Daher hängt die libsup++ von der Thread-Implementierung ab.

In ./c++/3.2/i386-redhat-linux/bits/gthr.h gibt es eine abstrakte C-Api, die für verschiedene Systeme implementiert worden ist, beziehungsweise bei einer Portierung implementiert werden muß.

Einsatz von Thread Local Storage

Jeder Thread hat ein __cxa_eh_globals Object.

Grundsätzliche Alternativen

Die Wahl der Alternative betrifft sowohl den Compiler an sich als auch das Laufzeitsystem:

USING_SJLJ_EXCEPTIONS hat auch Einfluß auf die Code-generierung (except.c,dwarf2out.c)

Setjump-Logjump-Implementierung

Nach Gcc-3.2.2-NEWS:
* Support for setjmp/longjmp (sjlj) exception handling has been added, as an
alternative to the existing range-table based mechanism. sjlj is the default
on non-sparc, non-x86 targets, or can be specified with the 
`--enable-sjlj-exceptions' configure parameter.
und Debian-Mail:
Did you configure 3.3 using "--enable-sjlj-exceptions=yes"?  That way
the 3.3 C++ library should be compatible with the previous 3.3 library.
The switch to dwarf2 can be delayed until the next debian release.
The unwind-sjlj.c needs Thread specific storage, the others not.
Perhaps the dwarf-Based method needs less context-Management

DWARF2-Implementierung

DWARF ist ein Debugging-Format, welches Sprach- und Tool-übergreifend und erweiterbar ist.

Bei einem throw wird dynamisch durch Interpretierung der Information vom Compiler eine Tabelle erzeugt und gecached.

(Details siehe Code, den ich auch nicht verstanden habe :-)

Dies scheint die zu bevorzugende Implementierung zu sein.(Die SJLJ-Implementierung nutzt auch ein bischen DWARF, so daß auch dieses Argument wegf&auuml;llt.) Idee: könnte man die Tabelle nicht schon zur compile-Zeit erzeugen ?

Beziehungen zu Start-code und Linken

Die Frame-Tabelle muß irgendwie im Startcode gerufen werden:

Beim statischen Linken (-static) wird in einer statischen frame_dummy Funktion __register_frame_info_bases in unwind-dw2-fde.c aufgerufen. (Analyse mit objdump -D -l -j .text exceptiontest.lnx)

Vermutung, noch nicht untersucht: Beim dymanischen linken wird die Tabelle in der libc aus allen dynamischen Libraries aufgebaut.

Section .gxx_except_table

With objdump -h exception.lnx we see a calaculated exception-Table . - both in the linux-exe and in the L4-exe
We see it also in the assember-output.
Informatik- und Netzwerkverein Ravensburg e.V Rudolf Weber