develooper Front page | perl.perl6.internals | Postings from August 2002

struct padding warnings

Thread Next
From:
Nicholas Clark
Date:
August 24, 2002 06:58
Subject:
struct padding warnings
Message ID:
20020824135155.GE280@Bagpuss.unfortu.net
The idea is that we turn on all the bondage and discipline warnings, and then
still compile squeaky clean despite them, isn't it?

If so, we have a problem to solve:

string.h has this:

/* Tail added to end of string buffers; used for COW GC */
struct Buffer_Tail {
    unsigned char flags;
};

On ARM, in every file, I see this:

In file included from include/parrot/register.h:16,
                 from include/parrot/interpreter.h:42,
                 from include/parrot/parrot.h:160,
                 from jit_cpu.c:11:
include/parrot/string.h:59: warning: padding struct size to alignment boundary

because that structure is getting padded to 4 bytes, and gcc's -Wpadded is
telling us.


I don't like having a warning enabled that we're ignoring. I can see several
solutions

1: Turn off -Wpadded  (bad IMO, as there are other warnings it is telling
   us about that we can fix)
2: Re-write that struct as something 32 bit, such as an int.
   (probably also bad, because that wastes space on most other platforms)
3: Determine minimum structure size at Configure.pl time, and then have an
   #ifdef in structures such as that one that have odd sizes to insert some
   padding chars
   (Clunky, but should work, and will give optimum size on all platforms
   without the warning. And I'll have a go at this if no-one objects or has
   better ideas)


With -Wpadded turned off, there would be no warning about evil evil evil [:-)]
CISC-over-friendly structures such as:

typedef struct Parrot_jit_optimizer_section {
    opcode_t                            *begin;
    opcode_t                            *end;
    Parrot_jit_register_count_t          int_reg_count[NUM_REGISTERS];
    Parrot_jit_register_usage_t          int_reg_usage[NUM_REGISTERS];
    Parrot_jit_register_dir_t            int_reg_dir[NUM_REGISTERS];
    unsigned char                        int_registers_used;
    Parrot_jit_register_count_t          float_reg_count[NUM_REGISTERS];
    Parrot_jit_register_usage_t          float_reg_usage[NUM_REGISTERS];
    Parrot_jit_register_dir_t            float_reg_dir[NUM_REGISTERS];
    unsigned char                        float_registers_used;
    Parrot_jit_arena_t                  *arena;
    unsigned int                         maps;
    unsigned int                         jit_op_count;
    unsigned int                         op_count;
    ptrdiff_t                            load_size;
    char                                 type;
    Parrot_jit_optimizer_section_ptr     branch_target;
    Parrot_jit_optimizer_section_ptr     prev;
    Parrot_jit_optimizer_section_ptr     next;
} Parrot_jit_optimizer_section_t;

All those char elements are giving alignment padding warnings.
But as is, even moving all 3 of them together (and to the end) would still
give a warning on ARM, because the resultant structure would need one more
byte's padding to get to a multiple of 4 bytes.

Nicholas Clark
-- 
Even better than the real thing:	http://nms-cgi.sourceforge.net/

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About