From ee3a7b7f0d021019dd51b6c86375aaa399f63f13 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Fri, 6 Jul 2001 14:44:19 +0000 Subject: [PATCH] * gdbtypes.h (builtin_type_void_func_ptr): New builtin type. * gdbtypes.c (builtin_type_void_func_ptr): Define the variable. (build_gdbtypes): Initialize it. (_initialize_gdbtypes): Swap it. --- gdb/ChangeLog | 8 ++++++++ gdb/gdbtypes.c | 34 +++++++++++++++++++++++++++++++--- gdb/gdbtypes.h | 10 ++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a4e3cc2fa31..59ffe44adc1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,4 +1,12 @@ +2001-07-06 Jim Blandy + + * gdbtypes.h (builtin_type_void_func_ptr): New builtin type. + * gdbtypes.c (builtin_type_void_func_ptr): Define the variable. + (build_gdbtypes): Initialize it. + (_initialize_gdbtypes): Swap it. + 2001-07-04 Daniel Jacobowitz + * mips-tdep.c (mips32_op): Correct offset. (itype_op): Likewise. (itype_rs): Fix formatting. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index ee191cdd0bb..f2fed5f5481 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -74,6 +74,7 @@ struct type *builtin_type_v8qi; struct type *builtin_type_v4hi; struct type *builtin_type_v2si; struct type *builtin_type_ptr; +struct type *builtin_type_void_func_ptr; struct type *builtin_type_CORE_ADDR; struct type *builtin_type_bfd_vma; @@ -2928,10 +2929,36 @@ build_gdbtypes (void) = init_simd_type ("__builtin_v2si", builtin_type_int32, "f", 2); /* Pointer/Address types. */ - /* NOTE: At present there is no way of differentiating between at - target address and the target C language pointer type type even - though the two can be different (cf d10v) */ + + /* NOTE: on some targets, addresses and pointers are not necessarily + the same --- for example, on the D10V, pointers are 16 bits long, + but addresses are 32 bits long. See doc/gdbint.texinfo, + ``Pointers Are Not Always Addresses''. + + The upshot is: + - gdb's `struct type' always describes the target's + representation. + - gdb's `struct value' objects should always hold values in + target form. + - gdb's CORE_ADDR values are addresses in the unified virtual + address space that the assembler and linker work with. Thus, + since target_read_memory takes a CORE_ADDR as an argument, it + can access any memory on the target, even if the processor has + separate code and data address spaces. + + So, for example: + - If v is a value holding a D10V code pointer, its contents are + in target form: a big-endian address left-shifted two bits. + - If p is a D10V pointer type, TYPE_LENGTH (p) == 2, just as + sizeof (void *) == 2 on the target. + + In this context, builtin_type_CORE_ADDR is a bit odd: it's a + target type for a value the target will never see. It's only + used to hold the values of (typeless) linker symbols, which are + indeed in the unified virtual address space. */ builtin_type_ptr = make_pointer_type (builtin_type_void, NULL); + builtin_type_void_func_ptr + = lookup_pointer_type (lookup_function_type (builtin_type_void)); builtin_type_CORE_ADDR = init_type (TYPE_CODE_INT, TARGET_ADDR_BIT / 8, TYPE_FLAG_UNSIGNED, @@ -2985,6 +3012,7 @@ _initialize_gdbtypes (void) register_gdbarch_swap (&builtin_type_v4hi, sizeof (struct type *), NULL); register_gdbarch_swap (&builtin_type_v2si, sizeof (struct type *), NULL); REGISTER_GDBARCH_SWAP (builtin_type_ptr); + REGISTER_GDBARCH_SWAP (builtin_type_void_func_ptr); REGISTER_GDBARCH_SWAP (builtin_type_CORE_ADDR); REGISTER_GDBARCH_SWAP (builtin_type_bfd_vma); register_gdbarch_swap (NULL, 0, build_gdbtypes); diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index f5f9f1ad8f8..981dbec4b7c 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -849,6 +849,16 @@ extern struct type *builtin_type_bool; /* (C) Language pointer type. Some target platforms use an implicitly {sign,zero} -extended 32 bit C language pointer on a 64 bit ISA. */ extern struct type *builtin_type_ptr; + +/* (C) Language `pointer to function returning void' type. Since + ANSI, C standards have explicitly said that pointers to functions + and pointers to data are not interconvertible --- that is, you + can't cast a function pointer to void * and back, and expect to get + the same value. However, all function pointer types are + interconvertible, so void (*) () can server as a generic function + pointer. */ +extern struct type *builtin_type_void_func_ptr; + /* The target CPU's address type. This is the ISA address size. */ extern struct type *builtin_type_CORE_ADDR; /* The symbol table address type. Some object file formats have a 32 -- 2.30.2