aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-06-28 06:21:13 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2018-06-28 06:21:13 +0000
commitfb18c0c9fe26a77541dd63ca351832194969bef9 (patch)
tree48aa3b3611869946b4547113caed9fe78e209832
parent09e1386fd0c6de42272edc9bb0a4b7c2e193b7a7 (diff)
downloadgcc-fb18c0c9fe26a77541dd63ca351832194969bef9.zip
gcc-fb18c0c9fe26a77541dd63ca351832194969bef9.tar.gz
gcc-fb18c0c9fe26a77541dd63ca351832194969bef9.tar.bz2
tree-inline.c (remap_gimple_stmt): Force input_location on the new statement if id->reset_location is true.
* tree-inline.c (remap_gimple_stmt): Force input_location on the new statement if id->reset_location is true. (copy_edges_for_bb): Do not set goto_locus on the new edges if id->reset_location is true. (copy_phis_for_bb): Force input_location on the arguments if id->reset_location is true. (expand_call_inline): Set id->reset_location if DECL_IGNORED_P is set on the function to be inlined. * tree-inline.h (struct copy_body_data): Move remapping_type_depth and prevent_decl_creation_for_types fields up and add reset_location field. From-SVN: r262207
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gnat.dg/debug15.adb23
-rw-r--r--gcc/tree-inline.c21
-rw-r--r--gcc/tree-inline.h15
5 files changed, 66 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1059443..91ccb22 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2018-06-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-inline.c (remap_gimple_stmt): Force input_location on the new
+ statement if id->reset_location is true.
+ (copy_edges_for_bb): Do not set goto_locus on the new edges if
+ id->reset_location is true.
+ (copy_phis_for_bb): Force input_location on the arguments if
+ id->reset_location is true.
+ (expand_call_inline): Set id->reset_location if DECL_IGNORED_P
+ is set on the function to be inlined.
+ * tree-inline.h (struct copy_body_data): Move remapping_type_depth and
+ prevent_decl_creation_for_types fields up and add reset_location field.
+
2018-06-27 Stephan Bergmann <sbergman@redhat.com>
* doc/invoke.texi (Debugging Options): Add -gsplit-dwarf.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3b33d20..1350260 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-06-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/debug15.adb: New test.
+
2018-06-27 David Malcolm <dmalcolm@redhat.com>
PR c++/86329
@@ -5,8 +9,6 @@
2018-06-27 Carl Love <cel@us.ibm.com>
-Add test case that was supposed to be added in commit 255556 on 2017-12-11.
-
* gcc.target/vsx-vector-abss.c: New file to test vec_abss.
2018-06-27 Tamar Christina <tamar.christina@arm.com>
diff --git a/gcc/testsuite/gnat.dg/debug15.adb b/gcc/testsuite/gnat.dg/debug15.adb
new file mode 100644
index 0000000..75470e3
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/debug15.adb
@@ -0,0 +1,23 @@
+-- { dg-do compile }
+-- { dg-options "-g1" }
+
+procedure Debug15 is
+
+ type Shape is abstract tagged record
+ S : Integer;
+ end record;
+
+ type Rectangle is new Shape with record
+ R : Integer;
+ end record;
+
+ X : Integer;
+
+ R: Rectangle := (1, 2);
+ S: Shape'Class := R;
+
+begin
+ X := 12;
+end;
+
+-- { dg-final { scan-assembler-not "loc 2" } }
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index c39a845..427ef95 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1630,6 +1630,8 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id)
= gimple_build_debug_bind (gimple_debug_bind_get_var (stmt),
gimple_debug_bind_get_value (stmt),
stmt);
+ if (id->reset_location)
+ gimple_set_location (copy, input_location);
id->debug_stmts.safe_push (copy);
gimple_seq_add_stmt (&stmts, copy);
return stmts;
@@ -1640,6 +1642,8 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id)
(gimple_debug_source_bind_get_var (stmt),
gimple_debug_source_bind_get_value (stmt),
stmt);
+ if (id->reset_location)
+ gimple_set_location (copy, input_location);
id->debug_stmts.safe_push (copy);
gimple_seq_add_stmt (&stmts, copy);
return stmts;
@@ -1653,6 +1657,8 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id)
return stmts;
gdebug *copy = as_a <gdebug *> (gimple_copy (stmt));
+ if (id->reset_location)
+ gimple_set_location (copy, input_location);
id->debug_stmts.safe_push (copy);
gimple_seq_add_stmt (&stmts, copy);
return stmts;
@@ -1751,6 +1757,9 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id)
gimple_set_block (copy, *n);
}
+ if (id->reset_location)
+ gimple_set_location (copy, input_location);
+
/* Debug statements ought to be rebuilt and not copied. */
gcc_checking_assert (!is_gimple_debug (copy));
@@ -2178,7 +2187,8 @@ copy_edges_for_bb (basic_block bb, profile_count num, profile_count den,
new_edge
= make_edge (new_bb, (basic_block) old_edge->dest->aux, flags);
new_edge->probability = old_edge->probability;
- new_edge->goto_locus = remap_location (locus, id);
+ if (!id->reset_location)
+ new_edge->goto_locus = remap_location (locus, id);
}
if (bb->index == ENTRY_BLOCK || bb->index == EXIT_BLOCK)
@@ -2375,7 +2385,10 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
inserted = true;
}
locus = gimple_phi_arg_location_from_edge (phi, old_edge);
- locus = remap_location (locus, id);
+ if (id->reset_location)
+ locus = input_location;
+ else
+ locus = remap_location (locus, id);
add_phi_arg (new_phi, new_arg, new_edge, locus);
}
}
@@ -4499,8 +4512,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
prepend_lexical_block (gimple_block (stmt), id->block);
}
- /* Local declarations will be replaced by their equivalents in this
- map. */
+ /* Local declarations will be replaced by their equivalents in this map. */
st = id->decl_map;
id->decl_map = new hash_map<tree, tree>;
dst = id->debug_map;
@@ -4509,6 +4521,7 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
/* Record the function we are about to inline. */
id->src_fn = fn;
id->src_cfun = DECL_STRUCT_FUNCTION (fn);
+ id->reset_location = DECL_IGNORED_P (fn);
id->call_stmt = call_stmt;
/* When inlining into an OpenMP SIMD-on-SIMT loop, arrange for new automatic
diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h
index faeca2f..29caab7 100644
--- a/gcc/tree-inline.h
+++ b/gcc/tree-inline.h
@@ -80,6 +80,9 @@ struct copy_body_data
is not. */
gcall *call_stmt;
+ /* > 0 if we are remapping a type currently. */
+ int remapping_type_depth;
+
/* Exception landing pad the inlined call lies in. */
int eh_lp_nr;
@@ -110,11 +113,14 @@ struct copy_body_data
/* True if this statement will need to be regimplified. */
bool regimplify;
- /* True if trees should not be unshared. */
+ /* True if trees may not be unshared. */
bool do_not_unshare;
- /* > 0 if we are remapping a type currently. */
- int remapping_type_depth;
+ /* True if new declarations may not be created during type remapping. */
+ bool prevent_decl_creation_for_types;
+
+ /* True if the location information will need to be reset. */
+ bool reset_location;
/* A function to be called when duplicating BLOCK nodes. */
void (*transform_lang_insert_block) (tree);
@@ -145,9 +151,6 @@ struct copy_body_data
/* A list of addressable local variables remapped into the caller
when inlining a call within an OpenMP SIMD-on-SIMT loop. */
vec<tree> *dst_simt_vars;
-
- /* Do not create new declarations when within type remapping. */
- bool prevent_decl_creation_for_types;
};
/* Weights of constructions for estimate_num_insns. */