From 5b5fba56fea9bbf4a3406fe32d52925dfe5e2f24 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 21 Sep 2009 14:48:37 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++ gcc/dwarf2out.c | 11 +++++- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.dg/guality/inline-params.c | 41 ++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/guality/inline-params.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47c3dfb02b5..83b4fc37e10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-09-21 Jan Hubicka + + * 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 * stor-layout.c (layout_type): Remove obsolete code. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 19eabacfde9..a45703e8b50 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 f51cb8677f9..e676b08e15d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-09-21 Jan Hubicka + + * gcc.dg/guality/inline-params.c: New testcase. + 2009-09-21 Uros Bizjak * 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 00000000000..ff384548f2c --- /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); +}