21#include "gdbsupport/gdb_obstack.h"
23#include "gdbsupport/selftest.h"
37 internal_error (
"addrmap_fixed_set_empty: "
38 "fixed addrmaps can't be changed\n");
56 if (mid->
addr == addr)
61 else if (mid->
addr < addr)
108 CORE_ADDR *key = XNEW (CORE_ADDR);
111 return (splay_tree_key) key;
119 return ::splay_tree_lookup (
tree, (splay_tree_key) &addr);
126 return ::splay_tree_predecessor (
tree, (splay_tree_key) &addr);
133 return ::splay_tree_successor (
tree, (splay_tree_key) &addr);
147 return * (CORE_ADDR *) node->key;
154 return (
void *) node->value;
161 node->value = (splay_tree_value)
value;
170 (splay_tree_value)
value);
194 splay_tree_node n, next;
211 if (end_inclusive < CORE_ADDR_MAX)
229 n && (end_inclusive == CORE_ADDR_MAX
265 size_t transition_count = 0;
268 mut->
foreach ([&] (CORE_ADDR start,
void *obj)
286 mut->
foreach ([&] (CORE_ADDR start,
void *obj)
303 internal_error (_(
"addrmap_relocate is not implemented yet "
304 "for mutable addrmaps"));
330 CORE_ADDR a = * (CORE_ADDR *) ak;
331 CORE_ADDR b = * (CORE_ADDR *) bk;
346 xfree ((
void *) key);
357 splay_tree_delete (
tree);
369 bool previous_matched =
false;
371 auto callback = [&] (CORE_ADDR start_addr,
const void *obj)
375 bool matches = payload ==
nullptr || payload == obj;
376 const char *addr_str =
nullptr;
378 addr_str = host_address_to_string (obj);
379 else if (previous_matched)
380 addr_str =
"<ends here>";
382 if (matches || previous_matched)
384 payload !=
nullptr ?
" " :
"",
385 core_addr_to_string (start_addr),
388 previous_matched = matches;
404 return (CORE_ADDR)(uintptr_t)p;
409#define CHECK_ADDRMAP_FIND(MAP, ARRAY, LOW, HIGH, VAL) \
412 for (unsigned i = LOW; i <= HIGH; ++i) \
413 SELF_CHECK (MAP->find (core_addr (&ARRAY[i])) == VAL); \
426 void *val1 = &array[1];
427 void *val2 = &array[2];
430 auto_obstack temp_obstack;
431 auto map = gdb::make_unique<struct addrmap_mutable> ();
432 SELF_CHECK (map !=
nullptr);
435 CHECK_ADDRMAP_FIND (map, array, 0, 19,
nullptr);
438 map->set_empty (core_addr (&array[10]), core_addr (&array[12]), val1);
439 CHECK_ADDRMAP_FIND (map, array, 0, 9,
nullptr);
440 CHECK_ADDRMAP_FIND (map, array, 10, 12, val1);
441 CHECK_ADDRMAP_FIND (map, array, 13, 19,
nullptr);
445 =
new (&temp_obstack)
addrmap_fixed (&temp_obstack, map.get ());
446 SELF_CHECK (map2 !=
nullptr);
447 CHECK_ADDRMAP_FIND (map2, array, 0, 9,
nullptr);
448 CHECK_ADDRMAP_FIND (map2, array, 10, 12, val1);
449 CHECK_ADDRMAP_FIND (map2, array, 13, 19,
nullptr);
452 auto callback = [&] (CORE_ADDR start_addr,
void *obj)
454 if (start_addr == core_addr (
nullptr))
455 SELF_CHECK (obj ==
nullptr);
456 else if (start_addr == core_addr (&array[10]))
457 SELF_CHECK (obj == val1);
458 else if (start_addr == core_addr (&array[13]))
459 SELF_CHECK (obj ==
nullptr);
464 SELF_CHECK (map->foreach (callback) == 0);
465 SELF_CHECK (map2->
foreach (callback) == 0);
469 CHECK_ADDRMAP_FIND (map2, array, 0, 10,
nullptr);
470 CHECK_ADDRMAP_FIND (map2, array, 11, 13, val1);
471 CHECK_ADDRMAP_FIND (map2, array, 14, 19,
nullptr);
474 map->set_empty (core_addr (&array[11]), core_addr (&array[13]), val2);
475 CHECK_ADDRMAP_FIND (map, array, 0, 9,
nullptr);
476 CHECK_ADDRMAP_FIND (map, array, 10, 12, val1);
477 CHECK_ADDRMAP_FIND (map, array, 13, 13, val2);
478 CHECK_ADDRMAP_FIND (map, array, 14, 19,
nullptr);
489 selftests::register_test (
"addrmap", selftests::test_addrmap);
static CORE_ADDR addrmap_node_key(splay_tree_node node)
void _initialize_addrmap()
static void * addrmap_node_value(splay_tree_node node)
gdb_static_assert(sizeof(splay_tree_key) >=sizeof(CORE_ADDR *))
static int splay_compare_CORE_ADDR_ptr(splay_tree_key ak, splay_tree_key bk)
static void xfree_wrapper(splay_tree_key key)
void addrmap_dump(struct addrmap *map, struct ui_file *outfile, void *payload)
static void addrmap_node_set_value(splay_tree_node node, void *value)
static int addrmap_mutable_foreach_worker(splay_tree_node node, void *data)
gdb::function_view< int(CORE_ADDR start_addr, void *obj)> addrmap_foreach_fn
void relocate(CORE_ADDR offset) override
struct addrmap_transition * transitions
int do_foreach(addrmap_foreach_fn fn) const override
void * do_find(CORE_ADDR addr) const override
void set_empty(CORE_ADDR start, CORE_ADDR end_inclusive, void *obj) override
addrmap_fixed(struct obstack *obstack, addrmap_mutable *mut)
void splay_tree_remove(CORE_ADDR addr)
void force_transition(CORE_ADDR addr)
splay_tree_node splay_tree_lookup(CORE_ADDR addr) const
int do_foreach(addrmap_foreach_fn fn) const override
void * do_find(CORE_ADDR addr) const override
void splay_tree_insert(CORE_ADDR key, void *value)
void relocate(CORE_ADDR offset) override
splay_tree_key allocate_key(CORE_ADDR addr)
splay_tree_node splay_tree_successor(CORE_ADDR addr)
void set_empty(CORE_ADDR start, CORE_ADDR end_inclusive, void *obj) override
splay_tree_node splay_tree_predecessor(CORE_ADDR addr) const
int foreach(addrmap_foreach_const_fn fn) const
virtual void relocate(CORE_ADDR offset)=0
void gdb_printf(struct ui_file *stream, const char *format,...)