Files
revng-revng/include/revng/Model/model-schema.yml
Pietro Fezzardi 306e8a93f1 Add OpaqueTypePrefix to model schema
Add an OpaqueTypePrefix string to the model configuration with
default `opaque_type_`. This is used to build the C name of the
artificial structs that wrap model array types and keeps the prefix
configurable alongside the other artificial-name prefixes.
2026-05-08 11:37:10 +02:00

1839 lines
51 KiB
YAML

#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
version: 9
root_type: Binary
definitions:
#
# Binary (the model Root)
#
- name: Binary
type: struct
doc: |-
Data structure representing the whole binary.
This is the entry point of the model.
It contains the type system (`TypeDefinitions`),
the list of functions (`Functions`), loading information (`Segments`),
and more.
fields:
- name: Architecture
doc: The architecture for this binary.
type: Architecture
- name: OperatingSystem
doc: The operating system for this binary.
type: OperatingSystem
- name: PlatformName
doc: |-
The name of the platform for this binary (e.g. ubuntu-24-04-x86-64).
Used to look up prototypes in the database. If empty, the best
platform is elected based on Architecture and OperatingSystem.
type: string
- name: EntryPoint
doc: The program entry point, if any.
type: MetaAddress
- name: DefaultABI
doc: The default ABI to adopt for analysis purposes.
type: ABI
- name: TargetABI
doc: The target ABI to adopt for emission purposes.
type: ABI
- name: DefaultPrototype
doc: |-
The default function prototype to adopt for functions that do not provide
it explicitly.
type: Type
- name: Configuration
doc: Project-level artifact configuration options
type: Configuration
- name: Binaries
doc: |-
A list of binaries used in this project. Currently only limited to 0
or 1 elements.
This is currently optional and a Model is valid without any Binaries
specified. This is done as a transitional measure as the new
experimental pipeline is implemented. Eventually this limitation will
be lifted and each element of `Segments` will need to reference a
binary present in `Binaries`.
Do note that, even in this transitional phase, running some pipes in
the new experimental pipeline will lead to an error being thrown if
`Binaries` is empty.
sequence:
type: SortedVector
elementType: BinaryIdentifier
- name: Segments
doc: |-
`Segment`s represent instructions on what part of the raw binary needs to
be loaded at which address.
sequence:
type: SortedVector
elementType: Segment
- name: ExtraCodeAddresses
doc: |-
A list of addresses known to contain code.
rev.ng is usually able to discover all the code by itself by recursively
visiting the control-flow graph of functions and the call graph.
However, certain pieces of code cannot be identified through these
techniques.
A prime example are the addresses of `catch` blocks of C++ exception
handlers: no code ever directly jumps there and their address is not
stored in jump tables. Their address can only be obtained by interpreting
metadata in the ELF.
sequence:
type: SortedVector
elementType: MetaAddress
- name: ImportedLibraries
doc: |-
The list of imported libraries identified by their file name.
For instance, if the input binary is linked to OpenSSL, this list would
should `libcrypto.so.1.1`.
sequence:
type: SortedVector
elementType: string
- name: ImportedDynamicFunctions
doc: List of functions imported from dynamic libraries (`.so`, `.dll`).
sequence:
type: SortedVector
elementType: DynamicFunction
- name: Functions
doc: List of the functions present in the binary.
sequence:
type: SortedVector
elementType: Function
- name: TypeDefinitions
doc: |-
The set of types used in this binary.
It contains `struct`, `union`, `typedef`, `enum` and function prototypes.
sequence:
type: SortedVector
elementType: TypeDefinition
#
# Type definition system
#
- name: TypeDefinition
type: struct
doc: |-
Base data structure for all the type definitions.
A type definition differs from a `Type` in the fact that it has an identity.
In fact, while two identical instances of `Type` can be considered to be the
same `Type`, two instances of a `TypeDefinition` that only differ from their
`ID` are two distinct types.
A type definition can be a `struct`, a `union`, a `typedef`, an `enum` or a
function prototype.
key:
- ID
- Kind
abstract: true
fields:
- name: ID
doc: |-
A unique numeric identifier for this type.
type: uint64_t
is_guid: true
default: -1
- name: Kind
doc: |-
Specifies which of the children classes this object is upcastable to.
type: TypeDefinitionKind
- name: Name
doc: A user-chosen identifier for this type.
type: string
- name: Comment
doc: |-
A comment attached to the *definition* of this type.
type: string
- name: CABIFunctionDefinition
inherits: TypeDefinition
type: struct
doc: |-
The function type described through a C-like prototype plus an ABI.
This is an "high level" representation of the prototype of a function. It is
expressed as list of arguments composed by an index and a type. No
information about the register is embedded. That information is implicit in
the ABI this type is associated to.
In contrast, a `RawFunctionType` is not associated to any ABI and explicitly
describes, among other things, what registers are used to pass arguments and
return values.
fields:
- name: ABI
doc: The C ABI associated to this function type.
type: ABI
- name: ReturnType
doc: The function return type.
type: Type
- name: ReturnValueComment
doc: |-
A comment that will be emitted as part of this function's definiktion
in the `\returns ${COMMENT_TEXT}` shape.
type: string
- name: Arguments
doc: The list of formal arguments of the function type.
sequence:
type: SortedVector
elementType: Argument
- name: Argument
type: struct
doc: |-
The argument of a `CABIFunctionType`.
key:
- Index
fields:
- name: Index
doc: The argument index.
type: uint64_t
default: -1
- name: Name
doc: The name of the argument.
type: string
- name: Comment
doc: |-
A comment that will be emitted as part of this function's definition
in the `\param ${NAME} ${COMMENT}` shape.
type: string
- name: Type
doc: The type of the argument.
type: Type
- name: EnumDefinition
inherits: TypeDefinition
type: struct
doc: |-
An `enum` type definition.
fields:
- name: UnderlyingType
doc: |-
The underlying type of the `enum`.
This must only ever be set to a `PrimitiveType` with either
an `Unsigned` or a `Signed` kind.
type: Type
- name: Entries
doc: |-
The entries of the `enum`.
There can be no two entries associated to the same value.
sequence:
type: SortedVector
elementType: EnumEntry
- name: EnumEntry
type: struct
doc: An entry in an `enum`.
key:
- Value
fields:
- name: Value
doc: |-
The value associated to this `enum` entry.
Has to be unique within the `enum`.
type: uint64_t
- name: Name
doc: |-
A user-chosen identifier for this `enum` entry.
type: string
- name: Comment
doc: |-
A comment that will be emitted right before the *definition* of this
`enum` entry.
type: string
- name: RawFunctionDefinition
inherits: TypeDefinition
type: struct
doc: |-
The function type described by explicitly listing how arguments and return
values are passed.
This is a "low level" representation of the prototype of a function. Where
the list of registers used to pass arguments and return values is explicitl.
For stack arguments, they are collected in a single `struct`
(`StackArgumentsType`).
In contrast, a `CABIFunctionDefinition` expresses the function type from a
high-level perspective (e.g., a single argument might span multiple registers)
and his associated to a well-known ABI. Given an ABI, it is always possible
to convert a `CABIFunctionDefinition` into a `RawFunctionDefinition`.
fields:
- name: Architecture
doc: The processor architecture of this function type.
type: Architecture
- name: Arguments
doc: |-
The list of registers used to pass arguments.
The registers must belong to the `Architecture`.
sequence:
type: SortedVector
elementType: NamedTypedRegister
- name: ReturnValues
doc: |-
The list of registers used to return values.
The registers must belong to the `Architecture`.
sequence:
type: SortedVector
elementType: NamedTypedRegister
- name: ReturnValueComment
doc: |-
A comment that will be emitted as part of this function's definition
in the `\returns ${COMMENT}` shape.
type: string
- name: PreservedRegisters
doc: |-
The list of registers preserved by functions using this function type.
The registers must belong to `Architecture`.
sequence:
type: SortedVector
elementType: Register
- name: FinalStackOffset
doc: |-
The expected difference between the initial and final value of the stack
pointer.
For instance, in the x86-64 SystemV ABI, the difference between the
initial and final value of the stack pointer is 8.
This is due to the fact that `ret` instruction increase the stack pointer
by 8.
type: uint64_t
- name: StackArgumentsType
doc: The type of the `struct` representing all of the stack arguments.
type: Type
- name: NamedTypedRegister
type: struct
doc: |-
An argument or a return value in a `RawFunctionDefinition`.
It is basically a pair of a register and a `Type`.
key:
- Location
fields:
- name: Location
doc: The register this argument or return value is created for.
type: Register
- name: Name
doc: The name for this argument or return value.
type: string
- name: Comment
doc: The comment for this argument or return value.
type: string
- name: Type
doc: The type of this argument or return value.
type: Type
- name: TypedefDefinition
inherits: TypeDefinition
type: struct
doc: |-
A `typedef` type.
Note, that unlike in C, in our type system two `typedef`s aliasing
the same type are actually distinct types.
fields:
- name: UnderlyingType
doc: The type this `typedef` is aliasing.
type: Type
- name: StructDefinition
inherits: TypeDefinition
type: struct
doc: |-
A `struct` type.
fields:
- name: Size
doc: The size, in bytes, of the `struct`.
type: uint64_t
- name: CanContainCode
doc: |-
When this field is set to `true` *and* this `struct` is reachable for
a segment's root type without traversing pointers, arrays or other
qualifiers, the padding of the struct is treated at if it contains code.
type: bool
- name: Fields
doc: The list of fields of this `struct`.
sequence:
type: SortedVector
elementType: StructField
- name: StructField
type: struct
doc: |-
A field of a `StructDefinition`.
It is composed by the offset of the field and its type.
key:
- Offset
fields:
- name: Offset
doc: The number of bytes in the given struct before this field.
type: uint64_t
- name: Name
doc: The name of this field.
type: string
- name: Comment
doc: The comment that will be emitted before this field's *definition*.
type: string
- name: Type
doc: The type of the field.
type: Type
- name: UnionDefinition
inherits: TypeDefinition
type: struct
doc: |-
A `union` type.
fields:
- name: Fields
doc: The list of alternative types in this `union`.
sequence:
type: SortedVector
elementType: UnionField
- name: UnionField
type: struct
doc: |-
Specifies one of the possible types a given `UnionDefinition` can assume.
It is composed by a index and the `Type`.
key:
- Index
fields:
- name: Index
doc: |
A numeric index unique within a given `UnionDefinition`.
Note that indexing is dense, so if a given union has a type with
index 4, it must also have types indexed 0-3.
type: uint64_t
default: -1
- name: Name
doc: The name of this "field" (union alternative).
type: string
- name: Comment
doc: |-
The comment that will be emitted right before the *definition*
of the given "field" (union alternative).
type: string
- name: Type
doc: The name of this "field" (union alternative).
type: Type
#
# Type wrapping system (pointers / arrays / primitives)
#
- name: Type
type: struct
doc: |-
A type such as an array, a pointer, a primitive or a defined type.
abstract: true
fields:
- name: Kind
doc: |-
Specifies which of the children classes this object is upcastable to.
type: TypeKind
- name: IsConst
doc: Specifies whether the type this object denotes is `const` or not.
type: bool
- name: PrimitiveType
inherits: Type
type: struct
doc: |-
A Primitive type defined by its kind (signed, float, etc) and size.
fields:
- name: PrimitiveKind
doc: |-
Specifies whether this primitive type is `Signed`, `Float`,
`PointerOrNumber`, and so on.
type: PrimitiveKind
- name: Size
doc: |-
Specifies the size of this primitive type.
As of now, supported sizes include
```
{ 1, 2, 4, 8, 16 }
```
Note that *only* floating point primitives (and `Generic` primitives,
whose kind is not known, so they are assumed to be floating point
compatible) can also have additional sizes:
```
{ 10, 12 }
```
Note that 1-byte floating point primitives are not allowed.
Note that `Void` *must* have size of 0.
type: uint64_t
default: -1
- name: PrimitiveKind
type: enum
doc: |-
The kind of a primitive type.
members:
- name: Void
doc: The `void` type.
- name: Generic
doc: |-
The most generic primitive kind: it can be any of the other primitive
kinds, except for `Void`.
- name: PointerOrNumber
doc: |-
A kind representing either a `Number` kind or a pointer.
This can also be seen as not-a-`Float`.
- name: Number
doc: |-
A two's complement integer number, either `Signed` or `Unsigned`.
- name: Unsigned
doc: |-
An `unsigned` two's complement integer number.
- name: Signed
doc: |-
An `signed` two's complement integer number.
- name: Float
doc: |-
A IEEE 754 floating point number.
- name: PointerType
inherits: Type
type: struct
doc: A pointer type.
fields:
- name: PointerSize
doc: |
The size of the pointer.
As of now, only 4 and 8 byte pointers are supported.
type: uint64_t
default: -1
- name: PointeeType
doc: The pointee type.
type: Type
- name: DefinedType
inherits: Type
type: struct
doc: A reference to a `TypeDefinition`.
fields:
- name: Definition
doc: The definition of the type this object represents.
referenceTo: TypeDefinition
- name: ArrayType
inherits: Type
type: struct
doc: |-
An array of `Type`s.
fields:
- name: ElementCount
doc: The number of elements in this array.
type: uint64_t
default: -1
- name: ElementType
doc: The type of the elements in this array.
type: Type
#
# Segments and function in the binary
#
- name: BinaryIdentifier
type: struct
doc: |-
Information needed to identify a single binary in the project
key:
- Index
fields:
- name: Index
doc: The identifier index
type: uint64_t
- name: Hash
doc: The sha256 hash of the binary (in hexadecimal)
type: string
- name: Size
doc: The size of the binary (in bytes)
type: uint64_t
- name: CanonicalPath
doc: |-
The path of the binary in its "canonical" position (if sensible).
For instance, for `sh`, it makes sense to use `/bin/sh`.
This enables to lookup debug information and libraries relative to its
"canonical" position.
Moreover, if `Hash` is not enough to obtain the actual content of the
binary, this field will be used to perform a fuzzy search in sensible
place.
In case of Windows binaries, use UNIX paths relative to C:\ (e.g., use
/Windows for C:\Windows).
type: string
- name: Segment
type: struct
doc: |-
A segment contains the information necessary for rev.ng to load the executable
in memory.
key:
- StartAddress
- VirtualSize
fields:
- name: Binary
doc: The binary from where the segment is loaded from.
referenceTo: BinaryIdentifier
- name: StartAddress
doc: The address at which this segment should be loaded.
type: MetaAddress
- name: VirtualSize
doc: |-
The size of this segment in memory.
If this value is greater than `FileSize`, the discrepancy is considered to
full of `0`s.
type: uint64_t
- name: StartOffset
doc: Start file offset from which the segment will be loaded.
type: uint64_t
- name: FileSize
doc: Number of bytes that will be loaded in memory from the file.
type: uint64_t
- name: IsReadable
doc: Is this segment readable?
type: bool
- name: IsWriteable
doc: Is this segment writable?
type: bool
- name: IsExecutable
doc: Is this segment executable?
type: bool
- name: Name
doc: The name of the segment.
type: string
- name: Comment
doc: |-
The comment to emit right before the global variable that will be
created for this segment.
type: string
- name: Type
doc: |-
The struct type associated to this segment.
Informally, each field of such a `struct` is a global variable.
type: Type
- name: CanonicalRegisterValues
doc: |-
The list of registers that are assumed to have a canonical value set
upon an entry into a function contained within this segment.
sequence:
type: SortedVector
elementType: CanonicalRegisterValue
- name: Relocations
doc: |-
A list of locations where the address of this segment should be
placed.
sequence:
type: SortedVector
elementType: Relocation
- name: Function
type: struct
doc: A function defined within this binary.
key:
- Entry
fields:
- name: Entry
doc: |-
The address of the entry point.
Note: this does not necessarily correspond to the address of the basic
block with the lowest address.
type: MetaAddress
- name: Name
doc: The user-provided name for this function.
type: string
- name: Comment
doc: The user-provided comment for this function.
type: string
- name: StackFrame
doc: The function stack frame.
type: StackFrame
- name: Prototype
doc: The prototype of the function.
type: Type
- name: Attributes
doc: Attributes for *every* call site.
sequence:
type: MutableSet
elementType: FunctionAttribute
- name: CallSitePrototypes
doc: |-
Information about specific call sites within this function.
sequence:
type: SortedVector
elementType: CallSitePrototype
- name: ExportedNames
doc: |-
The list of names used to make this function available as a dynamic
symbol.
sequence:
type: SortedVector
elementType: string
- name: Comments
doc: |-
The list of comments attached to statements (e.g., disassembled
instructions or C statements) within the body of this function.
sequence:
type: SortedVector
elementType: StatementComment
- name: LocalVariables
doc: |-
The list of *named* local variables within this function's body.
sequence:
type: SortedVector
elementType: LocalIdentifier
- name: GotoLabels
doc: |-
The list of *named* goto labels within this function's body.
sequence:
type: SortedVector
elementType: LocalIdentifier
- name: DynamicFunction
type: struct
doc: A function defined in a dynamic library.
key:
- Name
fields:
- name: Name
doc: |-
The name of the symbol for this dynamic function.
Currently, this must not contain `/`s and `\n`s. This restriction will
eventually be lifted, when proper escaping is in place.
type: string
- name: Comment
doc: The user-provided comment for this dynamic function.
type: string
- name: Prototype
doc: The prototype of this dynamic function.
type: Type
- name: Attributes
doc: The attributes of this dynamic function.
sequence:
type: MutableSet
elementType: FunctionAttribute
- name: Relocations
doc: |-
A list of locations where the address of this dynamic function should
be placed.
sequence:
type: SortedVector
elementType: Relocation
- name: StackFrame
type: struct
doc: |-
Function stack frame information.
fields:
- name: Type
doc: Type of the function stack frame.
type: Type
- name: Name
doc: The user-provided name for the stack frame variable.
type: string
- name: Comment
doc: The user-provided comment attached to the stack frame variable.
type: string
- name: LocalIdentifier
type: struct
doc: |-
The common type for attaching metadata (like names) to function-local
identifiers (like variables and labels).
key:
# Using the name as the key might not be the best from the invalidation
# standpoint, as renaming any variable would invalidate the entire set.
#
# On the other hand, this reduces potential duplication friction.
# As well as allows us to avoid an artificial key (like index).
- Name
fields:
- name: Name
doc: The user-provided name for this variable or label.
type: string
- name: Location
doc: |-
The set of `MetaAddress`es of the instructions using this variable (or label).
sequence:
type: SortedVector
elementType: MetaAddress
- name: Relocation
type: struct
doc: |-
A relocation, i.e., a directive to write the address of an object (a
`DynamicFunction` or a `Segment`) at a specific address.
Optionally, the address of the object can be modified with a constant offset.
key:
- Address
- Type
fields:
- name: Address
doc: Where to write the address of the object.
type: MetaAddress
- name: Type
doc: |-
How to write the address of the object (e.g., 32-bit vs 64-bit
integer).
type: RelocationType
- name: Addend
doc: Fixed offset to add when writing the address of the object.
type: uint64_t
- name: RelocationType
type: enum
doc: |-
A enumeration describing how a `Relocation` should be written at the target
address.
members:
- name: WriteAbsoluteAddress32
doc: Write the absolute address of the object as a 32-bit integer.
- name: WriteAbsoluteAddress64
doc: Write the absolute address of the object as a 64-bit integer.
- name: AddAbsoluteAddress32
doc: |-
Add to the 32-bit integer present at the target location the absolute
address of the object.
- name: AddAbsoluteAddress64
doc: |-
Add to the 64-bit integer present at the target location the absolute
address of the object.
- name: WriteRelativeAddress32
doc: |-
Write the address of the object as a 32-bit integer, expressed as a
relative from the target of the relocation.
- name: WriteRelativeAddress64
doc: |-
Write the address of the object as a 64-bit integer, expressed as a
relative from the target of the relocation.
- name: AddRelativeAddress32
doc: |-
Add to the 32-bit integer present at the target location the address of
the object, expressed as a relative from the target of the relocation.
- name: AddRelativeAddress64
doc: |-
Add to the 32-bit integer present at the target location the address of
the object, expressed as a relative from the target of the relocation.
- name: CallSitePrototype
type: struct
doc: Information about the prototype of a specific callsite within a `Function`.
key:
- CallerBlockAddress
fields:
- name: CallerBlockAddress
doc: Address of the basic block of the call.
type: MetaAddress
- name: Prototype
doc: The prototype specific to *this* call site.
type: Type
- name: IsTailCall
doc: Whether this call site is a tail call or not.
type: bool
- name: Attributes
doc: Attributes for this call site.
sequence:
type: MutableSet
elementType: FunctionAttribute
- name: FunctionAttribute
type: enum
doc: |-
Attributes for function calls. They can either be applied to specific call
sites, or to *all* the call sites of a specific function.
members:
- name: NoReturn
doc: The function call does not return.
- name: AlwaysInline
doc: The function call must always be inlined in the caller.
- name: StatementComment
type: struct
doc: |-
A comment that can be attached to a statement in the decompiled code
*if* we have a way to uniquely identify said statement.
key:
- Index
fields:
- name: Index
doc: |-
The index of the comment.
# Note that this is used exclusively to simplify lookup of
# the *existing* comments. This way address set doesn't need to be
# encoded in the location and any emitted comment can be looked up (and,
# consecutively, edited) based on this index alone.
type: uint64_t
default: -1
- name: Location
doc: |-
The point this comment is attached to, encoded as a set of addresses.
When emitted artifact contains a statement with a set of addresses exactly
matching the set provided here, the comment is emitted before that
statement.
If there's no such statement, one is chosen based on how similar its
address set is to the address set of the comment.
Note that the same comment can be emitted multiple times if there are
multiple statements (that do *not* dominate each other) with the same
address set.
sequence:
type: SortedVector
elementType: MetaAddress
- name: Body
doc: The text of the comment.
type: string
#
# Important enums
#
- name: Architecture
type: enum
doc: |-
An enum listing all the currently supported architectures.
members:
- name: x86
- name: x86_64
- name: arm
- name: aarch64
- name: mips
- name: mipsel
- name: systemz
- name: OperatingSystem
type: enum
doc: |-
An enum listing all the currently supported operating systems.
members:
- name: Linux
- name: Windows
- name: MacOS
- name: ABI
type: enum
doc: |-
An enum listing all the currently supported ABIs.
members:
- name: SystemV_x86_64
doc: |-
64-bit SystemV ABI for x86 processor architecture
([reference](https://gitlab.com/x86-psABIs/x86-64-ABI)).
- name: SystemV_x86
doc: |-
32-bit SystemV ABI for x86 processor architecture ([reference][abi1]).
[abi1]: https://gitlab.com/x86-psABIs/i386-ABI/-/tree/hjl/x86/master
- name: SystemV_x86_regparm_3
doc: |-
A GCC specific modification of the 32-bit SystemV ABI for x86 processor
architecture. It allows three first GPR-sized arguments to be passed
using the EAX, EDX, and ECX registers.
See the reference for `regparm` x86 function attribute.
- name: SystemV_x86_regparm_2
doc: |-
A GCC specific modification of the 32-bit SystemV ABI for x86 processor
architecture. It allows two first GPR-sized arguments to be passed
using the EAX, and ECX registers.
See the GCC documentation for `regparm` x86 function attribute.
- name: SystemV_x86_regparm_1
doc: |-
A GCC specific modification of the 32-bit SystemV ABI for x86 processor
architecture. It allows the first GPR-sized argument to be passed
using the EAX register.
See the GCC documentation for `regparm` x86 function attribute.
- name: Microsoft_x86_64
doc: |-
64-bit Microsoft ABI for x86 processor architecture
([reference][abi2]).
[abi2]: https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
- name: Microsoft_x86_64_vectorcall
doc: |-
A modification of 64-bit Microsoft ABI for x86 processor architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/vectorcall)).
It allows using extra vector registers for passing function arguments.
- name: Microsoft_x86_cdecl
doc: |-
The default 32-bit Microsoft ABI for x86 processor architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/cdecl)).
It was indented to be compatible with `SystemV_x86` but there are slight
differences.
- name: Microsoft_x86_cdecl_gcc
doc: |-
32-bit Microsoft x86 `cdecl` abi as implemented in GCC (subtly different
from the original).
- name: Microsoft_x86_stdcall
doc: |-
A modification of the 32-bit `__cdecl` Microsoft ABI for x86 processor
architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/stdcall)).
The main difference is the fact that the callee is responsible for stack
cleanup instead of the caller.
- name: Microsoft_x86_stdcall_gcc
doc: |-
32-bit Microsoft x86 `stdcall` abi as implemented in GCC (subtly different
from the original).
- name: Microsoft_x86_thiscall
doc: |-
A modification of the 32-bit `__stdcall` Microsoft ABI for x86 processor
architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/thiscall)).
The main difference is the fact that it allows to pass a
single (the first) function argument using a register. This ABI is only
used for member function call where the first argument is always a `this`
pointer.
- name: Microsoft_x86_fastcall
doc: |-
A modification of the 32-bit `__stdcall` Microsoft ABI for x86 processor
architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/fastcall)).
The main difference is the fact that it allows to pass two
first GPR-sized non-aggregate function arguments in registers.
- name: Microsoft_x86_fastcall_gcc
doc: |-
32-bit Microsoft x86 `fastcall` abi as implemented in GCC (subtly
different from the original).
- name: Microsoft_x86_vectorcall
doc: |-
A modification of the 32-bit `__fastcall` Microsoft ABI for x86 processor
architecture
([reference](https://docs.microsoft.com/en-us/cpp/cpp/vectorcall)).
It allows using extra vector registers for passing function arguments.
- name: AAPCS64
doc: |-
Stands for `Arm Architecture Procedure Call Standard (64-bit)`
([reference](https://github.com/ARM-software/abi-aa/releases)).
The official ABI for AArch64 (ARM64) processor architecture.
- name: Microsoft_AAPCS64
doc: |-
Stands for "Arm Architecture Procedure Call Standard (64-bit)".
This represents the version of the ABI used by windows-on-arm.
For differences from the original ABI see the [reference][ab3].
[ab3]: https://learn.microsoft.com/cpp/build/arm64-windows-abi-conventions
- name: Apple_AAPCS64
doc: "Stands for \"Arm Architecture Procedure Call Standard (64-bit)\".\n
This represents the version of the ABI used by the apple products.\n
For differences from the original ABI see the [reference](\
https://developer.apple.com/documentation/xcode/writing-arm64-
code-for-apple-platforms)."
- name: AAPCS
doc: |-
Stands for "Arm Architecture Procedure Call Standard"
([reference](https://github.com/ARM-software/abi-aa/releases)).
The official ABI for ARM processor architecture.
- name: SystemV_MIPS_o32
doc: |-
The ABI for MIPS RISC processor architecture
([reference][abi4]).
[abi4]: http://math-atlas.sourceforge.net/devel/assembly/mipsabi32.pdf
- name: SystemV_MIPSEL_o32
doc: |-
The ABI for little-endian edition of the MIPS RISC processor architecture
([reference][abi5]).
[abi5]: http://math-atlas.sourceforge.net/devel/assembly/mipsabi32.pdf
- name: SystemZ_s390x
doc: |-
The s390x ABI for SystemZ processor architecture
([reference](https://github.com/IBM/s390x-abi)).
- name: CanonicalRegisterValue
type: struct
doc: |-
A [`Segment`](#Segment) can specify a set of *canonical values* for certain
registers.
This can be used to represent concepts such as the global pointer, which in
certain ABIs, is not set by each function, but it's possible to assume it has
a certain value at the entry of the function.
key:
- Register
fields:
- name: Register
doc: The register for which to specify the canonical value.
type: Register
- name: Value
doc: |-
The canonical value that `Register` can be assumed to hold upon
function entry.
type: uint64_t
- name: Register
type: enum
doc: |-
An enum containing the list of all the currently supported registers.
members:
# x86 registers
- name: eax_x86
- name: ebx_x86
- name: ecx_x86
- name: edx_x86
- name: esi_x86
- name: edi_x86
- name: ebp_x86
- name: esp_x86
- name: st0_x86
- name: xmm0_x86
- name: xmm1_x86
- name: xmm2_x86
- name: xmm3_x86
- name: xmm4_x86
- name: xmm5_x86
- name: xmm6_x86
- name: xmm7_x86
# x86-64 registers
- name: rax_x86_64
- name: rbx_x86_64
- name: rcx_x86_64
- name: rdx_x86_64
- name: rbp_x86_64
- name: rsp_x86_64
- name: rsi_x86_64
- name: rdi_x86_64
- name: r8_x86_64
- name: r9_x86_64
- name: r10_x86_64
- name: r11_x86_64
- name: r12_x86_64
- name: r13_x86_64
- name: r14_x86_64
- name: r15_x86_64
- name: xmm0_x86_64
- name: xmm1_x86_64
- name: xmm2_x86_64
- name: xmm3_x86_64
- name: xmm4_x86_64
- name: xmm5_x86_64
- name: xmm6_x86_64
- name: xmm7_x86_64
- name: fs_x86_64
# ARM registers
- name: r0_arm
- name: r1_arm
- name: r2_arm
- name: r3_arm
- name: r4_arm
- name: r5_arm
- name: r6_arm
- name: r7_arm
- name: r8_arm
- name: r9_arm
- name: r10_arm
- name: r11_arm
- name: r12_arm
- name: r13_arm
- name: r14_arm
- name: r15_arm
- name: q0_arm
- name: q1_arm
- name: q2_arm
- name: q3_arm
- name: q4_arm
- name: q5_arm
- name: q6_arm
- name: q7_arm
# AArch64 registers
- name: x0_aarch64
- name: x1_aarch64
- name: x2_aarch64
- name: x3_aarch64
- name: x4_aarch64
- name: x5_aarch64
- name: x6_aarch64
- name: x7_aarch64
- name: x8_aarch64
- name: x9_aarch64
- name: x10_aarch64
- name: x11_aarch64
- name: x12_aarch64
- name: x13_aarch64
- name: x14_aarch64
- name: x15_aarch64
- name: x16_aarch64
- name: x17_aarch64
- name: x18_aarch64
- name: x19_aarch64
- name: x20_aarch64
- name: x21_aarch64
- name: x22_aarch64
- name: x23_aarch64
- name: x24_aarch64
- name: x25_aarch64
- name: x26_aarch64
- name: x27_aarch64
- name: x28_aarch64
- name: x29_aarch64
- name: lr_aarch64
- name: sp_aarch64
- name: v0_aarch64
- name: v1_aarch64
- name: v2_aarch64
- name: v3_aarch64
- name: v4_aarch64
- name: v5_aarch64
- name: v6_aarch64
- name: v7_aarch64
- name: v8_aarch64
- name: v9_aarch64
- name: v10_aarch64
- name: v11_aarch64
- name: v12_aarch64
- name: v13_aarch64
- name: v14_aarch64
- name: v15_aarch64
- name: v16_aarch64
- name: v17_aarch64
- name: v18_aarch64
- name: v19_aarch64
- name: v20_aarch64
- name: v21_aarch64
- name: v22_aarch64
- name: v23_aarch64
- name: v24_aarch64
- name: v25_aarch64
- name: v26_aarch64
- name: v27_aarch64
- name: v28_aarch64
- name: v29_aarch64
- name: v30_aarch64
- name: v31_aarch64
# MIPS registers
- name: v0_mips
- name: v1_mips
- name: a0_mips
- name: a1_mips
- name: a2_mips
- name: a3_mips
- name: s0_mips
- name: s1_mips
- name: s2_mips
- name: s3_mips
- name: s4_mips
- name: s5_mips
- name: s6_mips
- name: s7_mips
- name: t0_mips
- name: t1_mips
- name: t2_mips
- name: t3_mips
- name: t4_mips
- name: t5_mips
- name: t6_mips
- name: t7_mips
- name: t8_mips
- name: t9_mips
- name: gp_mips
- name: sp_mips
- name: fp_mips
- name: ra_mips
- name: f0_mips
- name: f1_mips
- name: f2_mips
- name: f3_mips
- name: f4_mips
- name: f5_mips
- name: f6_mips
- name: f7_mips
- name: f8_mips
- name: f9_mips
- name: f10_mips
- name: f11_mips
- name: f12_mips
- name: f13_mips
- name: f14_mips
- name: f15_mips
- name: f16_mips
- name: f17_mips
- name: f18_mips
- name: f19_mips
- name: f20_mips
- name: f21_mips
- name: f22_mips
- name: f23_mips
- name: f24_mips
- name: f25_mips
- name: f26_mips
- name: f27_mips
- name: f28_mips
- name: f29_mips
- name: f30_mips
- name: f31_mips
# SystemZ registers
- name: r0_systemz
- name: r1_systemz
- name: r2_systemz
- name: r3_systemz
- name: r4_systemz
- name: r5_systemz
- name: r6_systemz
- name: r7_systemz
- name: r8_systemz
- name: r9_systemz
- name: r10_systemz
- name: r11_systemz
- name: r12_systemz
- name: r13_systemz
- name: r14_systemz
- name: r15_systemz
- name: f0_systemz
- name: f1_systemz
- name: f2_systemz
- name: f3_systemz
- name: f4_systemz
- name: f5_systemz
- name: f6_systemz
- name: f7_systemz
- name: f8_systemz
- name: f9_systemz
- name: f10_systemz
- name: f11_systemz
- name: f12_systemz
- name: f13_systemz
- name: f14_systemz
- name: f15_systemz
#
# Configuration
#
- name: Configuration
type: struct
doc: A list of configuration options
# This of this as a temporary place to put the project-local (user-local?)
# configuration before a more comprehensive solution is introduced.
fields:
- name: Disassembly
doc: The options specific to the disassembly artifact.
type: DisassemblyConfiguration
- name: Naming
doc: The options specific to the naming conventions
type: NamingConfiguration
# Configuration options that don't belong anywhere else find themselves
# under this comment (in this struct).
# As this list grows, they should be split into their own sub-sections.
- name: CommentLineWidth
doc: |-
Sets a recommended comment line width to improve their readability.
Set to `-1` for unlimited line size.
type: uint64_t
default: 80
- name: NamingConfiguration
type: struct
doc: |-
Subset of configuration options dedicated to naming rules, mostly (but not
exclusively) centered around reserved name prefixes.
fields:
- name: UnnamedSegmentPrefix
doc: The prefix for a segment without a name.
type: string
default: segment_
- name: UnnamedDynamicFunctionPrefix
doc: The prefix for a dynamic function with an invalid name.
type: string
default: dynamic_function_
- name: UnnamedFunctionPrefix
doc: The prefix for a local function without a name.
type: string
default: function_
- name: UnnamedTypeDefinitionPrefix
doc: |-
The prefix for a type definition without a name.
Note that the type kind (like `struct`, or `typedef`) is going to be
inserted automatically after this prefix.
type: string
default: ""
- name: UnnamedEnumEntryPrefix
doc: The prefix for an enum entry without a name.
type: string
default: enum_entry_
- name: UnnamedStructFieldPrefix
doc: The prefix for a struct field without a name.
type: string
default: offset_
- name: UnnamedUnionFieldPrefix
doc: The prefix for a union member without a name.
type: string
default: member_
- name: UnnamedFunctionArgumentPrefix
doc: The prefix for a cabi function argument without a name.
type: string
default: argument_
- name: UnnamedFunctionRegisterPrefix
doc: The prefix for a raw function register without a name.
type: string
default: register_
- name: UnnamedLocalVariablePrefix
doc: The prefix for a local variable without a name.
type: string
default: var_
- name: UnnamedBreakFromLoopVariablePrefix
doc: The prefix for a local variable without a name.
type: string
default: break_from_loop_
- name: UnnamedGotoLabelPrefix
doc: The prefix for a goto label without a name.
type: string
default: label_
- name: OpaqueCSVValuePrefix
doc: The prefix for accessing an opaque CSV Value.
type: string
default: revng_undefined_
- name: MaximumEnumValuePrefix
doc: The prefix for the maximum enum value.
type: string
default: enum_max_value_
- name: UnnamedStackFrameVariableName
doc: The name of the variable representing stack.
type: string
default: stack
- name: RawStackArgumentName
doc: The name of the variable representing stack.
type: string
default: stack_arguments
- name: LoopStateVariableName
doc: The name of the variable representing stack.
type: string
default: loop_state_var
- name: StructPaddingPrefix
doc: The prefix for a padding struct field.
type: string
default: padding_at_
- name: ArtificialReturnValuePrefix
doc: The prefix for an artificial raw function return value.
type: string
default: artificial_struct_returned_by_
- name: OpaqueTypePrefix
doc: The prefix for an artificial struct wrapping a model array type.
type: string
default: opaque_type_
- name: ReserveNamesStartingWithUnderscore
doc: |-
When this is set to `true`, all the names starting with underscores will
be replaced by an automatic name.
type: bool
default: false
- name: DisassemblyConfiguration
type: struct
doc: |-
The subset of configuration options dedicated to the disassembly view.
fields:
- name: DisableEmissionOfInstructionAddress
doc: |-
When set to `true`, the addresses of the instructions are not present
in the disassembly view.
```
400df8: fd 7b bd a9 stp x29, x30, [sp, #-0x30]!
400dfc: fd 03 00 91 mov x29, sp
-----------
^
This part
```
type: bool
default: false
- name: DisableEmissionOfRawBytes
doc: |-
When set to `true`, the raw bytes of the instructions are not present
in the disassembly view.
```
400df8: fd 7b bd a9 stp x29, x30, [sp, #-0x30]!
400dfc: fd 03 00 91 mov x29, sp
---------------
^
This part
```
type: bool
default: false
- name: UseX86ATTSyntax
doc: |-
When set to `true`, ATT syntax is used.
`true`:
```
80491a0: 83 c4 10 addl $0x10, %esp
80491a3: 8b 5d fc movl -0x4(%ebp), %ebx
80491a6: c9 leave
80491a7: e9 ec fe ff ff jmp bb_0x8049098
```
`false` (default):
```
80491a0: 83 c4 10 add esp, 0x10
80491a3: 8b 5d fc mov ebx, dword ptr [ebp - 0x4]
80491a6: c9 leave
80491a7: e9 ec fe ff ff jmp bb_0x8049098
```
Note that this option has no effect on non-x86 binaries.
type: bool
default: false
- name: AddressStyle
doc: |-
This describes the way labels / addresses should be printed in
the disassembly view.
See the related enum for further explanation and examples.
type: DisassemblyConfigurationAddressStyle
default: Smart
- name: ImmediateStyle
doc: |-
This describes the way immediate values are printed in
the disassembly view.
See the related enum for further explanation and examples.
The default value is `CHexadecimal`.
type: DisassemblyConfigurationImmediateStyle
default: CHexadecimal
- name: PrintFullMetaAddress
doc: |-
Set this to true to include the full meta-address whenever one is printed.
The default value of `false` omits the address type as long as it matches
that of the binary.
`true`:
```
80491a7_Code_x86: e9 ec fe ff ff jmp bb_0x8049098_Code_x86
```
`false` (default):
```
80491a7: e9 ec fe ff ff jmp bb_0x8049098
```
type: bool
default: false
- name: BasicBlockPrefix
doc: |-
The prefix attached to the basic block address in the disassembly views.
`my_value_`:
```
80491a7: e9 ec fe ff ff jmp my_value_0x8049098
```
default:
```
80491a7: e9 ec fe ff ff jmp bb_0x8049098
```
type: string
default: bb_
- name: DisassemblyConfigurationImmediateStyle
type: enum
doc: |-
An enum listing immediate emission style in the disassembly views.
members:
- name: Decimal
doc: Print immediate values as decimal, for example `42`.
- name: CHexadecimal
doc: Print immediate values as c-style hexadecimal, for example `0x2a`.
- name: AsmHexadecimal
doc: Print immediate values as asm-style hexadecimal, for example `02ah`.
- name: DisassemblyConfigurationAddressStyle
type: enum
doc: |-
An enum listing address (as in label) emission style in the disassembly
views.
members:
- name: Smart
doc: |-
Look for the addresses among basic blocks and functions.
When a match is found, replace the addresses with relevant labels.
Otherwise, prints an absolute address instead.
- name: SmartWithPCRelativeFallback
doc: |-
Same as `Smart`, except when unable to single out the target,
print a PC-relative address instead.
- name: Strict
doc: |-
Same as `Smart`, except when unable to single out the target,
print an error token.
- name: Global
doc: |-
Convert PC relative addresses into global representation.
- name: PCRelative
doc: |-
Print all the addresses exactly how disassembler emitted them
in PC-relative mode.