Skip to content

Commit f782ff8

Browse files
authored
[C API] Add getters for Target Extension Types to C API (llvm#96447)
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
1 parent 90e4eb8 commit f782ff8

File tree

5 files changed

+105
-2
lines changed

5 files changed

+105
-2
lines changed

llvm/docs/ReleaseNotes.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,12 @@ They are described in detail in the `debug info migration guide <https://llvm.or
282282
* ``LLVMDIBuilderInsertDbgValueBefore``
283283
* ``LLVMDIBuilderInsertDbgValueAtEnd``
284284

285+
* Added the following functions for accessing a Target Extension Type's data:
286+
287+
* ``LLVMGetTargetExtTypeName``
288+
* ``LLVMGetTargetExtTypeNumTypeParams``/``LLVMGetTargetExtTypeTypeParam``
289+
* ``LLVMGetTargetExtTypeNumIntParams``/``LLVMGetTargetExtTypeIntParam``
290+
285291
Changes to the CodeGen infrastructure
286292
-------------------------------------
287293

llvm/include/llvm-c/Core.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1710,6 +1710,42 @@ LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
17101710
unsigned *IntParams,
17111711
unsigned IntParamCount);
17121712

1713+
/**
1714+
* Obtain the name for this target extension type.
1715+
*
1716+
* @see llvm::TargetExtType::getName()
1717+
*/
1718+
const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy);
1719+
1720+
/**
1721+
* Obtain the number of type parameters for this target extension type.
1722+
*
1723+
* @see llvm::TargetExtType::getNumTypeParameters()
1724+
*/
1725+
unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy);
1726+
1727+
/**
1728+
* Get the type parameter at the given index for the target extension type.
1729+
*
1730+
* @see llvm::TargetExtType::getTypeParameter()
1731+
*/
1732+
LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
1733+
unsigned Idx);
1734+
1735+
/**
1736+
* Obtain the number of int parameters for this target extension type.
1737+
*
1738+
* @see llvm::TargetExtType::getNumIntParameters()
1739+
*/
1740+
unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy);
1741+
1742+
/**
1743+
* Get the int parameter at the given index for the target extension type.
1744+
*
1745+
* @see llvm::TargetExtType::getIntParameter()
1746+
*/
1747+
unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx);
1748+
17131749
/**
17141750
* @}
17151751
*/

llvm/lib/IR/Core.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,32 @@ LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
954954
TargetExtType::get(*unwrap(C), Name, TypeParamArray, IntParamArray));
955955
}
956956

957+
const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy) {
958+
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
959+
return Type->getName().data();
960+
}
961+
962+
unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy) {
963+
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
964+
return Type->getNumTypeParameters();
965+
}
966+
967+
LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
968+
unsigned Idx) {
969+
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
970+
return wrap(Type->getTypeParameter(Idx));
971+
}
972+
973+
unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy) {
974+
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
975+
return Type->getNumIntParameters();
976+
}
977+
978+
unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) {
979+
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
980+
return Type->getIntParameter(Idx);
981+
}
982+
957983
/*===-- Operations on values ----------------------------------------------===*/
958984

959985
/*--.. Operations on all values ............................................--*/

llvm/test/Bindings/llvm-c/echo.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,23 @@ define void @types() {
6666
ret void
6767
}
6868

69+
; Target extension types:
70+
define target("target.ext.1") @target_ext_01(target("target.ext.1") %0) {
71+
ret target("target.ext.1") %0
72+
}
73+
74+
define target("target.ext.2", i8, i1) @target_ext_02(target("target.ext.2", i8, i1) %0) {
75+
ret target("target.ext.2", i8, i1) %0
76+
}
77+
78+
define target("target.ext.3", 7) @target_ext_03(target("target.ext.3", 7) %0) {
79+
ret target("target.ext.3", 7) %0
80+
}
81+
82+
define target("target.ext.4", i1, i32, 7) @target_ext_04(target("target.ext.4", i1, i32, 7) %0) {
83+
ret target("target.ext.4", i1, i32, 7) %0
84+
}
85+
6986
define i32 @iops(i32 %a, i32 %b) {
7087
%1 = add i32 %a, %b
7188
%2 = mul i32 %a, %1

llvm/tools/llvm-c-test/echo.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,26 @@ struct TypeCloner {
157157
return LLVMX86MMXTypeInContext(Ctx);
158158
case LLVMTokenTypeKind:
159159
return LLVMTokenTypeInContext(Ctx);
160-
case LLVMTargetExtTypeKind:
161-
assert(false && "Implement me");
160+
case LLVMTargetExtTypeKind: {
161+
const char *Name = LLVMGetTargetExtTypeName(Src);
162+
unsigned NumTypeParams = LLVMGetTargetExtTypeNumTypeParams(Src);
163+
unsigned NumIntParams = LLVMGetTargetExtTypeNumIntParams(Src);
164+
165+
SmallVector<LLVMTypeRef, 4> TypeParams((size_t)NumTypeParams);
166+
SmallVector<unsigned, 4> IntParams((size_t)NumIntParams);
167+
168+
for (unsigned i = 0; i < TypeParams.size(); i++)
169+
TypeParams[i] = Clone(LLVMGetTargetExtTypeTypeParam(Src, i));
170+
171+
for (unsigned i = 0; i < IntParams.size(); i++)
172+
IntParams[i] = LLVMGetTargetExtTypeIntParam(Src, i);
173+
174+
LLVMTypeRef TargetExtTy = LLVMTargetExtTypeInContext(
175+
Ctx, Name, TypeParams.data(), TypeParams.size(), IntParams.data(),
176+
IntParams.size());
177+
178+
return TargetExtTy;
179+
}
162180
}
163181

164182
fprintf(stderr, "%d is not a supported typekind\n", Kind);

0 commit comments

Comments
 (0)