aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2018-06-26 05:44:26 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2018-06-26 05:44:26 +0000
commit27b1bf1ec4f6190dae78187a142353e52701570d (patch)
treeaca0f79cc7589e30339573600e8162724b4cd85f
parentd54ca450d2dd008171d93c8051c1f83de8469900 (diff)
downloadgcc-27b1bf1ec4f6190dae78187a142353e52701570d.zip
gcc-27b1bf1ec4f6190dae78187a142353e52701570d.tar.gz
gcc-27b1bf1ec4f6190dae78187a142353e52701570d.tar.bz2
[PR86064] split single cross-partition range with nonzero locviews
We didn't split cross-partition ranges in loclists to output a whole-function location expression, but with nonzero locviews, we force loclists, and then we have to split to avoid cross-partition list entries. for gcc/ChangeLog PR debug/86064 * dwarf2out.c (loc_list_has_views): Adjust comments. (dw_loc_list): Split single cross-partition range with nonzero locview. for gcc/testsuite/ChangeLog PR debug/86064 * gcc.dg/pr86064.c: New. From-SVN: r262130
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/dwarf2out.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr86064.c27
4 files changed, 55 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5f073d..d420310 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2018-06-26 Alexandre Oliva <aoliva@redhat.com>
+
+ PR debug/86064
+ * dwarf2out.c (loc_list_has_views): Adjust comments.
+ (dw_loc_list): Split single cross-partition range with
+ nonzero locview.
+
2018-06-25 Jeff Law <law@redhat.com>
* config/v850/predicates.md (const_float_1_operand): Fix match_code
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 8032364..b5e3134 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -10029,7 +10029,15 @@ new_loc_list (dw_loc_descr_ref expr, const char *begin, var_loc_view vbegin,
return retlist;
}
-/* Return true iff there's any nonzero view number in the loc list. */
+/* Return true iff there's any nonzero view number in the loc list.
+
+ ??? When views are not enabled, we'll often extend a single range
+ to the entire function, so that we emit a single location
+ expression rather than a location list. With views, even with a
+ single range, we'll output a list if start or end have a nonzero
+ view. If we change this, we may want to stop splitting a single
+ range in dw_loc_list just because of a nonzero view, even if it
+ straddles across hot/cold partitions. */
static bool
loc_list_has_views (dw_loc_list_ref list)
@@ -17139,7 +17147,13 @@ dw_loc_list (var_loc_list *loc_list, tree decl, int want_address)
of first partition and second one starting at the
beginning of second partition. */
if (node == loc_list->last_before_switch
- && (node != loc_list->first || loc_list->first->next)
+ && (node != loc_list->first || loc_list->first->next
+ /* If we are to emit a view number, we will emit
+ a loclist rather than a single location
+ expression for the entire function (see
+ loc_list_has_views), so we have to split the
+ range that straddles across partitions. */
+ || !ZERO_VIEW_P (node->view))
&& current_function_decl)
{
endname = cfun->fde->dw_fde_end;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5c0de04..5d5ed66 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-26 Alexandre Oliva <aoliva@redhat.com>
+
+ PR debug/86064
+ * gcc.dg/pr86064.c: New.
+
2018-06-25 Jeff Law <law@redhat.com>
* lib/target-supports.exp
diff --git a/gcc/testsuite/gcc.dg/pr86064.c b/gcc/testsuite/gcc.dg/pr86064.c
new file mode 100644
index 0000000..5be820c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr86064.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-g -O2 -fno-var-tracking-assignments -gsplit-dwarf" } */
+
+/* This used to fail with location views (implicitly) enabled, because
+ var-tracking (not at assignments) creates a range for d starting at
+ the load after the first call, and we did not split the range,
+ despite its crossing between hot and cold partitions, because it's
+ a single range, that we normally extend to the entire function.
+ However, because the range starts at a (presumed) nonzero view, we
+ end up outputting a loclist instead of a single location entry.
+ But then, -gsplit-dwarf selects (startx,length) loclist entries,
+ and the length ends up computing the difference between symbols in
+ different subsections. */
+
+int a;
+__attribute__((__cold__)) void b();
+
+void e(int *);
+int f();
+
+void c() {
+ int d;
+ e(&d);
+ a = d;
+ if (f())
+ b();
+}