diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 880342dfed1ff5..cf8313f925878d 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -127,15 +127,20 @@ struct CGRecordLowering { /// Wraps llvm::Type::getIntNTy with some implicit arguments. llvm::Type *getIntNType(uint64_t NumBits) { + unsigned AlignedBits = llvm::alignTo(NumBits, Context.getCharWidth()); + return llvm::Type::getIntNTy(Types.getLLVMContext(), AlignedBits); + } + /// Get the LLVM type sized as one character unit. + llvm::Type *getCharType() { return llvm::Type::getIntNTy(Types.getLLVMContext(), - (unsigned)llvm::alignTo(NumBits, 8)); + Context.getCharWidth()); } - /// Gets an llvm type of size NumBytes and alignment 1. - llvm::Type *getByteArrayType(CharUnits NumBytes) { - assert(!NumBytes.isZero() && "Empty byte arrays aren't allowed."); - llvm::Type *Type = llvm::Type::getInt8Ty(Types.getLLVMContext()); - return NumBytes == CharUnits::One() ? Type : - (llvm::Type *)llvm::ArrayType::get(Type, NumBytes.getQuantity()); + /// Gets an llvm type of size NumChars and alignment 1. + llvm::Type *getByteArrayType(CharUnits NumChars) { + assert(!NumChars.isZero() && "Empty byte arrays aren't allowed."); + llvm::Type *Type = getCharType(); + return NumChars == CharUnits::One() ? Type : + (llvm::Type *)llvm::ArrayType::get(Type, NumChars.getQuantity()); } /// Gets the storage type for a field decl and handles storage /// for itanium bitfields that are smaller than their declared type.