Hi,

On Fri, 7 Feb 2020 at 09:19, Jakub Jelinek <ja...@redhat.com> wrote:
>
> Hi!
>
> As the following testcase shows, unwind.h on ARM can't be (starting with GCC
> 10) compiled with -std=c* modes, only -std=gnu* modes.
> The problem is it uses asm keyword, which isn't a keyword in those modes
> (system headers vs. non-system ones don't make a difference here).
> glibc and other installed headers use __asm or __asm__ keywords instead that
> work fine in both standard and gnu modes.
>
> While there, as it is an installed header, I think it is also wrong to
> completely ignore any identifier namespace rules.
> The generic unwind.h defines just _Unwind* namespace identifiers plus
> _sleb128_t/_uleb128_t (but e.g. unlike libstdc++/glibc headers doesn't
> uglify operand names), the ARM unwind.h is much worse here.  I've just
> changed the gnu_Unwind_Find_got function at least not be in user identifier
> namespace, but perhaps it would be good to go further and rename e.g.
> #define UNWIND_STACK_REG 13
> #define UNWIND_POINTER_REG 12
> #define FDPIC_REGNUM 9
> #define STR(x) #x
> #define XSTR(x) STR(x)
> or e.g.
>   typedef _Unwind_Reason_Code (*personality_routine) (_Unwind_State,
>       _Unwind_Control_Block *, _Unwind_Context *);
> in unwind-arm-common.h.
>
> Bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk?
>
> 2020-02-07  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/93615
>         * config/arm/unwind-arm.h (gnu_Unwind_Find_got): Rename to ...
>         (_Unwind_gnu_Find_got): ... this.  Use __asm instead of asm.  Remove
>         trailing :s in asm.  Formatting fixes.
>         (_Unwind_decode_typeinfo_ptr): Adjust caller.
>
>         * gcc.dg/pr93615.c: New test.
>

This broke the build of GCC for the arm-none-uclinuxfdpiceabi target (FDPIC).

The attached patch fixes this by updating other uses of gnu_Unwind_Find_got.

OK?

Thanks,

Christophe

>From 667227c7d3d5c3e471be02adc0ce7dc2c4ebfd25 Mon Sep 17 00:00:00 2001
From: Christophe Lyon <christophe.l...@linaro.org>
Date: Mon, 10 Feb 2020 12:54:39 +0000
Subject: [PATCH 1/1] arm: Fix up arm installed unwind.h for use in pedantic
 modes [PR93615]

Commit r10-6500-g811a475ea3fcc55ee4aea7c81171891ef19dfc25 broke the
GCC build for arm-none-uclinuxfdpiceabi, as it forgot to update some
uses of gnu_Unwind_Find_got.

2020-02-10  Christophe Lyon  <christophe.l...@linaro.org>

libgcc/
* unwind-arm-common.inc: Replace uses of gnu_Unwind_Find_got with
_Unwind_gnu_Find_got.
* unwind-pe.h: Likewise.
---
 libgcc/unwind-arm-common.inc | 8 ++++----
 libgcc/unwind-pe.h           | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
index 3c774b8..31a072b 100644
--- a/libgcc/unwind-arm-common.inc
+++ b/libgcc/unwind-arm-common.inc
@@ -419,7 +419,7 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw
return_address)
       UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
 #if __FDPIC__
       UCB_PR_GOT (ucbp)
- = (unsigned int) gnu_Unwind_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
+ = (unsigned int) _Unwind_gnu_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
 #endif
     }
   return _URC_OK;
@@ -462,7 +462,7 @@ unwind_phase2 (_Unwind_Control_Block * ucbp,
phase2_vrs * vrs)

 #if __FDPIC__
   /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-  vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (vrs));
+  vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (vrs));
 #endif

   uw_restore_core_regs (vrs, &vrs->core);
@@ -562,7 +562,7 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp,
phase2_vrs *entry_vrs,

 #if __FDPIC__
   /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-  saved_vrs.core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (&saved_vrs));
+  saved_vrs.core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (&saved_vrs));
 #endif

   uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
@@ -698,7 +698,7 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp,
phase2_vrs * entry_vrs)
       /* Upload the registers to enter the landing pad.  */
 #if __FDPIC__
       /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-      entry_vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC
(entry_vrs));
+      entry_vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC
(entry_vrs));
 #endif
       uw_restore_core_regs (entry_vrs, &entry_vrs->core);

diff --git a/libgcc/unwind-pe.h b/libgcc/unwind-pe.h
index a336127..a6b4bff 100644
--- a/libgcc/unwind-pe.h
+++ b/libgcc/unwind-pe.h
@@ -267,7 +267,7 @@ read_encoded_value_with_base (unsigned char
encoding, _Unwind_Ptr base,
       into account.  */
    if ((encoding & DW_EH_PE_pcrel) && (encoding & DW_EH_PE_indirect))
      {
-       result += gnu_Unwind_Find_got ((_Unwind_Ptr) u);
+       result += _Unwind_gnu_Find_got ((_Unwind_Ptr) u);
        result = *(_Unwind_Internal_Ptr *) result;
      }
    else
-- 
2.7.4


> --- libgcc/config/arm/unwind-arm.h.jj   2020-01-12 11:54:38.616380172 +0100
> +++ libgcc/config/arm/unwind-arm.h      2020-02-06 16:16:54.244624408 +0100
> @@ -43,19 +43,15 @@ extern "C" {
>  #endif
>  _Unwind_Ptr __attribute__((weak)) __gnu_Unwind_Find_got (_Unwind_Ptr);
>
> -static inline _Unwind_Ptr gnu_Unwind_Find_got (_Unwind_Ptr ptr)
> +static inline _Unwind_Ptr _Unwind_gnu_Find_got (_Unwind_Ptr ptr)
>  {
>      _Unwind_Ptr res;
>
>      if (__gnu_Unwind_Find_got)
> -       res =  __gnu_Unwind_Find_got (ptr);
> +       res = __gnu_Unwind_Find_got (ptr);
>      else
> -      {
> -       asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
> -                     : [result]"=r" (res)
> -                     :
> -                     :);
> -      }
> +       __asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
> +                       : [result] "=r" (res));
>
>      return res;
>  }
> @@ -75,7 +71,7 @@ static inline _Unwind_Ptr gnu_Unwind_Fin
>  #if __FDPIC__
>        /* For FDPIC, we store the offset of the GOT entry.  */
>        /* So, first get GOT from dynamic linker and then use indirect access. 
>  */
> -      tmp += gnu_Unwind_Find_got (ptr);
> +      tmp += _Unwind_gnu_Find_got (ptr);
>        tmp = *(_Unwind_Word *) tmp;
>  #elif (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
>      || defined(__FreeBSD__) || defined(__fuchsia__)
> --- gcc/testsuite/gcc.dg/pr93615.c.jj   2020-02-06 22:40:00.921472574 +0100
> +++ gcc/testsuite/gcc.dg/pr93615.c      2020-02-06 22:39:52.937591443 +0100
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-std=c11" } */
> +/* { dg-require-effective-target exceptions } */
> +
> +#include <unwind.h>
> +
> +int
> +main ()
> +{
> +  return 0;
> +}
>
>         Jakub
>
From 667227c7d3d5c3e471be02adc0ce7dc2c4ebfd25 Mon Sep 17 00:00:00 2001
From: Christophe Lyon <christophe.l...@linaro.org>
Date: Mon, 10 Feb 2020 12:54:39 +0000
Subject: [PATCH 1/1] arm: Fix up arm installed unwind.h for use in pedantic
 modes [PR93615]

Commit r10-6500-g811a475ea3fcc55ee4aea7c81171891ef19dfc25 broke the GCC build for arm-none-uclinuxfdpiceabi, as it forgot to update some uses of gnu_Unwind_Find_got.

2020-02-10  Christophe Lyon  <christophe.l...@linaro.org>

	libgcc/
	* unwind-arm-common.inc: Replace uses of gnu_Unwind_Find_got with
	_Unwind_gnu_Find_got.
	* unwind-pe.h: Likewise.
---
 libgcc/unwind-arm-common.inc | 8 ++++----
 libgcc/unwind-pe.h           | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
index 3c774b8..31a072b 100644
--- a/libgcc/unwind-arm-common.inc
+++ b/libgcc/unwind-arm-common.inc
@@ -419,7 +419,7 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
       UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
 #if __FDPIC__
       UCB_PR_GOT (ucbp)
-	= (unsigned int) gnu_Unwind_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
+	= (unsigned int) _Unwind_gnu_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
 #endif
     }
   return _URC_OK;
@@ -462,7 +462,7 @@ unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
 
 #if __FDPIC__
   /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-  vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (vrs));
+  vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (vrs));
 #endif
 
   uw_restore_core_regs (vrs, &vrs->core);
@@ -562,7 +562,7 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
 
 #if __FDPIC__
   /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-  saved_vrs.core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (&saved_vrs));
+  saved_vrs.core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (&saved_vrs));
 #endif
 
   uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
@@ -698,7 +698,7 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, phase2_vrs * entry_vrs)
       /* Upload the registers to enter the landing pad.  */
 #if __FDPIC__
       /* r9 could have been lost due to PLT jump.  Restore correct value.  */
-      entry_vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (entry_vrs));
+      entry_vrs->core.r[FDPIC_REGNUM] = _Unwind_gnu_Find_got (VRS_PC (entry_vrs));
 #endif
       uw_restore_core_regs (entry_vrs, &entry_vrs->core);
 
diff --git a/libgcc/unwind-pe.h b/libgcc/unwind-pe.h
index a336127..a6b4bff 100644
--- a/libgcc/unwind-pe.h
+++ b/libgcc/unwind-pe.h
@@ -267,7 +267,7 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
 	     into account.  */
 	  if ((encoding & DW_EH_PE_pcrel) && (encoding & DW_EH_PE_indirect))
 	    {
-	      result += gnu_Unwind_Find_got ((_Unwind_Ptr) u);
+	      result += _Unwind_gnu_Find_got ((_Unwind_Ptr) u);
 	      result = *(_Unwind_Internal_Ptr *) result;
 	    }
 	  else
-- 
2.7.4

Reply via email to