File: compilation.rst

package info (click to toggle)
pygccjit 0.4-13
  • links: PTS
  • area: main
  • in suites: sid
  • size: 396 kB
  • sloc: python: 551; makefile: 140
file content (132 lines) | stat: -rw-r--r-- 4,455 bytes parent folder | download | duplicates (5)
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
.. Copyright 2014-2015 David Malcolm <dmalcolm@redhat.com>
   Copyright 2014-2015 Red Hat, Inc.

   This is free software: you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see
   <http://www.gnu.org/licenses/>.

Compiling a context
===================

Once populated, a :py:class:`gccjit.Context` can be compiled to
machine code, either in-memory via :py:meth:`gccjit.Context.compile` or
to disk via :py:meth:`gccjit.Context.compile_to_file`.

You can compile a context multiple times (using either form of
compilation), although any errors that occur on the context will
prevent any future compilation of that context.

In-memory compilation
*********************

.. py:method:: gccjit.Context.compile(self)

       :rtype: :py:class:`gccjit.Result`

   This calls into GCC and builds the code, returning a
   :py:class:`gccjit.Result`.

.. py:class:: gccjit.Result

   A :py:class:`gccjit.Result` encapsulates the result of compiling a
   :py:class:`gccjit.Context` in-memory, and the lifetimes of any
   machine code functions or globals that are within the result.

   .. py:method:: get_code(funcname)

      Locate the given function within the built machine code.

      Functions are looked up by name.  For this to succeed, a function
      with a name matching `funcname` must have been created on
      `result`'s context (or a parent context) via a call to
      :py:meth:`gccjit.Context.new_function` with `kind`
      :py:data:`gccjit.FunctionKind.EXPORTED`.

      .. error-handling?

      The returned value is an
      `int`, actually a pointer to the machine code within the
      address space of the process.  This will need to be wrapped up
      with `ctypes` to be callable::

         import ctypes

         # "[int] -> int" functype:
         int_int_func_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
         code = int_int_func_type(jit_result.get_code(b"square"))
         assert code(5) == 25

      The code has the same lifetime as the :py:class:`gccjit.Result`
      instance; the pointer becomes invalid when the result instance
      is cleaned up.

.. TODO: gcc_jit_result_get_global

Ahead-of-time compilation
*************************

Although libgccjit is primarily aimed at just-in-time compilation, it
can also be used for implementing more traditional ahead-of-time
compilers, via the :py:meth:`gccjit.Context.compile_to_file`
API entrypoint.

.. py:method:: gccjit.Context.compile_to_file(self, kind, path)

   Compile the context to a file of the given
   kind::

     ctxt.compile_to_file(gccjit.OutputKind.EXECUTABLE,
                          'a.out')

   :py:meth:`gccjit.Context.compile_to_file` ignores the suffix of
   ``path``, and insteads uses `kind` to decide what to do.

   .. note::

      This is different from the ``gcc`` program, which does make use of the
      suffix of the output file when determining what to do.

   The available kinds of output are:

   ============================================  ==============
   Output kind                                     Typical suffix
   ============================================  ==============
   :py:data:`gccjit.OutputKind.ASSEMBLER`        .s
   :py:data:`gccjit.OutputKind.OBJECT_FILE`      .o
   :py:data:`gccjit.OutputKind.DYNAMIC_LIBRARY`  .so or .dll
   :py:data:`gccjit.OutputKind.EXECUTABLE`       None, or .exe
   ============================================  ==============

.. py:class:: gccjit.OutputKind

   .. py:data:: ASSEMBLER

      Compile the context to an assembler file.

   .. py:data:: OBJECT_FILE

      Compile the context to an object file.

   .. py:data:: DYNAMIC_LIBRARY

      Compile the context to a dynamic library.

      There is currently no support for specifying other libraries to link
      against.

   .. py:data:: EXECUTABLE

      Compile the context to an executable.

      There is currently no support for specifying libraries to link
      against.