void cp_scan_for_anonymous_namespaces (const struct symbol *const symbol, struct objfile *const objfile) { if (SYMBOL_DEMANGLED_NAME (symbol) != NULL) { const char *name = SYMBOL_DEMANGLED_NAME (symbol); unsigned int previous_component; unsigned int next_component; /* Start with a quick-and-dirty check for mention of "(anonymous namespace)". */ if (!cp_is_in_anonymous (name)) return; previous_component = 0; next_component = cp_find_first_component (name + previous_component); while (name[next_component] == ':') { if (((next_component - previous_component) == CP_ANONYMOUS_NAMESPACE_LEN) && strncmp (name + previous_component, CP_ANONYMOUS_NAMESPACE_STR, CP_ANONYMOUS_NAMESPACE_LEN) == 0) { int dest_len = (previous_component == 0 ? 0 : previous_component - 2); int src_len = next_component; char *dest = (char *) alloca (dest_len + 1); char *src = (char *) alloca (src_len + 1); memcpy (dest, name, dest_len); memcpy (src, name, src_len); dest[dest_len] = '\0'; src[src_len] = '\0'; /* We've found a component of the name that's an anonymous namespace. So add symbols in it to the namespace given by the previous component if there is one, or to the global namespace if there isn't. */ add_using_directive (&local_using_directives, dest, src, NULL, NULL, NULL, 1, &objfile->objfile_obstack); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; next_component = (previous_component + cp_find_first_component (name + previous_component)); } } }
unsigned int cp_entire_prefix_len (const char *name) { unsigned int current_len = cp_find_first_component (name); unsigned int previous_len = 0; while (name[current_len] != '\0') { gdb_assert (name[current_len] == ':'); previous_len = current_len; /* Skip the '::'. */ current_len += 2; current_len += cp_find_first_component (name + current_len); } return previous_len; }
void cp_scan_for_anonymous_namespaces (const struct symbol *symbol) { if (!processing_has_namespace_info && SYMBOL_CPLUS_DEMANGLED_NAME (symbol) != NULL) { const char *name = SYMBOL_CPLUS_DEMANGLED_NAME (symbol); unsigned int previous_component; unsigned int next_component; const char *len; /* Start with a quick-and-dirty check for mention of "(anonymous namespace)". */ if (!cp_is_anonymous (name)) return; previous_component = 0; next_component = cp_find_first_component (name + previous_component); while (name[next_component] == ':') { if ((next_component - previous_component) == ANONYMOUS_NAMESPACE_LEN && strncmp (name + previous_component, "(anonymous namespace)", ANONYMOUS_NAMESPACE_LEN) == 0) { /* We've found a component of the name that's an anonymous namespace. So add symbols in it to the namespace given by the previous component if there is one, or to the global namespace if there isn't. */ cp_add_using_directive (name, previous_component == 0 ? 0 : previous_component - 2, next_component); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; next_component = (previous_component + cp_find_first_component (name + previous_component)); } } }
compile_scope type_name_to_scope (const char *type_name, const struct block *block) { compile_scope scope; if (type_name == nullptr) { /* An anonymous type. We cannot really do much here. We simply cannot look up anonymous types easily/at all. */ return scope; } const char *p = type_name; std::string lookup_name; while (*p != '\0') { /* Create a string token of the first component of TYPE_NAME. */ int len = cp_find_first_component (p); std::string s (p, len); /* Advance past the last token. */ p += len; /* Look up the symbol and decide when to stop. */ if (!lookup_name.empty ()) lookup_name += "::"; lookup_name += s; /* Look up the resulting name. */ struct block_symbol bsymbol = lookup_symbol (lookup_name.c_str (), block, VAR_DOMAIN, nullptr); if (bsymbol.symbol != nullptr) { scope_component comp = {s, bsymbol}; scope.push_back (comp); if (TYPE_CODE (SYMBOL_TYPE (bsymbol.symbol)) != TYPE_CODE_NAMESPACE) { /* We're done. */ break; } } if (*p == ':') { ++p; if (*p == ':') ++p; else { /* This shouldn't happen since we are not attempting to loop over user input. This name is generated by GDB from debug info. */ internal_error (__FILE__, __LINE__, _("malformed TYPE_NAME during parsing")); } } } return scope; }