diff options
Diffstat (limited to 'gcc/asan.c')
-rw-r--r-- | gcc/asan.c | 90 |
1 files changed, 18 insertions, 72 deletions
diff --git a/gcc/asan.c b/gcc/asan.c index 52a2dbc5dfd..571882a6962 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1379,57 +1379,15 @@ build_check_stmt (location_t location, tree base, gimple_stmt_iterator *iter, /* Slow path for 1, 2 and 4 byte accesses. Test (shadow != 0) & ((base_addr & 7) + (size_in_bytes - 1)) >= shadow). */ - g = gimple_build_assign_with_ops (NE_EXPR, - make_ssa_name (boolean_type_node, - NULL), - shadow, - build_int_cst (shadow_type, 0)); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - t = gimple_assign_lhs (g); - - g = gimple_build_assign_with_ops (BIT_AND_EXPR, - make_ssa_name (uintptr_type, - NULL), - base_addr, - build_int_cst (uintptr_type, 7)); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - - g = gimple_build_assign_with_ops (NOP_EXPR, - make_ssa_name (shadow_type, - NULL), - gimple_assign_lhs (g), NULL_TREE); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - + gimple_builder_ssa gb(location); + t = gb.add (NE_EXPR, shadow, 0); + tree t1 = gb.add (BIT_AND_EXPR, base_addr, 7); + t1 = gb.add_type_cast (shadow_type, t1); if (size_in_bytes > 1) - { - g = gimple_build_assign_with_ops (PLUS_EXPR, - make_ssa_name (shadow_type, - NULL), - gimple_assign_lhs (g), - build_int_cst (shadow_type, - size_in_bytes - 1)); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - } - - g = gimple_build_assign_with_ops (GE_EXPR, - make_ssa_name (boolean_type_node, - NULL), - gimple_assign_lhs (g), - shadow); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - - g = gimple_build_assign_with_ops (BIT_AND_EXPR, - make_ssa_name (boolean_type_node, - NULL), - t, gimple_assign_lhs (g)); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); - t = gimple_assign_lhs (g); + t1 = gb.add (PLUS_EXPR, t1, size_in_bytes - 1); + t1 = gb.add (GE_EXPR, t1, shadow); + t = gb.add (BIT_AND_EXPR, t, t1); + gb.insert_after (&gsi, GSI_NEW_STMT); } else t = shadow; @@ -1968,28 +1926,16 @@ transform_statements (void) static tree asan_global_struct (void) { - static const char *field_names[5] - = { "__beg", "__size", "__size_with_redzone", - "__name", "__has_dynamic_init" }; - tree fields[5], ret; - int i; - - ret = make_node (RECORD_TYPE); - for (i = 0; i < 5; i++) - { - fields[i] - = build_decl (UNKNOWN_LOCATION, FIELD_DECL, - get_identifier (field_names[i]), - (i == 0 || i == 3) ? const_ptr_type_node - : build_nonstandard_integer_type (POINTER_SIZE, 1)); - DECL_CONTEXT (fields[i]) = ret; - if (i) - DECL_CHAIN (fields[i - 1]) = fields[i]; - } - TYPE_FIELDS (ret) = fields[0]; - TYPE_NAME (ret) = get_identifier ("__asan_global"); - layout_type (ret); - return ret; + tree ptrint_type = build_nonstandard_integer_type (POINTER_SIZE, 1); + record_builder rec; + rec.add_field ("__beg", const_ptr_type_node); + rec.add_field ("__size", ptrint_type); + rec.add_field ("__size_with_redzone", ptrint_type); + rec.add_field ("__name", const_ptr_type_node); + rec.add_field ("__has_dynamic_init", ptrint_type); + rec.layout (); + rec.tag_name ("__asan_global"); + return rec.as_tree (); } /* Append description of a single global DECL into vector V. |