[ELF] Quote the value in "unknown -z" diagnostics (#213572) To make stray whitespace more visible (see #212523) ``` $ echo end > tmp.f90 && flang -fuse-ld=lld -Wl,"-z execstack" tmp.f90 ld.lld: warning: unknown -z value: execstack ``` Drop the colon (colon is typically used without quotes in lld/ELF diagnostics). Change ErrAlways to Err so that --noinhibit-exec downgrades the errors to warnings. Read --noinhibit-exec before readConfigs, as Err depends on it. GitOrigin-RevId: 9cb3a6ed4f4eecb78c41e589341263c2d0cecd36
diff --git a/ELF/Driver.cpp b/ELF/Driver.cpp index 3f51d4e..0393410 100644 --- a/ELF/Driver.cpp +++ b/ELF/Driver.cpp
@@ -521,8 +521,8 @@ else if (kv.second == "protected") ret = STV_PROTECTED; else - ErrAlways(ctx) << "unknown -z start-stop-visibility= value: " - << StringRef(kv.second); + Err(ctx) << "unknown -z start-stop-visibility= value '" + << StringRef(kv.second) << "'"; } } return ret; @@ -541,7 +541,7 @@ else if (kv.second == "always") ret = GcsPolicy::Always; else - ErrAlways(ctx) << "unknown -z gcs= value: " << kv.second; + Err(ctx) << "unknown -z gcs= value '" << kv.second << "'"; } } return ret; @@ -562,7 +562,7 @@ else if (kv.second == "implicit") ret = ZicfilpPolicy::Implicit; else - ErrAlways(ctx) << "unknown -z zicfilp= value: " << kv.second; + Err(ctx) << "unknown -z zicfilp= value '" << kv.second << "'"; } } return ret; @@ -581,7 +581,7 @@ else if (kv.second == "implicit") ret = ZicfissPolicy::Implicit; else - ErrAlways(ctx) << "unknown -z zicfiss= value: " << kv.second; + Err(ctx) << "unknown -z zicfiss= value '" << kv.second << "'"; } } return ret; @@ -600,7 +600,7 @@ else if (kv.second == "async") ret = ELF::NT_MEMTAG_LEVEL_ASYNC; else - ErrAlways(ctx) << "unknown -z memtag-mode= value: " << kv.second; + Err(ctx) << "unknown -z memtag-mode= value '" << kv.second << "'"; } } return ret; @@ -616,7 +616,7 @@ getZFlag(args, "dynamic-undefined-weak", "nodynamic-undefined-weak", false); for (auto *arg : args.filtered(OPT_z)) if (!arg->isClaimed()) - Warn(ctx) << "unknown -z value: " << StringRef(arg->getValue()); + Warn(ctx) << "unknown -z value '" << StringRef(arg->getValue()) << "'"; } constexpr const char *saveTempsValues[] = { @@ -640,6 +640,7 @@ args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false) && !args.hasArg(OPT_no_warnings); ctx.e.suppressWarnings = args.hasArg(OPT_no_warnings); + ctx.arg.noinhibitExec = args.hasArg(OPT_noinhibit_exec); // Handle -help if (args.hasArg(OPT_help)) { @@ -1511,7 +1512,6 @@ ctx.arg.mmapOutputFile = args.hasFlag(OPT_mmap_output_file, OPT_no_mmap_output_file, false); ctx.arg.nmagic = args.hasFlag(OPT_nmagic, OPT_no_nmagic, false); - ctx.arg.noinhibitExec = args.hasArg(OPT_noinhibit_exec); ctx.arg.nostdlib = args.hasArg(OPT_nostdlib); ctx.arg.oFormatBinary = isOutputFormatBinary(ctx, args); ctx.arg.omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false); @@ -1766,8 +1766,8 @@ else if (option.second == "error") *reportArg.second = ReportPolicy::Error; else { - ErrAlways(ctx) << "unknown -z " << reportArg.first - << "= value: " << option.second; + Err(ctx) << "unknown -z " << reportArg.first << "= value '" + << option.second << "'"; continue; } hasGcsReportDynamic |= option.first == "gcs-report-dynamic";
diff --git a/test/ELF/aarch64-feature-bti.s b/test/ELF/aarch64-feature-bti.s index 46e2ec4..53676c8 100644 --- a/test/ELF/aarch64-feature-bti.s +++ b/test/ELF/aarch64-feature-bti.s
@@ -262,7 +262,7 @@ # FORCE-NEXT: nop # RUN: not ld.lld %t.o -z bti-report=u -o /dev/null 2>&1 | FileCheck --check-prefix=REPORT-ERR %s -# REPORT-ERR: error: unknown -z bti-report= value: u{{$}} +# REPORT-ERR: error: unknown -z bti-report= value 'u' # REPORT-EMPTY: .section ".note.gnu.property", "a"
diff --git a/test/ELF/aarch64-feature-gcs.s b/test/ELF/aarch64-feature-gcs.s index bfa65d9..1b78801 100644 --- a/test/ELF/aarch64-feature-gcs.s +++ b/test/ELF/aarch64-feature-gcs.s
@@ -68,10 +68,12 @@ ## An invalid gcs option should give an error # RUN: not ld.lld f1-s.o -z gcs=x -z gcs-report=x -z gcs-report-dynamic=x 2>&1 | FileCheck --check-prefix=INVALID %s +# RUN: ld.lld f1-s.o -z gcs=x --noinhibit-exec -o /dev/null 2>&1 | FileCheck --check-prefix=INVALID-WARN %s -# INVALID: error: unknown -z gcs= value: x -# INVALID: error: unknown -z gcs-report= value: x -# INVALID: error: unknown -z gcs-report-dynamic= value: x +# INVALID: error: unknown -z gcs= value 'x' +# INVALID: error: unknown -z gcs-report= value 'x' +# INVALID: error: unknown -z gcs-report-dynamic= value 'x' +# INVALID-WARN: warning: unknown -z gcs= value 'x' #--- f1-s.s .section ".note.gnu.property", "a"
diff --git a/test/ELF/aarch64-feature-pauth.s b/test/ELF/aarch64-feature-pauth.s index 4e4d86c..36e78c0 100644 --- a/test/ELF/aarch64-feature-pauth.s +++ b/test/ELF/aarch64-feature-pauth.s
@@ -88,7 +88,7 @@ # PACPLT-NEXT: nop # RUN: not ld.lld tag1.o -z pauth-report=u 2>&1 | FileCheck --check-prefix=REPORT-ERR %s -# REPORT-ERR: error: unknown -z pauth-report= value: u{{$}} +# REPORT-ERR: error: unknown -z pauth-report= value 'u' # REPORT-EMPTY: #--- abi-tag-short.s
diff --git a/test/ELF/aarch64-memtag-abi.s b/test/ELF/aarch64-memtag-abi.s index 86e53ed..e81ed34 100644 --- a/test/ELF/aarch64-memtag-abi.s +++ b/test/ELF/aarch64-memtag-abi.s
@@ -43,7 +43,7 @@ # RUN: not ld.lld -shared -z memtag-mode=asymm -z memtag-heap 2>&1 | \ # RUN: FileCheck %s --check-prefix=BAD-MODE -# BAD-MODE: error: unknown -z memtag-mode= value: asymm +# BAD-MODE: error: unknown -z memtag-mode= value 'asymm' # RUN: ld.lld -static -z memtag-mode=sync -z memtag-heap \ # RUN: -z memtag-stack %t.o -o %t
diff --git a/test/ELF/aarch64-memtag-android-abi.s b/test/ELF/aarch64-memtag-android-abi.s index cba84d0..b1768a3 100644 --- a/test/ELF/aarch64-memtag-android-abi.s +++ b/test/ELF/aarch64-memtag-android-abi.s
@@ -55,7 +55,7 @@ # RUN: not ld.lld -shared -z memtag-mode=asymm -z memtag-heap --android-memtag-note 2>&1 | \ # RUN: FileCheck %s --check-prefix=BAD-MODE -# BAD-MODE: error: unknown -z memtag-mode= value: asymm +# BAD-MODE: error: unknown -z memtag-mode= value 'asymm' # RUN: ld.lld -static -z memtag-mode=sync -z memtag-heap \ # RUN: -z memtag-stack --android-memtag-note %t.o -o %t
diff --git a/test/ELF/driver.test b/test/ELF/driver.test index 6d57612..4437d24 100644 --- a/test/ELF/driver.test +++ b/test/ELF/driver.test
@@ -50,14 +50,14 @@ # RUN: ld.lld %t -z foo -z rel -z rela -z max-page-size=1 -z common-page-size=1 -z dynamic-undefined-weak \ # RUN: -z nodynamic-undefined-weak -o /dev/null --version 2>&1 | \ # RUN: FileCheck -check-prefix=ERR10 %s --implicit-check-not=warning: -# ERR10: warning: unknown -z value: foo +# ERR10: warning: unknown -z value 'foo' ## Check we report "unknown -z value" error even with -v. # RUN: ld.lld %t -z foo -z rel -o /dev/null -v 2>&1 | FileCheck -check-prefix=ERR10 %s --implicit-check-not=warning: ## Note: in GNU ld, --fatal-warning still leads to a warning. # RUN: not ld.lld %t -z foo --fatal-warnings 2>&1 | FileCheck --check-prefix=ERR10-FATAL %s -# ERR10-FATAL: error: unknown -z value: foo +# ERR10-FATAL: error: unknown -z value 'foo' # RUN: not ld.lld %t -z max-page-size 2>&1 | FileCheck -check-prefix=ERR11 %s # ERR11: error: invalid max-page-size:
diff --git a/test/ELF/i386-feature-cet.s b/test/ELF/i386-feature-cet.s index a7de05a..13760a0 100644 --- a/test/ELF/i386-feature-cet.s +++ b/test/ELF/i386-feature-cet.s
@@ -25,7 +25,7 @@ # RUN: not ld.lld -e func1 %t.o %t3.o -o /dev/null -z cet-report=something 2>&1 \ # RUN: | FileCheck --check-prefix=REPORT_INVALID %s -# REPORT_INVALID: error: unknown -z cet-report= value: something +# REPORT_INVALID: error: unknown -z cet-report= value 'something' # REPORT_INVALID-EMPTY: # RUN: ld.lld -e func1 %t.o %t3.o -o /dev/null -z cet-report=warning 2>&1 \
diff --git a/test/ELF/riscv-feature-zicfilp-func-sig.s b/test/ELF/riscv-feature-zicfilp-func-sig.s index c5818dd..2e5edf7 100644 --- a/test/ELF/riscv-feature-zicfilp-func-sig.s +++ b/test/ELF/riscv-feature-zicfilp-func-sig.s
@@ -53,7 +53,7 @@ ## An invalid -z zicfilp-func-sig-report option should give an error # RUN: not ld.lld f2-s.o -z zicfilp-func-sig-report=x 2>&1 | FileCheck --check-prefix=INVALID %s -# INVALID: error: unknown -z zicfilp-func-sig-report= value: x +# INVALID: error: unknown -z zicfilp-func-sig-report= value 'x' ## ZICFILP-unlabeled and ZICFILP-func-sig should conflict with each other. # RUN: ld.lld f3-u.o -o out.override -z zicfilp=func-sig 2>&1 | FileCheck --check-prefix=FORCE-CONFLICT %s
diff --git a/test/ELF/riscv-feature-zicfilp-unlabeled.s b/test/ELF/riscv-feature-zicfilp-unlabeled.s index 1ed28c1..f361ccf 100644 --- a/test/ELF/riscv-feature-zicfilp-unlabeled.s +++ b/test/ELF/riscv-feature-zicfilp-unlabeled.s
@@ -61,8 +61,8 @@ ## An invalid -z zicfilp-unlabeled-report option should give an error # RUN: not ld.lld f2-s.o -z zicfilp=x -z zicfilp-unlabeled-report=x 2>&1 | FileCheck --check-prefix=INVALID %s -# INVALID: error: unknown -z zicfilp= value: x -# INVALID: error: unknown -z zicfilp-unlabeled-report= value: x +# INVALID: error: unknown -z zicfilp= value 'x' +# INVALID: error: unknown -z zicfilp-unlabeled-report= value 'x' ## ZICFILP-unlabeled and ZICFILP-func-sig should conflict with each other # RUN: not ld.lld f1-c.o 2>&1 | FileCheck --check-prefix=CONFLICT %s
diff --git a/test/ELF/riscv-feature-zicfiss.s b/test/ELF/riscv-feature-zicfiss.s index 7b208dd..3161325 100644 --- a/test/ELF/riscv-feature-zicfiss.s +++ b/test/ELF/riscv-feature-zicfiss.s
@@ -50,8 +50,8 @@ ## An invalid -z zicfiss-report option should give an error # RUN: not ld.lld f2-s.o f3-s.o -z zicfiss=x -z zicfiss-report=x 2>&1 | FileCheck --check-prefix=INVALID %s -# INVALID: error: unknown -z zicfiss= value: x -# INVALID: error: unknown -z zicfiss-report= value: x +# INVALID: error: unknown -z zicfiss= value 'x' +# INVALID: error: unknown -z zicfiss-report= value 'x' #--- rv32-f1-s.s .section ".note.gnu.property", "a"
diff --git a/test/ELF/startstop-visibility.s b/test/ELF/startstop-visibility.s index e6c5b1b..92ea356 100644 --- a/test/ELF/startstop-visibility.s +++ b/test/ELF/startstop-visibility.s
@@ -33,7 +33,7 @@ # CHECK-PROTECTED: 0 NOTYPE GLOBAL PROTECTED 2 __stop_aaa # RUN: not ld.lld -z start-stop-visibility=aaa %t.o -o /dev/null -# CHECK-ERROR: error: unknown -z start-stop-visibility= value: aaa +# CHECK-ERROR: error: unknown -z start-stop-visibility= value 'aaa' .quad __start_aaa .quad __stop_aaa
diff --git a/test/ELF/target-specific-options.s b/test/ELF/target-specific-options.s index 3d34ad2..d84d5b1 100644 --- a/test/ELF/target-specific-options.s +++ b/test/ELF/target-specific-options.s
@@ -44,7 +44,7 @@ # RUN: not ld.lld a.o -z execute-only-report=foo 2>&1 | \ # RUN: FileCheck %s --check-prefix=ERR-EXECUTE-ONLY-INVALID -# ERR-EXECUTE-ONLY-INVALID: error: unknown -z execute-only-report= value: foo +# ERR-EXECUTE-ONLY-INVALID: error: unknown -z execute-only-report= value 'foo' .globl _start _start:
diff --git a/test/ELF/x86-64-feature-cet.s b/test/ELF/x86-64-feature-cet.s index bf90538..d64fdba 100644 --- a/test/ELF/x86-64-feature-cet.s +++ b/test/ELF/x86-64-feature-cet.s
@@ -25,7 +25,7 @@ # RUN:not ld.lld -e func1 %t.o %t3.o -o /dev/null -z cet-report=something 2>&1 \ # RUN: | FileCheck --check-prefix=REPORT_INVALID %s -# REPORT_INVALID: error: unknown -z cet-report= value: something +# REPORT_INVALID: error: unknown -z cet-report= value 'something' # REPORT_INVALID-EMPTY: # RUN: ld.lld -e func1 %t.o %t3.o -o /dev/null -z force-ibt -z cet-report=warning 2>&1 \