This revision was automatically updated to reflect the committed changes. Closed by commit rG7942ebdf01b3: [clang] Add cc1 option for dumping layout for all complete types (authored by daltenty).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D104484/new/ https://reviews.llvm.org/D104484 Files: clang/include/clang/Basic/LangOptions.def clang/include/clang/Driver/Options.td clang/lib/AST/Decl.cpp clang/test/Layout/dump-complete.cpp Index: clang/test/Layout/dump-complete.cpp =================================================================== --- /dev/null +++ clang/test/Layout/dump-complete.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -emit-llvm-only -fdump-record-layouts-complete %s | FileCheck %s + +struct a { + int x; +}; + +struct b { + char y; +} foo; + +class c {}; + +class d; + +// CHECK: 0 | struct a +// CHECK: 0 | struct b +// CHECK: 0 | class c +// CHECK-NOT: 0 | class d Index: clang/lib/AST/Decl.cpp =================================================================== --- clang/lib/AST/Decl.cpp +++ clang/lib/AST/Decl.cpp @@ -4581,6 +4581,13 @@ void RecordDecl::completeDefinition() { assert(!isCompleteDefinition() && "Cannot redefine record!"); TagDecl::completeDefinition(); + + ASTContext &Ctx = getASTContext(); + + // Layouts are dumped when computed, so if we are dumping for all complete + // types, we need to force usage to get types that wouldn't be used elsewhere. + if (Ctx.getLangOpts().DumpRecordLayoutsComplete) + (void)Ctx.getASTRecordLayout(this); } /// isMsStruct - Get whether or not this record uses ms_struct layout. Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5381,10 +5381,13 @@ def fdump_record_layouts_simple : Flag<["-"], "fdump-record-layouts-simple">, HelpText<"Dump record layout information in a simple form used for testing">, MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsSimple">>; +def fdump_record_layouts_complete : Flag<["-"], "fdump-record-layouts-complete">, + HelpText<"Dump record layout information for all complete types">, + MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsComplete">>; def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">, HelpText<"Dump record layout information">, MarshallingInfoFlag<LangOpts<"DumpRecordLayouts">>, - ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath]>; + ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath, fdump_record_layouts_complete.KeyPath]>; def fix_what_you_can : Flag<["-"], "fix-what-you-can">, HelpText<"Apply fix-it advice even in the presence of unfixable errors">, MarshallingInfoFlag<FrontendOpts<"FixWhatYouCan">>; Index: clang/include/clang/Basic/LangOptions.def =================================================================== --- clang/include/clang/Basic/LangOptions.def +++ clang/include/clang/Basic/LangOptions.def @@ -265,6 +265,7 @@ BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision") BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records") BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form") +BENIGN_LANGOPT(DumpRecordLayoutsComplete , 1, 0, "dumping the AST layout of all complete records") BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "dumping the layouts of emitted vtables") LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings") BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden visibility for inline C++ methods")
Index: clang/test/Layout/dump-complete.cpp =================================================================== --- /dev/null +++ clang/test/Layout/dump-complete.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -emit-llvm-only -fdump-record-layouts-complete %s | FileCheck %s + +struct a { + int x; +}; + +struct b { + char y; +} foo; + +class c {}; + +class d; + +// CHECK: 0 | struct a +// CHECK: 0 | struct b +// CHECK: 0 | class c +// CHECK-NOT: 0 | class d Index: clang/lib/AST/Decl.cpp =================================================================== --- clang/lib/AST/Decl.cpp +++ clang/lib/AST/Decl.cpp @@ -4581,6 +4581,13 @@ void RecordDecl::completeDefinition() { assert(!isCompleteDefinition() && "Cannot redefine record!"); TagDecl::completeDefinition(); + + ASTContext &Ctx = getASTContext(); + + // Layouts are dumped when computed, so if we are dumping for all complete + // types, we need to force usage to get types that wouldn't be used elsewhere. + if (Ctx.getLangOpts().DumpRecordLayoutsComplete) + (void)Ctx.getASTRecordLayout(this); } /// isMsStruct - Get whether or not this record uses ms_struct layout. Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5381,10 +5381,13 @@ def fdump_record_layouts_simple : Flag<["-"], "fdump-record-layouts-simple">, HelpText<"Dump record layout information in a simple form used for testing">, MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsSimple">>; +def fdump_record_layouts_complete : Flag<["-"], "fdump-record-layouts-complete">, + HelpText<"Dump record layout information for all complete types">, + MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsComplete">>; def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">, HelpText<"Dump record layout information">, MarshallingInfoFlag<LangOpts<"DumpRecordLayouts">>, - ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath]>; + ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath, fdump_record_layouts_complete.KeyPath]>; def fix_what_you_can : Flag<["-"], "fix-what-you-can">, HelpText<"Apply fix-it advice even in the presence of unfixable errors">, MarshallingInfoFlag<FrontendOpts<"FixWhatYouCan">>; Index: clang/include/clang/Basic/LangOptions.def =================================================================== --- clang/include/clang/Basic/LangOptions.def +++ clang/include/clang/Basic/LangOptions.def @@ -265,6 +265,7 @@ BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision") BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records") BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form") +BENIGN_LANGOPT(DumpRecordLayoutsComplete , 1, 0, "dumping the AST layout of all complete records") BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "dumping the layouts of emitted vtables") LANGOPT(NoConstantCFStrings , 1, 0, "no constant CoreFoundation strings") BENIGN_LANGOPT(InlineVisibilityHidden , 1, 0, "hidden visibility for inline C++ methods")
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits