Applied Mumit Khan's patch to fix #pragma push/pop handling.
From-SVN: r30084
This commit is contained in:
parent
f099b1c909
commit
61e8b354cf
@ -1,3 +1,15 @@
|
||||
Tue Oct 19 11:41:12 1999 Mumit Khan <khan@xraylith.wisc.edu>
|
||||
|
||||
* c-pragma.h (PRAGMA_INSERT_ATTRIBUTES): Delete macro.
|
||||
(insert_pack_attributes): Delete prototype.
|
||||
|
||||
* c-pragma.c (default_alignment): New static variable.
|
||||
(push_alignment): Initialize to current effective alignment.
|
||||
(pop_alignment): Use to set new alignment.
|
||||
(insert_pack_attributes): Delete function.
|
||||
(handle_pragma_token): Set default_alignment as well each time
|
||||
a #pragma pack(<n>) is encountered.
|
||||
|
||||
Tue Oct 19 02:03:00 1999 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* reg-stack.c (stack_result): Aggregates are not returned in
|
||||
|
@ -51,6 +51,13 @@ typedef struct align_stack
|
||||
|
||||
static struct align_stack * alignment_stack = NULL;
|
||||
|
||||
/* If we have a "global" #pragma pack(<n>) if effect when the first
|
||||
#pragma push(pack,<n>) is encountered, this stores the the value of
|
||||
maximum_field_alignment in effect. When the final pop_alignment()
|
||||
happens, we restore the value to this, not to a value of 0 for
|
||||
maximum_field_alignment. Value is in bits. */
|
||||
static int default_alignment;
|
||||
|
||||
static int push_alignment PROTO((int, tree));
|
||||
static int pop_alignment PROTO((tree));
|
||||
|
||||
@ -95,6 +102,12 @@ Alignment must be a small power of two, not %d, in #pragma pack",
|
||||
entry->id = id;
|
||||
entry->prev = alignment_stack;
|
||||
|
||||
/* The current value of maximum_field_alignment is not necessarily
|
||||
0 since there may be a #pragma pack(<n>) in effect; remember it
|
||||
so that we can restore it after the final #pragma pop(). */
|
||||
if (alignment_stack == NULL)
|
||||
default_alignment = maximum_field_alignment;
|
||||
|
||||
alignment_stack = entry;
|
||||
|
||||
maximum_field_alignment = alignment * 8;
|
||||
@ -142,7 +155,7 @@ pop_alignment (id)
|
||||
entry = alignment_stack->prev;
|
||||
|
||||
if (entry == NULL)
|
||||
maximum_field_alignment = 0;
|
||||
maximum_field_alignment = default_alignment;
|
||||
else
|
||||
maximum_field_alignment = entry->alignment * 8;
|
||||
|
||||
@ -153,67 +166,6 @@ pop_alignment (id)
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Generate 'packed' and 'aligned' attributes for decls whilst a
|
||||
#pragma pack(push... is in effect. */
|
||||
void
|
||||
insert_pack_attributes (node, attributes, prefix)
|
||||
tree node;
|
||||
tree * attributes;
|
||||
tree * prefix;
|
||||
{
|
||||
tree a;
|
||||
int field_alignment;
|
||||
|
||||
/* If we are not packing, then there is nothing to do. */
|
||||
if (maximum_field_alignment == 0
|
||||
|| alignment_stack == NULL)
|
||||
return;
|
||||
|
||||
/* We are only interested in fields. */
|
||||
if (TREE_CODE_CLASS (TREE_CODE (node)) != 'd'
|
||||
|| TREE_CODE (node) != FIELD_DECL)
|
||||
return;
|
||||
|
||||
field_alignment = TYPE_ALIGN (TREE_TYPE (node));
|
||||
if (field_alignment <= 0 || field_alignment > maximum_field_alignment)
|
||||
field_alignment = maximum_field_alignment;
|
||||
|
||||
/* Add a 'packed' attribute. */
|
||||
* attributes = tree_cons (get_identifier ("packed"), NULL, * attributes);
|
||||
|
||||
/* If the alignment is > 8 then add an alignment attribute as well. */
|
||||
if (field_alignment > 8)
|
||||
{
|
||||
/* If the aligned attribute is already present then do not override it. */
|
||||
for (a = * attributes; a; a = TREE_CHAIN (a))
|
||||
{
|
||||
tree name = TREE_PURPOSE (a);
|
||||
if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (a == NULL)
|
||||
for (a = * prefix; a; a = TREE_CHAIN (a))
|
||||
{
|
||||
tree name = TREE_PURPOSE (a);
|
||||
if (strcmp (IDENTIFIER_POINTER (name), "aligned") == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (a == NULL)
|
||||
{
|
||||
* attributes = tree_cons
|
||||
(get_identifier ("aligned"),
|
||||
tree_cons (NULL,
|
||||
build_int_2 (field_alignment / 8, 0),
|
||||
NULL),
|
||||
* attributes);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
|
||||
|
||||
/* Handle one token of a pragma directive. TOKEN is the current token, and
|
||||
@ -267,6 +219,9 @@ handle_pragma_token (string, token)
|
||||
if (state == ps_right)
|
||||
{
|
||||
maximum_field_alignment = align * 8;
|
||||
#ifdef HANDLE_PRAGMA_PACK_PUSH_POP
|
||||
default_alignment = maximum_field_alignment;
|
||||
#endif
|
||||
ret_val = 1;
|
||||
}
|
||||
else
|
||||
|
@ -39,9 +39,6 @@ Boston, MA 02111-1307, USA. */
|
||||
/* If we are supporting #pragma pack(push... then we automatically
|
||||
support #pragma pack(<n>) */
|
||||
#define HANDLE_PRAGMA_PACK 1
|
||||
#define PRAGMA_INSERT_ATTRIBUTES(node, pattr, prefix_attr) \
|
||||
insert_pack_attributes (node, pattr, prefix_attr)
|
||||
extern void insert_pack_attributes PROTO((tree, tree *, tree *));
|
||||
#endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user