#include <stdio.h>
#include <stdlib.h>
-
-#ifdef HAVE_STRING_H
-# include <string.h>
-#endif
+#include <string.h>
#include "irouts.h"
#include "irdump.h"
#include "hashptr.h"
#include "firmstat_t.h"
+#include "irpass_t.h"
#include "pattern.h"
#include "dags.h"
#include "stat_dmp.h"
if (elem)
return elem;
- elem = obstack_alloc(&status->cnts, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(&status->cnts, node_entry_t);
/* clear counter */
opcode_clear_entry(elem);
} /* if */
/* allocate a new one */
- elem = obstack_alloc(&status->cnts, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(&status->cnts, graph_entry_t);
obstack_init(&elem->recalc_cnts);
/* clear counter */
if (elem)
return elem;
- elem = obstack_alloc(&status->cnts, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(&status->cnts, opt_entry_t);
/* clear new counter */
opt_clear_entry(elem);
if (elem)
return elem;
- elem = obstack_alloc(obst, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(obst, block_entry_t);
/* clear new counter */
block_clear_entry(elem);
if (elem)
return elem;
- elem = obstack_alloc(obst, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(obst, be_block_entry_t);
/* clear new counter */
be_block_clear_entry(elem);
if (elem)
return elem;
- elem = obstack_alloc(obst, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(obst, perm_class_entry_t);
/* clear new counter */
perm_class_clear_entry(elem);
if (elem)
return elem;
- elem = obstack_alloc(obst, sizeof(*elem));
- memset(elem, 0, sizeof(*elem));
+ elem = OALLOCZ(obst, perm_stat_entry_t);
/* clear new counter */
perm_stat_clear_entry(elem);
reg_pressure_entry_t *rp_ent;
block_ent = be_block_get_entry(&status->be_data, get_irn_node_nr(block), graph->be_block_hash);
- rp_ent = obstack_alloc(&status->be_data, sizeof(*rp_ent));
- memset(rp_ent, 0, sizeof(*rp_ent));
+ rp_ent = OALLOCZ(&status->be_data, reg_pressure_entry_t);
rp_ent->class_name = class_name;
rp_ent->pressure = pressure;
fname[0] = '\0';
p = name;
} /* if */
- strncat(fname, "firmstat-", sizeof(fname));
- strncat(fname, phase, sizeof(fname));
- strncat(fname, "-", sizeof(fname));
- strncat(fname, p, sizeof(fname));
+ strncat(fname, "firmstat-", sizeof(fname)-1);
+ strncat(fname, phase, sizeof(fname)-1);
+ strncat(fname, "-", sizeof(fname)-1);
+ strncat(fname, p, sizeof(fname)-1);
stat_dump_init(fname);
STAT_LEAVE;
} /* stat_dump_snapshot */
+struct pass_t {
+ ir_prog_pass_t pass;
+ const char *fname;
+ const char *phase;
+};
+
+/**
+ * Wrapper to run stat_dump_snapshot() as a ir_prog wrapper.
+ */
+static int stat_dump_snapshot_wrapper(ir_prog *irp, void *context) {
+ struct pass_t *pass = context;
+
+ (void)irp;
+ stat_dump_snapshot(pass->fname, pass->phase);
+ return 0;
+} /* stat_dump_snapshot_wrapper */
+
+/**
+ * Ensure that no verifier is run from the wrapper.
+ */
+static int no_verify(ir_prog *prog, void *ctx)
+{
+ (void)prog;
+ (void)ctx;
+ return 0;
+}
+
+/**
+ * Ensure that no dumper is run from the wrapper.
+ */
+static void no_dump(ir_prog *prog, void *ctx, unsigned idx)
+{
+ (void)prog;
+ (void)ctx;
+ (void)idx;
+}
+
+/* create an ir_pog pass */
+ir_prog_pass_t *stat_dump_snapshot_pass(
+ const char *name, const char *fname, const char *phase) {
+ struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+ def_prog_pass_constructor(
+ &pass->pass, name ? name : "stat_snapshot", stat_dump_snapshot_wrapper);
+ pass->fname = fname;
+ pass->phase = phase;
+
+ /* no dump/verify */
+ pass->pass.dump_irprog = no_dump;
+ pass->pass.verify_irprog = no_verify;
+
+ return &pass->pass;
+} /* stat_dump_snapshot_pass */
+
/** the hook entries for the Firm statistics module */
static hook_entry_t stat_hooks[hook_last];