Skip to content

Commit 4428b01

Browse files
committed
Reland: [AMDGPU] Remove Code Object V3 (#67118)
V3 has been deprecated for a while as well, so it can safely be removed like V2 was removed. - [Clang] Set minimum code object version to 4 - [lld] Fix tests using code object v3 - Remove code object V3 from the AMDGPU backend, and delete or port v3 tests to v4. - Update docs to make it clear V3 can no longer be emitted.
1 parent 1b45fe5 commit 4428b01

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+257
-2280
lines changed

clang/include/clang/Basic/TargetOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class TargetOptions {
8383
enum CodeObjectVersionKind {
8484
COV_None,
8585
COV_2 = 200, // Unsupported.
86-
COV_3 = 300,
86+
COV_3 = 300, // Unsupported.
8787
COV_4 = 400,
8888
COV_5 = 500,
8989
};

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4681,9 +4681,9 @@ defm amdgpu_ieee : BoolOption<"m", "amdgpu-ieee",
46814681
def mcode_object_version_EQ : Joined<["-"], "mcode-object-version=">, Group<m_Group>,
46824682
HelpText<"Specify code object ABI version. Defaults to 4. (AMDGPU only)">,
46834683
Visibility<[ClangOption, CC1Option]>,
4684-
Values<"none,3,4,5">,
4684+
Values<"none,4,5">,
46854685
NormalizedValuesScope<"TargetOptions">,
4686-
NormalizedValues<["COV_None", "COV_3", "COV_4", "COV_5"]>,
4686+
NormalizedValues<["COV_None", "COV_4", "COV_5"]>,
46874687
MarshallingInfoEnum<TargetOpts<"CodeObjectVersion">, "COV_4">;
46884688

46894689
defm cumode : SimpleMFlag<"cumode",

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2349,7 +2349,7 @@ getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args) {
23492349

23502350
void tools::checkAMDGPUCodeObjectVersion(const Driver &D,
23512351
const llvm::opt::ArgList &Args) {
2352-
const unsigned MinCodeObjVer = 3;
2352+
const unsigned MinCodeObjVer = 4;
23532353
const unsigned MaxCodeObjVer = 5;
23542354

23552355
if (auto *CodeObjArg = getAMDGPUCodeObjectArgument(D, Args)) {

clang/test/CodeGenCUDA/amdgpu-code-object-version.cu

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
44
// RUN: -o - %s | FileCheck %s -check-prefix=V4
55

6-
// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
7-
// RUN: -mcode-object-version=3 -o - %s | FileCheck -check-prefix=V3 %s
8-
96
// RUN: %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
107
// RUN: -mcode-object-version=4 -o - %s | FileCheck -check-prefix=V4 %s
118

@@ -18,7 +15,6 @@
1815
// RUN: not %clang_cc1 -fcuda-is-device -triple amdgcn-amd-amdhsa -emit-llvm \
1916
// RUN: -mcode-object-version=4.1 -o - %s 2>&1| FileCheck %s -check-prefix=INV
2017

21-
// V3: !{{.*}} = !{i32 1, !"amdgpu_code_object_version", i32 300}
2218
// V4: !{{.*}} = !{i32 1, !"amdgpu_code_object_version", i32 400}
2319
// V5: !{{.*}} = !{i32 1, !"amdgpu_code_object_version", i32 500}
2420
// NONE-NOT: !{{.*}} = !{i32 1, !"amdgpu_code_object_version",

clang/test/Driver/hip-code-object-version.hip

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,5 @@
11
// REQUIRES: amdgpu-registered-target
22

3-
// Check bundle ID for code object v3.
4-
5-
// RUN: not %clang -### --target=x86_64-linux-gnu \
6-
// RUN: -mcode-object-version=3 \
7-
// RUN: --offload-arch=gfx906 --rocm-path=%S/Inputs/rocm \
8-
// RUN: %s 2>&1 | FileCheck -check-prefix=V3 %s
9-
10-
// RUN: not %clang -### --target=x86_64-linux-gnu \
11-
// RUN: -mcode-object-version=4 -mcode-object-version=3 \
12-
// RUN: --offload-arch=gfx906 --rocm-path=%S/Inputs/rocm \
13-
// RUN: %s 2>&1 | FileCheck -check-prefix=V3 %s
14-
15-
// V3: "-mcode-object-version=3"
16-
// V3: "-mllvm" "--amdhsa-code-object-version=3"
17-
// V3: "-targets=host-x86_64-unknown-linux,hip-amdgcn-amd-amdhsa--gfx906"
183

194
// Check bundle ID for code object version 4.
205

@@ -62,6 +47,13 @@
6247
// INVALID_2: error: invalid integral value '2' in '-mcode-object-version=2'
6348
// INVALID_2-NOT: error: invalid integral value
6449

50+
// RUN: not %clang -### --target=x86_64-linux-gnu \
51+
// RUN: -mcode-object-version=3 \
52+
// RUN: --offload-arch=gfx906 --rocm-path=%S/Inputs/rocm \
53+
// RUN: %s 2>&1 | FileCheck -check-prefix=INVALID_3 %s
54+
// INVALID_3: error: invalid integral value '3' in '-mcode-object-version=3'
55+
// INVALID_3-NOT: error: invalid integral value
56+
6557
// Check LLVM code object version option --amdhsa-code-object-version
6658
// is passed to -cc1 and -cc1as, and -mcode-object-version is passed
6759
// to -cc1 but not -cc1as.

clang/test/Driver/hip-device-libs.hip

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,6 @@
168168
// RUN: --rocm-path=%S/Inputs/rocm %S/Inputs/hip_multiple_inputs/b.hip \
169169
// RUN: 2>&1 | FileCheck %s --check-prefixes=NOABI4
170170

171-
// Test -mcode-object-version=3
172-
// RUN: %clang -### --target=x86_64-linux-gnu --offload-arch=gfx900 \
173-
// RUN: -mcode-object-version=3 \
174-
// RUN: --rocm-path=%S/Inputs/rocm %S/Inputs/hip_multiple_inputs/b.hip \
175-
// RUN: 2>&1 | FileCheck %s --check-prefixes=ABI4
176-
177171
// Test -mcode-object-version=4
178172
// RUN: %clang -### --target=x86_64-linux-gnu --offload-arch=gfx900 \
179173
// RUN: -mcode-object-version=4 \

lld/test/ELF/amdgpu-abi-version.s

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
# REQUIRES: amdgpu
2-
# RUN: llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=3 -filetype=obj %s -o %t.o
3-
# RUN: ld.lld -shared %t.o -o %t.so
4-
# RUN: llvm-readobj --file-headers %t.so | FileCheck --check-prefix=COV3 %s
5-
6-
# COV3: OS/ABI: AMDGPU_HSA (0x40)
7-
# COV3: ABIVersion: 1
8-
91
# RUN: llvm-mc -triple amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=4 -filetype=obj %s -o %t.o
102
# RUN: ld.lld -shared %t.o -o %t.so
113
# RUN: llvm-readobj --file-headers %t.so | FileCheck --check-prefix=COV4 %s

llvm/docs/AMDGPUUsage.rst

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1462,12 +1462,10 @@ The AMDGPU backend uses the following ELF header:
14621462
object conforms:
14631463

14641464
* ``ELFABIVERSION_AMDGPU_HSA_V2`` is used to specify the version of AMD HSA
1465-
runtime ABI for code object V2. Specify using the Clang option
1466-
``-mcode-object-version=2``.
1465+
runtime ABI for code object V2. Can no longer be emitted by this version of LLVM.
14671466

14681467
* ``ELFABIVERSION_AMDGPU_HSA_V3`` is used to specify the version of AMD HSA
1469-
runtime ABI for code object V3. Specify using the Clang option
1470-
``-mcode-object-version=3``.
1468+
runtime ABI for code object V3. Can no longer be emitted by this version of LLVM.
14711469

14721470
* ``ELFABIVERSION_AMDGPU_HSA_V4`` is used to specify the version of AMD HSA
14731471
runtime ABI for code object V4. Specify using the Clang option
@@ -3455,8 +3453,7 @@ Code Object V3 Metadata
34553453
+++++++++++++++++++++++
34563454

34573455
.. warning::
3458-
Code object V3 is not the default code object version emitted by this version
3459-
of LLVM.
3456+
Code object V3 generation is no longer supported by this version of LLVM.
34603457

34613458
Code object V3 and above metadata is specified by the ``NT_AMDGPU_METADATA`` note
34623459
record (see :ref:`amdgpu-note-records-v3-onwards`).

llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,6 @@ bool AMDGPUAsmPrinter::doInitialization(Module &M) {
327327

328328
if (TM.getTargetTriple().getOS() == Triple::AMDHSA) {
329329
switch (CodeObjectVersion) {
330-
case AMDGPU::AMDHSA_COV3:
331-
HSAMetadataStream.reset(new HSAMD::MetadataStreamerMsgPackV3());
332-
break;
333330
case AMDGPU::AMDHSA_COV4:
334331
HSAMetadataStream.reset(new HSAMD::MetadataStreamerMsgPackV4());
335332
break;

llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ namespace AMDGPU {
4949
namespace HSAMD {
5050

5151
//===----------------------------------------------------------------------===//
52-
// HSAMetadataStreamerV3
52+
// HSAMetadataStreamerV4
5353
//===----------------------------------------------------------------------===//
5454

55-
void MetadataStreamerMsgPackV3::dump(StringRef HSAMetadataString) const {
55+
void MetadataStreamerMsgPackV4::dump(StringRef HSAMetadataString) const {
5656
errs() << "AMDGPU HSA Metadata:\n" << HSAMetadataString << '\n';
5757
}
5858

59-
void MetadataStreamerMsgPackV3::verify(StringRef HSAMetadataString) const {
59+
void MetadataStreamerMsgPackV4::verify(StringRef HSAMetadataString) const {
6060
errs() << "AMDGPU HSA Metadata Parser Test: ";
6161

6262
msgpack::Document FromHSAMetadataString;
@@ -78,15 +78,15 @@ void MetadataStreamerMsgPackV3::verify(StringRef HSAMetadataString) const {
7878
}
7979

8080
std::optional<StringRef>
81-
MetadataStreamerMsgPackV3::getAccessQualifier(StringRef AccQual) const {
81+
MetadataStreamerMsgPackV4::getAccessQualifier(StringRef AccQual) const {
8282
return StringSwitch<std::optional<StringRef>>(AccQual)
8383
.Case("read_only", StringRef("read_only"))
8484
.Case("write_only", StringRef("write_only"))
8585
.Case("read_write", StringRef("read_write"))
8686
.Default(std::nullopt);
8787
}
8888

89-
std::optional<StringRef> MetadataStreamerMsgPackV3::getAddressSpaceQualifier(
89+
std::optional<StringRef> MetadataStreamerMsgPackV4::getAddressSpaceQualifier(
9090
unsigned AddressSpace) const {
9191
switch (AddressSpace) {
9292
case AMDGPUAS::PRIVATE_ADDRESS:
@@ -107,7 +107,7 @@ std::optional<StringRef> MetadataStreamerMsgPackV3::getAddressSpaceQualifier(
107107
}
108108

109109
StringRef
110-
MetadataStreamerMsgPackV3::getValueKind(Type *Ty, StringRef TypeQual,
110+
MetadataStreamerMsgPackV4::getValueKind(Type *Ty, StringRef TypeQual,
111111
StringRef BaseTypeName) const {
112112
if (TypeQual.contains("pipe"))
113113
return "pipe";
@@ -134,7 +134,7 @@ MetadataStreamerMsgPackV3::getValueKind(Type *Ty, StringRef TypeQual,
134134
: "by_value");
135135
}
136136

137-
std::string MetadataStreamerMsgPackV3::getTypeName(Type *Ty,
137+
std::string MetadataStreamerMsgPackV4::getTypeName(Type *Ty,
138138
bool Signed) const {
139139
switch (Ty->getTypeID()) {
140140
case Type::IntegerTyID: {
@@ -173,7 +173,7 @@ std::string MetadataStreamerMsgPackV3::getTypeName(Type *Ty,
173173
}
174174

175175
msgpack::ArrayDocNode
176-
MetadataStreamerMsgPackV3::getWorkGroupDimensions(MDNode *Node) const {
176+
MetadataStreamerMsgPackV4::getWorkGroupDimensions(MDNode *Node) const {
177177
auto Dims = HSAMetadataDoc->getArrayNode();
178178
if (Node->getNumOperands() != 3)
179179
return Dims;
@@ -184,14 +184,20 @@ MetadataStreamerMsgPackV3::getWorkGroupDimensions(MDNode *Node) const {
184184
return Dims;
185185
}
186186

187-
void MetadataStreamerMsgPackV3::emitVersion() {
187+
void MetadataStreamerMsgPackV4::emitVersion() {
188188
auto Version = HSAMetadataDoc->getArrayNode();
189-
Version.push_back(Version.getDocument()->getNode(VersionMajorV3));
190-
Version.push_back(Version.getDocument()->getNode(VersionMinorV3));
189+
Version.push_back(Version.getDocument()->getNode(VersionMajorV4));
190+
Version.push_back(Version.getDocument()->getNode(VersionMinorV4));
191191
getRootMetadata("amdhsa.version") = Version;
192192
}
193193

194-
void MetadataStreamerMsgPackV3::emitPrintf(const Module &Mod) {
194+
void MetadataStreamerMsgPackV4::emitTargetID(
195+
const IsaInfo::AMDGPUTargetID &TargetID) {
196+
getRootMetadata("amdhsa.target") =
197+
HSAMetadataDoc->getNode(TargetID.toString(), /*Copy=*/true);
198+
}
199+
200+
void MetadataStreamerMsgPackV4::emitPrintf(const Module &Mod) {
195201
auto Node = Mod.getNamedMetadata("llvm.printf.fmts");
196202
if (!Node)
197203
return;
@@ -204,7 +210,7 @@ void MetadataStreamerMsgPackV3::emitPrintf(const Module &Mod) {
204210
getRootMetadata("amdhsa.printf") = Printf;
205211
}
206212

207-
void MetadataStreamerMsgPackV3::emitKernelLanguage(const Function &Func,
213+
void MetadataStreamerMsgPackV4::emitKernelLanguage(const Function &Func,
208214
msgpack::MapDocNode Kern) {
209215
// TODO: What about other languages?
210216
auto Node = Func.getParent()->getNamedMetadata("opencl.ocl.version");
@@ -223,7 +229,7 @@ void MetadataStreamerMsgPackV3::emitKernelLanguage(const Function &Func,
223229
Kern[".language_version"] = LanguageVersion;
224230
}
225231

226-
void MetadataStreamerMsgPackV3::emitKernelAttrs(const Function &Func,
232+
void MetadataStreamerMsgPackV4::emitKernelAttrs(const Function &Func,
227233
msgpack::MapDocNode Kern) {
228234

229235
if (auto Node = Func.getMetadata("reqd_work_group_size"))
@@ -248,7 +254,7 @@ void MetadataStreamerMsgPackV3::emitKernelAttrs(const Function &Func,
248254
Kern[".kind"] = Kern.getDocument()->getNode("fini");
249255
}
250256

251-
void MetadataStreamerMsgPackV3::emitKernelArgs(const MachineFunction &MF,
257+
void MetadataStreamerMsgPackV4::emitKernelArgs(const MachineFunction &MF,
252258
msgpack::MapDocNode Kern) {
253259
auto &Func = MF.getFunction();
254260
unsigned Offset = 0;
@@ -261,7 +267,7 @@ void MetadataStreamerMsgPackV3::emitKernelArgs(const MachineFunction &MF,
261267
Kern[".args"] = Args;
262268
}
263269

264-
void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,
270+
void MetadataStreamerMsgPackV4::emitKernelArg(const Argument &Arg,
265271
unsigned &Offset,
266272
msgpack::ArrayDocNode Args) {
267273
auto Func = Arg.getParent();
@@ -326,7 +332,7 @@ void MetadataStreamerMsgPackV3::emitKernelArg(const Argument &Arg,
326332
AccQual, TypeQual);
327333
}
328334

329-
void MetadataStreamerMsgPackV3::emitKernelArg(
335+
void MetadataStreamerMsgPackV4::emitKernelArg(
330336
const DataLayout &DL, Type *Ty, Align Alignment, StringRef ValueKind,
331337
unsigned &Offset, msgpack::ArrayDocNode Args, MaybeAlign PointeeAlign,
332338
StringRef Name, StringRef TypeName, StringRef BaseTypeName,
@@ -375,7 +381,7 @@ void MetadataStreamerMsgPackV3::emitKernelArg(
375381
Args.push_back(Arg);
376382
}
377383

378-
void MetadataStreamerMsgPackV3::emitHiddenKernelArgs(
384+
void MetadataStreamerMsgPackV4::emitHiddenKernelArgs(
379385
const MachineFunction &MF, unsigned &Offset, msgpack::ArrayDocNode Args) {
380386
auto &Func = MF.getFunction();
381387
const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>();
@@ -448,9 +454,10 @@ void MetadataStreamerMsgPackV3::emitHiddenKernelArgs(
448454
}
449455
}
450456

451-
msgpack::MapDocNode MetadataStreamerMsgPackV3::getHSAKernelProps(
452-
const MachineFunction &MF, const SIProgramInfo &ProgramInfo,
453-
unsigned CodeObjectVersion) const {
457+
msgpack::MapDocNode
458+
MetadataStreamerMsgPackV4::getHSAKernelProps(const MachineFunction &MF,
459+
const SIProgramInfo &ProgramInfo,
460+
unsigned CodeObjectVersion) const {
454461
const GCNSubtarget &STM = MF.getSubtarget<GCNSubtarget>();
455462
const SIMachineFunctionInfo &MFI = *MF.getInfo<SIMachineFunctionInfo>();
456463
const Function &F = MF.getFunction();
@@ -495,18 +502,19 @@ msgpack::MapDocNode MetadataStreamerMsgPackV3::getHSAKernelProps(
495502
return Kern;
496503
}
497504

498-
bool MetadataStreamerMsgPackV3::emitTo(AMDGPUTargetStreamer &TargetStreamer) {
505+
bool MetadataStreamerMsgPackV4::emitTo(AMDGPUTargetStreamer &TargetStreamer) {
499506
return TargetStreamer.EmitHSAMetadata(*HSAMetadataDoc, true);
500507
}
501508

502-
void MetadataStreamerMsgPackV3::begin(const Module &Mod,
509+
void MetadataStreamerMsgPackV4::begin(const Module &Mod,
503510
const IsaInfo::AMDGPUTargetID &TargetID) {
504511
emitVersion();
512+
emitTargetID(TargetID);
505513
emitPrintf(Mod);
506514
getRootMetadata("amdhsa.kernels") = HSAMetadataDoc->getArrayNode();
507515
}
508516

509-
void MetadataStreamerMsgPackV3::end() {
517+
void MetadataStreamerMsgPackV4::end() {
510518
std::string HSAMetadataString;
511519
raw_string_ostream StrOS(HSAMetadataString);
512520
HSAMetadataDoc->toYAML(StrOS);
@@ -517,7 +525,7 @@ void MetadataStreamerMsgPackV3::end() {
517525
verify(StrOS.str());
518526
}
519527

520-
void MetadataStreamerMsgPackV3::emitKernel(const MachineFunction &MF,
528+
void MetadataStreamerMsgPackV4::emitKernel(const MachineFunction &MF,
521529
const SIProgramInfo &ProgramInfo) {
522530
auto &Func = MF.getFunction();
523531
if (Func.getCallingConv() != CallingConv::AMDGPU_KERNEL &&
@@ -542,31 +550,6 @@ void MetadataStreamerMsgPackV3::emitKernel(const MachineFunction &MF,
542550
Kernels.push_back(Kern);
543551
}
544552

545-
//===----------------------------------------------------------------------===//
546-
// HSAMetadataStreamerV4
547-
//===----------------------------------------------------------------------===//
548-
549-
void MetadataStreamerMsgPackV4::emitVersion() {
550-
auto Version = HSAMetadataDoc->getArrayNode();
551-
Version.push_back(Version.getDocument()->getNode(VersionMajorV4));
552-
Version.push_back(Version.getDocument()->getNode(VersionMinorV4));
553-
getRootMetadata("amdhsa.version") = Version;
554-
}
555-
556-
void MetadataStreamerMsgPackV4::emitTargetID(
557-
const IsaInfo::AMDGPUTargetID &TargetID) {
558-
getRootMetadata("amdhsa.target") =
559-
HSAMetadataDoc->getNode(TargetID.toString(), /*Copy=*/true);
560-
}
561-
562-
void MetadataStreamerMsgPackV4::begin(const Module &Mod,
563-
const IsaInfo::AMDGPUTargetID &TargetID) {
564-
emitVersion();
565-
emitTargetID(TargetID);
566-
emitPrintf(Mod);
567-
getRootMetadata("amdhsa.kernels") = HSAMetadataDoc->getArrayNode();
568-
}
569-
570553
//===----------------------------------------------------------------------===//
571554
// HSAMetadataStreamerV5
572555
//===----------------------------------------------------------------------===//
@@ -680,7 +663,7 @@ void MetadataStreamerMsgPackV5::emitHiddenKernelArgs(
680663

681664
void MetadataStreamerMsgPackV5::emitKernelAttrs(const Function &Func,
682665
msgpack::MapDocNode Kern) {
683-
MetadataStreamerMsgPackV3::emitKernelAttrs(Func, Kern);
666+
MetadataStreamerMsgPackV4::emitKernelAttrs(Func, Kern);
684667

685668
if (Func.getFnAttribute("uniform-work-group-size").getValueAsBool())
686669
Kern[".uniform_work_group_size"] = Kern.getDocument()->getNode(1);

0 commit comments

Comments
 (0)