diff --git a/clang/include/clang/Basic/TargetOptions.h b/clang/include/clang/Basic/TargetOptions.h --- a/clang/include/clang/Basic/TargetOptions.h +++ b/clang/include/clang/Basic/TargetOptions.h @@ -86,6 +86,8 @@ COV_3 = 300, COV_4 = 400, COV_5 = 500, + COV_Default = 400, + COV_MAX = 500 }; /// \brief Code object version for AMDGPU. CodeObjectVersionKind CodeObjectVersion = CodeObjectVersionKind::COV_None; diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -1354,6 +1354,9 @@ // Handle -Xopenmp-target flags for (auto *A : Args) { + if (A->getOption().matches(options::OPT_mcode_object_version_EQ)) + DAL->append(A); + // Exclude flags which may only apply to the host toolchain. // Do not exclude flags when the host triple (AuxTriple) // matches the current toolchain triple. If it is not present 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 @@ -1055,15 +1055,19 @@ // provided the user (e.g. front end tests) can use the default. if (haveAMDGPUCodeObjectVersionArgument(D, Args)) { unsigned CodeObjVer = getAMDGPUCodeObjectVersion(D, Args); + if(CodeObjVer != 0) { CmdArgs.insert(CmdArgs.begin() + 1, Args.MakeArgString(Twine("--amdhsa-code-object-version=") + Twine(CodeObjVer))); CmdArgs.insert(CmdArgs.begin() + 1, "-mllvm"); + } // -cc1as does not accept -mcode-object-version option. - if (!IsCC1As) + if (!IsCC1As) { + std::string CodeObjVerStr = (CodeObjVer ? Twine(CodeObjVer) : "none").str(); CmdArgs.insert(CmdArgs.begin() + 1, Args.MakeArgString(Twine("-mcode-object-version=") + - Twine(CodeObjVer))); + CodeObjVerStr)); + } } } 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 @@ -25,6 +25,7 @@ #include "clang/Basic/CharInfo.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/ObjCRuntime.h" +#include "clang/Basic/TargetOptions.h" #include "clang/Basic/Version.h" #include "clang/Config/config.h" #include "clang/Driver/Action.h" @@ -2299,16 +2300,16 @@ void tools::checkAMDGPUCodeObjectVersion(const Driver &D, const llvm::opt::ArgList &Args) { - const unsigned MinCodeObjVer = 2; - const unsigned MaxCodeObjVer = 5; if (auto *CodeObjArg = getAMDGPUCodeObjectArgument(D, Args)) { if (CodeObjArg->getOption().getID() == options::OPT_mcode_object_version_EQ) { - unsigned CodeObjVer = MaxCodeObjVer; - auto Remnant = - StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer); - if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer) + unsigned CodeObjVer = TargetOptions::COV_Default / 100; + auto CovStr = StringRef(CodeObjArg->getValue()); + if(CovStr.starts_with("none")) return; + + CovStr.getAsInteger(0, CodeObjVer); + if (CodeObjVer < TargetOptions::COV_None || CodeObjVer > TargetOptions::COV_MAX) D.Diag(diag::err_drv_invalid_int_value) << CodeObjArg->getAsString(Args) << CodeObjArg->getValue(); } @@ -2317,9 +2318,13 @@ unsigned tools::getAMDGPUCodeObjectVersion(const Driver &D, const llvm::opt::ArgList &Args) { - unsigned CodeObjVer = 4; // default - if (auto *CodeObjArg = getAMDGPUCodeObjectArgument(D, Args)) - StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer); + + unsigned CodeObjVer = TargetOptions::COV_Default / 100; // default + if (haveAMDGPUCodeObjectVersionArgument(D, Args)) { + auto CodeObjArg = StringRef(getAMDGPUCodeObjectArgument(D, Args)->getValue()); + if(CodeObjArg.starts_with("none")) return TargetOptions::COV_None; + CodeObjArg.getAsInteger(0, CodeObjVer); + } return CodeObjVer; }