diff --git a/clang/docs/ClangCommandLineReference.rst b/clang/docs/ClangCommandLineReference.rst --- a/clang/docs/ClangCommandLineReference.rst +++ b/clang/docs/ClangCommandLineReference.rst @@ -3546,6 +3546,8 @@ .. option:: -gstrict-dwarf, -gno-strict-dwarf +Restrict DWARF features to those defined in the specified version, avoiding features from later versions. + .. option:: -gz=, -gz (equivalent to -gz=zlib) DWARF debug sections compression type diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -293,6 +293,7 @@ VALUE_CODEGENOPT(StackProbeSize , 32, 4096) ///< Overrides default stack ///< probe size, even if 0. CODEGENOPT(NoStackArgProbe, 1, 0) ///< Set when -mno-stack-arg-probe is used +CODEGENOPT(DebugStrictDwarf, 1, 1) ///< Whether or not to use strict DWARF info. CODEGENOPT(DebugColumnInfo, 1, 0) ///< Whether or not to use column information ///< in debug info. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2788,8 +2788,10 @@ Group; def : Flag<["-"], "grecord-gcc-switches">, Alias; def : Flag<["-"], "gno-record-gcc-switches">, Alias; -def gstrict_dwarf : Flag<["-"], "gstrict-dwarf">, Group; -def gno_strict_dwarf : Flag<["-"], "gno-strict-dwarf">, Group; +defm strict_dwarf : BoolOption<"g", "strict-dwarf", + CodeGenOpts<"DebugStrictDwarf">, DefaultFalse, + PosFlag, NegFlag, BothFlags<[CoreOption]>>, + Group; defm column_info : BoolOption<"g", "column-info", CodeGenOpts<"DebugColumnInfo">, DefaultTrue, NegFlag, PosFlag, BothFlags<[CoreOption]>>, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3962,7 +3962,14 @@ DebugInfoKind == codegenoptions::DebugDirectivesOnly) DebugInfoKind = codegenoptions::NoDebugInfo; - // We ignore flag -gstrict-dwarf for now. + // strict DWARF is set to false by default. But for DBX, we need it to be set + // as true by default. + if (const Arg *A = Args.getLastArg(options::OPT_gstrict_dwarf)) + (void)checkDebugInfoOption(A, Args, D, TC); + if (Args.hasFlag(options::OPT_gstrict_dwarf, options::OPT_gno_strict_dwarf, + DebuggerTuning == llvm::DebuggerKind::DBX)) + CmdArgs.push_back("-gstrict-dwarf"); + // And we handle flag -grecord-gcc-switches later with DWARFDebugFlags. Args.ClaimAllArgs(options::OPT_g_flags_Group); diff --git a/clang/test/Driver/debug-options.c b/clang/test/Driver/debug-options.c --- a/clang/test/Driver/debug-options.c +++ b/clang/test/Driver/debug-options.c @@ -110,6 +110,18 @@ // RUN: %clang -### -c -g %s -target powerpc64-ibm-aix-xcoff 2>&1 \ // RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_DBX %s +// For DBX, -g defaults to -gstrict-dwarf. +// RUN: %clang -### -c -g %s -target powerpc-ibm-aix-xcoff 2>&1 \ +// RUN: | FileCheck -check-prefix=STRICT %s +// RUN: %clang -### -c -g %s -target powerpc64-ibm-aix-xcoff 2>&1 \ +// RUN: | FileCheck -check-prefix=STRICT %s +// RUN: %clang -### -c -g -gno-strict-dwarf %s -target powerpc-ibm-aix-xcoff \ +// RUN: 2>&1 | FileCheck -check-prefix=NOSTRICT %s +// RUN: %clang -### -c -g %s -target x86_64-linux-gnu 2>&1 \ +// RUN: | FileCheck -check-prefix=NOSTRICT %s +// RUN: %clang -### -c -g -ggdb %s -target powerpc-ibm-aix-xcoff 2>&1 \ +// RUN: | FileCheck -check-prefix=NOSTRICT %s + // On the AIX, -g defaults to -gno-column-info. // RUN: %clang -### -c -g %s -target powerpc-ibm-aix-xcoff 2>&1 \ // RUN: | FileCheck -check-prefix=NOCI %s @@ -314,6 +326,9 @@ // G_SCE: "-debugger-tuning=sce" // G_DBX: "-debugger-tuning=dbx" // +// STRICT: "-gstrict-dwarf" +// NOSTRICT-NOT: "-gstrict-dwarf" +// // G_NOTUNING: "-cc1" // G_NOTUNING-NOT: "-debugger-tuning=" //