RE: [pushed 8.0-branch] [Bug server/22137] gdbserver crashes on hosts with pkru register

Tedeschi, Walfred
2017-10-16T14:04:28Z

> From: Pedro Alves [mailto:palves@redhat.com]
> Sent: Monday, October 16, 2017 3:44 PM
> To: Tedeschi, Walfred <walfred.tedeschi@intel.com>; gdb-
> patches@sourceware.org
> Subject: Re: [pushed 8.0-branch] [Bug server/22137] gdbserver crashes on
> hosts with pkru register
>
> On 10/16/2017 02:20 PM, Tedeschi, Walfred wrote:
> >
> >>> > > I also couldn't compile master:
> >>> > > ../../../binutils-gdb/gdb/probe.c: In function \u2018void
> >> > parse_probes_in_pspace(const probe_ops*, program_space*, const
> >> > char*, const char*, const char*,
> std::vector<symtab_and_line>*)\u2019:
> >>> > > ../../../binutils-gdb/gdb/probe.c:68:12: error: types may not be
> >>> > > defined in a
> >> > for-range-declaration [-Werror]
> >>> > > for (struct probe *probe : probes)
> >>> > > ^~~~~~
> >>> > > ../../../binutils-gdb/gdb/probe.c: In function
> >>> > > \u2018VEC_probe_p*
> >> > find_probes_in_objfile(objfile*, const char*, const char*)\u2019:
> >>> > > ../../../binutils-gdb/gdb/probe.c:213:8: error: types may not be
> >>> > > defined in a
> >> > for-range-declaration [-Werror]
> >>> > > for (struct probe *probe : probes)
> >>> > > ^~~~~~
> >>> > >
> >>> > > Are you aware of it?
> >> >
> >> > Yes, it's a GCC bug:
> >> > https://sourceware.org/ml/gdb-patches/2017-09/msg00270.html
> >> >
> >> > What is your gcc version?
> >> >
> >> > I don't see this myself, but I know that Keith also ran into this
> >> > recently. If it's easy to work around it, I don't see why not.
> >> >
> >> > Does this work for you?
> >> >
> > It worked!
>
> Thanks, I'll push in a bit. I'm still curious to know your gcc version though.
Version is 6.3.1
>
> Actually, I'm confused on how it worked for you, since I hadn't fixed the
> same problem around line "213" quoted above.
>
Yes there were more, I fixed in the same way, full patch is here:

diff --git a/gdb/elfread.c b/gdb/elfread.c
index 436d9b5..8a12b56 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1340,8 +1340,8 @@ probe_key_free (bfd *abfd, void *d)
{
std::vector<probe *> *probes = (std::vector<probe *> *) d;

- for (struct probe *probe : *probes)
- probe->pops->destroy (probe);
+ for (probe *prob : *probes)
+ prob->pops->destroy (prob);

delete probes;
}
diff --git a/gdb/probe.c b/gdb/probe.c
index b3dbf89..487847c 100644
--- a/gdb/probe.c
+++ b/gdb/probe.c
@@ -65,23 +65,23 @@ parse_probes_in_pspace (const struct probe_ops *probe_ops,
const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);

- for (struct probe *probe : probes)
+ for (probe *pro : probes)
{
- if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
+ if (probe_ops != &probe_ops_any && pro->pops != probe_ops)
continue;

- if (provider && strcmp (probe->provider, provider) != 0)
+ if (provider && strcmp (pro->provider, provider) != 0)
continue;

- if (strcmp (probe->name, name) != 0)
+ if (strcmp (pro->name, name) != 0)
continue;

symtab_and_line sal;
- sal.pc = get_probe_address (probe, objfile);
+ sal.pc = get_probe_address (pro, objfile);
sal.explicit_pc = 1;
sal.section = find_pc_overlay (sal.pc);
sal.pspace = search_pspace;
- sal.probe = probe;
+ sal.probe = pro;
sal.objfile = objfile;

result->push_back (std::move (sal));
@@ -210,15 +210,15 @@ find_probes_in_objfile (struct objfile *objfile, const char *provider,

const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
- for (struct probe *probe : probes)
+ for (probe *prob : probes)
{
- if (strcmp (probe->provider, provider) != 0)
+ if (strcmp (prob->provider, provider) != 0)
continue;

- if (strcmp (probe->name, name) != 0)
+ if (strcmp (prob->name, name) != 0)
continue;

- VEC_safe_push (probe_p, result, probe);
+ VEC_safe_push (probe_p, result, prob);
}

return result;
@@ -244,11 +244,11 @@ find_probe_by_pc (CORE_ADDR pc)
/* If this proves too inefficient, we can replace with a hash. */
const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
- for (struct probe *probe : probes)
- if (get_probe_address (probe, objfile) == pc)
+ for (probe *prob : probes)
+ if (get_probe_address (prob, objfile) == pc)
{
result.objfile = objfile;
- result.probe = probe;
+ result.probe = prob;
return result;
}
}
@@ -294,20 +294,20 @@ collect_probes (const std::string &objname, const std::string &provider,
const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);

- for (struct probe *probe : probes)
+ for (probe *prob : probes)
{
- if (pops != NULL && probe->pops != pops)
+ if (pops != NULL && prob->pops != pops)
continue;

if (prov_pat
- && prov_pat->exec (probe->provider, 0, NULL, 0) != 0)
+ && prov_pat->exec (prob->provider, 0, NULL, 0) != 0)
continue;

if (probe_pat
- && probe_pat->exec (probe->name, 0, NULL, 0) != 0)
+ && probe_pat->exec (prob->name, 0, NULL, 0) != 0)
continue;

- result.emplace_back (probe, objfile);
+ result.emplace_back (prob, objfile);
}
}

> Are you sure you tested with the same compiler?
>
> Thanks,
> Pedro Alves