On 2016-11-18 09:29:36 +0200, Martin Storsjö wrote:
> On Thu, 17 Nov 2016, Janne Grunau wrote:
>
> >On 2016-11-14 00:24:46 +0200, Martin Storsjö wrote:
> >>Check these constraints even for non-pic-elf configurations, to
> >>catch the issues without having to build/test a pic-elf configuration
> >>to find out.
> >>---
> >> .macro  movrelx         rd,  val, gp
> >>+    .ifc \rd,r12
> >>+      .ifb \gp
> >>+        .error          "movrelx rd=r12, needs a manually set gp"
> >>+      .endif
> >>+    .endif
> >>+    .ifc \gp,\rd
> >>+        .error          "movrelx rd=gp doesn't work"
> >>+    .endif
> >
> >this doesn't work as movrelx is intended, the register holding the GOT
> >is saved via the gp register alias. Following should prevent at least
> >the using r12 as rd error:
> >
> >diff --git a/libavutil/arm/asm.S b/libavutil/arm/asm.S
> >index 4ac0ea2..49f0a49 100644
> >--- a/libavutil/arm/asm.S
> >+++ b/libavutil/arm/asm.S
> >@@ -185,17 +185,23 @@ T       ldr             \rd, [\rd]
> >
> >.macro  movrelx         rd,  val, gp
> >#if CONFIG_PIC && defined(__ELF__)
> >+    .ifc \rd,r12
> >+      .if .Lpic_gp == 12
> >+        .error          "movrelx rd=r12, needs a manually set gp"
>
> I don't see how this would error out at all, for "movrelx r12, X(foo)"
> though, which was the situation I had.

err, yes, I didn't payed attention. Patch below errors out in all
conditions but still can be fooled by using register aliases, using
'ip' instead of r12 and maybe uppercase 'R'.

Janne
---8<---

This catches errors manifesting only on position independent ELF builds
on all configurations. This still can be fooled by using register
aliases or the special name 'ip' for r12.
---
 libavutil/arm/asm.S | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/libavutil/arm/asm.S b/libavutil/arm/asm.S
index 4ac0ea2..e2fe463 100644
--- a/libavutil/arm/asm.S
+++ b/libavutil/arm/asm.S
@@ -184,6 +184,25 @@ T       ldr             \rd, [\rd]
 .endm
 
 .macro  movrelx         rd,  val, gp
+    .ifc \rd,\gp
+        .error      "movrelx needs two distinct registers"
+    .endif
+    .ifc \rd_\gp,r12_
+      .ifn .Lpic_gp
+        .error      "movrelx rd=r12, needs a manually set gp"
+      .elseif .Lpic_gp == 12
+        .error      "movrelx rd=r12, needs a manually set gp"
+      .endif
+    .endif
+    .ifnb \gp
+      .ifc \gp,r12
+        .set            .Lpic_gp, 12
+      .else
+        .set            .Lpic_gp, 1
+      .endif
+    .elseif !.Lpic_gp
+        .set            .Lpic_gp, 12
+    .endif
 #if CONFIG_PIC && defined(__ELF__)
     .ifnb \gp
       .if .Lpic_gp
@@ -195,7 +214,6 @@ T       ldr             \rd, [\rd]
         gp      .req    r12
         ldpic           gp,  _GLOBAL_OFFSET_TABLE_
     .endif
-        .set            .Lpic_gp, 1
         ldr             \rd, .Lpicoff\@
         ldr             \rd, [gp, \rd]
         def_pic         \val(GOT), .Lpicoff\@
-- 
2.10.2

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to