Skip to content

[C API] Add getters for Target Extension Types to C API #71291

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

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions llvm/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,18 @@ Changes to the C API
* Added ``LLVMGetNNeg`` and ``LLVMSetNNeg`` for setting/getting the new nneg flag
on zext instructions

* Added the following getters for accessing the name, type parameters, and
integer parameters of Target Extension Types:

* ``LLVMGetTargetExtTypeName``
* ``LLVMCountTargetExtTypeTypeParams``
* ``LLVMGetTargetExtTypeTypeParams``
* ``LLVMGetTargetExtTypeTypeParam``
* ``LLVMCountTargetExtTypeIntParams``
* ``LLVMGetTargetExtTypeIntParams``
* ``LLVMGetTargetExtTypeIntParam``


Changes to the CodeGen infrastructure
-------------------------------------

Expand Down
44 changes: 44 additions & 0 deletions llvm/include/llvm-c/Core.h
Original file line number Diff line number Diff line change
Expand Up @@ -1653,6 +1653,50 @@ LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
unsigned *IntParams,
unsigned IntParamCount);

/**
* Obtain the name for this target extension type
*/
const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy);

/**
* Obtain the number of type parameters for this target extension type
*/
unsigned LLVMCountTargetExtTypeTypeParams(LLVMTypeRef TargetExtTy);

/**
* Obtain the values of a target extension type's type parameters, output to
* the passed-in pointer. The pointer should have enough space for all type
* params for the given target extension type
*
* @see LLVMCountTargetExtTypeTypeParams
*/
void LLVMGetTargetExtTypeTypeParams(LLVMTypeRef TargetExtTy, LLVMTypeRef *Dest);

/**
* Get the type param at the given index for the target extension type
*/
LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
unsigned Idx);

/**
* Obtain the number of int parameters for this target extension type
*/
unsigned LLVMCountTargetExtTypeIntParams(LLVMTypeRef TargetExtTy);

/**
* Obtain the int values of a target extension type's int parameters, output to
* the passed-in pointer. The pointer should have enough space for all int
* params for the given target extension type
*
* @see LLVMCountTargetExtTypeIntParams
*/
void LLVMGetTargetExtTypeIntParams(LLVMTypeRef TargetExtTy, unsigned *Dest);

/**
* Get the int param at the given index for the target extension type
*/
unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx);

/**
* @}
*/
Expand Down
43 changes: 43 additions & 0 deletions llvm/lib/IR/Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,49 @@ 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 LLVMCountTargetExtTypeTypeParams(LLVMTypeRef TargetExtTy) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
return Type->getNumTypeParameters();
}

void LLVMGetTargetExtTypeTypeParams(LLVMTypeRef TargetExtTy,
LLVMTypeRef *Dest) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);

for (unsigned int i = 0; i < Type->getNumTypeParameters(); i++) {
Dest[i] = wrap(Type->getTypeParameter(i));
}
}

LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
unsigned Idx) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
return wrap(Type->getTypeParameter(Idx));
}

unsigned LLVMCountTargetExtTypeIntParams(LLVMTypeRef TargetExtTy) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
return Type->getNumIntParameters();
}

void LLVMGetTargetExtTypeIntParams(LLVMTypeRef TargetExtTy, unsigned *Dest) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);

for (unsigned int i = 0; i < Type->getNumIntParameters(); i++) {
Dest[i] = Type->getIntParameter(i);
}
}

unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) {
TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy);
return Type->getIntParameter(Idx);
}

/*===-- Operations on values ----------------------------------------------===*/

/*--.. Operations on all values ............................................--*/
Expand Down
17 changes: 17 additions & 0 deletions llvm/test/Bindings/llvm-c/echo.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 20 additions & 2 deletions llvm/tools/llvm-c-test/echo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 TypeParamCount = LLVMCountTargetExtTypeTypeParams(Src);
unsigned IntParamCount = LLVMCountTargetExtTypeIntParams(Src);

SmallVector<LLVMTypeRef, 4> TypeParams((size_t)TypeParamCount);
SmallVector<unsigned, 4> IntParams((size_t)IntParamCount);

LLVMGetTargetExtTypeTypeParams(Src, TypeParams.data());
for (unsigned i = 0; i < TypeParams.size(); i++)
TypeParams[i] = Clone(TypeParams[i]);

LLVMGetTargetExtTypeIntParams(Src, IntParams.data());

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);
Expand Down