.. role:: raw-html(raw)
   :format: html

========================
LLVM Bitcode File Format
========================

.. contents::
   :local:

Abstract
========

This document describes the LLVM bitstream file format and the encoding of the
LLVM IR into it.

Overview
========

What is commonly known as the LLVM bitcode file format (also, sometimes
anachronistically known as bytecode) is actually two things: a `bitstream
container format`_ and an `encoding of LLVM IR`_ into the container format.

The bitstream format is an abstract encoding of structured data, very similar to
XML in some ways.  Like XML, bitstream files contain tags, and nested
structures, and you can parse the file without having to understand the tags.
Unlike XML, the bitstream format is a binary encoding, and unlike XML it
provides a mechanism for the file to self-describe "abbreviations", which are
effectively size optimizations for the content.

LLVM IR files may be optionally embedded into a `wrapper`_ structure, or in a
`native object file`_. Both of these mechanisms make it easy to embed extra
data along with LLVM IR files.

This document first describes the LLVM bitstream format, describes the wrapper
format, then describes the record structure used by LLVM IR files.

.. _bitstream container format:

Bitstream Format
================

The bitstream format is literally a stream of bits, with a very simple
structure.  This structure consists of the following concepts:

* A "`magic number`_" that identifies the contents of the stream.

* Encoding `primitives`_ like variable bit-rate integers.

* `Blocks`_, which define nested content.

* `Data Records`_, which describe entities within the file.

* Abbreviations, which specify compression optimizations for the file.

Note that the :doc:`llvm-bcanalyzer <CommandGuide/llvm-bcanalyzer>` tool can be
used to dump and inspect arbitrary bitstreams, which is very useful for
understanding the encoding.

.. _magic number:

Magic Numbers
-------------

The first four bytes of a bitstream are used as an application-specific magic
number.  Generic bitcode tools may look at the first four bytes to determine
whether the stream is a known stream type.  However, these tools should *not*
determine whether a bitstream is valid based on its magic number alone.  New
application-specific bitstream formats are being developed all the time; tools
should not reject them just because they have a hitherto unseen magic number.

.. _primitives:

Primitives
----------

A bitstream literally consists of a stream of bits, which are read in order
starting with the least significant bit of each byte.  The stream is made up of
a number of primitive values that encode a stream of unsigned integer values.
These integers are encoded in two ways: either as `Fixed Width Integers`_ or as
`Variable Width Integers`_.

.. _Fixed Width Integers:
.. _fixed-width value:

Fixed Width Integers
^^^^^^^^^^^^^^^^^^^^

Fixed-width integer values have their low bits emitted directly to the file.
For example, a 3-bit integer value encodes 1 as 001.  Fixed width integers are
used when there are a well-known number of options for a field.  For example,
boolean values are usually encoded with a 1-bit wide integer.

.. _Variable Width Integers:
.. _Variable Width Integer:
.. _variable-width value:

Variable Width Integers
^^^^^^^^^^^^^^^^^^^^^^^

Variable-width integer (VBR) values encode values of arbitrary size, optimizing
for the case where the values are small.  Given a 4-bit VBR field, any 3-bit
value (0 through 7) is encoded directly, with the high bit set to zero.  Values
larger than N-1 bits emit their bits in a series of N-1 bit chunks, where all
but the last set the high bit.

For example, the value 27 (0x1B) is encoded as 1011 0011 when emitted as a vbr4
value.  The first set of four bits indicates the value 3 (011) with a
continuation piece (indicated by a high bit of 1).  The next word indicates a
value of 24 (011 << 3) with no continuation.  The sum (3+24) yields the value
27.

.. _char6-encoded value:

6-bit characters
^^^^^^^^^^^^^^^^

6-bit characters encode common characters into a fixed 6-bit field.  They
represent the following characters with the following 6-bit values:

::

  'a' .. 'z' ---  0 .. 25
  'A' .. 'Z' --- 26 .. 51
  '0' .. '9' --- 52 .. 61
         '.' --- 62
         '_' --- 63

This encoding is only suitable for encoding characters and strings that consist
only of the above characters.  It is completely incapable of encoding characters
not in the set.

Word Alignment
^^^^^^^^^^^^^^

Occasionally, it is useful to emit zero bits until the bitstream is a multiple
of 32 bits.  This ensures that the bit position in the stream can be represented
as a multiple of 32-bit words.

Abbreviation IDs
----------------

A bitstream is a sequential series of `Blocks`_ and `Data Records`_.  Both of
these start with an abbreviation ID encoded as a fixed-bitwidth field.  The
width is specified by the current block, as described below.  The value of the
abbreviation ID specifies either a builtin ID (which have special meanings,
defined below) or one of the abbreviation IDs defined for the current block by
the stream itself.

The set of builtin abbrev IDs is:

* 0 - `END_BLOCK`_ --- This abbrev ID marks the end of the current block.

* 1 - `ENTER_SUBBLOCK`_ --- This abbrev ID marks the beginning of a new
  block.

* 2 - `DEFINE_ABBREV`_ --- This defines a new abbreviation.

* 3 - `UNABBREV_RECORD`_ --- This ID specifies the definition of an
  unabbreviated record.

Abbreviation IDs 4 and above are defined by the stream itself, and specify an
`abbreviated record encoding`_.

.. _Blocks:

Blocks
------

Blocks in a bitstream denote nested regions of the stream, and are identified by
a content-specific id number (for example, LLVM IR uses an ID of 12 to represent
function bodies).  Block IDs 0-7 are reserved for `standard blocks`_ whose
meaning is defined by Bitcode; block IDs 8 and greater are application
specific. Nested blocks capture the hierarchical structure of the data encoded
in it, and various properties are associated with blocks as the file is parsed.
Block definitions allow the reader to efficiently skip blocks in constant time
if the reader wants a summary of blocks, or if it wants to efficiently skip data
it does not understand.  The LLVM IR reader uses this mechanism to skip function
bodies, lazily reading them on demand.

When reading and encoding the stream, several properties are maintained for the
block.  In particular, each block maintains:

#. A current abbrev id width.  This value starts at 2 at the beginning of the
   stream, and is set every time a block record is entered.  The block entry
   specifies the abbrev id width for the body of the block.

#. A set of abbreviations.  Abbreviations may be defined within a block, in
   which case they are only defined in that block (neither subblocks nor
   enclosing blocks see the abbreviation).  Abbreviations can also be defined
   inside a `BLOCKINFO`_ block, in which case they are defined in all blocks
   that match the ID that the ``BLOCKINFO`` block is describing.

As sub blocks are entered, these properties are saved and the new sub-block has
its own set of abbreviations, and its own abbrev id width.  When a sub-block is
popped, the saved values are restored.

.. _ENTER_SUBBLOCK:

ENTER_SUBBLOCK Encoding
^^^^^^^^^^^^^^^^^^^^^^^

:raw-html:`<tt>`
[ENTER_SUBBLOCK, blockid\ :sub:`vbr8`, newabbrevlen\ :sub:`vbr4`, <align32bits>, blocklen_32]
:raw-html:`</tt>`

The ``ENTER_SUBBLOCK`` abbreviation ID specifies the start of a new block
record.  The ``blockid`` value is encoded as an 8-bit VBR identifier, and
indicates the type of block being entered, which can be a `standard block`_ or
an application-specific block.  The ``newabbrevlen`` value is a 4-bit VBR, which
specifies the abbrev id width for the sub-block.  The ``blocklen`` value is a
32-bit aligned value that specifies the size of the subblock in 32-bit
words. This value allows the reader to skip over the entire block in one jump.

.. _END_BLOCK:

END_BLOCK Encoding
^^^^^^^^^^^^^^^^^^

``[END_BLOCK, <align32bits>]``

The ``END_BLOCK`` abbreviation ID specifies the end of the current block record.
Its end is aligned to 32-bits to ensure that the size of the block is an even
multiple of 32-bits.

.. _Data Records:

Data Records
------------

Data records consist of a record code and a number of (up to) 64-bit integer
values.  The interpretation of the code and values is application specific and
may vary between different block types.  Records can be encoded either using an
unabbrev record, or with an abbreviation.  In the LLVM IR format, for example,
there is a record which encodes the target triple of a module.  The code is
``MODULE_CODE_TRIPLE``, and the values of the record are the ASCII codes for the
characters in the string.

.. _UNABBREV_RECORD:

UNABBREV_RECORD Encoding
^^^^^^^^^^^^^^^^^^^^^^^^

:raw-html:`<tt>`
[UNABBREV_RECORD, code\ :sub:`vbr6`, numops\ :sub:`vbr6`, op0\ :sub:`vbr6`, op1\ :sub:`vbr6`, ...]
:raw-html:`</tt>`

An ``UNABBREV_RECORD`` provides a default fallback encoding, which is both
completely general and extremely inefficient.  It can describe an arbitrary
record by emitting the code and operands as VBRs.

For example, emitting an LLVM IR target triple as an unabbreviated record
requires emitting the ``UNABBREV_RECORD`` abbrevid, a vbr6 for the
``MODULE_CODE_TRIPLE`` code, a vbr6 for the length of the string, which is equal
to the number of operands, and a vbr6 for each character.  Because there are no
letters with values less than 32, each letter would need to be emitted as at
least a two-part VBR, which means that each letter would require at least 12
bits.  This is not an efficient encoding, but it is fully general.

.. _abbreviated record encoding:

Abbreviated Record Encoding
^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[<abbrevid>, fields...]``

An abbreviated record is a abbreviation id followed by a set of fields that are
encoded according to the `abbreviation definition`_.  This allows records to be
encoded significantly more densely than records encoded with the
`UNABBREV_RECORD`_ type, and allows the abbreviation types to be specified in
the stream itself, which allows the files to be completely self describing.  The
actual encoding of abbreviations is defined below.

The record code, which is the first field of an abbreviated record, may be
encoded in the abbreviation definition (as a literal operand) or supplied in the
abbreviated record (as a Fixed or VBR operand value).

.. _abbreviation definition:

Abbreviations
-------------

Abbreviations are an important form of compression for bitstreams.  The idea is
to specify a dense encoding for a class of records once, then use that encoding
to emit many records.  It takes space to emit the encoding into the file, but
the space is recouped (hopefully plus some) when the records that use it are
emitted.

Abbreviations can be determined dynamically per client, per file. Because the
abbreviations are stored in the bitstream itself, different streams of the same
format can contain different sets of abbreviations according to the needs of the
specific stream.  As a concrete example, LLVM IR files usually emit an
abbreviation for binary operators.  If a specific LLVM module contained no or
few binary operators, the abbreviation does not need to be emitted.

.. _DEFINE_ABBREV:

DEFINE_ABBREV Encoding
^^^^^^^^^^^^^^^^^^^^^^

:raw-html:`<tt>`
[DEFINE_ABBREV, numabbrevops\ :sub:`vbr5`, abbrevop0, abbrevop1, ...]
:raw-html:`</tt>`

A ``DEFINE_ABBREV`` record adds an abbreviation to the list of currently defined
abbreviations in the scope of this block.  This definition only exists inside
this immediate block --- it is not visible in subblocks or enclosing blocks.
Abbreviations are implicitly assigned IDs sequentially starting from 4 (the
first application-defined abbreviation ID).  Any abbreviations defined in a
``BLOCKINFO`` record for the particular block type receive IDs first, in order,
followed by any abbreviations defined within the block itself.  Abbreviated data
records reference this ID to indicate what abbreviation they are invoking.

An abbreviation definition consists of the ``DEFINE_ABBREV`` abbrevid followed
by a VBR that specifies the number of abbrev operands, then the abbrev operands
themselves.  Abbreviation operands come in three forms.  They all start with a
single bit that indicates whether the abbrev operand is a literal operand (when
the bit is 1) or an encoding operand (when the bit is 0).

#. Literal operands --- :raw-html:`<tt>` [1\ :sub:`1`, litvalue\
   :sub:`vbr8`] :raw-html:`</tt>` --- Literal operands specify that the value in
   the result is always a single specific value.  This specific value is emitted
   as a vbr8 after the bit indicating that it is a literal operand.

#. Encoding info without data --- :raw-html:`<tt>` [0\ :sub:`1`, encoding\
   :sub:`3`] :raw-html:`</tt>` --- Operand encodings that do not have extra data
   are just emitted as their code.

#. Encoding info with data --- :raw-html:`<tt>` [0\ :sub:`1`, encoding\
   :sub:`3`, value\ :sub:`vbr5`] :raw-html:`</tt>` --- Operand encodings that do
   have extra data are emitted as their code, followed by the extra data.

The possible operand encodings are:

* Fixed (code 1): The field should be emitted as a `fixed-width value`_, whose
  width is specified by the operand's extra data.

* VBR (code 2): The field should be emitted as a `variable-width value`_, whose
  width is specified by the operand's extra data.

* Array (code 3): This field is an array of values.  The array operand has no
  extra data, but expects another operand to follow it, indicating the element
  type of the array.  When reading an array in an abbreviated record, the first
  integer is a vbr6 that indicates the array length, followed by the encoded
  elements of the array.  An array may only occur as the last operand of an
  abbreviation (except for the one final operand that gives the array's
  type).

* Char6 (code 4): This field should be emitted as a `char6-encoded value`_.
  This operand type takes no extra data. Char6 encoding is normally used as an
  array element type.

* Blob (code 5): This field is emitted as a vbr6, followed by padding to a
  32-bit boundary (for alignment) and an array of 8-bit objects.  The array of
  bytes is further followed by tail padding to ensure that its total length is a
  multiple of 4 bytes.  This makes it very efficient for the reader to decode
  the data without having to make a copy of it: it can use a pointer to the data
  in the mapped in file and poke directly at it.  A blob may only occur as the
  last operand of an abbreviation.

For example, target triples in LLVM modules are encoded as a record of the form
``[TRIPLE, 'a', 'b', 'c', 'd']``.  Consider if the bitstream emitted the
following abbrev entry:

::

  [0, Fixed, 4]
  [0, Array]
  [0, Char6]

When emitting a record with this abbreviation, the above entry would be emitted
as:

:raw-html:`<tt><blockquote>`
[4\ :sub:`abbrevwidth`, 2\ :sub:`4`, 4\ :sub:`vbr6`, 0\ :sub:`6`, 1\ :sub:`6`, 2\ :sub:`6`, 3\ :sub:`6`]
:raw-html:`</blockquote></tt>`

These values are:

#. The first value, 4, is the abbreviation ID for this abbreviation.

#. The second value, 2, is the record code for ``TRIPLE`` records within LLVM IR
   file ``MODULE_BLOCK`` blocks.

#. The third value, 4, is the length of the array.

#. The rest of the values are the char6 encoded values for ``"abcd"``.

With this abbreviation, the triple is emitted with only 37 bits (assuming a
abbrev id width of 3).  Without the abbreviation, significantly more space would
be required to emit the target triple.  Also, because the ``TRIPLE`` value is
not emitted as a literal in the abbreviation, the abbreviation can also be used
for any other string value.

.. _standard blocks:
.. _standard block:

Standard Blocks
---------------

In addition to the basic block structure and record encodings, the bitstream
also defines specific built-in block types.  These block types specify how the
stream is to be decoded or other metadata.  In the future, new standard blocks
may be added.  Block IDs 0-7 are reserved for standard blocks.

.. _BLOCKINFO:

#0 - BLOCKINFO Block
^^^^^^^^^^^^^^^^^^^^

The ``BLOCKINFO`` block allows the description of metadata for other blocks.
The currently specified records are:

::

  [SETBID (#1), blockid]
  [DEFINE_ABBREV, ...]
  [BLOCKNAME, ...name...]
  [SETRECORDNAME, RecordID, ...name...]

The ``SETBID`` record (code 1) indicates which block ID is being described.
``SETBID`` records can occur multiple times throughout the block to change which
block ID is being described.  There must be a ``SETBID`` record prior to any
other records.

Standard ``DEFINE_ABBREV`` records can occur inside ``BLOCKINFO`` blocks, but
unlike their occurrence in normal blocks, the abbreviation is defined for blocks
matching the block ID we are describing, *not* the ``BLOCKINFO`` block
itself.  The abbreviations defined in ``BLOCKINFO`` blocks receive abbreviation
IDs as described in `DEFINE_ABBREV`_.

The ``BLOCKNAME`` record (code 2) can optionally occur in this block.  The
elements of the record are the bytes of the string name of the block.
llvm-bcanalyzer can use this to dump out bitcode files symbolically.

The ``SETRECORDNAME`` record (code 3) can also optionally occur in this block.
The first operand value is a record ID number, and the rest of the elements of
the record are the bytes for the string name of the record.  llvm-bcanalyzer can
use this to dump out bitcode files symbolically.

Note that although the data in ``BLOCKINFO`` blocks is described as "metadata,"
the abbreviations they contain are essential for parsing records from the
corresponding blocks.  It is not safe to skip them.

.. _wrapper:

Bitcode Wrapper Format
======================

Bitcode files for LLVM IR may optionally be wrapped in a simple wrapper
structure.  This structure contains a simple header that indicates the offset
and size of the embedded BC file.  This allows additional information to be
stored alongside the BC file.  The structure of this file header is:

:raw-html:`<tt><blockquote>`
[Magic\ :sub:`32`, Version\ :sub:`32`, Offset\ :sub:`32`, Size\ :sub:`32`, CPUType\ :sub:`32`]
:raw-html:`</blockquote></tt>`

Each of the fields are 32-bit fields stored in little endian form (as with the
rest of the bitcode file fields).  The Magic number is always ``0x0B17C0DE`` and
the version is currently always ``0``.  The Offset field is the offset in bytes
to the start of the bitcode stream in the file, and the Size field is the size
in bytes of the stream. CPUType is a target-specific value that can be used to
encode the CPU of the target.

.. _native object file:

Native Object File Wrapper Format
=================================

Bitcode files for LLVM IR may also be wrapped in a native object file
(i.e. ELF, COFF, Mach-O).  The bitcode must be stored in a section of the object
file named ``__LLVM,__bitcode`` for MachO and ``.llvmbc`` for the other object
formats.  This wrapper format is useful for accommodating LTO in compilation
pipelines where intermediate objects must be native object files which contain
metadata in other sections.

Not all tools support this format.

.. _encoding of LLVM IR:

LLVM IR Encoding
================

LLVM IR is encoded into a bitstream by defining blocks and records.  It uses
blocks for things like constant pools, functions, symbol tables, etc.  It uses
records for things like instructions, global variable descriptors, type
descriptions, etc.  This document does not describe the set of abbreviations
that the writer uses, as these are fully self-described in the file, and the
reader is not allowed to build in any knowledge of this.

Basics
------

LLVM IR Magic Number
^^^^^^^^^^^^^^^^^^^^

The magic number for LLVM IR files is:

:raw-html:`<tt><blockquote>`
['B'\ :sub:`8`, 'C'\ :sub:`8`, 0x0\ :sub:`4`, 0xC\ :sub:`4`, 0xE\ :sub:`4`, 0xD\ :sub:`4`]
:raw-html:`</blockquote></tt>`

.. _Signed VBRs:

Signed VBRs
^^^^^^^^^^^

`Variable Width Integer`_ encoding is an efficient way to encode arbitrary sized
unsigned values, but is an extremely inefficient for encoding signed values, as
signed values are otherwise treated as maximally large unsigned values.

As such, signed VBR values of a specific width are emitted as follows:

* Positive values are emitted as VBRs of the specified width, but with their
  value shifted left by one.

* Negative values are emitted as VBRs of the specified width, but the negated
  value is shifted left by one, and the low bit is set.

With this encoding, small positive and small negative values can both be emitted
efficiently. Signed VBR encoding is used in ``CST_CODE_INTEGER`` and
``CST_CODE_WIDE_INTEGER`` records within ``CONSTANTS_BLOCK`` blocks.
It is also used for phi instruction operands in `MODULE_CODE_VERSION`_ 1.

LLVM IR Blocks
^^^^^^^^^^^^^^

LLVM IR is defined with the following blocks:

* 8 --- `MODULE_BLOCK`_ --- This is the top-level block that contains the entire
  module, and describes a variety of per-module information.

* 9 --- `PARAMATTR_BLOCK`_ --- This enumerates the parameter attributes.

* 10 --- `PARAMATTR_GROUP_BLOCK`_ --- This describes the attribute group table.

* 11 --- `CONSTANTS_BLOCK`_ --- This describes constants for a module or
  function.

* 12 --- `FUNCTION_BLOCK`_ --- This describes a function body.

* 14 --- `VALUE_SYMTAB_BLOCK`_ --- This describes a value symbol table.

* 15 --- `METADATA_BLOCK`_ --- This describes metadata items.

* 16 --- `METADATA_ATTACHMENT`_ --- This contains records associating metadata
  with function instruction values.

* 17 --- `TYPE_BLOCK`_ --- This describes all of the types in the module.

* 23 --- `STRTAB_BLOCK`_ --- The bitcode file's string table.

.. _MODULE_BLOCK:

MODULE_BLOCK Contents
---------------------

The ``MODULE_BLOCK`` block (id 8) is the top-level block for LLVM bitcode files,
and each bitcode file must contain exactly one. In addition to records
(described below) containing information about the module, a ``MODULE_BLOCK``
block may contain the following sub-blocks:

* `BLOCKINFO`_
* `PARAMATTR_BLOCK`_
* `PARAMATTR_GROUP_BLOCK`_
* `TYPE_BLOCK`_
* `VALUE_SYMTAB_BLOCK`_
* `CONSTANTS_BLOCK`_
* `FUNCTION_BLOCK`_
* `METADATA_BLOCK`_

.. _MODULE_CODE_VERSION:

MODULE_CODE_VERSION Record
^^^^^^^^^^^^^^^^^^^^^^^^^^

``[VERSION, version#]``

The ``VERSION`` record (code 1) contains a single value indicating the format
version. Versions 0, 1 and 2 are supported at this time. The difference between
version 0 and 1 is in the encoding of instruction operands in
each `FUNCTION_BLOCK`_.

In version 0, each value defined by an instruction is assigned an ID
unique to the function. Function-level value IDs are assigned starting from
``NumModuleValues`` since they share the same namespace as module-level
values. The value enumerator resets after each function. When a value is
an operand of an instruction, the value ID is used to represent the operand.
For large functions or large modules, these operand values can be large.

The encoding in version 1 attempts to avoid large operand values
in common cases. Instead of using the value ID directly, operands are
encoded as relative to the current instruction. Thus, if an operand
is the value defined by the previous instruction, the operand
will be encoded as 1.

For example, instead of

.. code-block:: none

  #n = load #n-1
  #n+1 = icmp eq #n, #const0
  br #n+1, label #(bb1), label #(bb2)

version 1 will encode the instructions as

.. code-block:: none

  #n = load #1
  #n+1 = icmp eq #1, (#n+1)-#const0
  br #1, label #(bb1), label #(bb2)

Note in the example that operands which are constants also use
the relative encoding, while operands like basic block labels
do not use the relative encoding.

Forward references will result in a negative value.
This can be inefficient, as operands are normally encoded
as unsigned VBRs. However, forward references are rare, except in the
case of phi instructions. For phi instructions, operands are encoded as
`Signed VBRs`_ to deal with forward references.

In version 2, the meaning of module records ``FUNCTION``, ``GLOBALVAR``,
``ALIAS``, ``IFUNC`` and ``COMDAT`` change such that the first two operands
specify an offset and size of a string in a string table (see `STRTAB_BLOCK
Contents`_), the function name is removed from the ``FNENTRY`` record in the
value symbol table, and the top-level ``VALUE_SYMTAB_BLOCK`` may only contain
``FNENTRY`` records.

MODULE_CODE_TRIPLE Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[TRIPLE, ...string...]``

The ``TRIPLE`` record (code 2) contains a variable number of values representing
the bytes of the ``target triple`` specification string.

MODULE_CODE_DATALAYOUT Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[DATALAYOUT, ...string...]``

The ``DATALAYOUT`` record (code 3) contains a variable number of values
representing the bytes of the ``target datalayout`` specification string.

MODULE_CODE_ASM Record
^^^^^^^^^^^^^^^^^^^^^^

``[ASM, ...string...]``

The ``ASM`` record (code 4) contains a variable number of values representing
the bytes of ``module asm`` strings, with individual assembly blocks separated
by newline (ASCII 10) characters.

.. _MODULE_CODE_SECTIONNAME:

MODULE_CODE_SECTIONNAME Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[SECTIONNAME, ...string...]``

The ``SECTIONNAME`` record (code 5) contains a variable number of values
representing the bytes of a single section name string. There should be one
``SECTIONNAME`` record for each section name referenced (e.g., in global
variable or function ``section`` attributes) within the module. These records
can be referenced by the 1-based index in the *section* fields of ``GLOBALVAR``
or ``FUNCTION`` records.

MODULE_CODE_DEPLIB Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[DEPLIB, ...string...]``

The ``DEPLIB`` record (code 6) contains a variable number of values representing
the bytes of a single dependent library name string, one of the libraries
mentioned in a ``deplibs`` declaration.  There should be one ``DEPLIB`` record
for each library name referenced.

MODULE_CODE_GLOBALVAR Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[GLOBALVAR, strtab offset, strtab size, pointer type, isconst, initid, linkage, alignment, section, visibility, threadlocal, unnamed_addr, externally_initialized, dllstorageclass, comdat, attributes, preemptionspecifier]``

The ``GLOBALVAR`` record (code 7) marks the declaration or definition of a
global variable. The operand fields are:

* *strtab offset*, *strtab size*: Specifies the name of the global variable.
  See `STRTAB_BLOCK Contents`_.

* *pointer type*: The type index of the pointer type used to point to this
  global variable

* *isconst*: Non-zero if the variable is treated as constant within the module,
  or zero if it is not

* *initid*: If non-zero, the value index of the initializer for this variable,
  plus 1.

.. _linkage type:

* *linkage*: An encoding of the linkage type for this variable:

  * ``external``: code 0
  * ``weak``: code 1
  * ``appending``: code 2
  * ``internal``: code 3
  * ``linkonce``: code 4
  * ``dllimport``: code 5
  * ``dllexport``: code 6
  * ``extern_weak``: code 7
  * ``common``: code 8
  * ``private``: code 9
  * ``weak_odr``: code 10
  * ``linkonce_odr``: code 11
  * ``available_externally``: code 12
  * deprecated : code 13
  * deprecated : code 14

* alignment*: The logarithm base 2 of the variable's requested alignment, plus 1

* *section*: If non-zero, the 1-based section index in the table of
  `MODULE_CODE_SECTIONNAME`_ entries.

.. _visibility:

* *visibility*: If present, an encoding of the visibility of this variable:

  * ``default``: code 0
  * ``hidden``: code 1
  * ``protected``: code 2

.. _bcthreadlocal:

* *threadlocal*: If present, an encoding of the thread local storage mode of the
  variable:

  * ``not thread local``: code 0
  * ``thread local; default TLS model``: code 1
  * ``localdynamic``: code 2
  * ``initialexec``: code 3
  * ``localexec``: code 4

.. _bcunnamedaddr:

* *unnamed_addr*: If present, an encoding of the ``unnamed_addr`` attribute of this
  variable:

  * not ``unnamed_addr``: code 0
  * ``unnamed_addr``: code 1
  * ``local_unnamed_addr``: code 2

.. _bcdllstorageclass:

* *dllstorageclass*: If present, an encoding of the DLL storage class of this variable:

  * ``default``: code 0
  * ``dllimport``: code 1
  * ``dllexport``: code 2

* *comdat*: An encoding of the COMDAT of this function

* *attributes*: If nonzero, the 1-based index into the table of AttributeLists.

.. _bcpreemptionspecifier:

* *preemptionspecifier*: If present, an encoding of the runtime preemption specifier of this variable:

  * ``dso_preemptable``: code 0
  * ``dso_local``: code 1

.. _FUNCTION:

MODULE_CODE_FUNCTION Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[FUNCTION, strtab offset, strtab size, type, callingconv, isproto, linkage, paramattr, alignment, section, visibility, gc, prologuedata, dllstorageclass, comdat, prefixdata, personalityfn, preemptionspecifier]``

The ``FUNCTION`` record (code 8) marks the declaration or definition of a
function. The operand fields are:

* *strtab offset*, *strtab size*: Specifies the name of the function.
  See `STRTAB_BLOCK Contents`_.

* *type*: The type index of the function type describing this function

* *callingconv*: The calling convention number:
  * ``ccc``: code 0
  * ``fastcc``: code 8
  * ``coldcc``: code 9
  * ``webkit_jscc``: code 12
  * ``anyregcc``: code 13
  * ``preserve_mostcc``: code 14
  * ``preserve_allcc``: code 15
  * ``swiftcc`` : code 16
  * ``cxx_fast_tlscc``: code 17
  * ``x86_stdcallcc``: code 64
  * ``x86_fastcallcc``: code 65
  * ``arm_apcscc``: code 66
  * ``arm_aapcscc``: code 67
  * ``arm_aapcs_vfpcc``: code 68

* isproto*: Non-zero if this entry represents a declaration rather than a
  definition

* *linkage*: An encoding of the `linkage type`_ for this function

* *paramattr*: If nonzero, the 1-based parameter attribute index into the table
  of `PARAMATTR_CODE_ENTRY`_ entries.

* *alignment*: The logarithm base 2 of the function's requested alignment, plus
  1

* *section*: If non-zero, the 1-based section index in the table of
  `MODULE_CODE_SECTIONNAME`_ entries.

* *visibility*: An encoding of the `visibility`_ of this function

* *gc*: If present and nonzero, the 1-based garbage collector index in the table
  of `MODULE_CODE_GCNAME`_ entries.

* *unnamed_addr*: If present, an encoding of the
  :ref:`unnamed_addr<bcunnamedaddr>` attribute of this function

* *prologuedata*: If non-zero, the value index of the prologue data for this function,
  plus 1.

* *dllstorageclass*: An encoding of the
  :ref:`dllstorageclass<bcdllstorageclass>` of this function

* *comdat*: An encoding of the COMDAT of this function

* *prefixdata*: If non-zero, the value index of the prefix data for this function,
  plus 1.

* *personalityfn*: If non-zero, the value index of the personality function for this function,
  plus 1.

* *preemptionspecifier*: If present, an encoding of the :ref:`runtime preemption specifier<bcpreemptionspecifier>`  of this function.
 
MODULE_CODE_ALIAS Record
^^^^^^^^^^^^^^^^^^^^^^^^

``[ALIAS, strtab offset, strtab size, alias type, aliasee val#, linkage, visibility, dllstorageclass, threadlocal, unnamed_addr, preemptionspecifier]``

The ``ALIAS`` record (code 9) marks the definition of an alias. The operand
fields are

* *strtab offset*, *strtab size*: Specifies the name of the alias.
  See `STRTAB_BLOCK Contents`_.

* *alias type*: The type index of the alias

* *aliasee val#*: The value index of the aliased value

* *linkage*: An encoding of the `linkage type`_ for this alias

* *visibility*: If present, an encoding of the `visibility`_ of the alias

* *dllstorageclass*: If present, an encoding of the
  :ref:`dllstorageclass<bcdllstorageclass>` of the alias

* *threadlocal*: If present, an encoding of the
  :ref:`thread local property<bcthreadlocal>` of the alias

* *unnamed_addr*: If present, an encoding of the
  :ref:`unnamed_addr<bcunnamedaddr>` attribute of this alias

* *preemptionspecifier*: If present, an encoding of the :ref:`runtime preemption specifier<bcpreemptionspecifier>`  of this alias.

.. _MODULE_CODE_GCNAME:

MODULE_CODE_GCNAME Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[GCNAME, ...string...]``

The ``GCNAME`` record (code 11) contains a variable number of values
representing the bytes of a single garbage collector name string. There should
be one ``GCNAME`` record for each garbage collector name referenced in function
``gc`` attributes within the module. These records can be referenced by 1-based
index in the *gc* fields of ``FUNCTION`` records.

.. _PARAMATTR_BLOCK:

PARAMATTR_BLOCK Contents
------------------------

The ``PARAMATTR_BLOCK`` block (id 9) contains a table of entries describing the
attributes of function parameters. These entries are referenced by 1-based index
in the *paramattr* field of module block `FUNCTION`_ records, or within the
*attr* field of function block ``INST_INVOKE`` and ``INST_CALL`` records.

Entries within ``PARAMATTR_BLOCK`` are constructed to ensure that each is unique
(i.e., no two indices represent equivalent attribute lists).

.. _PARAMATTR_CODE_ENTRY:

PARAMATTR_CODE_ENTRY Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[ENTRY, attrgrp0, attrgrp1, ...]``

The ``ENTRY`` record (code 2) contains a variable number of values describing a
unique set of function parameter attributes. Each *attrgrp* value is used as a
key with which to look up an entry in the attribute group table described
in the ``PARAMATTR_GROUP_BLOCK`` block.

.. _PARAMATTR_CODE_ENTRY_OLD:

PARAMATTR_CODE_ENTRY_OLD Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  This is a legacy encoding for attributes, produced by LLVM versions 3.2 and
  earlier. It is guaranteed to be understood by the current LLVM version, as
  specified in the :ref:`IR backwards compatibility` policy.

``[ENTRY, paramidx0, attr0, paramidx1, attr1...]``

The ``ENTRY`` record (code 1) contains an even number of values describing a
unique set of function parameter attributes. Each *paramidx* value indicates
which set of attributes is represented, with 0 representing the return value
attributes, 0xFFFFFFFF representing function attributes, and other values
representing 1-based function parameters. Each *attr* value is a bitmap with the
following interpretation:

* bit 0: ``zeroext``
* bit 1: ``signext``
* bit 2: ``noreturn``
* bit 3: ``inreg``
* bit 4: ``sret``
* bit 5: ``nounwind``
* bit 6: ``noalias``
* bit 7: ``byval``
* bit 8: ``nest``
* bit 9: ``readnone``
* bit 10: ``readonly``
* bit 11: ``noinline``
* bit 12: ``alwaysinline``
* bit 13: ``optsize``
* bit 14: ``ssp``
* bit 15: ``sspreq``
* bits 16-31: ``align n``
* bit 32: ``nocapture``
* bit 33: ``noredzone``
* bit 34: ``noimplicitfloat``
* bit 35: ``naked``
* bit 36: ``inlinehint``
* bits 37-39: ``alignstack n``, represented as the logarithm
  base 2 of the requested alignment, plus 1

.. _PARAMATTR_GROUP_BLOCK:

PARAMATTR_GROUP_BLOCK Contents
------------------------------

The ``PARAMATTR_GROUP_BLOCK`` block (id 10) contains a table of entries
describing the attribute groups present in the module. These entries can be
referenced within ``PARAMATTR_CODE_ENTRY`` entries.

.. _PARAMATTR_GRP_CODE_ENTRY:

PARAMATTR_GRP_CODE_ENTRY Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[ENTRY, grpid, paramidx, attr0, attr1, ...]``

The ``ENTRY`` record (code 3) contains *grpid* and *paramidx* values, followed
by a variable number of values describing a unique group of attributes. The
*grpid* value is a unique key for the attribute group, which can be referenced
within ``PARAMATTR_CODE_ENTRY`` entries. The *paramidx* value indicates which
set of attributes is represented, with 0 representing the return value
attributes, 0xFFFFFFFF representing function attributes, and other values
representing 1-based function parameters.

Each *attr* is itself represented as a variable number of values:

``kind, key [, ...], [value [, ...]]``

Each attribute is either a well-known LLVM attribute (possibly with an integer
value associated with it), or an arbitrary string (possibly with an arbitrary
string value associated with it). The *kind* value is an integer code
distinguishing between these possibilities:

* code 0: well-known attribute
* code 1: well-known attribute with an integer value
* code 3: string attribute
* code 4: string attribute with a string value

For well-known attributes (code 0 or 1), the *key* value is an integer code
identifying the attribute. For attributes with an integer argument (code 1),
the *value* value indicates the argument.

For string attributes (code 3 or 4), the *key* value is actually a variable
number of values representing the bytes of a null-terminated string. For
attributes with a string argument (code 4), the *value* value is similarly a
variable number of values representing the bytes of a null-terminated string.

The integer codes are mapped to well-known attributes as follows.

* code 1: ``align(<n>)``
* code 2: ``alwaysinline``
* code 3: ``byval``
* code 4: ``inlinehint``
* code 5: ``inreg``
* code 6: ``minsize``
* code 7: ``naked``
* code 8: ``nest``
* code 9: ``noalias``
* code 10: ``nobuiltin``
* code 11: ``nocapture``
* code 12: ``noduplicates``
* code 13: ``noimplicitfloat``
* code 14: ``noinline``
* code 15: ``nonlazybind``
* code 16: ``noredzone``
* code 17: ``noreturn``
* code 18: ``nounwind``
* code 19: ``optsize``
* code 20: ``readnone``
* code 21: ``readonly``
* code 22: ``returned``
* code 23: ``returns_twice``
* code 24: ``signext``
* code 25: ``alignstack(<n>)``
* code 26: ``ssp``
* code 27: ``sspreq``
* code 28: ``sspstrong``
* code 29: ``sret``
* code 30: ``sanitize_address``
* code 31: ``sanitize_thread``
* code 32: ``sanitize_memory``
* code 33: ``uwtable``
* code 34: ``zeroext``
* code 35: ``builtin``
* code 36: ``cold``
* code 37: ``optnone``
* code 38: ``inalloca``
* code 39: ``nonnull``
* code 40: ``jumptable``
* code 41: ``dereferenceable(<n>)``
* code 42: ``dereferenceable_or_null(<n>)``
* code 43: ``convergent``
* code 44: ``safestack``
* code 45: ``argmemonly``
* code 46: ``swiftself``
* code 47: ``swifterror``
* code 48: ``norecurse``
* code 49: ``inaccessiblememonly``
* code 50: ``inaccessiblememonly_or_argmemonly``
* code 51: ``allocsize(<EltSizeParam>[, <NumEltsParam>])``
* code 52: ``writeonly``
* code 53: ``speculatable``
* code 54: ``strictfp``
* code 55: ``sanitize_hwaddress``
* code 56: ``nocf_check``
* code 57: ``optforfuzzing``
* code 58: ``shadowcallstack``

.. note::
  The ``allocsize`` attribute has a special encoding for its arguments. Its two
  arguments, which are 32-bit integers, are packed into one 64-bit integer value
  (i.e. ``(EltSizeParam << 32) | NumEltsParam``), with ``NumEltsParam`` taking on
  the sentinel value -1 if it is not specified.

.. _TYPE_BLOCK:

TYPE_BLOCK Contents
-------------------

The ``TYPE_BLOCK`` block (id 17) contains records which constitute a table of
type operator entries used to represent types referenced within an LLVM
module. Each record (with the exception of `NUMENTRY`_) generates a single type
table entry, which may be referenced by 0-based index from instructions,
constants, metadata, type symbol table entries, or other type operator records.

Entries within ``TYPE_BLOCK`` are constructed to ensure that each entry is
unique (i.e., no two indices represent structurally equivalent types).

.. _TYPE_CODE_NUMENTRY:
.. _NUMENTRY:

TYPE_CODE_NUMENTRY Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[NUMENTRY, numentries]``

The ``NUMENTRY`` record (code 1) contains a single value which indicates the
total number of type code entries in the type table of the module. If present,
``NUMENTRY`` should be the first record in the block.

TYPE_CODE_VOID Record
^^^^^^^^^^^^^^^^^^^^^

``[VOID]``

The ``VOID`` record (code 2) adds a ``void`` type to the type table.

TYPE_CODE_HALF Record
^^^^^^^^^^^^^^^^^^^^^

``[HALF]``

The ``HALF`` record (code 10) adds a ``half`` (16-bit floating point) type to
the type table.

TYPE_CODE_FLOAT Record
^^^^^^^^^^^^^^^^^^^^^^

``[FLOAT]``

The ``FLOAT`` record (code 3) adds a ``float`` (32-bit floating point) type to
the type table.

TYPE_CODE_DOUBLE Record
^^^^^^^^^^^^^^^^^^^^^^^

``[DOUBLE]``

The ``DOUBLE`` record (code 4) adds a ``double`` (64-bit floating point) type to
the type table.

TYPE_CODE_LABEL Record
^^^^^^^^^^^^^^^^^^^^^^

``[LABEL]``

The ``LABEL`` record (code 5) adds a ``label`` type to the type table.

TYPE_CODE_OPAQUE Record
^^^^^^^^^^^^^^^^^^^^^^^

``[OPAQUE]``

The ``OPAQUE`` record (code 6) adds an ``opaque`` type to the type table, with
a name defined by a previously encountered ``STRUCT_NAME`` record. Note that
distinct ``opaque`` types are not unified.

TYPE_CODE_INTEGER Record
^^^^^^^^^^^^^^^^^^^^^^^^

``[INTEGER, width]``

The ``INTEGER`` record (code 7) adds an integer type to the type table. The
single *width* field indicates the width of the integer type.

TYPE_CODE_POINTER Record
^^^^^^^^^^^^^^^^^^^^^^^^

``[POINTER, pointee type, address space]``

The ``POINTER`` record (code 8) adds a pointer type to the type table. The
operand fields are

* *pointee type*: The type index of the pointed-to type

* *address space*: If supplied, the target-specific numbered address space where
  the pointed-to object resides. Otherwise, the default address space is zero.

TYPE_CODE_FUNCTION_OLD Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. note::
  This is a legacy encoding for functions, produced by LLVM versions 3.0 and
  earlier. It is guaranteed to be understood by the current LLVM version, as
  specified in the :ref:`IR backwards compatibility` policy.

``[FUNCTION_OLD, vararg, ignored, retty, ...paramty... ]``

The ``FUNCTION_OLD`` record (code 9) adds a function type to the type table.
The operand fields are

* *vararg*: Non-zero if the type represents a varargs function

* *ignored*: This value field is present for backward compatibility only, and is
  ignored

* *retty*: The type index of the function's return type

* *paramty*: Zero or more type indices representing the parameter types of the
  function

TYPE_CODE_ARRAY Record
^^^^^^^^^^^^^^^^^^^^^^

``[ARRAY, numelts, eltty]``

The ``ARRAY`` record (code 11) adds an array type to the type table.  The
operand fields are

* *numelts*: The number of elements in arrays of this type

* *eltty*: The type index of the array element type

TYPE_CODE_VECTOR Record
^^^^^^^^^^^^^^^^^^^^^^^

``[VECTOR, numelts, eltty]``

The ``VECTOR`` record (code 12) adds a vector type to the type table.  The
operand fields are

* *numelts*: The number of elements in vectors of this type

* *eltty*: The type index of the vector element type

TYPE_CODE_X86_FP80 Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[X86_FP80]``

The ``X86_FP80`` record (code 13) adds an ``x86_fp80`` (80-bit floating point)
type to the type table.

TYPE_CODE_FP128 Record
^^^^^^^^^^^^^^^^^^^^^^

``[FP128]``

The ``FP128`` record (code 14) adds an ``fp128`` (128-bit floating point) type
to the type table.

TYPE_CODE_PPC_FP128 Record
^^^^^^^^^^^^^^^^^^^^^^^^^^

``[PPC_FP128]``

The ``PPC_FP128`` record (code 15) adds a ``ppc_fp128`` (128-bit floating point)
type to the type table.

TYPE_CODE_METADATA Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[METADATA]``

The ``METADATA`` record (code 16) adds a ``metadata`` type to the type table.

TYPE_CODE_X86_MMX Record
^^^^^^^^^^^^^^^^^^^^^^^^

``[X86_MMX]``

The ``X86_MMX`` record (code 17) adds an ``x86_mmx`` type to the type table.

TYPE_CODE_STRUCT_ANON Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[STRUCT_ANON, ispacked, ...eltty...]``

The ``STRUCT_ANON`` record (code 18) adds a literal struct type to the type
table. The operand fields are

* *ispacked*: Non-zero if the type represents a packed structure

* *eltty*: Zero or more type indices representing the element types of the
  structure

TYPE_CODE_STRUCT_NAME Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[STRUCT_NAME, ...string...]``

The ``STRUCT_NAME`` record (code 19) contains a variable number of values
representing the bytes of a struct name. The next ``OPAQUE`` or
``STRUCT_NAMED`` record will use this name.

TYPE_CODE_STRUCT_NAMED Record
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``[STRUCT_NAMED, ispacked, ...eltty...]``

The ``STRUCT_NAMED`` record (code 20) adds an identified struct type to the
type table, with a name defined by a previously encountered ``STRUCT_NAME``
record. The operand fields are

* *ispacked*: Non-zero if the type represents a packed structure

* *eltty*: Zero or more type indices representing the element types of the
  structure

TYPE_CODE_FUNCTION Record
^^^^^^^^^^^^^^^^^^^^^^^^^

``[FUNCTION, vararg, retty, ...paramty... ]``

The ``FUNCTION`` record (code 21) adds a function type to the type table. The
operand fields are

* *vararg*: Non-zero if the type represents a varargs function

* *retty*: The type index of the function's return type

* *paramty*: Zero or more type indices representing the parameter types of the
  function

.. _CONSTANTS_BLOCK:

CONSTANTS_BLOCK Contents
------------------------

The ``CONSTANTS_BLOCK`` block (id 11) ...

.. _FUNCTION_BLOCK:

FUNCTION_BLOCK Contents
-----------------------

The ``FUNCTION_BLOCK`` block (id 12) ...

In addition to the record types described below, a ``FUNCTION_BLOCK`` block may
contain the following sub-blocks:

* `CONSTANTS_BLOCK`_
* `VALUE_SYMTAB_BLOCK`_
* `METADATA_ATTACHMENT`_

.. _VALUE_SYMTAB_BLOCK:

VALUE_SYMTAB_BLOCK Contents
---------------------------

The ``VALUE_SYMTAB_BLOCK`` block (id 14) ...

.. _METADATA_BLOCK:

METADATA_BLOCK Contents
-----------------------

The ``METADATA_BLOCK`` block (id 15) ...

.. _METADATA_ATTACHMENT:

METADATA_ATTACHMENT Contents
----------------------------

The ``METADATA_ATTACHMENT`` block (id 16) ...

.. _STRTAB_BLOCK:

STRTAB_BLOCK Contents
---------------------

The ``STRTAB`` block (id 23) contains a single record (``STRTAB_BLOB``, id 1)
with a single blob operand containing the bitcode file's string table.

Strings in the string table are not null terminated. A record's *strtab
offset* and *strtab size* operands specify the byte offset and size of a
string within the string table.

The string table is used by all preceding blocks in the bitcode file that are
not succeeded by another intervening ``STRTAB`` block. Normally a bitcode
file will have a single string table, but it may have more than one if it
was created by binary concatenation of multiple bitcode files.
