xref: /llvm-project/llvm/lib/IR/TypedPointerType.cpp (revision 6ca678074ba58e3db50a764400f6137782d338cf)
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