1 /* C/C++ language support for compilation. 2 3 Copyright (C) 2014-2023 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 "compile-internal.h" 22 #include "compile-c.h" 23 #include "compile-cplus.h" 24 #include "compile.h" 25 #include "c-lang.h" 26 #include "macrotab.h" 27 #include "macroscope.h" 28 #include "regcache.h" 29 #include "gdbsupport/function-view.h" 30 #include "gdbsupport/gdb-dlfcn.h" 31 #include "gdbsupport/preprocessor.h" 32 #include "gdbarch.h" 33 34 /* See compile-internal.h. */ 35 36 const char * 37 c_get_mode_for_size (int size) 38 { 39 const char *mode = NULL; 40 41 switch (size) 42 { 43 case 1: 44 mode = "QI"; 45 break; 46 case 2: 47 mode = "HI"; 48 break; 49 case 4: 50 mode = "SI"; 51 break; 52 case 8: 53 mode = "DI"; 54 break; 55 default: 56 internal_error (_("Invalid GCC mode size %d."), size); 57 } 58 59 return mode; 60 } 61 62 /* See compile-internal.h. */ 63 64 std::string 65 c_get_range_decl_name (const struct dynamic_prop *prop) 66 { 67 return string_printf ("__gdb_prop_%s", host_address_to_string (prop)); 68 } 69 70 71 72 /* Load the plug-in library FE_LIBCC and return the initialization function 73 FE_CONTEXT. */ 74 75 template <typename FUNCTYPE> 76 FUNCTYPE * 77 load_libcompile (const char *fe_libcc, const char *fe_context) 78 { 79 FUNCTYPE *func; 80 81 /* gdb_dlopen will call error () on an error, so no need to check 82 value. */ 83 gdb_dlhandle_up handle = gdb_dlopen (fe_libcc); 84 func = (FUNCTYPE *) gdb_dlsym (handle, fe_context); 85 86 if (func == NULL) 87 error (_("could not find symbol %s in library %s"), fe_context, fe_libcc); 88 89 /* Leave the library open. */ 90 handle.release (); 91 return func; 92 } 93 94 /* Return the compile instance associated with the current context. 95 This function calls the symbol returned from the load_libcompile 96 function. FE_LIBCC is the library to load. BASE_VERSION is the 97 base compile plug-in version we support. API_VERSION is the 98 API version supported. */ 99 100 template <typename INSTTYPE, typename FUNCTYPE, typename CTXTYPE, 101 typename BASE_VERSION_TYPE, typename API_VERSION_TYPE> 102 std::unique_ptr<compile_instance> 103 get_compile_context (const char *fe_libcc, const char *fe_context, 104 BASE_VERSION_TYPE base_version, 105 API_VERSION_TYPE api_version) 106 { 107 static FUNCTYPE *func; 108 static CTXTYPE *context; 109 110 if (func == NULL) 111 { 112 func = load_libcompile<FUNCTYPE> (fe_libcc, fe_context); 113 gdb_assert (func != NULL); 114 } 115 116 context = (*func) (base_version, api_version); 117 if (context == NULL) 118 error (_("The loaded version of GCC does not support the required version " 119 "of the API.")); 120 121 return std::unique_ptr<compile_instance> (new INSTTYPE (context)); 122 } 123 124 /* A C-language implementation of get_compile_context. */ 125 126 std::unique_ptr<compile_instance> 127 c_get_compile_context () 128 { 129 return get_compile_context 130 <compile_c_instance, gcc_c_fe_context_function, gcc_c_context, 131 gcc_base_api_version, gcc_c_api_version> 132 (STRINGIFY (GCC_C_FE_LIBCC), STRINGIFY (GCC_C_FE_CONTEXT), 133 GCC_FE_VERSION_0, GCC_C_FE_VERSION_0); 134 } 135 136 /* A C++-language implementation of get_compile_context. */ 137 138 std::unique_ptr<compile_instance> 139 cplus_get_compile_context () 140 { 141 return get_compile_context 142 <compile_cplus_instance, gcc_cp_fe_context_function, gcc_cp_context, 143 gcc_base_api_version, gcc_cp_api_version> 144 (STRINGIFY (GCC_CP_FE_LIBCC), STRINGIFY (GCC_CP_FE_CONTEXT), 145 GCC_FE_VERSION_0, GCC_CP_FE_VERSION_0); 146 } 147 148 149 150 /* Write one macro definition. */ 151 152 static void 153 print_one_macro (const char *name, const struct macro_definition *macro, 154 struct macro_source_file *source, int line, 155 ui_file *file) 156 { 157 /* Don't print command-line defines. They will be supplied another 158 way. */ 159 if (line == 0) 160 return; 161 162 /* None of -Wno-builtin-macro-redefined, #undef first 163 or plain #define of the same value would avoid a warning. */ 164 gdb_printf (file, "#ifndef %s\n# define %s", name, name); 165 166 if (macro->kind == macro_function_like) 167 { 168 int i; 169 170 gdb_puts ("(", file); 171 for (i = 0; i < macro->argc; i++) 172 { 173 gdb_puts (macro->argv[i], file); 174 if (i + 1 < macro->argc) 175 gdb_puts (", ", file); 176 } 177 gdb_puts (")", file); 178 } 179 180 gdb_printf (file, " %s\n#endif\n", macro->replacement); 181 } 182 183 /* Write macro definitions at PC to FILE. */ 184 185 static void 186 write_macro_definitions (const struct block *block, CORE_ADDR pc, 187 struct ui_file *file) 188 { 189 gdb::unique_xmalloc_ptr<struct macro_scope> scope; 190 191 if (block != NULL) 192 scope = sal_macro_scope (find_pc_line (pc, 0)); 193 else 194 scope = default_macro_scope (); 195 if (scope == NULL) 196 scope = user_macro_scope (); 197 198 if (scope != NULL && scope->file != NULL && scope->file->table != NULL) 199 { 200 macro_for_each_in_scope (scope->file, scope->line, 201 [&] (const char *name, 202 const macro_definition *macro, 203 macro_source_file *source, 204 int line) 205 { 206 print_one_macro (name, macro, source, line, file); 207 }); 208 } 209 } 210 211 /* Generate a structure holding all the registers used by the function 212 we're generating. */ 213 214 static void 215 generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch, 216 const std::vector<bool> ®isters_used) 217 { 218 int i; 219 int seen = 0; 220 221 gdb_puts ("struct " COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG " {\n", 222 stream); 223 224 if (!registers_used.empty ()) 225 for (i = 0; i < gdbarch_num_regs (gdbarch); ++i) 226 { 227 if (registers_used[i]) 228 { 229 struct type *regtype = check_typedef (register_type (gdbarch, i)); 230 std::string regname = compile_register_name_mangled (gdbarch, i); 231 232 seen = 1; 233 234 /* You might think we could use type_print here. However, 235 target descriptions often use types with names like 236 "int64_t", which may not be defined in the inferior 237 (and in any case would not be looked up due to the 238 #pragma business). So, we take a much simpler 239 approach: for pointer- or integer-typed registers, emit 240 the field in the most direct way; and for other 241 register types (typically flags or vectors), emit a 242 maximally-aligned array of the correct size. */ 243 244 gdb_puts (" ", stream); 245 switch (regtype->code ()) 246 { 247 case TYPE_CODE_PTR: 248 gdb_printf (stream, "__gdb_uintptr %s", 249 regname.c_str ()); 250 break; 251 252 case TYPE_CODE_INT: 253 { 254 const char *mode 255 = c_get_mode_for_size (regtype->length ()); 256 257 if (mode != NULL) 258 { 259 if (regtype->is_unsigned ()) 260 gdb_puts ("unsigned ", stream); 261 gdb_printf (stream, 262 "int %s" 263 " __attribute__ ((__mode__(__%s__)))", 264 regname.c_str (), 265 mode); 266 break; 267 } 268 } 269 270 /* Fall through. */ 271 272 default: 273 gdb_printf (stream, 274 " unsigned char %s[%s]" 275 " __attribute__((__aligned__(" 276 "__BIGGEST_ALIGNMENT__)))", 277 regname.c_str (), 278 pulongest (regtype->length ())); 279 } 280 gdb_puts (";\n", stream); 281 } 282 } 283 284 if (!seen) 285 gdb_puts (" char " COMPILE_I_SIMPLE_REGISTER_DUMMY ";\n", 286 stream); 287 288 gdb_puts ("};\n\n", stream); 289 } 290 291 /* C-language policy to emit a push user expression pragma into BUF. */ 292 293 struct c_push_user_expression 294 { 295 void push_user_expression (struct ui_file *buf) 296 { 297 gdb_puts ("#pragma GCC user_expression\n", buf); 298 } 299 }; 300 301 /* C-language policy to emit a pop user expression pragma into BUF. 302 For C, this is a nop. */ 303 304 struct pop_user_expression_nop 305 { 306 void pop_user_expression (struct ui_file *buf) 307 { 308 /* Nothing to do. */ 309 } 310 }; 311 312 /* C-language policy to construct a code header for a block of code. 313 Takes a scope TYPE argument which selects the correct header to 314 insert into BUF. */ 315 316 struct c_add_code_header 317 { 318 void add_code_header (enum compile_i_scope_types type, struct ui_file *buf) 319 { 320 switch (type) 321 { 322 case COMPILE_I_SIMPLE_SCOPE: 323 gdb_puts ("void " 324 GCC_FE_WRAPPER_FUNCTION 325 " (struct " 326 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG 327 " *" 328 COMPILE_I_SIMPLE_REGISTER_ARG_NAME 329 ") {\n", 330 buf); 331 break; 332 333 case COMPILE_I_PRINT_ADDRESS_SCOPE: 334 case COMPILE_I_PRINT_VALUE_SCOPE: 335 /* <string.h> is needed for a memcpy call below. */ 336 gdb_puts ("#include <string.h>\n" 337 "void " 338 GCC_FE_WRAPPER_FUNCTION 339 " (struct " 340 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG 341 " *" 342 COMPILE_I_SIMPLE_REGISTER_ARG_NAME 343 ", " 344 COMPILE_I_PRINT_OUT_ARG_TYPE 345 " " 346 COMPILE_I_PRINT_OUT_ARG 347 ") {\n", 348 buf); 349 break; 350 351 case COMPILE_I_RAW_SCOPE: 352 break; 353 354 default: 355 gdb_assert_not_reached ("Unknown compiler scope reached."); 356 } 357 } 358 }; 359 360 /* C-language policy to construct a code footer for a block of code. 361 Takes a scope TYPE which selects the correct footer to insert into BUF. */ 362 363 struct c_add_code_footer 364 { 365 void add_code_footer (enum compile_i_scope_types type, struct ui_file *buf) 366 { 367 switch (type) 368 { 369 case COMPILE_I_SIMPLE_SCOPE: 370 case COMPILE_I_PRINT_ADDRESS_SCOPE: 371 case COMPILE_I_PRINT_VALUE_SCOPE: 372 gdb_puts ("}\n", buf); 373 break; 374 375 case COMPILE_I_RAW_SCOPE: 376 break; 377 378 default: 379 gdb_assert_not_reached ("Unknown compiler scope reached."); 380 } 381 } 382 }; 383 384 /* C-language policy to emit the user code snippet INPUT into BUF based on the 385 scope TYPE. */ 386 387 struct c_add_input 388 { 389 void add_input (enum compile_i_scope_types type, const char *input, 390 struct ui_file *buf) 391 { 392 switch (type) 393 { 394 case COMPILE_I_PRINT_ADDRESS_SCOPE: 395 case COMPILE_I_PRINT_VALUE_SCOPE: 396 gdb_printf (buf, 397 "__auto_type " COMPILE_I_EXPR_VAL " = %s;\n" 398 "typeof (%s) *" COMPILE_I_EXPR_PTR_TYPE ";\n" 399 "memcpy (" COMPILE_I_PRINT_OUT_ARG ", %s" 400 COMPILE_I_EXPR_VAL ",\n" 401 "sizeof (*" COMPILE_I_EXPR_PTR_TYPE "));\n" 402 , input, input, 403 (type == COMPILE_I_PRINT_ADDRESS_SCOPE 404 ? "&" : "")); 405 break; 406 407 default: 408 gdb_puts (input, buf); 409 break; 410 } 411 gdb_puts ("\n", buf); 412 } 413 }; 414 415 /* C++-language policy to emit a push user expression pragma into 416 BUF. */ 417 418 struct cplus_push_user_expression 419 { 420 void push_user_expression (struct ui_file *buf) 421 { 422 gdb_puts ("#pragma GCC push_user_expression\n", buf); 423 } 424 }; 425 426 /* C++-language policy to emit a pop user expression pragma into BUF. */ 427 428 struct cplus_pop_user_expression 429 { 430 void pop_user_expression (struct ui_file *buf) 431 { 432 gdb_puts ("#pragma GCC pop_user_expression\n", buf); 433 } 434 }; 435 436 /* C++-language policy to construct a code header for a block of code. 437 Takes a scope TYPE argument which selects the correct header to 438 insert into BUF. */ 439 440 struct cplus_add_code_header 441 { 442 void add_code_header (enum compile_i_scope_types type, struct ui_file *buf) 443 { 444 switch (type) 445 { 446 case COMPILE_I_SIMPLE_SCOPE: 447 gdb_puts ("void " 448 GCC_FE_WRAPPER_FUNCTION 449 " (struct " 450 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG 451 " *" 452 COMPILE_I_SIMPLE_REGISTER_ARG_NAME 453 ") {\n", 454 buf); 455 break; 456 457 case COMPILE_I_PRINT_ADDRESS_SCOPE: 458 case COMPILE_I_PRINT_VALUE_SCOPE: 459 gdb_puts ( 460 "#include <cstring>\n" 461 "#include <bits/move.h>\n" 462 "void " 463 GCC_FE_WRAPPER_FUNCTION 464 " (struct " 465 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG 466 " *" 467 COMPILE_I_SIMPLE_REGISTER_ARG_NAME 468 ", " 469 COMPILE_I_PRINT_OUT_ARG_TYPE 470 " " 471 COMPILE_I_PRINT_OUT_ARG 472 ") {\n", 473 buf); 474 break; 475 476 case COMPILE_I_RAW_SCOPE: 477 break; 478 479 default: 480 gdb_assert_not_reached ("Unknown compiler scope reached."); 481 } 482 } 483 }; 484 485 /* C++-language policy to emit the user code snippet INPUT into BUF based on 486 the scope TYPE. */ 487 488 struct cplus_add_input 489 { 490 void add_input (enum compile_i_scope_types type, const char *input, 491 struct ui_file *buf) 492 { 493 switch (type) 494 { 495 case COMPILE_I_PRINT_VALUE_SCOPE: 496 case COMPILE_I_PRINT_ADDRESS_SCOPE: 497 gdb_printf 498 (buf, 499 /* "auto" strips ref- and cv- qualifiers, so we need to also strip 500 those from COMPILE_I_EXPR_PTR_TYPE. */ 501 "auto " COMPILE_I_EXPR_VAL " = %s;\n" 502 "typedef " 503 "std::add_pointer<std::remove_cv<decltype (%s)>::type>::type " 504 " __gdb_expr_ptr;\n" 505 "__gdb_expr_ptr " COMPILE_I_EXPR_PTR_TYPE ";\n" 506 "std::memcpy (" COMPILE_I_PRINT_OUT_ARG ", %s (" 507 COMPILE_I_EXPR_VAL "),\n" 508 "\tsizeof (*" COMPILE_I_EXPR_PTR_TYPE "));\n" 509 ,input, input, 510 (type == COMPILE_I_PRINT_ADDRESS_SCOPE 511 ? "__builtin_addressof" : "")); 512 break; 513 514 default: 515 gdb_puts (input, buf); 516 break; 517 } 518 gdb_puts ("\n", buf); 519 } 520 }; 521 522 /* A host class representing a compile program. 523 524 CompileInstanceType is the type of the compile_instance for the 525 language. 526 527 PushUserExpressionPolicy and PopUserExpressionPolicy are used to 528 push and pop user expression pragmas to the compile plug-in. 529 530 AddCodeHeaderPolicy and AddCodeFooterPolicy are used to add the appropriate 531 code header and footer, respectively. 532 533 AddInputPolicy adds the actual user code. */ 534 535 template <class CompileInstanceType, class PushUserExpressionPolicy, 536 class PopUserExpressionPolicy, class AddCodeHeaderPolicy, 537 class AddCodeFooterPolicy, class AddInputPolicy> 538 class compile_program 539 : private PushUserExpressionPolicy, private PopUserExpressionPolicy, 540 private AddCodeHeaderPolicy, private AddCodeFooterPolicy, 541 private AddInputPolicy 542 { 543 public: 544 545 /* Construct a compile_program using the compiler instance INST 546 using the architecture given by GDBARCH. */ 547 compile_program (CompileInstanceType *inst, struct gdbarch *gdbarch) 548 : m_instance (inst), m_arch (gdbarch) 549 { 550 } 551 552 /* Take the source code provided by the user with the 'compile' 553 command and compute the additional wrapping, macro, variable and 554 register operations needed. INPUT is the source code derived from 555 the 'compile' command, EXPR_BLOCK denotes the block relevant contextually 556 to the inferior when the expression was created, and EXPR_PC 557 indicates the value of $PC. 558 559 Returns the text of the program to compile. */ 560 std::string compute (const char *input, const struct block *expr_block, 561 CORE_ADDR expr_pc) 562 { 563 string_file var_stream; 564 string_file buf; 565 566 /* Do not generate local variable information for "raw" 567 compilations. In this case we aren't emitting our own function 568 and the user's code may only refer to globals. */ 569 if (m_instance->scope () != COMPILE_I_RAW_SCOPE) 570 { 571 /* Generate the code to compute variable locations, but do it 572 before generating the function header, so we can define the 573 register struct before the function body. This requires a 574 temporary stream. */ 575 std::vector<bool> registers_used 576 = generate_c_for_variable_locations (m_instance, &var_stream, m_arch, 577 expr_block, expr_pc); 578 579 buf.puts ("typedef unsigned int" 580 " __attribute__ ((__mode__(__pointer__)))" 581 " __gdb_uintptr;\n"); 582 buf.puts ("typedef int" 583 " __attribute__ ((__mode__(__pointer__)))" 584 " __gdb_intptr;\n"); 585 586 /* Iterate all log2 sizes in bytes supported by c_get_mode_for_size. */ 587 for (int i = 0; i < 4; ++i) 588 { 589 const char *mode = c_get_mode_for_size (1 << i); 590 591 gdb_assert (mode != NULL); 592 buf.printf ("typedef int" 593 " __attribute__ ((__mode__(__%s__)))" 594 " __gdb_int_%s;\n", 595 mode, mode); 596 } 597 598 generate_register_struct (&buf, m_arch, registers_used); 599 } 600 601 AddCodeHeaderPolicy::add_code_header (m_instance->scope (), &buf); 602 603 if (m_instance->scope () == COMPILE_I_SIMPLE_SCOPE 604 || m_instance->scope () == COMPILE_I_PRINT_ADDRESS_SCOPE 605 || m_instance->scope () == COMPILE_I_PRINT_VALUE_SCOPE) 606 { 607 buf.write (var_stream.c_str (), var_stream.size ()); 608 PushUserExpressionPolicy::push_user_expression (&buf); 609 } 610 611 write_macro_definitions (expr_block, expr_pc, &buf); 612 613 /* The user expression has to be in its own scope, so that "extern" 614 works properly. Otherwise gcc thinks that the "extern" 615 declaration is in the same scope as the declaration provided by 616 gdb. */ 617 if (m_instance->scope () != COMPILE_I_RAW_SCOPE) 618 buf.puts ("{\n"); 619 620 buf.puts ("#line 1 \"gdb command line\"\n"); 621 622 AddInputPolicy::add_input (m_instance->scope (), input, &buf); 623 624 /* For larger user expressions the automatic semicolons may be 625 confusing. */ 626 if (strchr (input, '\n') == NULL) 627 buf.puts (";\n"); 628 629 if (m_instance->scope () != COMPILE_I_RAW_SCOPE) 630 buf.puts ("}\n"); 631 632 if (m_instance->scope () == COMPILE_I_SIMPLE_SCOPE 633 || m_instance->scope () == COMPILE_I_PRINT_ADDRESS_SCOPE 634 || m_instance->scope () == COMPILE_I_PRINT_VALUE_SCOPE) 635 PopUserExpressionPolicy::pop_user_expression (&buf); 636 637 AddCodeFooterPolicy::add_code_footer (m_instance->scope (), &buf); 638 return buf.release (); 639 } 640 641 private: 642 643 /* The compile instance to be used for compilation and 644 type-conversion. */ 645 CompileInstanceType *m_instance; 646 647 /* The architecture to be used. */ 648 struct gdbarch *m_arch; 649 }; 650 651 /* The types used for C and C++ program computations. */ 652 653 typedef compile_program<compile_c_instance, 654 c_push_user_expression, pop_user_expression_nop, 655 c_add_code_header, c_add_code_footer, 656 c_add_input> c_compile_program; 657 658 typedef compile_program<compile_cplus_instance, 659 cplus_push_user_expression, cplus_pop_user_expression, 660 cplus_add_code_header, c_add_code_footer, 661 cplus_add_input> cplus_compile_program; 662 663 /* The compute_program method for C. */ 664 665 std::string 666 c_compute_program (compile_instance *inst, 667 const char *input, 668 struct gdbarch *gdbarch, 669 const struct block *expr_block, 670 CORE_ADDR expr_pc) 671 { 672 compile_c_instance *c_inst = static_cast<compile_c_instance *> (inst); 673 c_compile_program program (c_inst, gdbarch); 674 675 return program.compute (input, expr_block, expr_pc); 676 } 677 678 /* The compute_program method for C++. */ 679 680 std::string 681 cplus_compute_program (compile_instance *inst, 682 const char *input, 683 struct gdbarch *gdbarch, 684 const struct block *expr_block, 685 CORE_ADDR expr_pc) 686 { 687 compile_cplus_instance *cplus_inst 688 = static_cast<compile_cplus_instance *> (inst); 689 cplus_compile_program program (cplus_inst, gdbarch); 690 691 return program.compute (input, expr_block, expr_pc); 692 } 693