diff options
Diffstat (limited to 'llvm/lib/CodeGen/ValueTypes.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ValueTypes.cpp | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/ValueTypes.cpp b/llvm/lib/CodeGen/ValueTypes.cpp index 608434800bc3..d514e1642e29 100644 --- a/llvm/lib/CodeGen/ValueTypes.cpp +++ b/llvm/lib/CodeGen/ValueTypes.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Type.h" +#include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TypeSize.h" #include "llvm/Support/WithColor.h" @@ -173,9 +174,20 @@ std::string EVT::getEVTString() const { case MVT::Untyped: return "Untyped"; case MVT::funcref: return "funcref"; case MVT::externref: return "externref"; + case MVT::aarch64svcount: + return "aarch64svcount"; + case MVT::spirvbuiltin: + return "spirvbuiltin"; } } +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +void EVT::dump() const { + print(dbgs()); + dbgs() << "\n"; +} +#endif + /// getTypeForEVT - This method returns an LLVM type corresponding to the /// specified EVT. For integer types, this returns an unsigned type. Note /// that this will abort for types that cannot be represented. @@ -202,14 +214,12 @@ Type *EVT::getTypeForEVT(LLVMContext &Context) const { case MVT::f128: return Type::getFP128Ty(Context); case MVT::ppcf128: return Type::getPPC_FP128Ty(Context); case MVT::x86mmx: return Type::getX86_MMXTy(Context); + case MVT::aarch64svcount: + return TargetExtType::get(Context, "aarch64.svcount"); case MVT::x86amx: return Type::getX86_AMXTy(Context); case MVT::i64x8: return IntegerType::get(Context, 512); - case MVT::externref: - // pointer to opaque struct in addrspace(10) - return PointerType::get(StructType::create(Context), 10); - case MVT::funcref: - // pointer to i8 addrspace(20) - return PointerType::get(Type::getInt8Ty(Context), 20); + case MVT::externref: return Type::getWasm_ExternrefTy(Context); + case MVT::funcref: return Type::getWasm_FuncrefTy(Context); case MVT::v1i1: return FixedVectorType::get(Type::getInt1Ty(Context), 1); case MVT::v2i1: @@ -561,6 +571,7 @@ Type *EVT::getTypeForEVT(LLVMContext &Context) const { /// pointers as MVT::iPTR. If HandleUnknown is true, unknown types are returned /// as Other, otherwise they are invalid. MVT MVT::getVT(Type *Ty, bool HandleUnknown){ + assert(Ty != nullptr && "Invalid type"); switch (Ty->getTypeID()) { default: if (HandleUnknown) return MVT(MVT::Other); @@ -575,6 +586,16 @@ MVT MVT::getVT(Type *Ty, bool HandleUnknown){ case Type::DoubleTyID: return MVT(MVT::f64); case Type::X86_FP80TyID: return MVT(MVT::f80); case Type::X86_MMXTyID: return MVT(MVT::x86mmx); + case Type::TargetExtTyID: { + TargetExtType *TargetExtTy = cast<TargetExtType>(Ty); + if (TargetExtTy->getName() == "aarch64.svcount") + return MVT(MVT::aarch64svcount); + else if (TargetExtTy->getName().starts_with("spirv.")) + return MVT(MVT::spirvbuiltin); + if (HandleUnknown) + return MVT(MVT::Other); + llvm_unreachable("Unknown target ext type!"); + } case Type::X86_AMXTyID: return MVT(MVT::x86amx); case Type::FP128TyID: return MVT(MVT::f128); case Type::PPC_FP128TyID: return MVT(MVT::ppcf128); @@ -607,3 +628,15 @@ EVT EVT::getEVT(Type *Ty, bool HandleUnknown){ } } } + +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +void MVT::dump() const { + print(dbgs()); + dbgs() << "\n"; +} +#endif + +void MVT::print(raw_ostream &OS) const { + OS << EVT(*this).getEVTString(); +} + |