1 //===-- llvm/CodeGen/GlobalISel/LowLevelType.cpp --------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file This file implements the more header-heavy bits of the LLT class to 11 /// avoid polluting users' namespaces. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/CodeGen/LowLevelType.h" 16 #include "llvm/IR/DataLayout.h" 17 #include "llvm/IR/DerivedTypes.h" 18 #include "llvm/Support/raw_ostream.h" 19 using namespace llvm; 20 21 LLT::LLT(Type &Ty, const DataLayout &DL) { 22 if (auto VTy = dyn_cast<VectorType>(&Ty)) { 23 SizeInBits = VTy->getElementType()->getPrimitiveSizeInBits(); 24 ElementsOrAddrSpace = VTy->getNumElements(); 25 Kind = ElementsOrAddrSpace == 1 ? Scalar : Vector; 26 } else if (auto PTy = dyn_cast<PointerType>(&Ty)) { 27 Kind = Pointer; 28 SizeInBits = DL.getTypeSizeInBits(&Ty); 29 ElementsOrAddrSpace = PTy->getAddressSpace(); 30 } else if (Ty.isSized()) { 31 // Aggregates are no different from real scalars as far as GlobalISel is 32 // concerned. 33 Kind = Scalar; 34 SizeInBits = DL.getTypeSizeInBits(&Ty); 35 ElementsOrAddrSpace = 1; 36 assert(SizeInBits != 0 && "invalid zero-sized type"); 37 } else { 38 Kind = Unsized; 39 SizeInBits = ElementsOrAddrSpace = 0; 40 } 41 } 42 43 void LLT::print(raw_ostream &OS) const { 44 if (isVector()) 45 OS << "<" << ElementsOrAddrSpace << " x s" << SizeInBits << ">"; 46 else if (isPointer()) 47 OS << "p" << getAddressSpace(); 48 else if (isSized()) 49 OS << "s" << getScalarSizeInBits(); 50 else if (isValid()) 51 OS << "unsized"; 52 else 53 llvm_unreachable("trying to print an invalid type"); 54 } 55