diff mbox

[FFmpeg-devel] Fix missing used attribute for inline assembly variables

Message ID CALkRRgfA9VL8N0koNZGin6Pcj4YNan-PWFn68MVO7w6CasB9nQ@mail.gmail.com
State Superseded
Headers show

Commit Message

Thomas Köppe Oct. 30, 2017, 7:17 p.m. UTC
Variables used in inline assembly need to be marked with attribute((used)).
Static constants already were, via the define of DECLARE_ASM_CONST.
But DECLARE_ALIGNED does not add this attribute, and some of the variables
defined with it are const only used in inline assembly, and therefore
appeared dead.

This change makes FFMPEG linkable with Clang's ThinLTO.

---
 libavcodec/cabac.c | 2 +-
 libavutil/mem.h    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

__attribute__ ((aligned (FFMIN(n, 16)))) v
 #elif defined(__GNUC__) || defined(__clang__)
     #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v

Comments

James Almer Oct. 30, 2017, 7:31 p.m. UTC | #1
On 10/30/2017 4:17 PM, Thomas Köppe wrote:
> Variables used in inline assembly need to be marked with attribute((used)).
> Static constants already were, via the define of DECLARE_ASM_CONST.
> But DECLARE_ALIGNED does not add this attribute, and some of the variables
> defined with it are const only used in inline assembly, and therefore
> appeared dead.
> 
> This change makes FFMPEG linkable with Clang's ThinLTO.
> 
> ---
>  libavcodec/cabac.c | 2 +-
>  libavutil/mem.h    | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
> index dd2b057c6d..7321b48901 100644
> --- a/libavcodec/cabac.c
> +++ b/libavcodec/cabac.c
> @@ -32,7 +32,7 @@
>  #include "cabac.h"
>  #include "cabac_functions.h"
> 
> -const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
> +DECLARE_ALIGNED(1, const uint8_t, ff_h264_cabac_tables)[512 + 4*2*64 +
> 4*64 + 63] = {
>      9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
>      4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
>      3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
> diff --git a/libavutil/mem.h b/libavutil/mem.h
> index 527cd03191..db06e109be 100644
> --- a/libavutil/mem.h
> +++ b/libavutil/mem.h
> @@ -98,7 +98,7 @@
>          AV_PRAGMA(DATA_ALIGN(v,n))                      \
>          static const t __attribute__((aligned(n))) v
>  #elif defined(__DJGPP__)

Is your intention to change the DJGPP path, or the gnuc/clang path?

> -    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned
> (FFMIN(n, 16)))) v
> +    #define DECLARE_ALIGNED(n,t,v)      t av_used __attribute__ ((aligned
> (FFMIN(n, 16)))) v
>      #define DECLARE_ASM_CONST(n,t,v)    static const t av_used
> __attribute__ ((aligned (FFMIN(n, 16)))) v
>  #elif defined(__GNUC__) || defined(__clang__)
>      #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n))) v
>
Thomas Köppe Oct. 30, 2017, 8:14 p.m. UTC | #2
It should be under __GNUC__ -- something went wrong with the patch! I'll
make a new one. Sorry about that!

On 30 October 2017 at 19:31, James Almer <jamrial@gmail.com> wrote:

> On 10/30/2017 4:17 PM, Thomas Köppe wrote:
> > Variables used in inline assembly need to be marked with
> attribute((used)).
> > Static constants already were, via the define of DECLARE_ASM_CONST.
> > But DECLARE_ALIGNED does not add this attribute, and some of the
> variables
> > defined with it are const only used in inline assembly, and therefore
> > appeared dead.
> >
> > This change makes FFMPEG linkable with Clang's ThinLTO.
> >
> > ---
> >  libavcodec/cabac.c | 2 +-
> >  libavutil/mem.h    | 2 +-
> >  2 files changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
> > index dd2b057c6d..7321b48901 100644
> > --- a/libavcodec/cabac.c
> > +++ b/libavcodec/cabac.c
> > @@ -32,7 +32,7 @@
> >  #include "cabac.h"
> >  #include "cabac_functions.h"
> >
> > -const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
> > +DECLARE_ALIGNED(1, const uint8_t, ff_h264_cabac_tables)[512 + 4*2*64 +
> > 4*64 + 63] = {
> >      9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
> >      4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
> >      3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
> > diff --git a/libavutil/mem.h b/libavutil/mem.h
> > index 527cd03191..db06e109be 100644
> > --- a/libavutil/mem.h
> > +++ b/libavutil/mem.h
> > @@ -98,7 +98,7 @@
> >          AV_PRAGMA(DATA_ALIGN(v,n))                      \
> >          static const t __attribute__((aligned(n))) v
> >  #elif defined(__DJGPP__)
>
> Is your intention to change the DJGPP path, or the gnuc/clang path?
>
> > -    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned
> > (FFMIN(n, 16)))) v
> > +    #define DECLARE_ALIGNED(n,t,v)      t av_used __attribute__
> ((aligned
> > (FFMIN(n, 16)))) v
> >      #define DECLARE_ASM_CONST(n,t,v)    static const t av_used
> > __attribute__ ((aligned (FFMIN(n, 16)))) v
> >  #elif defined(__GNUC__) || defined(__clang__)
> >      #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned (n)))
> v
> >
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
Thomas Köppe Oct. 30, 2017, 8:25 p.m. UTC | #3
(I must have forgotten to rebase first!)

On 30 October 2017 at 20:14, Thomas Köppe <tkoeppe@google.com> wrote:

> It should be under __GNUC__ -- something went wrong with the patch! I'll
> make a new one. Sorry about that!
>
> On 30 October 2017 at 19:31, James Almer <jamrial@gmail.com> wrote:
>
>> On 10/30/2017 4:17 PM, Thomas Köppe wrote:
>> > Variables used in inline assembly need to be marked with
>> attribute((used)).
>> > Static constants already were, via the define of DECLARE_ASM_CONST.
>> > But DECLARE_ALIGNED does not add this attribute, and some of the
>> variables
>> > defined with it are const only used in inline assembly, and therefore
>> > appeared dead.
>> >
>> > This change makes FFMPEG linkable with Clang's ThinLTO.
>> >
>> > ---
>> >  libavcodec/cabac.c | 2 +-
>> >  libavutil/mem.h    | 2 +-
>> >  2 files changed, 2 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
>> > index dd2b057c6d..7321b48901 100644
>> > --- a/libavcodec/cabac.c
>> > +++ b/libavcodec/cabac.c
>> > @@ -32,7 +32,7 @@
>> >  #include "cabac.h"
>> >  #include "cabac_functions.h"
>> >
>> > -const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
>> > +DECLARE_ALIGNED(1, const uint8_t, ff_h264_cabac_tables)[512 + 4*2*64 +
>> > 4*64 + 63] = {
>> >      9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
>> >      4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
>> >      3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
>> > diff --git a/libavutil/mem.h b/libavutil/mem.h
>> > index 527cd03191..db06e109be 100644
>> > --- a/libavutil/mem.h
>> > +++ b/libavutil/mem.h
>> > @@ -98,7 +98,7 @@
>> >          AV_PRAGMA(DATA_ALIGN(v,n))                      \
>> >          static const t __attribute__((aligned(n))) v
>> >  #elif defined(__DJGPP__)
>>
>> Is your intention to change the DJGPP path, or the gnuc/clang path?
>>
>> > -    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned
>> > (FFMIN(n, 16)))) v
>> > +    #define DECLARE_ALIGNED(n,t,v)      t av_used __attribute__
>> ((aligned
>> > (FFMIN(n, 16)))) v
>> >      #define DECLARE_ASM_CONST(n,t,v)    static const t av_used
>> > __attribute__ ((aligned (FFMIN(n, 16)))) v
>> >  #elif defined(__GNUC__) || defined(__clang__)
>> >      #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned
>> (n))) v
>> >
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>
>
diff mbox

Patch

diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
index dd2b057c6d..7321b48901 100644
--- a/libavcodec/cabac.c
+++ b/libavcodec/cabac.c
@@ -32,7 +32,7 @@ 
 #include "cabac.h"
 #include "cabac_functions.h"

-const uint8_t ff_h264_cabac_tables[512 + 4*2*64 + 4*64 + 63] = {
+DECLARE_ALIGNED(1, const uint8_t, ff_h264_cabac_tables)[512 + 4*2*64 +
4*64 + 63] = {
     9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5,
     4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
diff --git a/libavutil/mem.h b/libavutil/mem.h
index 527cd03191..db06e109be 100644
--- a/libavutil/mem.h
+++ b/libavutil/mem.h
@@ -98,7 +98,7 @@ 
         AV_PRAGMA(DATA_ALIGN(v,n))                      \
         static const t __attribute__((aligned(n))) v
 #elif defined(__DJGPP__)
-    #define DECLARE_ALIGNED(n,t,v)      t __attribute__ ((aligned
(FFMIN(n, 16)))) v
+    #define DECLARE_ALIGNED(n,t,v)      t av_used __attribute__ ((aligned
(FFMIN(n, 16)))) v
     #define DECLARE_ASM_CONST(n,t,v)    static const t av_used