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