forked from OSchip/llvm-project
[clang] Add -fdump-record-layouts-canonical option
This option implies -fdump-record-layouts but dumps record layout information with canonical field types, which can be more useful in certain cases when comparing structure layouts. Reviewed By: stevewan Differential Revision: https://reviews.llvm.org/D105112
This commit is contained in:
parent
775cac4cca
commit
9964b0ef82
|
@ -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")
|
||||
|
|
|
@ -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<LangOpts<"DumpRecordLayoutsSimple">>;
|
||||
def fdump_record_layouts_canonical : Flag<["-"], "fdump-record-layouts-canonical">,
|
||||
HelpText<"Dump record layout information with canonical field types">,
|
||||
MarshallingInfoFlag<LangOpts<"DumpRecordLayoutsCanonical">>;
|
||||
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, 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<FrontendOpts<"FixWhatYouCan">>;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue