Re: svn commit: r354347 - in head: contrib/compiler-rt/lib/builtins contrib/libunwind/include lib/libcompiler_rt lib/libgcc_s lib/libgcc_s/arm

2019-11-28 Thread Michal Meloun



On 05.11.2019 4:20, Conrad Meyer wrote:
> Author: cem
> Date: Tue Nov  5 03:20:40 2019
> New Revision: 354347
> URL: https://svnweb.freebsd.org/changeset/base/354347
> 
> Log:
>   Fix llvm-libunwind userspace build on ARM
>   
>   GCC's libgcc exports a few ARM-specific symbols for ARM EABI, AEABI, or
>   EHABI or whatever it's called.  Export the same ones from LLVM-libunwind's
>   libgcc_s, on ARM.  As part of this, convert libgcc_s from a direct
>   Version.map to one constructed from component Symbol.map files.  This allows
>   the ARM-specific Symbol.map to be included only on ARM.
>   
>   Fix ARM-only oddities in struct name/aliases in LLVM-libunwind to match
>   non-ARM definitions and ARM-specific expectations in libcxxrt /
>   libcompiler_rt.
>   
>   No functional change intended for non-ARM architectures.
>   
>   This commit does not actually flip the switch for ARM defaults from libgcc
>   to llvm-libunwind, but makes it possible (to compile, anyway).

This broke ABI for arm. Unlike of all other platforms, _Unwind_Backtrace
should be exported with GCC_4.3.0 version. More over  we should also
hold GCC_3.3 version for compatibility with  FBSD11. Please, see r318024
for more details.
Thanks,
Michal

> 
> Added:
>   head/lib/libgcc_s/Symbol.map
>  - copied, changed from r354346, head/lib/libgcc_s/Version.map
>   head/lib/libgcc_s/Versions.def   (contents, props changed)
>   head/lib/libgcc_s/arm/
>   head/lib/libgcc_s/arm/Symbol.map   (contents, props changed)
> Deleted:
>   head/lib/libgcc_s/Version.map
> Modified:
>   head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
>   head/contrib/libunwind/include/unwind.h
>   head/lib/libcompiler_rt/Makefile
>   head/lib/libgcc_s/Makefile
> 
> Modified: head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
> ==
> --- head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.cTue Nov 
>  5 02:30:41 2019(r354346)
> +++ head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.cTue Nov 
>  5 03:20:40 2019(r354347)
> @@ -9,8 +9,23 @@
>  #include "int_lib.h"
>  
>  #include 
> +/*
> + * XXX On FreeBSD, this file is compiled into three libraries:
> + *   - libcompiler_rt
> + *   - libgcc_eh
> + *   - libgcc_s
> + *
> + * In the former, the include path points to the 
> contrib/libcxxrt/unwind-arm.h
> + * copy of unwind.h.  In the latter, the include path points to the
> + * contrib/libunwind/include/unwind.h header (LLVM libunwind).
> + *
> + * Neither (seemingly redundant) variant of unwind.h needs the redefinitions
> + * provided in the "helpful" header below, and libcxxrt's unwind-arm.h 
> provides
> + * *no* useful distinguishing macros, so just forcibly disable the helper
> + * header on FreeBSD.
> + */
>  #if defined(__arm__) && !defined(__ARM_DWARF_EH__) &&
>   \
> -!defined(__USING_SJLJ_EXCEPTIONS__)
> +!defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__FreeBSD__)
>  // When building with older compilers (e.g. clang <3.9), it is possible that 
> we
>  // have a version of unwind.h which does not provide the EHABI declarations
>  // which are quired for the C personality to conform to the specification.  
> In
> 
> Modified: head/contrib/libunwind/include/unwind.h
> ==
> --- head/contrib/libunwind/include/unwind.h   Tue Nov  5 02:30:41 2019
> (r354346)
> +++ head/contrib/libunwind/include/unwind.h   Tue Nov  5 03:20:40 2019
> (r354347)
> @@ -66,12 +66,16 @@ static const _Unwind_State _US_ACTION_MASK
>  static const _Unwind_State _US_FORCE_UNWIND   = 8;
>  
>  typedef uint32_t _Unwind_EHT_Header;
> +/*
> + * gcc_personality_v0 references 'struct _Unwind_Exception' all over the 
> place.
> + * Nothing in libunwind cares about 'struct _Unwind_Control_Block,' so make 
> it
> + * the alias of struct _Unwind_Exception, instead of the other way around.
> + */
> +struct _Unwind_Exception;
> +typedef struct _Unwind_Exception _Unwind_Exception;
> +typedef struct _Unwind_Exception _Unwind_Control_Block; /* Alias */
>  
> -struct _Unwind_Control_Block;
> -typedef struct _Unwind_Control_Block _Unwind_Control_Block;
> -typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */
> -
> -struct _Unwind_Control_Block {
> +struct _Unwind_Exception {
>uint64_t exception_class;
>void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*);
>  
> 
> Modified: head/lib/libcompiler_rt/Makefile
> ==
> --- head/lib/libcompiler_rt/Makefile  Tue Nov  5 02:30:41 2019
> (r354346)
> +++ head/lib/libcompiler_rt/Makefile  Tue Nov  5 03:20:40 2019
> (r354347)
> @@ -12,10 +12,6 @@ CFLAGS+=   -fvisibility=hidden
>  CFLAGS+= -DVISIBILITY_HIDDEN
>  CFLAGS+= -I${SRCTOP}/contrib/libcxxrt
>  
> -.if 

svn commit: r354347 - in head: contrib/compiler-rt/lib/builtins contrib/libunwind/include lib/libcompiler_rt lib/libgcc_s lib/libgcc_s/arm

2019-11-04 Thread Conrad Meyer
Author: cem
Date: Tue Nov  5 03:20:40 2019
New Revision: 354347
URL: https://svnweb.freebsd.org/changeset/base/354347

Log:
  Fix llvm-libunwind userspace build on ARM
  
  GCC's libgcc exports a few ARM-specific symbols for ARM EABI, AEABI, or
  EHABI or whatever it's called.  Export the same ones from LLVM-libunwind's
  libgcc_s, on ARM.  As part of this, convert libgcc_s from a direct
  Version.map to one constructed from component Symbol.map files.  This allows
  the ARM-specific Symbol.map to be included only on ARM.
  
  Fix ARM-only oddities in struct name/aliases in LLVM-libunwind to match
  non-ARM definitions and ARM-specific expectations in libcxxrt /
  libcompiler_rt.
  
  No functional change intended for non-ARM architectures.
  
  This commit does not actually flip the switch for ARM defaults from libgcc
  to llvm-libunwind, but makes it possible (to compile, anyway).

Added:
  head/lib/libgcc_s/Symbol.map
 - copied, changed from r354346, head/lib/libgcc_s/Version.map
  head/lib/libgcc_s/Versions.def   (contents, props changed)
  head/lib/libgcc_s/arm/
  head/lib/libgcc_s/arm/Symbol.map   (contents, props changed)
Deleted:
  head/lib/libgcc_s/Version.map
Modified:
  head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
  head/contrib/libunwind/include/unwind.h
  head/lib/libcompiler_rt/Makefile
  head/lib/libgcc_s/Makefile

Modified: head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c
==
--- head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c  Tue Nov  5 
02:30:41 2019(r354346)
+++ head/contrib/compiler-rt/lib/builtins/gcc_personality_v0.c  Tue Nov  5 
03:20:40 2019(r354347)
@@ -9,8 +9,23 @@
 #include "int_lib.h"
 
 #include 
+/*
+ * XXX On FreeBSD, this file is compiled into three libraries:
+ *   - libcompiler_rt
+ *   - libgcc_eh
+ *   - libgcc_s
+ *
+ * In the former, the include path points to the contrib/libcxxrt/unwind-arm.h
+ * copy of unwind.h.  In the latter, the include path points to the
+ * contrib/libunwind/include/unwind.h header (LLVM libunwind).
+ *
+ * Neither (seemingly redundant) variant of unwind.h needs the redefinitions
+ * provided in the "helpful" header below, and libcxxrt's unwind-arm.h provides
+ * *no* useful distinguishing macros, so just forcibly disable the helper
+ * header on FreeBSD.
+ */
 #if defined(__arm__) && !defined(__ARM_DWARF_EH__) &&  
\
-!defined(__USING_SJLJ_EXCEPTIONS__)
+!defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__FreeBSD__)
 // When building with older compilers (e.g. clang <3.9), it is possible that we
 // have a version of unwind.h which does not provide the EHABI declarations
 // which are quired for the C personality to conform to the specification.  In

Modified: head/contrib/libunwind/include/unwind.h
==
--- head/contrib/libunwind/include/unwind.h Tue Nov  5 02:30:41 2019
(r354346)
+++ head/contrib/libunwind/include/unwind.h Tue Nov  5 03:20:40 2019
(r354347)
@@ -66,12 +66,16 @@ static const _Unwind_State _US_ACTION_MASK
 static const _Unwind_State _US_FORCE_UNWIND   = 8;
 
 typedef uint32_t _Unwind_EHT_Header;
+/*
+ * gcc_personality_v0 references 'struct _Unwind_Exception' all over the place.
+ * Nothing in libunwind cares about 'struct _Unwind_Control_Block,' so make it
+ * the alias of struct _Unwind_Exception, instead of the other way around.
+ */
+struct _Unwind_Exception;
+typedef struct _Unwind_Exception _Unwind_Exception;
+typedef struct _Unwind_Exception _Unwind_Control_Block; /* Alias */
 
-struct _Unwind_Control_Block;
-typedef struct _Unwind_Control_Block _Unwind_Control_Block;
-typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */
-
-struct _Unwind_Control_Block {
+struct _Unwind_Exception {
   uint64_t exception_class;
   void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*);
 

Modified: head/lib/libcompiler_rt/Makefile
==
--- head/lib/libcompiler_rt/MakefileTue Nov  5 02:30:41 2019
(r354346)
+++ head/lib/libcompiler_rt/MakefileTue Nov  5 03:20:40 2019
(r354347)
@@ -12,10 +12,6 @@ CFLAGS+= -fvisibility=hidden
 CFLAGS+=   -DVISIBILITY_HIDDEN
 CFLAGS+=   -I${SRCTOP}/contrib/libcxxrt
 
-.if ${COMPILER_TYPE} == "clang"
-CWARNFLAGS.gcc_personality_v0.c+= -Wno-typedef-redefinition
-.endif
-
 # gcc has incompatible internal declarations for __divtc3 and __multc3, but has
 # no option to silence its warning, so make warnings non-fatal.
 NO_WERROR.gcc=

Modified: head/lib/libgcc_s/Makefile
==
--- head/lib/libgcc_s/Makefile  Tue Nov  5 02:30:41 2019(r354346)
+++ head/lib/libgcc_s/Makefile  Tue Nov  5 03:20:40 2019(r354347)
@@ -4,12