https://github.com/skatrak created 
https://github.com/llvm/llvm-project/pull/134230

This patch updates flang to follow clang's behavior when processing the 
`-mcode-object-version option`.

It is now used to populate an LLVM module flag called 
`amdhsa_code_object_version` expected by the backend and also updates the 
driver to add the `--amdhsa-code-object-version` option to the frontend 
invocation for device compilation of AMDGPU targets.

>From 5a3bf580e8c22b9813c082d1249b9b99823241f1 Mon Sep 17 00:00:00 2001
From: Sergio Afonso <safon...@amd.com>
Date: Wed, 2 Apr 2025 16:34:38 +0100
Subject: [PATCH] [Flang][OpenMP][Driver][AMDGPU] Fix -mcode-object-version

This patch updates flang to follow clang's behavior when processing the
`-mcode-object-version option`.

It is now used to populate an LLVM module flag called
`amdhsa_code_object_version` expected by the backend and also updates the
driver to add the `--amdhsa-code-object-version` option to the frontend
invocation for device compilation of AMDGPU targets.
---
 clang/lib/Driver/ToolChains/Flang.cpp         |  3 +++
 flang/include/flang/Frontend/CodeGenOptions.h |  2 +-
 flang/lib/Frontend/FrontendActions.cpp        | 11 ++++++++++
 flang/test/Driver/code-object-version.f90     |  7 ++++++
 .../amdgpu-code-object-version.f90            | 22 +++++++++++++++++++
 5 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 flang/test/Integration/amdgpu-code-object-version.f90

diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index 8312234e33a64..82d5201e4f337 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -410,6 +410,9 @@ void Flang::AddAMDGPUTargetArgs(const ArgList &Args,
   if (Arg *A = Args.getLastArg(options::OPT_mcode_object_version_EQ)) {
     StringRef Val = A->getValue();
     CmdArgs.push_back(Args.MakeArgString("-mcode-object-version=" + Val));
+    CmdArgs.push_back(Args.MakeArgString("-mllvm"));
+    CmdArgs.push_back(
+        Args.MakeArgString("--amdhsa-code-object-version=" + Val));
   }
 
   const ToolChain &TC = getToolChain();
diff --git a/flang/include/flang/Frontend/CodeGenOptions.h 
b/flang/include/flang/Frontend/CodeGenOptions.h
index 23d99e1f0897a..2b4e823b3fef4 100644
--- a/flang/include/flang/Frontend/CodeGenOptions.h
+++ b/flang/include/flang/Frontend/CodeGenOptions.h
@@ -95,7 +95,7 @@ class CodeGenOptions : public CodeGenOptionsBase {
 
   /// \brief Code object version for AMDGPU.
   llvm::CodeObjectVersionKind CodeObjectVersion =
-      llvm::CodeObjectVersionKind::COV_5;
+      llvm::CodeObjectVersionKind::COV_None;
 
   /// Optimization remark with an optional regular expression pattern.
   struct OptRemark {
diff --git a/flang/lib/Frontend/FrontendActions.cpp 
b/flang/lib/Frontend/FrontendActions.cpp
index bd2c0632cb35d..d304e74f34f5c 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -804,6 +804,17 @@ void CodeGenAction::generateLLVMIR() {
     llvmModule->addModuleFlag(
         llvm::Module::Error, "target-abi",
         llvm::MDString::get(llvmModule->getContext(), targetOpts.abi));
+
+  if (triple.isAMDGPU() ||
+      (triple.isSPIRV() && triple.getVendor() == llvm::Triple::AMD)) {
+    // Emit amdhsa_code_object_version module flag, which is code object 
version
+    // times 100.
+    if (opts.CodeObjectVersion != llvm::CodeObjectVersionKind::COV_None) {
+      llvmModule->addModuleFlag(llvm::Module::Error,
+                                "amdhsa_code_object_version",
+                                opts.CodeObjectVersion);
+    }
+  }
 }
 
 static std::unique_ptr<llvm::raw_pwrite_stream>
diff --git a/flang/test/Driver/code-object-version.f90 
b/flang/test/Driver/code-object-version.f90
index e10877563c4d0..430cc864d03ec 100644
--- a/flang/test/Driver/code-object-version.f90
+++ b/flang/test/Driver/code-object-version.f90
@@ -5,5 +5,12 @@
 ! RUN: %flang  -target  x86_64-unknown-linux-gnu -mcode-object-version=3  -S  
%s -o \
 ! RUN:   /dev/null 2>&1 | FileCheck  --check-prefix=UNUSED_PARAM %s
 
+! RUN: %flang -target amdgcn-amd-amdhsa -mcpu=gfx908 -mcode-object-version=5 
-nogpulib -c %s -### 2>&1 \
+! RUN: | FileCheck %s -check-prefix=VALID_USE
+
 ! INVALID_VERSION: error: invalid integral value '3' in 
'-mcode-object-version=3'
 ! UNUSED_PARAM: warning: argument unused during compilation: 
'-mcode-object-version=3' [-Wunused-command-line-argument]
+
+! VALID_USE: "-fc1" "-triple" "amdgcn-amd-amdhsa"
+! VALID_USE-SAME: "-mcode-object-version=5"
+! VALID_USE-SAME: "-mllvm" "--amdhsa-code-object-version=5"
diff --git a/flang/test/Integration/amdgpu-code-object-version.f90 
b/flang/test/Integration/amdgpu-code-object-version.f90
new file mode 100644
index 0000000000000..c5194d2007f2a
--- /dev/null
+++ b/flang/test/Integration/amdgpu-code-object-version.f90
@@ -0,0 +1,22 @@
+!REQUIRES: amdgpu-registered-target
+
+!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 %s -o 
- | FileCheck --check-prefix=COV-DEFAULT %s
+!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 
-mcode-object-version=none %s -o - | FileCheck --check-prefix=COV-NONE %s
+!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 
-mcode-object-version=4 %s -o - | FileCheck --check-prefix=COV-4 %s
+!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 
-mcode-object-version=5 %s -o - | FileCheck --check-prefix=COV-5 %s
+!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 
-mcode-object-version=6 %s -o - | FileCheck --check-prefix=COV-6 %s
+
+!COV-DEFAULT-NOT: !{{.*}} = !{{{.*}}, !"amdhsa_code_object_version", {{.*}}}
+!COV-NONE-NOT: !{{.*}} = !{{{.*}}, !"amdhsa_code_object_version", {{.*}}}
+
+!COV-4: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
+!COV-4: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 400}
+
+!COV-5: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
+!COV-5: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 500}
+
+!COV-6: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
+!COV-6: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 600}
+
+subroutine target_simple
+end subroutine

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to