[PATCH] c-family: Use BULTINS_LOCATION for predefined macros changed upon optimize or target pragmas [PR103012]
Jeff Law
jeffreyalaw@gmail.com
Thu Dec 30 12:57:34 GMT 2021
On 12/29/2021 3:01 AM, Jakub Jelinek via Gcc-patches wrote:
> Hi!
>
> 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.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2021-12-28 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.
OK
jeff
More information about the Gcc-patches
mailing list