summaryrefslogtreecommitdiff
path: root/gcc/asan.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/asan.c')
-rw-r--r--gcc/asan.c90
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.