This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 2/5] c_diagnostic_ignored_function hack
- From: Tom Tromey <tromey at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Tom Tromey <tromey at redhat dot com>
- Date: Fri, 16 May 2014 09:26:38 -0600
- Subject: [PATCH 2/5] c_diagnostic_ignored_function hack
- Authentication-results: sourceware.org; auth=none
- References: <1400254001-12038-1-git-send-email-tromey at redhat dot com>
In the typical case, when compiling a snippet of user code, gdb wraps
the user's text in a dummy function.
It's somewhat odd for users if an error in their code is mentioned as
coming from this dummy function.
This patch makes it possible to suppress the function-name display in
a straightforward way: it adds a new global which the plugin can set
to declare the name of the dummy function.
This patch seems like a bit of a hack, but there didn't seem to be a
notably cleaner approach.
2014-05-16 Phil Muldoon <pmuldoon@redhat.com>
Tom Tromey <tromey@redhat.com>
* c-lang.c (c_diagnostic_ignored_function): New global.
(c_print_error_function): New function.
(LANG_HOOKS_PRINT_ERROR_FUNCTION): Define.
* c-lang.h (c_diagnostic_ignored_function): Declare.
---
gcc/c/ChangeLog | 8 ++++++++
gcc/c/c-lang.c | 22 ++++++++++++++++++++++
gcc/c/c-lang.h | 4 ++++
3 files changed, 34 insertions(+)
diff --git a/gcc/c/c-lang.c b/gcc/c/c-lang.c
index 97c0443..e563813 100644
--- a/gcc/c/c-lang.c
+++ b/gcc/c/c-lang.c
@@ -35,6 +35,26 @@ along with GCC; see the file COPYING3. If not see
enum c_language_kind c_language = clk_c;
+// If non-zero, this names a function which should not be reported in
+// a diagnostic. This is used by the gdb plugin to avoid showing the
+// generated function name to the user.
+const char *c_diagnostic_ignored_function;
+
+// An implementation of the print_error_function langhook that
+// respects C_DIAGNOSTIC_IGNORED_FUNCTION.
+static void
+c_print_error_function (diagnostic_context *context, const char *file,
+ diagnostic_info *diagnostic)
+{
+ if (c_diagnostic_ignored_function != NULL
+ && current_function_decl != NULL_TREE
+ && DECL_NAME (current_function_decl) != NULL_TREE
+ && strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
+ c_diagnostic_ignored_function) == 0)
+ return;
+ lhd_print_error_function (context, file, diagnostic);
+}
+
/* Lang hooks common to C and ObjC are declared in c-objc-common.h;
consequently, there should be very few hooks below. */
@@ -44,6 +64,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_PRINT_ERROR_FUNCTION
+#define LANG_HOOKS_PRINT_ERROR_FUNCTION c_print_error_function
/* Each front end provides its own lang hook initializer. */
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/gcc/c/c-lang.h b/gcc/c/c-lang.h
index 7fcf333..022206f 100644
--- a/gcc/c/c-lang.h
+++ b/gcc/c/c-lang.h
@@ -59,4 +59,8 @@ struct GTY(()) language_function {
attribute lists. */
extern GTY(()) int current_omp_declare_target_attribute;
+/* If non-zero, the name of a function whose name should not be
+ reported in a diagnostic. */
+extern const char *c_diagnostic_ignored_function;
+
#endif /* ! GCC_C_LANG_H */
--
1.9.0