forked from OSchip/llvm-project
[TableGen] Allow TokenTy in intrinsic signatures
Summary: Add the necessary plumbing so that llvm_token_ty can be used as an argument/return type in intrinsic definitions and correspondingly require TokenTy in function types. TokenTy is an opaque type that has no target lowering, but can be used in machine-independent intrinsics. It is required for the upcoming llvm.eh.padparam intrinsic. Reviewers: majnemer, rnk Subscribers: stoklund, llvm-commits Differential Revision: http://reviews.llvm.org/D12532 llvm-svn: 246651
This commit is contained in:
parent
b76a3dfb7d
commit
917c7382c1
|
@ -128,6 +128,9 @@ class MVT {
|
|||
// This value must be a multiple of 32.
|
||||
MAX_ALLOWED_VALUETYPE = 64,
|
||||
|
||||
// Token - A value of type llvm::TokenTy
|
||||
token = 249,
|
||||
|
||||
// Metadata - This is MDNode or MDString.
|
||||
Metadata = 250,
|
||||
|
||||
|
@ -390,6 +393,9 @@ class MVT {
|
|||
case vAny:
|
||||
case Any:
|
||||
llvm_unreachable("Value type is overloaded.");
|
||||
case token:
|
||||
llvm_unreachable("Token type is a sentinel that cannot be used "
|
||||
"in codegen and has no size");
|
||||
case Metadata:
|
||||
llvm_unreachable("Value type is metadata.");
|
||||
case i1 : return 1;
|
||||
|
|
|
@ -82,6 +82,7 @@ def x86mmx : ValueType<64 , 55>; // X86 MMX value
|
|||
def FlagVT : ValueType<0 , 56>; // Pre-RA sched glue
|
||||
def isVoid : ValueType<0 , 57>; // Produces no value
|
||||
def untyped: ValueType<8 , 58>; // Produces an untyped value
|
||||
def token : ValueType<0 , 249>; // TokenTy
|
||||
def MetadataVT: ValueType<0, 250>; // Metadata
|
||||
|
||||
// Pseudo valuetype mapped to the current pointer size to any address space.
|
||||
|
|
|
@ -79,7 +79,7 @@ namespace Intrinsic {
|
|||
/// intrinsic. This is returned by getIntrinsicInfoTableEntries.
|
||||
struct IITDescriptor {
|
||||
enum IITDescriptorKind {
|
||||
Void, VarArg, MMX, Metadata, Half, Float, Double,
|
||||
Void, VarArg, MMX, Token, Metadata, Half, Float, Double,
|
||||
Integer, Vector, Pointer, Struct,
|
||||
Argument, ExtendArgument, TruncArgument, HalfVecArgument,
|
||||
SameVecWidthArgument, PtrToArgument, VecOfPtrsToElt
|
||||
|
|
|
@ -150,6 +150,7 @@ def llvm_anyptr_ty : LLVMAnyPointerType<llvm_i8_ty>; // (space)i8*
|
|||
def llvm_empty_ty : LLVMType<OtherVT>; // { }
|
||||
def llvm_descriptor_ty : LLVMPointerType<llvm_empty_ty>; // { }*
|
||||
def llvm_metadata_ty : LLVMType<MetadataVT>; // !{...}
|
||||
def llvm_token_ty : LLVMType<token>; // token
|
||||
|
||||
def llvm_x86mmx_ty : LLVMType<x86mmx>;
|
||||
def llvm_ptrx86mmx_ty : LLVMPointerType<llvm_x86mmx_ty>; // <1 x i64>*
|
||||
|
|
|
@ -541,22 +541,23 @@ enum IIT_Info {
|
|||
// Values from 16+ are only encodable with the inefficient encoding.
|
||||
IIT_V64 = 16,
|
||||
IIT_MMX = 17,
|
||||
IIT_METADATA = 18,
|
||||
IIT_EMPTYSTRUCT = 19,
|
||||
IIT_STRUCT2 = 20,
|
||||
IIT_STRUCT3 = 21,
|
||||
IIT_STRUCT4 = 22,
|
||||
IIT_STRUCT5 = 23,
|
||||
IIT_EXTEND_ARG = 24,
|
||||
IIT_TRUNC_ARG = 25,
|
||||
IIT_ANYPTR = 26,
|
||||
IIT_V1 = 27,
|
||||
IIT_VARARG = 28,
|
||||
IIT_HALF_VEC_ARG = 29,
|
||||
IIT_SAME_VEC_WIDTH_ARG = 30,
|
||||
IIT_PTR_TO_ARG = 31,
|
||||
IIT_VEC_OF_PTRS_TO_ELT = 32,
|
||||
IIT_I128 = 33
|
||||
IIT_TOKEN = 18,
|
||||
IIT_METADATA = 19,
|
||||
IIT_EMPTYSTRUCT = 20,
|
||||
IIT_STRUCT2 = 21,
|
||||
IIT_STRUCT3 = 22,
|
||||
IIT_STRUCT4 = 23,
|
||||
IIT_STRUCT5 = 24,
|
||||
IIT_EXTEND_ARG = 25,
|
||||
IIT_TRUNC_ARG = 26,
|
||||
IIT_ANYPTR = 27,
|
||||
IIT_V1 = 28,
|
||||
IIT_VARARG = 29,
|
||||
IIT_HALF_VEC_ARG = 30,
|
||||
IIT_SAME_VEC_WIDTH_ARG = 31,
|
||||
IIT_PTR_TO_ARG = 32,
|
||||
IIT_VEC_OF_PTRS_TO_ELT = 33,
|
||||
IIT_I128 = 34
|
||||
};
|
||||
|
||||
|
||||
|
@ -576,6 +577,9 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
|
|||
case IIT_MMX:
|
||||
OutputTable.push_back(IITDescriptor::get(IITDescriptor::MMX, 0));
|
||||
return;
|
||||
case IIT_TOKEN:
|
||||
OutputTable.push_back(IITDescriptor::get(IITDescriptor::Token, 0));
|
||||
return;
|
||||
case IIT_METADATA:
|
||||
OutputTable.push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));
|
||||
return;
|
||||
|
@ -751,6 +755,7 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
|
|||
case IITDescriptor::Void: return Type::getVoidTy(Context);
|
||||
case IITDescriptor::VarArg: return Type::getVoidTy(Context);
|
||||
case IITDescriptor::MMX: return Type::getX86_MMXTy(Context);
|
||||
case IITDescriptor::Token: return Type::getTokenTy(Context);
|
||||
case IITDescriptor::Metadata: return Type::getMetadataTy(Context);
|
||||
case IITDescriptor::Half: return Type::getHalfTy(Context);
|
||||
case IITDescriptor::Float: return Type::getFloatTy(Context);
|
||||
|
|
|
@ -3193,6 +3193,7 @@ bool Verifier::VerifyIntrinsicType(Type *Ty,
|
|||
case IITDescriptor::Void: return !Ty->isVoidTy();
|
||||
case IITDescriptor::VarArg: return true;
|
||||
case IITDescriptor::MMX: return !Ty->isX86_MMXTy();
|
||||
case IITDescriptor::Token: return !Ty->isTokenTy();
|
||||
case IITDescriptor::Metadata: return !Ty->isMetadataTy();
|
||||
case IITDescriptor::Half: return !Ty->isHalfTy();
|
||||
case IITDescriptor::Float: return !Ty->isFloatTy();
|
||||
|
|
|
@ -26,5 +26,5 @@ class Intrinsic<string name, list<LLVMType> param_types = []> {
|
|||
def isVoid : ValueType<0, 57>; // Produces no value
|
||||
def llvm_vararg_ty : LLVMType<isVoid>; // this means vararg here
|
||||
|
||||
// CHECK: /* 0 */ 0, 28, 0,
|
||||
// CHECK: /* 0 */ 0, 29, 0,
|
||||
def int_foo : Intrinsic<"llvm.foo", [llvm_vararg_ty]>;
|
||||
|
|
|
@ -112,6 +112,7 @@ std::string llvm::getEnumName(MVT::SimpleValueType T) {
|
|||
case MVT::v2f64: return "MVT::v2f64";
|
||||
case MVT::v4f64: return "MVT::v4f64";
|
||||
case MVT::v8f64: return "MVT::v8f64";
|
||||
case MVT::token: return "MVT::token";
|
||||
case MVT::Metadata: return "MVT::Metadata";
|
||||
case MVT::iPTR: return "MVT::iPTR";
|
||||
case MVT::iPTRAny: return "MVT::iPTRAny";
|
||||
|
|
|
@ -246,22 +246,23 @@ enum IIT_Info {
|
|||
// Values from 16+ are only encodable with the inefficient encoding.
|
||||
IIT_V64 = 16,
|
||||
IIT_MMX = 17,
|
||||
IIT_METADATA = 18,
|
||||
IIT_EMPTYSTRUCT = 19,
|
||||
IIT_STRUCT2 = 20,
|
||||
IIT_STRUCT3 = 21,
|
||||
IIT_STRUCT4 = 22,
|
||||
IIT_STRUCT5 = 23,
|
||||
IIT_EXTEND_ARG = 24,
|
||||
IIT_TRUNC_ARG = 25,
|
||||
IIT_ANYPTR = 26,
|
||||
IIT_V1 = 27,
|
||||
IIT_VARARG = 28,
|
||||
IIT_HALF_VEC_ARG = 29,
|
||||
IIT_SAME_VEC_WIDTH_ARG = 30,
|
||||
IIT_PTR_TO_ARG = 31,
|
||||
IIT_VEC_OF_PTRS_TO_ELT = 32,
|
||||
IIT_I128 = 33
|
||||
IIT_TOKEN = 18,
|
||||
IIT_METADATA = 19,
|
||||
IIT_EMPTYSTRUCT = 20,
|
||||
IIT_STRUCT2 = 21,
|
||||
IIT_STRUCT3 = 22,
|
||||
IIT_STRUCT4 = 23,
|
||||
IIT_STRUCT5 = 24,
|
||||
IIT_EXTEND_ARG = 25,
|
||||
IIT_TRUNC_ARG = 26,
|
||||
IIT_ANYPTR = 27,
|
||||
IIT_V1 = 28,
|
||||
IIT_VARARG = 29,
|
||||
IIT_HALF_VEC_ARG = 30,
|
||||
IIT_SAME_VEC_WIDTH_ARG = 31,
|
||||
IIT_PTR_TO_ARG = 32,
|
||||
IIT_VEC_OF_PTRS_TO_ELT = 33,
|
||||
IIT_I128 = 34
|
||||
};
|
||||
|
||||
|
||||
|
@ -285,6 +286,7 @@ static void EncodeFixedValueType(MVT::SimpleValueType VT,
|
|||
case MVT::f16: return Sig.push_back(IIT_F16);
|
||||
case MVT::f32: return Sig.push_back(IIT_F32);
|
||||
case MVT::f64: return Sig.push_back(IIT_F64);
|
||||
case MVT::token: return Sig.push_back(IIT_TOKEN);
|
||||
case MVT::Metadata: return Sig.push_back(IIT_METADATA);
|
||||
case MVT::x86mmx: return Sig.push_back(IIT_MMX);
|
||||
// MVT::OtherVT is used to mean the empty struct type here.
|
||||
|
|
Loading…
Reference in New Issue