From 47628b22379802627ffe8ca573e204b3603a0840 Mon Sep 17 00:00:00 2001 From: Benji Smith Date: Sun, 23 Jun 2024 20:22:35 -0400 Subject: [PATCH 1/2] [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 (TargetExtTy); + return Type->getName().data(); +} + +unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy) { + TargetExtType *Type = unwrap(TargetExtTy); + return Type->getNumTypeParameters(); +} + +LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy, + unsigned Idx) { + TargetExtType *Type = unwrap(TargetExtTy); + return wrap(Type->getTypeParameter(Idx)); +} + +unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy) { + TargetExtType *Type = unwrap(TargetExtTy); + return Type->getNumIntParameters(); +} + +unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) { + TargetExtType *Type = unwrap(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 TypeParams((size_t)NumTypeParams); + SmallVector 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); From 63c3eed2feca93d64454e08ef3ee71f23574da93 Mon Sep 17 00:00:00 2001 From: Benji Smith <6193112+Benjins@users.noreply.github.com> Date: Mon, 24 Jun 2024 07:23:41 -0400 Subject: [PATCH 2/2] Fix typo in echo.cpp --- llvm/tools/llvm-c-test/echo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index fed8b1a697649..6fa36421810f0 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -171,11 +171,11 @@ struct TypeCloner { for (unsigned i = 0; i < IntParams.size(); i++) IntParams[i] = LLVMGetTargetExtTypeIntParam(Src, i); - LLVMTypeRef TargtExtTy = LLVMTargetExtTypeInContext( + LLVMTypeRef TargetExtTy = LLVMTargetExtTypeInContext( Ctx, Name, TypeParams.data(), TypeParams.size(), IntParams.data(), IntParams.size()); - return TargtExtTy; + return TargetExtTy; } }