Print this page
patch mdb-enums

*** 2558,2576 **** if (mdb_ctf_type_resolve(id, &base) == -1) { mdb_warn("could not resolve type"); return (DCMD_ABORT); } ! if (mdb_ctf_type_kind(base) != CTF_K_INTEGER) { ! mdb_warn("expected integer type\n"); ! return (DCMD_ABORT); ! } ! if (mdb_ctf_type_encoding(base, &e) != 0) { mdb_warn("could not get type encoding"); return (DCMD_ABORT); } if (sign) sign = e.cte_format & CTF_INT_SIGNED; size = e.cte_bits / NBBY; --- 2558,2583 ---- if (mdb_ctf_type_resolve(id, &base) == -1) { mdb_warn("could not resolve type"); return (DCMD_ABORT); } ! switch (mdb_ctf_type_kind(base)) { ! case CTF_K_ENUM: ! e.cte_format = CTF_INT_SIGNED; ! e.cte_offset = 0; ! e.cte_bits = sizeof(int) * NBBY; /* XXX: get size from CTF? */ ! break; ! case CTF_K_INTEGER: if (mdb_ctf_type_encoding(base, &e) != 0) { mdb_warn("could not get type encoding"); return (DCMD_ABORT); } + break; + default: + mdb_warn("expected integer type\n"); + return (DCMD_ABORT); + } if (sign) sign = e.cte_format & CTF_INT_SIGNED; size = e.cte_bits / NBBY;
*** 2751,2760 **** --- 2758,2786 ---- mdb_printf(fmt, buf); return (0); } + if (mdb_ctf_type_kind(base) == CTF_K_ENUM) { + const char *strval; + int value; + + if (mdb_vread(&value, sizeof (value), addr) == -1) { + mdb_warn("failed to read pointer at %llx", addr); + return (DCMD_ERR); + } + + if ((strval = mdb_ctf_enum_name(id, value))) { + mdb_printf(fmt, strval); + } else { + mdb_snprintf(buf, sizeof (buf), "<%d>", value); + mdb_printf(fmt, buf); + } + + return (DCMD_OK); + } + if (mdb_ctf_type_kind(base) != CTF_K_ARRAY) { mdb_warn("exepected pointer or array type\n"); return (DCMD_ABORT); }