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:
parent
9c1e641ac1
commit
21ece9b288
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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" } */
|
||||
;
|
||||
|
@ -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
|
||||
|
18
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-1.c
Normal file
18
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-1.c
Normal 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 } } */
|
9
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-2.c
Normal file
9
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-2.c
Normal 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" } } */
|
18
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-3.c
Normal file
18
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-3.c
Normal 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 } } */
|
9
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-4.c
Normal file
9
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-4.c
Normal 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" } } */
|
14
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c
Normal file
14
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c
Normal 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 } } */
|
8
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c
Normal file
8
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c
Normal 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" } } */
|
Loading…
Reference in New Issue
Block a user