#ifndef _ICONV_TM_H
#define _ICONV_TM_H
#ifdef __cplusplus
extern "C" {
#endif
#include <inttypes.h>
#include <sys/isa_defs.h>
#include <sys/types.h>
#if !defined(DEBUG)
#define NDEBUG
#endif
#if defined(DEBUG)
#define ENABLE_TRACE
#endif
#define MAXSEQUENCE (128)
#define MAXREGID (256)
#define MAXNAMELENGTH (255)
#define ITM_IDENT_LEN (4)
#define ITM_IDENT_0 (0x49)
#define ITM_IDENT_1 (0x54)
#define ITM_IDENT_2 (0x4d)
#define ITM_IDENT_3 (0x00)
#define ITM_SPEC_LEN (4)
#define ITM_SPEC_0 (0)
#define ITM_SPEC_1 (0)
#define ITM_SPEC_2 (0)
#define ITM_SPEC_3_UNSPECIFIED (0)
#define ITM_SPEC_3_32_BIG_ENDIAN (1)
#define ITM_SPEC_3_32_LITTLE_ENDIAN (2)
#define ITM_SPEC_3_64_BIG_ENDIAN (3)
#define ITM_SPEC_3_64_LITTLE_ENDIAN (4)
#define ITM_VER_LEN (4)
#define ITM_VER_0 (0)
#define ITM_VER_1 (0)
#define ITM_VER_2 (0)
#define ITM_VER_3 (1)
#define ITM_PAD_LEN (4)
typedef uint32_t pad_t;
typedef ulong_t itm_type_t;
typedef uintptr_t itm_place2_t;
typedef size_t itm_size_t;
typedef long itm_num_t;
typedef union itm_place_union {
int64_t itm_64d;
struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
itm_place2_t ptr;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
}itm_place_union_struct;
char itm_c[8];
} itm_place_t;
#define itm_ptr itm_place_union_struct.ptr
#define itm_pad itm_place_union_struct.pad
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
itm_size_t size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
itm_place_t place;
} itm_data_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_place_t place;
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_num_t number;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
} itm_place_tbl_info_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_place_t place;
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_num_t number;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
} itm_section_info_t;
#define ITM_TBL_MASK (0x000000ffUL)
#define ITM_TBL_NONE (0x00000000UL)
#define ITM_TBL_ITM (0x00000001UL)
#define ITM_TBL_DIREC (0x00000002UL)
#define ITM_TBL_COND (0x00000003UL)
#define ITM_TBL_MAP (0x00000004UL)
#define ITM_TBL_OP (0x00000005UL)
#define ITM_TBL_RANGE (0x00000006UL)
#define ITM_TBL_ESCAPESEQ (0x00000007UL)
#define ITM_TBL_NONE_NONE (ITM_TBL_NONE | 0x00000000UL)
#define ITM_TBL_DIREC_NONE (ITM_TBL_DIREC | 0x00000000UL)
#define ITM_TBL_DIREC_RESET (ITM_TBL_DIREC | 0x00000100UL)
#define ITM_TBL_COND_NONE (ITM_TBL_COND | 0x00000000UL)
#define ITM_TBL_MAP_NONE (ITM_TBL_MAP | 0x00000000UL)
#define ITM_TBL_MAP_INDEX_FIXED_1_1 (ITM_TBL_MAP | 0x00000100UL)
#define ITM_TBL_MAP_INDEX_FIXED (ITM_TBL_MAP | 0x00000200UL)
#define ITM_TBL_MAP_LOOKUP (ITM_TBL_MAP | 0x00000300UL)
#define ITM_TBL_MAP_HASH (ITM_TBL_MAP | 0x00000400UL)
#define ITM_TBL_MAP_DENSE_ENC (ITM_TBL_MAP | 0x00000500UL)
#define ITM_TBL_MAP_VAR (ITM_TBL_MAP | 0x00000600UL)
#define ITM_TBL_OP_NONE (ITM_TBL_OP | 0x00000000UL)
#define ITM_TBL_OP_INIT (ITM_TBL_OP | 0x00000100UL)
#define ITM_TBL_OP_RESET (ITM_TBL_OP | 0x00000200UL)
#define ITM_TBL_RANGE_NONE (ITM_TBL_RANGE | 0x00000000UL)
#define ITM_TBL_ESCAPESEQ_NONE (ITM_TBL_ESCAPESEQ | 0x00000000UL)
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_type_t type;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_place_t name;
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
itm_num_t number;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
} itm_tbl_hdr_t;
typedef struct {
unsigned char ident[ITM_IDENT_LEN];
unsigned char spec[ITM_SPEC_LEN];
unsigned char version[ITM_VER_LEN];
unsigned char padding[ITM_PAD_LEN];
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t itm_hdr_size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_place_t itm_size;
itm_data_t type_id;
itm_data_t interpreter;
itm_place_t op_init_tbl;
itm_place_t op_reset_tbl;
itm_place_t direc_init_tbl;
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
itm_num_t reg_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
itm_place_t info_hdr;
} itm_hdr_t;
typedef struct {
itm_section_info_t str_sec;
itm_section_info_t direc_tbl_sec;
itm_section_info_t cond_tbl_sec;
itm_section_info_t map_tbl_sec;
itm_section_info_t op_tbl_sec;
itm_section_info_t range_tbl_sec;
itm_section_info_t escapeseq_tbl_sec;
itm_section_info_t data_sec;
itm_section_info_t name_sec;
itm_place_tbl_info_t str_plc_tbl;
itm_place_tbl_info_t direc_plc_tbl;
itm_place_tbl_info_t cond_plc_tbl;
itm_place_tbl_info_t map_plc_tbl;
itm_place_tbl_info_t op_plc_tbl;
itm_place_tbl_info_t range_plc_tbl;
itm_place_tbl_info_t escapeseq_plc_tbl;
itm_place_tbl_info_t data_plc_tbl;
itm_place_tbl_info_t name_plc_tbl;
itm_place_tbl_info_t reg_plc_tbl;
} itm_info_hdr_t;
typedef enum {
ITM_ACTION_NONE,
ITM_ACTION_DIRECTION,
ITM_ACTION_MAP,
ITM_ACTION_OPERATION
} itm_action_type_t;
typedef struct {
itm_place_t condition;
itm_place_t action;
} itm_direc_t;
typedef enum {
ITM_COND_NONE = 0,
ITM_COND_BETWEEN = 1,
ITM_COND_EXPR = 2,
ITM_COND_ESCAPESEQ = 3
} itm_cond_type_t;
typedef struct {
pad_t pad;
itm_cond_type_t type;
union {
itm_place_t place;
itm_data_t data;
} operand;
} itm_cond_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
itm_size_t len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad;
#endif
} itm_range_hdr_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t len_min;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t len_max;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
} itm_escapeseq_hdr_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t source_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t result_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_place_t start;
itm_place_t end;
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
itm_num_t default_error;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
itm_num_t error_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
} itm_map_idx_fix_hdr_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t source_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t result_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
itm_num_t default_error;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
itm_num_t error_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
} itm_map_lookup_hdr_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t source_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t result_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
itm_size_t hash_tbl_size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad4;
#endif
itm_num_t hash_tbl_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad4;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad5;
#endif
itm_size_t hash_of_size;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad5;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad6;
#endif
itm_num_t hash_of_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad6;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad7_num;
#endif
itm_num_t default_error;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad7_num;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad8_num;
#endif
itm_num_t error_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad8_num;
#endif
} itm_map_hash_hdr_t;
typedef struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
itm_size_t source_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad1;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
itm_size_t result_len;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad2;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
itm_num_t default_error;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad3_num;
#endif
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
itm_num_t error_num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad4_num;
#endif
} itm_map_dense_enc_hdr_t;
typedef enum {
ITM_OP_NONE,
ITM_OP_ERROR,
ITM_OP_ERROR_D,
ITM_OP_OUT,
ITM_OP_OUT_D,
ITM_OP_OUT_S,
ITM_OP_OUT_R,
ITM_OP_OUT_INVD,
ITM_OP_DISCARD,
ITM_OP_DISCARD_D,
ITM_OP_EXPR,
ITM_OP_IF,
ITM_OP_IF_ELSE,
ITM_OP_DIRECTION,
ITM_OP_MAP,
ITM_OP_OPERATION,
ITM_OP_INIT,
ITM_OP_RESET,
ITM_OP_BREAK,
ITM_OP_RETURN,
ITM_OP_PRINTCHR,
ITM_OP_PRINTHD,
ITM_OP_PRINTINT
} itm_op_type_t;
typedef struct {
pad_t pad;
itm_op_type_t type;
itm_place_t name;
union {
itm_place_t operand[3];
itm_data_t value;
struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad_num;
#endif
itm_num_t num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad_num;
#endif
} itm_op_num;
} data;
} itm_op_t;
#define itm_opnum itm_op_num.num
#define itm_oppad itm_op_num.pad_num
#define ITM_EXPR_PROTO(type, op0, op1) ITM_EXPR_##type##_##op0##_##op1
#define ITM_EXPR_BIN(type) \
ITM_EXPR_PROTO(type, E, E), \
ITM_EXPR_PROTO(type, E, D), \
ITM_EXPR_PROTO(type, E, R), \
ITM_EXPR_PROTO(type, E, INVD), \
ITM_EXPR_PROTO(type, D, E), \
ITM_EXPR_PROTO(type, D, D), \
ITM_EXPR_PROTO(type, D, R), \
ITM_EXPR_PROTO(type, D, INVD), \
ITM_EXPR_PROTO(type, R, E), \
ITM_EXPR_PROTO(type, R, D), \
ITM_EXPR_PROTO(type, R, R), \
ITM_EXPR_PROTO(type, R, INVD), \
ITM_EXPR_PROTO(type, INVD, E), \
ITM_EXPR_PROTO(type, INVD, D), \
ITM_EXPR_PROTO(type, INVD, R), \
ITM_EXPR_PROTO(type, INVD, INVD)
#define ITM_EXPR_PLUS ITM_EXPR_PLUS_E_E
#define ITM_EXPR_MINUS ITM_EXPR_MINUS_E_E
#define ITM_EXPR_MUL ITM_EXPR_MUL_E_E
#define ITM_EXPR_DIV ITM_EXPR_DIV_E_E
#define ITM_EXPR_MOD ITM_EXPR_MOD_E_E
#define ITM_EXPR_SHIFT_L ITM_EXPR_SHIFT_L_E_E
#define ITM_EXPR_SHIFT_R ITM_EXPR_SHIFT_R_E_E
#define ITM_EXPR_OR ITM_EXPR_OR_E_E
#define ITM_EXPR_XOR ITM_EXPR_XOR_E_E
#define ITM_EXPR_AND ITM_EXPR_AND_E_E
#define ITM_EXPR_EQ ITM_EXPR_EQ_E_E
#define ITM_EXPR_NE ITM_EXPR_NE_E_E
#define ITM_EXPR_GT ITM_EXPR_GT_E_E
#define ITM_EXPR_GE ITM_EXPR_GE_E_E
#define ITM_EXPR_LT ITM_EXPR_LT_E_E
#define ITM_EXPR_LE ITM_EXPR_LE_E_E
typedef enum {
ITM_EXPR_NONE,
ITM_EXPR_NOP,
ITM_EXPR_NAME,
ITM_EXPR_INT,
ITM_EXPR_SEQ,
ITM_EXPR_REG,
ITM_EXPR_IN_VECTOR,
ITM_EXPR_IN_VECTOR_D,
ITM_EXPR_OUT,
ITM_EXPR_TRUE,
ITM_EXPR_FALSE,
ITM_EXPR_IN,
ITM_EXPR_UMINUS,
ITM_EXPR_BIN(PLUS),
ITM_EXPR_BIN(MINUS),
ITM_EXPR_BIN(MUL),
ITM_EXPR_BIN(DIV),
ITM_EXPR_BIN(MOD),
ITM_EXPR_BIN(SHIFT_L),
ITM_EXPR_BIN(SHIFT_R),
ITM_EXPR_BIN(OR),
ITM_EXPR_BIN(XOR),
ITM_EXPR_BIN(AND),
ITM_EXPR_BIN(EQ),
ITM_EXPR_BIN(NE),
ITM_EXPR_BIN(GT),
ITM_EXPR_BIN(GE),
ITM_EXPR_BIN(LT),
ITM_EXPR_BIN(LE),
ITM_EXPR_NOT,
ITM_EXPR_NEG,
ITM_EXPR_LOR,
ITM_EXPR_LAND,
ITM_EXPR_ASSIGN,
ITM_EXPR_OUT_ASSIGN,
ITM_EXPR_IN_EQ,
ITM_EXPR_IF,
ITM_EXPR_ELSE
} itm_expr_type_t;
#define ITM_OPERAND_EXPR (0)
#define ITM_OPERAND_PLACE (1)
#define ITM_OPERAND_VALUE (2)
#define ITM_OPERAND_REGISTER (3)
typedef struct {
pad_t pad;
itm_expr_type_t type;
union {
itm_place_t operand[2];
itm_data_t value;
struct {
#if !defined(_LP64) && !defined(_LITTLE_ENDIAN)
pad_t pad_num;
#endif
itm_num_t num;
#if !defined(_LP64) && defined(_LITTLE_ENDIAN)
pad_t pad_num;
#endif
} itm_ex_num;
} data;
} itm_expr_t;
#define itm_exnum itm_ex_num.num
#define itm_expad itm_ex_num.pad_num
#ifdef __cplusplus
}
#endif
#endif