On Mon, Apr 17, 2017 at 05:02:32PM +0100, Paul Brook wrote:
> Package: libsbc1
> Version: 1.3-1+b2
> Followup-For: Bug #856487
>
> Not a stack corruption.
>
> This is miscompilation of sbc_analyze_4b_8s_armv6. gcc appears to look
> into the asm function and decides that it does not clobber r3 (which the
> normal ARM ABI says is call clobbered). The last out += out_stride ends
> up incrementing the pointer by an arbitrary amount.
>
> The attached patch works around the bug.
Unfortunately this is not correct since extended asm is not allowed in
naked functions.
Short-term I'd suggest to use the attached patch, that disables the
ARMv6 asm implementation and uses the C implementation instead.
> I'm not entirely sure whether this is a gcc bug or not, but at best it's
> surprising behavior from gcc. I've attached a reduced testcase for the
> toolchain
> folks to argue over (compile with gcc -O2, tested with gcc 6.3.0-2 from
> sid).
This is either a bug in gcc or insufficient documentation in gcc.
Could you (or did you already) submit that to the gcc bugzilla?
> Paul
>...
Thanks
Adrian
--
"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon Seed
Description: Disable the ARMv6 asm implementation
This gets miscompiled with recent gcc since gcc does not consider
r3 clobbered by the basic asm in a naked function (see #856487).
.
The imost simple short-term fix is to disable the ARMv6 asm
implementation on armhf and use the C implementation instead.
Author: Adrian Bunk <[email protected]>
Bug-Debian: https://bugs.debian.org/856487
--- sbc-1.3.orig/sbc/sbc_primitives_armv6.h
+++ sbc-1.3/sbc/sbc_primitives_armv6.h
@@ -35,7 +35,7 @@
defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_7__) || \
defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || \
defined(__ARM_ARCH_7M__)
-#define SBC_HAVE_ARMV6 1
+//#define SBC_HAVE_ARMV6 1
#endif
#if !defined(SBC_HIGH_PRECISION) && (SCALE_OUT_BITS == 15) && \