Debug Info: support for gdwarf-2 gdwarf-3 gdwarf-4

These options will add a module flag with name "Dwarf Version".
The behavior flag is currently set to Warning, so when two values disagree,
a warning will be emitted.

llvm-svn: 184276
This commit is contained in:
Manman Ren 2013-06-19 01:46:49 +00:00
parent f796cf1ade
commit 9691f7fa35
7 changed files with 45 additions and 5 deletions

View File

@ -810,9 +810,12 @@ def ggdb0 : Flag<["-"], "ggdb0">, Group<g_Group>;
def ggdb1 : Flag<["-"], "ggdb1">, Group<g_Group>; def ggdb1 : Flag<["-"], "ggdb1">, Group<g_Group>;
def ggdb2 : Flag<["-"], "ggdb2">, Group<g_Group>; def ggdb2 : Flag<["-"], "ggdb2">, Group<g_Group>;
def ggdb3 : Flag<["-"], "ggdb3">, Group<g_Group>; def ggdb3 : Flag<["-"], "ggdb3">, Group<g_Group>;
def gdwarf_2 : Flag<["-"], "gdwarf-2">, Group<g_Group>; def gdwarf_2 : Flag<["-"], "gdwarf-2">, Group<g_Group>,
def gdwarf_3 : Flag<["-"], "gdwarf-3">, Group<g_Group>; HelpText<"Generate source level debug information with dwarf version 2">, Flags<[CC1Option]>;
def gdwarf_4 : Flag<["-"], "gdwarf-4">, Group<g_Group>; def gdwarf_3 : Flag<["-"], "gdwarf-3">, Group<g_Group>,
HelpText<"Generate source level debug information with dwarf version 3">, Flags<[CC1Option]>;
def gdwarf_4 : Flag<["-"], "gdwarf-4">, Group<g_Group>,
HelpText<"Generate source level debug information with dwarf version 4">, Flags<[CC1Option]>;
def gfull : Flag<["-"], "gfull">, Group<g_Group>; def gfull : Flag<["-"], "gfull">, Group<g_Group>;
def gused : Flag<["-"], "gused">, Group<g_Group>; def gused : Flag<["-"], "gused">, Group<g_Group>;
def gstabs : Joined<["-"], "gstabs">, Group<g_Group>, Flags<[Unsupported]>; def gstabs : Joined<["-"], "gstabs">, Group<g_Group>, Flags<[Unsupported]>;

View File

@ -135,6 +135,9 @@ VALUE_CODEGENOPT(SSPBufferSize, 32, 0)
/// The kind of generated debug info. /// The kind of generated debug info.
ENUM_CODEGENOPT(DebugInfo, DebugInfoKind, 2, NoDebugInfo) ENUM_CODEGENOPT(DebugInfo, DebugInfoKind, 2, NoDebugInfo)
/// Dwarf version.
VALUE_CODEGENOPT(DwarfVersion, 3, 0)
/// The kind of inlining to perform. /// The kind of inlining to perform.
ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NoInlining) ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NoInlining)

View File

@ -190,6 +190,11 @@ void CodeGenModule::Release() {
(Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) { (Context.getLangOpts().Modules || !LinkerOptionsMetadata.empty())) {
EmitModuleLinkOptions(); EmitModuleLinkOptions();
} }
if (CodeGenOpts.DwarfVersion)
// We actually want the latest version when there are conflicts.
// We can change from Warning to Latest if such mode is supported.
getModule().addModuleFlag(llvm::Module::Warning, "Dwarf Version",
CodeGenOpts.DwarfVersion);
SimplifyPersonality(); SimplifyPersonality();

View File

@ -2489,6 +2489,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
if (A->getOption().matches(options::OPT_gline_tables_only)) if (A->getOption().matches(options::OPT_gline_tables_only))
CmdArgs.push_back("-gline-tables-only"); CmdArgs.push_back("-gline-tables-only");
else if (A->getOption().matches(options::OPT_gdwarf_2))
CmdArgs.push_back("-gdwarf-2");
else if (A->getOption().matches(options::OPT_gdwarf_3))
CmdArgs.push_back("-gdwarf-3");
else if (A->getOption().matches(options::OPT_gdwarf_4))
CmdArgs.push_back("-gdwarf-4");
else if (!A->getOption().matches(options::OPT_g0) && else if (!A->getOption().matches(options::OPT_g0) &&
!A->getOption().matches(options::OPT_ggdb0)) !A->getOption().matches(options::OPT_ggdb0))
CmdArgs.push_back("-g"); CmdArgs.push_back("-g");

View File

@ -318,7 +318,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
if (Args.hasArg(OPT_gline_tables_only)) { if (Args.hasArg(OPT_gline_tables_only)) {
Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly); Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly);
} else if (Args.hasArg(OPT_g_Flag)) { } else if (Args.hasArg(OPT_g_Flag) || Args.hasArg(OPT_gdwarf_2) ||
Args.hasArg(OPT_gdwarf_3) || Args.hasArg(OPT_gdwarf_4)) {
if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, true)) if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, true))
Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo); Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo);
else else
@ -326,6 +327,15 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
} }
Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info); Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file); Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file);
if (Args.hasArg(OPT_gdwarf_2))
Opts.DwarfVersion = 2;
else if (Args.hasArg(OPT_gdwarf_3))
Opts.DwarfVersion = 3;
else if (Args.hasArg(OPT_gdwarf_4))
Opts.DwarfVersion = 4;
else if (Opts.getDebugInfo() != CodeGenOptions::NoDebugInfo)
// Default Dwarf version is 3 if we are generating debug information.
Opts.DwarfVersion = 3;
Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns); Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);

View File

@ -0,0 +1,10 @@
// RUN: %clang -target x86_64-linux-gnu -gdwarf-2 -S -emit-llvm -o - %s | FileCheck %s
// RUN: %clang -target x86_64-linux-gnu -gdwarf-3 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER3
// RUN: %clang -target x86_64-linux-gnu -gdwarf-4 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=VER4
int main (void) {
return 0;
}
// CHECK: metadata !{i32 2, metadata !"Dwarf Version", i32 2}
// VER3: metadata !{i32 2, metadata !"Dwarf Version", i32 3}
// VER4: metadata !{i32 2, metadata !"Dwarf Version", i32 4}

View File

@ -7,7 +7,7 @@
// RUN: %clang -### -c -ggdb %s 2>&1 | FileCheck -check-prefix=G %s // RUN: %clang -### -c -ggdb %s 2>&1 | FileCheck -check-prefix=G %s
// RUN: %clang -### -c -ggdb1 %s 2>&1 | FileCheck -check-prefix=G %s // RUN: %clang -### -c -ggdb1 %s 2>&1 | FileCheck -check-prefix=G %s
// RUN: %clang -### -c -ggdb3 %s 2>&1 | FileCheck -check-prefix=G %s // RUN: %clang -### -c -ggdb3 %s 2>&1 | FileCheck -check-prefix=G %s
// RUN: %clang -### -c -gdwarf-2 %s 2>&1 | FileCheck -check-prefix=G %s // RUN: %clang -### -c -gdwarf-2 %s 2>&1 | FileCheck -check-prefix=G_D2 %s
// //
// RUN: %clang -### -c -gfoo %s 2>&1 | FileCheck -check-prefix=G_NO %s // RUN: %clang -### -c -gfoo %s 2>&1 | FileCheck -check-prefix=G_NO %s
// RUN: %clang -### -c -g -g0 %s 2>&1 | FileCheck -check-prefix=G_NO %s // RUN: %clang -### -c -g -g0 %s 2>&1 | FileCheck -check-prefix=G_NO %s
@ -27,6 +27,9 @@
// //
// G: "-cc1" // G: "-cc1"
// G: "-g" // G: "-g"
//
// G_D2: "-cc1"
// G_D2: "-gdwarf-2"
// //
// G_NO: "-cc1" // G_NO: "-cc1"
// G_NO-NOT: "-g" // G_NO-NOT: "-g"