8cf6f0b103
* opencl-lang.c (lval_func_check_synthetic_pointer): New function. * value.h (struct lval_funcs) <indirect, check_synthetic_pointer>: New fields. (value_bits_synthetic_pointer): Declare. * value.c (value_bits_synthetic_pointer): New function. * valprint.c (valprint_check_validity): Handle synthetic pointers. * valops.c (value_ind): Use new 'indirect' lval_funcs method. * valarith.c (value_ptradd): Use set_value_component_location. * p-valprint.c (pascal_object_print_value_fields): Handle synthetic pointers. * jv-valprint.c (java_print_value_fields): Handle synthetic pointers. * dwarf2read.c (dwarf_stack_op_name): Add DW_OP_GNU_implicit_pointer. (dwarf2_fetch_die_location_block): Add get_frame_pc, baton arguments. Handle location lists. (fill_in_loclist_baton): New function. (dwarf2_symbol_mark_computed): Use it. * dwarf2loc.h (dwarf2_find_location_expression): Declare. (dwarf2_fetch_die_location_block): Add get_frame_pc, baton arguments. * dwarf2loc.c (dwarf2_find_location_expression): Rename from find_location_expression. No longer static. Update all callers. (dwarf_expr_frame_pc): New function. (per_cu_dwarf_call): Add get_frame_pc, baton arguments. Update all callers. (struct piece_closure) <per_cu>: New field. (allocate_piece_closure): Add per_cu argument. (read_pieced_value): Handle DWARF_VALUE_IMPLICIT_POINTER. (check_pieced_value_bits): Remove validity argument, add check_for argument. Handle DWARF_VALUE_IMPLICIT_POINTER. (check_pieced_value_validity, check_pieced_value_invalid): Update. (check_pieced_synthetic_pointer): New function. (get_frame_address_in_block_wrapper): New function. (indirect_pieced_value): New function. (pieced_value_funcs): Update. (invalid_synthetic_pointer): New function. (dwarf2_evaluate_loc_desc_full): Rename from dwarf2_evaluate_loc_desc. Add byte_offset argument. (dwarf2_evaluate_loc_desc): Rewrite. (dwarf2_loc_desc_needs_frame): Set new field on context. (get_ax_pc): New function. (disassemble_dwarf_expression): Handle DW_OP_GNU_implicit_pointer. * dwarf2expr.h (enum dwarf_value_location) <DWARF_VALUE_IMPLICIT_POINTER>: New constant. (struct dwarf_expr_context) <get_frame_pc>: New field. (struct dwarf_expr_piece) <v.ptr>: New field. * dwarf2expr.c (add_piece): Handle DWARF_VALUE_IMPLICIT_POINTER. (execute_stack_op): Handle DW_OP_GNU_implicit_pointer. * dwarf2-frame.c (no_get_frame_pc): New function. (execute_stack_op): Set new field on context. * cp-valprint.c (cp_print_value_fields): Handle synthetic pointers. gdb/testsuite * gdb.dwarf2/implptr.exp: New file. * gdb.dwarf2/implptr.c: New file. * gdb.dwarf2/implptr.S: New file.
68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
/* Copyright (C) 2010 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
/* The original program corresponding to implptr.S.
|
|
This came from Jakub's gcc-patches email implementing
|
|
DW_OP_GNU_implicit_pointer.
|
|
Note that it is not ever compiled, implptr.S is used instead.
|
|
However, it is used to extract breakpoint line numbers. */
|
|
|
|
struct S
|
|
{
|
|
int *x, y;
|
|
};
|
|
|
|
int u[6];
|
|
|
|
static inline void
|
|
add (struct S *a, struct S *b, int c)
|
|
{
|
|
*a->x += *b->x;
|
|
a->y += b->y;
|
|
u[c + 0]++;
|
|
a = (struct S *) 0;
|
|
u[c + 1]++;
|
|
a = b;
|
|
u[c + 2]++;
|
|
}
|
|
|
|
int
|
|
foo (int i)
|
|
{
|
|
int j = i;
|
|
struct S p[2] = { {&i, i * 2}, {&j, j * 2} };
|
|
add (&p[0], &p[1], 0);
|
|
p[0].x = &j;
|
|
p[1].x = &i;
|
|
add (&p[0], &p[1], 3);
|
|
return i + j; /* foo breakpoint */
|
|
}
|
|
|
|
int __attribute__ ((noinline, used, noclone))
|
|
bar (int i)
|
|
{
|
|
int *j = &i;
|
|
int **k = &j;
|
|
int ***l = &k;
|
|
i++; /* bar breakpoint */
|
|
return i;
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
return bar(5) + foo (23);
|
|
}
|