Hi,

This patch fixes problem with size emitted for static structures with flexible 
array.  I found a couple of trackers in guzilla for this problem but all of 
them are marked as fixed and problem still exists.

For a simple testcase

struct S { int a; int b[0]; } s = { 1, { 0, 0} };

current trunk produces (no flags):

        .globl  s
        .data
        .align 4
        .type   s, @object
        .size   s, 4
s:
        .long   1
        .long   0
        .long   0

which has wrong size for object s.

This problem is important for checker because wrong size leads to wrong bounds 
and false bounds violations.  Following patch uses DECL_SIZE_UNIT instead of 
type size and works well for me.  Does it look OK?

Bootstrapped and tested on linux-x86_64.

Thanks,
Ilya
--
gcc/

2014-06-11  Ilya Enkovich  <ilya.enkov...@intel.com>

        * config/elfos.h (ASM_DECLARE_OBJECT_NAME): Use decl size
        instead of type size.
        (ASM_FINISH_DECLARE_OBJECT): Likewise.


diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index c1d5553..7929708 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -313,7 +313,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
If not, see
          && (DECL) && DECL_SIZE (DECL))                                \
        {                                                               \
          size_directive_output = 1;                                    \
-         size = int_size_in_bytes (TREE_TYPE (DECL));                  \
+         size = tree_to_uhwi (DECL_SIZE_UNIT (DECL));                  \
          ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);                 \
        }                                                               \
                                                                        \
@@ -341,7 +341,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  
If not, see
          && !size_directive_output)                            \
        {                                                       \
          size_directive_output = 1;                            \
-         size = int_size_in_bytes (TREE_TYPE (DECL));          \
+         size = tree_to_uhwi (DECL_SIZE_UNIT (DECL));          \
          ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);         \
        }                                                       \
     }                                                          \

Reply via email to