hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
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
144
145
146
147
148
149
150
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".
 
(a) The FSF's Front-Cover Text is:
 
A GNU Manual
 
(b) The FSF's Back-Cover Text is:
 
You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Compiler Collection (GCC) Internals: Plugins attr</title>
 
<meta name="description" content="GNU Compiler Collection (GCC) Internals: Plugins attr">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Plugins attr">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Plugins.html#Plugins" rel="up" title="Plugins">
<link href="Plugins-recording.html#Plugins-recording" rel="next" title="Plugins recording">
<link href="Plugins-description.html#Plugins-description" rel="prev" title="Plugins description">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Plugins-attr"></a>
<div class="header">
<p>
Next: <a href="Plugins-recording.html#Plugins-recording" accesskey="n" rel="next">Plugins recording</a>, Previous: <a href="Plugins-description.html#Plugins-description" accesskey="p" rel="prev">Plugins description</a>, Up: <a href="Plugins.html#Plugins" accesskey="u" rel="up">Plugins</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Registering-custom-attributes-or-pragmas"></a>
<h3 class="section">23.6 Registering custom attributes or pragmas</h3>
 
<p>For analysis (or other) purposes it is useful to be able to add custom
attributes or pragmas.
</p>
<p>The <code>PLUGIN_ATTRIBUTES</code> callback is called during attribute
registration. Use the <code>register_attribute</code> function to register
custom attributes.
</p>
<div class="smallexample">
<pre class="smallexample">/* Attribute handler callback */
static tree
handle_user_attribute (tree *node, tree name, tree args,
                       int flags, bool *no_add_attrs)
{
  return NULL_TREE;
}
 
/* Attribute definition */
static struct attribute_spec user_attr =
  { &quot;user&quot;, 1, 1, false,  false, false, handle_user_attribute, false };
 
/* Plugin callback called during attribute registration.
Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL)
*/
static void
register_attributes (void *event_data, void *data)
{
  warning (0, G_(&quot;Callback to register attributes&quot;));
  register_attribute (&amp;user_attr);
}
 
</pre></div>
 
 
<p>The <i>PLUGIN_PRAGMAS</i> callback is called once during pragmas
registration. Use the <code>c_register_pragma</code>,
<code>c_register_pragma_with_data</code>,
<code>c_register_pragma_with_expansion</code>,
<code>c_register_pragma_with_expansion_and_data</code> functions to register
custom pragmas and their handlers (which often want to call
<code>pragma_lex</code>) from <samp>c-family/c-pragma.h</samp>.
</p>
<div class="smallexample">
<pre class="smallexample">/* Plugin callback called during pragmas registration. Registered with
     register_callback (plugin_name, PLUGIN_PRAGMAS,
                        register_my_pragma, NULL);
*/
static void
register_my_pragma (void *event_data, void *data)
{
  warning (0, G_(&quot;Callback to register pragmas&quot;));
  c_register_pragma (&quot;GCCPLUGIN&quot;, &quot;sayhello&quot;, handle_pragma_sayhello);
}
</pre></div>
 
<p>It is suggested to pass <code>&quot;GCCPLUGIN&quot;</code> (or a short name identifying
your plugin) as the &ldquo;space&rdquo; argument of your pragma.
</p>
<p>Pragmas registered with <code>c_register_pragma_with_expansion</code> or
<code>c_register_pragma_with_expansion_and_data</code> support
preprocessor expansions. For example:
</p>
<div class="smallexample">
<pre class="smallexample">#define NUMBER 10
#pragma GCCPLUGIN foothreshold (NUMBER)
</pre></div>
 
 
 
 
</body>
</html>