From 27692de9cfa6224f496b982e12ecd3fb86593cc9 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 13 Nov 2018 20:08:13 +0000 Subject: [PATCH] DebugInfo: Add a driver flag for DWARF debug_ranges base address specifier use. Summary: This saves a lot of relocations in optimized object files (at the cost of some cost/increase in linked executable bytes), but gold's 32 bit gdb-index support has a bug ( https://sourceware.org/bugzilla/show_bug.cgi?id=21894 ) so we can't switch to this unconditionally. (& even if it weren't for that bug, one might argue that some users would want to optimize in one direction or the other - prioritizing object size or linked executable size) Differential Revision: https://reviews.llvm.org/D54243 llvm-svn: 346789 --- clang/include/clang/Driver/Options.td | 4 ++++ clang/include/clang/Frontend/CodeGenOptions.def | 3 +++ clang/lib/CodeGen/CGDebugInfo.cpp | 3 ++- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++++ clang/lib/Frontend/CompilerInvocation.cpp | 1 + clang/test/CodeGen/debug-info-ranges-base-address.c | 9 +++++++++ clang/test/Driver/debug-options.c | 7 +++++++ 7 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGen/debug-info-ranges-base-address.c diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index cc9f21e..2463d7b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1780,6 +1780,10 @@ def fdebug_types_section: Flag <["-"], "fdebug-types-section">, Group, Flags<[CC1Option]>, HelpText<"Place debug types in their own section (ELF Only)">; def fno_debug_types_section: Flag<["-"], "fno-debug-types-section">, Group, Flags<[CC1Option]>; +def fdebug_ranges_base_address: Flag <["-"], "fdebug-ranges-base-address">, Group, + Flags<[CC1Option]>, HelpText<"Use DWARF base address selection entries in debug_ranges">; +def fno_debug_ranges_base_address: Flag <["-"], "fno-debug-ranges-base-address">, Group, + Flags<[CC1Option]>; def fsplit_dwarf_inlining: Flag <["-"], "fsplit-dwarf-inlining">, Group, Flags<[CC1Option]>, HelpText<"Provide minimal debug info in the object/executable to facilitate online symbolication/stack traces in the absence of .dwo/.dwp files when using Split DWARF">; def fno_split_dwarf_inlining: Flag<["-"], "fno-split-dwarf-inlining">, Group, diff --git a/clang/include/clang/Frontend/CodeGenOptions.def b/clang/include/clang/Frontend/CodeGenOptions.def index 3687c59..510dd1c 100644 --- a/clang/include/clang/Frontend/CodeGenOptions.def +++ b/clang/include/clang/Frontend/CodeGenOptions.def @@ -331,6 +331,9 @@ CODEGENOPT(PreserveVec3Type, 1, 0) /// Whether to emit .debug_gnu_pubnames section instead of .debug_pubnames. CODEGENOPT(DebugNameTable, 2, 0) +/// Whether to use DWARF base address specifiers in .debug_ranges. +CODEGENOPT(DebugRangesBaseAddress, 1, 0) + CODEGENOPT(NoPLT, 1, 0) /// Whether to embed source in DWARF debug line section. diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 81cc07d..24c76c2 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -586,7 +586,8 @@ void CGDebugInfo::CreateCompileUnit() { CGM.getTarget().getTriple().isNVPTX() ? llvm::DICompileUnit::DebugNameTableKind::None : static_cast( - CGOpts.DebugNameTable)); + CGOpts.DebugNameTable), + CGOpts.DebugRangesBaseAddress); } llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8de20f6..0e23aae 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3188,6 +3188,11 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D, ? "-gpubnames" : "-ggnu-pubnames"); + if (Args.hasFlag(options::OPT_fdebug_ranges_base_address, + options::OPT_fno_debug_ranges_base_address, false)) { + CmdArgs.push_back("-fdebug-ranges-base-address"); + } + // -gdwarf-aranges turns on the emission of the aranges section in the // backend. // Always enabled for SCE tuning. diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 7be183f..32937d8 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -651,6 +651,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, : Args.hasArg(OPT_gpubnames) ? llvm::DICompileUnit::DebugNameTableKind::Default : llvm::DICompileUnit::DebugNameTableKind::None); + Opts.DebugRangesBaseAddress = Args.hasArg(OPT_fdebug_ranges_base_address); setPGOInstrumentor(Opts, Args, Diags); Opts.InstrProfileOutput = diff --git a/clang/test/CodeGen/debug-info-ranges-base-address.c b/clang/test/CodeGen/debug-info-ranges-base-address.c new file mode 100644 index 0000000..dee7cc5 --- /dev/null +++ b/clang/test/CodeGen/debug-info-ranges-base-address.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck --check-prefix=NORNGBSE %s +// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - -fdebug-ranges-base-address | FileCheck --check-prefix=RNGBSE %s + +// NORNGBSE-NOT: rangesBaseAddress +// RNGBSE: !DICompileUnit({{.*}}, rangesBaseAddress: true + +void f1() { +} + diff --git a/clang/test/Driver/debug-options.c b/clang/test/Driver/debug-options.c index ea9b7e7..e638298 100644 --- a/clang/test/Driver/debug-options.c +++ b/clang/test/Driver/debug-options.c @@ -165,6 +165,10 @@ // RUN: %clang -### -c -gsplit-dwarf %s 2>&1 | FileCheck -check-prefix=GPUB %s // RUN: %clang -### -c -gsplit-dwarf -gno-pubnames %s 2>&1 | FileCheck -check-prefix=NOPUB %s // +// RUN: %clang -### -c -fdebug-ranges-base-address %s 2>&1 | FileCheck -check-prefix=RNGBSE %s +// RUN: %clang -### -c %s 2>&1 | FileCheck -check-prefix=NORNGBSE %s +// RUN: %clang -### -c -fdebug-ranges-base-address -fno-debug-ranges-base-address %s 2>&1 | FileCheck -check-prefix=NORNGBSE %s +// // RUN: %clang -### -c -glldb %s 2>&1 | FileCheck -check-prefix=GPUB %s // RUN: %clang -### -c -glldb -gno-pubnames %s 2>&1 | FileCheck -check-prefix=NOPUB %s // @@ -282,6 +286,9 @@ // // PUB: -gpubnames // +// RNGBSE: -fdebug-ranges-base-address +// NORNGBSE-NOT: -fdebug-ranges-base-address +// // GARANGE: -generate-arange-section // // FDTS: "-mllvm" "-generate-type-units" -- 2.7.4