struct symtoken ssym;
int voidval;
const struct block *bval;
+ struct scope_val_type_i_guess {
+ bool has_namespace;
+ const struct block *bval;
+ LONGEST namespace_val;
+ } scope_val;
enum exp_opcode opcode;
struct stoken_vector svec;
%right ARROW ARROW_STAR '.' DOT_STAR '[' OBJC_LBRAC '('
%token <ssym> BLOCKNAME
%token <bval> FILENAME
-%type <bval> block
+%type <typed_val_int> namespace
+%type <scope_val> block
%left COLONCOLON
%token DOTDOTDOT
/* end of C++. */
+namespace: '[' '[' INT ']' ']'
+ {
+ $$ = $3;
+ }
+ ;
+
block : BLOCKNAME
{
- if ($1.sym.symbol)
- $$ = $1.sym.symbol->value_block ();
- else
+ if (!$1.sym.symbol)
error (_("No file or function \"%s\"."),
copy_name ($1.stoken).c_str ());
+ $$.bval = $1.sym.symbol->value_block ();
}
| FILENAME
{
- $$ = $1;
+ $$.bval = $1;
}
;
{
std::string copy = copy_name ($3);
struct symbol *tem
- = lookup_symbol (copy.c_str (), $1,
+ = lookup_symbol (copy.c_str (), $1.bval,
SEARCH_FUNCTION_DOMAIN,
nullptr).symbol;
if (tem == nullptr)
error (_("No function \"%s\" in specified context."),
copy.c_str ());
- $$ = tem->value_block (); }
+ $$.bval = tem->value_block ();
+ $$.has_namespace = $1.has_namespace;
+ $$.namespace_val = $1.namespace_val;
+ }
;
variable: name_not_typename ENTRY
{
std::string copy = copy_name ($3);
struct block_symbol sym
- = lookup_symbol (copy.c_str (), $1,
+ = lookup_symbol (copy.c_str (), $1.bval,
SEARCH_VFT, NULL);
if (sym.symbol == 0)
pstate->push_new<var_value_operation> (sym);
}
+ | namespace COLONCOLON name
+ {
+ std::string sym_name = copy_name ($3);
+
+ struct block_symbol bsym
+ = lookup_symbol_in_linker_namespace
+ (sym_name.c_str (), $1.val, SEARCH_VFT);
+
+ if (bsym.symbol == NULL)
+ error (_("Symbol %s not found in"
+ " namespace [[%ld]]"),
+ sym_name.c_str (), $1.val);
+
+ if (symbol_read_needs_frame (bsym.symbol))
+ pstate->block_tracker->update (bsym);
+
+ pstate->push_new<var_value_operation> (bsym);
+ }
;
qualified_name: TYPENAME COLONCOLON name
/* See symtab.h. */
+struct block_symbol
+lookup_symbol_in_linker_namespace (const char *name, int nsid,
+ const domain_search_flags domain)
+{
+ struct gdbarch *gdbarch = current_inferior ()->arch ();
+ const solib_ops *ops = gdbarch_so_ops (gdbarch);
+
+ if (ops->get_solibs_in_ns == nullptr)
+ error (_("Namespaces are not supported by the inferior."));
+
+ std::vector<const solib *> sos_in_namespace = ops->get_solibs_in_ns (nsid);
+ if (sos_in_namespace.size() == 0)
+ error (_("Namespace [[%d]] is inactive"), nsid);
+
+ symbol_lookup_debug_printf ("lookup_symbol_in_linker_namespace (%d, %s, %s)",
+ nsid, name, domain_name (domain).c_str ());
+
+ /* We look for both global and static symbols in here. There is no reason
+ to pick one over the other to my knowledge, so we go alphabetical. */
+ for (const solib *so : sos_in_namespace)
+ {
+ struct block_symbol bsym
+ = lookup_global_symbol_from_objfile (so->objfile, GLOBAL_BLOCK,
+ name, domain);
+ if (bsym.symbol != nullptr)
+ return bsym;
+
+ bsym = lookup_global_symbol_from_objfile (so->objfile, STATIC_BLOCK,
+ name, domain);
+ if (bsym.symbol != nullptr)
+ return bsym;
+ }
+
+ return {};
+}
+
+/* See symtab.h. */
+
struct block_symbol
lookup_global_symbol (const char *name,
const struct block *block,
const char *name,
const domain_search_flags domain);
+/* Lookup symbol NAME from DOMAIN in the linker namespace NSID.
+ This generates a list of all objfiles in NSID, then searches
+ those objfiles for the given symbol. Searches for both global or
+ static symbols. */
+extern struct block_symbol
+ lookup_symbol_in_linker_namespace (const char *name, int nsid,
+ const domain_search_flags domain);
+
extern unsigned int symtab_create_debug;
/* Print a "symtab-create" debug statement. */