aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-09-21 14:48:37 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2009-09-21 12:48:37 +0000
commit5b5fba56fea9bbf4a3406fe32d52925dfe5e2f24 (patch)
tree458e11e9171ca3215795368326aa21ae7bc1a4be
parent9e2ceea07aaab0f8e89f468c9b3766c296d31517 (diff)
downloadgcc-5b5fba56fea9bbf4a3406fe32d52925dfe5e2f24.zip
gcc-5b5fba56fea9bbf4a3406fe32d52925dfe5e2f24.tar.gz
gcc-5b5fba56fea9bbf4a3406fe32d52925dfe5e2f24.tar.bz2
inline-params.c: New testcase.
* gcc.dg/guality/inline-params.c: New testcase. * dwarf2out.c (decl_loc_table_eq): Allow decl_loc_table to be NULL. (dwarf2out_abstract_function): NULLify decl_loc_table at begginig and restore at the end. From-SVN: r151917
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/guality/inline-params.c41
4 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 47c3dfb..83b4fc3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-09-21 Jan Hubicka <jh@suse.cz>
+
+ * dwarf2out.c (decl_loc_table_eq): Allow decl_loc_table to be NULL.
+ (dwarf2out_abstract_function): NULLify decl_loc_table at begginig and
+ restore at the end.
+
2009-09-21 Eric Botcazou <ebotcazou@adacore.com>
* stor-layout.c (layout_type): Remove obsolete code.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 19eabac..a45703e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -7491,6 +7491,8 @@ decl_loc_table_eq (const void *x, const void *y)
static inline var_loc_list *
lookup_decl_loc (const_tree decl)
{
+ if (!decl_loc_table)
+ return NULL;
return (var_loc_list *)
htab_find_with_hash (decl_loc_table, decl, DECL_UID (decl));
}
@@ -15533,16 +15535,22 @@ dwarf2out_abstract_function (tree decl)
tree save_fn;
tree context;
int was_abstract = DECL_ABSTRACT (decl);
+ htab_t old_decl_loc_table;
/* Make sure we have the actual abstract inline, not a clone. */
decl = DECL_ORIGIN (decl);
- htab_empty (decl_loc_table);
old_die = lookup_decl_die (decl);
if (old_die && get_AT (old_die, DW_AT_inline))
/* We've already generated the abstract instance. */
return;
+ /* We can be called while recursively when seeing block defining inlined subroutine
+ DIE. Be sure to not clobber the outer location table nor use it or we would
+ get locations in abstract instantces. */
+ old_decl_loc_table = decl_loc_table;
+ decl_loc_table = NULL;
+
/* Be sure we've emitted the in-class declaration DIE (if any) first, so
we don't get confused by DECL_ABSTRACT. */
if (debug_info_level > DINFO_LEVEL_TERSE)
@@ -15564,6 +15572,7 @@ dwarf2out_abstract_function (tree decl)
set_decl_abstract_flags (decl, 0);
current_function_decl = save_fn;
+ decl_loc_table = old_decl_loc_table;
pop_cfun ();
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f51cb86..e676b08 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-09-21 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/guality/inline-params.c: New testcase.
+
2009-09-21 Uros Bizjak <ubizjak@gmail.com>
* gcc.c-torture/execute/ieee/ieee.exp (additional_flags):
diff --git a/gcc/testsuite/gcc.dg/guality/inline-params.c b/gcc/testsuite/gcc.dg/guality/inline-params.c
new file mode 100644
index 0000000..ff38454
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/inline-params.c
@@ -0,0 +1,41 @@
+/* { dg-do run { xfail *-*-* } } */
+/* IPA-SRA removes the argumet as dead, so we don't see their values. */
+/* { dg-options "-g -fno-ipa-sra" } */
+#define GUALITY_DONT_FORCE_LIVE_AFTER -1
+
+#ifndef STATIC_INLINE
+#define STATIC_INLINE /*static*/
+#endif
+
+
+#include "guality.h"
+
+struct a{
+ struct b {int a;} b;
+ struct c{ int a;} c;
+};
+
+__attribute__ ((always_inline)) static inline void
+t1 (struct b *ab, int b)
+{
+ GUALCHKXPRVAL ("b", 0xbbb, 0);
+ GUALCHKVAL (ab);
+}
+__attribute__ ((always_inline)) static inline void
+t2 (struct c *ac, char *msg)
+{
+ GUALCHKVAL (ac);
+ GUALCHKVAL (msg);
+}
+__attribute__ ((always_inline)) static inline void
+t3 (struct a *a)
+{
+ t1(&a->b, 0xbbb);
+ t2(&a->c, "test");
+}
+struct a a={{0},{1}};
+int
+main (int argc, char *argv[])
+{
+ t3(&a);
+}