[clang] 1d97cb1 - [HIP] Emit amdgpu_code_object_version module flag
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 8 18:59:01 PST 2022
Author: Yaxun (Sam) Liu
Date: 2022-02-08T21:58:40-05:00
New Revision: 1d97cb1f6e44a77cfc6911b916656e3c5de9bec8
URL: https://github.com/llvm/llvm-project/commit/1d97cb1f6e44a77cfc6911b916656e3c5de9bec8
DIFF: https://github.com/llvm/llvm-project/commit/1d97cb1f6e44a77cfc6911b916656e3c5de9bec8.diff
LOG: [HIP] Emit amdgpu_code_object_version module flag
code object version determines ABI, therefore should not be mixed.
This patch emits amdgpu_code_object_version module flag in LLVM IR
based on code object version (default 4).
The amdgpu_code_object_version value is code object version times 100.
LLVM IR with different amdgpu_code_object_version module flag cannot
be linked.
The -cc1 option -mcode-object-version=none is for ROCm device library use
only, which supports multiple ABI.
Reviewed by: Artem Belevich
Differential Revision: https://reviews.llvm.org/D119026
Added:
clang/test/CodeGenCUDA/amdgpu-code-object-version.cu
Modified:
clang/include/clang/Basic/TargetOptions.h
clang/include/clang/Driver/Options.td
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/CodeGenCUDA/amdgpu-asan-printf.cu
clang/test/CodeGenCUDA/amdgpu-asan.cu
clang/test/Driver/hip-code-object-version.hip
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/TargetOptions.h b/clang/include/clang/Basic/TargetOptions.h
index 696abf4ca4733..009f25981ca93 100644
--- a/clang/include/clang/Basic/TargetOptions.h
+++ b/clang/include/clang/Basic/TargetOptions.h
@@ -78,6 +78,18 @@ class TargetOptions {
/// \brief If enabled, allow AMDGPU unsafe floating point atomics.
bool AllowAMDGPUUnsafeFPAtomics = false;
+ /// \brief Enumeration value for AMDGPU code object version, which is the
+ /// code object version times 100.
+ enum CodeObjectVersionKind {
+ COV_None,
+ COV_2 = 200,
+ COV_3 = 300,
+ COV_4 = 400,
+ COV_5 = 500,
+ };
+ /// \brief Code object version for AMDGPU.
+ CodeObjectVersionKind CodeObjectVersion;
+
// The code model to be used as specified by the user. Corresponds to
// CodeModel::Model enum defined in include/llvm/Support/CodeGen.h, plus
// "default" for the case when the user has not explicitly specified a
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 313ff79e26459..1900d0f782de6 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3450,8 +3450,12 @@ defm amdgpu_ieee : BoolOption<"m", "amdgpu-ieee",
NegFlag<SetFalse, [CC1Option]>>, Group<m_Group>;
def mcode_object_version_EQ : Joined<["-"], "mcode-object-version=">, Group<m_Group>,
- HelpText<"Specify code object ABI version. Defaults to 4. (AMDGPU only)">,
- MetaVarName<"<version>">, Values<"2,3,4,5">;
+ HelpText<"Specify code object ABI version. Allowed values are 2, 3, 4, and 5. Defaults to 4. (AMDGPU only)">,
+ Flags<[CC1Option]>,
+ Values<"none,2,3,4,5">,
+ NormalizedValuesScope<"TargetOptions">,
+ NormalizedValues<["COV_None", "COV_2", "COV_3", "COV_4", "COV_5"]>,
+ MarshallingInfoEnum<TargetOpts<"CodeObjectVersion">, "COV_4">;
defm code_object_v3_legacy : SimpleMFlag<"code-object-v3",
"Legacy option to specify code object ABI V3",
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index a8f0892f0e8f4..8a7345a9f494a 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -552,21 +552,32 @@ void CodeGenModule::Release() {
EmitMainVoidAlias();
}
- // Emit reference of __amdgpu_device_library_preserve_asan_functions to
- // preserve ASAN functions in bitcode libraries.
- if (LangOpts.Sanitize.has(SanitizerKind::Address) && getTriple().isAMDGPU()) {
- auto *FT = llvm::FunctionType::get(VoidTy, {});
- auto *F = llvm::Function::Create(
- FT, llvm::GlobalValue::ExternalLinkage,
- "__amdgpu_device_library_preserve_asan_functions", &getModule());
- auto *Var = new llvm::GlobalVariable(
- getModule(), FT->getPointerTo(),
- /*isConstant=*/true, llvm::GlobalValue::WeakAnyLinkage, F,
- "__amdgpu_device_library_preserve_asan_functions_ptr", nullptr,
- llvm::GlobalVariable::NotThreadLocal);
- addCompilerUsedGlobal(Var);
- if (!getModule().getModuleFlag("amdgpu_hostcall")) {
- getModule().addModuleFlag(llvm::Module::Override, "amdgpu_hostcall", 1);
+ if (getTriple().isAMDGPU()) {
+ // Emit reference of __amdgpu_device_library_preserve_asan_functions to
+ // preserve ASAN functions in bitcode libraries.
+ if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
+ auto *FT = llvm::FunctionType::get(VoidTy, {});
+ auto *F = llvm::Function::Create(
+ FT, llvm::GlobalValue::ExternalLinkage,
+ "__amdgpu_device_library_preserve_asan_functions", &getModule());
+ auto *Var = new llvm::GlobalVariable(
+ getModule(), FT->getPointerTo(),
+ /*isConstant=*/true, llvm::GlobalValue::WeakAnyLinkage, F,
+ "__amdgpu_device_library_preserve_asan_functions_ptr", nullptr,
+ llvm::GlobalVariable::NotThreadLocal);
+ addCompilerUsedGlobal(Var);
+ if (!getModule().getModuleFlag("amdgpu_hostcall")) {
+ getModule().addModuleFlag(llvm::Module::Override, "amdgpu_hostcall", 1);
+ }
+ }
+ // Emit amdgpu_code_object_version module flag, which is code object version
+ // times 100.
+ // ToDo: Enable module flag for all code object version when ROCm device
+ // library is ready.
+ if (getTarget().getTargetOpts().CodeObjectVersion == TargetOptions::COV_5) {
+ getModule().addModuleFlag(llvm::Module::Error,
+ "amdgpu_code_object_version",
+ getTarget().getTargetOpts().CodeObjectVersion);
}
}
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index a9c0263cc4ab6..f71ce69ae6163 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1150,7 +1150,8 @@ static const char *RelocationModelName(llvm::Reloc::Model Model) {
}
static void handleAMDGPUCodeObjectVersionOptions(const Driver &D,
const ArgList &Args,
- ArgStringList &CmdArgs) {
+ ArgStringList &CmdArgs,
+ bool IsCC1As = false) {
// If no version was requested by the user, use the default value from the
// back end. This is consistent with the value returned from
// getAMDGPUCodeObjectVersion. This lets clang emit IR for amdgpu without
@@ -1162,6 +1163,11 @@ static void handleAMDGPUCodeObjectVersionOptions(const Driver &D,
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)
+ CmdArgs.insert(CmdArgs.begin() + 1,
+ Args.MakeArgString(Twine("-mcode-object-version=") +
+ Twine(CodeObjVer)));
}
}
@@ -7901,7 +7907,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
}
if (Triple.isAMDGPU())
- handleAMDGPUCodeObjectVersionOptions(D, Args, CmdArgs);
+ handleAMDGPUCodeObjectVersionOptions(D, Args, CmdArgs, /*IsCC1As=*/true);
assert(Input.isFilename() && "Invalid input.");
CmdArgs.push_back(Input.getFilename());
diff --git a/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu b/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu
index 54dbe5bed4475..69246f9ce7af1 100644
--- a/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu
+++ b/clang/test/CodeGenCUDA/amdgpu-asan-printf.cu
@@ -2,8 +2,7 @@
// RUN: -fcuda-is-device -target-cpu gfx906 -fsanitize=address \
// RUN: -O3 -x hip | FileCheck -check-prefixes=MFCHECK %s
-// MFCHECK: !llvm.module.flags = !{![[FLAG1:[0-9]+]], ![[FLAG2:[0-9]+]]}
-// MFCHECK: ![[FLAG1]] = !{i32 4, !"amdgpu_hostcall", i32 1}
+// MFCHECK: !{{.*}} = !{i32 4, !"amdgpu_hostcall", i32 1}
// Test to check hostcall module flag metadata is generated correctly
// when a program has printf call and compiled with -fsanitize=address.
diff --git a/clang/test/CodeGenCUDA/amdgpu-asan.cu b/clang/test/CodeGenCUDA/amdgpu-asan.cu
index d63e3cf12a74c..31fb1646d9732 100644
--- a/clang/test/CodeGenCUDA/amdgpu-asan.cu
+++ b/clang/test/CodeGenCUDA/amdgpu-asan.cu
@@ -27,8 +27,7 @@
// ASAN-DAG: @llvm.compiler.used = {{.*}}@__amdgpu_device_library_preserve_asan_functions_ptr
// ASAN-DAG: define weak void @__asan_report_load1(i64 %{{.*}})
-// MFCHECK: !llvm.module.flags = !{![[FLAG1:[0-9]+]], ![[FLAG2:[0-9]+]]}
-// MFCHECK: ![[FLAG1]] = !{i32 4, !"amdgpu_hostcall", i32 1}
+// MFCHECK: !{{.*}} = !{i32 4, !"amdgpu_hostcall", i32 1}
// CHECK-NOT: @__amdgpu_device_library_preserve_asan_functions
// CHECK-NOT: @__asan_report_load1
diff --git a/clang/test/CodeGenCUDA/amdgpu-code-object-version.cu b/clang/test/CodeGenCUDA/amdgpu-code-object-version.cu
new file mode 100644
index 0000000000000..e828fd9aabc8c
--- /dev/null
+++ b/clang/test/CodeGenCUDA/amdgpu-code-object-version.cu
@@ -0,0 +1,26 @@
+// Create module flag for code object version.
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -o - %s | FileCheck %s -check-prefix=NONE
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=2 -o - %s | FileCheck -check-prefix=NONE %s
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=3 -o - %s | FileCheck -check-prefix=NONE %s
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=4 -o - %s | FileCheck -check-prefix=NONE %s
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=5 -o - %s | FileCheck -check-prefix=V5 %s
+
+// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=none -o - %s | FileCheck %s -check-prefix=NONE
+
+// RUN: not %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
+// RUN: -mcode-object-version=4.1 -o - %s 2>&1| FileCheck %s -check-prefix=INV
+
+// V5: !{{.*}} = !{i32 1, !"amdgpu_code_object_version", i32 500}
+// NONE-NOT: !{{.*}} = !{i32 1, !"amdgpu_code_object_version",
+// INV: error: invalid value '4.1' in '-mcode-object-version=4.1'
diff --git a/clang/test/Driver/hip-code-object-version.hip b/clang/test/Driver/hip-code-object-version.hip
index 61a54ebfc12ef..3263bf47431dc 100644
--- a/clang/test/Driver/hip-code-object-version.hip
+++ b/clang/test/Driver/hip-code-object-version.hip
@@ -34,6 +34,7 @@
// RUN: %s 2>&1 | FileCheck -check-prefix=V3 %s
// V3-WARN: warning: argument '-mcode-object-v3' is deprecated, use '-mcode-object-version=3' instead [-Wdeprecated]
+// V3: "-mcode-object-version=3"
// V3: "-mllvm" "--amdhsa-code-object-version=3"
// V3: "-targets=host-x86_64-unknown-linux,hip-amdgcn-amd-amdhsa--gfx906"
@@ -44,6 +45,7 @@
// RUN: --offload-arch=gfx906 -nogpulib \
// RUN: %s 2>&1 | FileCheck -check-prefix=V4 %s
+// V4: "-mcode-object-version=4"
// V4: "-mllvm" "--amdhsa-code-object-version=4"
// V4: "-targets=host-x86_64-unknown-linux,hipv4-amdgcn-amd-amdhsa--gfx906"
@@ -54,6 +56,7 @@
// RUN: --offload-arch=gfx906 -nogpulib \
// RUN: %s 2>&1 | FileCheck -check-prefix=V5 %s
+// V5: "-mcode-object-version=5"
// V5: "-mllvm" "--amdhsa-code-object-version=5"
// V5: "-targets=host-x86_64-unknown-linux,hipv4-amdgcn-amd-amdhsa--gfx906"
@@ -74,6 +77,25 @@
// INVALID: error: invalid integral value '1' in '-mcode-object-version=1'
// INVALID-NOT: error: invalid integral value
+// Check LLVM code object version option --amdhsa-code-object-version
+// is passed to -cc1 and -cc1as, and -mcode-object-version is passed
+// to -cc1 but not -cc1as.
+
+// RUN: %clang -### -target x86_64-linux-gnu \
+// RUN: -mcode-object-version=5 \
+// RUN: --offload-arch=gfx906 -nogpulib -save-temps \
+// RUN: %s 2>&1 | FileCheck -check-prefix=CC1 %s
+
+// CC1: "-cc1" {{.*}}"-mcode-object-version=5" {{.*}}"-mllvm" "--amdhsa-code-object-version=5"
+// CC1: "-cc1as" {{.*}}"-mllvm" "--amdhsa-code-object-version=5"
+
+// RUN: %clang -### -target x86_64-linux-gnu \
+// RUN: -mcode-object-version=5 \
+// RUN: --offload-arch=gfx906 -nogpulib -save-temps \
+// RUN: %s 2>&1 | FileCheck -check-prefix=CC1NEG %s
+
+// CC1NEG-NOT: "-cc1as" {{.*}}"-mcode-object-version=5"
+
// Check warnings are emitted for legacy options before -mcode-object-version options.
// Check warnings are emitted only once.
More information about the cfe-commits
mailing list