GTIRB
v2.1.0
GrammaTech Intermediate Representation for Binaries: C++ API
|
AuxData objects can be attached to the IR or individual Modules to store additional client-specific data in a portable way. More...
Files | |
file | AuxData.hpp |
Types and operations for auxiliary data. | |
file | AuxDataSchema.hpp |
Type schema for sanctioned AuxData types. | |
Classes | |
struct | gtirb::auxdata_traits< T, Enable > |
Provides type information and serialization functions for types which can be stored in AuxData. More... | |
struct | gtirb::is_mapping< T > |
Trait class that identifies whether T is a mapping container type. More... | |
struct | gtirb::is_sequence< T > |
Trait class that identifies whether T is a sequential container type. More... | |
Functions | |
static bool | gtirb::auxdata_traits< T, Enable >::fromBytes (T &Object, FromByteRange &FBR)=delete |
Deserialize an object from a sequence of bytes. More... | |
static void | gtirb::auxdata_traits< T, Enable >::toBytes (const T &Object, ToByteRange &TBR)=delete |
Serialize an object to a sequence of bytes. More... | |
static std::string | gtirb::auxdata_traits< T, Enable >::type_name ()=delete |
String representation of the serialized type of T. More... | |
AuxData objects can be attached to the IR or individual Modules to store additional client-specific data in a portable way.
AuxData can store the following types:
Support for additional containers can be added by specializing is_sequence or is_mapping. Once serialized, the data does not depend on any specific container type, and its contents can be deserialized into different containers of the same kind (e.g. std::list
to std::vector
).
Support for other types can be added by specializing auxdata_traits to provide serialization functions. However, AuxData containing these types will not be accessible to other clients which are not compiled with support for those types. It is preferable to store data using the basic types whenever possible, in order to maximize interoperability.
We specify a small number of standard AuxData table schemata to support interoperability. For details, see md_AuxData. C++ schemata for the sanctioned tables are present in AuxDataSchema.hpp.
Clients may add their own AuxData tables in the C++ API by defining their own schemata. Schemata should be defined by extending the gtirb::schema namespace. Each schema should be a struct declaring public members for the type's name and its C++ type. One can follow the model provided by the schemata in AuxDataSchema.hpp.
AuxData is serialized by packing the contents into a byte array, which is stored in a protobuf message along with a string which identifies the type in a portable fashion.
Fixed-size types such as integers, Addr, etc are packed by swapping their bytes to little-endian order and writing them directly to the byte array. Containers first write out the number of elements (as a uint64_t), then write each element one after another. Tuples are similar but omit the size, since it can be inferred from the type.
|
staticdelete |
#include <AuxData.hpp>
Deserialize an object from a sequence of bytes.
Object | The object to deserialize. |
FBR | Read bytes from here. |
|
staticdelete |
#include <AuxData.hpp>
Serialize an object to a sequence of bytes.
Object | The object to serialize. |
TBR | Store byte sequence here. |
|
staticdelete |
#include <AuxData.hpp>
String representation of the serialized type of T.
This identifier is portable and independent of the specific container types. Integral types are represented with an exact size (e.g. "uint32_t"). Sequential containers are represented as "sequence<...>", and mapping containers are represented as "mapping<...>".