[PR96230] some -dumpbase-ext fixes

The initial bug report was that compiling (-c) with -dumpbase ""
-dumpbase-ext .<ext> crashes the driver.

The verification of -dumpbase-ext against -dumpbase doesn't cover the
case in which -dumpbase activates backward-compatibility mode.

I added a test for that, and for -dumpbase-ext without -dumpbase,
trying to make it work in a sensible way, as if applied to the default
-dumpbase for each file.  It turned out that this made for too much
complexity in dealing with suffixes derived from input filenames, so I
gave that up and returned to discarding -dumpbase-ext as documented,
ending up with a change identical to that in the original bug report.

I also thought I caught an off-by-one error in the initial
verification, that caused dumpbase_ext to be discarded if it was
identical to the specified dumpbase, but that turned out to be
intentional as well, so I put in comments and a test to reflect it.

Finally, an earlier version of the newly-added tests used "$var.ext"
in an expected output list, which showed me the handling of string
expansion was incorrect.  Reworked the expr into an eval to make that
work, and, absent any reliance on post-eval adjustments to so-expanded
output names, I arranged for the adjustments to be skipped after eval.


Co-Authored-By: "Zhanghaijian (A)" <z.zhanghaijian@huawei.com>
for  gcc/ChangeLog

	PR driver/96230
	* gcc.c (process_command): Adjust and document conditions to
	reset dumpbase_ext.

for  gcc/testsuite/ChangeLog

	PR driver/96230
	* gcc.misc-tests/outputs.exp: Add tests with -dumpbase-ext,
	with identical -dumpbase, with -dumpbase "", and without any
	-dumpbase.
	(outest): Fix "" expansion in expected outputs, skip
	adjustments.
This commit is contained in:
Alexandre Oliva 2020-07-24 15:38:38 -03:00 committed by Alexandre Oliva
parent 5fa1767aa4
commit c1b9cb1a83
2 changed files with 31 additions and 7 deletions

View File

@ -4907,6 +4907,9 @@ process_command (unsigned int decoded_options_count,
int lendb = strlen (dumpbase);
int lendbx = strlen (dumpbase_ext);
/* -dumpbase-ext must be a suffix proper; discard it if it
matches all of -dumpbase, as that would make for an empty
basename. */
if (lendbx >= lendb
|| strcmp (dumpbase + lendb - lendbx, dumpbase_ext) != 0)
{
@ -5083,10 +5086,18 @@ process_command (unsigned int decoded_options_count,
/* Check that dumpbase_ext, if still present, still matches the end
of dumpbase, if present, and drop it otherwise. We only retained
it above when dumpbase was absent to maybe use it to drop the
extension from output_name before combining it with dumpdir. */
extension from output_name before combining it with dumpdir. We
won't deal with -dumpbase-ext when -dumpbase is not explicitly
given, even if just to activate backward-compatible dumpbase:
dropping it on the floor is correct, expected and documented
behavior. Attempting to deal with a -dumpbase-ext that might
match the end of some input filename, or of the combination of
the output basename with the suffix of the input filename,
possible with an intermediate .gk extension for -fcompare-debug,
is just calling for trouble. */
if (dumpbase_ext)
{
if (!dumpbase)
if (!dumpbase || !*dumpbase)
{
free (dumpbase_ext);
dumpbase_ext = NULL;

View File

@ -137,11 +137,9 @@ proc outest { test sources opts dirs outputs } {
if { [string match "\[\$\"\]" [string index $og 0]] } {
global aout
set og [expr $og]
if { "$og" == "" } { continue }
}
if { [string index $og 0] == "-" } then {
eval set o $og
if { "$o" == "" } { continue }
} elseif { [string index $og 0] == "-" } then {
if { [string index $og 1] == "-" \
|| [string index $og 1] == "." } then {
set o "$b-$b[string range $og 1 end]"
@ -723,6 +721,21 @@ outest "$b lto st mult namedb" $mult "-o dir/$b.exe -save-temps -O2 -flto -flto-
# !$skip_lto
}
# PR96230 - -dumpbase "" with -dumpbase-ext, not linking
outest "$b single -c -o -db'' -dbx.c" $sing "-c -o dir/$b.o -dumpbase \"\" -dumpbase-ext .c -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-0.c.???r.final -0.su !!$gspd -0.dwo !0 .o} {}}
outest "$b mult -c -dd -db'' -dbx.c" $mult "-c -dumpdir dir/ -dumpbase \"\" -dumpbase-ext .c -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-1.c.???r.final -1.su !!$gspd -1.dwo !0 -2.c.???r.final -2.su !!$gspd -2.dwo} {-1.o -2.o}}
outest "$b single -c -o -db'' -dbx.x" $sing "-c -o dir/$b.o -dumpbase \"\" -dumpbase-ext .x -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-0.c.???r.final -0.su !!$gspd -0.dwo !0 .o} {}}
outest "$b mult -c -dd -db'' -dbx.x" $mult "-c -dumpdir dir/ -dumpbase \"\" -dumpbase-ext .x -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-1.c.???r.final -1.su !!$gspd -1.dwo !0 -2.c.???r.final -2.su !!$gspd -2.dwo} {-1.o -2.o}}
# Test -dumpbase-ext without an explicit -dumpbase too.
outest "$b single -c -o -dbx.c" $sing "-c -o dir/$b.o -dumpbase-ext .c -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{.c.???r.final .su !!$gspd .dwo !0 .o} {}}
outest "$b mult -c -dd -dbx.c" $mult "-c -dumpdir dir/ -dumpbase-ext .c -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-1.c.???r.final -1.su !!$gspd -1.dwo !0 -2.c.???r.final -2.su !!$gspd -2.dwo} {-1.o -2.o}}
outest "$b single -c -o -dbx.x" $sing "-c -o dir/$b.o -dumpbase-ext .x -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{.c.???r.final .su !!$gspd .dwo !0 .o} {}}
outest "$b mult -c -dd -dbx.x" $mult "-c -dumpdir dir/ -dumpbase-ext .x -fdump-rtl-final -fstack-usage $gsplit_dwarf" {dir/} {{-1.c.???r.final -1.su !!$gspd -1.dwo !0 -2.c.???r.final -2.su !!$gspd -2.dwo} {-1.o -2.o}}
outest "$b obj compare-debug save-temps -dbx.x" $sing "-c -fcompare-debug -save-temps -fdump-rtl-final -fstack-usage $gsplit_dwarf -fdump-final-insns -dumpbase-ext .x" {} {{-0.c.???r.final -0.su -0.i -0.c.gkd -0.s -0.gk.i -0.gk.c.???r.final -0.gk.c.gkd !!$gspd -0.dwo !0 -0.o}}
# -dumpbase-ext is dropped if identical to -dumpbase.
outest "$b asm db=dbext 1" $sing "-S -fdump-rtl-final -fstack-usage $gsplit_dwarf -dumpbase a -dumpbase-ext a" {} {{a.???r.final a.su -0.s}}
# Below are examples taken from the documentation.
# They are likely redundant with earlier test,
# but we want to make sure behavior matches the docs.