diff options
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_parser.c')
-rw-r--r-- | usr/src/lib/libdtrace/common/dt_parser.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_parser.c b/usr/src/lib/libdtrace/common/dt_parser.c index e55907615e..4cf93888cc 100644 --- a/usr/src/lib/libdtrace/common/dt_parser.c +++ b/usr/src/lib/libdtrace/common/dt_parser.c @@ -916,6 +916,20 @@ dt_node_is_stack(const dt_node_t *dnp) } int +dt_node_is_symaddr(const dt_node_t *dnp) +{ + return (dnp->dn_ctfp == DT_SYMADDR_CTFP(yypcb->pcb_hdl) && + dnp->dn_type == DT_SYMADDR_TYPE(yypcb->pcb_hdl)); +} + +int +dt_node_is_usymaddr(const dt_node_t *dnp) +{ + return (dnp->dn_ctfp == DT_USYMADDR_CTFP(yypcb->pcb_hdl) && + dnp->dn_type == DT_USYMADDR_TYPE(yypcb->pcb_hdl)); +} + +int dt_node_is_strcompat(const dt_node_t *dnp) { ctf_file_t *fp = dnp->dn_ctfp; @@ -971,6 +985,9 @@ dt_node_is_void(const dt_node_t *dnp) if (dt_node_is_stack(dnp)) return (0); + if (dt_node_is_symaddr(dnp) || dt_node_is_usymaddr(dnp)) + return (0); + type = ctf_type_resolve(fp, dnp->dn_type); return (ctf_type_kind(fp, type) == CTF_K_INTEGER && @@ -1107,6 +1124,12 @@ dt_node_is_argcompat(const dt_node_t *lp, const dt_node_t *rp) if (dt_node_is_stack(lp) && dt_node_is_stack(rp)) return (1); /* stack types are compatible */ + if (dt_node_is_symaddr(lp) && dt_node_is_symaddr(rp)) + return (1); /* symaddr types are compatible */ + + if (dt_node_is_usymaddr(lp) && dt_node_is_usymaddr(rp)) + return (1); /* usymaddr types are compatible */ + switch (ctf_type_kind(lfp, ctf_type_resolve(lfp, lp->dn_type))) { case CTF_K_FUNCTION: case CTF_K_STRUCT: |