diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -575,7 +575,7 @@ // and errors for the last invalid code object version options. // It is done here to avoid repeated warning or error messages for // each tool invocation. - (void)getOrCheckAMDGPUCodeObjectVersion(D, Args, /*Diagnose=*/true); + checkAMDGPUCodeObjectVersion(D, Args); } Tool *AMDGPUToolChain::buildLinker() const { diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1114,7 +1114,7 @@ static void handleAMDGPUCodeObjectVersionOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs) { - unsigned CodeObjVer = getOrCheckAMDGPUCodeObjectVersion(D, Args); + unsigned CodeObjVer = getAMDGPUCodeObjectVersion(D, Args); CmdArgs.insert(CmdArgs.begin() + 1, Args.MakeArgString(Twine("--amdhsa-code-object-version=") + Twine(CodeObjVer))); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -138,9 +138,11 @@ void addX86AlignBranchArgs(const Driver &D, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, bool IsLTO); -unsigned getOrCheckAMDGPUCodeObjectVersion(const Driver &D, - const llvm::opt::ArgList &Args, - bool Diagnose = false); +void checkAMDGPUCodeObjectVersion(const Driver &D, + const llvm::opt::ArgList &Args); + +unsigned getAMDGPUCodeObjectVersion(const Driver &D, + const llvm::opt::ArgList &Args); void addMachineOutlinerArgs(const Driver &D, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1573,22 +1573,10 @@ } } -unsigned tools::getOrCheckAMDGPUCodeObjectVersion( - const Driver &D, const llvm::opt::ArgList &Args, bool Diagnose) { - const unsigned MinCodeObjVer = 2; - const unsigned MaxCodeObjVer = 4; - unsigned CodeObjVer = 4; - - // Emit warnings for legacy options even if they are overridden. - if (Diagnose) { - if (Args.hasArg(options::OPT_mno_code_object_v3_legacy)) - D.Diag(diag::warn_drv_deprecated_arg) << "-mno-code-object-v3" - << "-mcode-object-version=2"; +static const unsigned AMDGPUCodeObjectVersionDefault = 4; - if (Args.hasArg(options::OPT_mcode_object_v3_legacy)) - D.Diag(diag::warn_drv_deprecated_arg) << "-mcode-object-v3" - << "-mcode-object-version=3"; - } +static std::pair, llvm::opt::Arg *> +tryGetAMDGPUCodeObjectVersion(const Driver &D, const llvm::opt::ArgList &Args) { // The last of -mcode-object-v3, -mno-code-object-v3 and // -mcode-object-version= wins. @@ -1598,20 +1586,57 @@ options::OPT_mcode_object_version_EQ)) { if (CodeObjArg->getOption().getID() == options::OPT_mno_code_object_v3_legacy) { - CodeObjVer = 2; + return {2, nullptr}; } else if (CodeObjArg->getOption().getID() == options::OPT_mcode_object_v3_legacy) { - CodeObjVer = 3; + return {3, nullptr}; } else { + unsigned CodeObjVer; auto Remnant = StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer); - if (Diagnose && - (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)) - D.Diag(diag::err_drv_invalid_int_value) - << CodeObjArg->getAsString(Args) << CodeObjArg->getValue(); + if (Remnant) { + return {{}, CodeObjArg}; + } else { + return {CodeObjVer, CodeObjArg}; + } } } - return CodeObjVer; + + return {AMDGPUCodeObjectVersionDefault, nullptr}; +} + +void tools::checkAMDGPUCodeObjectVersion(const Driver &D, + const llvm::opt::ArgList &Args) { + const unsigned MinCodeObjVer = 2; + const unsigned MaxCodeObjVer = 4; + + // Emit warnings for legacy options even if they are overridden. + if (Args.hasArg(options::OPT_mno_code_object_v3_legacy)) + D.Diag(diag::warn_drv_deprecated_arg) << "-mno-code-object-v3" + << "-mcode-object-version=2"; + + if (Args.hasArg(options::OPT_mcode_object_v3_legacy)) + D.Diag(diag::warn_drv_deprecated_arg) << "-mcode-object-v3" + << "-mcode-object-version=3"; + + std::pair, llvm::opt::Arg *> Ver = + tryGetAMDGPUCodeObjectVersion(D, Args); + + if (!Ver.first.hasValue() || (Ver.first.getValue() < MinCodeObjVer) || + (Ver.first.getValue() > MaxCodeObjVer)) { + D.Diag(diag::err_drv_invalid_int_value) + << Ver.second->getAsString(Args) << Ver.second->getValue(); + } +} + +unsigned tools::getAMDGPUCodeObjectVersion(const Driver &D, + const llvm::opt::ArgList &Args) { + llvm::Optional Ver = tryGetAMDGPUCodeObjectVersion(D, Args).first; + if (Ver.hasValue()) { + return Ver.getValue(); + } else { + return AMDGPUCodeObjectVersionDefault; + } } void tools::addMachineOutlinerArgs(const Driver &D, diff --git a/clang/lib/Driver/ToolChains/HIP.cpp b/clang/lib/Driver/ToolChains/HIP.cpp --- a/clang/lib/Driver/ToolChains/HIP.cpp +++ b/clang/lib/Driver/ToolChains/HIP.cpp @@ -112,7 +112,7 @@ // for backward compatibility. For code object version 4 and greater, the // offload kind in bundle ID is 'hipv4'. std::string OffloadKind = "hip"; - if (getOrCheckAMDGPUCodeObjectVersion(C.getDriver(), Args) >= 4) + if (getAMDGPUCodeObjectVersion(C.getDriver(), Args) >= 4) OffloadKind = OffloadKind + "v4"; for (const auto &II : Inputs) { const auto* A = II.getAction();