]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/41445 (Debug information is wrong with and without --save-temps.)
authorJakub Jelinek <jakub@redhat.com>
Fri, 9 Oct 2009 19:55:34 +0000 (21:55 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 9 Oct 2009 19:55:34 +0000 (21:55 +0200)
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

gcc/ChangeLog
gcc/c-ppoutput.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/separate-1.c
gcc/testsuite/gcc.dg/cpp/spacing1.c
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c [new file with mode: 0644]

index 85ed160a4d14d0178303374999ab7548fac29f3b..51fd641773fb20885840707fa03101f7d2e9b9b3 100644 (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
index ff3e6b6c8431037d46ec0a57f00e01462ae24e24..bd9af2aa0f6c9a1bd557863007b312806f8d098c 100644 (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)
index a1517050474dc818440bcb87938f77cd05a5fdb4..b971b7314022d7205a64ad309c32893cdfa8b0f1 100644 (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.
 
index 6814a0fa2d02cb87b16444fad4e2f318ee430f9f..33d910b3c005ad28e96462711ac266846999618f 100644 (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" } */
 ;
index 2d70f869d2192cf7abfc80927e2c019baee132b3..c21a6b5159bf273a260dcec521d9621278038729 100644 (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
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-1.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-1.c
new file mode 100644 (file)
index 0000000..452c0f6
--- /dev/null
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-2.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-2.c
new file mode 100644 (file)
index 0000000..d2ee408
--- /dev/null
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-3.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-3.c
new file mode 100644 (file)
index 0000000..2a74dc5
--- /dev/null
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-4.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-4.c
new file mode 100644 (file)
index 0000000..8aa92de
--- /dev/null
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-5.c
new file mode 100644 (file)
index 0000000..03af604
--- /dev/null
@@ -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 } } */
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr41445-6.c
new file mode 100644 (file)
index 0000000..8aa37d1
--- /dev/null
@@ -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" } } */