summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2014-07-23 14:27:04 +0000
committeremaste <emaste@FreeBSD.org>2014-07-23 14:27:04 +0000
commite220614cf98ffd5291de82cd30bb58b2688e2d29 (patch)
tree37c4ca5ef73136e2c53cecf392949f8b1f8d356e /contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff
parentfa849536194409f5071d8b0ee3e83e1cd07d74db (diff)
downloadFreeBSD-src-e220614cf98ffd5291de82cd30bb58b2688e2d29.zip
FreeBSD-src-e220614cf98ffd5291de82cd30bb58b2688e2d29.tar.gz
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
Diffstat (limited to 'contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff')
-rw-r--r--contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff318
1 files changed, 318 insertions, 0 deletions
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<Decl>(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<PreprocessJobAction>(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 i> 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<int>
+ // CHECK: ![[LINE:[0-9]+]] = {{.*}}"TC<int>", {{.*}} 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<clang_ignored_f_Group>;
+ def flat__namespace : Flag<["-"], "flat_namespace">;
+ def flax_vector_conversions : Flag<["-"], "flax-vector-conversions">, Group<f_Group>;
+-def flimit_debug_info : Flag<["-"], "flimit-debug-info">, Group<f_Group>, Flags<[CC1Option]>,
+- HelpText<"Limit debug information produced to reduce size of debug binary">;
+ def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, Group<f_Group>;
+ def flto : Flag<["-"], "flto">, Group<f_Group>;
+ def fno_lto : Flag<["-"], "fno-lto">, Group<f_Group>;
+@@ -645,8 +643,6 @@ def fno_inline : Flag<["-"], "fno-inline">, Group<
+ def fno_keep_inline_functions : Flag<["-"], "fno-keep-inline-functions">, Group<clang_ignored_f_Group>;
+ def fno_lax_vector_conversions : Flag<["-"], "fno-lax-vector-conversions">, Group<f_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<f_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<f_Group>,
+ Flags<[CC1Option]>, HelpText<"Disallow merging of constants">;
+ def fno_modules : Flag <["-"], "fno-modules">, Group<f_Group>,
+@@ -774,6 +770,12 @@ def fno_signed_char : Flag<["-"], "fno-signed-char
+ def fsplit_stack : Flag<["-"], "fsplit-stack">, Group<f_Group>;
+ def fstack_protector_all : Flag<["-"], "fstack-protector-all">, Group<f_Group>;
+ def fstack_protector : Flag<["-"], "fstack-protector">, Group<f_Group>;
++def fstandalone_debug : Flag<["-"], "fstandalone-debug">, Group<f_Group>, Flags<[CC1Option]>,
++ HelpText<"Emit full debug info for all types used by the program">;
++def fno_standalone_debug : Flag<["-"], "fno-standalone-debug">, Group<f_Group>, Flags<[CC1Option]>,
++ HelpText<"Limit debug information produced to reduce size of debug binary">;
++def flimit_debug_info : Flag<["-"], "flimit-debug-info">, Alias<fno_standalone_debug>;
++def fno_limit_debug_info : Flag<["-"], "fno-limit-debug-info">, Alias<fstandalone_debug>;
+ def fstrict_aliasing : Flag<["-"], "fstrict-aliasing">, Group<f_Group>;
+ def fstrict_enums : Flag<["-"], "fstrict-enums">, Group<f_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
OpenPOWER on IntegriCloud