diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index b18e957a58f4..8420a97376c3 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -269,6 +269,7 @@ BENIGN_LANGOPT(ModulesDebugInfo , 1, 0, "Modules debug info") 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(DumpRecordLayoutsCanonical , 1, 0, "dumping the AST layout of records using canonical field types") 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") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 41b7299b0274..c2b21d985124 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5405,13 +5405,16 @@ def stats_file : Joined<["-"], "stats-file=">, def fdump_record_layouts_simple : Flag<["-"], "fdump-record-layouts-simple">, HelpText<"Dump record layout information in a simple form used for testing">, MarshallingInfoFlag>; +def fdump_record_layouts_canonical : Flag<["-"], "fdump-record-layouts-canonical">, + HelpText<"Dump record layout information with canonical field types">, + MarshallingInfoFlag>; def fdump_record_layouts_complete : Flag<["-"], "fdump-record-layouts-complete">, HelpText<"Dump record layout information for all complete types">, MarshallingInfoFlag>; def fdump_record_layouts : Flag<["-"], "fdump-record-layouts">, HelpText<"Dump record layout information">, MarshallingInfoFlag>, - ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath, fdump_record_layouts_complete.KeyPath]>; + ImpliedByAnyOf<[fdump_record_layouts_simple.KeyPath, fdump_record_layouts_complete.KeyPath, fdump_record_layouts_canonical.KeyPath]>; def fix_what_you_can : Flag<["-"], "fix-what-you-can">, HelpText<"Apply fix-it advice even in the presence of unfixable errors">, MarshallingInfoFlag>; diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index beb111e2e971..6ee4178248b9 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -3577,7 +3577,10 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD, } else { PrintOffset(OS, FieldOffset, IndentLevel); } - OS << Field.getType().getAsString() << ' ' << Field << '\n'; + const QualType &FieldType = C.getLangOpts().DumpRecordLayoutsCanonical + ? Field.getType().getCanonicalType() + : Field.getType(); + OS << FieldType.getAsString() << ' ' << Field << '\n'; } // Dump virtual bases. diff --git a/clang/test/Layout/dump-canonical.cpp b/clang/test/Layout/dump-canonical.cpp new file mode 100644 index 000000000000..c7216169efdd --- /dev/null +++ b/clang/test/Layout/dump-canonical.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -emit-llvm-only -fdump-record-layouts %s | FileCheck %s +// RUN: %clang_cc1 -emit-llvm-only -fdump-record-layouts-canonical %s | FileCheck %s -check-prefix CANONICAL + +typedef long foo_t; + + +struct a { + foo_t x; +} b; + +struct c { + typedef foo_t bar_t; + bar_t x; +} d; + +// CHECK: 0 | foo_t +// CHECK: 0 | c::bar_t +// CANONICAL-NOT: 0 | foo_t +// CANONICAL-NOT: 0 | c::bar_t +// CANONICAL: 0 | long