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.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-Id: <1477067922-26202-1-git-send-email-peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Peter Maydell 2016-10-21 17:38:42 +01:00 committed by Richard Henderson
parent 15610d42b9
commit a40d4701bc
1 changed files with 30 additions and 8 deletions

View File

@ -376,14 +376,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;