================
@@ -519,6 +520,31 @@ void Flang::AddAMDGPUTargetArgs(const ArgList &Args,
   TC.addClangTargetOptions(Args, CmdArgs, Action::OffloadKind::OFK_OpenMP);
 }
 
+void Flang::AddNVPTXTargetArgs(const ArgList &Args,
+                               ArgStringList &CmdArgs) const {
+
+  // we cannot use addClangTargetOptions, as it appends unsupported args for
+  // flang: -fcuda-is-device, -fno-threadsafe-statics,
+  // -fcuda-allow-variadic-functions and -target-sdk-version Instead we 
manually
+  // detect the CUDA installation and link libdevice
+  const ToolChain &TC = getToolChain();
+  const Driver &D = TC.getDriver();
+  const llvm::Triple &Triple = TC.getEffectiveTriple();
+
+  // Detect CUDA installation and link libdevice
+  CudaInstallationDetector CudaInstallation(D, Triple, Args);
+  if (CudaInstallation.isValid()) {
+    StringRef GpuArch = Args.getLastArgValue(options::OPT_march_EQ);
+    if (!GpuArch.empty()) {
+      std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(GpuArch);
+      if (!LibDeviceFile.empty()) {
+        CmdArgs.push_back("-mlink-builtin-bitcode");
+        CmdArgs.push_back(Args.MakeArgString(LibDeviceFile));
+      }
+    }
+  }
+}
+
----------------
Jason-Van-Beusekom wrote:

No, if I replace this with:
```c++
void Flang::AddNVPTXTargetArgs(const ArgList &Args,
                               ArgStringList &CmdArgs) const {

  const ToolChain &TC = getToolChain();
  TC.addClangTargetOptions(Args, CmdArgs, Action::OffloadKind::OFK_OpenMP);
}
```

You get:
```bash
flang -fopenmp -fopenmp-targets=nvptx64 test.f90
error: unknown argument: '-fcuda-is-device'
error: unknown argument: '-fno-threadsafe-statics'
error: unknown argument: '-target-sdk-version=12.9'
```
And in Cuda.cpp:
```c++
void CudaToolChain::addClangTargetOptions(
    const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
    Action::OffloadKind DeviceOffloadingKind) const {
  HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);

  StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
  assert((DeviceOffloadingKind == Action::OFK_OpenMP ||
          DeviceOffloadingKind == Action::OFK_Cuda) &&
         "Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");

  CC1Args.append({"-fcuda-is-device", "-mllvm",
                  "-enable-memcpyopt-without-libcalls",
                  "-fno-threadsafe-statics"});
...
```

https://github.com/llvm/llvm-project/pull/180060
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to