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