]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/compile/compile.c
gas pending_bundle_size assert
[thirdparty/binutils-gdb.git] / gdb / compile / compile.c
CommitLineData
bb2ec1b3
TT
1/* General Compile and inject code
2
d01e8234 3 Copyright (C) 2014-2025 Free Software Foundation, Inc.
bb2ec1b3
TT
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
3bae94c0 20#include "progspace.h"
13d03262 21#include "ui.h"
bb2ec1b3
TT
22#include "ui-out.h"
23#include "command.h"
24#include "cli/cli-script.h"
25#include "cli/cli-utils.h"
7d8062de 26#include "cli/cli-option.h"
bb2ec1b3 27#include "completer.h"
5b9707eb 28#include "cli/cli-cmds.h"
bb2ec1b3
TT
29#include "compile.h"
30#include "compile-internal.h"
31#include "compile-object-load.h"
32#include "compile-object-run.h"
33#include "language.h"
34#include "frame.h"
35#include "source.h"
36#include "block.h"
37#include "arch-utils.h"
268a13a5 38#include "gdbsupport/filestuff.h"
bb2ec1b3
TT
39#include "target.h"
40#include "osabi.h"
268a13a5 41#include "gdbsupport/gdb_wait.h"
36de76f9 42#include "valprint.h"
6b09f134 43#include <optional>
268a13a5
TT
44#include "gdbsupport/gdb_unlinker.h"
45#include "gdbsupport/pathstuff.h"
6a7f1c20 46#include "gdbsupport/scoped_ignore_signal.h"
7904e961 47#include "gdbsupport/buildargv.h"
bb2ec1b3 48
c4375bc5
GL
49/* Hold "compile" commands. */
50
51static struct cmd_list_element *compile_command_list;
52
bb2ec1b3 53\f
c4375bc5 54#ifdef HAVE_COMPILE
bb2ec1b3
TT
55
56/* Initial filename for temporary files. */
57
58#define TMP_PREFIX "/tmp/gdbobj-"
59
bb2ec1b3
TT
60/* Debug flag for "compile" commands. */
61
491144b5 62bool compile_debug;
bb2ec1b3 63
946d3d10
KS
64/* See compile-internal.h. */
65
66bool
d82b3862 67compile_instance::get_cached_type (struct type *type, gcc_type *ret) const
946d3d10 68{
c4b94535
SM
69 if (auto iter = m_type_map.find (type);
70 iter != m_type_map.end ())
946d3d10 71 {
c4b94535 72 *ret = iter->second;
946d3d10
KS
73 return true;
74 }
75
76 return false;
77}
78
79/* See compile-internal.h. */
80
81void
82compile_instance::insert_type (struct type *type, gcc_type gcc_type)
83{
c4b94535 84 auto [it, inserted] = m_type_map.emplace (type, gcc_type);
946d3d10 85
946d3d10
KS
86 /* The type might have already been inserted in order to handle
87 recursive types. */
c4b94535 88 if (!inserted && it->second != gcc_type)
946d3d10 89 error (_("Unexpected type id from GCC, check you use recent enough GCC."));
946d3d10
KS
90}
91
92/* See compile-internal.h. */
93
94void
95compile_instance::insert_symbol_error (const struct symbol *sym,
96 const char *text)
97{
c4b94535 98 m_symbol_err_map.emplace (sym, text);
946d3d10
KS
99}
100
101/* See compile-internal.h. */
102
103void
104compile_instance::error_symbol_once (const struct symbol *sym)
105{
c4b94535
SM
106 if (auto iter = m_symbol_err_map.find (sym);
107 iter != m_symbol_err_map.end () && !iter->second.empty ())
108 {
109 std::string message = std::move (iter->second);
110 error (_("%s"), message.c_str ());
111 }
946d3d10
KS
112}
113
bb2ec1b3
TT
114/* Implement "show debug compile". */
115
116static void
117show_compile_debug (struct ui_file *file, int from_tty,
118 struct cmd_list_element *c, const char *value)
119{
6cb06a8c 120 gdb_printf (file, _("Compile debugging is %s.\n"), value);
bb2ec1b3
TT
121}
122
123\f
124
e6ed716c 125/* Options for the compile command. */
bb2ec1b3 126
e6ed716c 127struct compile_options
bb2ec1b3 128{
e6ed716c 129 /* For -raw. */
491144b5 130 bool raw = false;
e6ed716c
PA
131};
132
133using compile_flag_option_def
134 = gdb::option::flag_option_def<compile_options>;
135
136static const gdb::option::option_def compile_command_option_defs[] = {
137
138 compile_flag_option_def {
139 "raw",
140 [] (compile_options *opts) { return &opts->raw; },
141 N_("Suppress automatic 'void _gdb_expr () { CODE }' wrapping."),
142 },
143
144};
145
146/* Create an option_def_group for the "compile" command's options,
147 with OPTS as context. */
bb2ec1b3 148
e6ed716c
PA
149static gdb::option::option_def_group
150make_compile_options_def_group (compile_options *opts)
151{
66eb1ed3 152 return {{compile_command_option_defs}, opts};
bb2ec1b3
TT
153}
154
155/* Handle the input from the 'compile file' command. The "compile
156 file" command is used to evaluate an expression contained in a file
157 that may contain calls to the GCC compiler. */
158
159static void
e6ed716c 160compile_file_command (const char *args, int from_tty)
bb2ec1b3 161{
b7b633e9 162 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
bb2ec1b3 163
e6ed716c 164 /* Check if a -raw option is provided. */
bb2ec1b3 165
e6ed716c
PA
166 compile_options options;
167
168 const gdb::option::option_def_group group
169 = make_compile_options_def_group (&options);
170 gdb::option::process_options
171 (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR,
172 group);
bb2ec1b3 173
e6ed716c
PA
174 enum compile_i_scope_types scope
175 = options.raw ? COMPILE_I_RAW_SCOPE : COMPILE_I_SIMPLE_SCOPE;
bb2ec1b3 176
e454ae41 177 std::string filename = extract_single_filename_arg (args);
bb2ec1b3 178
e6ed716c 179 /* After processing options, check whether we have a filename. */
e454ae41 180 if (filename.empty ())
e6ed716c
PA
181 error (_("You must provide a filename for this command."));
182
e454ae41 183 std::string abspath = gdb_abspath (filename.c_str ());
7ab2607f 184 std::string buffer = string_printf ("#include \"%s\"\n", abspath.c_str ());
e3e41d58 185 eval_compile_command (NULL, buffer.c_str (), scope, NULL);
bb2ec1b3
TT
186}
187
e6ed716c
PA
188/* Completer for the "compile file" command. */
189
190static void
191compile_file_command_completer (struct cmd_list_element *ignore,
192 completion_tracker &tracker,
193 const char *text, const char *word)
194{
195 const gdb::option::option_def_group group
196 = make_compile_options_def_group (nullptr);
197 if (gdb::option::complete_options
198 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, group))
199 return;
200
e454ae41
AB
201 word = advance_to_filename_maybe_quoted_complete_word_point (tracker, text);
202 filename_maybe_quoted_completer (ignore, tracker, text, word);
e6ed716c
PA
203}
204
bb2ec1b3
TT
205/* Handle the input from the 'compile code' command. The
206 "compile code" command is used to evaluate an expression that may
207 contain calls to the GCC compiler. The language expected in this
208 compile command is the language currently set in GDB. */
209
210static void
e6ed716c 211compile_code_command (const char *args, int from_tty)
bb2ec1b3 212{
b7b633e9 213 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
bb2ec1b3 214
e6ed716c 215 compile_options options;
bb2ec1b3 216
e6ed716c
PA
217 const gdb::option::option_def_group group
218 = make_compile_options_def_group (&options);
219 gdb::option::process_options
220 (&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, group);
bb2ec1b3 221
e6ed716c
PA
222 enum compile_i_scope_types scope
223 = options.raw ? COMPILE_I_RAW_SCOPE : COMPILE_I_SIMPLE_SCOPE;
bb2ec1b3 224
e6ed716c
PA
225 if (args && *args)
226 eval_compile_command (NULL, args, scope, NULL);
bb2ec1b3
TT
227 else
228 {
12973681 229 counted_command_line l = get_command_line (compile_control, "");
bb2ec1b3 230
bb2ec1b3 231 l->control_u.compile.scope = scope;
93921405 232 execute_control_command_untraced (l.get ());
bb2ec1b3 233 }
bb2ec1b3
TT
234}
235
e6ed716c
PA
236/* Completer for the "compile code" command. */
237
238static void
239compile_code_command_completer (struct cmd_list_element *ignore,
240 completion_tracker &tracker,
241 const char *text, const char *word)
242{
243 const gdb::option::option_def_group group
244 = make_compile_options_def_group (nullptr);
245 if (gdb::option::complete_options
246 (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, group))
247 return;
248
249 word = advance_to_expression_complete_word_point (tracker, text);
250 symbol_completer (ignore, tracker, text, word);
251}
252
36de76f9
JK
253/* Callback for compile_print_command. */
254
255void
256compile_print_value (struct value *val, void *data_voidp)
257{
7d8062de 258 const value_print_options *print_opts = (value_print_options *) data_voidp;
36de76f9 259
7d8062de 260 print_value (val, *print_opts);
36de76f9
JK
261}
262
263/* Handle the input from the 'compile print' command. The "compile
264 print" command is used to evaluate and print an expression that may
265 contain calls to the GCC compiler. The language expected in this
266 compile command is the language currently set in GDB. */
267
268static void
6663cf91 269compile_print_command (const char *arg, int from_tty)
36de76f9 270{
36de76f9 271 enum compile_i_scope_types scope = COMPILE_I_PRINT_ADDRESS_SCOPE;
7d8062de 272 value_print_options print_opts;
36de76f9 273
b7b633e9 274 scoped_restore save_async = make_scoped_restore (&current_ui->async, 0);
36de76f9 275
7d8062de
PA
276 get_user_print_options (&print_opts);
277 /* Override global settings with explicit options, if any. */
278 auto group = make_value_print_options_def_group (&print_opts);
279 gdb::option::process_options
280 (&arg, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER, group);
281
282 print_command_parse_format (&arg, "compile print", &print_opts);
283
284 /* Passing &PRINT_OPTS as SCOPE_DATA is safe as do_module_cleanup
285 will not touch the stale pointer if compile_object_run has
286 already quit. */
36de76f9
JK
287
288 if (arg && *arg)
7d8062de 289 eval_compile_command (NULL, arg, scope, &print_opts);
36de76f9
JK
290 else
291 {
12973681 292 counted_command_line l = get_command_line (compile_control, "");
36de76f9 293
36de76f9 294 l->control_u.compile.scope = scope;
7d8062de 295 l->control_u.compile.scope_data = &print_opts;
93921405 296 execute_control_command_untraced (l.get ());
36de76f9 297 }
36de76f9
JK
298}
299
bb2ec1b3
TT
300/* Return the name of the temporary directory to use for .o files, and
301 arrange for the directory to be removed at shutdown. */
302
303static const char *
304get_compile_file_tempdir (void)
305{
306 static char *tempdir_name;
307
308#define TEMPLATE TMP_PREFIX "XXXXXX"
309 char tname[sizeof (TEMPLATE)];
310
311 if (tempdir_name != NULL)
312 return tempdir_name;
313
314 strcpy (tname, TEMPLATE);
315#undef TEMPLATE
316 tempdir_name = mkdtemp (tname);
317 if (tempdir_name == NULL)
318 perror_with_name (_("Could not make temporary directory"));
319
320 tempdir_name = xstrdup (tempdir_name);
1eae7be1
TT
321 add_final_cleanup ([] ()
322 {
f89ae595
LS
323 char *zap;
324 int wstat;
325
326 gdb_assert (startswith (tempdir_name, TMP_PREFIX));
327 zap = concat ("rm -rf ", tempdir_name, (char *) NULL);
328 wstat = system (zap);
329 if (wstat == -1 || !WIFEXITED (wstat) || WEXITSTATUS (wstat) != 0)
330 warning (_("Could not remove temporary directory %s"), tempdir_name);
331 XDELETEVEC (zap);
1eae7be1 332 });
bb2ec1b3
TT
333 return tempdir_name;
334}
335
aaee65ae 336/* Compute the names of source and object files to use. */
bb2ec1b3 337
aaee65ae
PA
338static compile_file_names
339get_new_file_names ()
bb2ec1b3
TT
340{
341 static int seq;
342 const char *dir = get_compile_file_tempdir ();
343
344 ++seq;
aaee65ae
PA
345
346 return compile_file_names (string_printf ("%s%sout%d.c",
347 dir, SLASH_STRING, seq),
348 string_printf ("%s%sout%d.o",
349 dir, SLASH_STRING, seq));
bb2ec1b3
TT
350}
351
352/* Get the block and PC at which to evaluate an expression. */
353
354static const struct block *
355get_expr_block_and_pc (CORE_ADDR *pc)
356{
357 const struct block *block = get_selected_block (pc);
358
359 if (block == NULL)
360 {
3bae94c0
SM
361 symtab_and_line cursal
362 = get_current_source_symtab_and_line (current_program_space);
bb2ec1b3
TT
363
364 if (cursal.symtab)
63d609de
SM
365 block = cursal.symtab->compunit ()->blockvector ()->static_block ();
366
bb2ec1b3 367 if (block != NULL)
6395b628 368 *pc = block->entry_pc ();
bb2ec1b3
TT
369 }
370 else
6395b628 371 *pc = block->entry_pc ();
bb2ec1b3
TT
372
373 return block;
374}
375
bb2ec1b3 376/* String for 'set compile-args' and 'show compile-args'. */
e0700ba4
SM
377static std::string compile_args =
378 /* Override flags possibly coming from DW_AT_producer. */
379 "-O0 -gdwarf-4"
380 /* We use -fPIE Otherwise GDB would need to reserve space large enough for
381 any object file in the inferior in advance to get the final address when
382 to link the object file to and additionally the default system linker
383 script would need to be modified so that one can specify there the
384 absolute target address.
385 -fPIC is not used at is would require from GDB to generate .got. */
386 " -fPIE"
387 /* We want warnings, except for some commonly happening for GDB commands. */
388 " -Wall "
389 " -Wno-unused-but-set-variable"
390 " -Wno-unused-variable"
391 /* Override CU's possible -fstack-protector-strong. */
392 " -fno-stack-protector";
bb2ec1b3 393
bac51ab7
TT
394/* Parsed form of COMPILE_ARGS. */
395static gdb_argv compile_args_argv;
bb2ec1b3
TT
396
397/* Implement 'set compile-args'. */
398
399static void
eb4c3f4a 400set_compile_args (const char *args, int from_tty, struct cmd_list_element *c)
bb2ec1b3 401{
e0700ba4 402 compile_args_argv = gdb_argv (compile_args.c_str ());
bb2ec1b3
TT
403}
404
405/* Implement 'show compile-args'. */
406
407static void
408show_compile_args (struct ui_file *file, int from_tty,
409 struct cmd_list_element *c, const char *value)
410{
6cb06a8c
TT
411 gdb_printf (file, _("Compile command command-line arguments "
412 "are \"%s\".\n"),
413 value);
bb2ec1b3
TT
414}
415
6e41ddec 416/* String for 'set compile-gcc' and 'show compile-gcc'. */
e0700ba4 417static std::string compile_gcc;
6e41ddec
JK
418
419/* Implement 'show compile-gcc'. */
420
421static void
422show_compile_gcc (struct ui_file *file, int from_tty,
423 struct cmd_list_element *c, const char *value)
424{
6cb06a8c
TT
425 gdb_printf (file, _("Compile command GCC driver filename is \"%s\".\n"),
426 value);
6e41ddec
JK
427}
428
bb2ec1b3
TT
429/* Return DW_AT_producer parsed for get_selected_frame () (if any).
430 Return NULL otherwise.
431
432 GCC already filters its command-line arguments only for the suitable ones to
433 put into DW_AT_producer - see GCC function gen_producer_string. */
434
435static const char *
436get_selected_pc_producer_options (void)
437{
438 CORE_ADDR pc = get_frame_pc (get_selected_frame (NULL));
439 struct compunit_symtab *symtab = find_pc_compunit_symtab (pc);
440 const char *cs;
441
ab5f850e
SM
442 if (symtab == NULL || symtab->producer () == NULL
443 || !startswith (symtab->producer (), "GNU "))
bb2ec1b3
TT
444 return NULL;
445
ab5f850e 446 cs = symtab->producer ();
bb2ec1b3 447 while (*cs != 0 && *cs != '-')
f1735a53 448 cs = skip_spaces (skip_to_space (cs));
bb2ec1b3
TT
449 if (*cs != '-')
450 return NULL;
451 return cs;
452}
453
bac51ab7 454/* Filter out unwanted options from ARGV. */
a7606d80
JK
455
456static void
bac51ab7 457filter_args (char **argv)
a7606d80
JK
458{
459 char **destv;
460
461 for (destv = argv; *argv != NULL; argv++)
462 {
463 /* -fpreprocessed may get in commonly from ccache. */
464 if (strcmp (*argv, "-fpreprocessed") == 0)
465 {
466 xfree (*argv);
a7606d80
JK
467 continue;
468 }
469 *destv++ = *argv;
470 }
471 *destv = NULL;
472}
473
e05cac70
PM
474/* Produce final vector of GCC compilation options.
475
476 The first element of the combined argument vector are arguments
477 relating to the target size ("-m64", "-m32" etc.). These are
478 sourced from the inferior's architecture.
479
480 The second element of the combined argument vector are arguments
481 stored in the inferior DW_AT_producer section. If these are stored
482 in the inferior (there is no guarantee that they are), they are
483 added to the vector.
484
485 The third element of the combined argument vector are argument
486 supplied by the language implementation provided by
487 compile-{lang}-support. These contain language specific arguments.
488
489 The final element of the combined argument vector are arguments
490 supplied by the "set compile-args" command. These are always
491 appended last so as to override any of the arguments automatically
492 generated above. */
bb2ec1b3 493
bac51ab7
TT
494static gdb_argv
495get_args (const compile_instance *compiler, struct gdbarch *gdbarch)
bb2ec1b3
TT
496{
497 const char *cs_producer_options;
9b8ffbf4 498 gdb_argv result;
bb2ec1b3 499
9b8ffbf4
LM
500 std::string gcc_options = gdbarch_gcc_target_options (gdbarch);
501
502 /* Make sure we have a non-empty set of options, otherwise GCC will
503 error out trying to look for a filename that is an empty string. */
504 if (!gcc_options.empty ())
505 result = gdb_argv (gcc_options.c_str ());
bb2ec1b3
TT
506
507 cs_producer_options = get_selected_pc_producer_options ();
508 if (cs_producer_options != NULL)
509 {
bac51ab7
TT
510 gdb_argv argv_producer (cs_producer_options);
511 filter_args (argv_producer.get ());
bb2ec1b3 512
bac51ab7 513 result.append (std::move (argv_producer));
bb2ec1b3
TT
514 }
515
bac51ab7
TT
516 result.append (gdb_argv (compiler->gcc_target_options ().c_str ()));
517 result.append (compile_args_argv);
bb2ec1b3 518
bac51ab7 519 return result;
bb2ec1b3
TT
520}
521
bb2ec1b3
TT
522/* A helper function suitable for use as the "print_callback" in the
523 compiler object. */
524
525static void
526print_callback (void *ignore, const char *message)
527{
0426ad51 528 gdb_puts (message, gdb_stderr);
bb2ec1b3
TT
529}
530
62c95db2
GL
531/* Helper for compile_to_object, to find the compile context
532 based on the current language. */
533static std::unique_ptr<compile_instance>
534get_language_compile_context ()
535{
536 switch (current_language->la_language)
537 {
538 case language_c:
539 return c_get_compile_context ();
540 case language_cplus:
541 return cplus_get_compile_context ();
542 default:
543 return {};
544 }
545}
546
547/* Helper for compile_to_object, to call the correct
548 compute_program based on the current language. */
549static std::string
550compute_program_language (compile_instance *inst, const char *input,
551 struct gdbarch *gdbarch,
552 const struct block *block,
553 CORE_ADDR pc)
554{
555 switch (current_language->la_language)
556 {
557 case language_c:
558 return c_compute_program (inst, input, gdbarch, block, pc);
559 case language_cplus:
560 return cplus_compute_program (inst, input, gdbarch, block, pc);
561 default:
562 gdb_assert_not_reached ("Unsupported language");
563 }
564}
565
bb2ec1b3 566/* Process the compilation request. On success it returns the object
aaee65ae
PA
567 and source file names. On an error condition, error () is
568 called. */
bb2ec1b3 569
aaee65ae 570static compile_file_names
851c9091 571compile_to_object (struct command_line *cmd, const char *cmd_string,
aaee65ae 572 enum compile_i_scope_types scope)
bb2ec1b3 573{
bb2ec1b3
TT
574 const struct block *expr_block;
575 CORE_ADDR trash_pc, expr_pc;
bb2ec1b3 576 int ok;
bb2ec1b3 577 struct gdbarch *gdbarch = get_current_arch ();
7d937cad 578 std::string triplet_rx;
bb2ec1b3 579
55f6301a 580 if (!target_has_execution ())
bb2ec1b3
TT
581 error (_("The program must be running for the compile command to "\
582 "work."));
583
584 expr_block = get_expr_block_and_pc (&trash_pc);
585 expr_pc = get_frame_address_in_block (get_selected_frame (NULL));
586
587 /* Set up instance and context for the compiler. */
bdfea17e 588 std::unique_ptr<compile_instance> compiler
62c95db2
GL
589 = get_language_compile_context ();
590
8e25bafe 591 if (compiler == nullptr)
cdaec3f3 592 error (_("No compiler support for language %s."),
6f7664a9 593 current_language->name ());
9cdfd9a2
KS
594 compiler->set_print_callback (print_callback, NULL);
595 compiler->set_scope (scope);
596 compiler->set_block (expr_block);
bb2ec1b3
TT
597
598 /* From the provided expression, build a scope to pass to the
599 compiler. */
aaee65ae 600
d7e74731 601 string_file input_buf;
aaee65ae
PA
602 const char *input;
603
bb2ec1b3
TT
604 if (cmd != NULL)
605 {
bb2ec1b3
TT
606 struct command_line *iter;
607
12973681 608 for (iter = cmd->body_list_0.get (); iter; iter = iter->next)
bb2ec1b3 609 {
d7e74731
PA
610 input_buf.puts (iter->line);
611 input_buf.puts ("\n");
bb2ec1b3
TT
612 }
613
aaee65ae 614 input = input_buf.c_str ();
bb2ec1b3
TT
615 }
616 else if (cmd_string != NULL)
851c9091 617 input = cmd_string;
bb2ec1b3
TT
618 else
619 error (_("Neither a simple expression, or a multi-line specified."));
620
aaee65ae 621 std::string code
62c95db2
GL
622 = compute_program_language (compiler.get (), input, gdbarch,
623 expr_block, expr_pc);
bb2ec1b3 624 if (compile_debug)
6cb06a8c 625 gdb_printf (gdb_stdlog, "debug output:\n\n%s", code.c_str ());
bb2ec1b3 626
9cdfd9a2 627 compiler->set_verbose (compile_debug);
71b30f27 628
e0700ba4 629 if (!compile_gcc.empty ())
6e41ddec 630 {
9cdfd9a2 631 if (compiler->version () < GCC_FE_VERSION_1)
6e41ddec
JK
632 error (_("Command 'set compile-gcc' requires GCC version 6 or higher "
633 "(libcc1 interface version 1 or higher)"));
634
e0700ba4 635 compiler->set_driver_filename (compile_gcc.c_str ());
6e41ddec
JK
636 }
637 else
638 {
639 const char *os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
640 const char *arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
641
642 /* Allow triplets with or without vendor set. */
54585eee
TT
643 triplet_rx = std::string (arch_rx) + "(-[^-]*)?-";
644 if (os_rx != nullptr)
645 triplet_rx += os_rx;
9cdfd9a2 646 compiler->set_triplet_regexp (triplet_rx.c_str ());
6e41ddec 647 }
bb2ec1b3
TT
648
649 /* Set compiler command-line arguments. */
bac51ab7
TT
650 gdb_argv argv_holder = get_args (compiler.get (), gdbarch);
651 int argc = argv_holder.count ();
652 char **argv = argv_holder.get ();
bb2ec1b3 653
9f7f6cb8
TT
654 gdb::unique_xmalloc_ptr<char> error_message
655 = compiler->set_arguments (argc, argv, triplet_rx.c_str ());
9cdfd9a2 656
bb2ec1b3 657 if (error_message != NULL)
9cdfd9a2 658 error ("%s", error_message.get ());
bb2ec1b3
TT
659
660 if (compile_debug)
661 {
662 int argi;
663
6cb06a8c 664 gdb_printf (gdb_stdlog, "Passing %d compiler options:\n", argc);
bb2ec1b3 665 for (argi = 0; argi < argc; argi++)
6cb06a8c
TT
666 gdb_printf (gdb_stdlog, "Compiler option %d: <%s>\n",
667 argi, argv[argi]);
bb2ec1b3
TT
668 }
669
aaee65ae 670 compile_file_names fnames = get_new_file_names ();
bb2ec1b3 671
6b09f134 672 std::optional<gdb::unlinker> source_remover;
b80cf838 673
d419f42d
TT
674 {
675 gdb_file_up src = gdb_fopen_cloexec (fnames.source_file (), "w");
676 if (src == NULL)
677 perror_with_name (_("Could not open source file for writing"));
b80cf838
TT
678
679 source_remover.emplace (fnames.source_file ());
680
d419f42d
TT
681 if (fputs (code.c_str (), src.get ()) == EOF)
682 perror_with_name (_("Could not write to source file"));
683 }
bb2ec1b3
TT
684
685 if (compile_debug)
6cb06a8c
TT
686 gdb_printf (gdb_stdlog, "source file produced: %s\n\n",
687 fnames.source_file ());
bb2ec1b3 688
4a977544
BE
689 /* If we don't do this, then GDB simply exits
690 when the compiler dies. */
691 scoped_ignore_sigpipe ignore_sigpipe;
692
bb2ec1b3 693 /* Call the compiler and start the compilation process. */
9cdfd9a2
KS
694 compiler->set_source_file (fnames.source_file ());
695 ok = compiler->compile (fnames.object_file (), compile_debug);
e68c32d5 696 if (!ok)
bb2ec1b3
TT
697 error (_("Compilation failed."));
698
699 if (compile_debug)
6cb06a8c
TT
700 gdb_printf (gdb_stdlog, "object file produced: %s\n\n",
701 fnames.object_file ());
bb2ec1b3 702
b80cf838
TT
703 /* Keep the source file. */
704 source_remover->keep ();
aaee65ae 705 return fnames;
bb2ec1b3
TT
706}
707
708/* The "compile" prefix command. */
709
710static void
981a3fb3 711compile_command (const char *args, int from_tty)
bb2ec1b3
TT
712{
713 /* If a sub-command is not specified to the compile prefix command,
714 assume it is a direct code compilation. */
715 compile_code_command (args, from_tty);
716}
717
718/* See compile.h. */
719
720void
851c9091 721eval_compile_command (struct command_line *cmd, const char *cmd_string,
5c65b58a 722 enum compile_i_scope_types scope, void *scope_data)
bb2ec1b3 723{
aaee65ae 724 compile_file_names fnames = compile_to_object (cmd, cmd_string, scope);
bb2ec1b3 725
b80cf838
TT
726 gdb::unlinker object_remover (fnames.object_file ());
727 gdb::unlinker source_remover (fnames.source_file ());
728
e947a848
TT
729 compile_module_up compile_module = compile_object_load (fnames, scope,
730 scope_data);
aaee65ae 731 if (compile_module == NULL)
bb2ec1b3 732 {
aaee65ae
PA
733 gdb_assert (scope == COMPILE_I_PRINT_ADDRESS_SCOPE);
734 eval_compile_command (cmd, cmd_string,
735 COMPILE_I_PRINT_VALUE_SCOPE, scope_data);
736 return;
bb2ec1b3 737 }
b80cf838
TT
738
739 /* Keep the files. */
740 source_remover.keep ();
741 object_remover.keep ();
742
e947a848 743 compile_object_run (std::move (compile_module));
bb2ec1b3
TT
744}
745
746/* See compile/compile-internal.h. */
747
8f84fb0e 748std::string
bb2ec1b3
TT
749compile_register_name_mangled (struct gdbarch *gdbarch, int regnum)
750{
751 const char *regname = gdbarch_register_name (gdbarch, regnum);
752
8f84fb0e 753 return string_printf ("__%s", regname);
bb2ec1b3
TT
754}
755
756/* See compile/compile-internal.h. */
757
758int
759compile_register_name_demangle (struct gdbarch *gdbarch,
760 const char *regname)
761{
762 int regnum;
763
764 if (regname[0] != '_' || regname[1] != '_')
765 error (_("Invalid register name \"%s\"."), regname);
766 regname += 2;
767
768 for (regnum = 0; regnum < gdbarch_num_regs (gdbarch); regnum++)
769 if (strcmp (regname, gdbarch_register_name (gdbarch, regnum)) == 0)
770 return regnum;
771
772 error (_("Cannot find gdbarch register \"%s\"."), regname);
773}
774
9cdfd9a2
KS
775/* Forwards to the plug-in. */
776
777#define FORWARD(OP,...) (m_gcc_fe->ops->OP (m_gcc_fe, ##__VA_ARGS__))
778
779/* See compile-internal.h. */
780
781void
782compile_instance::set_print_callback
783 (void (*print_function) (void *, const char *), void *datum)
784{
785 FORWARD (set_print_callback, print_function, datum);
786}
787
788/* See compile-internal.h. */
789
790unsigned int
791compile_instance::version () const
792{
793 return m_gcc_fe->ops->version;
794}
795
796/* See compile-internal.h. */
797
798void
799compile_instance::set_verbose (int level)
800{
801 if (version () >= GCC_FE_VERSION_1)
802 FORWARD (set_verbose, level);
803}
804
805/* See compile-internal.h. */
806
807void
808compile_instance::set_driver_filename (const char *filename)
809{
810 if (version () >= GCC_FE_VERSION_1)
811 FORWARD (set_driver_filename, filename);
812}
813
814/* See compile-internal.h. */
815
816void
817compile_instance::set_triplet_regexp (const char *regexp)
818{
819 if (version () >= GCC_FE_VERSION_1)
820 FORWARD (set_triplet_regexp, regexp);
821}
822
823/* See compile-internal.h. */
824
9f7f6cb8 825gdb::unique_xmalloc_ptr<char>
9cdfd9a2
KS
826compile_instance::set_arguments (int argc, char **argv, const char *regexp)
827{
828 if (version () >= GCC_FE_VERSION_1)
9f7f6cb8 829 return gdb::unique_xmalloc_ptr<char> (FORWARD (set_arguments, argc, argv));
9cdfd9a2 830 else
9f7f6cb8
TT
831 return gdb::unique_xmalloc_ptr<char> (FORWARD (set_arguments_v0, regexp,
832 argc, argv));
9cdfd9a2
KS
833}
834
835/* See compile-internal.h. */
836
837void
838compile_instance::set_source_file (const char *filename)
839{
840 FORWARD (set_source_file, filename);
841}
842
843/* See compile-internal.h. */
844
845bool
846compile_instance::compile (const char *filename, int verbose_level)
847{
848 if (version () >= GCC_FE_VERSION_1)
849 return FORWARD (compile, filename);
850 else
851 return FORWARD (compile_v0, filename, verbose_level);
852}
853
854#undef FORWARD
855
c4375bc5
GL
856#else /* HAVE_COMPILE */
857
858/* The "compile" prefix command, when support was disabled. */
859
860static void
861compile_command (const char *args, int from_tty)
862{
863 error (_("This command is not supported."));
864}
865
866#endif /* HAVE_COMPILE */
867
8588b356
SM
868/* See compile.h. */
869cmd_list_element *compile_cmd_element = nullptr;
9cdfd9a2 870
5fe70629 871INIT_GDB_FILE (compile)
bb2ec1b3 872{
8588b356 873 compile_cmd_element = add_prefix_cmd ("compile", class_obscure,
c4375bc5
GL
874 compile_command,
875#ifdef HAVE_COMPILE
876 _("\
bb2ec1b3 877Command to compile source code and inject it into the inferior."),
c4375bc5
GL
878#else /* HAVE_COMPILE */
879 _("\
880Command to compile source code and inject it into the inferior.\n\
881\n\
882Code compilation and injection is not supported in this copy of GDB.\n\
883This command is only a placeholder."),
884#endif /* HAVE_COMPILE */
2f822da5 885 &compile_command_list, 1, &cmdlist);
3947f654 886 add_com_alias ("expression", compile_cmd_element, class_obscure, 0);
bb2ec1b3 887
c4375bc5
GL
888#ifdef HAVE_COMPILE
889
890 struct cmd_list_element *c = NULL;
891
e6ed716c
PA
892 const auto compile_opts = make_compile_options_def_group (nullptr);
893
894 static const std::string compile_code_help
8abfcabc 895 = gdb::option::build_help (_("\
bb2ec1b3
TT
896Compile, inject, and execute code.\n\
897\n\
e6ed716c 898Usage: compile code [OPTION]... [CODE]\n\
bb2ec1b3 899\n\
e6ed716c
PA
900Options:\n\
901%OPTIONS%\n\
590042fc 902\n\
bb2ec1b3
TT
903The source code may be specified as a simple one line expression, e.g.:\n\
904\n\
905 compile code printf(\"Hello world\\n\");\n\
906\n\
36de76f9
JK
907Alternatively, you can type a multiline expression by invoking\n\
908this command with no argument. GDB will then prompt for the\n\
909expression interactively; type a line containing \"end\" to\n\
910indicate the end of the expression."),
e6ed716c 911 compile_opts);
bb2ec1b3 912
e6ed716c
PA
913 c = add_cmd ("code", class_obscure, compile_code_command,
914 compile_code_help.c_str (),
915 &compile_command_list);
916 set_cmd_completer_handle_brkchars (c, compile_code_command_completer);
917
918static const std::string compile_file_help
8abfcabc 919 = gdb::option::build_help (_("\
bb2ec1b3
TT
920Evaluate a file containing source code.\n\
921\n\
e6ed716c
PA
922Usage: compile file [OPTION].. [FILENAME]\n\
923\n\
924Options:\n\
925%OPTIONS%"),
926 compile_opts);
927
928 c = add_cmd ("file", class_obscure, compile_file_command,
929 compile_file_help.c_str (),
bb2ec1b3 930 &compile_command_list);
e6ed716c 931 set_cmd_completer_handle_brkchars (c, compile_file_command_completer);
bb2ec1b3 932
7d8062de
PA
933 const auto compile_print_opts = make_value_print_options_def_group (nullptr);
934
935 static const std::string compile_print_help
8abfcabc 936 = gdb::option::build_help (_("\
36de76f9
JK
937Evaluate EXPR by using the compiler and print result.\n\
938\n\
7d8062de
PA
939Usage: compile print [[OPTION]... --] [/FMT] [EXPR]\n\
940\n\
941Options:\n\
590042fc
PW
942%OPTIONS%\n\
943\n\
7d8062de
PA
944Note: because this command accepts arbitrary expressions, if you\n\
945specify any command option, you must use a double dash (\"--\")\n\
946to mark the end of option processing. E.g.: \"compile print -o -- myobj\".\n\
36de76f9
JK
947\n\
948The expression may be specified on the same line as the command, e.g.:\n\
949\n\
950 compile print i\n\
951\n\
952Alternatively, you can type a multiline expression by invoking\n\
953this command with no argument. GDB will then prompt for the\n\
954expression interactively; type a line containing \"end\" to\n\
955indicate the end of the expression.\n\
956\n\
957EXPR may be preceded with /FMT, where FMT is a format letter\n\
958but no count or size letter (see \"x\" command)."),
7d8062de
PA
959 compile_print_opts);
960
961 c = add_cmd ("print", class_obscure, compile_print_command,
962 compile_print_help.c_str (),
963 &compile_command_list);
964 set_cmd_completer_handle_brkchars (c, print_command_completer);
36de76f9 965
bb2ec1b3
TT
966 add_setshow_boolean_cmd ("compile", class_maintenance, &compile_debug, _("\
967Set compile command debugging."), _("\
968Show compile command debugging."), _("\
969When on, compile command debugging is enabled."),
970 NULL, show_compile_debug,
971 &setdebuglist, &showdebuglist);
972
973 add_setshow_string_cmd ("compile-args", class_support,
974 &compile_args,
590042fc
PW
975 _("Set compile command GCC command-line arguments."),
976 _("Show compile command GCC command-line arguments."),
bb2ec1b3
TT
977 _("\
978Use options like -I (include file directory) or ABI settings.\n\
979String quoting is parsed like in shell, for example:\n\
980 -mno-align-double \"-I/dir with a space/include\""),
981 set_compile_args, show_compile_args, &setlist, &showlist);
982
e0700ba4
SM
983
984 /* Initialize compile_args_argv. */
985 set_compile_args (compile_args.c_str (), 0, NULL);
6e41ddec
JK
986
987 add_setshow_optional_filename_cmd ("compile-gcc", class_support,
988 &compile_gcc,
989 _("Set compile command "
590042fc 990 "GCC driver filename."),
6e41ddec 991 _("Show compile command "
590042fc 992 "GCC driver filename."),
6e41ddec
JK
993 _("\
994It should be absolute filename of the gcc executable.\n\
995If empty the default target triplet will be searched in $PATH."),
996 NULL, show_compile_gcc, &setlist,
997 &showlist);
c4375bc5 998#endif /* HAVE_COMPILE */
bb2ec1b3 999}