X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcompile%2Fcompile-loc2c.c;h=bd080f85fbb24138b0a436bffb3fe46d9769163c;hb=b7dc48b4a8006abb552c5e7d22f9841c86f2537d;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..bd080f85fb 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-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -24,6 +24,7 @@ #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" @@ -62,7 +63,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 +72,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 +81,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 +92,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 +325,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 +334,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 +348,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 +388,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 +404,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 +419,6 @@ compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size, *is_tls = 1; } - discard_cleanups (outer_cleanup); return stack_depth + 1; } @@ -515,15 +512,12 @@ 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. @@ -536,19 +530,16 @@ 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. @@ -600,8 +591,7 @@ 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; @@ -615,7 +605,6 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, &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 @@ -649,7 +638,6 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, result_name, core_addr_to_string (value_address (val))); fprintfi_filtered (indent - 2, &stream, "}\n"); - do_cleanups (cleanup); return; } @@ -1123,8 +1111,6 @@ do_compile_dwarf_expr_to_c (int indent, string_file &stream, fprintfi_filtered (indent, &stream, "%s = __gdb_stack[__gdb_tos];\n", result_name); fprintfi_filtered (indent - 2, &stream, "}\n"); - - do_cleanups (cleanup); } /* See compile.h. */