[Bug 236905] LLVM's implementation of __gcc_personality_v0 does not correctly initialise the context

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Mar 30 19:51:36 UTC 2019


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236905

            Bug ID: 236905
           Summary: LLVM's implementation of __gcc_personality_v0 does not
                    correctly initialise the context
           Product: Base System
           Version: CURRENT
          Hardware: arm
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: arm
          Assignee: freebsd-arm at FreeBSD.org
          Reporter: theraven at FreeBSD.org

When __gcc_personality_v0 is invoked (when exceptions unwind through C code
that needs to run cleanups), it calls _Unwind_GetLanguageSpecificData:

https://github.com/freebsd/freebsd/blob/56c04b0bcfcd116f1b13087ec13bcba2d8dc7705/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c#L205

This is completely fine on most architectures, but on ARM this tries to map
from the context to the exception structure.  The GNU extension to the APCS
requires that the personality function stores this pointer in the context in
register 12 (reserved as a linker scratch register, so never actually used in
unwinding).  

The abstraction layer used in libcxxrt does this automatically:

https://github.com/pathscale/libcxxrt/blob/f96846efbfd508f66d91fcbbef5dd808947c7f6d/src/unwind-arm.h#L223

It appears that the LLVM implementation of the personality routine does not do
this.  This can be fixed by adding:

```
_Unwind_SetGR(context, 12, reinterpret_cast<unsigned long>(exceptionObject));
```

on entry to the personality routine.  This will want to be done upstream, but
we should carry a local patch to compiler-rt (and possibly issue an EN) because
at present any program that tries to throw an exception through C stack frames
crashes on ARM.

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-arm mailing list