]> gcc.gnu.org Git - gcc.git/commitdiff
c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target...
authorJakub Jelinek <jakub@redhat.com>
Thu, 30 Dec 2021 13:25:19 +0000 (14:25 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 30 Dec 2021 13:25:19 +0000 (14:25 +0100)
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.

gcc/c-family/c-cppbuiltin.c
gcc/config/aarch64/aarch64-c.c
gcc/config/arm/arm-c.c
gcc/config/i386/i386-c.c
gcc/config/s390/s390-c.c
gcc/testsuite/g++.dg/cpp/pr103012.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/pr103012.C [new file with mode: 0644]

index feb7e611de6d4cb6983dcabe6977ac9672a38077..339dd2b73c3545e7df9d53b966ea7d19196a25f7 100644 (file)
@@ -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)
@@ -653,6 +657,8 @@ c_cpp_builtins_optimize_pragma (cpp_reader *pfile, tree prev_tree,
     cpp_define_unused (pfile, "__ROUNDING_MATH__");
   else if (prev->x_flag_rounding_math && !cur->x_flag_rounding_math)
     cpp_undef (pfile, "__ROUNDING_MATH__");
+
+  cpp_stop_forcing_token_locations (parse_in);
 }
 
 
index 3af3e5c96daf674648dbc008b15ade0e303b66f8..a2fab4db1d1fa0e00a33d2ab9629fa96d2d3a857 100644 (file)
@@ -259,7 +259,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;
 
index d1414f6e0e1c2bd0a7364b837c16adf493221376..787eaf3e993328cba7d1fd4c8c562ac9fe7122b3 100644 (file)
@@ -464,7 +464,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;
 
index cc64f855ecc9d7b07dcfd901ce179bae1315e1cb..144d4527526d0a66e0c0968a5a998dca64c1193e 100644 (file)
@@ -702,12 +702,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
@@ -717,12 +719,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;
 
index 4cce2619ce41128b156a35d82940806fe6d9146d..74601a0905b8539dc4f1e080a33de3e949fd9176 100644 (file)
@@ -457,7 +457,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 (file)
index 0000000..a172419
--- /dev/null
@@ -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 (file)
index 0000000..2c9a8cd
--- /dev/null
@@ -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;
This page took 0.087431 seconds and 5 git commands to generate.