saiislam created this revision.
saiislam added reviewers: jhuber6, yaxunl.
Herald added subscribers: tpr, dstuttard, kzhuravl.
Herald added a project: All.
saiislam requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, wdng.
Herald added a project: clang.

-mcode-object-version=none is a special argument which allows
abi-agnostic code to be generated for device runtime libraries.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D156928

Files:
  clang/include/clang/Basic/TargetOptions.h
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Driver/ToolChains/CommonArgs.cpp

Index: clang/lib/Driver/ToolChains/CommonArgs.cpp
===================================================================
--- clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ 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;
 }
 
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ 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));
+    }
   }
 }
 
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ 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
Index: clang/include/clang/Basic/TargetOptions.h
===================================================================
--- clang/include/clang/Basic/TargetOptions.h
+++ 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;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to