re PR preprocessor/41445 (Debug information is wrong with and without --save-temps.)

PR preprocessor/41445
	* c-ppoutput.c (do_line_change): New function.
	(cb_line_change): Use it.
	(scan_translation_unit): Call do_line_change if
	avoid_paste or PREV_WHITE and token location is on a different line
	than print.src_line.

	* gcc.dg/cpp/separate-1.c: Adjust.
	* gcc.dg/cpp/spacing1.c: Add -P to dg-options.
	* gcc.dg/debug/dwarf2/pr41445-1.c: New test.
	* gcc.dg/debug/dwarf2/pr41445-2.c: New test.
	* gcc.dg/debug/dwarf2/pr41445-3.c: New test.
	* gcc.dg/debug/dwarf2/pr41445-4.c: New test.
	* gcc.dg/debug/dwarf2/pr41445-5.c: New test.
	* gcc.dg/debug/dwarf2/pr41445-6.c: New test.

From-SVN: r152599
This commit is contained in:
Jakub Jelinek 2009-10-09 21:55:34 +02:00 committed by Jakub Jelinek
parent 9c1e641ac1
commit 21ece9b288
11 changed files with 148 additions and 15 deletions

View File

@ -1,5 +1,12 @@
2009-10-09 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/41445
* c-ppoutput.c (do_line_change): New function.
(cb_line_change): Use it.
(scan_translation_unit): Call do_line_change if
avoid_paste or PREV_WHITE and token location is on a different line
than print.src_line.
PR debug/40521
* dwarf2out.c (dwarf2out_init): Test whether
HAVE_GAS_CFI_SECTIONS_DIRECTIVE is non-zero instead of checking

View File

@ -61,6 +61,8 @@ static void dump_queued_macros (cpp_reader *);
static void print_line (source_location, const char *);
static void maybe_print_line (source_location);
static void do_line_change (cpp_reader *, const cpp_token *,
source_location, int);
/* Callback routines for the parser. Most of these are active only
in specific modes. */
@ -160,11 +162,16 @@ static void
scan_translation_unit (cpp_reader *pfile)
{
bool avoid_paste = false;
bool do_line_adjustments
= cpp_get_options (parse_in)->lang != CLK_ASM
&& !flag_no_line_commands;
bool in_pragma = false;
print.source = NULL;
for (;;)
{
const cpp_token *token = cpp_get_token (pfile);
source_location loc;
const cpp_token *token = cpp_get_token_with_location (pfile, &loc);
if (token->type == CPP_PADDING)
{
@ -182,16 +189,38 @@ scan_translation_unit (cpp_reader *pfile)
/* Subtle logic to output a space if and only if necessary. */
if (avoid_paste)
{
const struct line_map *map
= linemap_lookup (line_table, loc);
int src_line = SOURCE_LINE (map, loc);
if (print.source == NULL)
print.source = token;
if (print.source->flags & PREV_WHITE
|| (print.prev
&& cpp_avoid_paste (pfile, print.prev, token))
|| (print.prev == NULL && token->type == CPP_HASH))
if (src_line != print.src_line
&& do_line_adjustments
&& !in_pragma)
{
do_line_change (pfile, token, loc, false);
putc (' ', print.outf);
}
else if (print.source->flags & PREV_WHITE
|| (print.prev
&& cpp_avoid_paste (pfile, print.prev, token))
|| (print.prev == NULL && token->type == CPP_HASH))
putc (' ', print.outf);
}
else if (token->flags & PREV_WHITE)
putc (' ', print.outf);
{
const struct line_map *map
= linemap_lookup (line_table, loc);
int src_line = SOURCE_LINE (map, loc);
if (src_line != print.src_line
&& do_line_adjustments
&& !in_pragma)
do_line_change (pfile, token, loc, false);
putc (' ', print.outf);
}
avoid_paste = false;
print.source = NULL;
@ -209,9 +238,13 @@ scan_translation_unit (cpp_reader *pfile)
else
fprintf (print.outf, "%s", name);
print.printed = 1;
in_pragma = true;
}
else if (token->type == CPP_PRAGMA_EOL)
maybe_print_line (token->src_loc);
{
maybe_print_line (token->src_loc);
in_pragma = false;
}
else
cpp_output_token (token, print.outf);
@ -331,14 +364,11 @@ print_line (source_location src_loc, const char *special_flags)
}
}
/* Called when a line of output is started. TOKEN is the first token
of the line, and at end of file will be CPP_EOF. */
/* Helper function for cb_line_change and scan_translation_unit. */
static void
cb_line_change (cpp_reader *pfile, const cpp_token *token,
int parsing_args)
do_line_change (cpp_reader *pfile, const cpp_token *token,
source_location src_loc, int parsing_args)
{
source_location src_loc = token->src_loc;
if (define_queue || undef_queue)
dump_queued_macros (pfile);
@ -365,6 +395,15 @@ cb_line_change (cpp_reader *pfile, const cpp_token *token,
}
}
/* Called when a line of output is started. TOKEN is the first token
of the line, and at end of file will be CPP_EOF. */
static void
cb_line_change (cpp_reader *pfile, const cpp_token *token,
int parsing_args)
{
do_line_change (pfile, token, token->src_loc, parsing_args);
}
static void
cb_ident (cpp_reader *pfile ATTRIBUTE_UNUSED, source_location line,
const cpp_string *str)

View File

@ -1,5 +1,15 @@
2009-10-09 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/41445
* gcc.dg/cpp/separate-1.c: Adjust.
* gcc.dg/cpp/spacing1.c: Add -P to dg-options.
* gcc.dg/debug/dwarf2/pr41445-1.c: New test.
* gcc.dg/debug/dwarf2/pr41445-2.c: New test.
* gcc.dg/debug/dwarf2/pr41445-3.c: New test.
* gcc.dg/debug/dwarf2/pr41445-4.c: New test.
* gcc.dg/debug/dwarf2/pr41445-5.c: New test.
* gcc.dg/debug/dwarf2/pr41445-6.c: New test.
PR rtl-optimization/41646
* gcc.c-torture/compile/pr41646.c: New test.

View File

@ -8,8 +8,8 @@
#define FOO()
int FOO( /* { dg-error "parse error|syntax error|expected" "error on this line" } */
), bar;
int FOO(
), bar; /* { dg-error "parse error|syntax error|expected" "error on this line" } */
int baz FOO /* { dg-error "parse error|syntax error|expected" "error on this line" } */
;

View File

@ -1,6 +1,7 @@
/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. */
/* { dg-do preprocess } */
/* { dg-options "-P" } */
/* This tests correct spacing of macro expansion output, as well as
the line it falls on. This is quite subtle; it involves newlines

View File

@ -0,0 +1,18 @@
/* PR preprocessor/41445 */
/* Test that token after multi-line function-like macro use
gets correct locus even when preprocessing separately. */
/* { dg-do compile } */
/* { dg-options "-save-temps -g -O0 -dA -fno-merge-debug-strings" } */
#define A(a,b)
int varh;A(1,
2)int vari;
int varj;
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varh\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?8\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xc|12)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xd|13)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { cleanup-saved-temps } } */

View File

@ -0,0 +1,9 @@
/* PR preprocessor/41445 */
/* { dg-do compile } */
/* { dg-options "-g -O0 -dA -fno-merge-debug-strings" } */
#include "pr41445-1.c"
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varh\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?8\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xc|12)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xd|13)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */

View File

@ -0,0 +1,18 @@
/* PR preprocessor/41445 */
/* Test that token after multi-line function-like macro use
gets correct locus even when preprocessing separately. */
/* { dg-do compile } */
/* { dg-options "-save-temps -g -O0 -dA -fno-merge-debug-strings" } */
#define A(a,b)
int varh;/*
Some multi-line comment.
*/int vari;
int varj;
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varh\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?8\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xc|12)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xd|13)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { cleanup-saved-temps } } */

View File

@ -0,0 +1,9 @@
/* PR preprocessor/41445 */
/* { dg-do compile } */
/* { dg-options "-g -O0 -dA -fno-merge-debug-strings" } */
#include "pr41445-3.c"
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varh\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?8\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xc|12)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xd|13)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */

View File

@ -0,0 +1,14 @@
/* PR preprocessor/41445 */
/* Test that token after multi-line function-like macro use
gets correct locus even when preprocessing separately. */
/* { dg-do compile } */
/* { dg-options "-save-temps -g -O0 -dA -fno-merge-debug-strings" } */
#define A(x) vari x
#define vari(x)
#define B , varj
int A(B) ;
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?7\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xa|10)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { cleanup-saved-temps } } */

View File

@ -0,0 +1,8 @@
/* PR preprocessor/41445 */
/* { dg-do compile } */
/* { dg-options "-g -O0 -dA -fno-merge-debug-strings" } */
#include "pr41445-5.c"
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"vari\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0x)?7\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */
/* { dg-final { scan-assembler "DW_TAG_variable\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\"varj\[^\\r\\n\]*DW_AT_name(\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*DW_AT_)*\[^\\r\\n\]*\[\\r\\n\]+\[^\\r\\n\]*\[^0-9a-fA-FxX](0xa|10)\[^0-9a-fA-FxX]\[^\\r\\n\]*DW_AT_decl_line" } } */