From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on2070.outbound.protection.outlook.com [40.107.14.70]) by sourceware.org (Postfix) with ESMTPS id 8BEB93858D1E for ; Tue, 29 Nov 2022 10:44:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8BEB93858D1E Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EEoaa1CBdJf2Z1YEF2e2wkVJxW6JMezAGl8nCsD+nSTfGG7b7YY7Fm1Eb2dVptnlA7hL4DbjCwKDla5YWhTiHwn1eBso2yveysw3SK2TjaH9G8YiqSQ8RUy7LzmdCUThPfrsx35T+M7cveGXKjU1yOphx+FUoWi+OCt/puZuLyv8nyU4zVqMdR14H+G1oIQVXsDbVj3qoKfwd0wYVv0+qVWXwFBVQOhCUtCSm0vIKTwiBG8cG4suFFEhzptmBus6rmDSy/b/TogXWloIzMikpqGulXo02cV9G/JVCJrvMr/1dMwD5ez/ZAdUeJmRF/ibbVsu0ZhI6/vP2sHcXAmm6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=DwiadoooEHz2ShOze6QfLeymIjhxvk6DcSm8dlR6w5M=; b=Xl5fAyXRv//j0qIJxx4x3QGzyW6T9zxcUYPo/woQvYJ4RRaDvcyU1rvLcmatf3AkeaqcLDfdutDOMTPnpLcN/4MvRyrdbb+J1zJ/+cm+zkwMqWVvZ6BYQMZtbnP0WI4XoopQIwkr/GV5axTmBJ/4VIiSNUC9kP3tyWPcLh6pHUdnX9uBS02QTFAVK6X47t3Z+4m1Eh6w5ymj8kKR27vCdvGhgMtxAnwniUKKahwTPcp4yiqg/bQiJgAQR7F005aKEPFzLKKUy++WXCn68yO0eA4yeeq+rEfO2t4OK3jl1UBk0xhRSXL87zx9h/+kCWmSkRRHNeUsvIlwerRsRbmehg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=DwiadoooEHz2ShOze6QfLeymIjhxvk6DcSm8dlR6w5M=; b=rU+KGnkTHs6C4b9UHOn5YMEQSG5tD50YJ1BlbXM4IiaSofZZjc7/pvP8TIFm2FpkQUhxHdxhaV2lB4zavVTJzl/ezLW8JCJVqOCfUdnU0m7lgjmwWzdRFoiOsvCDjGHL5xeatbLT6OvwuY9sBwyuGqvKbNudN+MgNUCpnffkj0fVoOwsuK2vgQ1ottTXaUZU5nqlR5gPr6TVKLl49k/DoTQbQIoVECSVye/kcMgRUKWE5lYV4VDPek3/brLI5QnuH1P/7alpYOvWJ1RV/Fu2Ffh5jIQSYoYdFn2s3i2w37ZSZnM7EdxDDtTV9CObrTFCQA200jQQ7CI2jh2RZlz+PA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by PAXPR04MB8831.eurprd04.prod.outlook.com (2603:10a6:102:20e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5857.19; Tue, 29 Nov 2022 10:44:53 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::4da2:ea8b:e71e:b8d8]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::4da2:ea8b:e71e:b8d8%4]) with mapi id 15.20.5857.023; Tue, 29 Nov 2022 10:44:53 +0000 Content-Type: multipart/mixed; boundary="------------7DZh9KcHvb28vsuRTcPwqvXL" Message-ID: <1c75f3b4-14ac-fa39-fac8-2c98b4c4dbab@suse.com> Date: Tue, 29 Nov 2022 11:44:51 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Subject: [PATCH 5/5] gas: re-work line number tracking for macros and their expansions Content-Language: en-US To: Binutils References: <9afdf9c8-323b-78c1-d75b-8964e00cdec5@suse.com> Cc: Nick Clifton , "ramana.radhakrishnan@arm.com" , Richard Earnshaw , Palmer Dabbelt , Andrew Waterman , Jim Wilson , Nelson Chu , Marcus Shawcroft , Alan Modra , Peter Bergner , Geoff Keating From: Jan Beulich In-Reply-To: <9afdf9c8-323b-78c1-d75b-8964e00cdec5@suse.com> X-ClientProxiedBy: FR2P281CA0087.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:9b::6) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|PAXPR04MB8831:EE_ X-MS-Office365-Filtering-Correlation-Id: 97607427-56bc-49fc-8e68-08dad1f6bfa0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: KrtDfN6mzETO6NmLm/eSwGjGH9LRXHvWPnb514IaSQR7I/XqTZBx5MrjEwLTrHPeb257H99Ci5bv62vHosmJfHbWKVU8z5gbU5e6kVESP2vFQzbmKB0tPW11HSYIIqSaOP33n6ooDJbw0b8eob5WTNiqgpj3+w7zichHXued1uLa3H0gwmrZn3RU0wiIJWss2c5iFsIVO2qnR3IDSZ0CMOOYf48foUXK2KzT1/4WBjukFcUJwbZbKiX1jHj1MwMCOdgFOQWNhLSQnAxP8W1qpIjc7Q/wW2dIhe+/y+SKMFvBWax15lxdf2b3qoolxncO/OTYhKqi9nNLndurBRHQgA3g832XISLorFKVuFKolurEmP5cycF5SRFxr4Td0u1X9vpvBylS8aQeoYh3x3yH3MbaYBkDFF9NTmvBti2S6hsktlWb0va9L/uIzZV6UK4yKWQxctj70BXgQrphAN4wUdDBHXaVfvUriUZQq57HwISbnZkrQC5U4AeR4v7bkSRsKCQ9LU9hpU+50k9HYC5sotKy/AVyzJOKYiBySjVlU5FNyHPZkIsN2aJLWHM07rBhDiTsdz2CFr60IEzo4r74e241XA5cZheC35cK4SeJttsX3lsUAUJXJYct+XIN2gwLBMUWjFgHvGJtRv85PykW5tVX46BZH/6bdYc99fBwpVd7JL/oU1sOZM+JWQ/vvzeOlIIFI3peDqgtTGidw+pyIHRCY9sjE40aE4gEqiSGzLk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VE1PR04MB6560.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(136003)(366004)(396003)(346002)(39860400002)(376002)(451199015)(2616005)(31686004)(2906002)(83380400001)(6512007)(33964004)(6506007)(38100700002)(8676002)(41300700001)(478600001)(66946007)(66476007)(66556008)(6486002)(36756003)(26005)(186003)(5660300002)(8936002)(235185007)(31696002)(4326008)(86362001)(30864003)(6916009)(54906003)(7416002)(316002)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WWRBZVBNNk1NUWNPVFIwaDU5eW1ENUo1VGxvNnUvMi9hMVlqWTlIOXhkT0Fk?= =?utf-8?B?VUUrVDRPTEtUbXBkN05uR3ErYitPZVVWMUwyNHc1T3BFZGEwbmp5SHRkT3Ja?= =?utf-8?B?ckplTjA1NFdSUnhCaEdGSVlVSUpremRXaFluaGRZNUVBZmozbjhXaEJZNURG?= =?utf-8?B?bkszZys0WkZIeEZNN25PbzV6REtsQWRzMCtDaDdZdXlyMUhHN29maXJJekNY?= =?utf-8?B?L2h0c2p2eE1xdlg0Z3JCR3ZHU2ZnaktLVHk0RThHUjFMWkc4MWhySVRZVnN4?= =?utf-8?B?Y0JmMnlmUmZRQ3g2UjhDeWRzaEppSGZXN2l4NU9ocUs3V3Myd3hQSVkwTzZv?= =?utf-8?B?K25nMVBMT2VaT0FackNpdkw3VU1DbWY3SkZNMEp2NmxYaFRrZ215UysxNnZR?= =?utf-8?B?N1Jkb1RaSFFFNnlpNGhiUFVGdFFBOUE1UzFUaWE2b0pRMlVpZVg0NC9GZXFY?= =?utf-8?B?WGpzL0tCSUNMR3BURkxRMk14RzdXbGhZTkJDWEhIcy9OK0NqWENpYk9xL3FL?= =?utf-8?B?NS83RXdnYnRzNFdLMzlaUXFUaTBnTWhDNldmTDNHUkgzUHd6eUI5emN6MEQ1?= =?utf-8?B?cUZibEZDdjVncmUrMFdpa1FWOUtrSWd5R0tvMU9ud203VTRWRm5TYllCM1Jl?= =?utf-8?B?RVRjV3lrWTd6MHdIV0lBcnhjbGpPTHQxTUtvNzd4WE43QXR5OUl5VWJHaVFm?= =?utf-8?B?aWFaM0M5VnV3ZmRTb3BLSVRqZ2RURFpKVUFHQkJXNC9Pa1VsdTFoclFpRW02?= =?utf-8?B?ZzlGNkw3elRMYmhmM1Evby9iSXgzUTdoem8zS1d3VjM5SGJBRlFTdEJDMjZM?= =?utf-8?B?QXFDM0tIWjFlREZFOWwyQzJraUQ0YU50MWxWaWI3Q0RBc0dXQlFLeVpKWVpq?= =?utf-8?B?aTFuemFocWhtbW5Ya0lUMW5pbGN2SDc1S3FCc0lwNkh4Q2pSKzB2OWNFQVdS?= =?utf-8?B?bDNrYkY5bk1meTlDcDExbG5xaFlpdnNyUUcyNmhmOVRmYmRHcnhBRytTdElF?= =?utf-8?B?TWQ0RWRwalY0T1NXQllxT3p6YzMvMFI0T1hOYVVpcXRpQXRGVVFIL25ldzF6?= =?utf-8?B?dGR1NHUySWdVTVdyWWxEUmUySnZoWlFoVEliY0dZRTIwNjBHdTZhV2ZPeEsz?= =?utf-8?B?ZTFUVk5kZ3RJc3hiNzY1aGlwbnNKRTRoeGdnNk51U1h3SWdYOG5qeGVxZlFG?= =?utf-8?B?NWoxd1g0bHYzSFI1MFpyb2IzNXBTVXUvWXpSM1pEQ1BSUHhZa1JLdE9mREZH?= =?utf-8?B?eXFUZjd6TUJNcFgwemtFeGREb2ZuM1FNWlJjN3JaekVqRzJVc1dPQ0dtSUJp?= =?utf-8?B?Y0ZVMkVPK0t0MGlNNkdYYUxsR2JkODdqOVVFUlRCVGIvZ0RaMFBGbitNRWZl?= =?utf-8?B?RVE4d1lweWhjbGxYdlN6RVhTdDVRamFKRFZueGcwdnkwbU4wRVl4L2hOYXZ5?= =?utf-8?B?amVReC9BS092NUpHY1pTQjFGc2k1T1g2V01aMzRhZ2Q5MTkxdGZnTmxnc3BQ?= =?utf-8?B?aUpIUXNvb3JxeUIzb2VoWTFRZUoyWnRmSFpxbGlGY09HcTdINFZYTWxVWEJB?= =?utf-8?B?ZmVIa3FyZVlLY0JJUEFVbG95NkszTndzanlhMEZHRUVwdXJmalcxN0xicVBv?= =?utf-8?B?Uy9FU1FDNkxCVkd1YjJSMndOK2cyeDVVWTZnd0lqTVRXWU9rVzlLR3MzbTJF?= =?utf-8?B?bU0zVDlOUjE4c1NyNWtLMWJNZUpHSVZsWlVhV3RWZUpSdEovcStLaUJRMkFz?= =?utf-8?B?cXJHc2RQVzRLYWhuZ09TSUZsbTJoNnM2MXZtWGlxcS8za0gxTFFzRG83QlVU?= =?utf-8?B?NjVTWndTU1dsWFZ2MkFpeEhGMm02MTJxSU9NS0VEMHRXQjlyV3ZZSmNXeTVG?= =?utf-8?B?M0RVK1dLdEx6M3BER1FSaHNSRUsxbVhZZEowemp2SUl2YWVaWVBWV3IxQ0hT?= =?utf-8?B?OVY4ZUxESDJKUXJndzNHOUZuTFFTL2lSelhZSkgxY0tWcVFUZlp5T08yTXg5?= =?utf-8?B?MFNvbHVkb2ZWdHdsZTY0TXJYS0pvbW9aQm4xRFM1M0MySXpDbGJBK0Vkd3Fv?= =?utf-8?B?US95dlNGUXo3NjdTZ1NGNkpDOWtXT1IzNWd6cUF0YkVkSXhlMG5ZRm9nbjFp?= =?utf-8?Q?WCO1ajF2HVamieYl4m3QX6FhC?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 97607427-56bc-49fc-8e68-08dad1f6bfa0 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Nov 2022 10:44:53.6289 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UyDjAUMJz+aglNV18ciZr0ZmVgQKgaCWEydtKteUPzvGXyDEikjdmD4JJ6VX3sBNxx6LT9vo8278t8+iqy/Wsg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8831 X-Spam-Status: No, score=-3029.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------7DZh9KcHvb28vsuRTcPwqvXL Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit The PR gas/16908 workaround aimed at uniformly reporting line numbers to reference macro invocation sites. As mentioned in a comment this may be desirable for small macros, but often isn't for larger ones. As a first step improve diagnostics to report both locations, while aiming at leaving generated debug info unaltered. Note that macro invocation context is lost for any diagnostics issued only after all input was processed (or more generally for any use of as_*_where(), as the functions can't know whether the passed in location is related to [part of] the present stack of locations). To maintain the intended workaround behavior for PR gas/16908, a new as_where() is introduced to "look through" macro invocations, while the existing as_where() is renamed (and used in only very few places for now). Down the road as_where() will likely want to return a list of (file,line) pairs. --- Omitting testsuite adjustments from the inline patch, for its sheer size; please see the attachment for the full (compressed) patch. --- There are 86 more Arm "[Bb]ad MVE ..." testsuite failures, which I'm not (yet) taking care of here. If the concept is not objected to, I'd go and alter them all in the same mechanical way as done here for other testcase adjustments. (In cases of macros which are used exactly once in a testcase, of which there are a fair number, dropping the use of .macro may also be an option, just like already done in "Arm: avoid unhelpful use of .macro in testsuite" for another testcase.) --- Adding if (subseg_text_p (now_seg)) dwarf2_emit_insn (0); to try_macro() (alongside using as_where_top() in dwarf2_where()) would get .debug_line contents into reasonable shape (expressing both macro invocation site and macro definition location). But that's likely insufficient: We may want / need to represent macros as inline subprograms and their expansions as inlined subroutines. Which in turn looks cumbersome especially with the relatively recently added recording of functions (with which macro expansions then would better be associated, when marked as such). --- a/gas/as.h +++ b/gas/as.h @@ -436,6 +436,10 @@ typedef struct _pseudo_type pseudo_typeS #define PRINTF_WHERE_LIKE(FCN) \ void FCN (const char *file, unsigned int line, const char *format, ...) \ __attribute__ ((__format__ (__printf__, 3, 4))) +#define PRINTF_INDENT_LIKE(FCN) \ + void FCN (const char *file, unsigned int line, unsigned int indent, \ + const char *format, ...) \ + __attribute__ ((__format__ (__printf__, 4, 5))) #else /* __GNUC__ < 2 || defined(VMS) */ @@ -443,6 +447,10 @@ typedef struct _pseudo_type pseudo_typeS #define PRINTF_WHERE_LIKE(FCN) void FCN (const char *file, \ unsigned int line, \ const char *format, ...) +#define PRINTF_INDENT_LIKE(FCN) void FCN (const char *file, \ + unsigned int line, \ + unsigned int indent, \ + const char *format, ...) #endif /* __GNUC__ < 2 || defined(VMS) */ @@ -452,6 +460,7 @@ PRINTF_LIKE (as_tsktsk); PRINTF_LIKE (as_warn); PRINTF_WHERE_LIKE (as_bad_where); PRINTF_WHERE_LIKE (as_warn_where); +PRINTF_INDENT_LIKE (as_info_where); void as_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; void signal_init (void); @@ -486,7 +495,9 @@ void cond_finish_check (int); void cond_exit_macro (int); int seen_at_least_1_file (void); void app_pop (char *); +void as_report_context (void); const char * as_where (unsigned int *); +const char * as_where_top (unsigned int *); const char * as_where_physical (unsigned int *); void bump_line_counters (void); void do_scrub_begin (int); --- a/gas/input-scrub.c +++ b/gas/input-scrub.c @@ -104,6 +104,9 @@ static const char *logical_input_file; static unsigned int physical_input_line; static unsigned int logical_input_line; +/* Indicator whether the origin of an update was a .linefile directive. */ +static bool is_linefile; + /* Struct used to save the state of the input handler during include files */ struct input_save { char * buffer_start; @@ -115,6 +118,7 @@ struct input_save { const char * logical_input_file; unsigned int physical_input_line; unsigned int logical_input_line; + bool is_linefile; size_t sb_index; sb from_sb; enum expansion from_sb_expansion; /* Should we do a conditional check? */ @@ -166,6 +170,7 @@ input_scrub_push (char *saved_position) saved->logical_input_file = logical_input_file; saved->physical_input_line = physical_input_line; saved->logical_input_line = logical_input_line; + saved->is_linefile = is_linefile; saved->sb_index = sb_index; saved->from_sb = from_sb; saved->from_sb_expansion = from_sb_expansion; @@ -193,6 +198,7 @@ input_scrub_pop (struct input_save *save logical_input_file = saved->logical_input_file; physical_input_line = saved->physical_input_line; logical_input_line = saved->logical_input_line; + is_linefile = saved->is_linefile; sb_index = saved->sb_index; from_sb = saved->from_sb; from_sb_expansion = saved->from_sb_expansion; @@ -267,8 +273,6 @@ input_scrub_include_sb (sb *from, char * as_fatal (_("macros nested too deeply")); ++macro_nest; - gas_assert (expansion < expanding_nested); - #ifdef md_macro_start if (expansion == expanding_macro) { @@ -283,8 +287,6 @@ input_scrub_include_sb (sb *from, char * expansion. */ newline = from->len >= 1 && from->ptr[0] != '\n'; sb_build (&from_sb, from->len + newline + 2 * sizeof (".linefile") + 30); - if (expansion == expanding_repeat && from_sb_expansion >= expanding_macro) - expansion = expanding_nested; from_sb_expansion = expansion; if (newline) { @@ -437,10 +439,7 @@ bump_line_counters (void) if (sb_index == (size_t) -1) ++physical_input_line; - /* PR gas/16908 workaround: Don't bump logical line numbers while - expanding macros, unless file (and maybe line; see as_where()) are - used inside the macro. */ - if (logical_input_line != -1u && from_sb_expansion < expanding_macro) + if (logical_input_line != -1u) ++logical_input_line; } @@ -471,10 +470,6 @@ new_logical_line_flags (const char *fnam case 1 << 3: if (line_number < 0 || fname != NULL) abort (); - /* PR gas/16908 workaround: Ignore updates when nested inside a macro - expansion. */ - if (from_sb_expansion == expanding_nested) - return; if (next_saved_file == NULL) fname = physical_input_file; else if (next_saved_file->logical_input_file) @@ -486,6 +481,8 @@ new_logical_line_flags (const char *fnam abort (); } + is_linefile = flags != 1 && (flags != 0 || fname); + if (line_number >= 0) logical_input_line = line_number; else if (line_number == -1 && fname && !*fname && (flags & (1 << 2))) @@ -499,15 +496,6 @@ new_logical_line_flags (const char *fnam && (logical_input_file == NULL || filename_cmp (logical_input_file, fname))) logical_input_file = fname; - - /* When encountering file or line changes inside a macro, arrange for - bump_line_counters() to henceforth increment the logical line number - again, just like it does when expanding repeats. See as_where() for - why changing file or line alone doesn't alter expansion mode. */ - if (from_sb_expansion == expanding_macro - && logical_input_file != NULL - && logical_input_line != -1u) - from_sb_expansion = expanding_repeat; } void @@ -516,6 +504,33 @@ new_logical_line (const char *fname, int new_logical_line_flags (fname, line_number, 0); } +void +as_report_context (void) +{ + const struct input_save *saved = next_saved_file; + enum expansion expansion = from_sb_expansion; + int indent = 1; + + if (!macro_nest) + return; + + do + { + if (expansion != expanding_macro) + /* Nothing. */; + else if (saved->logical_input_file != NULL + && saved->logical_input_line != -1u) + as_info_where (saved->logical_input_file, saved->logical_input_line, + indent, _("macro invoked from here")); + else + as_info_where (saved->physical_input_file, saved->physical_input_line, + indent, _("macro invoked from here")); + + expansion = saved->from_sb_expansion; + ++indent; + } + while ((saved = saved->next_saved_file) != NULL); +} /* Return the current physical input file name and line number, if known */ @@ -534,11 +549,53 @@ as_where_physical (unsigned int *linep) return NULL; } -/* Return the current file name and line number. */ +/* Return the file name and line number at the top most macro + invocation, unless .file / .line were used inside a macro. */ const char * as_where (unsigned int *linep) { + const char *file = as_where_top (linep); + + if (macro_nest && is_linefile) + { + const struct input_save *saved = next_saved_file; + enum expansion expansion = from_sb_expansion; + + do + { + if (!saved->is_linefile) + break; + + if (expansion != expanding_macro) + /* Nothing. */; + else if (saved->logical_input_file != NULL + && (linep == NULL || saved->logical_input_line != -1u)) + { + if (linep != NULL) + *linep = saved->logical_input_line; + file = saved->logical_input_file; + } + else if (saved->physical_input_file != NULL) + { + if (linep != NULL) + *linep = saved->physical_input_line; + file = saved->physical_input_file; + } + + expansion = saved->from_sb_expansion; + } + while ((saved = saved->next_saved_file) != NULL); + } + + return file; +} + +/* Return the current file name and line number. */ + +const char * +as_where_top (unsigned int *linep) +{ if (logical_input_file != NULL && (linep == NULL || logical_input_line != -1u)) { @@ -549,4 +606,3 @@ as_where (unsigned int *linep) return as_where_physical (linep); } - --- a/gas/macro.c +++ b/gas/macro.c @@ -131,23 +131,21 @@ buffer_and_nest (const char *from, const else from_len = strlen (from); - /* Except for macros record the present source position, such that - diagnostics and debug info will be properly associated with the - respective original lines, rather than with the line of the ending - directive (TO). */ - if (from == NULL || strcasecmp (from, "MACRO") != 0) - { - unsigned int line; - char *linefile; - - as_where (&line); - if (!flag_m68k_mri) - linefile = xasprintf ("\t.linefile %u .", line + 1); - else - linefile = xasprintf ("\tlinefile %u .", line + 1); - sb_add_string (ptr, linefile); - xfree (linefile); - } + /* Record the present source position, such that diagnostics and debug info + can be properly associated with the respective original lines, rather + than with the line of the ending directive (TO). */ + { + unsigned int line; + char *linefile; + + as_where_top (&line); + if (!flag_m68k_mri) + linefile = xasprintf ("\t.linefile %u .", line + 1); + else + linefile = xasprintf ("\tlinefile %u .", line + 1); + sb_add_string (ptr, linefile); + xfree (linefile); + } while (more) { @@ -249,14 +247,8 @@ buffer_and_nest (const char *from, const } /* PR gas/16908 - Apply and discard .linefile directives that appear within - the macro. For long macros, one might want to report the - line number information associated with the lines within - the macro definition, but we would need more infrastructure - to make that happen correctly (e.g. resetting the line - number when expanding the macro), and since for short - macros we clearly prefer reporting the point of expansion - anyway, there's not an obviously better fix here. */ + Apply .linefile directives that appear within the macro, alongside + keeping them for later expansion of the macro. */ if (from != NULL && strcasecmp (from, "MACRO") == 0 && len >= 8 && strncasecmp (ptr->ptr + i, "linefile", 8) == 0) { @@ -267,7 +259,6 @@ buffer_and_nest (const char *from, const s_linefile (0); restore_ilp (); ptr->ptr[ptr->len] = saved_eol_char; - ptr->len = line_start; } } --- a/gas/messages.c +++ b/gas/messages.c @@ -18,6 +18,7 @@ 02110-1301, USA. */ #include "as.h" +#include #include /* If the system doesn't provide strsignal, we get it defined in @@ -119,7 +120,7 @@ as_show_where (void) const char *file; unsigned int line; - file = as_where (&line); + file = as_where_top (&line); identify (file); if (file) { @@ -130,6 +131,25 @@ as_show_where (void) } } +/* Send to stderr a string as information, with location data passed in. + Note that for now this is not intended for general use. */ + +void +as_info_where (const char *file, unsigned int line, unsigned int indent, + const char *format, ...) +{ + va_list args; + char buffer[2000]; + + gas_assert (file != NULL && line > 0 && indent <= INT_MAX); + + va_start (args, format); + vsnprintf (buffer, sizeof (buffer), format, args); + va_end (args); + fprintf (stderr, "%s:%u: %*s%s%s\n", + file, line, (int)indent, "", _("Info: "), buffer); +} + /* Send to stderr a string as a warning, and locate warning in input file(s). Please only use this for when we have some recovery action. @@ -146,6 +166,7 @@ as_tsktsk (const char *format, ...) vfprintf (stderr, format, args); va_end (args); (void) putc ('\n', stderr); + as_report_context (); } /* The common portion of as_warn and as_warn_where. */ @@ -153,10 +174,15 @@ as_tsktsk (const char *format, ...) static void as_warn_internal (const char *file, unsigned int line, char *buffer) { + bool context = false; + ++warning_count; if (file == NULL) - file = as_where (&line); + { + file = as_where_top (&line); + context = true; + } identify (file); if (file) @@ -168,6 +194,10 @@ as_warn_internal (const char *file, unsi } else fprintf (stderr, "%s%s\n", _("Warning: "), buffer); + + if (context) + as_report_context (); + #ifndef NO_LISTING listing_warning (buffer); #endif @@ -194,7 +224,7 @@ as_warn (const char *format, ...) } } -/* Like as_bad but the file name and line number are passed in. +/* Like as_warn but the file name and line number are passed in. Unfortunately, we have to repeat the function in order to handle the varargs correctly and portably. */ @@ -218,10 +248,15 @@ as_warn_where (const char *file, unsigne static void as_bad_internal (const char *file, unsigned int line, char *buffer) { + bool context = false; + ++error_count; if (file == NULL) - file = as_where (&line); + { + file = as_where_top (&line); + context = true; + } identify (file); if (file) @@ -233,6 +268,10 @@ as_bad_internal (const char *file, unsig } else fprintf (stderr, "%s%s\n", _("Error: "), buffer); + + if (context) + as_report_context (); + #ifndef NO_LISTING listing_error (buffer); #endif @@ -290,6 +329,7 @@ as_fatal (const char *format, ...) vfprintf (stderr, format, args); (void) putc ('\n', stderr); va_end (args); + as_report_context (); /* Delete the output file, if it exists. This will prevent make from thinking that a file was created and hence does not need rebuilding. */ if (out_file_name != NULL) @@ -312,6 +352,7 @@ as_abort (const char *file, int line, co fprintf (stderr, _("Internal error in %s at %s:%d.\n"), fn, file, line); else fprintf (stderr, _("Internal error at %s:%d.\n"), file, line); + as_report_context (); fprintf (stderr, _("Please report this bug.\n")); --- a/gas/sb.h +++ b/gas/sb.h @@ -66,11 +66,9 @@ extern size_t sb_skip_comma (size_t, sb /* Actually in input-scrub.c. */ enum expansion { - /* Note: Order matters! */ expanding_none, expanding_repeat, expanding_macro, - expanding_nested, /* Only for internal use of input-scrub.c. */ }; extern void input_scrub_include_sb (sb *, char *, enum expansion); --------------7DZh9KcHvb28vsuRTcPwqvXL Content-Type: application/octet-stream; name="binutils-master-macro-location.patch.bz2" Content-Disposition: attachment; filename="binutils-master-macro-location.patch.bz2" Content-Transfer-Encoding: base64 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 D0ej0aaWeK+gu1dq+avmqq+avmr5q7V2rPFC/Wk8k12t3MzDMw+iHg93xnXwf0rV/oWr9a0VLqxO rE6sS1uouridRN1E6idRFSuthurE3ViKl1Ym6sTqkibqJ1E6ibqJ1E6iKl1SROqSJ1SRFSurE3Vi dUkTdROonUTdROonURUurE6sTqxFXVckTqkidUkTquq6rBgwYMGDDDDBgwYMGDBgxHH2v5TOcPZ+ KJr4WE/8j4eN+bY/37Xz+mm01Mv6rwc96VVUss+uIHzXKZT3GUp8jSxoUfxPCm19C+nZi5MNfsyo Wf521P87WY7w9/y97P7GRc+X1ab/L+Rr7XOPr5uOXG1u13dCaoigVmScqWxcxcS2XL4+T2+vu7rS 0H2c/qtVbeCTld9v50mS2RPzMPkdJ+EtJRzNj+05H9pwaORsbGxsbGx9h0Nx4m5ubm5ubm5wbn3D odk57c80KXiWijY/rNzec5aSjcbhoKFJhgZJOktGimGgoak6tk7WxtXTaPW/Jw9y+bdsKuaZWMYx jGLlS1bVYxjGMKpVYpisYxjGMYwqxbFVKpZclVyUlJSWSkpKSkpKSkpKSyUlJSUlJSUlJSWSkpKS kpKSkpKSyUlJSUlJSUlJSWSkpKS2EpKSkpKSoyUlJSUlkuSTiuXLlyW45tia1VxaLTgClllckuVc v6MUqFKX2V/6+7myG5ZDcshuWQ3LIblkNy22WtB5YbbdkH6YRfJ51hJK4hmjmWLCTlicjo1OptLk zltsFGxwpnGZcrM25PIdJxHfPs0rT0XS4rDzHI2DiwbKNRsmkyTWLJg5DYZJOTklnXjsczd0Abg4 7niMRN5bJM2aZMY0K02YxjUnITlu1NCaxq2xlZbUnHLB0ska1hGZkkZmSJljSyRljFkZZbI33YMx kZjJMxgzGzU1ppqa303uwtRINattXB31bQW0zTNNqk78dyd3ZekSreTMfyZPbMfUG5jhuYY3MMbm GNzDG4Vna0K1kF6RuVqQSMjEpDayegurKInbUkpbNk4MpYYhbEnLs3zGZnnrWoIIlnkggggggjqS Tvird8DvgXA5wOupq50B68AuAc4B13NJq678uc5y5cuu5tXbNZmMY0jTbWZjGNRbLuJxqccNhL6k CZN5mQJknFwOOc2As0Ids2AswW6zMgzJlvum7uTMt2bu5JLRJVTLNtJPydFJKqToqKpOioVUnaub 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 ckU4UJCp8sAK --------------7DZh9KcHvb28vsuRTcPwqvXL--