Latest available version: IDA and decompilers v8.4.240215 see all releases
Hex-Rays logo State-of-the-art binary code analysis tools
email icon

Primary mechanism for managing type information. More...

#include <typeinf.hpp>

Public Types

enum  bitmask_cvt_stance_t { ENUMBM_OFF = 0 , ENUMBM_ON = 1 , ENUMBM_AUTO = 2 }
 Set or clear the 'bitmask' attribute of an enum. More...
 

Public Member Functions

 tinfo_t ()
 Constructor.
 
 tinfo_t (type_t decl_type)
 Constructor - can only be used to initialize simple types!
 
 tinfo_t (const tinfo_t &r)
 Constructor.
 
tinfo_toperator= (const tinfo_t &r)
 Copy contents of given tinfo into this one.
 
 ~tinfo_t ()
 Destructor.
 
void clear ()
 Clear contents of this tinfo, and remove from the type system.
 
void swap (tinfo_t &r)
 Assign this = r and r = this.
 
bool get_named_type (const til_t *til, const char *name, type_t decl_type=BTF_TYPEDEF, bool resolve=true, bool try_ordinal=true)
 Create a tinfo_t object for an existing named type. More...
 
bool get_numbered_type (const til_t *til, uint32 ordinal, type_t decl_type=BTF_TYPEDEF, bool resolve=true)
 Create a tinfo_t object for an existing ordinal type. More...
 
bool serialize (qtype *type, qtype *fields=nullptr, qtype *fldcmts=nullptr, int sudt_flags=SUDT_FAST|SUDT_TRUNC) const
 Serialize tinfo_t object into a type string.
 
bool deserialize (const til_t *til, const type_t **ptype, const p_list **pfields=nullptr, const p_list **pfldcmts=nullptr, const char *cmt=nullptr)
 Deserialize a type string into a tinfo_t object.
 
bool deserialize (const til_t *til, const qtype *ptype, const qtype *pfields=nullptr, const qtype *pfldcmts=nullptr, const char *cmt=nullptr)
 Deserialize a type string into a tinfo_t object. More...
 
bool is_correct () const
 Is the type object correct?. More...
 
type_t get_realtype (bool full=false) const
 Get the resolved base type. More...
 
THREAD_SAFE type_t get_decltype () const
 Get declared type (without resolving type references; they are returned as is). More...
 
THREAD_SAFE bool empty () const
 Was tinfo_t initialized with some type info or not?
 
bool present () const
 Is the type really present? (not a reference to a missing type, for example)
 
size_t get_size (uint32 *p_effalign=nullptr, int gts_code=0) const
 Get the type size in bytes. More...
 
size_t get_unpadded_size () const
 Get the type size in bytes without the final padding, in bytes. More...
 
type_sign_t get_sign () const
 Get type sign.
 
bool is_signed () const
 Is this a signed type?
 
bool is_unsigned () const
 Is this an unsigned type?
 
uchar get_declalign () const
 Get declared alignment of the type.
 
THREAD_SAFE bool is_typeref () const
 Is this type a type reference?.
 
THREAD_SAFE bool has_details () const
 Does this type refer to a nontrivial type?
 
bool get_type_name (qstring *out) const
 Does a type refer to a name?. More...
 
bool get_nice_type_name (qstring *out) const
 Get the beautified type name. More...
 
tinfo_code_t rename_type (const char *name, int ntf_flags=0)
 Rename a type. More...
 
bool get_final_type_name (qstring *out) const
 Use in the case of typedef chain (TYPE1 -> TYPE2 -> TYPE3...TYPEn). More...
 
bool get_next_type_name (qstring *out) const
 Use In the case of typedef chain (TYPE1 -> TYPE2 -> TYPE3...TYPEn). More...
 
tid_t get_tid () const
 Get the type tid Each type in the local type library has a so-called `tid` associated with it. More...
 
tid_t force_tid ()
 Get the type tid. More...
 
uint32 get_ordinal () const
 Get type ordinal (only if the type was created as a numbered type, 0 if none)
 
uint32 get_final_ordinal () const
 Get final type ordinal (0 if none)
 
til_tget_til () const
 Get the type library for tinfo_t.
 
bool is_from_subtil () const
 Was the named type found in some base type library (not the top level type library)?. More...
 
bool is_forward_decl () const
 Is this a forward declaration?. More...
 
type_t get_forward_type () const
 Get type of a forward declaration. More...
 
bool is_forward_struct () const
 
bool is_forward_union () const
 
bool is_forward_enum () const
 
bool is_typedef () const
 Is this a typedef?. More...
 
int get_type_cmt (qstring *out) const
 Get type comment. More...
 
bool get_type_rptcmt (qstring *out) const
 Get type comment only if it is repeatable.
 
THREAD_SAFE bool is_decl_const () const
 is_type_const(get_decltype())
 
THREAD_SAFE bool is_decl_volatile () const
 is_type_volatile(get_decltype())
 
THREAD_SAFE bool is_decl_void () const
 is_type_void(get_decltype())
 
THREAD_SAFE bool is_decl_partial () const
 is_type_partial(get_decltype())
 
THREAD_SAFE bool is_decl_unknown () const
 is_type_unknown(get_decltype())
 
THREAD_SAFE bool is_decl_last () const
 is_typeid_last(get_decltype())
 
THREAD_SAFE bool is_decl_ptr () const
 is_type_ptr(get_decltype())
 
THREAD_SAFE bool is_decl_array () const
 is_type_array(get_decltype())
 
THREAD_SAFE bool is_decl_func () const
 is_type_func(get_decltype())
 
THREAD_SAFE bool is_decl_complex () const
 is_type_complex(get_decltype())
 
THREAD_SAFE bool is_decl_typedef () const
 is_type_typedef(get_decltype())
 
THREAD_SAFE bool is_decl_sue () const
 is_type_sue(get_decltype())
 
THREAD_SAFE bool is_decl_struct () const
 is_type_struct(get_decltype())
 
THREAD_SAFE bool is_decl_union () const
 is_type_union(get_decltype())
 
THREAD_SAFE bool is_decl_udt () const
 is_type_struni(get_decltype())
 
THREAD_SAFE bool is_decl_enum () const
 is_type_enum(get_decltype())
 
THREAD_SAFE bool is_decl_bitfield () const
 is_type_bitfld(get_decltype())
 
THREAD_SAFE bool is_decl_int128 () const
 is_type_int128(get_decltype())
 
THREAD_SAFE bool is_decl_int64 () const
 is_type_int64(get_decltype())
 
THREAD_SAFE bool is_decl_int32 () const
 is_type_int32(get_decltype())
 
THREAD_SAFE bool is_decl_int16 () const
 is_type_int16(get_decltype())
 
THREAD_SAFE bool is_decl_int () const
 is_type_int(get_decltype())
 
THREAD_SAFE bool is_decl_char () const
 is_type_char(get_decltype())
 
THREAD_SAFE bool is_decl_uint () const
 is_type_uint(get_decltype())
 
THREAD_SAFE bool is_decl_uchar () const
 is_type_uchar(get_decltype())
 
THREAD_SAFE bool is_decl_uint16 () const
 is_type_uint16(get_decltype())
 
THREAD_SAFE bool is_decl_uint32 () const
 is_type_uint32(get_decltype())
 
THREAD_SAFE bool is_decl_uint64 () const
 is_type_uint64(get_decltype())
 
THREAD_SAFE bool is_decl_uint128 () const
 is_type_uint128(get_decltype())
 
THREAD_SAFE bool is_decl_ldouble () const
 is_type_ldouble(get_decltype())
 
THREAD_SAFE bool is_decl_double () const
 is_type_double(get_decltype())
 
THREAD_SAFE bool is_decl_float () const
 is_type_float(get_decltype())
 
THREAD_SAFE bool is_decl_tbyte () const
 is_type_tbyte(get_decltype())
 
THREAD_SAFE bool is_decl_floating () const
 is_type_floating(get_decltype())
 
THREAD_SAFE bool is_decl_bool () const
 is_type_bool(get_decltype())
 
THREAD_SAFE bool is_decl_paf () const
 is_type_paf(get_decltype())
 
THREAD_SAFE bool is_well_defined () const
 !(empty()) && !(is_decl_partial())
 
bool is_const () const
 is_type_const(get_realtype())
 
bool is_volatile () const
 is_type_volatile(get_realtype())
 
bool is_void () const
 is_type_void(get_realtype())
 
bool is_partial () const
 is_type_partial(get_realtype())
 
bool is_unknown () const
 is_type_unknown(get_realtype())
 
bool is_ptr () const
 is_type_ptr(get_realtype())
 
bool is_array () const
 is_type_array(get_realtype())
 
bool is_func () const
 is_type_func(get_realtype())
 
bool is_complex () const
 is_type_complex(get_realtype())
 
bool is_struct () const
 is_type_struct(get_realtype())
 
bool is_union () const
 is_type_union(get_realtype())
 
bool is_udt () const
 is_type_struni(get_realtype())
 
bool is_enum () const
 is_type_enum(get_realtype())
 
bool is_sue () const
 is_type_sue(get_realtype())
 
bool is_bitfield () const
 is_type_bitfld(get_realtype())
 
bool is_int128 () const
 is_type_int128(get_realtype())
 
bool is_int64 () const
 is_type_int64(get_realtype())
 
bool is_int32 () const
 is_type_int32(get_realtype())
 
bool is_int16 () const
 is_type_int16(get_realtype())
 
bool is_int () const
 is_type_int(get_realtype())
 
bool is_char () const
 is_type_char(get_realtype())
 
bool is_uint () const
 is_type_uint(get_realtype())
 
bool is_uchar () const
 is_type_uchar(get_realtype())
 
bool is_uint16 () const
 is_type_uint16(get_realtype())
 
bool is_uint32 () const
 is_type_uint32(get_realtype())
 
bool is_uint64 () const
 is_type_uint64(get_realtype())
 
bool is_uint128 () const
 is_type_uint128(get_realtype())
 
bool is_ldouble () const
 is_type_ldouble(get_realtype())
 
bool is_double () const
 is_type_double(get_realtype())
 
bool is_float () const
 is_type_float(get_realtype())
 
bool is_tbyte () const
 is_type_tbyte(get_realtype())
 
bool is_bool () const
 is_type_bool(get_realtype())
 
bool is_paf () const
 is_type_paf(get_realtype())
 
bool is_ptr_or_array () const
 is_type_ptr_or_array(get_realtype())
 
bool is_integral () const
 is_type_integral(get_realtype())
 
bool is_ext_integral () const
 is_type_ext_integral(get_realtype())
 
bool is_floating () const
 is_type_floating(get_realtype())
 
bool is_arithmetic () const
 is_type_arithmetic(get_realtype())
 
bool is_ext_arithmetic () const
 is_type_ext_arithmetic(get_realtype())
 
bool is_scalar () const
 Does the type represent a single number?
 
bool get_ptr_details (ptr_type_data_t *pi) const
 Get the pointer info.
 
bool get_array_details (array_type_data_t *ai) const
 Get the array specific info.
 
bool get_enum_details (enum_type_data_t *ei) const
 Get the enum specific info.
 
bool get_bitfield_details (bitfield_type_data_t *bi) const
 Get the bitfield specific info.
 
bool get_udt_details (udt_type_data_t *udt, gtd_udt_t gtd=GTD_CALC_LAYOUT) const
 Get the udt specific info.
 
bool get_func_details (func_type_data_t *fi, gtd_func_t gtd=GTD_CALC_ARGLOCS) const
 Get only the function specific info for this tinfo_t.
 
bool is_funcptr () const
 Is this pointer to a function?
 
bool is_shifted_ptr () const
 Is a shifted pointer?
 
bool is_varstruct () const
 Is a variable-size structure?
 
bool is_varmember () const
 Can the type be of a variable struct member? This function checks for: is_array() && array.nelems==0 Such a member can be only the very last member of a structure.
 
int get_ptrarr_objsize () const
 BT_PTR & BT_ARRAY: get size of pointed object or array element. On error returns -1
 
tinfo_t get_ptrarr_object () const
 BT_PTR & BT_ARRAY: get the pointed object or array element. More...
 
tinfo_t get_pointed_object () const
 BT_PTR: get type of pointed object. More...
 
bool is_pvoid () const
 Is "void *"?. This function does not check the pointer attributes and type modifiers.
 
tinfo_t get_array_element () const
 BT_ARRAY: get type of array element. See also get_ptrarr_object()
 
tinfo_t get_final_element () const
 repeat recursively: if an array, return the type of its element; else return the type itself.
 
int get_array_nelems () const
 BT_ARRAY: get number of elements (-1 means error)
 
tinfo_t get_nth_arg (int n) const
 BT_FUNC or BT_PTR BT_FUNC: Get type of n-th arg (-1 means return type, see get_rettype())
 
tinfo_t get_rettype () const
 BT_FUNC or BT_PTR BT_FUNC: Get the function's return type
 
int get_nargs () const
 BT_FUNC or BT_PTR BT_FUNC: Calculate number of arguments (-1 - error)
 
cm_t get_cc () const
 BT_FUNC or BT_PTR BT_FUNC: Get calling convention
 
bool is_user_cc () const
 is_user_cc(get_cc())
 
bool is_vararg_cc () const
 is_vararg_cc(get_cc())
 
bool is_purging_cc () const
 is_purging_cc(get_cc())
 
int calc_purged_bytes () const
 BT_FUNC: Calculate number of purged bytes
 
bool is_high_func () const
 BT_FUNC: Is high level type?
 
bool get_methods (udtmembervec_t *methods) const
 BT_COMPLEX: get a list of member functions declared in this udt. More...
 
bool get_bit_buckets (range64vec_t *buckets) const
 ::BT_STRUCT: get bit buckets Bit buckets are used to layout bitfields More...
 
int find_udm (struct udm_t *udm, int strmem_flags) const
 BTF_STRUCT,BTF_UNION: Find a udt member. More...
 
int get_udt_nmembers () const
 Get number of udt members. -1-error.
 
bool is_empty_udt () const
 Is an empty struct/union? (has no fields)
 
bool is_small_udt () const
 Is a small udt? (can fit a register or a pair of registers)
 
bool requires_qualifier (qstring *out, const char *name, uint64 offset) const
 Requires full qualifier? (name is not unique) More...
 
bool append_covered (rangeset_t *out, uint64 offset=0) const
 Calculate set of covered bytes for the type. More...
 
bool calc_gaps (rangeset_t *out) const
 Calculate set of padding bytes for the type. More...
 
bool is_one_fpval () const
 Floating value or an object consisting of one floating member entirely.
 
bool is_sse_type () const
 Is a SSE vector type?
 
bool is_anonymous_udt () const
 Is an anonymous struct/union? We assume that types with names are anonymous if the name starts with $.
 
bool is_vftable () const
 Is a vftable type?
 
bool has_vftable () const
 Has a vftable?
 
bool has_union () const
 Has a member of type "union"?
 
type_t get_enum_base_type () const
 Get enum base type (convert enum to integer type) Returns BT_UNK if failed to convert.
 
bool is_bitmask_enum () const
 Is bitmask enum? More...
 
int get_enum_radix () const
 Get enum constant radix. More...
 
tinfo_code_t get_edm (edm_t *edm, size_t idx) const
 Get enum member. More...
 
tinfo_code_t find_edm (edm_t *edm, uint64 value, bmask64_t bmask=DEFMASK64, uchar serial=0) const
 Find enum member. More...
 
tinfo_code_t find_edm (edm_t *edm, const char *name) const
 Find enum member. More...
 
tinfo_t get_onemember_type () const
 For objects consisting of one member entirely: return type of the member.
 
tinfo_t get_innermost_udm (uint64 bitoffset, size_t *out_index=nullptr, uint64 *out_bitoffset=nullptr) const
 Get the innermost member at the given offset. More...
 
uint32 calc_score () const
 Calculate the type score (the higher - the nicer is the type)
 
bool print (qstring *out, const char *name=nullptr, int prtype_flags=PRTYPE_1LINE, int indent=0, int cmtindent=0, const char *prefix=nullptr, const char *cmt=nullptr) const
 Get a C-like string representation of the type. More...
 
const char * dstr () const
 Function to facilitate debugging.
 
bool get_attrs (type_attrs_t *tav, bool all_attrs=false) const
 Get type attributes (all_attrs: include attributes of referenced types, if any)
 
bool get_attr (const qstring &key, bytevec_t *bv, bool all_attrs=true) const
 Get a type attribute.
 
bool set_attrs (type_attrs_t *tav)
 Set type attributes. More...
 
bool set_attr (const type_attr_t &ta, bool may_overwrite=true)
 Set a type attribute. If necessary, a new typid will be created.
 
void del_attrs ()
 Del all type attributes. typerefs cannot be modified by this function.
 
bool del_attr (const qstring &key, bool make_copy=true)
 Del a type attribute. typerefs cannot be modified by this function.
 
bool create_simple_type (type_t decl_type)
 
bool create_ptr (const ptr_type_data_t &p, type_t decl_type=BT_PTR)
 
bool create_array (const array_type_data_t &p, type_t decl_type=BT_ARRAY)
 
bool create_bitfield (const bitfield_type_data_t &p, type_t decl_type=BT_BITFIELD)
 
bool create_typedef (const typedef_type_data_t &p, type_t decl_type=BTF_TYPEDEF, bool try_ordinal=true)
 
bool parse (const char *decl, til_t *til=nullptr, int pt_flags=0)
 Convenience function to parse a string with a type declaration. More...
 
bool get_type_by_edm_name (const char *mname, til_t *til=nullptr)
 Retrieve enum tinfo using enum member name. More...
 
tinfo_code_t create_forward_decl (til_t *til, type_t decl_type, const char *name, int ntf_flags=0)
 Create a forward declaration. More...
 
bool convert_array_to_ptr ()
 Convert an array into a pointer. More...
 
bool remove_ptr_or_array ()
 Replace the current type with the ptr obj or array element. More...
 
tinfo_code_t set_type_alignment (uchar declalign, uint etf_flags=0)
 Set type alignment.
 
bool change_sign (type_sign_t sign)
 Change the type sign. Works only for the types that may have sign.
 
bool calc_udt_aligns (int sudt_flags=SUDT_GAPS)
 Calculate the udt alignments using the field offsets/sizes and the total udt size This function does not work on typerefs.
 
bool set_methods (udtmembervec_t &methods)
 BT_COMPLEX: set the list of member functions. More...
 
tinfo_code_t set_type_cmt (const char *cmt, bool is_regcmt=false, uint etf_flags=0)
 Set type comment This function works only for non-trivial types.
 
uint32 get_alias_target () const
 Get type alias If the type has no alias, return 0. More...
 
bool is_aliased () const
 
bool set_type_alias (uint32 dest_ord)
 Set type alias Redirects all references to source type to the destination type. More...
 
tinfo_code_t set_udt_alignment (int sda, uint etf_flags=0)
 Set declared structure alignment (sda) This alignment supersedes the alignment returned by get_declalign() and is really used when calculating the struct layout. More...
 
tinfo_code_t set_udt_pack (int pack, uint etf_flags=0)
 Set structure packing. More...
 
tid_t get_udm_tid (size_t idx) const
 Get udt member TID. More...
 
tinfo_code_t add_udm (const udm_t &udm, uint etf_flags=0, size_t times=1, ssize_t idx=-1)
 Add a structure/union member. More...
 
tinfo_code_t del_udm (size_t index, uint etf_flags=0)
 Delete a structure/union member.
 
tinfo_code_t del_udms (size_t idx1, size_t idx2, uint etf_flags=0)
 Delete structure/union members in the range [idx1, idx2)
 
tinfo_code_t rename_udm (size_t index, const char *name, uint etf_flags=0)
 Rename a structure/union member. More...
 
tinfo_code_t set_udm_type (size_t index, const tinfo_t &tif, uint etf_flags=0, const value_repr_t *repr=nullptr)
 Set type of a structure/union member. More...
 
tinfo_code_t set_udm_cmt (size_t index, const char *cmt, bool is_regcmt=false, uint etf_flags=0)
 Set a comment for a structure/union member. More...
 
tinfo_code_t set_udm_repr (size_t index, const value_repr_t &repr, uint etf_flags=0)
 Set the representation of a structure/union member.
 
tinfo_code_t expand_udt (size_t idx, adiff_t delta, uint etf_flags=0)
 Expand/shtrink a structure by adding/removing a gap before the specified member. More...
 
tinfo_code_t set_enum_width (int nbytes, uint etf_flags=0)
 Set the width of enum base type. More...
 
tinfo_code_t set_enum_sign (type_sign_t sign, uint etf_flags=0)
 Set enum sign. More...
 
tinfo_code_t set_enum_is_bitmask (bitmask_cvt_stance_t stance=ENUMBM_ON, uint etf_flags=0)
 
tinfo_code_t set_enum_repr (const value_repr_t &repr, uint etf_flags=0)
 Set the representation of enum members. More...
 
tinfo_code_t add_edm (const edm_t &edm, bmask64_t bmask=DEFMASK64, uint etf_flags=0, ssize_t idx=-1)
 Add a new enum member (a new symbolic constant) More...
 
tinfo_code_t del_edms (size_t idx1, size_t idx2, uint etf_flags=0)
 Delete enum members. More...
 
tinfo_code_t del_edm (size_t idx, uint etf_flags=0)
 
tinfo_code_t rename_edm (size_t idx, const char *name, uint etf_flags=0)
 Rename a enum member. More...
 
tinfo_code_t set_edm_cmt (size_t idx, const char *cmt, uint etf_flags=0)
 Set a comment for an enum member. More...
 
tinfo_code_t edit_edm (size_t idx, uint64 value, bmask64_t bmask=DEFMASK64, uint etf_flags=0)
 Change constant value and/or bitmask. More...
 
tinfo_code_t edit_udt (const std::function< tinfo_code_t(udt_type_data_t *)> &editor, uint etf_flags=0)
 Edit udt/enum/func/array/ptr/bitfield. More...
 
tinfo_code_t edit_enum (const std::function< tinfo_code_t(enum_type_data_t *)> &editor, uint etf_flags=0)
 
tinfo_code_t edit_func (const std::function< tinfo_code_t(func_type_data_t *)> &editor, uint etf_flags=0)
 
tinfo_code_t edit_array (const std::function< tinfo_code_t(array_type_data_t *)> &editor, uint etf_flags=0)
 
tinfo_code_t edit_ptr (const std::function< tinfo_code_t(ptr_type_data_t *)> &editor, uint etf_flags=0)
 
tinfo_code_t edit_bitfield (const std::function< tinfo_code_t(bitfield_type_data_t *)> &editor, uint etf_flags=0)
 
bool compare_with (const tinfo_t &r, int tcflags=0) const
 Compare two types, based on given flags (see tinfo_t comparison flags)
 
bool equals_to (const tinfo_t &r) const
 
bool is_castable_to (const tinfo_t &target) const
 
bool is_manually_castable_to (const tinfo_t &target) const
 
Convenience functions
bool create_ptr (const tinfo_t &tif, uchar bps=0, type_t decl_type=BT_PTR)
 
bool create_array (const tinfo_t &tif, uint32 nelems=0, uint32 base=0, type_t decl_type=BT_ARRAY)
 
void create_typedef (const til_t *til, const char *name, type_t decl_type=BTF_TYPEDEF, bool try_ordinal=true)
 
void create_typedef (const til_t *til, uint ord, type_t decl_type=BTF_TYPEDEF)
 
bool create_bitfield (uchar nbytes, uchar width, bool is_unsigned=false, type_t decl_type=BT_BITFIELD)
 
Warning

These functions consume 'p' (make it empty)

bool create_udt (udt_type_data_t &p)
 
bool create_udt (udt_type_data_t &p, type_t decl_type)
 
bool create_enum (enum_type_data_t &p, type_t decl_type=BTF_ENUM)
 
bool create_func (func_type_data_t &p, type_t decl_type=BT_FUNC)
 
ssize_t get_udm_by_tid (udm_t *udm, tid_t tid)
 Retrive tinfo using type TID or struct/enum member MID. More...
 
ssize_t get_edm_by_tid (edm_t *edm, tid_t tid)
 
bool get_type_by_tid (tid_t tid)
 
Store type

Store the type info in the type library as a named or numbered type.

The tinfo_t object will be replaced by a reference to the created type. Allowed bits for ntf_flags: NTF_NOBASE, NTF_REPLACE

tinfo_code_t set_named_type (til_t *til, const char *name, int ntf_flags=0)
 
tinfo_code_t set_symbol_type (til_t *til, const char *name, int ntf_flags=0)
 
tinfo_code_t set_numbered_type (til_t *til, uint32 ord, int ntf_flags=0, const char *name=nullptr)
 
tinfo_code_t save_type (int ntf_flags=NTF_TYPE|NTF_REPLACE)
 
tinfo_code_t copy_type (til_t *til, const char *name, int ntf_flags=NTF_TYPE|NTF_COPY)
 
Bitfields

Helper functions to store/extract bitfield values

uint64 read_bitfield_value (uint64 v, int bitoff) const
 
uint64 write_bitfield_value (uint64 dst, uint64 v, int bitoff) const
 
Modifiers

Work with type modifiers: const and volatile

type_t get_modifiers () const
 
void set_modifiers (type_t mod)
 
void set_const ()
 
void set_volatile ()
 
void clr_decl_const_volatile ()
 
bool clr_const ()
 
bool clr_volatile ()
 
bool clr_const_volatile ()
 

Static Public Member Functions

static tinfo_t get_stock (stock_type_id_t id)
 Get stock type information. More...
 

Friends

struct type_detail_t
 
tinfo_t remove_pointer (const tinfo_t &tif)
 BT_PTR: If the current type is a pointer, return the pointed object. More...
 

Detailed Description

Primary mechanism for managing type information.

Member Enumeration Documentation

◆ bitmask_cvt_stance_t

Set or clear the 'bitmask' attribute of an enum.

This attribute controls if the enum is considered as a collection of bits or a plain enum. Enums having the 'bitmask' attribute can be used to represent bitwise combination of the defined enum members.

Parameters
stancebitmask_cvt_stance_t
etf_flagsetf_flag_t

Each group starts with a mask member. Group size is the number of enum constants in it, including group mask. GROUP_SIZES contains the group sizes. Sum of GROUPS_SIZES is equal to number of enum constants. If value is the only value in a group, no need for additional mask value.

Note
1. If mask candidate is equal to the next constant then this is not a bitmask enum 2. Constant 0 could not be a mask
Enumerator
ENUMBM_OFF 

convert to ordinal enum

ENUMBM_ON 

convert to bitmask enum

ENUMBM_AUTO 

convert to bitmask if the outcome is nice and useful

Member Function Documentation

◆ get_named_type()

bool tinfo_t::get_named_type ( const til_t til,
const char *  name,
type_t  decl_type = BTF_TYPEDEF,
bool  resolve = true,
bool  try_ordinal = true 
)
inline

Create a tinfo_t object for an existing named type.

Parameters
tiltype library to use
namename of the type to link to
decl_typeif the reference was explicitly specified with the type tag
(BTF_STRUCT/BTF_UNION/BTF_ENUM) you may specify it.
the kernel will accept only the specified tag after resolving
the type. If the resolved type does not correspond to the
explicitly specified tag, the type will be considered as undefined
resolvetrue: immediately resolve the type and return success code. false: return true but do not immediately resolve the type
try_ordinaltrue: try to replace name reference by an ordinal reference

◆ get_numbered_type()

bool tinfo_t::get_numbered_type ( const til_t til,
uint32  ordinal,
type_t  decl_type = BTF_TYPEDEF,
bool  resolve = true 
)
inline

Create a tinfo_t object for an existing ordinal type.

Parameters
tiltype library to use
ordinalnumber of the type to link to
decl_typeif the reference was explicitly specified with the type tag (BTF_STRUCT/BTF_UNION/BTF_ENUM) you may specify it. the kernel will accept only the specified tag after resolving the type. If the resolved type does not correspond to the explicitly specified tag, the type will be considered as undefined
resolvetrue: immediately resolve the type and return success code false: return true but do not immediately resolve the type

◆ deserialize()

bool tinfo_t::deserialize ( const til_t til,
const qtype ptype,
const qtype pfields = nullptr,
const qtype pfldcmts = nullptr,
const char *  cmt = nullptr 
)
inline

Deserialize a type string into a tinfo_t object.

◆ is_correct()

bool tinfo_t::is_correct ( ) const
inline

Is the type object correct?.

It is possible to create incorrect types. For example, we can define a function that returns an enum and then delete the enum type. If this function returns false, the type should not be used in disassembly. Please note that this function does not verify all involved types: for example, pointers to undefined types are permitted.

◆ get_realtype()

type_t tinfo_t::get_realtype ( bool  full = false) const
inline

Get the resolved base type.

Deserialization options:

  • if full=true, the referenced type will be deserialized fully, this may not always be desirable (slows down things)
  • if full=false, we just return the base type, the referenced type will be resolved again later if necessary (this may lead to multiple resolvings of the same type) imho full=false is a better approach because it does not perform unnecessary actions just in case. however, in some cases the caller knows that it is very likely that full type info will be required. in those cases full=true makes sense

◆ get_decltype()

THREAD_SAFE type_t tinfo_t::get_decltype ( ) const
inline

Get declared type (without resolving type references; they are returned as is).

Obviously this is a very fast function and should be used instead of get_realtype() if possible. Please note that for typerefs this function will return BTF_TYPEDEF. To determine if a typeref is a typedef, use is_typedef()

◆ get_size()

size_t tinfo_t::get_size ( uint32 p_effalign = nullptr,
int  gts_code = 0 
) const
inline

Get the type size in bytes.

Parameters
p_effalignbuffer for the alignment value
gts_codecombination of GTS_... constants
Returns
BADSIZE in case of problems

◆ get_unpadded_size()

size_t tinfo_t::get_unpadded_size ( ) const
inline

Get the type size in bytes without the final padding, in bytes.

For some UDTs get_unpadded_size() != get_size()

◆ get_type_name()

bool tinfo_t::get_type_name ( qstring out) const
inline

Does a type refer to a name?.

If yes, fill the provided buffer with the type name and return true. Names are returned for numbered types too: either a user-defined nice name or, if a user-provided name does not exist, an ordinal name (like #xx, see create_numbered_type_name()).

◆ get_nice_type_name()

bool tinfo_t::get_nice_type_name ( qstring out) const
inline

Get the beautified type name.

Get the referenced name and apply regular expressions from goodname.cfg to beautify the name

◆ rename_type()

tinfo_code_t tinfo_t::rename_type ( const char *  name,
int  ntf_flags = 0 
)
inline

Rename a type.

Parameters
namenew type name
ntf_flagsFlags for named types
Note
The change is saved immediately

◆ get_final_type_name()

bool tinfo_t::get_final_type_name ( qstring out) const
inline

Use in the case of typedef chain (TYPE1 -> TYPE2 -> TYPE3...TYPEn).

Returns
the name of the last type in the chain (TYPEn). if there is no chain, returns TYPE1

◆ get_next_type_name()

bool tinfo_t::get_next_type_name ( qstring out) const
inline

Use In the case of typedef chain (TYPE1 -> TYPE2 -> TYPE3...TYPEn).

Returns
the name of the next type in the chain (TYPE2). if there is no chain, returns failure

◆ get_tid()

tid_t tinfo_t::get_tid ( ) const
inline

Get the type tid Each type in the local type library has a so-called `tid` associated with it.

The tid is used to collect xrefs to the type. The tid is created when the type is created in the local type library and does not change afterwards. It can be passed to xref-related functions instead of the address.

Returns
tid or BADADDR
Note
types that do not come from a type library (that exist only in the memory) can not have a tid.

◆ force_tid()

tid_t tinfo_t::force_tid ( )
inline

Get the type tid.

Create if it does not exist yet. If the type comes from a base til, the type will be copied to the local til and a new tid will be created for it. (if the type comes from a base til, it does not have a tid yet). If the type comes from the local til, this function is equivalent to get_tid()

Returns
tid or BADADDR

◆ is_from_subtil()

bool tinfo_t::is_from_subtil ( ) const
inline

Was the named type found in some base type library (not the top level type library)?.

If yes, it usually means that the type comes from some loaded type library, not the local type library for the database

◆ is_forward_decl()

bool tinfo_t::is_forward_decl ( ) const
inline

Is this a forward declaration?.

Forward declarations are placeholders: the type definition does not exist

◆ get_forward_type()

type_t tinfo_t::get_forward_type ( ) const
inline

Get type of a forward declaration.

For a forward declaration this function returns its base type. In other cases it returns BT_UNK

◆ is_typedef()

bool tinfo_t::is_typedef ( ) const
inline

Is this a typedef?.

This function will return true for a reference to a local type that is declared as a typedef.

◆ get_type_cmt()

int tinfo_t::get_type_cmt ( qstring out) const
inline

Get type comment.

Returns
0-failed, 1-returned regular comment, 2-returned repeatable comment

◆ get_ptrarr_object()

tinfo_t tinfo_t::get_ptrarr_object ( ) const
inline

BT_PTR & BT_ARRAY: get the pointed object or array element.

If the current type is not a pointer or array, return empty type info.

◆ get_pointed_object()

tinfo_t tinfo_t::get_pointed_object ( ) const
inline

BT_PTR: get type of pointed object.

If the current type is not a pointer, return empty type info. See also get_ptrarr_object() and remove_pointer()

◆ get_methods()

bool tinfo_t::get_methods ( udtmembervec_t methods) const
inline

BT_COMPLEX: get a list of member functions declared in this udt.

Returns
false if no member functions exist

◆ get_bit_buckets()

bool tinfo_t::get_bit_buckets ( range64vec_t buckets) const
inline

::BT_STRUCT: get bit buckets Bit buckets are used to layout bitfields

Returns
false if wrong type was passed

◆ find_udm()

int tinfo_t::find_udm ( struct udm_t udm,
int  strmem_flags 
) const
inline

BTF_STRUCT,BTF_UNION: Find a udt member.

◆ requires_qualifier()

bool tinfo_t::requires_qualifier ( qstring out,
const char *  name,
uint64  offset 
) const
inline

Requires full qualifier? (name is not unique)

Parameters
outqualifier. may be nullptr
namefield name
offsetfield offset in bits
Returns
if the name is not unique, returns true

◆ append_covered()

bool tinfo_t::append_covered ( rangeset_t out,
uint64  offset = 0 
) const
inline

Calculate set of covered bytes for the type.

Parameters
outpointer to the output buffer. covered bytes will be appended to it.
offsetdelta in bytes to add to all calculations. used internally during recurion.

◆ calc_gaps()

bool tinfo_t::calc_gaps ( rangeset_t out) const
inline

Calculate set of padding bytes for the type.

Parameters
outpointer to the output buffer; old buffer contents will be lost.

◆ is_bitmask_enum()

bool tinfo_t::is_bitmask_enum ( ) const
inline

Is bitmask enum?

Returns
true for bitmask enum and false in other cases enum_type_data_t::is_bf()

◆ get_enum_radix()

int tinfo_t::get_enum_radix ( ) const
inline

Get enum constant radix.

Returns
radix or 1 for BTE_CHAR enum_type_data_t::get_enum_radix()

◆ get_edm()

tinfo_code_t tinfo_t::get_edm ( edm_t edm,
size_t  idx 
) const
inline

Get enum member.

Parameters
[out]edmenum type member
idxenum member index

◆ find_edm() [1/2]

tinfo_code_t tinfo_t::find_edm ( edm_t edm,
uint64  value,
bmask64_t  bmask = DEFMASK64,
uchar  serial = 0 
) const
inline

Find enum member.

Parameters
[out]edmenum type member
value
serial
bmask

◆ find_edm() [2/2]

tinfo_code_t tinfo_t::find_edm ( edm_t edm,
const char *  name 
) const
inline

Find enum member.

Parameters
[out]edmenum type member
name

◆ get_innermost_udm()

tinfo_t tinfo_t::get_innermost_udm ( uint64  bitoffset,
size_t *  out_index = nullptr,
uint64 *  out_bitoffset = nullptr 
) const
inline

Get the innermost member at the given offset.

Parameters
bitoffsetbit offset into the structure
[out]out_indexinnermost member index
[out]out_bitoffsetremaining offset into the returned member
Return values
udtwith the innermost member
emptytype if it is not a struct type or OFFSET could not be found

◆ print()

bool tinfo_t::print ( qstring out,
const char *  name = nullptr,
int  prtype_flags = PRTYPE_1LINE,
int  indent = 0,
int  cmtindent = 0,
const char *  prefix = nullptr,
const char *  cmt = nullptr 
) const
inline

Get a C-like string representation of the type.

Parameters
outoutput string
namename of type
prtype_flagsType printing flags
indentstructure level indent
cmtindentcomment indent
prefixstring prepended to each line
cmtcomment text (if specifed, overrides the type comment)
Returns
success

◆ set_attrs()

bool tinfo_t::set_attrs ( type_attrs_t tav)
inline

Set type attributes.

If necessary, a new typid will be created. this function modifies tav! (returns old attributes, if any)

Returns
false: bad attributes

◆ parse()

bool tinfo_t::parse ( const char *  decl,
til_t til = nullptr,
int  pt_flags = 0 
)
inline

Convenience function to parse a string with a type declaration.

Parameters
decla type declaration
tiltype library to use
pt_flagscombination of Type parsing flags bits

◆ get_udm_by_tid()

ssize_t tinfo_t::get_udm_by_tid ( udm_t udm,
tid_t  tid 
)
inline

Retrive tinfo using type TID or struct/enum member MID.

Parameters
tidtid can denote a type tid or a member tid.
udm[out]place to save the found member to, may be nullptr
edm[out]place to save the found member to, may be nullptr
Returns
if a member tid was specified, returns the member index, otherwise returns -1. if the function fails, THIS object becomes empty.

◆ get_type_by_edm_name()

bool tinfo_t::get_type_by_edm_name ( const char *  mname,
til_t til = nullptr 
)
inline

Retrieve enum tinfo using enum member name.

Parameters
tiltype library
mnameenum type member name
Returns
success If the function fails, THIS object becomes empty.

◆ create_forward_decl()

tinfo_code_t tinfo_t::create_forward_decl ( til_t til,
type_t  decl_type,
const char *  name,
int  ntf_flags = 0 
)
inline

Create a forward declaration.

decl_type: BTF_STRUCT, BTF_UNION, or BTF_ENUM

◆ get_stock()

static tinfo_t tinfo_t::get_stock ( stock_type_id_t  id)
inlinestatic

Get stock type information.

This function can be used to get tinfo_t for some common types. The same tinfo_t will be returned for the same id, thus saving memory and increasing the speed Please note that retrieving the STI_SIZE_T or STI_SSIZE_T stock type, will also have the side-effect of adding that type to the 'idati' TIL, under the well-known name 'size_t' or 'ssize_t' (respectively). The same is valid for STI_COMPLEX64 and STI_COMPLEX64 stock types with names 'complex64_t' and 'complex128_t' (respectively).

◆ convert_array_to_ptr()

bool tinfo_t::convert_array_to_ptr ( )
inline

Convert an array into a pointer.

type[] => type *

◆ remove_ptr_or_array()

bool tinfo_t::remove_ptr_or_array ( )
inline

Replace the current type with the ptr obj or array element.

This function performs one of the following conversions:

  • type[] => type
  • type* => type If the conversion is performed successfully, return true

◆ set_methods()

bool tinfo_t::set_methods ( udtmembervec_t methods)
inline

BT_COMPLEX: set the list of member functions.

This function consumes 'methods' (makes it empty).

Returns
false if this type is not a udt, or if the given list is empty

◆ get_alias_target()

uint32 tinfo_t::get_alias_target ( ) const
inline

Get type alias If the type has no alias, return 0.

◆ set_type_alias()

bool tinfo_t::set_type_alias ( uint32  dest_ord)
inline

Set type alias Redirects all references to source type to the destination type.

This is equivalent to instantaneous replacement all references to srctype by dsttype.

◆ set_udt_alignment()

tinfo_code_t tinfo_t::set_udt_alignment ( int  sda,
uint  etf_flags = 0 
)
inline

Set declared structure alignment (sda) This alignment supersedes the alignment returned by get_declalign() and is really used when calculating the struct layout.

However, the effective structure alignment may differ from `sda` because of packing. The type editing functions (they accept etf_flags) may overwrite this attribute.

◆ set_udt_pack()

tinfo_code_t tinfo_t::set_udt_pack ( int  pack,
uint  etf_flags = 0 
)
inline

Set structure packing.

The value controls how little a structure member alignment can be. Example: if pack=1, then it is possible to align a double to a byte. __attribute__((aligned(1))) double x; However, if pack=3, a double will be aligned to 8 (2**3) even if requested to be aligned to a byte. pack==0 will have the same effect. The type editing functions (they accept etf_flags) may overwrite this attribute.

◆ get_udm_tid()

tid_t tinfo_t::get_udm_tid ( size_t  idx) const
inline

Get udt member TID.

Parameters
idxthe index of udt the member
Returns
tid or BADADDR The tid is used to collect xrefs to the member, it can be passed to xref-related functions instead of the address.

◆ add_udm()

tinfo_code_t tinfo_t::add_udm ( const udm_t udm,
uint  etf_flags = 0,
size_t  times = 1,
ssize_t  idx = -1 
)
inline

Add a structure/union member.

Parameters
udmmember to add
etf_flagsedit_type() flags flags
timeshow many times to add. if times > 1, the member name will be appended a suffix like "_2" and so on
idxthe index in the udm array where the new udm should be placed. if the specified index cannot be honored because it would spoil the udm sorting order, it is silently ignored.
Note
ETF_NO_SAVE is ignored

◆ rename_udm()

tinfo_code_t tinfo_t::rename_udm ( size_t  index,
const char *  name,
uint  etf_flags = 0 
)
inline

Rename a structure/union member.

The new name must be unique.

Note
ETF_NO_SAVE is ignored

◆ set_udm_type()

tinfo_code_t tinfo_t::set_udm_type ( size_t  index,
const tinfo_t tif,
uint  etf_flags = 0,
const value_repr_t repr = nullptr 
)
inline

Set type of a structure/union member.

Parameters
indexmember index in the udm array
tifnew type for the member
etf_flagsetf_flag_t
reprnew representation for the member (optional)
Returns
tinfo_code_t

◆ set_udm_cmt()

tinfo_code_t tinfo_t::set_udm_cmt ( size_t  index,
const char *  cmt,
bool  is_regcmt = false,
uint  etf_flags = 0 
)
inline

Set a comment for a structure/union member.

A member may have just one comment, and it is either repeatable or regular.

◆ expand_udt()

tinfo_code_t tinfo_t::expand_udt ( size_t  idx,
adiff_t  delta,
uint  etf_flags = 0 
)
inline

Expand/shtrink a structure by adding/removing a gap before the specified member.

Parameters
idxindex of the member
deltanumber of bytes to add or remove
etf_flagsetf_flag_t Please note that it is impossible to add a gap at the very end of a structure. However, adding before a regular member is possible. This function can be used to remove gaps in the middle of a structure by specifying a negative delta value.

◆ set_enum_width()

tinfo_code_t tinfo_t::set_enum_width ( int  nbytes,
uint  etf_flags = 0 
)
inline

Set the width of enum base type.

Parameters
nbyteswidth of enum base type, allowed values: 0 (unspecified),1,2,4,8,16,32,64
etf_flagsetf_flag_t

◆ set_enum_sign()

tinfo_code_t tinfo_t::set_enum_sign ( type_sign_t  sign,
uint  etf_flags = 0 
)
inline

Set enum sign.

Parameters
signtype_sign_t
etf_flagsetf_flag_t

◆ set_enum_repr()

tinfo_code_t tinfo_t::set_enum_repr ( const value_repr_t repr,
uint  etf_flags = 0 
)
inline

Set the representation of enum members.

Parameters
reprvalue_repr_t
etf_flagsetf_flag_t

◆ add_edm()

tinfo_code_t tinfo_t::add_edm ( const edm_t edm,
bmask64_t  bmask = DEFMASK64,
uint  etf_flags = 0,
ssize_t  idx = -1 
)
inline

Add a new enum member (a new symbolic constant)

Parameters
edmthe constant name, value, and comment
bmaskbmask of the group to add the constant to
etf_flagsetf_flag_t ETF_FORCENAME may be used in case of TERR_ALIEN_NAME
idxthe index in the edm array where the new edm should be placed. if the specified index cannot be honored because it would spoil the edm sorting order, it is silently ignored.
Note
1. For non-bitmask enum push back constant, BMASK is not used (set it ot -1), never failed 2. For bitmask enum:
  • if VAL and BMASK are not agreed, return TERR_BAD_MSKVAL
  • if group with BMASK exists, push back constant to group
  • otherwise use constant as bitmask for a new group
ETF_NO_SAVE is ignored

◆ del_edms()

tinfo_code_t tinfo_t::del_edms ( size_t  idx1,
size_t  idx2,
uint  etf_flags = 0 
)
inline

Delete enum members.

Parameters
idx1index in edmvec_t
idx2index in edmvec_t or size_t(-1)
etf_flagsetf_flag_t Delete enum members in [idx1, idx2)
Note
For bitmask enum, the first member of a non-trivial group (having 2 or more members) is considered as a group mask. It is impossible to delete the group mask of a non-trivial group, other members of the group must be deleted first. Empty groups are automatically deleted.

◆ rename_edm()

tinfo_code_t tinfo_t::rename_edm ( size_t  idx,
const char *  name,
uint  etf_flags = 0 
)
inline

Rename a enum member.

Parameters
idxindex in edmvec_t
namenew name
etf_flagsetf_flag_t ETF_FORCENAME may be used in case of TERR_ALIEN_NAME
Note
ETF_NO_SAVE is ignored

◆ set_edm_cmt()

tinfo_code_t tinfo_t::set_edm_cmt ( size_t  idx,
const char *  cmt,
uint  etf_flags = 0 
)
inline

Set a comment for an enum member.

Such comments are always considered as repeatable.

Parameters
idxindex in edmvec_t
cmtcomment
etf_flagsetf_flag_t

◆ edit_edm()

tinfo_code_t tinfo_t::edit_edm ( size_t  idx,
uint64  value,
bmask64_t  bmask = DEFMASK64,
uint  etf_flags = 0 
)
inline

Change constant value and/or bitmask.

Parameters
idxindex in edmvec_t
valueold or new value
bmaskold or new bitmask
etf_flagsetf_flag_t
Note
if new bitmask is specified the index of constant may be changed

◆ edit_udt()

tinfo_code_t tinfo_t::edit_udt ( const std::function< tinfo_code_t(udt_type_data_t *)> &  editor,
uint  etf_flags = 0 
)
inline

Edit udt/enum/func/array/ptr/bitfield.

These functions may be used if the desired functionality is not provided by the STA_... based functions.

Parameters
editorcallback to modify the type details; should return true on success
etf_flagscombination of etf_flag_t constants

Friends And Related Function Documentation

◆ remove_pointer

tinfo_t remove_pointer ( const tinfo_t tif)
friend

BT_PTR: If the current type is a pointer, return the pointed object.

If the current type is not a pointer, return the current type. See also get_ptrarr_object() and get_pointed_object()


The documentation for this class was generated from the following file: