mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
306e8a93f1
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.
1839 lines
51 KiB
YAML
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.
|