Skip to content

Commit a17d496

Browse files
authored
[Flang][Driver][AMDGPU] Fix -mcode-object-version (#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.
1 parent a9a7b71 commit a17d496

File tree

5 files changed

+44
-1
lines changed

5 files changed

+44
-1
lines changed

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ void Flang::AddAMDGPUTargetArgs(const ArgList &Args,
420420
if (Arg *A = Args.getLastArg(options::OPT_mcode_object_version_EQ)) {
421421
StringRef Val = A->getValue();
422422
CmdArgs.push_back(Args.MakeArgString("-mcode-object-version=" + Val));
423+
CmdArgs.push_back(Args.MakeArgString("-mllvm"));
424+
CmdArgs.push_back(
425+
Args.MakeArgString("--amdhsa-code-object-version=" + Val));
423426
}
424427

425428
const ToolChain &TC = getToolChain();

flang/include/flang/Frontend/CodeGenOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class CodeGenOptions : public CodeGenOptionsBase {
9595

9696
/// \brief Code object version for AMDGPU.
9797
llvm::CodeObjectVersionKind CodeObjectVersion =
98-
llvm::CodeObjectVersionKind::COV_5;
98+
llvm::CodeObjectVersionKind::COV_None;
9999

100100
/// Optimization remark with an optional regular expression pattern.
101101
struct OptRemark {

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,17 @@ void CodeGenAction::generateLLVMIR() {
804804
llvmModule->addModuleFlag(
805805
llvm::Module::Error, "target-abi",
806806
llvm::MDString::get(llvmModule->getContext(), targetOpts.abi));
807+
808+
if (triple.isAMDGPU() ||
809+
(triple.isSPIRV() && triple.getVendor() == llvm::Triple::AMD)) {
810+
// Emit amdhsa_code_object_version module flag, which is code object version
811+
// times 100.
812+
if (opts.CodeObjectVersion != llvm::CodeObjectVersionKind::COV_None) {
813+
llvmModule->addModuleFlag(llvm::Module::Error,
814+
"amdhsa_code_object_version",
815+
opts.CodeObjectVersion);
816+
}
817+
}
807818
}
808819

809820
static std::unique_ptr<llvm::raw_pwrite_stream>

flang/test/Driver/code-object-version.f90

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,12 @@
55
! RUN: %flang -target x86_64-unknown-linux-gnu -mcode-object-version=3 -S %s -o \
66
! RUN: /dev/null 2>&1 | FileCheck --check-prefix=UNUSED_PARAM %s
77

8+
! RUN: %flang -target amdgcn-amd-amdhsa -mcpu=gfx908 -mcode-object-version=5 -nogpulib -c %s -### 2>&1 \
9+
! RUN: | FileCheck %s -check-prefix=VALID_USE
10+
811
! INVALID_VERSION: error: invalid integral value '3' in '-mcode-object-version=3'
912
! UNUSED_PARAM: warning: argument unused during compilation: '-mcode-object-version=3' [-Wunused-command-line-argument]
13+
14+
! VALID_USE: "-fc1" "-triple" "amdgcn-amd-amdhsa"
15+
! VALID_USE-SAME: "-mcode-object-version=5"
16+
! VALID_USE-SAME: "-mllvm" "--amdhsa-code-object-version=5"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
!REQUIRES: amdgpu-registered-target
2+
3+
!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 %s -o - | FileCheck --check-prefix=COV-DEFAULT %s
4+
!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 -mcode-object-version=none %s -o - | FileCheck --check-prefix=COV-NONE %s
5+
!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 -mcode-object-version=4 %s -o - | FileCheck --check-prefix=COV-4 %s
6+
!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 -mcode-object-version=5 %s -o - | FileCheck --check-prefix=COV-5 %s
7+
!RUN: %flang_fc1 -emit-llvm -triple amdgcn-amd-amdhsa -target-cpu gfx908 -mcode-object-version=6 %s -o - | FileCheck --check-prefix=COV-6 %s
8+
9+
!COV-DEFAULT-NOT: !{{.*}} = !{{{.*}}, !"amdhsa_code_object_version", {{.*}}}
10+
!COV-NONE-NOT: !{{.*}} = !{{{.*}}, !"amdhsa_code_object_version", {{.*}}}
11+
12+
!COV-4: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
13+
!COV-4: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 400}
14+
15+
!COV-5: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
16+
!COV-5: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 500}
17+
18+
!COV-6: !llvm.module.flags = !{{{.*}}, ![[COV_FLAG:.*]]}
19+
!COV-6: ![[COV_FLAG]] = !{i32 1, !"amdhsa_code_object_version", i32 600}
20+
21+
subroutine target_simple
22+
end subroutine

0 commit comments

Comments
 (0)