On 08.12.2018 00:22, Christos Zoulas wrote: > In article <1544216124.17308.17.camel%gentoo.org@localhost>, > MichaŠGórny <mgorny%gentoo.org@localhost> wrote: >> -=-=-=-=-=- >> >> Hi, >> >> While working on building more LLVM projects on NetBSD, I've noticed >> that libcxxabi fails to build due to incompatible unwind.h. The example >> of problematic code is [1]: >> >> _Unwind_SetGR(context, __builtin_eh_return_data_regno(0), >> reinterpret_cast<uintptr_t>(unwind_exception)); >> _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), >> static_cast<uintptr_t>(results.ttypeIndex)); >> _Unwind_SetIP(context, results.landingPad); >> >> This fails to build because NetBSD's unwind.h expects the last argument >> to _Unwind_Set{GR,IP} to be a pointer. However, it seems that other >> implementations expect an unsigned integer type instead. The types used >> for the last argument of appropriate functions (and return type of their >> respective _Unwind_Get* counterparts) are: >> >> SetGR/GetGR SetIP/GetIP >> gcc 7.3.0 on Linux _Unwind_Word _Unwind_Ptr (-> unsigned [a]) >> clang _Unwind_Word _Unwind_Word (-> uintptr_t) >> llvm-libunwind uintptr_t uintptr_t >> libunwind 1.2.1 uns. long uns. long >> >> [a] gcc is doing some __attribute__ magic on top of it >> >> I think changing our header to use unsigned integer type alike other >> implementations is the way to go. Does this sound like the right thing >> to do? >> >> [1]:https://github.com/llvm-mirror/libcxxabi/blob/master/src/cxa_personality.cpp#L528 >> > First we have to figure out why we have so many: > > ./external/bsd/llvm/dist/clang/lib/Headers/unwind.h This one is used by Clang as far as I can tell. > ./external/bsd/libc++/dist/libcxxrt/src/unwind.h > This is libcxxabi from PathScale. Michal is the right person here as he used to be upstream for this repository and probably can shed a light on this unwind.h copy. > Ok, these 4 can be excluded I guess: > ./external/gpl3/binutils/dist/include/mach-o/unwind.h > ./external/gpl3/binutils.old/dist/include/mach-o/unwind.h > ./external/gpl3/gdb/dist/include/mach-o/unwind.h > ./external/gpl3/gdb.old/dist/include/mach-o/unwind.h > Darwin-only related. > This I wrote IIRC, and it could/should be normalized: > ./lib/libexecinfo/unwind.h > This one is used by GCC. It does not make much difference whether a type is 'unsigned long' or 'uintptr_t'. The incompatibility with this unwind.h variation comes from a pointer type (void*) vs [unsigned] integer type. We shall normalize or replace it with something compatible with the world. > ./sys/lib/libunwind/unwind.h > This one (as informed by Joerg) is a fork of a version from Apple. Its rationale shall be explained. > Are the others the same? > The state of [lib]unwind.h used to be cryptic for me and I wish we were able to document all the used variations, their source, purpose and rationale. > christos >
Attachment:
signature.asc
Description: OpenPGP digital signature