tcg/tcg.h: Improve documentation of TCGv_i32 etc types

The typedefs we use for the TCGv_i32, TCGv_i64 and TCGv_ptr
types are somewhat confusing, because we define them as
pointers to structs, but the structs themselves are never
defined. Explain in the comments a bit more clearly why
this is OK and what is going on under the hood.

Backports commit a40d4701bc9f6e6a3bbfb7b4fbe756a5b72b5df1 from qemu
This commit is contained in:
Peter Maydell 2018-03-01 08:40:28 -05:00 committed by Lioncash
parent f5a35908da
commit f9c5c1a604
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -379,14 +379,36 @@ static inline unsigned get_alignment_bits(TCGMemOp memop)
typedef tcg_target_ulong TCGArg; typedef tcg_target_ulong TCGArg;
/* Define a type and accessor macros for variables. Using pointer types /* Define type and accessor macros for TCG variables.
is nice because it gives some level of type safely. Converting to and
from intptr_t rather than int reduces the number of sign-extension TCG variables are the inputs and outputs of TCG ops, as described
instructions that get implied on 64-bit hosts. Users of tcg_gen_* don't in tcg/README. Target CPU front-end code uses these types to deal
need to know about any of this, and should treat TCGv as an opaque type. with TCG variables as it emits TCG code via the tcg_gen_* functions.
In addition we do typechecking for different types of variables. TCGv_i32 They come in several flavours:
and TCGv_i64 are 32/64-bit variables respectively. TCGv and TCGv_ptr * TCGv_i32 : 32 bit integer type
are aliases for target_ulong and host pointer sized values respectively. */ * TCGv_i64 : 64 bit integer type
* TCGv_ptr : a host pointer type
* TCGv : an integer type the same size as target_ulong
(an alias for either TCGv_i32 or TCGv_i64)
The compiler's type checking will complain if you mix them
up and pass the wrong sized TCGv to a function.
Users of tcg_gen_* don't need to know about any of the internal
details of these, and should treat them as opaque types.
You won't be able to look inside them in a debugger either.
Internal implementation details follow:
Note that there is no definition of the structs TCGv_i32_d etc anywhere.
This is deliberate, because the values we store in variables of type
TCGv_i32 are not really pointers-to-structures. They're just small
integers, but keeping them in pointer types like this means that the
compiler will complain if you accidentally pass a TCGv_i32 to a
function which takes a TCGv_i64, and so on. Only the internals of
TCG need to care about the actual contents of the types, and they always
box and unbox via the MAKE_TCGV_* and GET_TCGV_* functions.
Converting to and from intptr_t rather than int reduces the number
of sign-extension instructions that get implied on 64-bit hosts. */
typedef struct TCGv_i32_d *TCGv_i32; typedef struct TCGv_i32_d *TCGv_i32;
typedef struct TCGv_i64_d *TCGv_i64; typedef struct TCGv_i64_d *TCGv_i64;