On Fri 2016-09-30 09:32 -0400, Dave Anderson wrote:
Fair enough -- but let's avoid the heavy-handed call to
expr_type_name()
unless the argument is actually a cpuspec:
--- crash-7.1.5/symbols.c.orig 2016-09-30 09:21:15.577896529 -0400
+++ crash-7.1.5/symbols.c 2016-09-30 09:16:53.676652458 -0400
@@ -81,6 +81,7 @@ static void cmd_datatype_common(ulong);
static void do_datatype_addr(struct datatype_member *, ulong, int,
ulong, char **, int);
static void process_gdb_output(char *, unsigned, const char *, int);
+static char *expr_type_name(const char *);
static int display_per_cpu_info(struct syment *, int, char *);
static struct load_module *get_module_percpu_sym_owner(struct syment *);
static int is_percpu_symbol(struct syment *);
@@ -6112,6 +6113,7 @@ cmd_datatype_common(ulong flags)
char *separator;
char *structname, *members;
char *memberlist[MAXARGS];
+ char *typename;
dm = &datatype_member;
count = 0xdeadbeef;
@@ -6245,6 +6247,15 @@ cmd_datatype_common(ulong flags)
sp->name);
cpuspec = NULL;
}
+ if (cpuspec) {
+ if ((typename = expr_type_name(sp->name))) {
+ if (LASTCHAR(typename) == '*')
+ error(WARNING,
+ "percpu symbol %s is of type pointer\n",
+ sp->name);
+ FREEBUF(typename);
+ }
+ }
addr = sp->value;
aflag++;
} else {
Ack
--
Aaron Tomlin