1*2138c906SJoshua Cranmer //===- TypedPointerType.cpp - Typed Pointer Type --------------------------===// 2*2138c906SJoshua Cranmer // 3*2138c906SJoshua Cranmer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2138c906SJoshua Cranmer // See https://llvm.org/LICENSE.txt for license information. 5*2138c906SJoshua Cranmer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*2138c906SJoshua Cranmer // 7*2138c906SJoshua Cranmer //===----------------------------------------------------------------------===// 8*2138c906SJoshua Cranmer // 9*2138c906SJoshua Cranmer // 10*2138c906SJoshua Cranmer //===----------------------------------------------------------------------===// 11*2138c906SJoshua Cranmer 12*2138c906SJoshua Cranmer #include "llvm/IR/TypedPointerType.h" 13*2138c906SJoshua Cranmer #include "LLVMContextImpl.h" 14*2138c906SJoshua Cranmer 15*2138c906SJoshua Cranmer using namespace llvm; 16*2138c906SJoshua Cranmer 17*2138c906SJoshua Cranmer TypedPointerType *TypedPointerType::get(Type *EltTy, unsigned AddressSpace) { 18*2138c906SJoshua Cranmer assert(EltTy && "Can't get a pointer to <null> type!"); 19*2138c906SJoshua Cranmer assert(isValidElementType(EltTy) && "Invalid type for pointer element!"); 20*2138c906SJoshua Cranmer 21*2138c906SJoshua Cranmer LLVMContextImpl *CImpl = EltTy->getContext().pImpl; 22*2138c906SJoshua Cranmer 23*2138c906SJoshua Cranmer TypedPointerType *&Entry = 24*2138c906SJoshua Cranmer CImpl->ASTypedPointerTypes[std::make_pair(EltTy, AddressSpace)]; 25*2138c906SJoshua Cranmer 26*2138c906SJoshua Cranmer if (!Entry) 27*2138c906SJoshua Cranmer Entry = new (CImpl->Alloc) TypedPointerType(EltTy, AddressSpace); 28*2138c906SJoshua Cranmer return Entry; 29*2138c906SJoshua Cranmer } 30*2138c906SJoshua Cranmer 31*2138c906SJoshua Cranmer TypedPointerType::TypedPointerType(Type *E, unsigned AddrSpace) 32*2138c906SJoshua Cranmer : Type(E->getContext(), TypedPointerTyID), PointeeTy(E) { 33*2138c906SJoshua Cranmer ContainedTys = &PointeeTy; 34*2138c906SJoshua Cranmer NumContainedTys = 1; 35*2138c906SJoshua Cranmer setSubclassData(AddrSpace); 36*2138c906SJoshua Cranmer } 37*2138c906SJoshua Cranmer 38*2138c906SJoshua Cranmer bool TypedPointerType::isValidElementType(Type *ElemTy) { 39*2138c906SJoshua Cranmer return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() && 40*2138c906SJoshua Cranmer !ElemTy->isMetadataTy() && !ElemTy->isTokenTy() && 41*2138c906SJoshua Cranmer !ElemTy->isX86_AMXTy(); 42*2138c906SJoshua Cranmer } 43