File: HowToUseAttributes.html

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-6~deb10u4
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,418,792 kB
  • sloc: cpp: 5,290,827; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,900; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,892; xml: 953; cs: 573; fortran: 539
file content (212 lines) | stat: -rw-r--r-- 13,187 bytes parent folder | download | duplicates (7)
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


<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>How To Use Attributes &#8212; LLVM 13 documentation</title>
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="_static/llvm-theme.css" type="text/css" />
    <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Design and Usage of the InAlloca Attribute" href="InAlloca.html" />
    <link rel="prev" title="How to set up LLVM-style RTTI for your class hierarchy" href="HowToSetUpLLVMStyleRTTI.html" />
<style type="text/css">
  table.right { float: right; margin-left: 20px; }
  table.right td { border: 1px solid #ccc; }
</style>

  </head><body>
<div class="logo">
  <a href="index.html">
    <img src="_static/logo.png"
         alt="LLVM Logo" width="250" height="88"/></a>
</div>

    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="InAlloca.html" title="Design and Usage of the InAlloca Attribute"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="HowToSetUpLLVMStyleRTTI.html" title="How to set up LLVM-style RTTI for your class hierarchy"
             accesskey="P">previous</a> |</li>
  <li><a href="https://llvm.org/">LLVM Home</a>&nbsp;|&nbsp;</li>
  <li><a href="index.html">Documentation</a>&raquo;</li>

          <li class="nav-item nav-item-1"><a href="Reference.html" accesskey="U">Reference</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">How To Use Attributes</a></li> 
      </ul>
    </div>

      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">

<h3>Documentation</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/GettingStartedTutorials.html">Getting Started/Tutorials</a></li>
    <li><a href="https://llvm.org/docs/UserGuides.html">User Guides</a></li>
    <li><a href="https://llvm.org/docs/Reference.html">Reference</a></li>
</ul>

<h3>Getting Involved</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/Contributing.html">Contributing to LLVM</a></li>
    <li><a href="https://llvm.org/docs/HowToSubmitABug.html">Submitting Bug Reports</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#mailing-lists">Mailing Lists</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#irc">IRC</a></li>
    <li><a href="https://llvm.org/docs/GettingInvolved.html#meetups-and-social-events">Meetups and Social Events</a></li>
</ul>

<h3>Additional Links</h3>

<ul class="want-points">
    <li><a href="https://llvm.org/docs/FAQ.html">FAQ</a></li>
    <li><a href="https://llvm.org/docs/Lexicon.html">Glossary</a></li>
    <li><a href="https://llvm.org/pubs">Publications</a></li>
    <li><a href="https://github.com/llvm/llvm-project//">Github Repository</a></li>
</ul>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="_sources/HowToUseAttributes.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" />
      <input type="submit" value="Go" />
    </form>
    </div>
</div>
<script>$('#searchbox').show(0);</script>
        </div>
      </div>

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <div class="section" id="how-to-use-attributes">
<h1>How To Use Attributes<a class="headerlink" href="#how-to-use-attributes" title="Permalink to this headline">¶</a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#introduction" id="id1">Introduction</a></p></li>
<li><p><a class="reference internal" href="#attribute" id="id2"><code class="docutils literal notranslate"><span class="pre">Attribute</span></code></a></p></li>
<li><p><a class="reference internal" href="#attributelist" id="id3"><code class="docutils literal notranslate"><span class="pre">AttributeList</span></code></a></p></li>
<li><p><a class="reference internal" href="#attrbuilder" id="id4"><code class="docutils literal notranslate"><span class="pre">AttrBuilder</span></code></a></p></li>
</ul>
</div>
<div class="section" id="introduction">
<h2><a class="toc-backref" href="#id1">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
<p>Attributes in LLVM have changed in some fundamental ways.  It was necessary to
do this to support expanding the attributes to encompass more than a handful of
attributes — e.g. command line options.  The old way of handling attributes
consisted of representing them as a bit mask of values.  This bit mask was
stored in a “list” structure that was reference counted.  The advantage of this
was that attributes could be manipulated with ‘or’s and ‘and’s.  The
disadvantage of this was that there was limited room for expansion, and
virtually no support for attribute-value pairs other than alignment.</p>
<p>In the new scheme, an <code class="docutils literal notranslate"><span class="pre">Attribute</span></code> object represents a single attribute that’s
uniqued.  You use the <code class="docutils literal notranslate"><span class="pre">Attribute::get</span></code> methods to create a new <code class="docutils literal notranslate"><span class="pre">Attribute</span></code>
object.  An attribute can be a single “enum” value (the enum being the
<code class="docutils literal notranslate"><span class="pre">Attribute::AttrKind</span></code> enum), a string representing a target-dependent
attribute, or an attribute-value pair.  Some examples:</p>
<ul class="simple">
<li><p>Target-independent: <code class="docutils literal notranslate"><span class="pre">noinline</span></code>, <code class="docutils literal notranslate"><span class="pre">zext</span></code></p></li>
<li><p>Target-dependent: <code class="docutils literal notranslate"><span class="pre">&quot;no-sse&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">&quot;thumb2&quot;</span></code></p></li>
<li><p>Attribute-value pair: <code class="docutils literal notranslate"><span class="pre">&quot;cpu&quot;</span> <span class="pre">=</span> <span class="pre">&quot;cortex-a8&quot;</span></code>, <code class="docutils literal notranslate"><span class="pre">align</span> <span class="pre">=</span> <span class="pre">4</span></code></p></li>
</ul>
<p>Note: for an attribute value pair, we expect a target-dependent attribute to
have a string for the value.</p>
</div>
<div class="section" id="attribute">
<h2><a class="toc-backref" href="#id2"><code class="docutils literal notranslate"><span class="pre">Attribute</span></code></a><a class="headerlink" href="#attribute" title="Permalink to this headline">¶</a></h2>
<p>An <code class="docutils literal notranslate"><span class="pre">Attribute</span></code> object is designed to be passed around by value.</p>
<p>Because attributes are no longer represented as a bit mask, you will need to
convert any code which does treat them as a bit mask to use the new query
methods on the Attribute class.</p>
</div>
<div class="section" id="attributelist">
<h2><a class="toc-backref" href="#id3"><code class="docutils literal notranslate"><span class="pre">AttributeList</span></code></a><a class="headerlink" href="#attributelist" title="Permalink to this headline">¶</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> stores a collection of Attribute objects for each kind of
object that may have an attribute associated with it: the function as a whole,
the return type, or the function’s parameters.  A function’s attributes are at
index <code class="docutils literal notranslate"><span class="pre">AttributeList::FunctionIndex</span></code>; the return type’s attributes are at
index <code class="docutils literal notranslate"><span class="pre">AttributeList::ReturnIndex</span></code>; and the function’s parameters’ attributes
are at indices 1, …, n (where ‘n’ is the number of parameters).  Most methods
on the <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> class take an index parameter.</p>
<p>An <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> is also a uniqued and immutable object.  You create an
<code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> through the <code class="docutils literal notranslate"><span class="pre">AttributeList::get</span></code> methods.  You can add and
remove attributes, which result in the creation of a new <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code>.</p>
<p>An <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> object is designed to be passed around by value.</p>
<p>Note: It is advised that you do <em>not</em> use the <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> “introspection”
methods (e.g. <code class="docutils literal notranslate"><span class="pre">Raw</span></code>, <code class="docutils literal notranslate"><span class="pre">getRawPointer</span></code>, etc.).  These methods break
encapsulation, and may be removed in a future release.</p>
</div>
<div class="section" id="attrbuilder">
<h2><a class="toc-backref" href="#id4"><code class="docutils literal notranslate"><span class="pre">AttrBuilder</span></code></a><a class="headerlink" href="#attrbuilder" title="Permalink to this headline">¶</a></h2>
<p>Lastly, we have a “builder” class to help create the <code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> object
without having to create several different intermediate uniqued
<code class="docutils literal notranslate"><span class="pre">AttributeList</span></code> objects.  The <code class="docutils literal notranslate"><span class="pre">AttrBuilder</span></code> class allows you to add and
remove attributes at will.  The attributes won’t be uniqued until you call the
appropriate <code class="docutils literal notranslate"><span class="pre">AttributeList::get</span></code> method.</p>
<p>An <code class="docutils literal notranslate"><span class="pre">AttrBuilder</span></code> object is <em>not</em> designed to be passed around by value.  It
should be passed by reference.</p>
<p>Note: It is advised that you do <em>not</em> use the <code class="docutils literal notranslate"><span class="pre">AttrBuilder::addRawValue()</span></code>
method or the <code class="docutils literal notranslate"><span class="pre">AttrBuilder(uint64_t</span> <span class="pre">Val)</span></code> constructor.  These are for
backwards compatibility and may be removed in a future release.</p>
<p>And that’s basically it! A lot of functionality is hidden behind these classes,
but the interfaces are pretty straight forward.</p>
</div>
</div>


            <div class="clearer"></div>
          </div>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="InAlloca.html" title="Design and Usage of the InAlloca Attribute"
             >next</a> |</li>
        <li class="right" >
          <a href="HowToSetUpLLVMStyleRTTI.html" title="How to set up LLVM-style RTTI for your class hierarchy"
             >previous</a> |</li>
  <li><a href="https://llvm.org/">LLVM Home</a>&nbsp;|&nbsp;</li>
  <li><a href="index.html">Documentation</a>&raquo;</li>

          <li class="nav-item nav-item-1"><a href="Reference.html" >Reference</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">How To Use Attributes</a></li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2003-2021, LLVM Project.
      Last updated on 2021-09-18.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.5.4.
    </div>
  </body>
</html>