diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2008-06-11 15:56:41 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2008-06-11 15:56:41 +0000 |
commit | 056c8faea0671ac8b20504f688e2459386dc18c3 (patch) | |
tree | 7f4fdceccc7546f3261363ae2dab1aa312a764f3 /gcc/builtins.c | |
parent | 2023be161a9a1ec80e84c8fe231b38a4020b629f (diff) | |
download | gcc-056c8faea0671ac8b20504f688e2459386dc18c3.zip gcc-056c8faea0671ac8b20504f688e2459386dc18c3.tar.gz gcc-056c8faea0671ac8b20504f688e2459386dc18c3.tar.bz2 |
builtins.c (get_memory_rtx): Accept byte-addressable bitfields.
* builtins.c (get_memory_rtx): Accept byte-addressable bitfields.
Use DECL_SIZE_UNIT to retrieve the size of the field.
Co-Authored-By: Olivier Hainque <hainque@adacore.com>
From-SVN: r136673
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 8abcc11..edc5d5f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1114,16 +1114,22 @@ get_memory_rtx (tree exp, tree len) while (TREE_CODE (inner) == COMPONENT_REF) { tree field = TREE_OPERAND (inner, 1); - gcc_assert (! DECL_BIT_FIELD (field)); gcc_assert (TREE_CODE (mem_expr) == COMPONENT_REF); gcc_assert (field == TREE_OPERAND (mem_expr, 1)); + /* Bitfields are generally not byte-addressable. */ + gcc_assert (!DECL_BIT_FIELD (field) + || ((tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1) + % BITS_PER_UNIT) == 0 + && host_integerp (DECL_SIZE (field), 0) + && (TREE_INT_CST_LOW (DECL_SIZE (field)) + % BITS_PER_UNIT) == 0)); + if (length >= 0 - && TYPE_SIZE_UNIT (TREE_TYPE (inner)) - && host_integerp (TYPE_SIZE_UNIT (TREE_TYPE (inner)), 0)) + && host_integerp (DECL_SIZE_UNIT (field), 0)) { HOST_WIDE_INT size - = tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (inner)), 0); + = TREE_INT_CST_LOW (DECL_SIZE_UNIT (field)); /* If we can prove the memory starting at XEXP (mem, 0) and ending at XEXP (mem, 0) + LENGTH will fit into this field, we can keep that COMPONENT_REF in MEM_EXPR. */ @@ -1135,7 +1141,7 @@ get_memory_rtx (tree exp, tree len) if (offset >= 0 && host_integerp (DECL_FIELD_OFFSET (field), 0)) - offset += tree_low_cst (DECL_FIELD_OFFSET (field), 0) + offset += TREE_INT_CST_LOW (DECL_FIELD_OFFSET (field)) + tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1) / BITS_PER_UNIT; else |