Return unique_xmalloc_ptr for generate_c_for_variable_locations
[deliverable/binutils-gdb.git] / gdb / compile / compile-c-support.c
CommitLineData
bb2ec1b3
TT
1/* C language support for compilation.
2
e2882c85 3 Copyright (C) 2014-2018 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
20#include "defs.h"
21#include "compile-internal.h"
22#include "compile.h"
23#include "gdb-dlfcn.h"
24#include "c-lang.h"
25#include "macrotab.h"
26#include "macroscope.h"
27#include "regcache.h"
14bc53a8 28#include "common/function-view.h"
d269dfc6 29#include "common/preprocessor.h"
bb2ec1b3
TT
30
31/* See compile-internal.h. */
32
33const char *
34c_get_mode_for_size (int size)
35{
36 const char *mode = NULL;
37
38 switch (size)
39 {
40 case 1:
41 mode = "QI";
42 break;
43 case 2:
44 mode = "HI";
45 break;
46 case 4:
47 mode = "SI";
48 break;
49 case 8:
50 mode = "DI";
51 break;
52 default:
53 internal_error (__FILE__, __LINE__, _("Invalid GCC mode size %d."), size);
54 }
55
56 return mode;
57}
58
59/* See compile-internal.h. */
60
8f84fb0e 61std::string
bb2ec1b3
TT
62c_get_range_decl_name (const struct dynamic_prop *prop)
63{
8f84fb0e 64 return string_printf ("__gdb_prop_%s", host_address_to_string (prop));
bb2ec1b3
TT
65}
66
67\f
68
bb2ec1b3
TT
69/* Helper function for c_get_compile_context. Open the GCC front-end
70 shared library and return the symbol specified by the current
71 GCC_C_FE_CONTEXT. */
72
73static gcc_c_fe_context_function *
74load_libcc (void)
75{
bb2ec1b3
TT
76 gcc_c_fe_context_function *func;
77
78 /* gdb_dlopen will call error () on an error, so no need to check
79 value. */
0e8621a0 80 gdb_dlhandle_up handle = gdb_dlopen (STRINGIFY (GCC_C_FE_LIBCC));
bb2ec1b3
TT
81 func = (gcc_c_fe_context_function *) gdb_dlsym (handle,
82 STRINGIFY (GCC_C_FE_CONTEXT));
83
84 if (func == NULL)
85 error (_("could not find symbol %s in library %s"),
86 STRINGIFY (GCC_C_FE_CONTEXT),
87 STRINGIFY (GCC_C_FE_LIBCC));
0e8621a0
TT
88
89 /* Leave the library open. */
90 handle.release ();
bb2ec1b3
TT
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_libcc
96 function. This will provide the gcc_c_context. */
97
98struct compile_instance *
99c_get_compile_context (void)
100{
101 static gcc_c_fe_context_function *func;
102
103 struct gcc_c_context *context;
104
105 if (func == NULL)
106 {
107 func = load_libcc ();
108 gdb_assert (func != NULL);
109 }
110
111 context = (*func) (GCC_FE_VERSION_0, GCC_C_FE_VERSION_0);
112 if (context == NULL)
113 error (_("The loaded version of GCC does not support the required version "
114 "of the API."));
115
116 return new_compile_instance (context);
117}
118
119\f
120
121/* Write one macro definition. */
122
123static void
124print_one_macro (const char *name, const struct macro_definition *macro,
125 struct macro_source_file *source, int line,
14bc53a8 126 ui_file *file)
bb2ec1b3 127{
bb2ec1b3
TT
128 /* Don't print command-line defines. They will be supplied another
129 way. */
130 if (line == 0)
131 return;
132
3a9558c4
JK
133 /* None of -Wno-builtin-macro-redefined, #undef first
134 or plain #define of the same value would avoid a warning. */
135 fprintf_filtered (file, "#ifndef %s\n# define %s", name, name);
bb2ec1b3
TT
136
137 if (macro->kind == macro_function_like)
138 {
139 int i;
140
141 fputs_filtered ("(", file);
142 for (i = 0; i < macro->argc; i++)
143 {
144 fputs_filtered (macro->argv[i], file);
145 if (i + 1 < macro->argc)
146 fputs_filtered (", ", file);
147 }
148 fputs_filtered (")", file);
149 }
150
3a9558c4 151 fprintf_filtered (file, " %s\n#endif\n", macro->replacement);
bb2ec1b3
TT
152}
153
154/* Write macro definitions at PC to FILE. */
155
156static void
157write_macro_definitions (const struct block *block, CORE_ADDR pc,
158 struct ui_file *file)
159{
f6c2623e 160 gdb::unique_xmalloc_ptr<struct macro_scope> scope;
bb2ec1b3
TT
161
162 if (block != NULL)
163 scope = sal_macro_scope (find_pc_line (pc, 0));
164 else
165 scope = default_macro_scope ();
166 if (scope == NULL)
167 scope = user_macro_scope ();
168
169 if (scope != NULL && scope->file != NULL && scope->file->table != NULL)
14bc53a8
PA
170 {
171 macro_for_each_in_scope (scope->file, scope->line,
172 [&] (const char *name,
173 const macro_definition *macro,
174 macro_source_file *source,
175 int line)
176 {
177 print_one_macro (name, macro, source, line, file);
178 });
179 }
bb2ec1b3
TT
180}
181
182/* Helper function to construct a header scope for a block of code.
183 Takes a scope argument which selects the correct header to
184 insert into BUF. */
185
186static void
187add_code_header (enum compile_i_scope_types type, struct ui_file *buf)
188{
189 switch (type)
190 {
191 case COMPILE_I_SIMPLE_SCOPE:
192 fputs_unfiltered ("void "
193 GCC_FE_WRAPPER_FUNCTION
194 " (struct "
195 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG
196 " *"
197 COMPILE_I_SIMPLE_REGISTER_ARG_NAME
198 ") {\n",
199 buf);
200 break;
36de76f9
JK
201 case COMPILE_I_PRINT_ADDRESS_SCOPE:
202 case COMPILE_I_PRINT_VALUE_SCOPE:
203 /* <string.h> is needed for a memcpy call below. */
204 fputs_unfiltered ("#include <string.h>\n"
205 "void "
206 GCC_FE_WRAPPER_FUNCTION
207 " (struct "
208 COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG
209 " *"
210 COMPILE_I_SIMPLE_REGISTER_ARG_NAME
211 ", "
212 COMPILE_I_PRINT_OUT_ARG_TYPE
213 " "
214 COMPILE_I_PRINT_OUT_ARG
215 ") {\n",
216 buf);
217 break;
218
bb2ec1b3
TT
219 case COMPILE_I_RAW_SCOPE:
220 break;
221 default:
222 gdb_assert_not_reached (_("Unknown compiler scope reached."));
223 }
224}
225
226/* Helper function to construct a footer scope for a block of code.
227 Takes a scope argument which selects the correct footer to
228 insert into BUF. */
229
230static void
231add_code_footer (enum compile_i_scope_types type, struct ui_file *buf)
232{
233 switch (type)
234 {
235 case COMPILE_I_SIMPLE_SCOPE:
36de76f9
JK
236 case COMPILE_I_PRINT_ADDRESS_SCOPE:
237 case COMPILE_I_PRINT_VALUE_SCOPE:
bb2ec1b3
TT
238 fputs_unfiltered ("}\n", buf);
239 break;
240 case COMPILE_I_RAW_SCOPE:
241 break;
242 default:
243 gdb_assert_not_reached (_("Unknown compiler scope reached."));
244 }
245}
246
247/* Generate a structure holding all the registers used by the function
248 we're generating. */
249
250static void
251generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
252 const unsigned char *registers_used)
253{
254 int i;
255 int seen = 0;
256
257 fputs_unfiltered ("struct " COMPILE_I_SIMPLE_REGISTER_STRUCT_TAG " {\n",
258 stream);
259
260 if (registers_used != NULL)
261 for (i = 0; i < gdbarch_num_regs (gdbarch); ++i)
262 {
263 if (registers_used[i])
264 {
265 struct type *regtype = check_typedef (register_type (gdbarch, i));
8f84fb0e 266 std::string regname = compile_register_name_mangled (gdbarch, i);
bb2ec1b3
TT
267
268 seen = 1;
269
270 /* You might think we could use type_print here. However,
271 target descriptions often use types with names like
272 "int64_t", which may not be defined in the inferior
273 (and in any case would not be looked up due to the
274 #pragma business). So, we take a much simpler
275 approach: for pointer- or integer-typed registers, emit
276 the field in the most direct way; and for other
277 register types (typically flags or vectors), emit a
278 maximally-aligned array of the correct size. */
279
280 fputs_unfiltered (" ", stream);
281 switch (TYPE_CODE (regtype))
282 {
283 case TYPE_CODE_PTR:
8f84fb0e
TT
284 fprintf_filtered (stream, "__gdb_uintptr %s",
285 regname.c_str ());
bb2ec1b3
TT
286 break;
287
288 case TYPE_CODE_INT:
289 {
290 const char *mode
291 = c_get_mode_for_size (TYPE_LENGTH (regtype));
292
293 if (mode != NULL)
294 {
295 if (TYPE_UNSIGNED (regtype))
296 fputs_unfiltered ("unsigned ", stream);
297 fprintf_unfiltered (stream,
298 "int %s"
299 " __attribute__ ((__mode__(__%s__)))",
8f84fb0e 300 regname.c_str (),
bb2ec1b3
TT
301 mode);
302 break;
303 }
304 }
305
306 /* Fall through. */
307
308 default:
309 fprintf_unfiltered (stream,
310 " unsigned char %s[%d]"
311 " __attribute__((__aligned__("
312 "__BIGGEST_ALIGNMENT__)))",
8f84fb0e 313 regname.c_str (),
bb2ec1b3
TT
314 TYPE_LENGTH (regtype));
315 }
316 fputs_unfiltered (";\n", stream);
bb2ec1b3
TT
317 }
318 }
319
320 if (!seen)
321 fputs_unfiltered (" char " COMPILE_I_SIMPLE_REGISTER_DUMMY ";\n",
322 stream);
323
324 fputs_unfiltered ("};\n\n", stream);
325}
326
327/* Take the source code provided by the user with the 'compile'
328 command, and compute the additional wrapping, macro, variable and
329 register operations needed. INPUT is the source code derived from
330 the 'compile' command, GDBARCH is the architecture to use when
331 computing above, EXPR_BLOCK denotes the block relevant contextually
332 to the inferior when the expression was created, and EXPR_PC
333 indicates the value of $PC. */
334
aaee65ae 335std::string
bb2ec1b3
TT
336c_compute_program (struct compile_instance *inst,
337 const char *input,
338 struct gdbarch *gdbarch,
339 const struct block *expr_block,
340 CORE_ADDR expr_pc)
341{
bb2ec1b3
TT
342 struct compile_c_instance *context = (struct compile_c_instance *) inst;
343
d7e74731
PA
344 string_file buf;
345 string_file var_stream;
bb2ec1b3 346
d7e74731 347 write_macro_definitions (expr_block, expr_pc, &buf);
bb2ec1b3
TT
348
349 /* Do not generate local variable information for "raw"
350 compilations. In this case we aren't emitting our own function
351 and the user's code may only refer to globals. */
352 if (inst->scope != COMPILE_I_RAW_SCOPE)
353 {
bb2ec1b3
TT
354 int i;
355
356 /* Generate the code to compute variable locations, but do it
357 before generating the function header, so we can define the
358 register struct before the function body. This requires a
359 temporary stream. */
bd923e51
KS
360 gdb::unique_xmalloc_ptr<unsigned char> registers_used
361 = generate_c_for_variable_locations (context, var_stream, gdbarch,
362 expr_block, expr_pc);
bb2ec1b3 363
d7e74731
PA
364 buf.puts ("typedef unsigned int"
365 " __attribute__ ((__mode__(__pointer__)))"
366 " __gdb_uintptr;\n");
367 buf.puts ("typedef int"
368 " __attribute__ ((__mode__(__pointer__)))"
369 " __gdb_intptr;\n");
bb2ec1b3 370
bb2b33b9 371 /* Iterate all log2 sizes in bytes supported by c_get_mode_for_size. */
bb2ec1b3
TT
372 for (i = 0; i < 4; ++i)
373 {
374 const char *mode = c_get_mode_for_size (1 << i);
375
376 gdb_assert (mode != NULL);
d7e74731
PA
377 buf.printf ("typedef int"
378 " __attribute__ ((__mode__(__%s__)))"
379 " __gdb_int_%s;\n",
380 mode, mode);
bb2ec1b3 381 }
3a9558c4 382
bd923e51 383 generate_register_struct (&buf, gdbarch, registers_used.get ());
bb2ec1b3
TT
384 }
385
d7e74731 386 add_code_header (inst->scope, &buf);
bb2ec1b3 387
36de76f9
JK
388 if (inst->scope == COMPILE_I_SIMPLE_SCOPE
389 || inst->scope == COMPILE_I_PRINT_ADDRESS_SCOPE
390 || inst->scope == COMPILE_I_PRINT_VALUE_SCOPE)
bb2ec1b3 391 {
d7e74731
PA
392 buf.write (var_stream.c_str (), var_stream.size ());
393 buf.puts ("#pragma GCC user_expression\n");
bb2ec1b3
TT
394 }
395
396 /* The user expression has to be in its own scope, so that "extern"
397 works properly. Otherwise gcc thinks that the "extern"
398 declaration is in the same scope as the declaration provided by
399 gdb. */
400 if (inst->scope != COMPILE_I_RAW_SCOPE)
d7e74731 401 buf.puts ("{\n");
bb2ec1b3 402
d7e74731 403 buf.puts ("#line 1 \"gdb command line\"\n");
36de76f9
JK
404
405 switch (inst->scope)
406 {
407 case COMPILE_I_PRINT_ADDRESS_SCOPE:
408 case COMPILE_I_PRINT_VALUE_SCOPE:
d7e74731 409 buf.printf (
36de76f9
JK
410"__auto_type " COMPILE_I_EXPR_VAL " = %s;\n"
411"typeof (%s) *" COMPILE_I_EXPR_PTR_TYPE ";\n"
412"memcpy (" COMPILE_I_PRINT_OUT_ARG ", %s" COMPILE_I_EXPR_VAL ",\n"
413 "sizeof (*" COMPILE_I_EXPR_PTR_TYPE "));\n"
414 , input, input,
415 (inst->scope == COMPILE_I_PRINT_ADDRESS_SCOPE
416 ? "&" : ""));
417 break;
418 default:
d7e74731 419 buf.puts (input);
36de76f9
JK
420 break;
421 }
422
d7e74731 423 buf.puts ("\n");
bb2ec1b3
TT
424
425 /* For larger user expressions the automatic semicolons may be
426 confusing. */
427 if (strchr (input, '\n') == NULL)
d7e74731 428 buf.puts (";\n");
bb2ec1b3
TT
429
430 if (inst->scope != COMPILE_I_RAW_SCOPE)
d7e74731 431 buf.puts ("}\n");
bb2ec1b3 432
d7e74731
PA
433 add_code_footer (inst->scope, &buf);
434 return std::move (buf.string ());
bb2ec1b3 435}
This page took 0.279193 seconds and 4 git commands to generate.