Commit c6d289f4 by Ed Schonberg Committed by Geert Bosch

exp_util.adb (Must_Be_Aligned): Return false for a component of a record that…

exp_util.adb (Must_Be_Aligned): Return false for a component of a record that has other packed components.

	* exp_util.adb (Must_Be_Aligned): Return false for a component of a
	record that has other packed components.

From-SVN: r47638
parent 5917e80d
2001-12-04 Ed Schonberg <schonber@gnat.com>
* exp_util.adb (Must_Be_Aligned): Return false for a component of a
record that has other packed components.
2001-12-04 Douglass B. Rupp <rupp@gnat.com> 2001-12-04 Douglass B. Rupp <rupp@gnat.com>
* adaint.c: Minor cleanups. * adaint.c: Minor cleanups.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- $Revision: 1.2 $ -- $Revision$
-- -- -- --
-- Copyright (C) 1992-2001, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2001, Free Software Foundation, Inc. --
-- -- -- --
...@@ -2497,6 +2497,30 @@ package body Exp_Util is ...@@ -2497,6 +2497,30 @@ package body Exp_Util is
function Must_Be_Aligned (Obj : Node_Id) return Boolean is function Must_Be_Aligned (Obj : Node_Id) return Boolean is
Typ : constant Entity_Id := Etype (Obj); Typ : constant Entity_Id := Etype (Obj);
function In_Partially_Packed_Record (Comp : Entity_Id) return Boolean;
-- If the component is in a record that contains previous packed
-- components, consider it unaligned because the back-end might
-- choose to pack the rest of the record. Lead to less efficient code,
-- but safer vis-a-vis of back-end choices.
function In_Partially_Packed_Record (Comp : Entity_Id) return Boolean is
Rec_Type : constant Entity_Id := Scope (Comp);
Prev_Comp : Entity_Id;
begin
Prev_Comp := First_Entity (Rec_Type);
while Present (Prev_Comp) loop
if Is_Packed (Etype (Prev_Comp)) then
return True;
elsif Prev_Comp = Comp then
return False;
end if;
Next_Entity (Prev_Comp);
end loop;
return False;
end In_Partially_Packed_Record;
begin begin
-- If object is strictly aligned, we can quit now -- If object is strictly aligned, we can quit now
...@@ -2537,6 +2561,9 @@ package body Exp_Util is ...@@ -2537,6 +2561,9 @@ package body Exp_Util is
elsif Present (Component_Clause (Entity (Selector_Name (Obj)))) then elsif Present (Component_Clause (Entity (Selector_Name (Obj)))) then
return False; return False;
elsif In_Partially_Packed_Record (Entity (Selector_Name (Obj))) then
return False;
-- In all other cases, go look at prefix -- In all other cases, go look at prefix
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment