Update the debug-options.c test to include the debugger target.
Move target-specific defaulting decisions into the driver.
Update how options are handled in the driver (yay tests!).


http://reviews.llvm.org/D8599

Files:
  include/clang/Driver/Options.td
  include/clang/Frontend/CodeGenOptions.def
  include/clang/Frontend/CodeGenOptions.h
  lib/CodeGen/BackendUtil.cpp
  lib/Driver/Tools.cpp
  lib/Frontend/CompilerInvocation.cpp
  test/Driver/debug-options.c

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1039,11 +1039,16 @@
 def g1 : Flag<["-"], "g1">, Group<g_Group>;
 def g2 : Flag<["-"], "g2">, Group<g_Group>;
 def g3 : Flag<["-"], "g3">, Group<g_Group>;
-def ggdb : Flag<["-"], "ggdb">, Group<g_Group>;
+def ggdb : Flag<["-"], "ggdb">, Group<g_Group>,
+  HelpText<"Tune debug info for gdb">, Flags<[CC1Option]>;
 def ggdb0 : Flag<["-"], "ggdb0">, Group<g_Group>;
 def ggdb1 : Flag<["-"], "ggdb1">, Group<g_Group>;
 def ggdb2 : Flag<["-"], "ggdb2">, Group<g_Group>;
 def ggdb3 : Flag<["-"], "ggdb3">, Group<g_Group>;
+def glldb : Flag<["-"], "glldb">, Group<g_Group>,
+  HelpText<"Tune debug info for lldb">, Flags<[CC1Option]>;
+def gsce : Flag<["-"], "gsce">, Group<g_Group>,
+  HelpText<"Tune debug info for an SCE target (e.g. PS4)">, Flags<[CC1Option]>;
 def gdwarf_2 : Flag<["-"], "gdwarf-2">, Group<g_Group>,
   HelpText<"Generate source-level debug information with dwarf version 2">, Flags<[CC1Option,CC1AsOption]>;
 def gdwarf_3 : Flag<["-"], "gdwarf-3">, Group<g_Group>,
Index: include/clang/Frontend/CodeGenOptions.def
===================================================================
--- include/clang/Frontend/CodeGenOptions.def
+++ include/clang/Frontend/CodeGenOptions.def
@@ -155,6 +155,9 @@
 /// The kind of generated debug info.
 ENUM_CODEGENOPT(DebugInfo, DebugInfoKind, 3, NoDebugInfo)
 
+/// Which debugger we are targeting.
+ENUM_CODEGENOPT(Debugger, llvm::DebuggerKind, 2, llvm::DebuggerKind::GDB)
+
 /// Dwarf version.
 VALUE_CODEGENOPT(DwarfVersion, 3, 0)
 
Index: include/clang/Frontend/CodeGenOptions.h
===================================================================
--- include/clang/Frontend/CodeGenOptions.h
+++ include/clang/Frontend/CodeGenOptions.h
@@ -16,6 +16,7 @@
 
 #include "clang/Basic/Sanitizers.h"
 #include "llvm/Support/Regex.h"
+#include "llvm/Target/TargetOptions.h"
 #include <memory>
 #include <string>
 #include <vector>
Index: lib/CodeGen/BackendUtil.cpp
===================================================================
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -532,6 +532,7 @@
   Options.FunctionSections = CodeGenOpts.FunctionSections;
   Options.DataSections = CodeGenOpts.DataSections;
   Options.UniqueSectionNames = CodeGenOpts.UniqueSectionNames;
+  Options.Debugger = CodeGenOpts.getDebugger();
 
   Options.MCOptions.MCRelaxAll = CodeGenOpts.RelaxAll;
   Options.MCOptions.MCSaveTempLabels = CodeGenOpts.SaveTempLabels;
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -3252,6 +3252,7 @@
   // are preserved, all other debug options are substituted with "-g".
   Args.ClaimAllArgs(options::OPT_g_Group);
   if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
+    const llvm::Triple &Triple = getToolChain().getTriple();
     if (A->getOption().matches(options::OPT_gline_tables_only) ||
         A->getOption().matches(options::OPT_g1)) {
       // FIXME: we should support specifying dwarf version with
@@ -3272,14 +3273,24 @@
     else if (!A->getOption().matches(options::OPT_g0) &&
              !A->getOption().matches(options::OPT_ggdb0)) {
       // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
-      const llvm::Triple &Triple = getToolChain().getTriple();
       if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
           Triple.getOS() == llvm::Triple::FreeBSD ||
           Triple.getOS() == llvm::Triple::Solaris)
         CmdArgs.push_back("-gdwarf-2");
       else
         CmdArgs.push_back("-g");
     }
+    // Pass along the debugger target, or a target-specific default.
+    if (Arg *A = Args.getLastArg(options::OPT_ggdb, options::OPT_glldb,
+                                 options::OPT_gsce))
+      CmdArgs.push_back(Args.MakeArgString(A->getSpelling()));
+    else if (Args.hasArg(options::OPT_ggdb1, options::OPT_ggdb2,
+                         options::OPT_ggdb3))
+      CmdArgs.push_back("-ggdb");
+    else if (Triple.isOSDarwin())
+      CmdArgs.push_back("-glldb");
+    else if (Triple.isPS4CPU())
+      CmdArgs.push_back("-gsce");
   }
 
   // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -405,6 +405,13 @@
     // Default Dwarf version is 4 if we are generating debug information.
     Opts.DwarfVersion = 4;
 
+  if (Args.hasArg(OPT_ggdb))
+    Opts.setDebugger(llvm::DebuggerKind::GDB);
+  else if (Args.hasArg(OPT_glldb))
+    Opts.setDebugger(llvm::DebuggerKind::LLDB);
+  else if (Args.hasArg(OPT_gsce))
+    Opts.setDebugger(llvm::DebuggerKind::SCE);
+
   Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);
   Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
   Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
Index: test/Driver/debug-options.c
===================================================================
--- test/Driver/debug-options.c
+++ test/Driver/debug-options.c
@@ -2,30 +2,51 @@
 // rdar://10383444
 
 // RUN: %clang -### -c -g %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_NOTARGET %s
 // RUN: %clang -### -c -g2 %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_NOTARGET %s
 // RUN: %clang -### -c -g3 %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_NOTARGET %s
 // RUN: %clang -### -c -ggdb %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
 // RUN: %clang -### -c -ggdb1 %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
 // RUN: %clang -### -c -ggdb3 %s -target x86_64-linux-gnu 2>&1 \
-                    | FileCheck -check-prefix=G %s
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
+// RUN: %clang -### -c -glldb %s -target x86_64-linux-gnu 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_LLDB %s
 
 // RUN: %clang -### -c -g %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_LLDB %s
 // RUN: %clang -### -c -g2 %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_LLDB %s
 // RUN: %clang -### -c -g3 %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_LLDB %s
 // RUN: %clang -### -c -ggdb %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_GDB %s
 // RUN: %clang -### -c -ggdb1 %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_GDB %s
 // RUN: %clang -### -c -ggdb3 %s -target x86_64-apple-darwin 2>&1 \
-                    | FileCheck -check-prefix=G_DARWIN %s
+                    | FileCheck -check-prefix=G_DARWIN -check-prefix=G_GDB %s
+
+// RUN: %clang -### -c -g %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_SCE %s
+// RUN: %clang -### -c -g2 %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_SCE %s
+// RUN: %clang -### -c -g3 %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_SCE %s
+// RUN: %clang -### -c -ggdb %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
+// RUN: %clang -### -c -ggdb1 %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
+// RUN: %clang -### -c -ggdb3 %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_GDB %s
+// RUN: %clang -### -c -glldb %s -target x86_64-scei-ps4 2>&1 \
+                    | FileCheck -check-prefix=G -check-prefix=G_LLDB %s
+
+// RUN: %clang -### -c -ggdb -glldb -gsce %s 2>&1 | FileCheck -check-prefix=G_SCE %s
+// RUN: %clang -### -c -glldb -gsce -ggdb %s 2>&1 | FileCheck -check-prefix=G_GDB %s
+// RUN: %clang -### -c -gsce -ggdb -glldb %s 2>&1 | FileCheck -check-prefix=G_LLDB %s
 
 // RUN: %clang -### -c -gdwarf-2 %s 2>&1 | FileCheck -check-prefix=G_D2 %s
 //
@@ -87,7 +108,7 @@
 // G_D2: "-gdwarf-2"
 //
 // G_NO: "-cc1"
-// G_NO-NOT: "-g"
+// G_NO-NOT: "-g{{.*}}"
 //
 // GLTO_ONLY: "-cc1"
 // GLTO_ONLY-NOT: "-g"
@@ -126,3 +147,11 @@
 // CI: "-dwarf-column-info"
 //
 // NOCI-NOT: "-dwarf-column-info"
+//
+// G_NOTARGET-NOT: "-ggdb"
+// G_NOTARGET-NOT: "-glldb"
+// G_NOTARGET-NOT: "-gsce"
+//
+// G_GDB: "-ggdb"
+// G_LLDB: "-glldb"
+// G_SCE: "-gsce"
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to