OSDN Git Service

* gcc.dg/guality/inline-params.c: New testcase.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Sep 2009 12:48:37 +0000 (12:48 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Sep 2009 12:48:37 +0000 (12:48 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151917 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/inline-params.c [new file with mode: 0644]

index 47c3dfb..83b4fc3 100644 (file)
@@ -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.
index 19eabac..a45703e 100644 (file)
@@ -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 ();
 }
 
index f51cb86..e676b08 100644 (file)
@@ -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 (file)
index 0000000..ff38454
--- /dev/null
@@ -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);
+}