xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/compile/compile.c (revision d909946ca08dceb44d7d0f22ec9488679695d976)
1 /* General Compile and inject code
2 
3    Copyright (C) 2014-2015 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "interps.h"
22 #include "ui-out.h"
23 #include "command.h"
24 #include "cli/cli-script.h"
25 #include "cli/cli-utils.h"
26 #include "completer.h"
27 #include "gdbcmd.h"
28 #include "compile.h"
29 #include "compile-internal.h"
30 #include "compile-object-load.h"
31 #include "compile-object-run.h"
32 #include "language.h"
33 #include "frame.h"
34 #include "source.h"
35 #include "block.h"
36 #include "arch-utils.h"
37 #include "filestuff.h"
38 #include "target.h"
39 #include "osabi.h"
40 #include "gdb_wait.h"
41 
42 
43 
44 /* Initial filename for temporary files.  */
45 
46 #define TMP_PREFIX "/tmp/gdbobj-"
47 
48 /* Hold "compile" commands.  */
49 
50 static struct cmd_list_element *compile_command_list;
51 
52 /* Debug flag for "compile" commands.  */
53 
54 int compile_debug;
55 
56 /* Implement "show debug compile".  */
57 
58 static void
59 show_compile_debug (struct ui_file *file, int from_tty,
60 		    struct cmd_list_element *c, const char *value)
61 {
62   fprintf_filtered (file, _("Compile debugging is %s.\n"), value);
63 }
64 
65 
66 
67 /* Check *ARG for a "-raw" or "-r" argument.  Return 0 if not seen.
68    Return 1 if seen and update *ARG.  */
69 
70 static int
71 check_raw_argument (char **arg)
72 {
73   *arg = skip_spaces (*arg);
74 
75   if (arg != NULL
76       && (check_for_argument (arg, "-raw", sizeof ("-raw") - 1)
77 	  || check_for_argument (arg, "-r", sizeof ("-r") - 1)))
78       return 1;
79   return 0;
80 }
81 
82 /* Handle the input from the 'compile file' command.  The "compile
83    file" command is used to evaluate an expression contained in a file
84    that may contain calls to the GCC compiler.  */
85 
86 static void
87 compile_file_command (char *arg, int from_tty)
88 {
89   enum compile_i_scope_types scope = COMPILE_I_SIMPLE_SCOPE;
90   char *buffer;
91   struct cleanup *cleanup;
92 
93   cleanup = make_cleanup_restore_integer (&interpreter_async);
94   interpreter_async = 0;
95 
96   /* Check the user did not just <enter> after command.  */
97   if (arg == NULL)
98     error (_("You must provide a filename for this command."));
99 
100   /* Check if a raw (-r|-raw) argument is provided.  */
101   if (arg != NULL && check_raw_argument (&arg))
102     {
103       scope = COMPILE_I_RAW_SCOPE;
104       arg = skip_spaces (arg);
105     }
106 
107   /* After processing arguments, check there is a filename at the end
108      of the command.  */
109   if (arg[0] == '\0')
110     error (_("You must provide a filename with the raw option set."));
111 
112   if (arg[0] == '-')
113     error (_("Unknown argument specified."));
114 
115   arg = skip_spaces (arg);
116   arg = gdb_abspath (arg);
117   make_cleanup (xfree, arg);
118   buffer = xstrprintf ("#include \"%s\"\n", arg);
119   make_cleanup (xfree, buffer);
120   eval_compile_command (NULL, buffer, scope);
121   do_cleanups (cleanup);
122 }
123 
124 /* Handle the input from the 'compile code' command.  The
125    "compile code" command is used to evaluate an expression that may
126    contain calls to the GCC compiler.  The language expected in this
127    compile command is the language currently set in GDB.  */
128 
129 static void
130 compile_code_command (char *arg, int from_tty)
131 {
132   struct cleanup *cleanup;
133   enum compile_i_scope_types scope = COMPILE_I_SIMPLE_SCOPE;
134 
135   cleanup = make_cleanup_restore_integer (&interpreter_async);
136   interpreter_async = 0;
137 
138   if (arg != NULL && check_raw_argument (&arg))
139     {
140       scope = COMPILE_I_RAW_SCOPE;
141       arg = skip_spaces (arg);
142     }
143 
144   arg = skip_spaces (arg);
145 
146   if (arg != NULL && !check_for_argument (&arg, "--", sizeof ("--") - 1))
147     {
148       if (arg[0] == '-')
149 	error (_("Unknown argument specified."));
150     }
151 
152   if (arg && *arg)
153       eval_compile_command (NULL, arg, scope);
154   else
155     {
156       struct command_line *l = get_command_line (compile_control, "");
157 
158       make_cleanup_free_command_lines (&l);
159       l->control_u.compile.scope = scope;
160       execute_control_command_untraced (l);
161     }
162 
163   do_cleanups (cleanup);
164 }
165 
166 /* A cleanup function to remove a directory and all its contents.  */
167 
168 static void
169 do_rmdir (void *arg)
170 {
171   const char *dir = arg;
172   char *zap;
173   int wstat;
174 
175   gdb_assert (strncmp (dir, TMP_PREFIX, strlen (TMP_PREFIX)) == 0);
176   zap = concat ("rm -rf ", dir, (char *) NULL);
177   wstat = system (zap);
178   if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
179     warning (_("Could not remove temporary directory %s"), dir);
180   XDELETEVEC (zap);
181 }
182 
183 /* Return the name of the temporary directory to use for .o files, and
184    arrange for the directory to be removed at shutdown.  */
185 
186 static const char *
187 get_compile_file_tempdir (void)
188 {
189   static char *tempdir_name;
190 
191 #define TEMPLATE TMP_PREFIX "XXXXXX"
192   char tname[sizeof (TEMPLATE)];
193 
194   if (tempdir_name != NULL)
195     return tempdir_name;
196 
197   strcpy (tname, TEMPLATE);
198 #undef TEMPLATE
199 #ifdef HAVE_MKDTEMP
200   tempdir_name = mkdtemp (tname);
201 #else
202   error (_("Command not supported on this host."));
203 #endif
204   if (tempdir_name == NULL)
205     perror_with_name (_("Could not make temporary directory"));
206 
207   tempdir_name = xstrdup (tempdir_name);
208   make_final_cleanup (do_rmdir, tempdir_name);
209   return tempdir_name;
210 }
211 
212 /* Compute the names of source and object files to use.  The names are
213    allocated by malloc and should be freed by the caller.  */
214 
215 static void
216 get_new_file_names (char **source_file, char **object_file)
217 {
218   static int seq;
219   const char *dir = get_compile_file_tempdir ();
220 
221   ++seq;
222   *source_file = xstrprintf ("%s%sout%d.c", dir, SLASH_STRING, seq);
223   *object_file = xstrprintf ("%s%sout%d.o", dir, SLASH_STRING, seq);
224 }
225 
226 /* Get the block and PC at which to evaluate an expression.  */
227 
228 static const struct block *
229 get_expr_block_and_pc (CORE_ADDR *pc)
230 {
231   const struct block *block = get_selected_block (pc);
232 
233   if (block == NULL)
234     {
235       struct symtab_and_line cursal = get_current_source_symtab_and_line ();
236 
237       if (cursal.symtab)
238 	block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (cursal.symtab),
239 				   STATIC_BLOCK);
240       if (block != NULL)
241 	*pc = BLOCK_START (block);
242     }
243   else
244     *pc = BLOCK_START (block);
245 
246   return block;
247 }
248 
249 /* Call gdb_buildargv, set its result for S into *ARGVP but calculate also the
250    number of parsed arguments into *ARGCP.  If gdb_buildargv has returned NULL
251    then *ARGCP is set to zero.  */
252 
253 static void
254 build_argc_argv (const char *s, int *argcp, char ***argvp)
255 {
256   *argvp = gdb_buildargv (s);
257   *argcp = countargv (*argvp);
258 }
259 
260 /* String for 'set compile-args' and 'show compile-args'.  */
261 static char *compile_args;
262 
263 /* Parsed form of COMPILE_ARGS.  COMPILE_ARGS_ARGV is NULL terminated.  */
264 static int compile_args_argc;
265 static char **compile_args_argv;
266 
267 /* Implement 'set compile-args'.  */
268 
269 static void
270 set_compile_args (char *args, int from_tty, struct cmd_list_element *c)
271 {
272   freeargv (compile_args_argv);
273   build_argc_argv (compile_args, &compile_args_argc, &compile_args_argv);
274 }
275 
276 /* Implement 'show compile-args'.  */
277 
278 static void
279 show_compile_args (struct ui_file *file, int from_tty,
280 		   struct cmd_list_element *c, const char *value)
281 {
282   fprintf_filtered (file, _("Compile command command-line arguments "
283 			    "are \"%s\".\n"),
284 		    value);
285 }
286 
287 /* Append ARGC and ARGV (as parsed by build_argc_argv) to *ARGCP and *ARGVP.
288    ARGCP+ARGVP can be zero+NULL and also ARGC+ARGV can be zero+NULL.  */
289 
290 static void
291 append_args (int *argcp, char ***argvp, int argc, char **argv)
292 {
293   int argi;
294 
295   *argvp = xrealloc (*argvp, (*argcp + argc + 1) * sizeof (**argvp));
296 
297   for (argi = 0; argi < argc; argi++)
298     (*argvp)[(*argcp)++] = xstrdup (argv[argi]);
299   (*argvp)[(*argcp)] = NULL;
300 }
301 
302 /* Return DW_AT_producer parsed for get_selected_frame () (if any).
303    Return NULL otherwise.
304 
305    GCC already filters its command-line arguments only for the suitable ones to
306    put into DW_AT_producer - see GCC function gen_producer_string.  */
307 
308 static const char *
309 get_selected_pc_producer_options (void)
310 {
311   CORE_ADDR pc = get_frame_pc (get_selected_frame (NULL));
312   struct compunit_symtab *symtab = find_pc_compunit_symtab (pc);
313   const char *cs;
314 
315   if (symtab == NULL || symtab->producer == NULL
316       || strncmp (symtab->producer, "GNU ", strlen ("GNU ")) != 0)
317     return NULL;
318 
319   cs = symtab->producer;
320   while (*cs != 0 && *cs != '-')
321     cs = skip_spaces_const (skip_to_space_const (cs));
322   if (*cs != '-')
323     return NULL;
324   return cs;
325 }
326 
327 /* Filter out unwanted options from *ARGCP and ARGV.  */
328 
329 static void
330 filter_args (int *argcp, char **argv)
331 {
332   char **destv;
333 
334   for (destv = argv; *argv != NULL; argv++)
335     {
336       /* -fpreprocessed may get in commonly from ccache.  */
337       if (strcmp (*argv, "-fpreprocessed") == 0)
338 	{
339 	  xfree (*argv);
340 	  (*argcp)--;
341 	  continue;
342 	}
343       *destv++ = *argv;
344     }
345   *destv = NULL;
346 }
347 
348 /* Produce final vector of GCC compilation options.  First element is target
349    size ("-m64", "-m32" etc.), optionally followed by DW_AT_producer options
350    and then compile-args string GDB variable.  */
351 
352 static void
353 get_args (const struct compile_instance *compiler, struct gdbarch *gdbarch,
354 	  int *argcp, char ***argvp)
355 {
356   const char *cs_producer_options;
357   int argc_compiler;
358   char **argv_compiler;
359 
360   build_argc_argv (gdbarch_gcc_target_options (gdbarch),
361 		   argcp, argvp);
362 
363   cs_producer_options = get_selected_pc_producer_options ();
364   if (cs_producer_options != NULL)
365     {
366       int argc_producer;
367       char **argv_producer;
368 
369       build_argc_argv (cs_producer_options, &argc_producer, &argv_producer);
370       filter_args (&argc_producer, argv_producer);
371       append_args (argcp, argvp, argc_producer, argv_producer);
372       freeargv (argv_producer);
373     }
374 
375   build_argc_argv (compiler->gcc_target_options,
376 		   &argc_compiler, &argv_compiler);
377   append_args (argcp, argvp, argc_compiler, argv_compiler);
378   freeargv (argv_compiler);
379 
380   append_args (argcp, argvp, compile_args_argc, compile_args_argv);
381 }
382 
383 /* A cleanup function to destroy a gdb_gcc_instance.  */
384 
385 static void
386 cleanup_compile_instance (void *arg)
387 {
388   struct compile_instance *inst = arg;
389 
390   inst->destroy (inst);
391 }
392 
393 /* A cleanup function to unlink a file.  */
394 
395 static void
396 cleanup_unlink_file (void *arg)
397 {
398   const char *filename = arg;
399 
400   unlink (filename);
401 }
402 
403 /* A helper function suitable for use as the "print_callback" in the
404    compiler object.  */
405 
406 static void
407 print_callback (void *ignore, const char *message)
408 {
409   fputs_filtered (message, gdb_stderr);
410 }
411 
412 /* Process the compilation request.  On success it returns the object
413    file name and *SOURCE_FILEP is set to source file name.  On an
414    error condition, error () is called.  The caller is responsible for
415    freeing both strings.  */
416 
417 static char *
418 compile_to_object (struct command_line *cmd, char *cmd_string,
419 		   enum compile_i_scope_types scope,
420 		   char **source_filep)
421 {
422   char *code;
423   char *source_file, *object_file;
424   struct compile_instance *compiler;
425   struct cleanup *cleanup, *inner_cleanup;
426   const struct block *expr_block;
427   CORE_ADDR trash_pc, expr_pc;
428   int argc;
429   char **argv;
430   int ok;
431   FILE *src;
432   struct gdbarch *gdbarch = get_current_arch ();
433   const char *os_rx;
434   const char *arch_rx;
435   char *triplet_rx;
436   char *error_message;
437 
438   if (!target_has_execution)
439     error (_("The program must be running for the compile command to "\
440 	     "work."));
441 
442   expr_block = get_expr_block_and_pc (&trash_pc);
443   expr_pc = get_frame_address_in_block (get_selected_frame (NULL));
444 
445   /* Set up instance and context for the compiler.  */
446   if (current_language->la_get_compile_instance == NULL)
447     error (_("No compiler support for this language."));
448   compiler = current_language->la_get_compile_instance ();
449   cleanup = make_cleanup (cleanup_compile_instance, compiler);
450 
451   compiler->fe->ops->set_print_callback (compiler->fe, print_callback, NULL);
452 
453   compiler->scope = scope;
454   compiler->block = expr_block;
455 
456   /* From the provided expression, build a scope to pass to the
457      compiler.  */
458   if (cmd != NULL)
459     {
460       struct ui_file *stream = mem_fileopen ();
461       struct command_line *iter;
462 
463       make_cleanup_ui_file_delete (stream);
464       for (iter = cmd->body_list[0]; iter; iter = iter->next)
465 	{
466 	  fputs_unfiltered (iter->line, stream);
467 	  fputs_unfiltered ("\n", stream);
468 	}
469 
470       code = ui_file_xstrdup (stream, NULL);
471       make_cleanup (xfree, code);
472     }
473   else if (cmd_string != NULL)
474     code = cmd_string;
475   else
476     error (_("Neither a simple expression, or a multi-line specified."));
477 
478   code = current_language->la_compute_program (compiler, code, gdbarch,
479 					       expr_block, expr_pc);
480   make_cleanup (xfree, code);
481   if (compile_debug)
482     fprintf_unfiltered (gdb_stdout, "debug output:\n\n%s", code);
483 
484   os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
485   arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
486 
487   /* Allow triplets with or without vendor set.  */
488   triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
489   make_cleanup (xfree, triplet_rx);
490 
491   /* Set compiler command-line arguments.  */
492   get_args (compiler, gdbarch, &argc, &argv);
493   make_cleanup_freeargv (argv);
494 
495   error_message = compiler->fe->ops->set_arguments (compiler->fe, triplet_rx,
496 						    argc, argv);
497   if (error_message != NULL)
498     {
499       make_cleanup (xfree, error_message);
500       error ("%s", error_message);
501     }
502 
503   if (compile_debug)
504     {
505       int argi;
506 
507       fprintf_unfiltered (gdb_stdout, "Passing %d compiler options:\n", argc);
508       for (argi = 0; argi < argc; argi++)
509 	fprintf_unfiltered (gdb_stdout, "Compiler option %d: <%s>\n",
510 			    argi, argv[argi]);
511     }
512 
513   get_new_file_names (&source_file, &object_file);
514   inner_cleanup = make_cleanup (xfree, source_file);
515   make_cleanup (xfree, object_file);
516 
517   src = gdb_fopen_cloexec (source_file, "w");
518   if (src == NULL)
519     perror_with_name (_("Could not open source file for writing"));
520   make_cleanup (cleanup_unlink_file, source_file);
521   if (fputs (code, src) == EOF)
522     perror_with_name (_("Could not write to source file"));
523   fclose (src);
524 
525   if (compile_debug)
526     fprintf_unfiltered (gdb_stdout, "source file produced: %s\n\n",
527 			source_file);
528 
529   /* Call the compiler and start the compilation process.  */
530   compiler->fe->ops->set_source_file (compiler->fe, source_file);
531 
532   if (!compiler->fe->ops->compile (compiler->fe, object_file,
533 				   compile_debug))
534     error (_("Compilation failed."));
535 
536   if (compile_debug)
537     fprintf_unfiltered (gdb_stdout, "object file produced: %s\n\n",
538 			object_file);
539 
540   discard_cleanups (inner_cleanup);
541   do_cleanups (cleanup);
542   *source_filep = source_file;
543   return object_file;
544 }
545 
546 /* The "compile" prefix command.  */
547 
548 static void
549 compile_command (char *args, int from_tty)
550 {
551   /* If a sub-command is not specified to the compile prefix command,
552      assume it is a direct code compilation.  */
553   compile_code_command (args, from_tty);
554 }
555 
556 /* See compile.h.  */
557 
558 void
559 eval_compile_command (struct command_line *cmd, char *cmd_string,
560 		      enum compile_i_scope_types scope)
561 {
562   char *object_file, *source_file;
563 
564   object_file = compile_to_object (cmd, cmd_string, scope, &source_file);
565   if (object_file != NULL)
566     {
567       struct cleanup *cleanup_xfree, *cleanup_unlink;
568       struct compile_module *compile_module;
569 
570       cleanup_xfree = make_cleanup (xfree, object_file);
571       make_cleanup (xfree, source_file);
572       cleanup_unlink = make_cleanup (cleanup_unlink_file, object_file);
573       make_cleanup (cleanup_unlink_file, source_file);
574       compile_module = compile_object_load (object_file, source_file);
575       discard_cleanups (cleanup_unlink);
576       do_cleanups (cleanup_xfree);
577       compile_object_run (compile_module);
578     }
579 }
580 
581 /* See compile/compile-internal.h.  */
582 
583 char *
584 compile_register_name_mangled (struct gdbarch *gdbarch, int regnum)
585 {
586   const char *regname = gdbarch_register_name (gdbarch, regnum);
587 
588   return xstrprintf ("__%s", regname);
589 }
590 
591 /* See compile/compile-internal.h.  */
592 
593 int
594 compile_register_name_demangle (struct gdbarch *gdbarch,
595 				 const char *regname)
596 {
597   int regnum;
598 
599   if (regname[0] != '_' || regname[1] != '_')
600     error (_("Invalid register name \"%s\"."), regname);
601   regname += 2;
602 
603   for (regnum = 0; regnum < gdbarch_num_regs (gdbarch); regnum++)
604     if (strcmp (regname, gdbarch_register_name (gdbarch, regnum)) == 0)
605       return regnum;
606 
607   error (_("Cannot find gdbarch register \"%s\"."), regname);
608 }
609 
610 extern initialize_file_ftype _initialize_compile;
611 
612 void
613 _initialize_compile (void)
614 {
615   struct cmd_list_element *c = NULL;
616 
617   add_prefix_cmd ("compile", class_obscure, compile_command,
618 		  _("\
619 Command to compile source code and inject it into the inferior."),
620 		  &compile_command_list, "compile ", 1, &cmdlist);
621   add_com_alias ("expression", "compile", class_obscure, 0);
622 
623   add_cmd ("code", class_obscure, compile_code_command,
624 	   _("\
625 Compile, inject, and execute code.\n\
626 \n\
627 Usage: compile code [-r|-raw] [--] [CODE]\n\
628 -r|-raw: Suppress automatic 'void _gdb_expr () { CODE }' wrapping.\n\
629 --: Do not parse any options beyond this delimiter.  All text to the\n\
630     right will be treated as source code.\n\
631 \n\
632 The source code may be specified as a simple one line expression, e.g.:\n\
633 \n\
634     compile code printf(\"Hello world\\n\");\n\
635 \n\
636 Alternatively, you can type the source code interactively.\n\
637 You can invoke this mode when no argument is given to the command\n\
638 (i.e.,\"compile code\" is typed with nothing after it).  An\n\
639 interactive prompt will be shown allowing you to enter multiple\n\
640 lines of source code.  Type a line containing \"end\" to indicate\n\
641 the end of the source code."),
642 	   &compile_command_list);
643 
644   c = add_cmd ("file", class_obscure, compile_file_command,
645 	       _("\
646 Evaluate a file containing source code.\n\
647 \n\
648 Usage: compile file [-r|-raw] [filename]\n\
649 -r|-raw: Suppress automatic 'void _gdb_expr () { CODE }' wrapping."),
650 	       &compile_command_list);
651   set_cmd_completer (c, filename_completer);
652 
653   add_setshow_boolean_cmd ("compile", class_maintenance, &compile_debug, _("\
654 Set compile command debugging."), _("\
655 Show compile command debugging."), _("\
656 When on, compile command debugging is enabled."),
657 			   NULL, show_compile_debug,
658 			   &setdebuglist, &showdebuglist);
659 
660   add_setshow_string_cmd ("compile-args", class_support,
661 			  &compile_args,
662 			  _("Set compile command GCC command-line arguments"),
663 			  _("Show compile command GCC command-line arguments"),
664 			  _("\
665 Use options like -I (include file directory) or ABI settings.\n\
666 String quoting is parsed like in shell, for example:\n\
667   -mno-align-double \"-I/dir with a space/include\""),
668 			  set_compile_args, show_compile_args, &setlist, &showlist);
669 
670   /* Override flags possibly coming from DW_AT_producer.  */
671   compile_args = xstrdup ("-O0 -gdwarf-4"
672   /* We use -fPIE Otherwise GDB would need to reserve space large enough for
673      any object file in the inferior in advance to get the final address when
674      to link the object file to and additionally the default system linker
675      script would need to be modified so that one can specify there the
676      absolute target address.
677      -fPIC is not used at is would require from GDB to generate .got.  */
678 			 " -fPIE"
679   /* We don't want warnings.  */
680 			 " -w"
681   /* Override CU's possible -fstack-protector-strong.  */
682 			 " -fno-stack-protector"
683   );
684   set_compile_args (compile_args, 0, NULL);
685 }
686