public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-9495] c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target pragmas [PR1030
@ 2022-01-24  9:20 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-01-24  9:20 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:be66fad59a7f74f96f47c1ae7d9f0a8e2b9a5f9e

commit r11-9495-gbe66fad59a7f74f96f47c1ae7d9f0a8e2b9a5f9e
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 30 14:25:19 2021 +0100

    c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target pragmas [PR103012]
    
    The following testcases ICE when an optimize or target pragma
    is followed by a long line (4096+ chars).
    This is because on such long lines we can't use columns anymore,
    but the cpp_define calls performed by c_cpp_builtins_optimize_pragma
    or from the backend hooks for target pragma are done on temporary
    buffers and expect to get columns from whatever line they appear on
    (which happens to be the long line after optimize/target pragma),
    and we run into:
     #0  fancy_abort (file=0x3abec67 "../../libcpp/line-map.c", line=502, function=0x3abecfc "linemap_add") at ../../gcc/diagnostic.c:1986
     #1  0x0000000002e7c335 in linemap_add (set=0x7ffff7fca000, reason=LC_RENAME, sysp=0, to_file=0x41287a0 "pr103012.i", to_line=3) at ../../libcpp/line-map.c:502
     #2  0x0000000002e7cc24 in linemap_line_start (set=0x7ffff7fca000, to_line=3, max_column_hint=128) at ../../libcpp/line-map.c:827
     #3  0x0000000002e7ce2b in linemap_position_for_column (set=0x7ffff7fca000, to_column=1) at ../../libcpp/line-map.c:898
     #4  0x0000000002e771f9 in _cpp_lex_direct (pfile=0x40c3b60) at ../../libcpp/lex.c:3592
     #5  0x0000000002e76c3e in _cpp_lex_token (pfile=0x40c3b60) at ../../libcpp/lex.c:3394
     #6  0x0000000002e610ef in lex_macro_node (pfile=0x40c3b60, is_def_or_undef=true) at ../../libcpp/directives.c:601
     #7  0x0000000002e61226 in do_define (pfile=0x40c3b60) at ../../libcpp/directives.c:639
     #8  0x0000000002e610b2 in run_directive (pfile=0x40c3b60, dir_no=0, buf=0x7fffffffd430 "__OPTIMIZE__ 1\n", count=14) at ../../libcpp/directives.c:589
     #9  0x0000000002e650c1 in cpp_define (pfile=0x40c3b60, str=0x2f784d1 "__OPTIMIZE__") at ../../libcpp/directives.c:2513
     #10 0x0000000002e65100 in cpp_define_unused (pfile=0x40c3b60, str=0x2f784d1 "__OPTIMIZE__") at ../../libcpp/directives.c:2522
     #11 0x0000000000f50685 in c_cpp_builtins_optimize_pragma (pfile=0x40c3b60, prev_tree=<optimization_node 0x7fffea042000>, cur_tree=<optimization_node 0x7fffea042020>)
         at ../../gcc/c-family/c-cppbuiltin.c:600
    assertion that LC_RENAME doesn't happen first.
    
    I think the right fix is emit those predefined macros upon
    optimize/target pragmas with BUILTINS_LOCATION, like we already do
    for those macros at the start of the TU, they don't appear in columns
    of the next line after it.  Another possibility would be to force them
    at the location of the pragma.
    
    2021-12-30  Jakub Jelinek  <jakub@redhat.com>
    
            PR c++/103012
    gcc/
            * config/i386/i386-c.c (ix86_pragma_target_parse): Perform
            cpp_define/cpp_undef calls with forced token locations
            BUILTINS_LOCATION.
            * config/arm/arm-c.c (arm_pragma_target_parse): Likewise.
            * config/aarch64/aarch64-c.c (aarch64_pragma_target_parse): Likewise.
            * config/s390/s390-c.c (s390_pragma_target_parse): Likewise.
    gcc/c-family/
            * c-cppbuiltin.c (c_cpp_builtins_optimize_pragma): Perform
            cpp_define_unused/cpp_undef calls with forced token locations
            BUILTINS_LOCATION.
    gcc/testsuite/
            PR c++/103012
            * g++.dg/cpp/pr103012.C: New test.
            * g++.target/i386/pr103012.C: New test.
    
    (cherry picked from commit 1dbe26b949c6142b278ab7af2bac4545e8d524f2)

Diff:
---
 gcc/c-family/c-cppbuiltin.c              |  6 ++++++
 gcc/config/aarch64/aarch64-c.c           |  2 ++
 gcc/config/arm/arm-c.c                   |  2 ++
 gcc/config/i386/i386-c.c                 |  4 ++++
 gcc/config/s390/s390-c.c                 |  2 ++
 gcc/testsuite/g++.dg/cpp/pr103012.C      | 18 ++++++++++++++++++
 gcc/testsuite/g++.target/i386/pr103012.C | 19 +++++++++++++++++++
 7 files changed, 53 insertions(+)

diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index 9f993c4aff2..11e015bdb87 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -589,6 +589,10 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
   if (flag_undef)
     return;
 
+  /* Make sure all of the builtins about to be declared have
+     BUILTINS_LOCATION has their location_t.  */
+  cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
+
   /* Other target-independent built-ins determined by command-line
      options.  */
   if (!prev->x_optimize_size && cur->x_optimize_size)
@@ -628,6 +632,8 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
       cpp_undef (pfile, "__FINITE_MATH_ONLY__");
       cpp_define_unused (pfile, "__FINITE_MATH_ONLY__=0");
     }
+
+  cpp_stop_forcing_token_locations (parse_in);
 }
 
 
diff --git a/gcc/config/aarch64/aarch64-c.c b/gcc/config/aarch64/aarch64-c.c
index f9ddffa0078..8eeef588559 100644
--- a/gcc/config/aarch64/aarch64-c.c
+++ b/gcc/config/aarch64/aarch64-c.c
@@ -257,7 +257,9 @@ aarch64_pragma_target_parse (tree args, tree pop_target)
   unsigned char saved_warn_unused_macros = cpp_opts->warn_unused_macros;
   cpp_opts->warn_unused_macros = 0;
 
+  cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
   aarch64_update_cpp_builtins (parse_in);
+  cpp_stop_forcing_token_locations (parse_in);
 
   cpp_opts->warn_unused_macros = saved_warn_unused_macros;
 
diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
index cc7901bca8d..244ec84a815 100644
--- a/gcc/config/arm/arm-c.c
+++ b/gcc/config/arm/arm-c.c
@@ -445,7 +445,9 @@ arm_pragma_target_parse (tree args, tree pop_target)
       acond_macro = get_identifier ("__ARM_FEATURE_LDREX");
       C_CPP_HASHNODE (acond_macro)->flags |= NODE_CONDITIONAL;
 
+      cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
       arm_cpu_builtins (parse_in);
+      cpp_stop_forcing_token_locations (parse_in);
 
       cpp_opts->warn_unused_macros = saved_warn_unused_macros;
 
diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
index 5ed0de006fb..02d32e6edc5 100644
--- a/gcc/config/i386/i386-c.c
+++ b/gcc/config/i386/i386-c.c
@@ -700,12 +700,14 @@ ix86_pragma_target_parse (tree args, tree pop_target)
     cur_tune = prev_tune = PROCESSOR_max;
 
   /* Undef all of the macros for that are no longer current.  */
+  cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
   ix86_target_macros_internal (prev_isa & diff_isa,
 			       prev_isa2 & diff_isa2,
 			       prev_arch,
 			       prev_tune,
 			       (enum fpmath_unit) prev_opt->x_ix86_fpmath,
 			       cpp_undef);
+  cpp_stop_forcing_token_locations (parse_in);
 
   /* For the definitions, ensure all newly defined macros are considered
      as used for -Wunused-macros.  There is no point warning about the
@@ -715,12 +717,14 @@ ix86_pragma_target_parse (tree args, tree pop_target)
   cpp_opts->warn_unused_macros = 0;
 
   /* Define all of the macros for new options that were just turned on.  */
+  cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
   ix86_target_macros_internal (cur_isa & diff_isa,
 			       cur_isa2 & diff_isa2,
 			       cur_arch,
 			       cur_tune,
 			       (enum fpmath_unit) cur_opt->x_ix86_fpmath,
 			       cpp_define);
+  cpp_stop_forcing_token_locations (parse_in);
 
   cpp_opts->warn_unused_macros = saved_warn_unused_macros;
 
diff --git a/gcc/config/s390/s390-c.c b/gcc/config/s390/s390-c.c
index 7dbd8bf5da3..b98dadcd23a 100644
--- a/gcc/config/s390/s390-c.c
+++ b/gcc/config/s390/s390-c.c
@@ -455,7 +455,9 @@ s390_pragma_target_parse (tree args, tree pop_target)
     cpp_opts->warn_unused_macros = 0;
 
     /* Define all of the macros for new options that were just turned on.  */
+    cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
     s390_cpu_cpp_builtins_internal (parse_in, cur_opt, prev_opt);
+    cpp_stop_forcing_token_locations (parse_in);
 
     cpp_opts->warn_unused_macros = saved_warn_unused_macros;
   }
diff --git a/gcc/testsuite/g++.dg/cpp/pr103012.C b/gcc/testsuite/g++.dg/cpp/pr103012.C
new file mode 100644
index 00000000000..a1724198d3d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp/pr103012.C
@@ -0,0 +1,18 @@
+// PR c++/103012
+// { dg-do compile }
+
+int a = 1;
+#pragma GCC optimize "Og"
+#define A(a) a +
+#define B(a) A(a)A(a)
+#define C(a) B(a)B(a)
+#define D(a) C(a)C(a)
+#define E(a) D(a)D(a)
+#define F(a) E(a)E(a)
+#define G(a) F(a)F(a)
+#define H(a) G(a)G(a)
+#define I(a) H(a)H(a)
+#define J(a) I(a)I(a)
+#define K(a) J(a)J(a)
+#define L(a) K(a)K(a)
+int b = L(a) 1;
diff --git a/gcc/testsuite/g++.target/i386/pr103012.C b/gcc/testsuite/g++.target/i386/pr103012.C
new file mode 100644
index 00000000000..2c9a8cd91d5
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr103012.C
@@ -0,0 +1,19 @@
+// PR c++/103012
+// { dg-do compile }
+// { dg-options "-mno-avx2" }
+
+int a = 1;
+#pragma GCC target "avx2"
+#define A(a) a +
+#define B(a) A(a)A(a)
+#define C(a) B(a)B(a)
+#define D(a) C(a)C(a)
+#define E(a) D(a)D(a)
+#define F(a) E(a)E(a)
+#define G(a) F(a)F(a)
+#define H(a) G(a)G(a)
+#define I(a) H(a)H(a)
+#define J(a) I(a)I(a)
+#define K(a) J(a)J(a)
+#define L(a) K(a)K(a)
+int b = L(a) 1;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-24  9:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-24  9:20 [gcc r11-9495] c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target pragmas [PR1030 Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).