Print this page
7085 add support for "if" and "else" statements in dtrace
*** 25,34 ****
--- 25,38 ----
/*
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 Joyent, Inc. All rights reserved.
*/
+ /*
+ * Copyright (c) 2014 by Delphix. All rights reserved.
+ */
+
#ifndef _DT_PARSER_H
#define _DT_PARSER_H
#include <sys/types.h>
#include <sys/dtrace.h>
*** 103,112 ****
--- 107,122 ----
char *_name; /* string name of provider */
struct dt_provider *_pvp; /* provider references */
struct dt_node *_probes; /* list of probe nodes */
int _redecl; /* provider redeclared */
} _provider;
+
+ struct {
+ struct dt_node *_conditional;
+ struct dt_node *_body;
+ struct dt_node *_alternate_body;
+ } _conditional;
} dn_u;
struct dt_node *dn_list; /* parse tree list link */
struct dt_node *dn_link; /* allocation list link */
} dt_node_t;
*** 138,147 ****
--- 148,162 ----
#define dn_provname dn_u._provider._name /* DT_NODE_PROVIDER */
#define dn_provider dn_u._provider._pvp /* DT_NODE_PROVIDER */
#define dn_provred dn_u._provider._redecl /* DT_NODE_PROVIDER */
#define dn_probes dn_u._provider._probes /* DT_NODE_PROVIDER */
+ /* DT_NODE_IF: */
+ #define dn_conditional dn_u._conditional._conditional
+ #define dn_body dn_u._conditional._body
+ #define dn_alternate_body dn_u._conditional._alternate_body
+
#define DT_NODE_FREE 0 /* unused node (waiting to be freed) */
#define DT_NODE_INT 1 /* integer value */
#define DT_NODE_STRING 2 /* string value */
#define DT_NODE_IDENT 3 /* identifier */
#define DT_NODE_VAR 4 /* variable reference */
*** 160,169 ****
--- 175,185 ----
#define DT_NODE_MEMBER 17 /* member definition */
#define DT_NODE_XLATOR 18 /* translator definition */
#define DT_NODE_PROBE 19 /* probe definition */
#define DT_NODE_PROVIDER 20 /* provider definition */
#define DT_NODE_PROG 21 /* program translation unit */
+ #define DT_NODE_IF 22 /* if statement */
#define DT_NF_SIGNED 0x01 /* data is a signed quantity (else unsigned) */
#define DT_NF_COOKED 0x02 /* data is a known type (else still cooking) */
#define DT_NF_REF 0x04 /* pass by reference (array, struct, union) */
#define DT_NF_LVALUE 0x08 /* node is an l-value according to ANSI-C */
*** 211,220 ****
--- 227,237 ----
extern dt_node_t *dt_node_member(dt_decl_t *, char *, dt_node_t *);
extern dt_node_t *dt_node_xlator(dt_decl_t *, dt_decl_t *, char *, dt_node_t *);
extern dt_node_t *dt_node_probe(char *, int, dt_node_t *, dt_node_t *);
extern dt_node_t *dt_node_provider(char *, dt_node_t *);
extern dt_node_t *dt_node_program(dt_node_t *);
+ extern dt_node_t *dt_node_if(dt_node_t *, dt_node_t *, dt_node_t *);
extern dt_node_t *dt_node_link(dt_node_t *, dt_node_t *);
extern dt_node_t *dt_node_cook(dt_node_t *, uint_t);
extern dt_node_t *dt_node_xalloc(dtrace_hdl_t *, int);
*** 235,244 ****
--- 252,262 ----
extern void dt_node_promote(dt_node_t *, dt_node_t *, dt_node_t *);
extern void dt_node_diftype(dtrace_hdl_t *,
const dt_node_t *, dtrace_diftype_t *);
extern void dt_node_printr(dt_node_t *, FILE *, int);
+ extern void dt_printd(dt_node_t *, FILE *, int);
extern const char *dt_node_name(const dt_node_t *, char *, size_t);
extern int dt_node_root(dt_node_t *);
struct dtrace_typeinfo; /* see <dtrace.h> */
struct dt_pcb; /* see <dt_impl.h> */