Discussion:
[PATCH] PR debug/38757 gcc does not emit DW_LANG_C99
Mark Wielaard
2014-10-08 10:13:55 UTC
Permalink
Hi,

This patch was written a long time ago by Jakub and has been in Fedora
gcc for some time. All I did was rebase it to current gcc trunk
and add a testcase. Back when it was originally proposed the issue was
that because DWARF was generated late adding new lang hooks for this
was problematic for LTO. Now that there is a move towards generating
DWARF early I am hoping this patch can finally make it to mainline gcc.

This lang hook will be more useful when DWARFv5 gets out, which is
supposed to define language identifiers for newer C and C++ versions.

Previous discussions:
http://gcc.gnu.org/ml/gcc-patches/2009-03/msg00858.html
http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00991.html

gcc/ChangeLog

2009-03-18 Jakub Jelinek <***@redhat.com>

PR debug/38757
* langhooks.h (struct lang_hooks): Add source_language langhook.
* langhooks-def.h (LANG_HOOKS_SOURCE_LANGUAGE): Define to NULL.
(LANG_HOOKS_INITIALIZER): Add LANG_HOOKS_SOURCE_LANGUAGE.
* dwarf2out.c (add_prototyped_attribute): Add DW_AT_prototype
also for DW_LANG_{C,C99,ObjC}.
(gen_compile_unit_die): Use lang_hooks.source_language () to
determine if DW_LANG_C99 or DW_LANG_C89 should be returned.

gcc/c/ChangeLog

2009-03-18 Jakub Jelinek <***@redhat.com>

PR debug/38757
* c-lang.c (c_source_language): New function.
(LANG_HOOKS_SOURCE_LANGUAGE): Define.

gcc/testsuite/ChangeLog

2014-10-08 Mark Wielaard <***@redhat.com>

PR debug/38757
* gcc.dg/debug/dwarf2/lang-c89.c: New test.
* gcc.dg/debug/dwarf2/lang-c99.c: Likewise.
---
gcc/ChangeLog | 11 +++++++++++
gcc/c/ChangeLog | 6 ++++++
gcc/c/c-lang.c | 8 ++++++++
gcc/dwarf2out.c | 19 ++++++++++++++++---
gcc/langhooks-def.h | 4 +++-
gcc/langhooks.h | 4 ++++
gcc/testsuite/ChangeLog | 6 ++++++
gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c | 6 ++++++
gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c | 6 ++++++
9 files changed, 66 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c

diff --git a/gcc/c/c-lang.c b/gcc/c/c-lang.c
index 97c0443..dadeb1a 100644
--- a/gcc/c/c-lang.c
+++ b/gcc/c/c-lang.c
@@ -35,6 +35,12 @@ along with GCC; see the file COPYING3. If not see

enum c_language_kind c_language = clk_c;

+static int
+c_source_language (void)
+{
+ return flag_isoc99 ? 1999 : 1989;
+}
+
/* Lang hooks common to C and ObjC are declared in c-objc-common.h;
consequently, there should be very few hooks below. */

@@ -44,6 +50,8 @@ enum c_language_kind c_language = clk_c;
#define LANG_HOOKS_INIT c_objc_common_init
#undef LANG_HOOKS_INIT_TS
#define LANG_HOOKS_INIT_TS c_common_init_ts
+#undef LANG_HOOKS_SOURCE_LANGUAGE
+#define LANG_HOOKS_SOURCE_LANGUAGE c_source_language

/* Each front end provides its own lang hook initializer. */
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 59c05ed..4932cd0 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -16708,9 +16708,18 @@ add_bit_size_attribute (dw_die_ref die, tree decl)
static inline void
add_prototyped_attribute (dw_die_ref die, tree func_type)
{
- if (get_AT_unsigned (comp_unit_die (), DW_AT_language) == DW_LANG_C89
- && prototype_p (func_type))
- add_AT_flag (die, DW_AT_prototyped, 1);
+ switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
+ {
+ case DW_LANG_C:
+ case DW_LANG_C89:
+ case DW_LANG_C99:
+ case DW_LANG_ObjC:
+ if (prototype_p (func_type))
+ add_AT_flag (die, DW_AT_prototyped, 1);
+ break;
+ default:
+ break;
+ }
}

/* Add an 'abstract_origin' attribute below a given DIE. The DIE is found
@@ -19544,6 +19553,10 @@ gen_compile_unit_die (const char *filename)
language = DW_LANG_ObjC;
else if (strcmp (language_string, "GNU Objective-C++") == 0)
language = DW_LANG_ObjC_plus_plus;
+ else if (strcmp (language_string, "GNU C") == 0
+ && lang_hooks.source_language
+ && lang_hooks.source_language () >= 1999)
+ language = DW_LANG_C99;
else if (dwarf_version >= 5 || !dwarf_strict)
{
if (strcmp (language_string, "GNU Go") == 0)
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index e5ae3e3..b6c8dd4 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -120,6 +120,7 @@ extern bool lhd_omp_mappable_type (tree);
#define LANG_HOOKS_BLOCK_MAY_FALLTHRU hook_bool_const_tree_true
#define LANG_HOOKS_EH_USE_CXA_END_CLEANUP false
#define LANG_HOOKS_DEEP_UNSHARING false
+#define LANG_HOOKS_SOURCE_LANGUAGE NULL

/* Attribute hooks. */
#define LANG_HOOKS_ATTRIBUTE_TABLE NULL
@@ -313,7 +314,8 @@ extern void lhd_end_section (void);
LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS, \
LANG_HOOKS_BLOCK_MAY_FALLTHRU, \
LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \
- LANG_HOOKS_DEEP_UNSHARING \
+ LANG_HOOKS_DEEP_UNSHARING, \
+ LANG_HOOKS_SOURCE_LANGUAGE \
}

#endif /* GCC_LANG_HOOKS_DEF_H */
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 32e76f9..0022516 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -485,6 +485,10 @@ struct lang_hooks
gimplification. */
bool deep_unsharing;

+ /* Return year of the source language standard version if the FE supports
+ multiple versions of the standard. */
+ int (*source_language) (void);
+
/* Whenever you add entries here, make sure you adjust langhooks-def.h
and langhooks.c accordingly. */
};
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
new file mode 100644
index 0000000..6292cf8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c89.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-O -std=c89 -g -dA" } */
+/* DW_LANG_C89 = 0x0001 */
+/* { dg-final { scan-assembler "0x1.*DW_AT_language" } } */
+
+int version;
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c
new file mode 100644
index 0000000..1d789fe
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/lang-c99.c
@@ -0,0 +1,6 @@
+// { dg-do compile }
+// { dg-options "-O -std=c99 -g -dA" }
+// DW_LANG_C99 = 0x000c
+// { dg-final { scan-assembler "0xc.*DW_AT_language" } } */
+
+int version;
--
1.8.3.1
Marek Polacek
2014-10-08 10:17:43 UTC
Permalink
Post by Mark Wielaard
Hi,
This patch was written a long time ago by Jakub and has been in Fedora
gcc for some time. All I did was rebase it to current gcc trunk
and add a testcase. Back when it was originally proposed the issue was
that because DWARF was generated late adding new lang hooks for this
was problematic for LTO. Now that there is a move towards generating
DWARF early I am hoping this patch can finally make it to mainline gcc.
This lang hook will be more useful when DWARFv5 gets out, which is
supposed to define language identifiers for newer C and C++ versions.
It might have been discussed elsewhere, so sorry for not paying attention,
but what about DW_LANG_C11?

Marek
Mark Wielaard
2014-10-08 10:29:38 UTC
Permalink
Post by Marek Polacek
Post by Mark Wielaard
This lang hook will be more useful when DWARFv5 gets out, which is
supposed to define language identifiers for newer C and C++ versions.
It might have been discussed elsewhere, so sorry for not paying attention,
but what about DW_LANG_C11?
That is one of the new language versions to hopefully gets a definition
with DWARFv5. http://dwarfstd.org/ShowIssue.php?issue=140330.1

Cheers,

Mark
Jakub Jelinek
2014-10-08 10:35:09 UTC
Permalink
Post by Mark Wielaard
Post by Marek Polacek
Post by Mark Wielaard
This lang hook will be more useful when DWARFv5 gets out, which is
supposed to define language identifiers for newer C and C++ versions.
It might have been discussed elsewhere, so sorry for not paying attention,
but what about DW_LANG_C11?
That is one of the new language versions to hopefully gets a definition
with DWARFv5. http://dwarfstd.org/ShowIssue.php?issue=140330.1
Yeah, that is 0x1d it seems, but we don't have
DW_LANG_C_plus_plus_14
unfortunately. IMHO still something that must be added to DWARF5.

Jakub
Mark Wielaard
2014-10-08 11:04:18 UTC
Permalink
Post by Jakub Jelinek
Post by Mark Wielaard
Post by Marek Polacek
Post by Mark Wielaard
This lang hook will be more useful when DWARFv5 gets out, which is
supposed to define language identifiers for newer C and C++ versions.
It might have been discussed elsewhere, so sorry for not paying attention,
but what about DW_LANG_C11?
That is one of the new language versions to hopefully gets a definition
with DWARFv5. http://dwarfstd.org/ShowIssue.php?issue=140330.1
Yeah, that is 0x1d it seems, but we don't have
DW_LANG_C_plus_plus_14
unfortunately. IMHO still something that must be added to DWARF5.
Good point. There is a proposal to add DW_LANG_C_plus_plus_03 (0x17) and
DW_LANG_C_plus_plus_11 (0x18)
http://dwarfstd.org/ShowIssue.php?issue=120628.1
But no DW_LANG_C_plus_plus_14 yet. Probably because C++14 only got
approved last August. Although it has been too late to submit new
proposals for DWARFv5 since a couple of months now I did submit one
anyway. Hopefully we can still sneak it in before there is a first draft
of DWARFv5 out. http://article.gmane.org/gmane.comp.standards.dwarf/218

Cheers,

Mark

Loading...