https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110044
Bug ID: 110044
Summary: #pragma pack(push, 1) may not force packing, while
__attribute__((packed, aligned(1))) works
Product: gcc
Version: 12.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: vital.had at gmail dot com
CC: iains at gcc dot gnu.org
Target Milestone: ---
Target: powerpc-apple-darwin
Problem: #pragma pack(push, 1) may not work correctly on ppc (32-bit); seems to
be present across GCC versions, confirmed to affect gcc7, gcc11 and gcc12.
Old Apple GCC 4.2 is not affected, at the same time.
Test code:
#include <iostream>
#include <stdint.h>
#pragma pack(push, 1)
/* struct from OpenEXR; should be packed with the pragma directive */
typedef struct
{
uint32_t x_size;
uint32_t y_size;
uint8_t level_and_round;
} exr_attr_tiledesc_t;
/* same struct but reordered */
typedef struct
{
uint8_t level_and_round;
uint32_t x_size;
uint32_t y_size;
} new1_exr_attr_tiledesc_t;
/* same as first struct but with packed forced */
typedef struct
{
uint32_t x_size;
uint32_t y_size;
uint8_t level_and_round;
} __attribute__((packed, aligned(1))) new2_exr_attr_tiledesc_t;
#pragma pack(pop)
int main() {
std::cout << sizeof(exr_attr_tiledesc_t) << " "
<< sizeof(new1_exr_attr_tiledesc_t) << " "
<< sizeof(new2_exr_attr_tiledesc_t) << "\n";
return 0;
}
On Mac OS X Leopart (10.5 PowerPC):
`g++-mp-7 main.cxx && ./a.out` gives: 12 9 9
`g++ main.cxx && ./a.out` gives: 9 9 9
`g++* -arch ppc64 && ./a.out` gives: 9 9 9
On Mac OS X Snow Leopard (10A190 PowerPC):
`g++-mp-11 main.cxx && ./a.out` gives: 12 9 9
`g++-mp-12 main.cxx && ./a.out` gives: 12 9 9
`g++ main.cxx && ./a.out` gives: 9 9 9
where g++ stands for Xcode gcc-4.2.
Discussion in: https://github.com/macports/macports-ports/pull/18872
Also see: https://trac.macports.org/ticket/63490