-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[C API] Add getters for Target Extension Types to C API #96447
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-ir Author: Benji Smith (Benjins) ChangesAccessors for the name, type parameters, and integer parameters are added. A test is added to echo.ll This was originally done in #71291 but that has been stale for several months. This re-applies the changes, but with some tweaks. e.g. removing the bulk getters in favour of a simple get-by-index approach for the type/integer parameters. The latter is more in line with the rest of the API Full diff: https://github.com/llvm/llvm-project/pull/96447.diff 5 Files Affected:
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);
|
Accessors for the name, type parameters, and integer parameters are added. A test is added to echo.ll
|
3f6bb7e
to
47628b2
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks reasonable.
@@ -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(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looked iffy, but apparently StringSaver used to store the name guarantees null termination, so this should be safe.
return Type->getNumIntParameters(); | ||
} | ||
|
||
unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A bit worried the type is going to change in the future, but I guess we'll have to deal with it if it happens.
llvm/tools/llvm-c-test/echo.cpp
Outdated
for (unsigned i = 0; i < IntParams.size(); i++) | ||
IntParams[i] = LLVMGetTargetExtTypeIntParam(Src, i); | ||
|
||
LLVMTypeRef TargtExtTy = LLVMTargetExtTypeInContext( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LLVMTypeRef TargtExtTy = LLVMTargetExtTypeInContext( | |
LLVMTypeRef TargetExtTy = LLVMTargetExtTypeInContext( |
Weird place to save a character :)
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/141/builds/326 Here is the relevant piece of the build log for the reference:
|
Accessors for the name, type parameters, and integer parameters are added. A test is added to echo.ll This was originally done in llvm#71291 but that has been stale for several months. This re-applies the changes, but with some tweaks. e.g. removing the bulk getters in favour of a simple get-by-index approach for the type/integer parameters. The latter is more in line with the rest of the API
Accessors for the name, type parameters, and integer parameters are added. A test is added to echo.ll This was originally done in llvm#71291 but that has been stale for several months. This re-applies the changes, but with some tweaks. e.g. removing the bulk getters in favour of a simple get-by-index approach for the type/integer parameters. The latter is more in line with the rest of the API
Accessors for the name, type parameters, and integer parameters are added. A test is added to echo.ll
This was originally done in #71291 but that has been stale for several months. This re-applies the changes, but with some tweaks. e.g. removing the bulk getters in favour of a simple get-by-index approach for the type/integer parameters. The latter is more in line with the rest of the API