[llvm] [C API] Add getters for Target Extension Types to C API (PR #96447)
Benji Smith via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 23 17:37:50 PDT 2024
https://github.com/Benjins updated https://github.com/llvm/llvm-project/pull/96447
>From 47628b22379802627ffe8ca573e204b3603a0840 Mon Sep 17 00:00:00 2001
From: Benji Smith <benjsith at gmail.com>
Date: Sun, 23 Jun 2024 20:22:35 -0400
Subject: [PATCH] [C API] Add getters for Target Extension Types to C API
Accessors for the name, type parameters, and integer parameters are added. A
test is added to echo.ll
---
llvm/docs/ReleaseNotes.rst | 6 ++++++
llvm/include/llvm-c/Core.h | 36 +++++++++++++++++++++++++++++++
llvm/lib/IR/Core.cpp | 26 ++++++++++++++++++++++
llvm/test/Bindings/llvm-c/echo.ll | 17 +++++++++++++++
llvm/tools/llvm-c-test/echo.cpp | 22 +++++++++++++++++--
5 files changed, 105 insertions(+), 2 deletions(-)
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 76356dd76f1d2..416b3952f1ac4 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -282,6 +282,12 @@ They are described in detail in the `debug info migration guide <https://llvm.or
* ``LLVMDIBuilderInsertDbgValueBefore``
* ``LLVMDIBuilderInsertDbgValueAtEnd``
+* Added the following functions for accessing a Target Extension Type's data:
+
+ * ``LLVMGetTargetExtTypeName``
+ * ``LLVMGetTargetExtTypeNumTypeParams``/``LLVMGetTargetExtTypeTypeParam``
+ * ``LLVMGetTargetExtTypeNumIntParams``/``LLVMGetTargetExtTypeIntParam``
+
Changes to the CodeGen infrastructure
-------------------------------------
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index af2e562fe0f8d..9867db4839fe1 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -1710,6 +1710,42 @@ LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
unsigned *IntParams,
unsigned IntParamCount);
+/**
+ * Obtain the name for this target extension type.
+ *
+ * @see llvm::TargetExtType::getName()
+ */
+const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy);
+
+/**
+ * Obtain the number of type parameters for this target extension type.
+ *
+ * @see llvm::TargetExtType::getNumTypeParameters()
+ */
+unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy);
+
+/**
+ * Get the type parameter at the given index for the target extension type.
+ *
+ * @see llvm::TargetExtType::getTypeParameter()
+ */
+LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
+ unsigned Idx);
+
+/**
+ * Obtain the number of int parameters for this target extension type.
+ *
+ * @see llvm::TargetExtType::getNumIntParameters()
+ */
+unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy);
+
+/**
+ * Get the int parameter at the given index for the target extension type.
+ *
+ * @see llvm::TargetExtType::getIntParameter()
+ */
+unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx);
+
/**
* @}
*/
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 3b6b01fb78b0a..9ba7873106043 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -954,6 +954,32 @@ LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
TargetExtType::get(*unwrap(C), Name, TypeParamArray, IntParamArray));
}
+const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy) {
+ TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
+ return Type->getName().data();
+}
+
+unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy) {
+ TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
+ return Type->getNumTypeParameters();
+}
+
+LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
+ unsigned Idx) {
+ TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
+ return wrap(Type->getTypeParameter(Idx));
+}
+
+unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy) {
+ TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
+ return Type->getNumIntParameters();
+}
+
+unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) {
+ TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
+ return Type->getIntParameter(Idx);
+}
+
/*===-- Operations on values ----------------------------------------------===*/
/*--.. Operations on all values ............................................--*/
diff --git a/llvm/test/Bindings/llvm-c/echo.ll b/llvm/test/Bindings/llvm-c/echo.ll
index bb5fae0dcd12e..dc6f2a9e7d206 100644
--- a/llvm/test/Bindings/llvm-c/echo.ll
+++ b/llvm/test/Bindings/llvm-c/echo.ll
@@ -66,6 +66,23 @@ define void @types() {
ret void
}
+; Target extension types:
+define target("target.ext.1") @target_ext_01(target("target.ext.1") %0) {
+ ret target("target.ext.1") %0
+}
+
+define target("target.ext.2", i8, i1) @target_ext_02(target("target.ext.2", i8, i1) %0) {
+ ret target("target.ext.2", i8, i1) %0
+}
+
+define target("target.ext.3", 7) @target_ext_03(target("target.ext.3", 7) %0) {
+ ret target("target.ext.3", 7) %0
+}
+
+define target("target.ext.4", i1, i32, 7) @target_ext_04(target("target.ext.4", i1, i32, 7) %0) {
+ ret target("target.ext.4", i1, i32, 7) %0
+}
+
define i32 @iops(i32 %a, i32 %b) {
%1 = add i32 %a, %b
%2 = mul i32 %a, %1
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 518716168c423..fed8b1a697649 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -157,8 +157,26 @@ struct TypeCloner {
return LLVMX86MMXTypeInContext(Ctx);
case LLVMTokenTypeKind:
return LLVMTokenTypeInContext(Ctx);
- case LLVMTargetExtTypeKind:
- assert(false && "Implement me");
+ case LLVMTargetExtTypeKind: {
+ const char *Name = LLVMGetTargetExtTypeName(Src);
+ unsigned NumTypeParams = LLVMGetTargetExtTypeNumTypeParams(Src);
+ unsigned NumIntParams = LLVMGetTargetExtTypeNumIntParams(Src);
+
+ SmallVector<LLVMTypeRef, 4> TypeParams((size_t)NumTypeParams);
+ SmallVector<unsigned, 4> IntParams((size_t)NumIntParams);
+
+ for (unsigned i = 0; i < TypeParams.size(); i++)
+ TypeParams[i] = Clone(LLVMGetTargetExtTypeTypeParam(Src, i));
+
+ for (unsigned i = 0; i < IntParams.size(); i++)
+ IntParams[i] = LLVMGetTargetExtTypeIntParam(Src, i);
+
+ LLVMTypeRef TargtExtTy = LLVMTargetExtTypeInContext(
+ Ctx, Name, TypeParams.data(), TypeParams.size(), IntParams.data(),
+ IntParams.size());
+
+ return TargtExtTy;
+ }
}
fprintf(stderr, "%d is not a supported typekind\n", Kind);
More information about the llvm-commits
mailing list