blob: 92e41fb5877fe8b449020b3cd23a55ac7794ec25 [file] [log] [blame]
Sean Silvabf9b4cd2012-12-13 01:10:461=============
2Clang Plugins
3=============
4
Dmitri Gribenko7ac0cc32012-12-15 21:10:515Clang Plugins make it possible to run extra user defined actions during a
6compilation. This document will provide a basic walkthrough of how to write and
7run a Clang Plugin.
Sean Silvabf9b4cd2012-12-13 01:10:468
9Introduction
10============
11
12Clang Plugins run FrontendActions over code. See the :doc:`FrontendAction
Dmitri Gribenko7ac0cc32012-12-15 21:10:5113tutorial <RAVFrontendAction>` on how to write a ``FrontendAction`` using the
14``RecursiveASTVisitor``. In this tutorial, we'll demonstrate how to write a
15simple clang plugin.
Sean Silvabf9b4cd2012-12-13 01:10:4616
Dmitri Gribenko7ac0cc32012-12-15 21:10:5117Writing a ``PluginASTAction``
18=============================
Sean Silvabf9b4cd2012-12-13 01:10:4619
Dmitri Gribenko7ac0cc32012-12-15 21:10:5120The main difference from writing normal ``FrontendActions`` is that you can
21handle plugin command line options. The ``PluginASTAction`` base class declares
22a ``ParseArgs`` method which you have to implement in your plugin.
Sean Silvabf9b4cd2012-12-13 01:10:4623
Dmitri Gribenko7ac0cc32012-12-15 21:10:5124.. code-block:: c++
Sean Silvabf9b4cd2012-12-13 01:10:4625
Dmitri Gribenko7ac0cc32012-12-15 21:10:5126 bool ParseArgs(const CompilerInstance &CI,
27 const std::vector<std::string>& args) {
28 for (unsigned i = 0, e = args.size(); i != e; ++i) {
29 if (args[i] == "-some-arg") {
30 // Handle the command line argument.
Sean Silvabf9b4cd2012-12-13 01:10:4631 }
Dmitri Gribenko7ac0cc32012-12-15 21:10:5132 }
33 return true;
34 }
Sean Silvabf9b4cd2012-12-13 01:10:4635
36Registering a plugin
37====================
38
39A plugin is loaded from a dynamic library at runtime by the compiler. To
NAKAMURA Takumid8cd0602016-02-11 16:33:2040register a plugin in a library, use ``FrontendPluginRegistry::Add<>``:
Sean Silvabf9b4cd2012-12-13 01:10:4641
Dmitri Gribenko7ac0cc32012-12-15 21:10:5142.. code-block:: c++
Sean Silvabf9b4cd2012-12-13 01:10:4643
Dmitri Gribenko7ac0cc32012-12-15 21:10:5144 static FrontendPluginRegistry::Add<MyPlugin> X("my-plugin-name", "my plugin description");
Sean Silvabf9b4cd2012-12-13 01:10:4645
John Brawn8e62db32016-04-04 14:22:5846Defining pragmas
47================
48
49Plugins can also define pragmas by declaring a ``PragmaHandler`` and
50registering it using ``PragmaHandlerRegistry::Add<>``:
51
52.. code-block:: c++
53
54 // Define a pragma handler for #pragma example_pragma
55 class ExamplePragmaHandler : public PragmaHandler {
56 public:
57 ExamplePragmaHandler() : PragmaHandler("example_pragma") { }
Joel E. Dennyddde0ec2019-05-21 23:51:3858 void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
John Brawn8e62db32016-04-04 14:22:5859 Token &PragmaTok) {
60 // Handle the pragma
61 }
62 };
63
64 static PragmaHandlerRegistry::Add<ExamplePragmaHandler> Y("example_pragma","example pragma description");
65
John Brawnfa0320d2020-02-28 14:51:3066Defining attributes
67===================
68
69Plugins can define attributes by declaring a ``ParsedAttrInfo`` and registering
70it using ``ParsedAttrInfoRegister::Add<>``:
71
72.. code-block:: c++
73
74 class ExampleAttrInfo : public ParsedAttrInfo {
75 public:
76 ExampleAttrInfo() {
77 Spellings.push_back({ParsedAttr::AS_GNU,"example"});
78 }
79 AttrHandling handleDeclAttribute(Sema &S, Decl *D,
80 const ParsedAttr &Attr) const override {
81 // Handle the attribute
82 return AttributeApplied;
83 }
84 };
85
86 static ParsedAttrInfoRegistry::Add<ExampleAttrInfo> Z("example_attr","example attribute description");
87
88The members of ``ParsedAttrInfo`` that a plugin attribute must define are:
89
90 * ``Spellings``, which must be populated with every `Spelling
91 </doxygen/structclang_1_1ParsedAttrInfo_1_1Spelling.html>`_ of the
92 attribute, each of which consists of an attribute syntax and how the
93 attribute name is spelled for that syntax. If the syntax allows a scope then
94 the spelling must be "scope::attr" if a scope is present or "::attr" if not.
John Brawnfa0320d2020-02-28 14:51:3095
96The members of ``ParsedAttrInfo`` that may need to be defined, depending on the
97attribute, are:
98
99 * ``NumArgs`` and ``OptArgs``, which set the number of required and optional
100 arguments to the attribute.
101 * ``diagAppertainsToDecl``, which checks if the attribute has been used on the
102 right kind of declaration and issues a diagnostic if not.
Eric Astor9a97a572024-10-11 21:28:44103 * ``handleDeclAttribute``, which is the function that applies the attribute to
104 a declaration. It is responsible for checking that the attribute's arguments
105 are valid, and typically applies the attribute by adding an ``Attr`` to the
106 ``Decl``. It returns either ``AttributeApplied``, to indicate that the
107 attribute was successfully applied, or ``AttributeNotApplied`` if it wasn't.
108 * ``diagAppertainsToStmt``, which checks if the attribute has been used on the
109 right kind of statement and issues a diagnostic if not.
110 * ``handleStmtAttribute``, which is the function that applies the attribute to
111 a statement. It is responsible for checking that the attribute's arguments
112 are valid, and typically applies the attribute by adding an ``Attr`` to the
113 ``Stmt``. It returns either ``AttributeApplied``, to indicate that the
114 attribute was successfully applied, or ``AttributeNotApplied`` if it wasn't.
John Brawnfa0320d2020-02-28 14:51:30115 * ``diagLangOpts``, which checks if the attribute is permitted for the current
116 language mode and issues a diagnostic if not.
117 * ``existsInTarget``, which checks if the attribute is permitted for the given
118 target.
119
John Brawn3f03c122020-03-25 13:49:02120To see a working example of an attribute plugin, see `the Attribute.cpp example
xgupta94fac812021-02-01 07:24:21121<https://github.com/llvm/llvm-project/blob/main/clang/examples/Attribute/Attribute.cpp>`_.
John Brawn3f03c122020-03-25 13:49:02122
Sean Silvabf9b4cd2012-12-13 01:10:46123Putting it all together
124=======================
125
Dmitri Gribenko7ac0cc32012-12-15 21:10:51126Let's look at an example plugin that prints top-level function names. This
Alp Toker4af8fa92014-01-26 05:08:07127example is checked into the clang repository; please take a look at
128the `latest version of PrintFunctionNames.cpp
xgupta94fac812021-02-01 07:24:21129<https://github.com/llvm/llvm-project/blob/main/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp>`_.
Sean Silvabf9b4cd2012-12-13 01:10:46130
Sean Silvabf9b4cd2012-12-13 01:10:46131Running the plugin
132==================
133
John Brawn6c789742016-03-15 12:51:40134
Timm Bäder3e67cf22021-11-04 16:40:51135Using the compiler driver
136--------------------------
137
138The Clang driver accepts the `-fplugin` option to load a plugin.
139Clang plugins can receive arguments from the compiler driver command
140line via the `fplugin-arg-<plugin name>-<argument>` option. Using this
141method, the plugin name cannot contain dashes itself, but the argument
142passed to the plugin can.
143
144
145.. code-block:: console
146
147 $ export BD=/path/to/build/directory
148 $ make -C $BD CallSuperAttr
149 $ clang++ -fplugin=$BD/lib/CallSuperAttr.so \
150 -fplugin-arg-call_super_plugin-help \
151 test.cpp
152
153If your plugin name contains dashes, either rename the plugin or used the
154cc1 command line options listed below.
155
156
John Brawn6c789742016-03-15 12:51:40157Using the cc1 command line
158--------------------------
159
Dmitri Gribenko7ac0cc32012-12-15 21:10:51160To run a plugin, the dynamic library containing the plugin registry must be
Aaron Ballman34be2a02016-07-14 14:07:37161loaded via the `-load` command line option. This will load all plugins
Dmitri Gribenko7ac0cc32012-12-15 21:10:51162that are registered, and you can select the plugins to run by specifying the
Aaron Ballman34be2a02016-07-14 14:07:37163`-plugin` option. Additional parameters for the plugins can be passed with
164`-plugin-arg-<plugin-name>`.
Sean Silvabf9b4cd2012-12-13 01:10:46165
166Note that those options must reach clang's cc1 process. There are two
167ways to do so:
168
Aaron Ballman34be2a02016-07-14 14:07:37169* Directly call the parsing process by using the `-cc1` option; this
Dmitri Gribenko7ac0cc32012-12-15 21:10:51170 has the downside of not configuring the default header search paths, so
171 you'll need to specify the full system path configuration on the command
172 line.
173* Use clang as usual, but prefix all arguments to the cc1 process with
Aaron Ballman34be2a02016-07-14 14:07:37174 `-Xclang`.
Sean Silvabf9b4cd2012-12-13 01:10:46175
Dmitri Gribenko7ac0cc32012-12-15 21:10:51176For example, to run the ``print-function-names`` plugin over a source file in
177clang, first build the plugin, and then call clang with the plugin from the
178source tree:
Sean Silvabf9b4cd2012-12-13 01:10:46179
Dmitri Gribenko7ac0cc32012-12-15 21:10:51180.. code-block:: console
Sean Silvabf9b4cd2012-12-13 01:10:46181
Dmitri Gribenko7ac0cc32012-12-15 21:10:51182 $ export BD=/path/to/build/directory
183 $ (cd $BD && make PrintFunctionNames )
184 $ clang++ -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS \
Sean Silvabf9b4cd2012-12-13 01:10:46185 -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE \
186 -I$BD/tools/clang/include -Itools/clang/include -I$BD/include -Iinclude \
187 tools/clang/tools/clang-check/ClangCheck.cpp -fsyntax-only \
188 -Xclang -load -Xclang $BD/lib/PrintFunctionNames.so -Xclang \
189 -plugin -Xclang print-fns
190
191Also see the print-function-name plugin example's
xgupta94fac812021-02-01 07:24:21192`README <https://github.com/llvm/llvm-project/blob/main/clang/examples/PrintFunctionNames/README.txt>`_
Dmitri Gribenko7ac0cc32012-12-15 21:10:51193
John Brawn6c789742016-03-15 12:51:40194
195Using the clang command line
196----------------------------
197
Aaron Ballman34be2a02016-07-14 14:07:37198Using `-fplugin=plugin` on the clang command line passes the plugin
199through as an argument to `-load` on the cc1 command line. If the plugin
John Brawn6c789742016-03-15 12:51:40200class implements the ``getActionType`` method then the plugin is run
201automatically. For example, to run the plugin automatically after the main AST
Aaron Ballman34be2a02016-07-14 14:07:37202action (i.e. the same as using `-add-plugin`):
John Brawn6c789742016-03-15 12:51:40203
204.. code-block:: c++
205
206 // Automatically run the plugin after the main AST action
207 PluginASTAction::ActionType getActionType() override {
208 return AddAfterMainAction;
209 }
Arthur Eubanksf1315c62022-02-28 17:30:42210
211Interaction with ``-clear-ast-before-backend``
212----------------------------------------------
213
214To reduce peak memory usage of the compiler, plugins are recommended to run
215*before* the main action, which is usually code generation. This is because
216having any plugins that run after the codegen action automatically turns off
217``-clear-ast-before-backend``. ``-clear-ast-before-backend`` reduces peak
218memory by clearing the Clang AST after generating IR and before running IR
219optimizations. Use ``CmdlineBeforeMainAction`` or ``AddBeforeMainAction`` as
220``getActionType`` to run plugins while still benefitting from
221``-clear-ast-before-backend``. Plugins must make sure not to modify the AST,
222otherwise they should run after the main action.
223