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