File: LLVMLibC.html

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-20
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,496,436 kB
  • sloc: cpp: 5,593,990; ansic: 986,873; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,547; xml: 953; cs: 573; fortran: 567
file content (265 lines) | stat: -rw-r--r-- 13,672 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
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
253
254
255
256
257
258
259
260
261
262
263
264
265


<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>“llvm-libc” C Standard Library &#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="Test-Suite Extensions" href="TestSuite.html" />
    <link rel="prev" title="Bugpoint Redesign" href="../BugpointRedesign.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="TestSuite.html" title="Test-Suite Extensions"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="../BugpointRedesign.html" title="Bugpoint Redesign"
             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="../GettingInvolved.html" accesskey="U">Getting Involved</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">“llvm-libc” C Standard Library</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/Proposals/LLVMLibC.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="llvm-libc-c-standard-library">
<h1>“llvm-libc” C Standard Library<a class="headerlink" href="#llvm-libc-c-standard-library" title="Permalink to this headline">¶</a></h1>
<div class="contents local topic" id="table-of-contents">
<p class="topic-title">Table of Contents</p>
<ul class="simple">
<li><p><a class="reference internal" href="#introduction" id="id1">Introduction</a></p></li>
<li><p><a class="reference internal" href="#features" id="id2">Features</a></p></li>
<li><p><a class="reference internal" href="#why-a-new-c-standard-library" id="id3">Why a new C Standard Library?</a></p></li>
<li><p><a class="reference internal" href="#platform-support" id="id4">Platform Support</a></p></li>
<li><p><a class="reference internal" href="#abi-compatibility" id="id5">ABI Compatibility</a></p></li>
<li><p><a class="reference internal" href="#layering-over-another-libc" id="id6">Layering Over Another libc</a></p></li>
<li><p><a class="reference internal" href="#current-status" id="id7">Current Status</a></p></li>
<li><p><a class="reference internal" href="#build-bots" id="id8">Build Bots</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>This is a proposal to start <em>llvm-libc</em>, an implementation of the
C standard library targeting C17 and above, as part of the LLVM project.
llvm-libc will also provide platform specific extensions as relevant.
For example, on Linux it also provides pthreads, librt and other POSIX
extension libraries.</p>
</div>
<div class="section" id="features">
<h2><a class="toc-backref" href="#id2">Features</a><a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h2>
<p>llvm-libc will be developed to have a certain minimum set of features:</p>
<ul class="simple">
<li><p>C17 and upwards conformant.</p></li>
<li><p>A modular libc with individual pieces implemented in the “as a
library” philosophy of the LLVM project.</p></li>
<li><p>Ability to layer this libc over the system libc if possible and desired
for a platform.</p></li>
<li><p>Provide C symbols as specified by the standards, but take advantage
and use C++ language facilities for the core implementation.</p></li>
<li><p>Provides POSIX extensions on POSIX compliant platforms.</p></li>
<li><p>Provides system-specific extensions as appropriate. For example,
provides the Linux API on Linux.</p></li>
<li><p>Vendor extensions if and only if necessary.</p></li>
<li><p>Designed and developed from the start to work with LLVM tooling and
testing like fuzz testing and sanitizer-supported testing.</p></li>
<li><p>ABI independent implementation as far as possible.</p></li>
<li><p>Use source based implementations as far possible rather than
assembly. Will try to <em>fix</em> the compiler rather than use assembly
language workarounds.</p></li>
<li><p>Extensive unit testing and standards conformance testing. If relevant
and possible, differential testing: We want to be able
to test llvm-libc against another battle-tested libc. This is
essentially to understand how we differ from other libcs. Also if
relevant and possible, test against the testsuite of an another
battle-tested libc implementation.</p></li>
</ul>
</div>
<div class="section" id="why-a-new-c-standard-library">
<h2><a class="toc-backref" href="#id3">Why a new C Standard Library?</a><a class="headerlink" href="#why-a-new-c-standard-library" title="Permalink to this headline">¶</a></h2>
<p>Implementing a libc is no small task and is not be taken lightly. A
natural question to ask is, “why a new implementation of the C
standard library?” There is no single answer to this question, but
some of the major reasons are as follows:</p>
<ul class="simple">
<li><p>Most libc implementations are monolithic. It is a non-trivial
porting task to pick and choose only the pieces relevant to one’s
platform. The llvm-libc will be developed with sufficient modularity to
make picking and choosing a straightforward task.</p></li>
<li><p>Most libc implementations break when built with sanitizer specific
compiler options. The llvm-libc will be developed from the start to
work with those specialized compiler options.</p></li>
<li><p>The llvm-libc will be developed to support and employ fuzz testing
from the start.</p></li>
<li><p>Most libc implementations use a good amount of assembly language,
and assume specific ABIs (may be platform dependent). With the llvm-libc
implementation, we want to use normal source code as much as possible so
that compiler-based changes to the ABI are easy. Moreover, as part of the
LLVM project, we want to use this opportunity to fix performance related
compiler bugs rather than using assembly workarounds.</p></li>
<li><p>A large hole in the LLVM toolchain will be plugged with llvm-libc.
With the broad platform expertise in the LLVM community, and the
strong license and project structure, we think that llvm-libc will
be more tunable and robust, without sacrificing the simplicity and
accessibility typical of the LLVM project.</p></li>
</ul>
</div>
<div class="section" id="platform-support">
<h2><a class="toc-backref" href="#id4">Platform Support</a><a class="headerlink" href="#platform-support" title="Permalink to this headline">¶</a></h2>
<p>We envision that llvm-libc will support a variety of platforms in the coming
years. Interested parties are encouraged to participate in the design and
implementation, and add support for their favorite platforms.</p>
</div>
<div class="section" id="abi-compatibility">
<h2><a class="toc-backref" href="#id5">ABI Compatibility</a><a class="headerlink" href="#abi-compatibility" title="Permalink to this headline">¶</a></h2>
<p>As llvm-libc is new, it will not offer ABI stability in the initial stages.
However, as we’ve heard from other LLVM contributors that they are interested
in having ABI stability, llvm-libc code will be written in a manner which is
amenable to ABI stability. We are looking for contributors interested in
driving the design in this space to help us define what exactly does ABI
stability mean for llvm-libc.</p>
</div>
<div class="section" id="layering-over-another-libc">
<h2><a class="toc-backref" href="#id6">Layering Over Another libc</a><a class="headerlink" href="#layering-over-another-libc" title="Permalink to this headline">¶</a></h2>
<p>When meaningful and practically possible on a platform, llvm-libc will be
developed in a fashion that it will be possible to layer it over the system
libc. This does not mean that one can mix llvm-libc with the system-libc. Also,
it does not mean that layering is the only way to use llvm-libc. What it
means is that, llvm-libc can optionally be packaged in a way that it can
delegate parts of the functionality to the system-libc. The delegation happens
internal to llvm-libc and is invisible to the users. From the user’s point of
view, they only call into llvm-libc.</p>
<p>There are a few problems one needs to be mindful of when implementing such a
delegation scheme in llvm-libc. Examples of such problems are:</p>
<p>1. One cannot mix data structures from llvm-libc with those from the
system-libc. A translation from one set of data structures to the other should
happen internal to llvm-libc.
2. The delegation mechanism has to be implemented over a related set of
functions. For example, one cannot delegate just the <cite>fopen</cite> function to the
system-libc. One will have to delegate all <cite>FILE</cite> related functions to the
system-libc.</p>
</div>
<div class="section" id="current-status">
<h2><a class="toc-backref" href="#id7">Current Status</a><a class="headerlink" href="#current-status" title="Permalink to this headline">¶</a></h2>
<p>llvm-libc development is still in the planning phase.</p>
</div>
<div class="section" id="build-bots">
<h2><a class="toc-backref" href="#id8">Build Bots</a><a class="headerlink" href="#build-bots" title="Permalink to this headline">¶</a></h2>
<p>Once the development starts, there will be llvm-libc focused builders added to
the LLVM BuildBot.</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="TestSuite.html" title="Test-Suite Extensions"
             >next</a> |</li>
        <li class="right" >
          <a href="../BugpointRedesign.html" title="Bugpoint Redesign"
             >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="../GettingInvolved.html" >Getting Involved</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">“llvm-libc” C Standard Library</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>