aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/plugin/dump_plugin.c
blob: 12573d66af211cdfb71b4f75c5fff6fa4fedb7d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* Plugin for testing dumpfile.c.  */

#include "gcc-plugin.h"
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "tree.h"
#include "tree-pass.h"
#include "intl.h"
#include "plugin-version.h"
#include "diagnostic.h"
#include "context.h"
#include "optinfo.h"
#include "gimple.h"
#include "gimple-iterator.h"
#include "cgraph.h"

int plugin_is_GPL_compatible;

const pass_data pass_data_test_dumping =
{
  GIMPLE_PASS, /* type */
  "test_dumping", /* name */
  OPTGROUP_LOOP, /* optinfo_flags */
  TV_NONE, /* tv_id */
  PROP_ssa, /* properties_required */
  0, /* properties_provided */
  0, /* properties_destroyed */
  0, /* todo_flags_start */
  0, /* todo_flags_finish */
};

class pass_test_dumping : public gimple_opt_pass
{
public:
  pass_test_dumping (gcc::context *ctxt)
    : gimple_opt_pass (pass_data_test_dumping, ctxt)
  {}

  /* opt_pass methods: */
  bool gate (function *) { return true; }
  virtual unsigned int execute (function *);

}; // class pass_test_dumping

unsigned int
pass_test_dumping::execute (function *fun)
{
  basic_block bb;

  if (!dump_enabled_p ())
    return 0;

  FOR_ALL_BB_FN (bb, fun)
    for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
	 !gsi_end_p (gsi); gsi_next (&gsi))
      {
	gimple *stmt = gsi_stmt (gsi);
	gcall *call = dyn_cast <gcall *> (stmt);
	if (!call)
	  continue;
	tree callee_decl = gimple_call_fndecl (call);
	if (!callee_decl)
	  continue;
	tree callee_name = DECL_NAME (callee_decl);
	if (!callee_name)
	  continue;
	const char *callee = IDENTIFIER_POINTER (callee_name);

	/* Various dumping tests, done at callsites,
	   controlled by the callee name.  */
	if (strcmp (callee, "test_string_literal") == 0)
	  dump_printf_loc (MSG_NOTE, stmt, "test of dump for %qs\n",
			   callee);
	else if (strcmp (callee, "test_tree") == 0)
	  dump_printf_loc (MSG_NOTE, stmt, "test of tree: %T\n",
			   integer_zero_node);
	else if (strcmp (callee, "test_gimple") == 0)
	  dump_printf_loc (MSG_NOTE, stmt, "test of gimple: %G", stmt);
	else if (strcmp (callee, "test_cgraph_node") == 0)
	  {
	    dump_printf_loc (MSG_NOTE, stmt, "test of callgraph node: ");
	    dump_symtab_node (MSG_NOTE, cgraph_node::get (callee_decl));
	    dump_printf (MSG_NOTE, "\n");
	  }
	else if (strcmp (callee, "test_wide_int") == 0)
	  {
	    HOST_WIDE_INT val = 0;
	    dump_printf_loc (MSG_NOTE, stmt,
			     "test of wide int: " HOST_WIDE_INT_PRINT_DEC "\n",
			     val);
	  }
	else if (strcmp (callee, "test_poly_int") == 0)
	  {
	    dump_printf_loc (MSG_NOTE, stmt, "test of poly int: ");
	    dump_dec (MSG_NOTE, poly_int64 (42));
	    dump_printf (MSG_NOTE, "\n");
	  }
	else if (strcmp (callee, "test_scopes") == 0)
	  {
	    AUTO_DUMP_SCOPE ("outer scope", stmt);
	    {
	      dump_printf_loc (MSG_NOTE, stmt, "at outer scope\n");
	      AUTO_DUMP_SCOPE ("middle scope", stmt);
	      {
		dump_printf_loc (MSG_NOTE, stmt, "at middle scope\n");
		AUTO_DUMP_SCOPE ("innermost scope", stmt);
		dump_printf_loc (MSG_NOTE, stmt, "at innermost scope\n");
	      }
	    }
	  }
      }

  return 0;
}

static gimple_opt_pass *
make_pass_test_dumping (gcc::context *ctxt)
{
  return new pass_test_dumping (ctxt);
}

int
plugin_init (struct plugin_name_args *plugin_info,
	     struct plugin_gcc_version *version)
{
  struct register_pass_info pass_info;
  const char *plugin_name = plugin_info->base_name;
  int argc = plugin_info->argc;
  struct plugin_argument *argv = plugin_info->argv;

  if (!plugin_default_version_check (version, &gcc_version))
    return 1;

  pass_info.pass = make_pass_test_dumping (g);
  pass_info.reference_pass_name = "ssa";
  pass_info.ref_pass_instance_number = 1;
  pass_info.pos_op = PASS_POS_INSERT_AFTER;
  register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL,
		     &pass_info);

  return 0;
}