Commit 8975ae22 by Eric Botcazou Committed by Eric Botcazou

tree-dfa.c (get_ref_base_and_extent): Do not expect positive offsets for…

tree-dfa.c (get_ref_base_and_extent): Do not expect positive offsets for BIT_FIELD_REF and COMPONENT_REF.

	* tree-dfa.c (get_ref_base_and_extent): Do not expect positive
	offsets for BIT_FIELD_REF and COMPONENT_REF.

From-SVN: r123311
parent 7fc100eb
2007-03-28 Eric Botcazou <ebotcazou@adacore.com>
* tree-dfa.c (get_ref_base_and_extent): Do not expect positive
offsets for BIT_FIELD_REF and COMPONENT_REF.
2007-03-28 Richard Guenther <rguenther@suse.de> 2007-03-28 Richard Guenther <rguenther@suse.de>
* tree.c (is_global_var): Move ... * tree.c (is_global_var): Move ...
......
2007-03-28 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/thin_pointer.ad[sb]: New test.
2007-03-28 Douglas Gregor <doug.gregor@gmail.com> 2007-03-28 Douglas Gregor <doug.gregor@gmail.com>
* g++.dg/cpp0x/bracket1.C: New. * g++.dg/cpp0x/bracket1.C: New.
-- { dg-do compile }
-- { dg-options "-O" }
package body Thin_Pointer is
procedure Set_Buffer (AD : Buf_Ptr; Buffer : Stream_ptr) is
begin
AD.B.A := Buffer (Buffer'First)'Address;
end Set_Buffer;
end Thin_Pointer;
with System;
package Thin_Pointer is
type Stream is array (Integer range <>) of Character;
type Stream_Ptr is access Stream;
for Stream_Ptr'Size use Standard'Address_Size;
type Buf is record
A : System.Address;
end record;
type Buf_Wrapper is record
B : Buf;
end record;
type Buf_Ptr is access Buf_Wrapper;
procedure Set_Buffer (AD : Buf_Ptr; Buffer : Stream_ptr);
end Thin_Pointer;
...@@ -896,7 +896,7 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, ...@@ -896,7 +896,7 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
switch (TREE_CODE (exp)) switch (TREE_CODE (exp))
{ {
case BIT_FIELD_REF: case BIT_FIELD_REF:
bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 1); bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 0);
break; break;
case COMPONENT_REF: case COMPONENT_REF:
...@@ -906,11 +906,11 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, ...@@ -906,11 +906,11 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
if (this_offset && TREE_CODE (this_offset) == INTEGER_CST) if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
{ {
HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 1); HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 0);
hthis_offset *= BITS_PER_UNIT; hthis_offset *= BITS_PER_UNIT;
bit_offset += hthis_offset; bit_offset += hthis_offset;
bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1); bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
} }
else else
{ {
...@@ -918,11 +918,8 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, ...@@ -918,11 +918,8 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
/* We need to adjust maxsize to the whole structure bitsize. /* We need to adjust maxsize to the whole structure bitsize.
But we can subtract any constant offset seen sofar, But we can subtract any constant offset seen sofar,
because that would get us out of the structure otherwise. */ because that would get us out of the structure otherwise. */
if (maxsize != -1 if (maxsize != -1 && csize && host_integerp (csize, 1))
&& csize && host_integerp (csize, 1)) maxsize = TREE_INT_CST_LOW (csize) - bit_offset;
{
maxsize = (TREE_INT_CST_LOW (csize) - bit_offset);
}
else else
maxsize = -1; maxsize = -1;
} }
...@@ -959,11 +956,8 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, ...@@ -959,11 +956,8 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
/* We need to adjust maxsize to the whole array bitsize. /* We need to adjust maxsize to the whole array bitsize.
But we can subtract any constant offset seen sofar, But we can subtract any constant offset seen sofar,
because that would get us outside of the array otherwise. */ because that would get us outside of the array otherwise. */
if (maxsize != -1 if (maxsize != -1 && asize && host_integerp (asize, 1))
&& asize && host_integerp (asize, 1)) maxsize = TREE_INT_CST_LOW (asize) - bit_offset;
{
maxsize = (TREE_INT_CST_LOW (asize) - bit_offset);
}
else else
maxsize = -1; maxsize = -1;
......
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