Exceptions in ARM
Johannes Pfau
nospam at example.com
Sun Jan 5 02:06:31 PST 2014
Am Sun, 05 Jan 2014 08:26:16 +0000
schrieb "Timo Sintonen" <t.sintonen at luukku.com>:
> On Thursday, 2 January 2014 at 06:54:18 UTC, Timo Sintonen wrote:
> > I have fond one thing that confuses me. I have defined
> > ARM_EABI_UNWINDER but gcc/deh.d has checks for
> > GNU_ARM_EABI_Unwinder. Is this what I should have? When using
> > this I get an error in line 116: static assert ( 8 == 4 ) is
> > false.
>
> I think that this code in gcc/deh.d line 105 may not get it right
>
> // To place 'obj' behing unwindHeader.
> enum UNWIND_PAD = (Phase1Info.sizeof + Object.sizeof)
> % _Unwind_Exception.alignof;
>
> static if (UNWIND_PAD > 0)
> byte[UNWIND_PAD] _pad;
>
> Object obj;
>
> // The exception object must be directly behind unwindHeader.
> // (See build_exception_object.)
> static assert(unwindHeader.offsetof - obj.offsetof ==
> obj.sizeof);
>
> // The generic exception header
> _Unwind_Exception unwindHeader;
>
>
> Its purpose seems to add padding so that obj is aligned at the
> end of align block just before unwindHeader.
>
> Fitst, if I uderstand correct, the amount to pad should be align
> - modulo, not modulo. The current code happens to work anyway if
> align is 8 and modulo is 0 or 4 which is usually the case.
>
> Second, When I define GNU_ARM_EABI_Unwinder, the assertion fails.
> Nothing changes in calculation of UNWIND_PAD but the alignment is
> not correct and the assert fails. With this define the whole size
> of struct if 96 bytes and 40 bytes without. Something is aligned
> differently such a way that this calculation cannot find it. I
> can not print offsetof with pragma msg so I do not know what
> happens.
>
I should really start pushing my local ARM changes upstream. Here's a
fix for the EABI unwinder:
https://github.com/jpf91/GDC/commit/262e432e95cbe31a6764cd337f64022a56011eda
IIRC I also thought the code in gcc/deh.d wasn't correct. As it wouldn't
work for the eabi unwinder anyway (no Phase1Info member) I didn't
investigate that though.
More information about the D.gnu
mailing list