jit-playback: Move argv-creation to its own function
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 1 Dec 2014 17:56:34 +0000 (17:56 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Mon, 1 Dec 2014 17:56:34 +0000 (17:56 +0000)
gcc/jit/ChangeLog:
* jit-playback.c (gcc::jit::playback::context::compile): Use an
auto_vec<const char *> rather than a const char *[20] for the
top-level argv, and move the logic to build it to...
(gcc::jit::playback::context::make_fake_args): New function.
* jit-playback.h (gcc::jit::playback::context::make_fake_args):
New function.

From-SVN: r218237

gcc/jit/ChangeLog
gcc/jit/jit-playback.c
gcc/jit/jit-playback.h

index 455ba59d81c935c79639b7f7fa2429b7e5240511..5035693e1bf19667b01831898ad8fb003da03b97 100644 (file)
@@ -1,3 +1,12 @@
+2014-12-01  David Malcolm  <dmalcolm@redhat.com>
+
+       * jit-playback.c (gcc::jit::playback::context::compile): Use an
+       auto_vec<const char *> rather than a const char *[20] for the
+       top-level argv, and move the logic to build it to...
+       (gcc::jit::playback::context::make_fake_args): New function.
+       * jit-playback.h (gcc::jit::playback::context::make_fake_args):
+       New function.
+
 2014-12-01  David Malcolm  <dmalcolm@redhat.com>
 
        * Make-lang.in (jit_OBJS): Add jit/jit-result.o.
index cd124eb1b849ecc2964da52c6fe8219a92e45332..b12584ec7491a215158e543904b31ac01d799935 100644 (file)
@@ -1548,8 +1548,6 @@ compile ()
   void *handle = NULL;
   const char *ctxt_progname;
   result *result_obj = NULL;
-  const char *fake_args[20];
-  unsigned int num_args;
 
   m_path_template = make_tempdir_path_template ();
   if (!m_path_template)
@@ -1576,77 +1574,14 @@ compile ()
   if (!ctxt_progname)
     ctxt_progname = "libgccjit.so";
 
-  fake_args[0] = ctxt_progname;
-  fake_args[1] = m_path_c_file;
-  num_args = 2;
-
-#define ADD_ARG(arg) \
-  do \
-    { \
-      gcc_assert(num_args < sizeof(fake_args)/sizeof(char*)); \
-      fake_args[num_args++] = arg; \
-    } \
-  while (0)
-
-  ADD_ARG ("-fPIC");
-
-  /* Handle int options: */
-  switch (get_int_option (GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL))
-    {
-    default:
-      add_error (NULL,
-                "unrecognized optimization level: %i",
-                get_int_option (GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL));
-      return NULL;
-
-    case 0:
-      ADD_ARG ("-O0");
-      break;
-
-    case 1:
-      ADD_ARG ("-O1");
-      break;
-
-    case 2:
-      ADD_ARG ("-O2");
-      break;
-
-    case 3:
-      ADD_ARG ("-O3");
-      break;
-    }
-  /* What about -Os? */
-
-  /* Handle bool options: */
-  if (get_bool_option (GCC_JIT_BOOL_OPTION_DEBUGINFO))
-    ADD_ARG ("-g");
-
-  /* Suppress timing (and other) info.  */
-  if (!get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_SUMMARY))
-    {
-      ADD_ARG ("-quiet");
-      quiet_flag = 1;
-    }
-
-  /* Aggressively garbage-collect, to shake out bugs: */
-  if (get_bool_option (GCC_JIT_BOOL_OPTION_SELFCHECK_GC))
-    {
-      ADD_ARG ("--param");
-      ADD_ARG ("ggc-min-expand=0");
-      ADD_ARG ("--param");
-      ADD_ARG ("ggc-min-heapsize=0");
-    }
-
-  if (get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_EVERYTHING))
-    {
-      ADD_ARG ("-fdump-tree-all");
-      ADD_ARG ("-fdump-rtl-all");
-      ADD_ARG ("-fdump-ipa-all");
-    }
+  auto_vec <const char *> fake_args;
+  make_fake_args (&fake_args, ctxt_progname);
+  if (errors_occurred ())
+    return NULL;
 
   toplev toplev (false);
-
-  toplev.main (num_args, const_cast <char **> (fake_args));
+  toplev.main (fake_args.length (),
+              const_cast <char **> (fake_args.address ()));
   toplev.finalize ();
 
   active_playback_ctxt = NULL;
@@ -1750,6 +1685,78 @@ compile ()
   return result_obj;
 }
 
+/* Helper functions for gcc::jit::playback::context::compile.  */
+
+/* Build a fake argv for toplev::main from the options set
+   by the user on the context .  */
+
+void
+playback::context::
+make_fake_args (auto_vec <const char *> *argvec,
+               const char *ctxt_progname)
+{
+#define ADD_ARG(arg) argvec->safe_push (arg)
+
+  ADD_ARG (ctxt_progname);
+  ADD_ARG (m_path_c_file);
+  ADD_ARG ("-fPIC");
+
+  /* Handle int options: */
+  switch (get_int_option (GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL))
+    {
+    default:
+      add_error (NULL,
+                "unrecognized optimization level: %i",
+                get_int_option (GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL));
+      return;
+
+    case 0:
+      ADD_ARG ("-O0");
+      break;
+
+    case 1:
+      ADD_ARG ("-O1");
+      break;
+
+    case 2:
+      ADD_ARG ("-O2");
+      break;
+
+    case 3:
+      ADD_ARG ("-O3");
+      break;
+    }
+  /* What about -Os? */
+
+  /* Handle bool options: */
+  if (get_bool_option (GCC_JIT_BOOL_OPTION_DEBUGINFO))
+    ADD_ARG ("-g");
+
+  /* Suppress timing (and other) info.  */
+  if (!get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_SUMMARY))
+    {
+      ADD_ARG ("-quiet");
+      quiet_flag = 1;
+    }
+
+  /* Aggressively garbage-collect, to shake out bugs: */
+  if (get_bool_option (GCC_JIT_BOOL_OPTION_SELFCHECK_GC))
+    {
+      ADD_ARG ("--param");
+      ADD_ARG ("ggc-min-expand=0");
+      ADD_ARG ("--param");
+      ADD_ARG ("ggc-min-heapsize=0");
+    }
+
+  if (get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_EVERYTHING))
+    {
+      ADD_ARG ("-fdump-tree-all");
+      ADD_ARG ("-fdump-rtl-all");
+      ADD_ARG ("-fdump-ipa-all");
+    }
+#undef ADD_ARG
+}
+
 /* Top-level hook for playing back a recording context.
 
    This plays back m_recording_ctxt, and, if no errors
index 30e9229e093f4904a68cc7b6c8a2f1d3fd522493..5ffc8690a89cb61002d0d3a6dbe531e0039b056c 100644 (file)
@@ -226,6 +226,14 @@ private:
 
   void handle_locations ();
 
+private:
+
+  /* Functions for implementing "compile".  */
+
+  void
+  make_fake_args (auto_vec <const char *> *argvec,
+                 const char *ctxt_progname);
+
 private:
   ::gcc::jit::recording::context *m_recording_ctxt;