diff options
Diffstat (limited to 'usr/src/lib/libdtrace/common/dt_program.c')
-rw-r--r-- | usr/src/lib/libdtrace/common/dt_program.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/usr/src/lib/libdtrace/common/dt_program.c b/usr/src/lib/libdtrace/common/dt_program.c index d751c4817b..8497dab01e 100644 --- a/usr/src/lib/libdtrace/common/dt_program.c +++ b/usr/src/lib/libdtrace/common/dt_program.c @@ -355,9 +355,9 @@ typedef struct dt_header_info { FILE *dthi_out; /* output file */ char *dthi_pmname; /* provider macro name */ char *dthi_pfname; /* provider function name */ + int dthi_empty; /* should we generate empty macros */ } dt_header_info_t; - static void dt_header_fmt_macro(char *buf, const char *str) { @@ -472,32 +472,40 @@ dt_header_probe(dt_idhash_t *dhp, dt_ident_t *idp, void *data) return (dt_set_errno(dtp, errno)); } - if (fprintf(infop->dthi_out, ") \\\n\t") < 0) - return (dt_set_errno(dtp, errno)); - - if (fprintf(infop->dthi_out, "__dtrace_%s___%s(", - infop->dthi_pfname, fname) < 0) - return (dt_set_errno(dtp, errno)); - - for (i = 0; i < prp->pr_nargc; i++) { - if (fprintf(infop->dthi_out, "arg%d", i) < 0) + if (!infop->dthi_empty) { + if (fprintf(infop->dthi_out, ") \\\n\t") < 0) return (dt_set_errno(dtp, errno)); - if (i + 1 != prp->pr_nargc && - fprintf(infop->dthi_out, ", ") < 0) + if (fprintf(infop->dthi_out, "__dtrace_%s___%s(", + infop->dthi_pfname, fname) < 0) return (dt_set_errno(dtp, errno)); + + for (i = 0; i < prp->pr_nargc; i++) { + if (fprintf(infop->dthi_out, "arg%d", i) < 0) + return (dt_set_errno(dtp, errno)); + + if (i + 1 != prp->pr_nargc && + fprintf(infop->dthi_out, ", ") < 0) + return (dt_set_errno(dtp, errno)); + } } if (fprintf(infop->dthi_out, ")\n") < 0) return (dt_set_errno(dtp, errno)); - if (fprintf(infop->dthi_out, "#define\t%s_%s_ENABLED() \\\n", - infop->dthi_pmname, mname) < 0) - return (dt_set_errno(dtp, errno)); + if (!infop->dthi_empty) { + if (fprintf(infop->dthi_out, "#define\t%s_%s_ENABLED() \\\n", + infop->dthi_pmname, mname) < 0) + return (dt_set_errno(dtp, errno)); - if (fprintf(infop->dthi_out, "\t__dtraceenabled_%s___%s()\n", - infop->dthi_pfname, fname) < 0) - return (dt_set_errno(dtp, errno)); + if (fprintf(infop->dthi_out, "\t__dtraceenabled_%s___%s()\n", + infop->dthi_pfname, fname) < 0) + return (dt_set_errno(dtp, errno)); + } else { + if (fprintf(infop->dthi_out, "#define\t%s_%s_ENABLED() (0)\n", + infop->dthi_pmname, mname) < 0) + return (dt_set_errno(dtp, errno)); + } return (0); } @@ -512,12 +520,17 @@ dt_header_provider(dtrace_hdl_t *dtp, dt_provider_t *pvp, FILE *out) if (pvp->pv_flags & DT_PROVIDER_IMPL) return (0); + /* + * Count the instances of the '-' character since we'll need to double + * those up. + */ p = pvp->pv_desc.dtvd_name; for (i = 0; (p = strchr(p, '-')) != NULL; i++) p++; info.dthi_dtp = dtp; info.dthi_out = out; + info.dthi_empty = 0; info.dthi_pmname = alloca(strlen(pvp->pv_desc.dtvd_name) + 1); dt_header_fmt_macro(info.dthi_pmname, pvp->pv_desc.dtvd_name); @@ -525,6 +538,8 @@ dt_header_provider(dtrace_hdl_t *dtp, dt_provider_t *pvp, FILE *out) info.dthi_pfname = alloca(strlen(pvp->pv_desc.dtvd_name) + 1 + i); dt_header_fmt_func(info.dthi_pfname, pvp->pv_desc.dtvd_name); + if (fprintf(out, "#if _DTRACE_VERSION\n\n") < 0) + return (dt_set_errno(dtp, errno)); if (dt_idhash_iter(pvp->pv_probes, dt_header_probe, &info) != 0) return (-1); /* dt_errno is set for us */ @@ -533,6 +548,17 @@ dt_header_provider(dtrace_hdl_t *dtp, dt_provider_t *pvp, FILE *out) if (dt_idhash_iter(pvp->pv_probes, dt_header_decl, &info) != 0) return (-1); /* dt_errno is set for us */ + if (fprintf(out, "\n#else\n\n") < 0) + return (dt_set_errno(dtp, errno)); + + info.dthi_empty = 1; + + if (dt_idhash_iter(pvp->pv_probes, dt_header_probe, &info) != 0) + return (-1); /* dt_errno is set for us */ + + if (fprintf(out, "\n#endif\n\n") < 0) + return (dt_set_errno(dtp, errno)); + return (0); } @@ -553,6 +579,9 @@ dtrace_program_header(dtrace_hdl_t *dtp, FILE *out, const char *fname) return (dt_set_errno(dtp, errno)); } + if (fprintf(out, "#include <unistd.h>\n\n") < 0) + return (-1); + if (fprintf(out, "#ifdef\t__cplusplus\nextern \"C\" {\n#endif\n\n") < 0) return (-1); |