From d289459e853f36b2f0feaf0121c1972fc7c9d208 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 30 Jun 2020 18:46:41 -0400 Subject: [PATCH 269/315] FIXME: fix unhandled assignment op: 'vector_cst' --- gcc/analyzer/region-model2.cc | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index 4bff4b74530..34bab43e1de 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -4544,6 +4544,7 @@ region_model2::get_gassign_result (const gassign *assign, case MEM_REF: case REAL_CST: case COMPLEX_CST: + case VECTOR_CST: case INTEGER_CST: case ARRAY_REF: case SSA_NAME: /* LHS = VAR; */ @@ -4681,11 +4682,27 @@ region_model2::on_gassign (const gassign *assign, } else { - /* Any CONSTRUCTOR that survives to this point is presumably - just a zero-init of everything. */ - gcc_assert (CONSTRUCTOR_NELTS (rhs1) == 0); - gcc_assert (!CONSTRUCTOR_NO_CLEARING (rhs1)); - zero_fill_region (lhs_reg); + /* Any CONSTRUCTOR that survives to this point is either + just a zero-init of everything, or a vector. */ + if (!CONSTRUCTOR_NO_CLEARING (rhs1)) + zero_fill_region (lhs_reg); + unsigned i; + tree index; + tree val; + FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, index, val) + { + /* FIXME: this code assumes we're dealing with a vector. */ + gcc_assert (TREE_CODE (TREE_TYPE (rhs1)) == VECTOR_TYPE); + gcc_assert (TREE_CODE (index) == INTEGER_CST); + const svalue2 *index_sval + = m_mgr->get_or_create_constant_svalue2 (index);; + const region2 *sub_reg + = m_mgr->get_element_region (lhs_reg, + TREE_TYPE (val), + index_sval); + const svalue2 *val_sval = get_rvalue (val, ctxt); + set_value (sub_reg, val_sval, ctxt); + } } } break; @@ -5667,6 +5684,7 @@ region_model2::get_rvalue_1 (path_var pv, case INTEGER_CST: case REAL_CST: case COMPLEX_CST: + case VECTOR_CST: case STRING_CST: return m_mgr->get_or_create_constant_svalue2 (pv.m_tree); -- 2.26.2