From bf03089fbdc33972659b07d7d143f0c8014dcc84 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Thu, 23 Jun 2016 16:45:08 -0400 Subject: [PATCH 1/2] Permit prefixed attributes with lists of declarations --- regression/ansi-c/gcc_attributes9/main.c | 3 +++ src/ansi-c/c_storage_spec.h | 5 +---- src/ansi-c/parser.y | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/regression/ansi-c/gcc_attributes9/main.c b/regression/ansi-c/gcc_attributes9/main.c index 946242fa98d..f18e17aa773 100644 --- a/regression/ansi-c/gcc_attributes9/main.c +++ b/regression/ansi-c/gcc_attributes9/main.c @@ -8,6 +8,9 @@ const char* __attribute__((section("s"))) bar1(); const char* __attribute__((section("s"),weak)) bar2(); const char* __attribute__((section("s"))) __attribute__((weak)) bar(); +volatile int __attribute__((__section__(".init.data1"))) txt_heap_base1; +volatile int __attribute__((__section__(".init.data3"))) txt_heap_base, __attribute__((__section__(".init.data4"))) txt_heap_size; + #endif int main() diff --git a/src/ansi-c/c_storage_spec.h b/src/ansi-c/c_storage_spec.h index c2036a7e2d8..05a4941b0af 100644 --- a/src/ansi-c/c_storage_spec.h +++ b/src/ansi-c/c_storage_spec.h @@ -82,10 +82,7 @@ class c_storage_spect a.is_register |=b.is_register; a.is_inline |=b.is_inline; a.is_thread_local |=b.is_thread_local; - a.is_weak |=b.is_weak; - if(!b.alias.empty()) a.alias=b.alias; - if(!b.asm_label.empty()) a.asm_label=b.asm_label; - if(!b.section.empty()) a.section=b.section; + // attributes belong to the declarator, don't replace them return a; } diff --git a/src/ansi-c/parser.y b/src/ansi-c/parser.y index ec697346098..8b6b852247d 100644 --- a/src/ansi-c/parser.y +++ b/src/ansi-c/parser.y @@ -971,18 +971,19 @@ declaring_list: // add the initializer to_ansi_c_declaration(stack($$)).add_initializer(stack($5)); } - | declaring_list ',' declarator + | declaring_list ',' gcc_type_attribute_opt declarator post_declarator_attributes_opt { // type attribute goes into declarator - $3=merge($4, $3); - PARSER.add_declarator(stack($1), stack($3)); + $5=merge($5, $3); + $4=merge($5, $4); + PARSER.add_declarator(stack($1), stack($4)); } initializer_opt { // add in the initializer $$=$1; - to_ansi_c_declaration(stack($$)).add_initializer(stack($6)); + to_ansi_c_declaration(stack($$)).add_initializer(stack($7)); } ; From 6ef66d013fbafaab8abac8aefbf219300ebf7d95 Mon Sep 17 00:00:00 2001 From: Michael Tautschnig Date: Thu, 23 Jun 2016 19:09:04 -0400 Subject: [PATCH 2/2] Packing with n>1 must be considered for nested structs --- regression/ansi-c/Struct_Padding6/main.c | 32 +++++++++++++++++++++ regression/ansi-c/Struct_Padding6/test.desc | 8 ++++++ src/ansi-c/padding.cpp | 8 ++++-- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 regression/ansi-c/Struct_Padding6/main.c create mode 100644 regression/ansi-c/Struct_Padding6/test.desc diff --git a/regression/ansi-c/Struct_Padding6/main.c b/regression/ansi-c/Struct_Padding6/main.c new file mode 100644 index 00000000000..3d35e525b72 --- /dev/null +++ b/regression/ansi-c/Struct_Padding6/main.c @@ -0,0 +1,32 @@ +#define STATIC_ASSERT(condition) \ + int some_array##__LINE__[(condition) ? 1 : -1] + +#pragma pack(4) + +typedef unsigned short domid_t; +typedef unsigned evtchn_port_t; +struct evtchn_status { + domid_t dom; + evtchn_port_t port; + unsigned status; + unsigned vcpu; + union { + struct { + domid_t dom; + } unbound; + struct { + domid_t dom; + evtchn_port_t port; + } interdomain; + unsigned pirq; + unsigned virq; + } u; + char a; +}; + +int main() +{ + STATIC_ASSERT(__builtin_offsetof(struct evtchn_status,u.interdomain.port)==20); + STATIC_ASSERT(sizeof(struct evtchn_status)==28); + return 0; +}; diff --git a/regression/ansi-c/Struct_Padding6/test.desc b/regression/ansi-c/Struct_Padding6/test.desc new file mode 100644 index 00000000000..466da18b2b5 --- /dev/null +++ b/regression/ansi-c/Struct_Padding6/test.desc @@ -0,0 +1,8 @@ +CORE +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/src/ansi-c/padding.cpp b/src/ansi-c/padding.cpp index 50d19bfda5e..16f11fccaa2 100644 --- a/src/ansi-c/padding.cpp +++ b/src/ansi-c/padding.cpp @@ -188,8 +188,9 @@ void add_padding(struct_typet &type, const namespacet &ns) } } - // Is the struct packed? - if(type.get_bool(ID_C_packed)) + // Is the struct packed, without any alignment specification? + if(type.get_bool(ID_C_packed) && + type.find(ID_C_alignment).is_nil()) return; // done mp_integer offset=0; @@ -291,6 +292,9 @@ void add_padding(struct_typet &type, const namespacet &ns) max_alignment=tmp_i; } } + // Is the struct packed, without any alignment specification? + else if(type.get_bool(ID_C_packed)) + return; // done // There may be a need for 'end of struct' padding. // We use 'max_alignment'.