summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdtrace/common/dt_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_parser.c')
-rw-r--r--usr/src/lib/libdtrace/common/dt_parser.c23
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: