212 return (-1);
213 }
214
215 reslen = (res != NULL) ? strlen(res) : 0;
216 reslen += prefixlen;
217 reslen += 1;
218
219 if (reslen > dmp->dm_len) {
220 mdb_free(dmp->dm_buf, dmp->dm_len);
221
222 dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
223 if (dmp->dm_buf == NULL) {
224 dmp->dm_len = 0;
225 mdb_warn("Unable to allocate memory for demangling");
226 return (-1);
227 }
228 dmp->dm_len = reslen;
229 }
230
231 if (prefixlen > 0)
232 (void) strlcpy(dmp->dm_buf, name, prefixlen);
233
234 if (res != NULL) {
235 (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
236 mdb_dem_free(res, strlen(res) + 1);
237 }
238
239 /*
240 * Save the position of the demangled string for mdb_dem_filter()
241 */
242 dmp->dm_dem = dmp->dm_buf + prefixlen;
243
244 return (0);
245 }
246
247 /* used by mdb_io.c:iob_addr2str */
248 const char *
249 mdb_dem_convert(mdb_demangler_t *dmp, const char *name)
250 {
251 if (mdb_dem_process(dmp, name) != 0 ||
252 strcmp(dmp->dm_buf, name) == 0)
310 }
311
312 if (flags & DCMD_ADDRSPEC)
313 dmp->dm_flags = ((uint_t)addr & MDB_DM_ALL);
314
315 for (i = 0; i < sizeof (dm_desc) / sizeof (dm_desc[0]); i++) {
316 mdb_printf("0x%x\t%s\t%s\n", 1 << i,
317 (dmp->dm_flags & (1 << i)) ? "on" : "off", dm_desc[i]);
318 }
319
320 return (DCMD_OK);
321 }
322
323 /*ARGSUSED*/
324 int
325 cmd_demstr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
326 {
327 if ((flags & DCMD_ADDRSPEC) || argc == 0)
328 return (DCMD_USAGE);
329
330 for (; argc != 0; argc--, argv++) {
331 mdb_printf("%s == %s\n", argv->a_un.a_str,
332 mdb_dem_convert(mdb.m_demangler, argv->a_un.a_str));
333 }
334
335 return (DCMD_OK);
336 }
|
212 return (-1);
213 }
214
215 reslen = (res != NULL) ? strlen(res) : 0;
216 reslen += prefixlen;
217 reslen += 1;
218
219 if (reslen > dmp->dm_len) {
220 mdb_free(dmp->dm_buf, dmp->dm_len);
221
222 dmp->dm_buf = mdb_zalloc(reslen, UM_SLEEP);
223 if (dmp->dm_buf == NULL) {
224 dmp->dm_len = 0;
225 mdb_warn("Unable to allocate memory for demangling");
226 return (-1);
227 }
228 dmp->dm_len = reslen;
229 }
230
231 if (prefixlen > 0)
232 (void) strlcpy(dmp->dm_buf, name, prefixlen + 1);
233 else
234 *dmp->dm_buf = '\0';
235
236 if (res != NULL) {
237 (void) strlcat(dmp->dm_buf, res, dmp->dm_len);
238 mdb_dem_free(res, strlen(res) + 1);
239 }
240
241 /*
242 * Save the position of the demangled string for mdb_dem_filter()
243 */
244 dmp->dm_dem = dmp->dm_buf + prefixlen;
245
246 return (0);
247 }
248
249 /* used by mdb_io.c:iob_addr2str */
250 const char *
251 mdb_dem_convert(mdb_demangler_t *dmp, const char *name)
252 {
253 if (mdb_dem_process(dmp, name) != 0 ||
254 strcmp(dmp->dm_buf, name) == 0)
312 }
313
314 if (flags & DCMD_ADDRSPEC)
315 dmp->dm_flags = ((uint_t)addr & MDB_DM_ALL);
316
317 for (i = 0; i < sizeof (dm_desc) / sizeof (dm_desc[0]); i++) {
318 mdb_printf("0x%x\t%s\t%s\n", 1 << i,
319 (dmp->dm_flags & (1 << i)) ? "on" : "off", dm_desc[i]);
320 }
321
322 return (DCMD_OK);
323 }
324
325 /*ARGSUSED*/
326 int
327 cmd_demstr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
328 {
329 if ((flags & DCMD_ADDRSPEC) || argc == 0)
330 return (DCMD_USAGE);
331
332 if (mdb.m_demangler == NULL && (mdb.m_demangler =
333 mdb_dem_load()) == NULL) {
334 mdb_warn("failed to load demangler");
335 return (DCMD_ERR);
336 }
337
338 for (; argc != 0; argc--, argv++) {
339 mdb_printf("%s == %s\n", argv->a_un.a_str,
340 mdb_dem_convert(mdb.m_demangler, argv->a_un.a_str));
341 }
342
343 return (DCMD_OK);
344 }
|