Files
revng-revng/include/revng/Model/model-schema.yml
2025-04-30 15:08:45 +02:00

1408 lines
42 KiB
YAML

#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
version: 3
definitions:
- name: Binary
doc: |-
Data structure representing the whole binary.
This is the entry point of the model.
It contains the type system (`Types`), the list of functions (`Functions`),
loading information (`Segments`) and more.
type: struct
fields:
- name: Architecture
doc: The architecture for this binary.
type: Architecture
optional: true
- name: EntryPoint
doc: The program entry point, if any.
type: MetaAddress
optional: true
- name: DefaultABI
doc: The default ABI to adopt for analysis purposes.
type: ABI
optional: true
- name: DefaultPrototype
doc: |-
The default function prototype to adopt for functions that do not provide
it explicitly.
type: Type
optional: true
upcastable: true
- name: Configuration
type: Configuration
optional: true
- 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
optional: true
- 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.
optional: true
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
optional: true
- name: ImportedDynamicFunctions
doc: List of functions imported from dynamic libraries (`.so`, `.dll`).
sequence:
type: SortedVector
elementType: DynamicFunction
optional: true
- name: Functions
doc: List of the functions present in the binary.
sequence:
type: SortedVector
elementType: Function
optional: true
- name: TypeDefinitions
doc: |-
The set of types used in this binary.
It contains `struct`, `union`, `typedef`, `enum` and function prototypes.
sequence:
type: SortedVector
upcastable: true
elementType: TypeDefinition
optional: true
- name: TypeDefinition
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.
type: struct
fields:
- name: ID
type: uint64_t
is_guid: true
doc: |-
A unique identifier for this type.
- name: Kind
type: TypeDefinitionKind
- name: Name
doc: |-
A user-chosen `Identifier` for this type.
type: string
optional: true
- name: Comment
type: string
optional: true
key:
- ID
- Kind
abstract: true
- name: UnionDefinition
doc: |
A `union` type.
type: struct
inherits: TypeDefinition
fields:
- name: Fields
doc: The list of alternative types in this `union`.
sequence:
type: SortedVector
elementType: UnionField
- name: CABIFunctionDefinition
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.
type: struct
inherits: TypeDefinition
fields:
- name: ABI
type: ABI
doc: The C ABI associated to this function type.
- name: ReturnType
type: Type
doc: The function return type.
optional: true
upcastable: true
- name: ReturnValueComment
type: string
optional: true
- name: Arguments
doc: The list of formal arguments of the function type.
sequence:
type: SortedVector
elementType: Argument
- name: EnumDefinition
doc: |
An `enum` type definition.
type: struct
inherits: TypeDefinition
fields:
- name: UnderlyingType
type: Type
upcastable: true
doc: |-
The underlying type of the `enum`.
This can only be a `PrimitiveType` with either a `Unsigned` or a `Signed`
kind.
- 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: RawFunctionDefinition
type: struct
inherits: TypeDefinition
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
type: Architecture
doc: The processor architecture of this function type.
- name: Arguments
optional: true
sequence:
type: SortedVector
elementType: NamedTypedRegister
doc: |-
The list of registers used to pass arguments.
The registers must belong to `Architecture`.
- name: ReturnValues
optional: true
sequence:
type: SortedVector
elementType: NamedTypedRegister
doc: |-
The list of registers used to return values.
The registers must belong to `Architecture`.
- name: ReturnValueComment
type: string
optional: true
- name: PreservedRegisters
optional: true
sequence:
type: SortedVector
elementType: Register
doc: |-
The list of registers preserved by functions using this function type.
The registers must belong to `Architecture`.
- name: FinalStackOffset
type: uint64_t
optional: true
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.
- name: StackArgumentsType
doc: The type of the `struct` representing all of the stack arguments.
type: Type
optional: true
upcastable: true
- name: TypedefDefinition
doc: |-
A `typedef` type.
Note, that unlike in C, two `typedef`s aliasing the same type are actually
distinct types.
type: struct
inherits: TypeDefinition
fields:
- name: UnderlyingType
type: Type
doc: The type this `typedef` is aliasing.
upcastable: true
- name: StructDefinition
doc: |
A `struct` type.
type: struct
inherits: TypeDefinition
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 pointer, arrays or other
qualifiers, the padding of the struct is treated at if it contains code.
type: bool
optional: true
- name: Fields
doc: The list of fields of this `struct`.
sequence:
type: SortedVector
elementType: StructField
- name: Type
doc: |-
A type such as an array, a pointer, a primitive or a defined type.
type: struct
fields:
- name: Kind
type: TypeKind
- name: IsConst
type: bool
optional: true
abstract: true
- name: PrimitiveType
type: struct
inherits: Type
fields:
- name: PrimitiveKind
type: PrimitiveKind
- name: Size
doc: |
As of now, for floating point primitives, supported sizes include:
```
{ 2, 4, 8, 10, 12, 16 }
```
For non-floating point, they are:
```
{ 1, 2, 4, 8, 16 }
```
Note that `Void` *must* have size of 0 while `Generic` can use all the
supported sizes, floating point or not.
type: uint64_t
optional: true
- name: PointerType
type: struct
inherits: Type
doc: A pointer type.
fields:
- name: PointerSize
doc: As of now, only 4 and 8 byte pointers are supported.
type: uint64_t
- name: PointeeType
type: Type
doc: The pointee type.
upcastable: true
- name: DefinedType
type: struct
inherits: Type
doc: A reference to a `TypeDefinition`.
fields:
- name: Definition
reference:
pointeeType: TypeDefinition
rootType: Binary
- name: ArrayType
type: struct
doc: |-
An array of `Type`s.
inherits: Type
fields:
- name: ElementCount
type: uint64_t
doc: The number of elements.
- name: ElementType
type: Type
upcastable: true
doc: The type of the elements of the array.
- name: UnionField
doc: |-
An alternative of a `UnionDefinition`.
It is composed by a index and the `Type`.
type: struct
fields:
- name: Index
type: uint64_t
- name: Name
type: string
optional: true
- name: Comment
type: string
optional: true
- name: Type
type: Type
doc: The type of this `union` alternative.
upcastable: true
key:
- Index
- name: StructField
doc: |-
A field of a `StructDefinition`.
It is composed by the offset of the field and its type.
type: struct
fields:
- name: Offset
type: uint64_t
- name: Name
type: string
optional: true
- name: Comment
type: string
optional: true
- name: Type
type: Type
doc: The type of the field.
upcastable: true
key:
- Offset
- name: Segment
type: struct
doc: |-
A segment contains the information necessary for rev.ng to load the executable
in memory.
fields:
- name: StartAddress
type: MetaAddress
doc: The address at which this segment should be loaded.
- name: VirtualSize
type: uint64_t
doc: |-
The size of the segment in memory.
If this value is greater than `FileSize`, the discrepancy is considered to
full of `00`.
- name: StartOffset
type: uint64_t
doc: Start file offset from which the segment will be loaded.
- name: FileSize
type: uint64_t
doc: Number of bytes that will be loaded in memory from the file.
- name: IsReadable
type: bool
doc: Is this segment readable?
- name: IsWriteable
type: bool
doc: Is this segment writable?
- name: IsExecutable
type: bool
- name: Name
type: string
optional: true
- name: Comment
type: string
optional: true
- name: CanonicalRegisterValues
optional: true
sequence:
type: SortedVector
elementType: CanonicalRegisterValue
- name: Relocations
optional: true
sequence:
type: SortedVector
elementType: Relocation
- name: Type
doc: |-
The `StructDefinition` associated to this segment.
Informally, each field of such `struct` is a global variable.
type: Type
upcastable: true
optional: true
key:
- StartAddress
- VirtualSize
- name: PrimitiveKind
type: enum
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: NamedTypedRegister
type: struct
doc: |-
An argument or return values in a `RawFunctionDefinition`.
It is basically a pair of a register and a `Type`.
fields:
- name: Location
type: Register
- name: Type
type: Type
upcastable: true
- name: Name
type: string
optional: true
- name: Comment
type: string
optional: true
key:
- Location
- name: Function
doc: A function defined within this binary.
type: struct
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
type: string
optional: true
- name: Comment
type: string
optional: true
- name: StackFrameType
doc: The type of the stack frame.
type: Type
upcastable: true
optional: true
- name: Prototype
doc: The prototype of the function.
type: Type
upcastable: true
optional: true
- name: Attributes
doc: Attributes for this call site.
sequence:
type: MutableSet
elementType: FunctionAttribute
optional: true
- name: CallSitePrototypes
doc: |-
Information about specific call sites within this function.
sequence:
type: SortedVector
elementType: CallSitePrototype
optional: true
- name: ExportedNames
doc: |-
The list of names used to make this function available as a dynamic
symbol.
sequence:
type: SortedVector
elementType: string
optional: true
- name: Comments
sequence:
type: vector
elementType: StatementComment
optional: true
key:
- Entry
- name: EnumEntry
doc: An entry in an `enum`.
type: struct
fields:
- name: Value
doc: |-
The value associated to this `enum` entry.
Has to be unique within the `enum`.
type: uint64_t
- name: Name
type: string
optional: true
doc: |-
A user-chosen `Identifier` for this `enum` entry.
- name: Comment
type: string
optional: true
key:
- Value
- name: DynamicFunction
doc: A function defined in a dynamic library.
type: struct
fields:
- name: Name
doc: The name of the symbol for this dynamic function.
type: string
- name: Comment
type: string
optional: true
- name: Prototype
doc: The prototype of the function.
type: Type
upcastable: true
optional: true
- name: Attributes
doc: The attributes of this dynamic function.
sequence:
type: MutableSet
elementType: FunctionAttribute
optional: true
- name: Relocations
doc: |-
A list of locations where the address of this dynamic function should
be placed.
sequence:
type: SortedVector
elementType: Relocation
optional: true
key:
- Name
- 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.
fields:
- name: Address
type: MetaAddress
doc: Where to write the address of the object.
- name: Type
type: RelocationType
doc: |-
How to write the address of the object (e.g., 32-bit vs 64-bit
integer).
- name: Addend
type: uint64_t
doc: Fixed offset to add when writing the address of the object.
key:
- Address
- Type
- name: RelocationType
doc: |-
A enumeration describing how a `Relocation` should be written at the target
address.
type: enum
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
doc: Information about the prototype of a specific callsite within a `Function`.
type: struct
fields:
- name: CallerBlockAddress
doc: Address of the basic block of the call.
type: MetaAddress
- name: Prototype
type: Type
upcastable: true
- name: IsTailCall
doc: Whether this call site is a tail call or not.
type: bool
optional: true
- name: Attributes
doc: Attributes for this call site.
sequence:
type: MutableSet
elementType: FunctionAttribute
optional: true
key:
- CallerBlockAddress
- name: FunctionAttribute
doc: |
Attributes for functions. Can be applied both to functions and call sites.
type: enum
members:
- name: NoReturn
doc: The function does not return.
- name: Inline
doc: The function must be inlined in callers.
- name: CanonicalRegisterValue
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.
type: struct
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
key:
- Register
- name: Register
type: enum
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
- name: Configuration
type: struct
fields:
- name: Disassembly
type: DisassemblyConfiguration
optional: true
- name: Naming
type: NamingConfiguration
optional: true
# Configuration options that don't belong anywhere else find themselves here.
# 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.
The default value is `80`.
Set to `-1` for unlimited line size.
type: uint64_t
optional: true
- name: StatementComment
type: struct
fields:
- 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
type: string
- name: NamingConfiguration
type: struct
fields:
- name: UnnamedSegmentPrefix
doc: |
The prefix for a segment without a name.
The default value is `segment_`.
type: string
optional: true
- name: UnnamedDynamicFunctionPrefix
doc: |
The prefix for a dynamic function with an invalid name.
The default value is `dynamic_function_`.
type: string
optional: true
- name: UnnamedFunctionPrefix
doc: |
The prefix for a local function without a name.
The default value is `function_`.
type: string
optional: true
- name: UnnamedTypeDefinitionPrefix
doc: |
The prefix for a type definition without a name.
The default value is "".
Note that the type kind (like `struct`, or `typedef`) is going to be
inserted automatically after this prefix.
type: string
optional: true
- name: UnnamedEnumEntryPrefix
doc: |
The prefix for an enum entry without a name.
The default value is `enum_entry_`.
type: string
optional: true
- name: UnnamedStructFieldPrefix
doc: |
The prefix for a struct field without a name.
The default value is `offset_`.
type: string
optional: true
- name: UnnamedUnionFieldPrefix
doc: |
The prefix for a union member without a name.
The default value is `member_`.
type: string
optional: true
- name: UnnamedFunctionArgumentPrefix
doc: |
The prefix for a cabi function argument without a name.
The default value is `argument_`.
type: string
optional: true
- name: UnnamedFunctionRegisterPrefix
doc: |
The prefix for a raw function register without a name.
The default value is `register_`.
type: string
optional: true
- name: UnnamedLocalVariablePrefix
doc: |
The prefix for a local variable without a name.
The default value is `var_`.
type: string
optional: true
- name: UnnamedBreakFromLoopVariablePrefix
doc: |
The prefix for a local variable without a name.
The default value is `break_from_loop_`.
type: string
optional: true
- name: UndefinedValuePrefix
doc: |
The prefix for an undefined value.
The default value is `undef_`.
type: string
optional: true
- name: OpaqueCSVValuePrefix
doc: |
The prefix for accessing an opaque CSV Value.
The default value is `undef_`.
type: string
optional: true
- name: MaximumEnumValuePrefix
doc: |
The prefix for the maximum enum value.
The default value is `enum_max_value_`.
type: string
optional: true
- name: StackFrameVariableName
doc: |
The name of the variable representing stack.
The default value is `stack`.
type: string
optional: true
- name: RawStackArgumentName
doc: |
The name of the variable representing stack.
The default value is `stack_arguments`.
type: string
optional: true
- name: LoopStateVariableName
doc: |
The name of the variable representing stack.
The default value is `loop_state_var`.
type: string
optional: true
- name: StructPaddingPrefix
doc: |
The prefix for a padding struct field.
The default value is `padding_at_`.
type: string
optional: true
- name: ArtificialReturnValuePrefix
doc: |
The prefix for an artificial raw function return value.
The default value is `artificial_struct_returned_by_`.
type: string
optional: true
- name: ArtificialArrayWrapperPrefix
doc: |
The prefix for an artificial array wrapper.
The default value is `artificial_wrapper_`.
type: string
optional: true
- name: ArtificialArrayWrapperFieldName
doc: |
The name of the field within the artificial array wrapper.
See `ArtificialArrayWrapperPrefix`.
The default value is `the_array`.
type: string
optional: true
- name: ReserveNamesStartingWithUnderscore
doc: |
When this is set to `true`, all the names starting with underscores will
have a \ref ReservedNamePrefix prefix attached.
type: bool
optional: true
- name: DisassemblyConfiguration
type: struct
fields:
- name: DisableEmissionOfInstructionAddress
type: bool
optional: true
- name: DisableEmissionOfRawBytes
type: bool
optional: true
- name: UseX86ATTSyntax
doc: x86-only.
type: bool
optional: true
- name: AddressStyle
doc: |
The default value is `Smart`. See the related enum for further
explanation.
type: DisassemblyConfigurationAddressStyle
optional: true
- name: ImmediateStyle
doc: |
The default value is `CHexadecimal`. See the related enum for further
explanation.
type: DisassemblyConfigurationImmediateStyle
optional: true
- 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.
type: bool
optional: true
- name: BasicBlockPrefix
doc: |
The prefix attached to the basic block address in the disassembly views.
The default value is `bb_`.
type: string
optional: true
- name: DisassemblyConfigurationImmediateStyle
type: enum
members:
- name: Decimal
- name: CHexadecimal
- name: AsmHexadecimal
- name: DisassemblyConfigurationAddressStyle
type: enum
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.
- name: Argument
doc: |
The argument of a `CABIFunctionType`.
type: struct
fields:
- name: Index
type: uint64_t
doc: The argument index.
- name: Type
type: Type
doc: The type of the argument.
upcastable: true
- name: Name
type: string
optional: true
- name: Comment
type: string
optional: true
key:
- Index
- name: Architecture
type: enum
members:
- name: x86
- name: x86_64
- name: arm
- name: aarch64
- name: mips
- name: mipsel
- name: systemz
- name: ABI
type: enum
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)).