[PATCH] trace: print alloca pointers as actual pointer values
Kris Van Hees <[email protected]>
| Newsgroups | dev.linux.lists.dtrace |
|---|---|
| Message-ID | <SJ0PR10MB5672B1B0CFC6BA287D97C4C5C23AA@SJ0PR10MB5672.namprd10.prod.outlook.com> |
Because alloca pointers are stored internally as ofssets into the scratchmem area, they were printed as small integers. They are now printed as actual pointer values into kernel space. Signed-off-by: Kris Van Hees <[email protected]> --- libdtrace/dt_cg.c | 19 +++++++++-------- test/unittest/actions/trace/tst.alloca.d | 24 ++++++++++++++++++++++ test/unittest/actions/trace/tst.alloca.r | 1 + test/unittest/actions/trace/tst.alloca.r.p | 11 ++++++++++ 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 test/unittest/actions/trace/tst.alloca.d create mode 100644 test/unittest/actions/trace/tst.alloca.r create mode 100755 test/unittest/actions/trace/tst.alloca.r.p diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c index cd9e7f4e9..7af3dd44b 100644 --- a/libdtrace/dt_cg.c +++ b/libdtrace/dt_cg.c @@ -1687,16 +1687,17 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind, align = vtype.dtdt_align; /* - * A DEREF of a REF node does not get resolved in dt_cg_node() - * because the ref node already holds the pointer. But for - * alloca pointers, that will be the offset into scratchmem so - * we still need to turn it into a real pointer here. + * Alloca pointers are stored as an offset into scratchmem, so + * they need to be converted into real pointers before we go on. + * If the alloca pointer is a REF or ref-by-value is requested, + * we need to do bounds checking before turning the alloca + * pointer into a real pointer. */ - if (dnp->dn_kind == DT_NODE_OP1 && - dnp->dn_op == DT_TOK_DEREF && (dnp->dn_flags & DT_NF_REF) && - (dnp->dn_child->dn_flags & DT_NF_ALLOCA)) { - dt_cg_alloca_access_check(dlp, drp, dnp->dn_reg, - DT_ISIMM, size); + if (dnp->dn_flags & DT_NF_ALLOCA) { + if ((dnp->dn_flags & DT_NF_REF) || (arg & DT_NF_REF)) + dt_cg_alloca_access_check(dlp, drp, dnp->dn_reg, + DT_ISIMM, size); + dt_cg_alloca_ptr(dlp, drp, dnp->dn_reg, dnp->dn_reg); not_null = 1; } diff --git a/test/unittest/actions/trace/tst.alloca.d b/test/unittest/actions/trace/tst.alloca.d new file mode 100644 index 000000000..d2ff5152d --- /dev/null +++ b/test/unittest/actions/trace/tst.alloca.d @@ -0,0 +1,24 @@ +#pragma D option quiet + +BEGIN +{ + arr = (int *)alloca(5 * sizeof(int)); + idx = 4; + arr[0] = 1; + arr[1] = 22; + arr[2] = 333; + arr[3] = 4444; + arr[4] = 55555; + trace(arr); + trace(" "); + trace(*arr); + trace(" "); + trace(arr + 2); + trace(" "); + trace(*(arr + 2)); + trace(" "); + trace(arr + idx); + trace(" "); + trace(*(arr + idx)); + exit(0); +} diff --git a/test/unittest/actions/trace/tst.alloca.r b/test/unittest/actions/trace/tst.alloca.r new file mode 100644 index 000000000..e9bbf2f5d --- /dev/null +++ b/test/unittest/actions/trace/tst.alloca.r @@ -0,0 +1 @@ +OK 1 OK 333 OK 55555 diff --git a/test/unittest/actions/trace/tst.alloca.r.p b/test/unittest/actions/trace/tst.alloca.r.p new file mode 100755 index 000000000..8515861ad --- /dev/null +++ b/test/unittest/actions/trace/tst.alloca.r.p @@ -0,0 +1,11 @@ +#!/usr/bin/gawk -f + +{ + $1 = $1 > 0x7fffffff ? "OK" : "BAD"; + $3 = $3 > 0x7fffffff ? "OK" : "BAD"; + $5 = $5 > 0x7fffffff ? "OK" : "BAD"; +} + +{ + print; +} -- 2.45.2