xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/compile/compile-c-support.c (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
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