On Mon 2016-04-18 11:22 -0400, Dave Anderson wrote:
Hi Dave,
I may be missing something, but it seems like you just need it to
calculate
cpuaddr each time through the loop, and then you're done with it. But then
you rewind() it, store it, and keep tmpfp open across the do_datatype_addr()
call? What am I missing?
sure -- but I'd prefer to avoid the use of tmpfile()/fclose() in the foor loop.
Albeit since we set OPEN_ONLY_ONCE, the following should be fine:
@@ -6138,6 +6172,8 @@ cmd_datatype_common(ulong flags)
}
if (cpuspec) {
+ typename = expr_type_name(sp->name);
+ ptype = typename && LASTCHAR(typename) == '*' ? 1 : 0;
cpus = get_cpumask_buf();
if (STREQ(cpuspec, ""))
SET_BIT(cpus, CURRENT_CONTEXT()->processor);
@@ -6227,7 +6263,20 @@ cmd_datatype_common(ulong flags)
continue;
}
+ if (ptype) {
+ open_tmpfile();
+ snprintf(buf, sizeof buf, "p *(%s*) 0x%lx",
+ typename, cpuaddr);
+ gdb_pass_through(buf, pc->tmpfile, GNU_RETURN_ON_ERROR);
+
+ rewind(pc->tmpfile);
+ fgets(buf, BUFSIZE, pc->tmpfile);
+ parse_line(buf, argv);
+ cpuaddr = htol(argv[3], FAULT_ON_ERROR, NULL);
+ close_tmpfile();
+ }
fprintf(fp, "%lx\n", cpuaddr);
+
do_datatype_addr(dm, cpuaddr , count,
flags, memberlist, argc_members);
}
@@ -6245,6 +6294,9 @@ freebuf:
if (cpus)
FREEBUF(cpus);
+
+ if (typename)
+ FREEBUF(typename);
}
static void
--
Aaron Tomlin