diff options
author | Anatoly Sokolov <aesok@post.ru> | 2010-05-01 21:52:02 +0400 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2010-05-01 21:52:02 +0400 |
commit | 3e93ff81965fedc0eaa06c8646a0ae6788f2fec5 (patch) | |
tree | 04b921bafe9da0814bfd9d39ff3475fef41e5805 /gcc/dwarf2out.c | |
parent | bcbc9564cdd3760173c91b7414eac62d3667ae7d (diff) | |
download | gcc-3e93ff81965fedc0eaa06c8646a0ae6788f2fec5.zip gcc-3e93ff81965fedc0eaa06c8646a0ae6788f2fec5.tar.gz gcc-3e93ff81965fedc0eaa06c8646a0ae6788f2fec5.tar.bz2 |
rtl.h (CONST_DOUBLE_P): Define.
* rtl.h (CONST_DOUBLE_P): Define.
(rtx_to_double_int): Declare.
* emit-rtl.c (rtx_to_double_int): New function.
* dwarf2out.c (insert_double): New function.
(loc_descriptor, add_const_value_attribute): Clean up, use
rtx_to_double_int and insert_double functions.
From-SVN: r158963
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 87 |
1 files changed, 27 insertions, 60 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index ac0258c..ab04b68 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -6116,6 +6116,7 @@ static void add_AT_location_description (dw_die_ref, enum dwarf_attribute, static void add_data_member_location_attribute (dw_die_ref, tree); static bool add_const_value_attribute (dw_die_ref, rtx); static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *); +static void insert_double (double_int, unsigned char *); static void insert_float (const_rtx, unsigned char *); static rtx rtl_for_decl_location (tree); static bool add_location_or_const_value_attribute (dw_die_ref, tree, @@ -13887,10 +13888,8 @@ loc_descriptor (rtx rtl, enum machine_mode mode, else { loc_result->dw_loc_oprnd2.val_class = dw_val_class_const_double; - loc_result->dw_loc_oprnd2.v.val_double.high - = CONST_DOUBLE_HIGH (rtl); - loc_result->dw_loc_oprnd2.v.val_double.low - = CONST_DOUBLE_LOW (rtl); + loc_result->dw_loc_oprnd2.v.val_double + = rtx_to_double_int (rtl); } } break; @@ -13914,39 +13913,14 @@ loc_descriptor (rtx rtl, enum machine_mode mode, for (i = 0, p = array; i < length; i++, p += elt_size) { rtx elt = CONST_VECTOR_ELT (rtl, i); - HOST_WIDE_INT lo, hi; - - switch (GET_CODE (elt)) - { - case CONST_INT: - lo = INTVAL (elt); - hi = -(lo < 0); - break; - - case CONST_DOUBLE: - lo = CONST_DOUBLE_LOW (elt); - hi = CONST_DOUBLE_HIGH (elt); - break; - - default: - gcc_unreachable (); - } + double_int val = rtx_to_double_int (elt); if (elt_size <= sizeof (HOST_WIDE_INT)) - insert_int (lo, elt_size, p); + insert_int (double_int_to_shwi (val), elt_size, p); else { - unsigned char *p0 = p; - unsigned char *p1 = p + sizeof (HOST_WIDE_INT); - gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT)); - if (WORDS_BIG_ENDIAN) - { - p0 = p1; - p1 = p; - } - insert_int (lo, sizeof (HOST_WIDE_INT), p0); - insert_int (hi, sizeof (HOST_WIDE_INT), p1); + insert_double (val, p); } } break; @@ -15334,6 +15308,24 @@ extract_int (const unsigned char *src, unsigned int size) return val; } +/* Writes double_int values to dw_vec_const array. */ + +static void +insert_double (double_int val, unsigned char *dest) +{ + unsigned char *p0 = dest; + unsigned char *p1 = dest + sizeof (HOST_WIDE_INT); + + if (WORDS_BIG_ENDIAN) + { + p0 = p1; + p1 = dest; + } + + insert_int ((HOST_WIDE_INT) val.low, sizeof (HOST_WIDE_INT), p0); + insert_int ((HOST_WIDE_INT) val.high, sizeof (HOST_WIDE_INT), p1); +} + /* Writes floating point values to dw_vec_const array. */ static void @@ -15413,39 +15405,14 @@ add_const_value_attribute (dw_die_ref die, rtx rtl) for (i = 0, p = array; i < length; i++, p += elt_size) { rtx elt = CONST_VECTOR_ELT (rtl, i); - HOST_WIDE_INT lo, hi; - - switch (GET_CODE (elt)) - { - case CONST_INT: - lo = INTVAL (elt); - hi = -(lo < 0); - break; - - case CONST_DOUBLE: - lo = CONST_DOUBLE_LOW (elt); - hi = CONST_DOUBLE_HIGH (elt); - break; - - default: - gcc_unreachable (); - } + double_int val = rtx_to_double_int (elt); if (elt_size <= sizeof (HOST_WIDE_INT)) - insert_int (lo, elt_size, p); + insert_int (double_int_to_shwi (val), elt_size, p); else { - unsigned char *p0 = p; - unsigned char *p1 = p + sizeof (HOST_WIDE_INT); - gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT)); - if (WORDS_BIG_ENDIAN) - { - p0 = p1; - p1 = p; - } - insert_int (lo, sizeof (HOST_WIDE_INT), p0); - insert_int (hi, sizeof (HOST_WIDE_INT), p1); + insert_double (val, p); } } break; |