Ich möchte in einem Exception-Handler auf die Exception-Information, die
auf dem Stack liegt zugreifen. Dazu habe ich ein Makro geschrieben, das
die Informationen in eine Variable auf File-Scope kopiert. Dieses Makro
wird in jedem Exception-Handler als erste Anweisung verwendet.
Bei der Implementierung habe ich eine lokale Variable TopOfStack
angelegt und diese als Referenzadresse benutzt:
1 | #define SaveExceptionInfo \
|
2 | int TopOfSTack; \
|
3 | ExceptionInfo.ReturnAddress = (&TopOfStack)[9]; \
|
etc.
Je nach Optierungslevel des GCC ist aber der Abstand zwischen der
Exception-Information und der Variablen unterschiedlich. Beim Eintritt
in die Funktion können je nach Level 8 oder 16 Bytes als Offset dazu
kommen. Wie kann ich innerhalb des Makros unabhängig vom
Optimierungslevel sicher auf die Adresse der Exception-Information
zugreifen?
Die Optimierung könnte lokal für Funktionen mittels pragma spezifiziert
werden. Aber dieses muss vor der Funktion erfolgen, während das Makro
natürlich innerhalb der Funktion verwendet werden muss. Dadurch lässt
sich das pragma nicht anwenden.