Hi Ken, This broke some GCC tests. Test case: -- ddunbar@ozzy:~$ curl -s -o - http://minormatter.com/~ddunbar/files/t.i | clang -x c - Assertion failed: (Size % Context.getCharWidth() == 0), function getSize, file /Volumes/Data/Users/ddunbar/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp, line 702. 0 clang 0x0000000101b656a5 PrintStackTrace(void*) + 53 1 clang 0x0000000101b65c6b SignalHandler(int) + 379 2 libSystem.B.dylib 0x00007fff882e767a _sigtramp + 26 3 clang 0x0000000100ac8b05 std::pair<unsigned long long, unsigned int>::pair(unsigned long long const&, unsigned int const&) + 37 4 clang 0x000000010003460b raise + 27 5 clang 0x00000001000346ca abort + 26 6 clang 0x00000001000346a4 __assert_rtn + 132 7 clang 0x0000000100be8f7b (anonymous namespace)::RecordLayoutBuilder::getSize() const + 123 8 clang 0x0000000100be9b60 (anonymous namespace)::RecordLayoutBuilder::LayoutField(clang::FieldDecl const*) + 2448 9 clang 0x0000000100beccf3 (anonymous namespace)::RecordLayoutBuilder::LayoutFields(clang::RecordDecl const*) + 99 10 clang 0x0000000100be7459 (anonymous namespace)::RecordLayoutBuilder::Layout(clang::RecordDecl const*) + 57 11 clang 0x0000000100be6ce7 clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const + 1591 12 clang 0x0000000100a9415a clang::ASTContext::getTypeInfo(clang::Type const*) const + 2458 13 clang 0x0000000100ab7315 clang::ASTContext::getTypeInfo(clang::QualType) const + 53 14 clang 0x0000000100ab84f1 clang::ASTContext::getTypeSize(clang::QualType) const + 33 15 clang 0x0000000100a94913 clang::ASTContext::getTypeSizeInChars(clang::QualType) const + 51 16 clang 0x0000000100c1c04d clang::ConstantArrayType::getNumAddressingBits(clang::ASTContext&, clang::QualType, llvm::APInt const&) + 413 17 clang 0x00000001008062c8 clang::Sema::BuildArrayType(clang::QualType, clang::ArrayType::ArraySizeModifier, clang::Expr*, unsigned int, clang::SourceRange, clang::DeclarationName) + 4312 18 clang 0x0000000100808d0c clang::Sema::GetTypeForDeclarator(clang::Declarator&, clang::Scope*, clang::TagDecl**, bool) + 4956 19 clang 0x00000001005099d5 clang::Sema::HandleDeclarator(clang::Scope*, clang::Declarator&, clang::ASTMultiPtr<clang::TemplateParameterList*>, bool) + 2645 20 clang 0x0000000100508f72 clang::Sema::ActOnDeclarator(clang::Scope*, clang::Declarator&) + 98 21 clang 0x00000001004008d2 clang::Parser::ParseDeclarationAfterDeclarator(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&) + 482 22 clang 0x000000010040036c clang::Parser::ParseDeclGroup(clang::Parser::ParsingDeclSpec&, unsigned int, bool, clang::SourceLocation*) + 956 23 clang 0x00000001004602eb clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsingDeclSpec&, clang::AccessSpecifier) + 1339 24 clang 0x0000000100460360 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::AccessSpecifier) + 96 25 clang 0x000000010045f7e5 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::Parser::ParsingDeclSpec*) + 3493 26 clang 0x000000010045ea09 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 297 27 clang 0x00000001003f7a2c clang::ParseAST(clang::Sema&, bool) + 284 28 clang 0x00000001000e7c7c clang::ASTFrontendAction::ExecuteAction() + 284 29 clang 0x00000001003b8ae2 clang::CodeGenAction::ExecuteAction() + 1250 30 clang 0x00000001000e7827 clang::FrontendAction::Execute() + 343 31 clang 0x00000001000b6886 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1078 32 clang 0x000000010004b2e5 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1077 33 clang 0x0000000100037aa4 cc1_main(char const**, char const**, char const*, void*) + 1252 34 clang 0x0000000100044d3d main + 701 35 clang 0x00000001000375b4 start + 52 Stack dump: 0. Program arguments: /Volumes/Data/Users/ddunbar/llvm.obj.64/Debug+Asserts/bin/clang -cc1 -triple x86_64-apple-darwin10.0.0 -emit-obj -mrelax-all -disable-free -main-file-name - -pic-level 1 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 97.17 -resource-dir /Volumes/Data/Users/ddunbar/llvm.obj.64/Debug+Asserts/bin/../lib/clang/2.9 -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -fblocks -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/U7/U7vhB+idGBy-KpZXlZNuXU+++TI/-Tmp-/cc-aS7bjZ.o -x c - 1. /Users/ddunbar/public/clang-tests/gcc-4_2-testsuite/obj/gcc.dg-struct-layout-1/t002_test.h:26:83: current parser token ';' clang: error: unable to execute command: Illegal instruction clang: error: clang frontend command failed due to signal 1 (use -v to see invocation) --
I'll revert for now, please take a look! Thanks, - Daniel On Wed, Feb 23, 2011 at 6:12 PM, Ken Dyck <[email protected]> wrote: > Author: kjdyck > Date: Wed Feb 23 20:12:14 2011 > New Revision: 126357 > > URL: http://llvm.org/viewvc/llvm-project?rev=126357&view=rev > Log: > Use CharUnits values for Size and DataSize outside of the bitfield layout > methods, when they are known to be exact multiples of the width of the char > type. > > Modified: > cfe/trunk/lib/AST/RecordLayoutBuilder.cpp > > Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=126357&r1=126356&r2=126357&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original) > +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Wed Feb 23 20:12:14 2011 > @@ -815,8 +815,8 @@ > assert(DataSize == 0 && "Vtable pointer must be at offset zero!"); > > // Update the size. > - setSize(getSizeInBits() + GetVirtualPointersSize(RD)); > - setDataSize(getSizeInBits()); > + setSize(getSize() + > Context.toCharUnitsFromBits(GetVirtualPointersSize(RD))); > + setDataSize(getSize()); > > CharUnits UnpackedBaseAlign = > Context.toCharUnitsFromBits(Context.Target.getPointerAlign(0)); > @@ -1108,8 +1108,7 @@ > // If we have an empty base class, try to place it at offset 0. > if (Base->Class->isEmpty() && > EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) { > - uint64_t RecordSizeInBits = Context.toBits(Layout.getSize()); > - setSize(std::max(getSizeInBits(), RecordSizeInBits)); > + setSize(std::max(getSize(), Layout.getSize())); > > return CharUnits::Zero(); > } > @@ -1124,27 +1123,24 @@ > } > > // Round up the current record size to the base's alignment boundary. > - uint64_t Offset = > - llvm::RoundUpToAlignment(getDataSizeInBits(), Context.toBits(BaseAlign)); > + CharUnits Offset = getDataSize().RoundUpToAlignment(BaseAlign); > > // Try to place the base. > - while (!EmptySubobjects->CanPlaceBaseAtOffset(Base, > - > Context.toCharUnitsFromBits(Offset))) > - Offset += Context.toBits(BaseAlign); > + while (!EmptySubobjects->CanPlaceBaseAtOffset(Base, Offset)) > + Offset += BaseAlign; > > if (!Base->Class->isEmpty()) { > // Update the data size. > - setDataSize(Offset + Context.toBits(Layout.getNonVirtualSize())); > + setDataSize(Offset + Layout.getNonVirtualSize()); > > - setSize(std::max(getSizeInBits(), getDataSizeInBits())); > + setSize(std::max(getSize(), getDataSize())); > } else > - setSize(std::max(getSizeInBits(), > - Offset + Context.toBits(Layout.getSize()))); > + setSize(std::max(getSize(), Offset + Layout.getSize())); > > // Remember max struct/class alignment. > UpdateAlignment(BaseAlign, UnpackedBaseAlign); > > - return Context.toCharUnitsFromBits(Offset); > + return Offset; > } > > void RecordLayoutBuilder::InitializeLayout(const Decl *D) { > @@ -1233,7 +1229,7 @@ > // We start laying out ivars not at the end of the superclass > // structure, but at the next byte following the last field. > setSize(SL.getDataSize()); > - setDataSize(getSizeInBits()); > + setDataSize(getSize()); > } > > InitializeLayout(D); > @@ -1483,14 +1479,13 @@ > Context.toBits(UnpackedFieldAlign), FieldPacked, D); > > // Reserve space for this field. > - uint64_t FieldSizeInBits = Context.toBits(FieldSize); > if (IsUnion) > - setSize(std::max(getSizeInBits(), FieldSizeInBits)); > + setSize(std::max(getSize(), FieldSize)); > else > - setSize(Context.toBits(FieldOffset) + FieldSizeInBits); > + setSize(FieldOffset + FieldSize); > > // Update the data size. > - setDataSize(getSizeInBits()); > + setDataSize(getSize()); > > // Remember max struct/class alignment. > UpdateAlignment(FieldAlign, UnpackedFieldAlign); > @@ -1504,17 +1499,18 @@ > // which is not empty but of size 0; such as having fields of > // array of zero-length, remains of Size 0 > if (RD->isEmpty()) > - setSize(8); > + setSize(CharUnits::One()); > } > else > - setSize(8); > + setSize(CharUnits::One()); > } > // Finally, round the size of the record up to the alignment of the > // record itself. > uint64_t UnpaddedSize = getSizeInBits() - UnfilledBitsInLastByte; > - uint64_t UnpackedSize = > + uint64_t UnpackedSizeInBits = > llvm::RoundUpToAlignment(getSizeInBits(), > Context.toBits(UnpackedAlignment)); > + CharUnits UnpackedSize = Context.toCharUnitsFromBits(UnpackedSizeInBits); > setSize(llvm::RoundUpToAlignment(getSizeInBits(), > Context.toBits(Alignment))); > > unsigned CharBitNum = Context.Target.getCharWidth(); > @@ -1536,7 +1532,7 @@ > // Warn if we packed it unnecessarily. If the alignment is 1 byte don't > // bother since there won't be alignment issues. > if (Packed && UnpackedAlignment > CharUnits::One() && > - getSizeInBits() == UnpackedSize) > + getSize() == UnpackedSize) > Diag(D->getLocation(), diag::warn_unnecessary_packed) > << Context.getTypeDeclType(RD); > } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
