From e220614cf98ffd5291de82cd30bb58b2688e2d29 Mon Sep 17 00:00:00 2001 From: emaste Date: Wed, 23 Jul 2014 14:27:04 +0000 Subject: MFC r266630 by dim: Add the clang patch for r265477. While here, add a description to the patch for r263619, and unify all the URLs to point to svnweb --- ...tch-r265477-clang-r198655-standalone-debug.diff | 318 +++++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff (limited to 'contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff') diff --git a/contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff b/contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff new file mode 100644 index 0000000..aabfb92 --- /dev/null +++ b/contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff @@ -0,0 +1,318 @@ +Merge -fstandalone-debug from Clang r198655: + + Implement a new -fstandalone-debug option. rdar://problem/15685848 + It controls everything that -flimit-debug-info used to, plus the + vtable type optimization. The old -fno-limit-debug-info option is now an + alias to -fstandalone-debug and vice versa. + + Standalone is the default on Darwin until dtrace is updated to work with + non-standalone debug info (rdar://problem/15758808). + + Note: I kept the LimitedDebugInfo name in CodeGenOptions::DebugInfoKind + because NoStandaloneDebugInfo sounded even more confusing. + +Introduced here: http://svnweb.freebsd.org/changeset/base/265477 + +Index: tools/clang/lib/CodeGen/CGDebugInfo.cpp +=================================================================== +--- tools/clang/lib/CodeGen/CGDebugInfo.cpp ++++ tools/clang/lib/CodeGen/CGDebugInfo.cpp +@@ -1456,13 +1456,13 @@ llvm::DIType CGDebugInfo::CreateType(const RecordT + // declaration. The completeType, completeRequiredType, and completeClassData + // callbacks will handle promoting the declaration to a definition. + if (T || ++ // Under -flimit-debug-info: + (DebugKind <= CodeGenOptions::LimitedDebugInfo && +- // Under -flimit-debug-info, emit only a declaration unless the type is +- // required to be complete. +- !RD->isCompleteDefinitionRequired() && CGM.getLangOpts().CPlusPlus) || +- // If the class is dynamic, only emit a declaration. A definition will be +- // emitted whenever the vtable is emitted. +- (CXXDecl && CXXDecl->hasDefinition() && CXXDecl->isDynamicClass()) || T) { ++ // Emit only a forward declaration unless the type is required. ++ ((!RD->isCompleteDefinitionRequired() && CGM.getLangOpts().CPlusPlus) || ++ // If the class is dynamic, only emit a declaration. A definition will be ++ // emitted whenever the vtable is emitted. ++ (CXXDecl && CXXDecl->hasDefinition() && CXXDecl->isDynamicClass())))) { + llvm::DIDescriptor FDContext = + getContextDescriptor(cast(RD->getDeclContext())); + if (!T) +Index: tools/clang/lib/Frontend/CompilerInvocation.cpp +=================================================================== +--- tools/clang/lib/Frontend/CompilerInvocation.cpp ++++ tools/clang/lib/Frontend/CompilerInvocation.cpp +@@ -295,7 +295,8 @@ static void ParseCommentArgs(CommentOptions &Opts, + } + + static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, +- DiagnosticsEngine &Diags) { ++ DiagnosticsEngine &Diags, ++ const TargetOptions &TargetOpts) { + using namespace options; + bool Success = true; + +@@ -322,10 +323,16 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, + Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly); + } 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)) ++ bool Default = false; ++ // Until dtrace (via CTF) can deal with distributed debug info, ++ // Darwin defaults to standalone/full debug info. ++ if (llvm::Triple(TargetOpts.Triple).isOSDarwin()) ++ Default = true; ++ ++ if (Args.hasFlag(OPT_fstandalone_debug, OPT_fno_standalone_debug, Default)) ++ Opts.setDebugInfo(CodeGenOptions::FullDebugInfo); ++ else + Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo); +- else +- Opts.setDebugInfo(CodeGenOptions::FullDebugInfo); + } + Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info); + Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file); +@@ -1657,8 +1664,9 @@ bool CompilerInvocation::CreateFromArgs(CompilerIn + ParseFileSystemArgs(Res.getFileSystemOpts(), *Args); + // FIXME: We shouldn't have to pass the DashX option around here + InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), *Args, Diags); +- Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags) +- && Success; ++ ParseTargetArgs(Res.getTargetOpts(), *Args); ++ Success = ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, DashX, Diags, ++ Res.getTargetOpts()) && Success; + ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args); + if (DashX != IK_AST && DashX != IK_LLVM_IR) { + ParseLangArgs(*Res.getLangOpts(), *Args, DashX, Diags); +@@ -1673,8 +1681,6 @@ bool CompilerInvocation::CreateFromArgs(CompilerIn + ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, Diags); + ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args, + Res.getFrontendOpts().ProgramAction); +- ParseTargetArgs(Res.getTargetOpts(), *Args); +- + return Success; + } + +Index: tools/clang/lib/Driver/Tools.cpp +=================================================================== +--- tools/clang/lib/Driver/Tools.cpp ++++ tools/clang/lib/Driver/Tools.cpp +@@ -2995,8 +2995,8 @@ void Clang::ConstructJob(Compilation &C, const Job + Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); + Args.AddLastArg(CmdArgs, options::OPT_fformat_extensions); + Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); +- Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); +- Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info); ++ Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug); ++ Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug); + Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); + // AltiVec language extensions aren't relevant for assembling. + if (!isa(JA) || +Index: tools/clang/test/CodeGenCXX/debug-info-template-member.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-template-member.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-template-member.cpp +@@ -1,4 +1,4 @@ +-// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s ++// RUN: %clang_cc1 -emit-llvm -g -fno-standalone-debug -triple x86_64-apple-darwin %s -o - | FileCheck %s + + struct MyClass { + template int add(int j) { +Index: tools/clang/test/CodeGenCXX/debug-info-vtable-optzn.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-vtable-optzn.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-vtable-optzn.cpp +@@ -0,0 +1,21 @@ ++// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s ++// ++// This tests that the "emit debug info for a C++ class only in the ++// module that has its vtable" optimization is disabled by default on ++// Darwin. ++// ++// CHECK: [ DW_TAG_member ] [lost] ++class A ++{ ++ virtual bool f() = 0; ++ int lost; ++}; ++ ++class B : public A ++{ ++ B *g(); ++}; ++ ++B *B::g() { ++ return this; ++} +Index: tools/clang/test/CodeGenCXX/debug-info-namespace.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-namespace.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-namespace.cpp +@@ -1,6 +1,6 @@ +-// RUN: %clang -g -S -emit-llvm %s -o - | FileCheck %s +-// RUN: %clang -g -gline-tables-only -S -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-GMLT %s +-// RUN: %clang -g -fno-limit-debug-info -S -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-NOLIMIT %s ++// RUN: %clang -g -fno-standalone-debug -S -emit-llvm %s -o - | FileCheck %s ++// RUN: %clang -g -gline-tables-only -S -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-GMLT %s ++// RUN: %clang -g -fstandalone-debug -S -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-NOLIMIT %s + + namespace A { + #line 1 "foo.cpp" +Index: tools/clang/test/CodeGenCXX/debug-info-class-limited.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-class-limited.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-class-limited.cpp +@@ -1,4 +1,4 @@ +-// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s ++// RUN: %clang -emit-llvm -fno-standalone-debug -g -S %s -o - | FileCheck %s + + namespace PR16214_1 { + // CHECK-DAG: [ DW_TAG_structure_type ] [foo] [line [[@LINE+1]], {{.*}} [def] +Index: tools/clang/test/CodeGenCXX/debug-info-method2.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-method2.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-method2.cpp +@@ -1,4 +1,4 @@ +-// RUN: %clang_cc1 -flimit-debug-info -x c++ -g -S -emit-llvm < %s | FileCheck %s ++// RUN: %clang_cc1 -fno-standalone-debug -x c++ -g -S -emit-llvm < %s | FileCheck %s + // rdar://10336845 + // Preserve type qualifiers in -flimit-debug-info mode. + +Index: tools/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp +@@ -1,4 +1,4 @@ +-// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin -fno-limit-debug-info %s -o - | FileCheck %s ++// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin -fstandalone-debug %s -o - | FileCheck %s + + class Test + { +Index: tools/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-class-nolimit.cpp +@@ -1,4 +1,6 @@ +-// RUN: %clang_cc1 -triple x86_64-unk-unk -fno-limit-debug-info -o - -emit-llvm -g %s | FileCheck %s ++// RUN: %clang_cc1 -triple x86_64-unk-unk -fstandalone-debug -o - -emit-llvm -g %s | FileCheck %s ++// On Darwin, this should be the default: ++// RUN: %clang_cc1 -triple x86_64-apple-darwin -o - -emit-llvm -g %s | FileCheck %s + + namespace rdar14101097_1 { // see also PR16214 + // Check that we emit debug info for the definition of a struct if the +Index: tools/clang/test/CodeGenCXX/debug-info-template-limit.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-template-limit.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-template-limit.cpp +@@ -1,4 +1,4 @@ +-// RUN: %clang -flimit-debug-info -emit-llvm -g -S %s -o - | FileCheck %s ++// RUN: %clang -fno-standalone-debug -emit-llvm -g -S %s -o - | FileCheck %s + + // Check that this pointer type is TC + // CHECK: ![[LINE:[0-9]+]] = {{.*}}"TC", {{.*}} metadata !"_ZTS2TCIiE"} ; [ DW_TAG_class_type ] +Index: tools/clang/test/CodeGenCXX/debug-info-pubtypes.cpp +=================================================================== +--- tools/clang/test/CodeGenCXX/debug-info-pubtypes.cpp ++++ tools/clang/test/CodeGenCXX/debug-info-pubtypes.cpp +@@ -1,5 +1,5 @@ + // REQUIRES: x86-64-registered-target +-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -g -fno-limit-debug-info -S -mllvm -generate-dwarf-pub-sections=Enable %s -o - | FileCheck %s ++// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -g -fstandalone-debug -S -mllvm -generate-dwarf-pub-sections=Enable %s -o - | FileCheck %s + + // FIXME: This testcase shouldn't rely on assembly emission. + //CHECK: Lpubtypes_begin[[SECNUM:[0-9]:]] +Index: tools/clang/include/clang/Frontend/CodeGenOptions.h +=================================================================== +--- tools/clang/include/clang/Frontend/CodeGenOptions.h ++++ tools/clang/include/clang/Frontend/CodeGenOptions.h +@@ -50,12 +50,20 @@ class CodeGenOptions : public CodeGenOptionsBase { + }; + + enum DebugInfoKind { +- NoDebugInfo, // Don't generate debug info. +- DebugLineTablesOnly, // Emit only debug info necessary for generating +- // line number tables (-gline-tables-only). +- LimitedDebugInfo, // Limit generated debug info to reduce size +- // (-flimit-debug-info). +- FullDebugInfo // Generate complete debug info. ++ NoDebugInfo, /// Don't generate debug info. ++ ++ DebugLineTablesOnly, /// Emit only debug info necessary for generating ++ /// line number tables (-gline-tables-only). ++ ++ LimitedDebugInfo, /// Limit generated debug info to reduce size ++ /// (-fno-standalone-debug). This emits ++ /// forward decls for types that could be ++ /// replaced with forward decls in the source ++ /// code. For dynamic C++ classes type info ++ /// is only emitted int the module that ++ /// contains the classe's vtable. ++ ++ FullDebugInfo /// Generate complete debug info. + }; + + enum TLSModel { +Index: tools/clang/include/clang/Driver/Options.td +=================================================================== +--- tools/clang/include/clang/Driver/Options.td ++++ tools/clang/include/clang/Driver/Options.td +@@ -549,8 +549,6 @@ def finstrument_functions : Flag<["-"], "finstrume + def fkeep_inline_functions : Flag<["-"], "fkeep-inline-functions">, Group; + def flat__namespace : Flag<["-"], "flat_namespace">; + def flax_vector_conversions : Flag<["-"], "flax-vector-conversions">, Group; +-def flimit_debug_info : Flag<["-"], "flimit-debug-info">, Group, Flags<[CC1Option]>, +- HelpText<"Limit debug information produced to reduce size of debug binary">; + def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, Group; + def flto : Flag<["-"], "flto">, Group; + def fno_lto : Flag<["-"], "fno-lto">, Group; +@@ -645,8 +643,6 @@ def fno_inline : Flag<["-"], "fno-inline">, Group< + def fno_keep_inline_functions : Flag<["-"], "fno-keep-inline-functions">, Group; + def fno_lax_vector_conversions : Flag<["-"], "fno-lax-vector-conversions">, Group, + HelpText<"Disallow implicit conversions between vectors with a different number of elements or different element types">, Flags<[CC1Option]>; +-def fno_limit_debug_info : Flag<["-"], "fno-limit-debug-info">, Group, Flags<[CC1Option]>, +- HelpText<"Do not limit debug information produced to reduce size of debug binary">; + def fno_merge_all_constants : Flag<["-"], "fno-merge-all-constants">, Group, + Flags<[CC1Option]>, HelpText<"Disallow merging of constants">; + def fno_modules : Flag <["-"], "fno-modules">, Group, +@@ -774,6 +770,12 @@ def fno_signed_char : Flag<["-"], "fno-signed-char + def fsplit_stack : Flag<["-"], "fsplit-stack">, Group; + def fstack_protector_all : Flag<["-"], "fstack-protector-all">, Group; + def fstack_protector : Flag<["-"], "fstack-protector">, Group; ++def fstandalone_debug : Flag<["-"], "fstandalone-debug">, Group, Flags<[CC1Option]>, ++ HelpText<"Emit full debug info for all types used by the program">; ++def fno_standalone_debug : Flag<["-"], "fno-standalone-debug">, Group, Flags<[CC1Option]>, ++ HelpText<"Limit debug information produced to reduce size of debug binary">; ++def flimit_debug_info : Flag<["-"], "flimit-debug-info">, Alias; ++def fno_limit_debug_info : Flag<["-"], "fno-limit-debug-info">, Alias; + def fstrict_aliasing : Flag<["-"], "fstrict-aliasing">, Group; + def fstrict_enums : Flag<["-"], "fstrict-enums">, Group, Flags<[CC1Option]>, + HelpText<"Enable optimizations based on the strict definition of an enum's " +Index: tools/clang/docs/tools/clang.pod +=================================================================== +--- tools/clang/docs/tools/clang.pod ++++ tools/clang/docs/tools/clang.pod +@@ -310,9 +310,23 @@ Currently equivalent to B<-O3> + =item B<-g> + + Generate debug information. Note that Clang debug information works best at +-B<-O0>. At higher optimization levels, only line number information is +-currently available. ++B<-O0>. + ++=item B<-fstandalone-debug> B<-fno-standalone-debug> ++ ++Clang supports a number of optimizations to reduce the size of debug ++information in the binary. They work based on the assumption that the ++debug type information can be spread out over multiple compilation ++units. For instance, Clang will not emit type definitions for types ++that are not needed by a module and could be replaced with a forward ++declaration. Further, Clang will only emit type info for a dynamic ++C++ class in the module that contains the vtable for the class. ++ ++The B<-fstandalone-debug> option turns off these optimizations. This ++is useful when working with 3rd-party libraries that don't come with ++debug information. Note that Clang will never emit type information ++for types that are not referenced at all by the program. ++ + =item B<-fexceptions> + + Enable generation of unwind information, this allows exceptions to be thrown -- cgit v1.1