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..6fa36421810f0 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 TargetExtTy = LLVMTargetExtTypeInContext( + Ctx, Name, TypeParams.data(), TypeParams.size(), IntParams.data(), + IntParams.size()); + + return TargetExtTy; + } } fprintf(stderr, "%d is not a supported typekind\n", Kind);