X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcompile%2Fcompile-loc2c.c;h=2580f9d6b845ddb7589c87dceb5244c814126530;hb=62e6599087efba193e0156d89ee65fb74fc99cb2;hp=ead100324d5596fd9ea3163987a4bbea5137698c;hpb=266934d1ad029100f4073f9e351f8685ea175b83;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/compile/compile-loc2c.c b/gdb/compile/compile-loc2c.c index ead100324d..2580f9d6b8 100644 --- a/gdb/compile/compile-loc2c.c +++ b/gdb/compile/compile-loc2c.c @@ -1,6 +1,6 @@ /* Convert a DWARF location expression to C - Copyright (C) 2014-2017 Free Software Foundation, Inc. + Copyright (C) 2014-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -24,11 +24,13 @@ #include "ui-file.h" #include "utils.h" #include "compile-internal.h" +#include "compile-c.h" #include "compile.h" #include "block.h" #include "dwarf2-frame.h" -#include "gdb_vecs.h" +#include "gdbsupport/gdb_vecs.h" #include "value.h" +#include "gdbarch.h" @@ -62,7 +64,7 @@ struct insn_info NEED_TEMPVAR is an out parameter which is set if this expression needs a special temporary variable to be emitted (see the code generator). - INFO is an array of insn_info objects, indexed by offset from the + INFO is a vector of insn_info objects, indexed by offset from the start of the DWARF expression. TO_DO is a list of bytecodes which must be examined; it may be added to by this function. @@ -71,7 +73,7 @@ struct insn_info static void compute_stack_depth_worker (int start, int *need_tempvar, - struct insn_info *info, + std::vector *info, std::vector *to_do, enum bfd_endian byte_order, unsigned int addr_size, const gdb_byte *op_ptr, const gdb_byte *op_end) @@ -80,8 +82,8 @@ compute_stack_depth_worker (int start, int *need_tempvar, int stack_depth; op_ptr += start; - gdb_assert (info[start].visited); - stack_depth = info[start].depth; + gdb_assert ((*info)[start].visited); + stack_depth = (*info)[start].depth; while (op_ptr < op_end) { @@ -91,16 +93,16 @@ compute_stack_depth_worker (int start, int *need_tempvar, int ndx = op_ptr - base; #define SET_CHECK_DEPTH(WHERE) \ - if (info[WHERE].visited) \ + if ((*info)[WHERE].visited) \ { \ - if (info[WHERE].depth != stack_depth) \ + if ((*info)[WHERE].depth != stack_depth) \ error (_("inconsistent stack depths")); \ } \ else \ { \ /* Stack depth not set, so set it. */ \ - info[WHERE].visited = 1; \ - info[WHERE].depth = stack_depth; \ + (*info)[WHERE].visited = 1; \ + (*info)[WHERE].depth = stack_depth; \ } SET_CHECK_DEPTH (ndx); @@ -324,7 +326,7 @@ compute_stack_depth_worker (int start, int *need_tempvar, case DW_OP_GNU_push_tls_address: case DW_OP_form_tls_address: - info[ndx].is_tls = 1; + (*info)[ndx].is_tls = 1; break; case DW_OP_skip: @@ -333,10 +335,10 @@ compute_stack_depth_worker (int start, int *need_tempvar, offset = op_ptr + offset - base; /* If the destination has not been seen yet, add it to the to-do list. */ - if (!info[offset].visited) + if (!(*info)[offset].visited) to_do->push_back (offset); SET_CHECK_DEPTH (offset); - info[offset].label = 1; + (*info)[offset].label = 1; /* We're done with this line of code. */ return; @@ -347,10 +349,10 @@ compute_stack_depth_worker (int start, int *need_tempvar, --stack_depth; /* If the destination has not been seen yet, add it to the to-do list. */ - if (!info[offset].visited) + if (!(*info)[offset].visited) to_do->push_back (offset); SET_CHECK_DEPTH (offset); - info[offset].label = 1; + (*info)[offset].label = 1; break; case DW_OP_nop: @@ -387,15 +389,12 @@ compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size, int *need_tempvar, int *is_tls, const gdb_byte *op_ptr, const gdb_byte *op_end, int initial_depth, - struct insn_info **info) + std::vector *info) { - unsigned char *set; - struct cleanup *outer_cleanup; std::vector to_do; int stack_depth, i; - *info = XCNEWVEC (struct insn_info, op_end - op_ptr); - outer_cleanup = make_cleanup (xfree, *info); + info->resize (op_end - op_ptr); to_do.push_back (0); (*info)[0].depth = initial_depth; @@ -406,7 +405,7 @@ compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size, int ndx = to_do.back (); to_do.pop_back (); - compute_stack_depth_worker (ndx, need_tempvar, *info, &to_do, + compute_stack_depth_worker (ndx, need_tempvar, info, &to_do, byte_order, addr_size, op_ptr, op_end); } @@ -421,7 +420,6 @@ compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size, *is_tls = 1; } - discard_cleanups (outer_cleanup); return stack_depth + 1; } @@ -433,9 +431,9 @@ compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size, /* Emit code to push a constant. */ static void -push (int indent, string_file &stream, ULONGEST l) +push (int indent, string_file *stream, ULONGEST l) { - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "__gdb_stack[++__gdb_tos] = (" GCC_UINTPTR ") %s;\n", hex_string (l)); } @@ -443,57 +441,57 @@ push (int indent, string_file &stream, ULONGEST l) /* Emit code to push an arbitrary expression. This works like printf. */ -static void pushf (int indent, string_file &stream, const char *format, ...) +static void pushf (int indent, string_file *stream, const char *format, ...) ATTRIBUTE_PRINTF (3, 4); static void -pushf (int indent, string_file &stream, const char *format, ...) +pushf (int indent, string_file *stream, const char *format, ...) { va_list args; - fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos + 1] = "); + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos + 1] = "); va_start (args, format); - stream.vprintf (format, args); + stream->vprintf (format, args); va_end (args); - stream.puts (";\n"); + stream->puts (";\n"); - fprintfi_filtered (indent, &stream, "++__gdb_tos;\n"); + fprintfi_filtered (indent, stream, "++__gdb_tos;\n"); } /* Emit code for a unary expression -- one which operates in-place on the top-of-stack. This works like printf. */ -static void unary (int indent, string_file &stream, const char *format, ...) +static void unary (int indent, string_file *stream, const char *format, ...) ATTRIBUTE_PRINTF (3, 4); static void -unary (int indent, string_file &stream, const char *format, ...) +unary (int indent, string_file *stream, const char *format, ...) { va_list args; - fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos] = "); + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos] = "); va_start (args, format); - stream.vprintf (format, args); + stream->vprintf (format, args); va_end (args); - stream.puts (";\n"); + stream->puts (";\n"); } /* Emit code for a unary expression -- one which uses the top two stack items, popping the topmost one. This works like printf. */ -static void binary (int indent, string_file &stream, const char *format, ...) +static void binary (int indent, string_file *stream, const char *format, ...) ATTRIBUTE_PRINTF (3, 4); static void -binary (int indent, string_file &stream, const char *format, ...) +binary (int indent, string_file *stream, const char *format, ...) { va_list args; - fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 1] = "); + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 1] = "); va_start (args, format); - stream.vprintf (format, args); + stream->vprintf (format, args); va_end (args); - stream.puts (";\n"); - fprintfi_filtered (indent, &stream, "--__gdb_tos;\n"); + stream->puts (";\n"); + fprintfi_filtered (indent, stream, "--__gdb_tos;\n"); } /* Print the name of a label given its "SCOPE", an arbitrary integer @@ -501,9 +499,9 @@ binary (int indent, string_file &stream, const char *format, ...) corresponding to the label's point of definition. */ static void -print_label (string_file &stream, unsigned int scope, int target) +print_label (string_file *stream, unsigned int scope, int target) { - stream.printf ("__label_%u_%s", scope, pulongest (target)); + stream->printf ("__label_%u_%s", scope, pulongest (target)); } /* Emit code that pushes a register's address on the stack. @@ -511,19 +509,16 @@ print_label (string_file &stream, unsigned int scope, int target) register was needed by this expression. */ static void -pushf_register_address (int indent, string_file &stream, +pushf_register_address (int indent, string_file *stream, unsigned char *registers_used, struct gdbarch *gdbarch, int regnum) { - char *regname = compile_register_name_mangled (gdbarch, regnum); - struct cleanup *cleanups = make_cleanup (xfree, regname); + std::string regname = compile_register_name_mangled (gdbarch, regnum); registers_used[regnum] = 1; pushf (indent, stream, "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", - regname); - - do_cleanups (cleanups); + regname.c_str ()); } /* Emit code that pushes a register's value on the stack. @@ -532,23 +527,20 @@ pushf_register_address (int indent, string_file &stream, register's value before it is pushed. */ static void -pushf_register (int indent, string_file &stream, +pushf_register (int indent, string_file *stream, unsigned char *registers_used, struct gdbarch *gdbarch, int regnum, uint64_t offset) { - char *regname = compile_register_name_mangled (gdbarch, regnum); - struct cleanup *cleanups = make_cleanup (xfree, regname); + std::string regname = compile_register_name_mangled (gdbarch, regnum); registers_used[regnum] = 1; if (offset == 0) pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", - regname); + regname.c_str ()); else pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s", - regname, hex_string (offset)); - - do_cleanups (cleanups); + regname.c_str (), hex_string (offset)); } /* Compile a DWARF expression to C code. @@ -581,7 +573,7 @@ pushf_register (int indent, string_file &stream, things. */ static void -do_compile_dwarf_expr_to_c (int indent, string_file &stream, +do_compile_dwarf_expr_to_c (int indent, string_file *stream, const char *type_name, const char *result_name, struct symbol *sym, CORE_ADDR pc, @@ -600,22 +592,20 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, const gdb_byte * const base = op_ptr; int need_tempvar = 0; int is_tls = 0; - struct cleanup *cleanup; - struct insn_info *info; + std::vector info; int stack_depth; ++scope; - fprintfi_filtered (indent, &stream, "__attribute__ ((unused)) %s %s;\n", + fprintfi_filtered (indent, stream, "__attribute__ ((unused)) %s %s;\n", type_name, result_name); - fprintfi_filtered (indent, &stream, "{\n"); + fprintfi_filtered (indent, stream, "{\n"); indent += 2; stack_depth = compute_stack_depth (byte_order, addr_size, &need_tempvar, &is_tls, op_ptr, op_end, initial != NULL, &info); - cleanup = make_cleanup (xfree, info); /* This is a hack until we can add a feature to glibc to let us properly generate code for TLS. You might think we could emit @@ -632,33 +622,32 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, if (frame == NULL) error (_("Symbol \"%s\" cannot be used because " "there is no selected frame"), - SYMBOL_PRINT_NAME (sym)); + sym->print_name ()); val = read_var_value (sym, NULL, frame); if (VALUE_LVAL (val) != lval_memory) error (_("Symbol \"%s\" cannot be used for compilation evaluation " "as its address has not been found."), - SYMBOL_PRINT_NAME (sym)); + sym->print_name ()); warning (_("Symbol \"%s\" is thread-local and currently can only " "be referenced from the current thread in " "compiled code."), - SYMBOL_PRINT_NAME (sym)); + sym->print_name ()); - fprintfi_filtered (indent, &stream, "%s = %s;\n", + fprintfi_filtered (indent, stream, "%s = %s;\n", result_name, core_addr_to_string (value_address (val))); - fprintfi_filtered (indent - 2, &stream, "}\n"); - do_cleanups (cleanup); + fprintfi_filtered (indent - 2, stream, "}\n"); return; } - fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_stack[%d];\n", + fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_stack[%d];\n", stack_depth); if (need_tempvar) - fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_tmp;\n"); - fprintfi_filtered (indent, &stream, "int __gdb_tos = -1;\n"); + fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_tmp;\n"); + fprintfi_filtered (indent, stream, "int __gdb_tos = -1;\n"); if (initial != NULL) pushf (indent, stream, "%s", core_addr_to_string (*initial)); @@ -669,13 +658,13 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, uint64_t uoffset, reg; int64_t offset; - print_spaces (indent - 2, &stream); + print_spaces (indent - 2, stream); if (info[op_ptr - base].label) { print_label (stream, scope, op_ptr - base); - stream.puts (":;"); + stream->puts (":;"); } - stream.printf ("/* %s */\n", get_DW_OP_name (op)); + stream->printf ("/* %s */\n", get_DW_OP_name (op)); /* This is handy for debugging the generated code: fprintf_filtered (stream, "if (__gdb_tos != %d) abort ();\n", @@ -917,7 +906,7 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, break; case DW_OP_drop: - fprintfi_filtered (indent, &stream, "--__gdb_tos;\n"); + fprintfi_filtered (indent, stream, "--__gdb_tos;\n"); break; case DW_OP_pick: @@ -927,13 +916,13 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, break; case DW_OP_swap: - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "__gdb_tmp = __gdb_stack[__gdb_tos - 1];\n"); - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 1] = " "__gdb_stack[__gdb_tos];\n"); - fprintfi_filtered (indent, &stream, ("__gdb_stack[__gdb_tos] = " - "__gdb_tmp;\n")); + fprintfi_filtered (indent, stream, ("__gdb_stack[__gdb_tos] = " + "__gdb_tmp;\n")); break; case DW_OP_over: @@ -941,15 +930,15 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, break; case DW_OP_rot: - fprintfi_filtered (indent, &stream, ("__gdb_tmp = " - "__gdb_stack[__gdb_tos];\n")); - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, ("__gdb_tmp = " + "__gdb_stack[__gdb_tos];\n")); + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos] = " "__gdb_stack[__gdb_tos - 1];\n"); - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 1] = " "__gdb_stack[__gdb_tos -2];\n"); - fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 2] = " + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 2] = " "__gdb_tmp;\n"); break; @@ -971,7 +960,7 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, /* Cast to a pointer of the desired type, then dereference. */ - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos] = " "*((__gdb_int_%s *) " "__gdb_stack[__gdb_tos]);\n", @@ -1097,19 +1086,19 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, case DW_OP_skip: offset = extract_signed_integer (op_ptr, 2, byte_order); op_ptr += 2; - fprintfi_filtered (indent, &stream, "goto "); + fprintfi_filtered (indent, stream, "goto "); print_label (stream, scope, op_ptr + offset - base); - stream.puts (";\n"); + stream->puts (";\n"); break; case DW_OP_bra: offset = extract_signed_integer (op_ptr, 2, byte_order); op_ptr += 2; - fprintfi_filtered (indent, &stream, + fprintfi_filtered (indent, stream, "if ((( " GCC_INTPTR ") __gdb_stack[__gdb_tos--]) != 0) goto "); print_label (stream, scope, op_ptr + offset - base); - stream.puts (";\n"); + stream->puts (";\n"); break; case DW_OP_nop: @@ -1120,17 +1109,15 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, } } - fprintfi_filtered (indent, &stream, "%s = __gdb_stack[__gdb_tos];\n", + fprintfi_filtered (indent, stream, "%s = __gdb_stack[__gdb_tos];\n", result_name); - fprintfi_filtered (indent - 2, &stream, "}\n"); - - do_cleanups (cleanup); + fprintfi_filtered (indent - 2, stream, "}\n"); } /* See compile.h. */ void -compile_dwarf_expr_to_c (string_file &stream, const char *result_name, +compile_dwarf_expr_to_c (string_file *stream, const char *result_name, struct symbol *sym, CORE_ADDR pc, struct gdbarch *arch, unsigned char *registers_used, unsigned int addr_size, @@ -1145,7 +1132,7 @@ compile_dwarf_expr_to_c (string_file &stream, const char *result_name, /* See compile.h. */ void -compile_dwarf_bounds_to_c (string_file &stream, +compile_dwarf_bounds_to_c (string_file *stream, const char *result_name, const struct dynamic_prop *prop, struct symbol *sym, CORE_ADDR pc,