diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index bb4928293c45a058a5ec02d0a78e7c977bc5f0d9..46822845dbf6228ec1258ed9a74c26f12afd123b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -882,8 +882,8 @@ def Xopenmp_target : Separate<["-"], "Xopenmp-target">, Group def Xopenmp_target_EQ : JoinedAndSeparate<["-"], "Xopenmp-target=">, Group, HelpText<"Pass to the target offloading toolchain identified by .">, MetaVarName<" ">; -def z : Separate<["-"], "z">, Flags<[LinkerInput]>, - HelpText<"Pass -z to the linker">, MetaVarName<"">, +def z : JoinedOrSeparate<["-"], "z">, Flags<[LinkerInput]>, + HelpText<"Pass -z or -z to the linker">, MetaVarName<"">, Group; def offload_link : Flag<["--"], "offload-link">, Group, HelpText<"Use the new offloading linker to perform the link job.">; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a7e4edb3ab5ae7190f593fe4a87e07ee83a318b2..fba189188d17ca26402717547531ed396aab154e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2508,6 +2508,14 @@ void Driver::BuildUniversalActions(Compilation &C, const ToolChain &TC, } } +llvm::DenseSet ZArgsList{ + "defs", "muldefs", "execstack", "noexecstack", "globalaudit", "combreloc", + "nocombreloc", "global", "initfirst", "interpose", "lazy", "loadfltr", + "nocopyreloc", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", + "origin", "relro", "norelro", "separate-code", "noseparate-code", "common", + "nocommon", "text", "notext", "textoff" +}; + bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value, types::ID Ty, bool TypoCorrect) const { if (!getCheckInputsExist()) @@ -2584,6 +2592,11 @@ bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value, if (IsCLMode() && Ty == types::TY_Object && !Value.startswith("/")) return true; + if (ZArgsList.find(Value) != ZArgsList.end() || + Value.starts_with("common-page-size=") || + Value.starts_with("max-page-size=") || Value.starts_with("stack-size=")) + return true; + Diag(clang::diag::err_drv_no_such_file) << Value; return false; } diff --git a/clang/test/Driver/test-options-compatibility.c b/clang/test/Driver/test-options-compatibility.c new file mode 100644 index 0000000000000000000000000000000000000000..601d9e1cd42e476f5f250282436503160a32690e --- /dev/null +++ b/clang/test/Driver/test-options-compatibility.c @@ -0,0 +1,10 @@ +// RUN: %clang -### -Wl,-z -Wl,now 2>&1 | FileCheck \ +// RUN: -check-prefix=CHECK-WLCOMMAZ1 %s +// CHECK-WLCOMMAZ1: "-z" "now" +// RUN: %clang -### -Wl,-z -O3 now 2>&1 | FileCheck \ + +// RUN: -check-prefix=CHECK-WLCOMMAZ2 %s +// CHECK-WLCOMMAZ2: "-z" "now" +// RUN: %clang -### -Wl,-z stack-size=1 2>&1 | FileCheck \ +// RUN: -check-prefix=CHECK-WLCOMMAZ3 %s +// CHECK-WLCOMMAZ3: "-z" "stack-size=1"