From patchwork Tue Jun 18 15:08:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 1949233 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=ZXx3rfoZ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4W3VYX4DySz20Wb for ; Wed, 19 Jun 2024 01:10:24 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D957A388300D for ; Tue, 18 Jun 2024 15:10:22 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 7B91E3882AEE for ; Tue, 18 Jun 2024 15:08:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7B91E3882AEE Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7B91E3882AEE Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1718723320; cv=none; b=Dh6xhDNtt251ddrZ9Zw4AlE437jqCnhRqnwrWNeE53yO2wyQblaiehgmEmExm9DQWGBCdRWj36aaM53wl9R69LXY48jDRXL9EYSwrGvKQGZ7pq8o95Co6UvNBiP6fgcsab4BZhJvw7xog0TjjCM9ecBKTJjsGlfaLC+bonpFka0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1718723320; c=relaxed/simple; bh=rifJIHNA/Dhou2/IK8knUg+aZDBHYat7YzKOCo8Z4XE=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=EApQxsM+Q7lMFNvshFCcFcXefOZZkYEAjnuH4dBMsU42ud9V5HDGjs4HtOC/1IaVGxFWCUK6XYuNRcVtRlvnsGfAOTfyojPkY9NNJ1NzaK1UrBXeBp1dfVuVo+VkvjUYemFIE4a6vHuvvvC4UHV3UnYlCmGKsE0XuCOFsyNo3Wk= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1718723312; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vKBD09slWGjr3AluFVnXszlUKH+yDVaZIeeIAgGjkJQ=; b=ZXx3rfoZZJCf6X8vRe+0g0AMaBwiZ6Tt8aB0L9FQ8a8XTh5qbjpKrj5yYYS0EIapFS0YnN DDo2yOhW4M9pmQyufA48FxYzW4JCZIoXmvhQpLxm6IfL6NCTWMxQEBOB8uixI+yz/BJJaf OCyWP7v+tJVqFx0Xt6yNtRFMIh3wDkY= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-605-pJ5pmENEPkWJn2pcZqp1VA-1; Tue, 18 Jun 2024 11:08:30 -0400 X-MC-Unique: pJ5pmENEPkWJn2pcZqp1VA-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9F59219560B1 for ; Tue, 18 Jun 2024 15:08:28 +0000 (UTC) Received: from t14s.localdomain.com (unknown [10.22.10.107]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D553B1956048; Tue, 18 Jun 2024 15:08:27 +0000 (UTC) From: David Malcolm To: gcc-patches@gcc.gnu.org Cc: David Malcolm Subject: [PATCH 5/7] diagnostics: introduce diagnostic-macro-unwinding.h/cc Date: Tue, 18 Jun 2024 11:08:17 -0400 Message-Id: <20240618150819.946820-6-dmalcolm@redhat.com> In-Reply-To: <20240618150819.946820-1-dmalcolm@redhat.com> References: <20240618150819.946820-1-dmalcolm@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, RCVD_IN_SBL_CSS, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Eliminate a dependency on "tree" from the code used by diagnostic_path handling. No functional change intended. gcc/ChangeLog: * Makefile.in (OBJS): Add diagnostic-macro-unwinding.o. gcc/c-family/ChangeLog: * c-opts.cc: Replace include of "tree-diagnostic.h" with "diagnostic-macro-unwinding.h". gcc/ChangeLog: * diagnostic-macro-unwinding.cc: New file, with material taken from tree-diagnostic.cc. * diagnostic-macro-unwinding.h: New file, with material taken from tree-diagnostic.h. * tree-diagnostic-path.cc: Repalce include of "tree-diagnostic.h" with "diagnostic-macro-unwinding.h". * tree-diagnostic.cc (struct loc_map_pair): Move to diagnostic-macro-unwinding.cc. (maybe_unwind_expanded_macro_loc): Likewise. (virt_loc_aware_diagnostic_finalizer): Likewise. * tree-diagnostic.h (virt_loc_aware_diagnostic_finalizer): Move decl to diagnostic-macro-unwinding.h. (maybe_unwind_expanded_macro_loc): Likewise. Signed-off-by: David Malcolm --- gcc/Makefile.in | 1 + gcc/c-family/c-opts.cc | 2 +- gcc/diagnostic-macro-unwinding.cc | 221 ++++++++++++++++++++++++++++++ gcc/diagnostic-macro-unwinding.h | 29 ++++ gcc/tree-diagnostic-path.cc | 2 +- gcc/tree-diagnostic.cc | 195 -------------------------- gcc/tree-diagnostic.h | 5 - 7 files changed, 253 insertions(+), 202 deletions(-) create mode 100644 gcc/diagnostic-macro-unwinding.cc create mode 100644 gcc/diagnostic-macro-unwinding.h diff --git a/gcc/Makefile.in b/gcc/Makefile.in index a2799b8d826..e701d9fb082 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1826,6 +1826,7 @@ OBJS = \ OBJS-libcommon = diagnostic-spec.o diagnostic.o diagnostic-color.o \ diagnostic-format-json.o \ diagnostic-format-sarif.o \ + diagnostic-macro-unwinding.o \ diagnostic-show-locus.o \ edit-context.o \ pretty-print.o intl.o \ diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index faaf9ee6350..33114f13c8d 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -32,7 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "flags.h" #include "toplev.h" #include "langhooks.h" -#include "tree-diagnostic.h" /* for virt_loc_aware_diagnostic_finalizer */ +#include "diagnostic-macro-unwinding.h" /* for virt_loc_aware_diagnostic_finalizer */ #include "intl.h" #include "cppdefault.h" #include "incpath.h" diff --git a/gcc/diagnostic-macro-unwinding.cc b/gcc/diagnostic-macro-unwinding.cc new file mode 100644 index 00000000000..3056d8c8afb --- /dev/null +++ b/gcc/diagnostic-macro-unwinding.cc @@ -0,0 +1,221 @@ +/* Code for unwinding macro expansions in diagnostics. + Copyright (C) 1999-2024 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "diagnostic.h" +#include "diagnostic-macro-unwinding.h" +#include "intl.h" + +/* This is a pair made of a location and the line map it originated + from. It's used in the maybe_unwind_expanded_macro_loc function + below. */ +struct loc_map_pair +{ + const line_map_macro *map; + location_t where; +}; + + +/* Unwind the different macro expansions that lead to the token which + location is WHERE and emit diagnostics showing the resulting + unwound macro expansion trace. Let's look at an example to see how + the trace looks like. Suppose we have this piece of code, + artificially annotated with the line numbers to increase + legibility: + + $ cat -n test.c + 1 #define OPERATE(OPRD1, OPRT, OPRD2) \ + 2 OPRD1 OPRT OPRD2; + 3 + 4 #define SHIFTL(A,B) \ + 5 OPERATE (A,<<,B) + 6 + 7 #define MULT(A) \ + 8 SHIFTL (A,1) + 9 + 10 void + 11 g () + 12 { + 13 MULT (1.0);// 1.0 << 1; <-- so this is an error. + 14 } + + Here is the diagnostic that we want the compiler to generate: + + test.c: In function ‘g’: + test.c:5:14: error: invalid operands to binary << (have ‘double’ and ‘int’) + test.c:2:9: note: in definition of macro 'OPERATE' + test.c:8:3: note: in expansion of macro 'SHIFTL' + test.c:13:3: note: in expansion of macro 'MULT' + + The part that goes from the third to the fifth line of this + diagnostic (the lines containing the 'note:' string) is called the + unwound macro expansion trace. That's the part generated by this + function. */ + +void +maybe_unwind_expanded_macro_loc (diagnostic_context *context, + location_t where) +{ + const struct line_map *map; + auto_vec loc_vec; + unsigned ix; + loc_map_pair loc, *iter; + + const location_t original_loc = where; + + map = linemap_lookup (line_table, where); + if (!linemap_macro_expansion_map_p (map)) + return; + + /* Let's unwind the macros that got expanded and led to the token + which location is WHERE. We are going to store these macros into + LOC_VEC, so that we can later walk it at our convenience to + display a somewhat meaningful trace of the macro expansion + history to the user. Note that the first macro of the trace + (which is OPERATE in the example above) is going to be stored at + the beginning of LOC_VEC. */ + + do + { + loc.where = where; + loc.map = linemap_check_macro (map); + + loc_vec.safe_push (loc); + + /* WHERE is the location of a token inside the expansion of a + macro. MAP is the map holding the locations of that macro + expansion. Let's get the location of the token inside the + context that triggered the expansion of this macro. + This is basically how we go "down" in the trace of macro + expansions that led to WHERE. */ + where = linemap_unwind_toward_expansion (line_table, where, &map); + } while (linemap_macro_expansion_map_p (map)); + + /* Now map is set to the map of the location in the source that + first triggered the macro expansion. This must be an ordinary map. */ + const line_map_ordinary *ord_map = linemap_check_ordinary (map); + + /* Walk LOC_VEC and print the macro expansion trace, unless the + first macro which expansion triggered this trace was expanded + inside a system header. */ + int saved_location_line = + expand_location_to_spelling_point (original_loc).line; + + if (!LINEMAP_SYSP (ord_map)) + FOR_EACH_VEC_ELT (loc_vec, ix, iter) + { + /* Sometimes, in the unwound macro expansion trace, we want to + print a part of the context that shows where, in the + definition of the relevant macro, is the token (we are + looking at) used. That is the case in the introductory + comment of this function, where we print: + + test.c:2:9: note: in definition of macro 'OPERATE'. + + We print that "macro definition context" because the + diagnostic line (emitted by the call to + pp_ouput_formatted_text in diagnostic_report_diagnostic): + + test.c:5:14: error: invalid operands to binary << (have ‘double’ and ‘int’) + + does not point into the definition of the macro where the + token '<<' (that is an argument to the function-like macro + OPERATE) is used. So we must "display" the line of that + macro definition context to the user somehow. + + A contrario, when the first interesting diagnostic line + points into the definition of the macro, we don't need to + display any line for that macro definition in the trace + anymore, otherwise it'd be redundant. */ + + /* Okay, now here is what we want. For each token resulting + from macro expansion we want to show: 1/ where in the + definition of the macro the token comes from; 2/ where the + macro got expanded. */ + + /* Resolve the location iter->where into the locus 1/ of the + comment above. */ + location_t resolved_def_loc = + linemap_resolve_location (line_table, iter->where, + LRK_MACRO_DEFINITION_LOCATION, NULL); + + /* Don't print trace for locations that are reserved or from + within a system header. */ + const line_map_ordinary *m = NULL; + location_t l = + linemap_resolve_location (line_table, resolved_def_loc, + LRK_SPELLING_LOCATION, &m); + location_t l0 = l; + if (IS_ADHOC_LOC (l0)) + l0 = get_location_from_adhoc_loc (line_table, l0); + if (l0 < RESERVED_LOCATION_COUNT || LINEMAP_SYSP (m)) + continue; + + /* We need to print the context of the macro definition only + when the locus of the first displayed diagnostic (displayed + before this trace) was inside the definition of the + macro. */ + const int resolved_def_loc_line = SOURCE_LINE (m, l0); + if (ix == 0 && saved_location_line != resolved_def_loc_line) + { + diagnostic_append_note (context, resolved_def_loc, + "in definition of macro %qs", + linemap_map_get_macro_name (iter->map)); + /* At this step, as we've printed the context of the macro + definition, we don't want to print the context of its + expansion, otherwise, it'd be redundant. */ + continue; + } + + /* Resolve the location of the expansion point of the macro + which expansion gave the token represented by def_loc. + This is the locus 2/ of the earlier comment. */ + location_t resolved_exp_loc = + linemap_resolve_location (line_table, + iter->map->get_expansion_point_location (), + LRK_MACRO_DEFINITION_LOCATION, NULL); + + diagnostic_append_note (context, resolved_exp_loc, + "in expansion of macro %qs", + linemap_map_get_macro_name (iter->map)); + } +} + +/* This is a diagnostic finalizer implementation that is aware of + virtual locations produced by libcpp. + + It has to be called by the diagnostic finalizer of front ends that + uses libcpp and wish to get diagnostics involving tokens resulting + from macro expansion. + + For a given location, if said location belongs to a token + resulting from a macro expansion, this starter prints the context + of the token. E.g, for multiply nested macro expansion, it + unwinds the nested macro expansions and prints them in a manner + that is similar to what is done for function call stacks, or + template instantiation contexts. */ +void +virt_loc_aware_diagnostic_finalizer (diagnostic_context *context, + const diagnostic_info *diagnostic) +{ + maybe_unwind_expanded_macro_loc (context, diagnostic_location (diagnostic)); +} diff --git a/gcc/diagnostic-macro-unwinding.h b/gcc/diagnostic-macro-unwinding.h new file mode 100644 index 00000000000..74083cd56de --- /dev/null +++ b/gcc/diagnostic-macro-unwinding.h @@ -0,0 +1,29 @@ +/* Code for unwinding macro expansions in diagnostics. + Copyright (C) 2000-2024 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +. */ + +#ifndef GCC_DIAGNOSTIC_MACRO_UNWINDING_H +#define GCC_DIAGNOSTIC_MACRO_UNWINDING_H + +void virt_loc_aware_diagnostic_finalizer (diagnostic_context *, + const diagnostic_info *); + +extern void maybe_unwind_expanded_macro_loc (diagnostic_context *context, + location_t where); + +#endif /* ! GCC_DIAGNOSTIC_MACRO_UNWINDING_H */ diff --git a/gcc/tree-diagnostic-path.cc b/gcc/tree-diagnostic-path.cc index 40b197d971c..adaaf30b84f 100644 --- a/gcc/tree-diagnostic-path.cc +++ b/gcc/tree-diagnostic-path.cc @@ -27,7 +27,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tree.h" #include "diagnostic.h" -#include "tree-diagnostic.h" +#include "diagnostic-macro-unwinding.h" #include "intl.h" #include "diagnostic-path.h" #include "gcc-rich-location.h" diff --git a/gcc/tree-diagnostic.cc b/gcc/tree-diagnostic.cc index f6e2a73497a..f236f3db0b2 100644 --- a/gcc/tree-diagnostic.cc +++ b/gcc/tree-diagnostic.cc @@ -51,201 +51,6 @@ default_tree_diagnostic_starter (diagnostic_context *context, diagnostic)); } -/* This is a pair made of a location and the line map it originated - from. It's used in the maybe_unwind_expanded_macro_loc function - below. */ -struct loc_map_pair -{ - const line_map_macro *map; - location_t where; -}; - - -/* Unwind the different macro expansions that lead to the token which - location is WHERE and emit diagnostics showing the resulting - unwound macro expansion trace. Let's look at an example to see how - the trace looks like. Suppose we have this piece of code, - artificially annotated with the line numbers to increase - legibility: - - $ cat -n test.c - 1 #define OPERATE(OPRD1, OPRT, OPRD2) \ - 2 OPRD1 OPRT OPRD2; - 3 - 4 #define SHIFTL(A,B) \ - 5 OPERATE (A,<<,B) - 6 - 7 #define MULT(A) \ - 8 SHIFTL (A,1) - 9 - 10 void - 11 g () - 12 { - 13 MULT (1.0);// 1.0 << 1; <-- so this is an error. - 14 } - - Here is the diagnostic that we want the compiler to generate: - - test.c: In function ‘g’: - test.c:5:14: error: invalid operands to binary << (have ‘double’ and ‘int’) - test.c:2:9: note: in definition of macro 'OPERATE' - test.c:8:3: note: in expansion of macro 'SHIFTL' - test.c:13:3: note: in expansion of macro 'MULT' - - The part that goes from the third to the fifth line of this - diagnostic (the lines containing the 'note:' string) is called the - unwound macro expansion trace. That's the part generated by this - function. */ - -void -maybe_unwind_expanded_macro_loc (diagnostic_context *context, - location_t where) -{ - const struct line_map *map; - auto_vec loc_vec; - unsigned ix; - loc_map_pair loc, *iter; - - const location_t original_loc = where; - - map = linemap_lookup (line_table, where); - if (!linemap_macro_expansion_map_p (map)) - return; - - /* Let's unwind the macros that got expanded and led to the token - which location is WHERE. We are going to store these macros into - LOC_VEC, so that we can later walk it at our convenience to - display a somewhat meaningful trace of the macro expansion - history to the user. Note that the first macro of the trace - (which is OPERATE in the example above) is going to be stored at - the beginning of LOC_VEC. */ - - do - { - loc.where = where; - loc.map = linemap_check_macro (map); - - loc_vec.safe_push (loc); - - /* WHERE is the location of a token inside the expansion of a - macro. MAP is the map holding the locations of that macro - expansion. Let's get the location of the token inside the - context that triggered the expansion of this macro. - This is basically how we go "down" in the trace of macro - expansions that led to WHERE. */ - where = linemap_unwind_toward_expansion (line_table, where, &map); - } while (linemap_macro_expansion_map_p (map)); - - /* Now map is set to the map of the location in the source that - first triggered the macro expansion. This must be an ordinary map. */ - const line_map_ordinary *ord_map = linemap_check_ordinary (map); - - /* Walk LOC_VEC and print the macro expansion trace, unless the - first macro which expansion triggered this trace was expanded - inside a system header. */ - int saved_location_line = - expand_location_to_spelling_point (original_loc).line; - - if (!LINEMAP_SYSP (ord_map)) - FOR_EACH_VEC_ELT (loc_vec, ix, iter) - { - /* Sometimes, in the unwound macro expansion trace, we want to - print a part of the context that shows where, in the - definition of the relevant macro, is the token (we are - looking at) used. That is the case in the introductory - comment of this function, where we print: - - test.c:2:9: note: in definition of macro 'OPERATE'. - - We print that "macro definition context" because the - diagnostic line (emitted by the call to - pp_ouput_formatted_text in diagnostic_report_diagnostic): - - test.c:5:14: error: invalid operands to binary << (have ‘double’ and ‘int’) - - does not point into the definition of the macro where the - token '<<' (that is an argument to the function-like macro - OPERATE) is used. So we must "display" the line of that - macro definition context to the user somehow. - - A contrario, when the first interesting diagnostic line - points into the definition of the macro, we don't need to - display any line for that macro definition in the trace - anymore, otherwise it'd be redundant. */ - - /* Okay, now here is what we want. For each token resulting - from macro expansion we want to show: 1/ where in the - definition of the macro the token comes from; 2/ where the - macro got expanded. */ - - /* Resolve the location iter->where into the locus 1/ of the - comment above. */ - location_t resolved_def_loc = - linemap_resolve_location (line_table, iter->where, - LRK_MACRO_DEFINITION_LOCATION, NULL); - - /* Don't print trace for locations that are reserved or from - within a system header. */ - const line_map_ordinary *m = NULL; - location_t l = - linemap_resolve_location (line_table, resolved_def_loc, - LRK_SPELLING_LOCATION, &m); - location_t l0 = l; - if (IS_ADHOC_LOC (l0)) - l0 = get_location_from_adhoc_loc (line_table, l0); - if (l0 < RESERVED_LOCATION_COUNT || LINEMAP_SYSP (m)) - continue; - - /* We need to print the context of the macro definition only - when the locus of the first displayed diagnostic (displayed - before this trace) was inside the definition of the - macro. */ - const int resolved_def_loc_line = SOURCE_LINE (m, l0); - if (ix == 0 && saved_location_line != resolved_def_loc_line) - { - diagnostic_append_note (context, resolved_def_loc, - "in definition of macro %qs", - linemap_map_get_macro_name (iter->map)); - /* At this step, as we've printed the context of the macro - definition, we don't want to print the context of its - expansion, otherwise, it'd be redundant. */ - continue; - } - - /* Resolve the location of the expansion point of the macro - which expansion gave the token represented by def_loc. - This is the locus 2/ of the earlier comment. */ - location_t resolved_exp_loc = - linemap_resolve_location (line_table, - iter->map->get_expansion_point_location (), - LRK_MACRO_DEFINITION_LOCATION, NULL); - - diagnostic_append_note (context, resolved_exp_loc, - "in expansion of macro %qs", - linemap_map_get_macro_name (iter->map)); - } -} - -/* This is a diagnostic finalizer implementation that is aware of - virtual locations produced by libcpp. - - It has to be called by the diagnostic finalizer of front ends that - uses libcpp and wish to get diagnostics involving tokens resulting - from macro expansion. - - For a given location, if said location belongs to a token - resulting from a macro expansion, this starter prints the context - of the token. E.g, for multiply nested macro expansion, it - unwinds the nested macro expansions and prints them in a manner - that is similar to what is done for function call stacks, or - template instantiation contexts. */ -void -virt_loc_aware_diagnostic_finalizer (diagnostic_context *context, - const diagnostic_info *diagnostic) -{ - maybe_unwind_expanded_macro_loc (context, diagnostic_location (diagnostic)); -} - /* Default tree printer. Handles declarations only. */ bool default_tree_printer (pretty_printer *pp, text_info *text, const char *spec, diff --git a/gcc/tree-diagnostic.h b/gcc/tree-diagnostic.h index 7959294f489..648d6e6ab91 100644 --- a/gcc/tree-diagnostic.h +++ b/gcc/tree-diagnostic.h @@ -50,8 +50,6 @@ along with GCC; see the file COPYING3. If not see void diagnostic_report_current_function (diagnostic_context *, const diagnostic_info *); -void virt_loc_aware_diagnostic_finalizer (diagnostic_context *, - const diagnostic_info *); void tree_diagnostics_defaults (diagnostic_context *context); bool default_tree_printer (pretty_printer *, text_info *, const char *, @@ -60,7 +58,4 @@ bool default_tree_printer (pretty_printer *, text_info *, const char *, extern void default_tree_diagnostic_path_printer (diagnostic_context *, const diagnostic_path *); -extern void maybe_unwind_expanded_macro_loc (diagnostic_context *context, - location_t where); - #endif /* ! GCC_TREE_DIAGNOSTIC_H */