28#include "safe-ctype.h"
29#include "gdbsupport/selftest.h"
47 auto munge = [] (
char c) ->
unsigned char
53 return TOLOWER ((
unsigned char) c);
58 && (munge (*stra) == munge (*strb)))
64 unsigned char c1 = munge (*stra);
65 unsigned char c2 = munge (*strb);
79 return c1 <
c2 ? -1 : 1;
106 mode_complete) == 0);
115 mode_complete) == 0);
122 mode_complete) == 0);
137 mode_complete) == 0);
164 const char *sep =
nullptr;
183 obstack_grow0 (storage, local_name, strlen (local_name));
184 return (
const char *) obstack_finish (storage);
197 obstack_grow (storage, local_name, strlen (local_name));
198 obstack_grow (storage, sep, strlen (sep));
205 cooked_index_flag
flags,
const char *
name,
210 parent_entry, per_cu);
226 m_future = gdb::thread_pool::g_thread_pool->post_task ([
this] ()
234gdb::unique_xmalloc_ptr<char>
239 if (canonical.empty ())
241 std::vector<gdb::string_view> names =
split_name (canonical.c_str (),
243 gdb::string_view tail = names.back ();
247 for (
const auto &
name : names)
250 void **slot = htab_find_slot_with_hash (gnat_entries, &
name,
257 gdb::unique_xmalloc_ptr<char> new_name
258 = make_unique_xstrndup (
name.data (),
name.length ());
260 0, new_name.get (), parent,
263 m_names.push_back (std::move (new_name));
271 return make_unique_xstrndup (tail.data (), tail.length ());
279 auto hash_name_ptr = [] (
const void *p)
282 return htab_hash_pointer (entry->
name);
285 auto eq_name_ptr = [] (
const void *a,
const void *b) ->
int
296 htab_up seen_names (htab_create_alloc (10, hash_name_ptr, eq_name_ptr,
299 auto hash_entry = [] (
const void *e)
305 auto eq_entry = [] (
const void *a,
const void *b) ->
int
308 const gdb::string_view *sv = (
const gdb::string_view *) b;
309 return (strlen (ae->
canonical) == sv->length ()
310 && strncasecmp (ae->
canonical, sv->data (), sv->length ()) == 0);
313 htab_up gnat_entries (htab_create_alloc (10, hash_entry, eq_entry,
320 gdb_assert (entry->canonical ==
nullptr);
322 entry->canonical = entry->name;
325 gdb::unique_xmalloc_ptr<char> canon_name
327 if (canon_name ==
nullptr)
328 entry->canonical = entry->name;
331 entry->canonical = canon_name.get ();
332 m_names.push_back (std::move (canon_name));
338 void **slot = htab_find_slot (seen_names.get (), entry,
340 if (*slot ==
nullptr)
342 gdb::unique_xmalloc_ptr<char> canon_name
346 if (canon_name ==
nullptr)
347 entry->canonical = entry->name;
350 entry->canonical = canon_name.get ();
351 m_names.push_back (std::move (canon_name));
362 entry->canonical = entry->name;
387 const std::string &n)
389 return cooked_index_entry::compare (entry->canonical, n.c_str (), mode) < 0;
393 [=] (
const std::string &n,
396 return cooked_index_entry::compare (entry->canonical, n.c_str (), mode) > 0;
399 return range (lower, upper);
403 : m_vector (
std::move (vec))
417 if (result !=
nullptr)
425std::vector<addrmap *>
428 std::vector<addrmap *> result;
430 result.push_back (index->m_addrmap);
439 std::vector<cooked_index::range> result_range;
440 result_range.reserve (
m_vector.size ());
442 result_range.push_back (entry->find (
name, completing));
443 return range (std::move (result_range));
475 selftests::register_test (
"cooked_index_entry::compare", test_compare);
std::string ada_decode(const char *encoded, bool wrap, bool operators)
void * xcalloc(size_t number, size_t size)
gdb::unique_xmalloc_ptr< char > c_canonicalize_name(const char *name)
std::vector< addrmap * > get_addrmaps()
dwarf2_per_cu_data * lookup(CORE_ADDR addr)
const cooked_index_entry * get_main() const
std::vector< std::unique_ptr< cooked_index > > vec_type
range find(const std::string &name, bool completing)
cooked_index_vector(vec_type &&vec)
range_chain< cooked_index::range > range
gdb::unique_xmalloc_ptr< char > handle_gnat_encoded_entry(cooked_index_entry *entry, htab_t gnat_entries)
cooked_index_entry * create(sect_offset die_offset, enum dwarf_tag tag, cooked_index_flag flags, const char *name, const cooked_index_entry *parent_entry, dwarf2_per_cu_data *per_cu)
std::vector< gdb::unique_xmalloc_ptr< char > > m_names
cooked_index_entry * m_main
gdb::future< void > m_future
iterator_range< std::vector< cooked_index_entry * >::iterator > range
range find(const std::string &name, bool completing)
const cooked_index_entry * add(sect_offset die_offset, enum dwarf_tag tag, cooked_index_flag flags, const char *name, const cooked_index_entry *parent_entry, dwarf2_per_cu_data *per_cu)
std::vector< cooked_index_entry * > m_entries
bool language_requires_canonicalization(enum language lang)
void _initialize_cooked_index()
bool language_requires_canonicalization(enum language lang)
gdb::unique_xmalloc_ptr< char > cp_canonicalize_string(const char *string)
mach_port_t kern_return_t mach_port_t mach_msg_type_name_t msgportsPoly mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
uint32_t dwarf5_djb_hash(const char *str_)
std::vector< gdb::string_view > split_name(const char *name, split_style style)
dwarf2_per_cu_data * per_cu
void write_scope(struct obstack *storage, const char *sep, bool for_name) const
static int compare(const char *stra, const char *strb, comparison_mode mode)
const char * full_name(struct obstack *storage, bool for_main=false) const
const cooked_index_entry * parent_entry
enum language lang(bool strict_p=true) const