bjope created this revision. bjope requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
When using getByteArrayType the requested size was calculated in char units, but the type used for the array was hardcoded to the Int8Ty. Honor the size of char, and use getIntNTy in combination with getCharWidth to make the code a bit more consistent. This can be considered as NFC, as getCharWidth always return 8 and can't be configured (at least not in-tree). It just makes the code a bit more consistent, and it might be helpful for out-of-tree targets that implement different char widths. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D94977 Files: clang/lib/CodeGen/CGRecordLayoutBuilder.cpp Index: clang/lib/CodeGen/CGRecordLayoutBuilder.cpp =================================================================== --- clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -127,15 +127,20 @@ /// 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.
Index: clang/lib/CodeGen/CGRecordLayoutBuilder.cpp =================================================================== --- clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -127,15 +127,20 @@ /// 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits