On 17-05-16 09:51:42, Simon Marchi wrote:
So indeed, the problem is due to the ordering of the _initialize
functions
that changed, _initialize_printcmd used to be called before
_initialize_infcmd, now it's the reverse.
When it works, the timeline of events to be able to get the tty alias
working is the following:
1. The "set" command is registered as a prefix command in printcmd.c,
which
adds it to the global command list (cmdlist). setlist is the list of
its
subcommands.
2. The "set inferior-tty" command is added as a child of "set" (i.e.
it's
inserted into setlist) in infcmd.c.
3. The "tty" alias is created for "set inferior-tty" in infcmd.c.
This
looks up "set" in cmdlist, then "inferior-tty" in the subcommands of
"set".
It's found and everyone is happy.
With the _initialize functions called in a different order, steps are
executed in the order 2-3-1. When we try to create the alias, the
"set"
command has not been created and is therefore not part of cmdlist. We
can't
find the "set inferior-tty" command, so the alias is not created.
When we try to create the alias (in step 3), setlist is already created
in step 2, but it is not linked with cmdlist. The command "set
inferior-tty" is created in step 2 too. Since step 2 and step 3 are
close to each other (in _initialize_infcmd), we can pass the "set
inferior-tty" cmd_list_element to the place we create alias, like this,
cmd_name = "inferior-tty";
c = lookup_cmd (&cmd_name, setlist, "", -1, 1);
gdb_assert (c != NULL);
add_alias_cmd ("tty", c, class_alias, 0, &cmdlist);
this makes sure we add alias "tty" under cmdlist, and it is alias to
"set inferior-tty". Step 1 just links setlist and cmdlist together.
I think the core issue is that it's currently possible to create
subcommands
for prefixes that have not been created yet. We need some way of
ensuring
some kind of ordering. Here are some ideas:
How is the patch below? I run regress tests yet, and it still needs
some comments.