diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-28 20:11:20 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-28 20:11:20 +0000 |
commit | 74aab153b68fc0104587de60b95f628c9d6c4f4e (patch) | |
tree | 5b3ea977e0d89e228ad35e4d140ae606fd436493 /gcc | |
parent | 39bc0e0cc92282b56f2c49eadc3b3f8091995b8a (diff) | |
download | gcc-74aab153b68fc0104587de60b95f628c9d6c4f4e.tar.gz |
* tree-dfa.c (get_ref_base_and_extent): Do not expect positive
offsets for BIT_FIELD_REF and COMPONENT_REF.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123311 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/thin_pointer.adb | 11 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/thin_pointer.ads | 22 | ||||
-rw-r--r-- | gcc/tree-dfa.c | 20 |
5 files changed, 49 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f29dbebff9..5267e52b734 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +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> * tree.c (is_global_var): Move ... diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b66dad9c03..b3b28b30527 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +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> * g++.dg/cpp0x/bracket1.C: New. diff --git a/gcc/testsuite/gnat.dg/thin_pointer.adb b/gcc/testsuite/gnat.dg/thin_pointer.adb new file mode 100644 index 00000000000..1e3943f7a5b --- /dev/null +++ b/gcc/testsuite/gnat.dg/thin_pointer.adb @@ -0,0 +1,11 @@ +-- { 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; diff --git a/gcc/testsuite/gnat.dg/thin_pointer.ads b/gcc/testsuite/gnat.dg/thin_pointer.ads new file mode 100644 index 00000000000..6f528a51ed9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/thin_pointer.ads @@ -0,0 +1,22 @@ +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; diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index b23c531cadc..70563e70646 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -896,7 +896,7 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, switch (TREE_CODE (exp)) { 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; case COMPONENT_REF: @@ -906,11 +906,11 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, 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; 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 { @@ -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. But we can subtract any constant offset seen sofar, because that would get us out of the structure otherwise. */ - if (maxsize != -1 - && csize && host_integerp (csize, 1)) - { - maxsize = (TREE_INT_CST_LOW (csize) - bit_offset); - } + if (maxsize != -1 && csize && host_integerp (csize, 1)) + maxsize = TREE_INT_CST_LOW (csize) - bit_offset; else maxsize = -1; } @@ -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. But we can subtract any constant offset seen sofar, because that would get us outside of the array otherwise. */ - if (maxsize != -1 - && asize && host_integerp (asize, 1)) - { - maxsize = (TREE_INT_CST_LOW (asize) - bit_offset); - } + if (maxsize != -1 && asize && host_integerp (asize, 1)) + maxsize = TREE_INT_CST_LOW (asize) - bit_offset; else maxsize = -1; |