summaryrefslogtreecommitdiff
path: root/share/doc/gcc/ARM-Function-Attributes.html
blob: 0d7e1aa87d42bc4e4f37bcc6816e4409168f792d (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- This file documents the use of the GNU compilers.

Copyright (C) 1988-2023 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.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): ARM Function Attributes</title>

<meta name="description" content="Using the GNU Compiler Collection (GCC): ARM Function Attributes">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): ARM Function Attributes">
<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="Indices.html#Indices" rel="index" title="Indices">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Function-Attributes.html#Function-Attributes" rel="up" title="Function Attributes">
<link href="AVR-Function-Attributes.html#AVR-Function-Attributes" rel="next" title="AVR Function Attributes">
<link href="ARC-Function-Attributes.html#ARC-Function-Attributes" rel="previous" title="ARC Function Attributes">
<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_US" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="ARM-Function-Attributes"></a>
<div class="header">
<p>
Next: <a href="AVR-Function-Attributes.html#AVR-Function-Attributes" accesskey="n" rel="next">AVR Function Attributes</a>, Previous: <a href="ARC-Function-Attributes.html#ARC-Function-Attributes" accesskey="p" rel="previous">ARC Function Attributes</a>, Up: <a href="Function-Attributes.html#Function-Attributes" accesskey="u" rel="up">Function Attributes</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="ARM-Function-Attributes-1"></a>
<h4 class="subsection">6.33.5 ARM Function Attributes</h4>

<p>These function attributes are supported for ARM targets:
</p>
<dl compact="compact">
<dd>
<a name="index-general_002dregs_002donly-function-attribute_002c-ARM"></a>
</dd>
<dt><code>general-regs-only</code></dt>
<dd><p>Indicates that no floating-point or Advanced SIMD registers should be
used when generating code for this function.  If the function explicitly
uses floating-point code, then the compiler gives an error.  This is
the same behavior as that of the command-line option
<samp>-mgeneral-regs-only</samp>.
</p>
<a name="index-interrupt-function-attribute_002c-ARM"></a>
</dd>
<dt><code>interrupt</code></dt>
<dd><p>Use this attribute to indicate
that the specified function is an interrupt handler.  The compiler generates
function entry and exit sequences suitable for use in an interrupt handler
when this attribute is present.
</p>
<p>You can specify the kind of interrupt to be handled by
adding an optional parameter to the interrupt attribute like this:
</p>
<div class="smallexample">
<pre class="smallexample">void f () __attribute__ ((interrupt (&quot;IRQ&quot;)));
</pre></div>

<p>Permissible values for this parameter are: <code>IRQ</code>, <code>FIQ</code>,
<code>SWI</code>, <code>ABORT</code> and <code>UNDEF</code>.
</p>
<p>On ARMv7-M the interrupt type is ignored, and the attribute means the function
may be called with a word-aligned stack pointer.
</p>
<a name="index-isr-function-attribute_002c-ARM"></a>
</dd>
<dt><code>isr</code></dt>
<dd><p>Use this attribute on ARM to write Interrupt Service Routines. This is an
alias to the <code>interrupt</code> attribute above.
</p>
<a name="index-long_005fcall-function-attribute_002c-ARM"></a>
<a name="index-short_005fcall-function-attribute_002c-ARM"></a>
<a name="index-indirect-calls_002c-ARM"></a>
</dd>
<dt><code>long_call</code></dt>
<dt><code>short_call</code></dt>
<dd><p>These attributes specify how a particular function is called.
These attributes override the
<samp>-mlong-calls</samp> (see <a href="ARM-Options.html#ARM-Options">ARM Options</a>)
command-line switch and <code>#pragma long_calls</code> settings.  For ARM, the
<code>long_call</code> attribute indicates that the function might be far
away from the call site and require a different (more expensive)
calling sequence.   The <code>short_call</code> attribute always places
the offset to the function from the call site into the &lsquo;<samp>BL</samp>&rsquo;
instruction directly.
</p>
<a name="index-naked-function-attribute_002c-ARM"></a>
</dd>
<dt><code>naked</code></dt>
<dd><p>This attribute allows the compiler to construct the
requisite function declaration, while allowing the body of the
function to be assembly code. The specified function will not have
prologue/epilogue sequences generated by the compiler. Only basic
<code>asm</code> statements can safely be included in naked functions
(see <a href="Basic-Asm.html#Basic-Asm">Basic Asm</a>). While using extended <code>asm</code> or a mixture of
basic <code>asm</code> and C code may appear to work, they cannot be
depended upon to work reliably and are not supported.
</p>
<a name="index-pcs-function-attribute_002c-ARM"></a>
</dd>
<dt><code>pcs</code></dt>
<dd>
<p>The <code>pcs</code> attribute can be used to control the calling convention
used for a function on ARM.  The attribute takes an argument that specifies
the calling convention to use.
</p>
<p>When compiling using the AAPCS ABI (or a variant of it) then valid
values for the argument are <code>&quot;aapcs&quot;</code> and <code>&quot;aapcs-vfp&quot;</code>.  In
order to use a variant other than <code>&quot;aapcs&quot;</code> then the compiler must
be permitted to use the appropriate co-processor registers (i.e., the
VFP registers must be available in order to use <code>&quot;aapcs-vfp&quot;</code>).
For example,
</p>
<div class="smallexample">
<pre class="smallexample">/* Argument passed in r0, and result returned in r0+r1.  */
double f2d (float) __attribute__((pcs(&quot;aapcs&quot;)));
</pre></div>

<p>Variadic functions always use the <code>&quot;aapcs&quot;</code> calling convention and
the compiler rejects attempts to specify an alternative.
</p>
<a name="index-target-function-attribute-1"></a>
</dd>
<dt><code>target (<var>options</var>)</code></dt>
<dd><p>As discussed in <a href="Common-Function-Attributes.html#Common-Function-Attributes">Common Function Attributes</a>, this attribute 
allows specification of target-specific compilation options.
</p>
<p>On ARM, the following options are allowed:
</p>
<dl compact="compact">
<dd><a name="index-target_0028_0022thumb_0022_0029-function-attribute_002c-ARM"></a>
</dd>
<dt>&lsquo;<samp>thumb</samp>&rsquo;</dt>
<dd><p>Force code generation in the Thumb (T16/T32) ISA, depending on the
architecture level.
</p>
<a name="index-target_0028_0022arm_0022_0029-function-attribute_002c-ARM"></a>
</dd>
<dt>&lsquo;<samp>arm</samp>&rsquo;</dt>
<dd><p>Force code generation in the ARM (A32) ISA.
</p>
<p>Functions from different modes can be inlined in the caller&rsquo;s mode.
</p>
<a name="index-target_0028_0022fpu_003d_0022_0029-function-attribute_002c-ARM"></a>
</dd>
<dt>&lsquo;<samp>fpu=</samp>&rsquo;</dt>
<dd><p>Specifies the fpu for which to tune the performance of this function.
The behavior and permissible arguments are the same as for the <samp>-mfpu=</samp>
command-line option.
</p>
<a name="index-arch_003d-function-attribute_002c-ARM"></a>
</dd>
<dt>&lsquo;<samp>arch=</samp>&rsquo;</dt>
<dd><p>Specifies the architecture version and architectural extensions to use
for this function.  The behavior and permissible arguments are the same as
for the <samp>-march=</samp> command-line option.
</p>
<p>The above target attributes can be specified as follows:
</p>
<div class="smallexample">
<pre class="smallexample">__attribute__((target(&quot;arch=armv8-a+crc&quot;)))
int
f (int a)
{
  return a + 5;
}
</pre></div>

<p>Additionally, the architectural extension string may be specified on its
own.  This can be used to turn on and off particular architectural extensions
without having to specify a particular architecture version or core.  Example:
</p>
<div class="smallexample">
<pre class="smallexample">__attribute__((target(&quot;+crc+nocrypto&quot;)))
int
foo (int a)
{
  return a + 5;
}
</pre></div>

<p>In this example <code>target(&quot;+crc+nocrypto&quot;)</code> enables the <code>crc</code>
extension and disables the <code>crypto</code> extension for the function <code>foo</code>
without modifying an existing <samp>-march=</samp> or <samp>-mcpu</samp> option.
</p>
</dd>
</dl>

</dd>
</dl>

<hr>
<div class="header">
<p>
Next: <a href="AVR-Function-Attributes.html#AVR-Function-Attributes" accesskey="n" rel="next">AVR Function Attributes</a>, Previous: <a href="ARC-Function-Attributes.html#ARC-Function-Attributes" accesskey="p" rel="previous">ARC Function Attributes</a>, Up: <a href="Function-Attributes.html#Function-Attributes" accesskey="u" rel="up">Function Attributes</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Indices.html#Indices" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>