void setAlignment(AlignTypeEnum align_type, unsigned abi_align,
unsigned pref_align, uint32_t bit_width);
unsigned getAlignmentInfo(AlignTypeEnum align_type, uint32_t bit_width,
- bool ABIAlign, Type *Ty) const;
+ bool ABIAlign, const Type *Ty) const;
void setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
unsigned PrefAlign, uint32_t TypeByteWidth);
/// Internal helper method that returns requested alignment for type.
- unsigned getAlignment(Type *Ty, bool abi_or_pref) const;
+ unsigned getAlignment(const Type *Ty, bool abi_or_pref) const;
/// \brief Valid alignment predicate.
///
/// If this function is called with a vector of pointers, then the type size
/// of the pointer is returned. This should only be called with a pointer or
/// vector of pointers.
- unsigned getPointerTypeSizeInBits(Type *) const;
+ unsigned getPointerTypeSizeInBits(const Type *) const;
- unsigned getPointerTypeSize(Type *Ty) const {
+ unsigned getPointerTypeSize(const Type *Ty) const {
return getPointerTypeSizeInBits(Ty) / 8;
}
///
/// For example, returns 36 for i36 and 80 for x86_fp80. The type passed must
/// have a size (Type::isSized() must return true).
- uint64_t getTypeSizeInBits(Type *Ty) const;
+ uint64_t getTypeSizeInBits(const Type *Ty) const;
/// \brief Returns the maximum number of bytes that may be overwritten by
/// storing the specified type.
///
/// For example, returns 5 for i36 and 10 for x86_fp80.
- uint64_t getTypeStoreSize(Type *Ty) const {
+ uint64_t getTypeStoreSize(const Type *Ty) const {
return (getTypeSizeInBits(Ty) + 7) / 8;
}
/// storing the specified type; always a multiple of 8.
///
/// For example, returns 40 for i36 and 80 for x86_fp80.
- uint64_t getTypeStoreSizeInBits(Type *Ty) const {
+ uint64_t getTypeStoreSizeInBits(const Type *Ty) const {
return 8 * getTypeStoreSize(Ty);
}
///
/// This is the amount that alloca reserves for this type. For example,
/// returns 12 or 16 for x86_fp80, depending on alignment.
- uint64_t getTypeAllocSize(Type *Ty) const {
+ uint64_t getTypeAllocSize(const Type *Ty) const {
// Round up to the next alignment boundary.
return RoundUpToAlignment(getTypeStoreSize(Ty), getABITypeAlignment(Ty));
}
///
/// This is the amount that alloca reserves for this type. For example,
/// returns 96 or 128 for x86_fp80, depending on alignment.
- uint64_t getTypeAllocSizeInBits(Type *Ty) const {
+ uint64_t getTypeAllocSizeInBits(const Type *Ty) const {
return 8 * getTypeAllocSize(Ty);
}
/// \brief Returns the minimum ABI-required alignment for the specified type.
- unsigned getABITypeAlignment(Type *Ty) const;
+ unsigned getABITypeAlignment(const Type *Ty) const;
/// \brief Returns the minimum ABI-required alignment for an integer type of
/// the specified bitwidth.
/// type.
///
/// This is always at least as good as the ABI alignment.
- unsigned getPrefTypeAlignment(Type *Ty) const;
+ unsigned getPrefTypeAlignment(const Type *Ty) const;
/// \brief Returns the preferred alignment for the specified type, returned as
/// log2 of the value (a shift amount).
- unsigned getPreferredTypeAlignmentShift(Type *Ty) const;
+ unsigned getPreferredTypeAlignmentShift(const Type *Ty) const;
/// \brief Returns an integer type with size at least as big as that of a
/// pointer in the given address space.
/// \brief Returns an integer (vector of integer) type with size at least as
/// big as that of a pointer of the given pointer (vector of pointer) type.
- Type *getIntPtrType(Type *) const;
+ Type *getIntPtrType(const Type *) const;
/// \brief Returns the smallest integer type with size at least as big as
/// Width bits.
/// struct, its size, and the offsets of its fields.
///
/// Note that this information is lazily cached.
- const StructLayout *getStructLayout(StructType *Ty) const;
+ const StructLayout *getStructLayout(const StructType *Ty) const;
/// \brief Returns the preferred alignment of the specified global.
///
private:
friend class DataLayout; // Only DataLayout can create this class
- StructLayout(StructType *ST, const DataLayout &DL);
+ StructLayout(const StructType *ST, const DataLayout &DL);
};
// The implementation of this method is provided inline as it is particularly
// well suited to constant folding when called on a specific Type subclass.
-inline uint64_t DataLayout::getTypeSizeInBits(Type *Ty) const {
+inline uint64_t DataLayout::getTypeSizeInBits(const Type *Ty) const {
assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
switch (Ty->getTypeID()) {
case Type::LabelTyID:
case Type::PointerTyID:
return getPointerSizeInBits(Ty->getPointerAddressSpace());
case Type::ArrayTyID: {
- ArrayType *ATy = cast<ArrayType>(Ty);
+ const ArrayType *ATy = cast<ArrayType>(Ty);
return ATy->getNumElements() *
getTypeAllocSizeInBits(ATy->getElementType());
}
case Type::X86_FP80TyID:
return 80;
case Type::VectorTyID: {
- VectorType *VTy = cast<VectorType>(Ty);
+ const VectorType *VTy = cast<VectorType>(Ty);
return VTy->getNumElements() * getTypeSizeInBits(VTy->getElementType());
}
default:
// Support for StructLayout
//===----------------------------------------------------------------------===//
-StructLayout::StructLayout(StructType *ST, const DataLayout &DL) {
+StructLayout::StructLayout(const StructType *ST, const DataLayout &DL) {
assert(!ST->isOpaque() && "Cannot get layout of opaque structs");
StructAlignment = 0;
StructSize = 0;
/// preferred if ABIInfo = false) the layout wants for the specified datatype.
unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
uint32_t BitWidth, bool ABIInfo,
- Type *Ty) const {
+ const Type *Ty) const {
// Check to see if we have an exact match and remember the best match we see.
int BestMatchIdx = -1;
int LargestInt = -1;
namespace {
class StructLayoutMap {
- typedef DenseMap<StructType*, StructLayout*> LayoutInfoTy;
+ typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
LayoutInfoTy LayoutInfo;
public:
}
}
- StructLayout *&operator[](StructType *STy) {
+ StructLayout *&operator[](const StructType *STy) {
return LayoutInfo[STy];
}
};
clear();
}
-const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
+const StructLayout *DataLayout::getStructLayout(const StructType *Ty) const {
if (!LayoutMap)
LayoutMap = new StructLayoutMap();
return I->TypeByteWidth;
}
-unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {
+unsigned DataLayout::getPointerTypeSizeInBits(const Type *Ty) const {
assert(Ty->isPtrOrPtrVectorTy() &&
"This should only be called with a pointer or pointer vector type");
Get the ABI (\a abi_or_pref == true) or preferred alignment (\a abi_or_pref
== false) for the requested type \a Ty.
*/
-unsigned DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
+unsigned DataLayout::getAlignment(const Type *Ty, bool abi_or_pref) const {
int AlignType = -1;
assert(Ty->isSized() && "Cannot getTypeInfo() on a type that is unsized!");
abi_or_pref, Ty);
}
-unsigned DataLayout::getABITypeAlignment(Type *Ty) const {
+unsigned DataLayout::getABITypeAlignment(const Type *Ty) const {
return getAlignment(Ty, true);
}
return getAlignmentInfo(INTEGER_ALIGN, BitWidth, true, nullptr);
}
-unsigned DataLayout::getPrefTypeAlignment(Type *Ty) const {
+unsigned DataLayout::getPrefTypeAlignment(const Type *Ty) const {
return getAlignment(Ty, false);
}
-unsigned DataLayout::getPreferredTypeAlignmentShift(Type *Ty) const {
+unsigned DataLayout::getPreferredTypeAlignmentShift(const Type *Ty) const {
unsigned Align = getPrefTypeAlignment(Ty);
assert(!(Align & (Align-1)) && "Alignment is not a power of two!");
return Log2_32(Align);
return IntegerType::get(C, getPointerSizeInBits(AddressSpace));
}
-Type *DataLayout::getIntPtrType(Type *Ty) const {
+Type *DataLayout::getIntPtrType(const Type *Ty) const {
assert(Ty->isPtrOrPtrVectorTy() &&
"Expected a pointer or pointer vector type.");
unsigned NumBits = getPointerTypeSizeInBits(Ty);
IntegerType *IntTy = IntegerType::get(Ty->getContext(), NumBits);
- if (VectorType *VecTy = dyn_cast<VectorType>(Ty))
+ if (const VectorType *VecTy = dyn_cast<VectorType>(Ty))
return VectorType::get(IntTy, VecTy->getNumElements());
return IntTy;
}
uint64_t DataLayout::getIndexedOffset(Type *ptrTy,
ArrayRef<Value *> Indices) const {
- Type *Ty = ptrTy;
+ const Type *Ty = ptrTy;
assert(Ty->isPointerTy() && "Illegal argument for getIndexedOffset()");
uint64_t Result = 0;