[Lldb-commits] [clang] [lldb] [Clang][PowerPC] Add __dmr type and DMF integer calculation builtins (PR #142480)
Maryam Moghadas via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 16 12:13:33 PDT 2025
https://github.com/maryammo updated https://github.com/llvm/llvm-project/pull/142480
>From 5ef7a4ca7c2a838a6b2100968d5023e0797b2848 Mon Sep 17 00:00:00 2001
From: Maryam Moghadas <maryammo at ca.ibm.com>
Date: Mon, 2 Jun 2025 19:54:57 +0000
Subject: [PATCH 1/3] [Clang][PowerPC] Add __dmr type and DMF integer
calculation builtins
Define the __dmr type used to manipulate the new DMR registers introduced by
the Dense Math Facility (DMF) on PowerPC, and add six Clang builtins that
correspond to the integer outer-product accumulate to ACC instructions:
__builtin_mma_dmxvi8gerx4, __builtin_mma_pmdmxvi8gerx4,
__builtin_mma_dmxvi8gerx4pp, __builtin_mma_pmdmxvi8gerx4pp,
__builtin_mma_dmxvi8gerx4spp, and __builtin_mma_pmdmxvi8gerx4spp.
---
clang/include/clang/Basic/BuiltinsPPC.def | 12 ++
clang/include/clang/Basic/PPCTypes.def | 1 +
clang/lib/AST/ASTContext.cpp | 1 +
clang/test/AST/ast-dump-ppc-types.c | 13 +-
.../CodeGen/PowerPC/builtins-ppc-mmaplus.c | 94 +++++++++
.../PowerPC/ppc-future-mma-builtin-err.c | 21 ++
...ppc-future-paired-vec-memops-builtin-err.c | 20 ++
.../test/CodeGen/PowerPC/ppc-mmaplus-types.c | 184 ++++++++++++++++++
.../test/CodeGenCXX/ppc-mangle-mma-types.cpp | 5 +
clang/test/Sema/ppc-pair-mma-types.c | 98 ++++++++++
.../TypeSystem/Clang/TypeSystemClang.cpp | 1 +
11 files changed, 447 insertions(+), 3 deletions(-)
create mode 100644 clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
create mode 100644 clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
create mode 100644 clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
create mode 100644 clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
diff --git a/clang/include/clang/Basic/BuiltinsPPC.def b/clang/include/clang/Basic/BuiltinsPPC.def
index bb7d54bbb793e..099500754a0e0 100644
--- a/clang/include/clang/Basic/BuiltinsPPC.def
+++ b/clang/include/clang/Basic/BuiltinsPPC.def
@@ -1134,6 +1134,18 @@ UNALIASED_CUSTOM_BUILTIN(mma_pmxvbf16ger2np, "vW512*VVi15i15i3", true,
"mma,paired-vector-memops")
UNALIASED_CUSTOM_BUILTIN(mma_pmxvbf16ger2nn, "vW512*VVi15i15i3", true,
"mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_dmxvi8gerx4, "vW1024*W256V", false,
+ "mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_pmdmxvi8gerx4, "vW1024*W256Vi255i15i15", false,
+ "mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_dmxvi8gerx4pp, "vW1024*W256V", true,
+ "mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_pmdmxvi8gerx4pp, "vW1024*W256Vi255i15i15", true,
+ "mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_dmxvi8gerx4spp, "vW1024*W256V", true,
+ "mma,paired-vector-memops")
+UNALIASED_CUSTOM_BUILTIN(mma_pmdmxvi8gerx4spp, "vW1024*W256Vi255i15i15", true,
+ "mma,paired-vector-memops")
// FIXME: Obviously incomplete.
diff --git a/clang/include/clang/Basic/PPCTypes.def b/clang/include/clang/Basic/PPCTypes.def
index 9e2cb2aedc9fc..cfc9de3a473d4 100644
--- a/clang/include/clang/Basic/PPCTypes.def
+++ b/clang/include/clang/Basic/PPCTypes.def
@@ -30,6 +30,7 @@
#endif
+PPC_VECTOR_MMA_TYPE(__dmr, VectorDmr, 1024)
PPC_VECTOR_MMA_TYPE(__vector_quad, VectorQuad, 512)
PPC_VECTOR_VSX_TYPE(__vector_pair, VectorPair, 256)
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 45f9602856840..ffb4ca61b00c4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -3455,6 +3455,7 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
case BuiltinType::BFloat16:
case BuiltinType::VectorQuad:
case BuiltinType::VectorPair:
+ case BuiltinType::VectorDmr:
OS << "?";
return;
diff --git a/clang/test/AST/ast-dump-ppc-types.c b/clang/test/AST/ast-dump-ppc-types.c
index 26ae5441f20d7..a430268284413 100644
--- a/clang/test/AST/ast-dump-ppc-types.c
+++ b/clang/test/AST/ast-dump-ppc-types.c
@@ -1,9 +1,11 @@
+// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -target-cpu future \
+// RUN: -ast-dump %s | FileCheck %s
// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -target-cpu pwr10 \
-// RUN: -ast-dump -ast-dump-filter __vector %s | FileCheck %s
+// RUN: -ast-dump %s | FileCheck %s
// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -target-cpu pwr9 \
-// RUN: -ast-dump -ast-dump-filter __vector %s | FileCheck %s
+// RUN: -ast-dump %s | FileCheck %s
// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -target-cpu pwr8 \
-// RUN: -ast-dump -ast-dump-filter __vector %s | FileCheck %s
+// RUN: -ast-dump %s | FileCheck %s
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump %s | FileCheck %s \
// RUN: --check-prefix=CHECK-X86_64
// RUN: %clang_cc1 -triple arm-unknown-unknown -ast-dump %s | FileCheck %s \
@@ -15,16 +17,21 @@
// are correctly defined. We also added checks on a couple of other targets to
// ensure the types are target-dependent.
+// CHECK: TypedefDecl {{.*}} implicit __dmr '__dmr'
+// CHECK: `-BuiltinType {{.*}} '__dmr'
// CHECK: TypedefDecl {{.*}} implicit __vector_quad '__vector_quad'
// CHECK-NEXT: -BuiltinType {{.*}} '__vector_quad'
// CHECK: TypedefDecl {{.*}} implicit __vector_pair '__vector_pair'
// CHECK-NEXT: -BuiltinType {{.*}} '__vector_pair'
+// CHECK-X86_64-NOT: __dmr
// CHECK-X86_64-NOT: __vector_quad
// CHECK-X86_64-NOT: __vector_pair
+// CHECK-ARM-NOT: __dmr
// CHECK-ARM-NOT: __vector_quad
// CHECK-ARM-NOT: __vector_pair
+// CHECK-RISCV64-NOT: __dmr
// CHECK-RISCV64-NOT: __vector_quad
// CHECK-RISCV64-NOT: __vector_pair
diff --git a/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c b/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
new file mode 100644
index 0000000000000..2c335218ed32a
--- /dev/null
+++ b/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
@@ -0,0 +1,94 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -O3 -triple powerpc64le-unknown-unknown -target-cpu future \
+// RUN: -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -O3 -triple powerpc64-ibm-aix -target-cpu future \
+// RUN: -emit-llvm %s -o - | FileCheck %s
+
+
+// CHECK-LABEL: @test_dmxvi8gerx4(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2:![0-9]+]]
+// CHECK-NEXT: [[TMP1:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmxvi8gerx4(<256 x i1> [[TMP0]], <16 x i8> [[VC:%.*]])
+// CHECK-NEXT: store <1024 x i1> [[TMP1]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6:![0-9]+]]
+// CHECK-NEXT: ret void
+//
+void test_dmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_dmxvi8gerx4(&vdmr, vp, vc);
+ *((__dmr *)resp) = vdmr;
+}
+
+// CHECK-LABEL: @test_pmdmxvi8gerx4(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2]]
+// CHECK-NEXT: [[TMP1:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.pmdmxvi8gerx4(<256 x i1> [[TMP0]], <16 x i8> [[VC:%.*]], i32 0, i32 0, i32 0)
+// CHECK-NEXT: store <1024 x i1> [[TMP1]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: ret void
+//
+void test_pmdmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_pmdmxvi8gerx4(&vdmr, vp, vc, 0, 0, 0);
+ *((__dmr *)resp) = vdmr;
+}
+
+// CHECK-LABEL: @test_dmxvi8gerx4pp(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: [[TMP1:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2]]
+// CHECK-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmxvi8gerx4pp(<1024 x i1> [[TMP0]], <256 x i1> [[TMP1]], <16 x i8> [[VC:%.*]])
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: ret void
+//
+void test_dmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_dmxvi8gerx4pp(&vdmr, vp, vc);
+ *((__dmr *)resp) = vdmr;
+}
+
+// CHECK-LABEL: @test_pmdmxvi8gerx4pp(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: [[TMP1:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2]]
+// CHECK-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.pmdmxvi8gerx4pp(<1024 x i1> [[TMP0]], <256 x i1> [[TMP1]], <16 x i8> [[VC:%.*]], i32 0, i32 0, i32 0)
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: ret void
+//
+void test_pmdmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_pmdmxvi8gerx4pp(&vdmr, vp, vc, 0, 0, 0);
+ *((__dmr *)resp) = vdmr;
+}
+
+// CHECK-LABEL: @test_dmxvi8gerx4spp(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: [[TMP1:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2]]
+// CHECK-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmxvi8gerx4spp(<1024 x i1> [[TMP0]], <256 x i1> [[TMP1]], <16 x i8> [[VC:%.*]])
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: ret void
+//
+void test_dmxvi8gerx4spp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_dmxvi8gerx4spp(&vdmr, vp, vc);
+ *((__dmr *)resp) = vdmr;
+}
+
+// CHECK-LABEL: @test_pmdmxvi8gerx4spp(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: [[TMP1:%.*]] = load <256 x i1>, ptr [[VPP:%.*]], align 32, !tbaa [[TBAA2]]
+// CHECK-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.pmdmxvi8gerx4spp(<1024 x i1> [[TMP0]], <256 x i1> [[TMP1]], <16 x i8> [[VC:%.*]], i32 0, i32 0, i32 0)
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP:%.*]], align 128, !tbaa [[TBAA6]]
+// CHECK-NEXT: ret void
+//
+void test_pmdmxvi8gerx4spp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_pmdmxvi8gerx4spp(&vdmr, vp, vc, 0, 0, 0);
+ *((__dmr *)resp) = vdmr;
+}
diff --git a/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c b/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
new file mode 100644
index 0000000000000..c6029f9eb8352
--- /dev/null
+++ b/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
@@ -0,0 +1,21 @@
+// RUN: not %clang_cc1 -triple powerpc64le-unknown-linux-gnu -target-cpu future \
+// RUN: %s -emit-llvm-only 2>&1 | FileCheck %s
+
+__attribute__((target("no-mma")))
+void test_mma(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc) {
+ __dmr vdmr = *((__dmr *)vdmrp);
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_dmxvi8gerx4(&vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4(&vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4pp(&vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4pp(&vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4spp(&vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4spp(&vdmr, vp, vc, 0, 0, 0);
+
+// CHECK: error: '__builtin_mma_dmxvi8gerx4' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_dmxvi8gerx4pp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4pp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_dmxvi8gerx4spp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4spp' needs target feature mma,paired-vector-memops
+}
diff --git a/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c b/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
new file mode 100644
index 0000000000000..c31847e3ca4c4
--- /dev/null
+++ b/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
@@ -0,0 +1,20 @@
+// RUN: not %clang_cc1 -triple powerpc64le-unknown-linux-gnu -target-cpu future \
+// RUN: %s -emit-llvm-only 2>&1 | FileCheck %s
+
+__attribute__((target("no-paired-vector-memops")))
+void test_pair(unsigned char *vdmr, unsigned char *vpp, vector unsigned char vc) {
+ __vector_pair vp = *((__vector_pair *)vpp);
+ __builtin_mma_dmxvi8gerx4((__dmr *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4((__dmr *)vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4pp((__dmr *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4pp((__dmr *)vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4spp((__dmr *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4spp((__dmr *)vdmr, vp, vc, 0, 0, 0);
+
+// CHECK: error: '__builtin_mma_dmxvi8gerx4' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_dmxvi8gerx4pp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4pp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_dmxvi8gerx4spp' needs target feature mma,paired-vector-memops
+// CHECK: error: '__builtin_mma_pmdmxvi8gerx4spp' needs target feature mma,paired-vector-memops
+}
diff --git a/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c b/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
new file mode 100644
index 0000000000000..dbae2d0c0829a
--- /dev/null
+++ b/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
@@ -0,0 +1,184 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu future \
+// RUN: -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr10 \
+// RUN: -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr9 \
+// RUN: -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr8 \
+// RUN: -emit-llvm -o - %s | FileCheck %s
+
+typedef __vector_quad vq_t;
+
+// CHECK-LABEL: @test_dmr_copy(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[PTR1_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[PTR2_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[PTR1:%.*]], ptr [[PTR1_ADDR]], align 8
+// CHECK-NEXT: store ptr [[PTR2:%.*]], ptr [[PTR2_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR1_ADDR]], align 8
+// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP0]], i64 2
+// CHECK-NEXT: [[TMP1:%.*]] = load <1024 x i1>, ptr [[ADD_PTR]], align 128
+// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[PTR2_ADDR]], align 8
+// CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP2]], i64 1
+// CHECK-NEXT: store <1024 x i1> [[TMP1]], ptr [[ADD_PTR1]], align 128
+// CHECK-NEXT: ret void
+//
+void test_dmr_copy(__dmr *ptr1, __dmr *ptr2) {
+ *(ptr2 + 1) = *(ptr1 + 2);
+}
+
+// CHECK-LABEL: @test_dmr_typedef(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[INP_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[OUTP_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRIN:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMROUT:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[INP:%.*]], ptr [[INP_ADDR]], align 8
+// CHECK-NEXT: store ptr [[OUTP:%.*]], ptr [[OUTP_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[INP_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRIN]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OUTP_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP1]], ptr [[VDMROUT]], align 8
+// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VDMRIN]], align 8
+// CHECK-NEXT: [[TMP3:%.*]] = load <1024 x i1>, ptr [[TMP2]], align 128
+// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VDMROUT]], align 8
+// CHECK-NEXT: store <1024 x i1> [[TMP3]], ptr [[TMP4]], align 128
+// CHECK-NEXT: ret void
+//
+void test_dmr_typedef(int *inp, int *outp) {
+ __dmr *vdmrin = (__dmr *)inp;
+ __dmr *vdmrout = (__dmr *)outp;
+ *vdmrout = *vdmrin;
+}
+
+// CHECK-LABEL: @test_dmr_arg(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[VDMR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[VDMR:%.*]], ptr [[VDMR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMR_ADDR]], align 8
+// CHECK-NEXT: [[TMP2:%.*]] = load <1024 x i1>, ptr [[TMP1]], align 128
+// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
+// CHECK-NEXT: ret void
+//
+void test_dmr_arg(__dmr *vdmr, int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = *vdmr;
+}
+
+// CHECK-LABEL: @test_dmr_const_arg(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[VDMR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[VDMR:%.*]], ptr [[VDMR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMR_ADDR]], align 8
+// CHECK-NEXT: [[TMP2:%.*]] = load <1024 x i1>, ptr [[TMP1]], align 128
+// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
+// CHECK-NEXT: ret void
+//
+void test_dmr_const_arg(const __dmr *const vdmr, int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = *vdmr;
+}
+
+// CHECK-LABEL: @test_dmr_array_arg(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[VDMRA_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[VDMRA:%.*]], ptr [[VDMRA_ADDR]], align 8
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRA_ADDR]], align 8
+// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP1]], i64 0
+// CHECK-NEXT: [[TMP2:%.*]] = load <1024 x i1>, ptr [[ARRAYIDX]], align 128
+// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
+// CHECK-NEXT: ret void
+//
+void test_dmr_array_arg(__dmr vdmra[], int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = vdmra[0];
+}
+
+// CHECK-LABEL: @test_dmr_ret(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP1]], i64 2
+// CHECK-NEXT: ret ptr [[ADD_PTR]]
+//
+__dmr *test_dmr_ret(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ return vdmrp + 2;
+}
+
+// CHECK-LABEL: @test_dmr_ret_const(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP1]], i64 2
+// CHECK-NEXT: ret ptr [[ADD_PTR]]
+//
+const __dmr *test_dmr_ret_const(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ return vdmrp + 2;
+}
+
+// CHECK-LABEL: @test_dmr_sizeof_alignof(
+// CHECK-NEXT: entry:
+// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMRP:%.*]] = alloca ptr, align 8
+// CHECK-NEXT: [[VDMR:%.*]] = alloca <1024 x i1>, align 128
+// CHECK-NEXT: [[SIZET:%.*]] = alloca i32, align 4
+// CHECK-NEXT: [[ALIGNT:%.*]] = alloca i32, align 4
+// CHECK-NEXT: [[SIZEV:%.*]] = alloca i32, align 4
+// CHECK-NEXT: [[ALIGNV:%.*]] = alloca i32, align 4
+// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
+// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRP]], align 8
+// CHECK-NEXT: [[TMP2:%.*]] = load <1024 x i1>, ptr [[TMP1]], align 128
+// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[VDMR]], align 128
+// CHECK-NEXT: store i32 128, ptr [[SIZET]], align 4
+// CHECK-NEXT: store i32 128, ptr [[ALIGNT]], align 4
+// CHECK-NEXT: store i32 128, ptr [[SIZEV]], align 4
+// CHECK-NEXT: store i32 128, ptr [[ALIGNV]], align 4
+// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[SIZET]], align 4
+// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ALIGNT]], align 4
+// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP3]], [[TMP4]]
+// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[SIZEV]], align 4
+// CHECK-NEXT: [[ADD1:%.*]] = add i32 [[ADD]], [[TMP5]]
+// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ALIGNV]], align 4
+// CHECK-NEXT: [[ADD2:%.*]] = add i32 [[ADD1]], [[TMP6]]
+// CHECK-NEXT: ret i32 [[ADD2]]
+//
+int test_dmr_sizeof_alignof(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ __dmr vdmr = *vdmrp;
+ unsigned sizet = sizeof(__dmr);
+ unsigned alignt = __alignof__(__dmr);
+ unsigned sizev = sizeof(vdmr);
+ unsigned alignv = __alignof__(vdmr);
+ return sizet + alignt + sizev + alignv;
+}
diff --git a/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp b/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
index 74e50ceea386b..786d8dd19859c 100644
--- a/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
+++ b/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
@@ -1,3 +1,5 @@
+// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu future %s \
+// RUN: -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr10 %s \
// RUN: -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr9 %s \
@@ -5,6 +7,9 @@
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr8 %s \
// RUN: -emit-llvm -o - | FileCheck %s
+// CHECK: _Z2f0Pu5__dmr
+void f0(__dmr *vdmr) {}
+
// CHECK: _Z2f1Pu13__vector_quad
void f1(__vector_quad *vq) {}
diff --git a/clang/test/Sema/ppc-pair-mma-types.c b/clang/test/Sema/ppc-pair-mma-types.c
index 6a7cfac031058..950e9d1ea0b35 100644
--- a/clang/test/Sema/ppc-pair-mma-types.c
+++ b/clang/test/Sema/ppc-pair-mma-types.c
@@ -2,12 +2,110 @@
// RUN: -target-cpu pwr10 %s -verify
// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -fsyntax-only \
// RUN: -target-cpu pwr10 %s -verify
+// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -fsyntax-only \
+// RUN: -target-cpu future %s -verify
+// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -fsyntax-only \
+// RUN: -target-cpu future %s -verify
// The use of PPC MMA types is strongly restricted. Non-pointer MMA variables
// can only be declared in functions and a limited number of operations are
// supported on these types. This test case checks that invalid uses of MMA
// types are correctly prevented.
+// vector dmr
+
+// typedef
+typedef __dmr dmr_t;
+
+// function argument
+void testDmrArg1(__dmr vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = vdmr;
+}
+
+void testDmrArg2(const __dmr vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = vdmr;
+}
+
+void testDmrArg3(const dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vdmrp = (__dmr *)ptr;
+ *vdmrp = vdmr;
+}
+
+// function return
+__dmr testDmrRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vdmrp = (__dmr *)ptr;
+ return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
+}
+
+const dmr_t testDmrRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vdmrp = (__dmr *)ptr;
+ return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
+}
+
+// global
+__dmr globalvdmr; // expected-error {{invalid use of PPC MMA type}}
+const __dmr globalvdmr2; // expected-error {{invalid use of PPC MMA type}}
+__dmr *globalvdmrp;
+const __dmr *const globalvdmrp2;
+dmr_t globalvdmr_t; // expected-error {{invalid use of PPC MMA type}}
+
+// struct field
+struct TestDmrStruct {
+ int a;
+ float b;
+ __dmr c; // expected-error {{invalid use of PPC MMA type}}
+ __dmr *vq;
+};
+
+// operators
+int testDmrOperators1(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ __dmr vdmr1 = *(vdmrp + 0);
+ __dmr vdmr2 = *(vdmrp + 1);
+ __dmr vdmr3 = *(vdmrp + 2);
+ if (vdmr1) // expected-error {{statement requires expression of scalar type ('__dmr' invalid)}}
+ *(vdmrp + 10) = vdmr1;
+ if (!vdmr2) // expected-error {{invalid argument type '__dmr' to unary expression}}
+ *(vdmrp + 11) = vdmr3;
+ int c1 = vdmr1 && vdmr2; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ int c2 = vdmr2 == vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ int c3 = vdmr2 < vdmr1; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ return c1 || c2 || c3;
+}
+
+void testDmrOperators2(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ __dmr vdmr1 = *(vdmrp + 0);
+ __dmr vdmr2 = *(vdmrp + 1);
+ __dmr vdmr3 = *(vdmrp + 2);
+ vdmr1 = -vdmr1; // expected-error {{invalid argument type '__dmr' to unary expression}}
+ vdmr2 = vdmr1 + vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ vdmr2 = vdmr2 * vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ vdmr3 = vdmr3 | vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ vdmr3 = vdmr3 << 2; // expected-error {{invalid operands to binary expression ('__dmr' and 'int')}}
+ *(vdmrp + 10) = vdmr1;
+ *(vdmrp + 11) = vdmr2;
+ *(vdmrp + 12) = vdmr3;
+}
+
+vector unsigned char testDmrOperators3(int *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ __dmr vdmr1 = *(vdmrp + 0);
+ __dmr vdmr2 = *(vdmrp + 1);
+ __dmr vdmr3 = *(vdmrp + 2);
+ vdmr1 ? *(vdmrp + 10) = vdmr2 : *(vdmrp + 11) = vdmr3; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
+ vdmr2 = vdmr3;
+ return vdmr2[1]; // expected-error {{subscripted value is not an array, pointer, or vector}}
+}
+
+void testDmrOperators4(int v, void *ptr) {
+ __dmr *vdmrp = (__dmr *)ptr;
+ __dmr vdmr1 = (__dmr)v; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
+ __dmr vdmr2 = (__dmr)vdmrp; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
+}
+
// vector quad
// typedef
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 68bb3dc8581eb..5762709769784 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -5027,6 +5027,7 @@ lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type,
// PowerPC -- Matrix Multiply Assist
case clang::BuiltinType::VectorPair:
case clang::BuiltinType::VectorQuad:
+ case clang::BuiltinType::VectorDmr:
break;
// ARM -- Scalable Vector Extension
>From 4b43199da292576a435a51a5dc4130eb73e94425 Mon Sep 17 00:00:00 2001
From: Maryam Moghadas <maryammo at ca.ibm.com>
Date: Mon, 9 Jun 2025 19:20:07 +0000
Subject: [PATCH 2/3] Rename __dmr type to __dmr1024
---
clang/include/clang/Basic/PPCTypes.def | 2 +-
clang/lib/AST/ASTContext.cpp | 2 +-
clang/test/AST/ast-dump-ppc-types.c | 10 +--
.../CodeGen/PowerPC/builtins-ppc-mmaplus.c | 24 +++---
.../PowerPC/ppc-future-mma-builtin-err.c | 2 +-
...ppc-future-paired-vec-memops-builtin-err.c | 12 +--
.../test/CodeGen/PowerPC/ppc-mmaplus-types.c | 34 ++++----
.../test/CodeGenCXX/ppc-mangle-mma-types.cpp | 4 +-
clang/test/Sema/ppc-pair-mma-types.c | 82 +++++++++----------
.../TypeSystem/Clang/TypeSystemClang.cpp | 2 +-
10 files changed, 87 insertions(+), 87 deletions(-)
diff --git a/clang/include/clang/Basic/PPCTypes.def b/clang/include/clang/Basic/PPCTypes.def
index cfc9de3a473d4..3c94ae6cd5def 100644
--- a/clang/include/clang/Basic/PPCTypes.def
+++ b/clang/include/clang/Basic/PPCTypes.def
@@ -30,7 +30,7 @@
#endif
-PPC_VECTOR_MMA_TYPE(__dmr, VectorDmr, 1024)
+PPC_VECTOR_MMA_TYPE(__dmr1024, VectorDmr1024, 1024)
PPC_VECTOR_MMA_TYPE(__vector_quad, VectorQuad, 512)
PPC_VECTOR_VSX_TYPE(__vector_pair, VectorPair, 256)
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ffb4ca61b00c4..32b8e7052fb22 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -3455,7 +3455,7 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
case BuiltinType::BFloat16:
case BuiltinType::VectorQuad:
case BuiltinType::VectorPair:
- case BuiltinType::VectorDmr:
+ case BuiltinType::VectorDmr1024:
OS << "?";
return;
diff --git a/clang/test/AST/ast-dump-ppc-types.c b/clang/test/AST/ast-dump-ppc-types.c
index a430268284413..1c860c268e0ec 100644
--- a/clang/test/AST/ast-dump-ppc-types.c
+++ b/clang/test/AST/ast-dump-ppc-types.c
@@ -17,21 +17,21 @@
// are correctly defined. We also added checks on a couple of other targets to
// ensure the types are target-dependent.
-// CHECK: TypedefDecl {{.*}} implicit __dmr '__dmr'
-// CHECK: `-BuiltinType {{.*}} '__dmr'
+// CHECK: TypedefDecl {{.*}} implicit __dmr1024 '__dmr1024'
+// CHECK: `-BuiltinType {{.*}} '__dmr1024'
// CHECK: TypedefDecl {{.*}} implicit __vector_quad '__vector_quad'
// CHECK-NEXT: -BuiltinType {{.*}} '__vector_quad'
// CHECK: TypedefDecl {{.*}} implicit __vector_pair '__vector_pair'
// CHECK-NEXT: -BuiltinType {{.*}} '__vector_pair'
-// CHECK-X86_64-NOT: __dmr
+// CHECK-X86_64-NOT: __dmr1024
// CHECK-X86_64-NOT: __vector_quad
// CHECK-X86_64-NOT: __vector_pair
-// CHECK-ARM-NOT: __dmr
+// CHECK-ARM-NOT: __dmr1024
// CHECK-ARM-NOT: __vector_quad
// CHECK-ARM-NOT: __vector_pair
-// CHECK-RISCV64-NOT: __dmr
+// CHECK-RISCV64-NOT: __dmr1024
// CHECK-RISCV64-NOT: __vector_quad
// CHECK-RISCV64-NOT: __vector_pair
diff --git a/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c b/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
index 2c335218ed32a..41f13155847ba 100644
--- a/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
+++ b/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
@@ -13,10 +13,10 @@
// CHECK-NEXT: ret void
//
void test_dmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_dmxvi8gerx4(&vdmr, vp, vc);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
// CHECK-LABEL: @test_pmdmxvi8gerx4(
@@ -27,10 +27,10 @@ void test_dmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigned
// CHECK-NEXT: ret void
//
void test_pmdmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_pmdmxvi8gerx4(&vdmr, vp, vc, 0, 0, 0);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
// CHECK-LABEL: @test_dmxvi8gerx4pp(
@@ -42,10 +42,10 @@ void test_pmdmxvi8gerx4(unsigned char *vdmrp, unsigned char *vpp, vector unsigne
// CHECK-NEXT: ret void
//
void test_dmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_dmxvi8gerx4pp(&vdmr, vp, vc);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
// CHECK-LABEL: @test_pmdmxvi8gerx4pp(
@@ -57,10 +57,10 @@ void test_dmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsigne
// CHECK-NEXT: ret void
//
void test_pmdmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_pmdmxvi8gerx4pp(&vdmr, vp, vc, 0, 0, 0);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
// CHECK-LABEL: @test_dmxvi8gerx4spp(
@@ -72,10 +72,10 @@ void test_pmdmxvi8gerx4pp(unsigned char *vdmrp, unsigned char *vpp, vector unsig
// CHECK-NEXT: ret void
//
void test_dmxvi8gerx4spp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_dmxvi8gerx4spp(&vdmr, vp, vc);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
// CHECK-LABEL: @test_pmdmxvi8gerx4spp(
@@ -87,8 +87,8 @@ void test_dmxvi8gerx4spp(unsigned char *vdmrp, unsigned char *vpp, vector unsign
// CHECK-NEXT: ret void
//
void test_pmdmxvi8gerx4spp(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc, unsigned char *resp) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_pmdmxvi8gerx4spp(&vdmr, vp, vc, 0, 0, 0);
- *((__dmr *)resp) = vdmr;
+ *((__dmr1024 *)resp) = vdmr;
}
diff --git a/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c b/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
index c6029f9eb8352..1b8d345ac7ec7 100644
--- a/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
+++ b/clang/test/CodeGen/PowerPC/ppc-future-mma-builtin-err.c
@@ -3,7 +3,7 @@
__attribute__((target("no-mma")))
void test_mma(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc) {
- __dmr vdmr = *((__dmr *)vdmrp);
+ __dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_dmxvi8gerx4(&vdmr, vp, vc);
__builtin_mma_pmdmxvi8gerx4(&vdmr, vp, vc, 0, 0, 0);
diff --git a/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c b/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
index c31847e3ca4c4..eef1abca22417 100644
--- a/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
+++ b/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
@@ -4,12 +4,12 @@
__attribute__((target("no-paired-vector-memops")))
void test_pair(unsigned char *vdmr, unsigned char *vpp, vector unsigned char vc) {
__vector_pair vp = *((__vector_pair *)vpp);
- __builtin_mma_dmxvi8gerx4((__dmr *)vdmr, vp, vc);
- __builtin_mma_pmdmxvi8gerx4((__dmr *)vdmr, vp, vc, 0, 0, 0);
- __builtin_mma_dmxvi8gerx4pp((__dmr *)vdmr, vp, vc);
- __builtin_mma_pmdmxvi8gerx4pp((__dmr *)vdmr, vp, vc, 0, 0, 0);
- __builtin_mma_dmxvi8gerx4spp((__dmr *)vdmr, vp, vc);
- __builtin_mma_pmdmxvi8gerx4spp((__dmr *)vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4((__dmr1024 *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4((__dmr1024 *)vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4pp((__dmr1024 *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4pp((__dmr1024 *)vdmr, vp, vc, 0, 0, 0);
+ __builtin_mma_dmxvi8gerx4spp((__dmr1024 *)vdmr, vp, vc);
+ __builtin_mma_pmdmxvi8gerx4spp((__dmr1024 *)vdmr, vp, vc, 0, 0, 0);
// CHECK: error: '__builtin_mma_dmxvi8gerx4' needs target feature mma,paired-vector-memops
// CHECK: error: '__builtin_mma_pmdmxvi8gerx4' needs target feature mma,paired-vector-memops
diff --git a/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c b/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
index dbae2d0c0829a..58cd2fe1129b6 100644
--- a/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
+++ b/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
@@ -24,7 +24,7 @@ typedef __vector_quad vq_t;
// CHECK-NEXT: store <1024 x i1> [[TMP1]], ptr [[ADD_PTR1]], align 128
// CHECK-NEXT: ret void
//
-void test_dmr_copy(__dmr *ptr1, __dmr *ptr2) {
+void test_dmr_copy(__dmr1024 *ptr1, __dmr1024 *ptr2) {
*(ptr2 + 1) = *(ptr1 + 2);
}
@@ -47,8 +47,8 @@ void test_dmr_copy(__dmr *ptr1, __dmr *ptr2) {
// CHECK-NEXT: ret void
//
void test_dmr_typedef(int *inp, int *outp) {
- __dmr *vdmrin = (__dmr *)inp;
- __dmr *vdmrout = (__dmr *)outp;
+ __dmr1024 *vdmrin = (__dmr1024 *)inp;
+ __dmr1024 *vdmrout = (__dmr1024 *)outp;
*vdmrout = *vdmrin;
}
@@ -67,8 +67,8 @@ void test_dmr_typedef(int *inp, int *outp) {
// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
// CHECK-NEXT: ret void
//
-void test_dmr_arg(__dmr *vdmr, int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
+void test_dmr_arg(__dmr1024 *vdmr, int *ptr) {
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = *vdmr;
}
@@ -87,8 +87,8 @@ void test_dmr_arg(__dmr *vdmr, int *ptr) {
// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
// CHECK-NEXT: ret void
//
-void test_dmr_const_arg(const __dmr *const vdmr, int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
+void test_dmr_const_arg(const __dmr1024 *const vdmr, int *ptr) {
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = *vdmr;
}
@@ -108,8 +108,8 @@ void test_dmr_const_arg(const __dmr *const vdmr, int *ptr) {
// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[TMP3]], align 128
// CHECK-NEXT: ret void
//
-void test_dmr_array_arg(__dmr vdmra[], int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
+void test_dmr_array_arg(__dmr1024 vdmra[], int *ptr) {
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmra[0];
}
@@ -124,8 +124,8 @@ void test_dmr_array_arg(__dmr vdmra[], int *ptr) {
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP1]], i64 2
// CHECK-NEXT: ret ptr [[ADD_PTR]]
//
-__dmr *test_dmr_ret(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
+__dmr1024 *test_dmr_ret(int *ptr) {
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
return vdmrp + 2;
}
@@ -140,8 +140,8 @@ __dmr *test_dmr_ret(int *ptr) {
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <1024 x i1>, ptr [[TMP1]], i64 2
// CHECK-NEXT: ret ptr [[ADD_PTR]]
//
-const __dmr *test_dmr_ret_const(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
+const __dmr1024 *test_dmr_ret_const(int *ptr) {
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
return vdmrp + 2;
}
@@ -174,10 +174,10 @@ const __dmr *test_dmr_ret_const(int *ptr) {
// CHECK-NEXT: ret i32 [[ADD2]]
//
int test_dmr_sizeof_alignof(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
- __dmr vdmr = *vdmrp;
- unsigned sizet = sizeof(__dmr);
- unsigned alignt = __alignof__(__dmr);
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
+ __dmr1024 vdmr = *vdmrp;
+ unsigned sizet = sizeof(__dmr1024);
+ unsigned alignt = __alignof__(__dmr1024);
unsigned sizev = sizeof(vdmr);
unsigned alignv = __alignof__(vdmr);
return sizet + alignt + sizev + alignv;
diff --git a/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp b/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
index 786d8dd19859c..1e213e7f75127 100644
--- a/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
+++ b/clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
@@ -7,8 +7,8 @@
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr8 %s \
// RUN: -emit-llvm -o - | FileCheck %s
-// CHECK: _Z2f0Pu5__dmr
-void f0(__dmr *vdmr) {}
+// CHECK: _Z2f0Pu9__dmr1024
+void f0(__dmr1024 *vdmr) {}
// CHECK: _Z2f1Pu13__vector_quad
void f1(__vector_quad *vq) {}
diff --git a/clang/test/Sema/ppc-pair-mma-types.c b/clang/test/Sema/ppc-pair-mma-types.c
index 950e9d1ea0b35..6d484882a0337 100644
--- a/clang/test/Sema/ppc-pair-mma-types.c
+++ b/clang/test/Sema/ppc-pair-mma-types.c
@@ -15,95 +15,95 @@
// vector dmr
// typedef
-typedef __dmr dmr_t;
+typedef __dmr1024 dmr_t;
// function argument
-void testDmrArg1(__dmr vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
- __dmr *vdmrp = (__dmr *)ptr;
+void testDmrArg1(__dmr1024 vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
-void testDmrArg2(const __dmr vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
- __dmr *vdmrp = (__dmr *)ptr;
+void testDmrArg2(const __dmr1024 vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
void testDmrArg3(const dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
- __dmr *vdmrp = (__dmr *)ptr;
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
// function return
-__dmr testDmrRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
- __dmr *vdmrp = (__dmr *)ptr;
+__dmr1024 testDmrRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
}
const dmr_t testDmrRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
- __dmr *vdmrp = (__dmr *)ptr;
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
}
// global
-__dmr globalvdmr; // expected-error {{invalid use of PPC MMA type}}
-const __dmr globalvdmr2; // expected-error {{invalid use of PPC MMA type}}
-__dmr *globalvdmrp;
-const __dmr *const globalvdmrp2;
+__dmr1024 globalvdmr; // expected-error {{invalid use of PPC MMA type}}
+const __dmr1024 globalvdmr2; // expected-error {{invalid use of PPC MMA type}}
+__dmr1024 *globalvdmrp;
+const __dmr1024 *const globalvdmrp2;
dmr_t globalvdmr_t; // expected-error {{invalid use of PPC MMA type}}
// struct field
struct TestDmrStruct {
int a;
float b;
- __dmr c; // expected-error {{invalid use of PPC MMA type}}
- __dmr *vq;
+ __dmr1024 c; // expected-error {{invalid use of PPC MMA type}}
+ __dmr1024 *vq;
};
// operators
int testDmrOperators1(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
- __dmr vdmr1 = *(vdmrp + 0);
- __dmr vdmr2 = *(vdmrp + 1);
- __dmr vdmr3 = *(vdmrp + 2);
- if (vdmr1) // expected-error {{statement requires expression of scalar type ('__dmr' invalid)}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
+ __dmr1024 vdmr1 = *(vdmrp + 0);
+ __dmr1024 vdmr2 = *(vdmrp + 1);
+ __dmr1024 vdmr3 = *(vdmrp + 2);
+ if (vdmr1) // expected-error {{statement requires expression of scalar type ('__dmr1024' invalid)}}
*(vdmrp + 10) = vdmr1;
- if (!vdmr2) // expected-error {{invalid argument type '__dmr' to unary expression}}
+ if (!vdmr2) // expected-error {{invalid argument type '__dmr1024' to unary expression}}
*(vdmrp + 11) = vdmr3;
- int c1 = vdmr1 && vdmr2; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
- int c2 = vdmr2 == vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
- int c3 = vdmr2 < vdmr1; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
+ int c1 = vdmr1 && vdmr2; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
+ int c2 = vdmr2 == vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
+ int c3 = vdmr2 < vdmr1; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
return c1 || c2 || c3;
}
void testDmrOperators2(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
- __dmr vdmr1 = *(vdmrp + 0);
- __dmr vdmr2 = *(vdmrp + 1);
- __dmr vdmr3 = *(vdmrp + 2);
- vdmr1 = -vdmr1; // expected-error {{invalid argument type '__dmr' to unary expression}}
- vdmr2 = vdmr1 + vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
- vdmr2 = vdmr2 * vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
- vdmr3 = vdmr3 | vdmr3; // expected-error {{invalid operands to binary expression ('__dmr' and '__dmr')}}
- vdmr3 = vdmr3 << 2; // expected-error {{invalid operands to binary expression ('__dmr' and 'int')}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
+ __dmr1024 vdmr1 = *(vdmrp + 0);
+ __dmr1024 vdmr2 = *(vdmrp + 1);
+ __dmr1024 vdmr3 = *(vdmrp + 2);
+ vdmr1 = -vdmr1; // expected-error {{invalid argument type '__dmr1024' to unary expression}}
+ vdmr2 = vdmr1 + vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
+ vdmr2 = vdmr2 * vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
+ vdmr3 = vdmr3 | vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
+ vdmr3 = vdmr3 << 2; // expected-error {{invalid operands to binary expression ('__dmr1024' and 'int')}}
*(vdmrp + 10) = vdmr1;
*(vdmrp + 11) = vdmr2;
*(vdmrp + 12) = vdmr3;
}
vector unsigned char testDmrOperators3(int *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
- __dmr vdmr1 = *(vdmrp + 0);
- __dmr vdmr2 = *(vdmrp + 1);
- __dmr vdmr3 = *(vdmrp + 2);
- vdmr1 ? *(vdmrp + 10) = vdmr2 : *(vdmrp + 11) = vdmr3; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
+ __dmr1024 vdmr1 = *(vdmrp + 0);
+ __dmr1024 vdmr2 = *(vdmrp + 1);
+ __dmr1024 vdmr3 = *(vdmrp + 2);
+ vdmr1 ? *(vdmrp + 10) = vdmr2 : *(vdmrp + 11) = vdmr3; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
vdmr2 = vdmr3;
return vdmr2[1]; // expected-error {{subscripted value is not an array, pointer, or vector}}
}
void testDmrOperators4(int v, void *ptr) {
- __dmr *vdmrp = (__dmr *)ptr;
- __dmr vdmr1 = (__dmr)v; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
- __dmr vdmr2 = (__dmr)vdmrp; // expected-error {{used type '__dmr' where arithmetic or pointer type is required}}
+ __dmr1024 *vdmrp = (__dmr1024 *)ptr;
+ __dmr1024 vdmr1 = (__dmr1024)v; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
+ __dmr1024 vdmr2 = (__dmr1024)vdmrp; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
}
// vector quad
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 5762709769784..8f99c38487906 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -5027,7 +5027,7 @@ lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type,
// PowerPC -- Matrix Multiply Assist
case clang::BuiltinType::VectorPair:
case clang::BuiltinType::VectorQuad:
- case clang::BuiltinType::VectorDmr:
+ case clang::BuiltinType::VectorDmr1024:
break;
// ARM -- Scalable Vector Extension
>From 4491c64fbcd77056650ebf9b5c19764a9835dd8b Mon Sep 17 00:00:00 2001
From: Maryam Moghadas <maryammo at ca.ibm.com>
Date: Mon, 16 Jun 2025 19:15:40 +0000
Subject: [PATCH 3/3] Rename tests to address review comments
---
.../PowerPC/{builtins-ppc-mmaplus.c => builtins-ppc-dmf.c} | 0
...mops-builtin-err.c => ppc-dmf-paired-vec-memops-builtin-err.c} | 0
.../test/CodeGen/PowerPC/{ppc-mmaplus-types.c => ppc-dmf-types.c} | 0
3 files changed, 0 insertions(+), 0 deletions(-)
rename clang/test/CodeGen/PowerPC/{builtins-ppc-mmaplus.c => builtins-ppc-dmf.c} (100%)
rename clang/test/CodeGen/PowerPC/{ppc-future-paired-vec-memops-builtin-err.c => ppc-dmf-paired-vec-memops-builtin-err.c} (100%)
rename clang/test/CodeGen/PowerPC/{ppc-mmaplus-types.c => ppc-dmf-types.c} (100%)
diff --git a/clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c b/clang/test/CodeGen/PowerPC/builtins-ppc-dmf.c
similarity index 100%
rename from clang/test/CodeGen/PowerPC/builtins-ppc-mmaplus.c
rename to clang/test/CodeGen/PowerPC/builtins-ppc-dmf.c
diff --git a/clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c b/clang/test/CodeGen/PowerPC/ppc-dmf-paired-vec-memops-builtin-err.c
similarity index 100%
rename from clang/test/CodeGen/PowerPC/ppc-future-paired-vec-memops-builtin-err.c
rename to clang/test/CodeGen/PowerPC/ppc-dmf-paired-vec-memops-builtin-err.c
diff --git a/clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c b/clang/test/CodeGen/PowerPC/ppc-dmf-types.c
similarity index 100%
rename from clang/test/CodeGen/PowerPC/ppc-mmaplus-types.c
rename to clang/test/CodeGen/PowerPC/ppc-dmf-types.c
More information about the lldb-commits
mailing list