From 8de71aab66c182ec1f6eb95ed943b64900dd7770 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 19 Dec 2013 07:56:20 -0700 Subject: [PATCH] convert to_auxv_parse 2014-02-19 Tom Tromey * auxv.c (default_auxv_parse): No longer static. (target_auxv_parse): Unconditionally delegate. * auxv.h (default_auxv_parse): Declare. * target-delegates.c: Rebuild. * target.c: Include auxv.h. * target.h (struct target_ops) : Use TARGET_DEFAULT_FUNC. --- gdb/ChangeLog | 10 ++++++++++ gdb/auxv.c | 11 +++-------- gdb/auxv.h | 7 +++++++ gdb/target-delegates.c | 10 ++++++++++ gdb/target.c | 1 + gdb/target.h | 3 ++- 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c174974593d..9c485b7c583 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2014-02-19 Tom Tromey + + * auxv.c (default_auxv_parse): No longer static. + (target_auxv_parse): Unconditionally delegate. + * auxv.h (default_auxv_parse): Declare. + * target-delegates.c: Rebuild. + * target.c: Include auxv.h. + * target.h (struct target_ops) : Use + TARGET_DEFAULT_FUNC. + 2014-02-19 Tom Tromey * target-delegates.c: Rebuild. diff --git a/gdb/auxv.c b/gdb/auxv.c index 2f4acf3da30..ee47446560a 100644 --- a/gdb/auxv.c +++ b/gdb/auxv.c @@ -254,7 +254,7 @@ memory_xfer_auxv (struct target_ops *ops, Return 0 if *READPTR is already at the end of the buffer. Return -1 if there is insufficient buffer for a whole entry. Return 1 if an entry was read into *TYPEP and *VALP. */ -static int +int default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { @@ -286,13 +286,8 @@ int target_auxv_parse (struct target_ops *ops, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { - struct target_ops *t; - - for (t = ops; t != NULL; t = t->beneath) - if (t->to_auxv_parse != NULL) - return t->to_auxv_parse (t, readptr, endptr, typep, valp); - - return default_auxv_parse (ops, readptr, endptr, typep, valp); + return current_target.to_auxv_parse (¤t_target, readptr, endptr, + typep, valp); } diff --git a/gdb/auxv.h b/gdb/auxv.h index c3f2322fdd1..ace6c0494f1 100644 --- a/gdb/auxv.h +++ b/gdb/auxv.h @@ -24,6 +24,13 @@ /* See "include/elf/common.h" for the definition of valid AT_* values. */ +/* The default implementation of to_auxv_parse, used by the target + stack. */ + +extern int default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, + CORE_ADDR *valp); + /* Read one auxv entry from *READPTR, not reading locations >= ENDPTR. Return 0 if *READPTR is already at the end of the buffer. Return -1 if there is insufficient buffer for a whole entry. diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index 209ecb72c3f..cf5e2d3be95 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -782,6 +782,13 @@ delegate_get_ada_task_ptid (struct target_ops *self, long arg1, long arg2) return self->to_get_ada_task_ptid (self, arg1, arg2); } +static int +delegate_auxv_parse (struct target_ops *self, gdb_byte **arg1, gdb_byte *arg2, CORE_ADDR *arg3, CORE_ADDR *arg4) +{ + self = self->beneath; + return self->to_auxv_parse (self, arg1, arg2, arg3, arg4); +} + static int delegate_can_execute_reverse (struct target_ops *self) { @@ -1594,6 +1601,8 @@ install_delegators (struct target_ops *ops) ops->to_flash_done = delegate_flash_done; if (ops->to_get_ada_task_ptid == NULL) ops->to_get_ada_task_ptid = delegate_get_ada_task_ptid; + if (ops->to_auxv_parse == NULL) + ops->to_auxv_parse = delegate_auxv_parse; if (ops->to_can_execute_reverse == NULL) ops->to_can_execute_reverse = delegate_can_execute_reverse; if (ops->to_execution_direction == NULL) @@ -1773,6 +1782,7 @@ install_dummy_methods (struct target_ops *ops) ops->to_flash_erase = tdefault_flash_erase; ops->to_flash_done = tdefault_flash_done; ops->to_get_ada_task_ptid = default_get_ada_task_ptid; + ops->to_auxv_parse = default_auxv_parse; ops->to_can_execute_reverse = tdefault_can_execute_reverse; ops->to_execution_direction = default_execution_direction; ops->to_supports_multi_process = tdefault_supports_multi_process; diff --git a/gdb/target.c b/gdb/target.c index 38012ccf4a7..4b5ec43d113 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -44,6 +44,7 @@ #include "tracepoint.h" #include "gdb/fileio.h" #include "agent.h" +#include "auxv.h" static void target_info (char *, int); diff --git a/gdb/target.h b/gdb/target.h index e6e78e17d8a..296ab109bf6 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -706,7 +706,8 @@ struct target_ops Return -1 if there is insufficient buffer for a whole entry. Return 1 if an entry was read into *TYPEP and *VALP. */ int (*to_auxv_parse) (struct target_ops *ops, gdb_byte **readptr, - gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp); + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) + TARGET_DEFAULT_FUNC (default_auxv_parse); /* Search SEARCH_SPACE_LEN bytes beginning at START_ADDR for the sequence of bytes in PATTERN with length PATTERN_LEN. -- 2.30.2