#ifndef TARGET_H #define TARGET_H #include "machine.h" extern struct symbol *size_t_ctype; extern struct symbol *ssize_t_ctype; extern struct symbol *ptrdiff_ctype; extern struct symbol *intptr_ctype; extern struct symbol *uintptr_ctype; extern struct symbol *intmax_ctype; extern struct symbol *uintmax_ctype; extern struct symbol *int64_ctype; extern struct symbol *uint64_ctype; extern struct symbol *int32_ctype; extern struct symbol *uint32_ctype; extern struct symbol *wchar_ctype; extern struct symbol *wint_ctype; extern struct symbol *least8_ctype; extern struct symbol *uleast8_ctype; extern struct symbol *least16_ctype; extern struct symbol *uleast16_ctype; extern struct symbol *least32_ctype; extern struct symbol *uleast32_ctype; extern struct symbol *least64_ctype; extern struct symbol *uleast64_ctype; extern struct symbol *fast8_ctype; extern struct symbol *ufast8_ctype; extern struct symbol *fast16_ctype; extern struct symbol *ufast16_ctype; extern struct symbol *fast32_ctype; extern struct symbol *ufast32_ctype; extern struct symbol *fast64_ctype; extern struct symbol *ufast64_ctype; extern struct symbol *sig_atomic_ctype; /* * For "__attribute__((aligned))" */ extern int max_alignment; /* * Integer data types */ extern int bits_in_bool; extern int bits_in_char; extern int bits_in_short; extern int bits_in_int; extern int bits_in_long; extern int bits_in_longlong; extern int bits_in_longlonglong; extern int max_int_alignment; /* * Floating point data types */ extern int bits_in_float; extern int bits_in_double; extern int bits_in_longdouble; extern int max_fp_alignment; /* * Pointer data type */ extern int bits_in_pointer; extern int pointer_alignment; /* * Enum data types */ extern int bits_in_enum; extern int enum_alignment; struct asm_operand; struct builtin_fn; struct target { enum machine mach; enum bitness bitness; unsigned int big_endian:1; unsigned int unsigned_char:1; unsigned int size_t_long:1; unsigned int has_int128:1; unsigned long flags; struct symbol *wchar; struct symbol *wint; unsigned int bits_in_longdouble; unsigned int max_fp_alignment; const struct target *target_32bit; const struct target *target_x32bit; const struct target *target_64bit; const struct builtin_fn *builtins; void (*init)(const struct target *self); void (*parse_march)(const char *arg); void (*predefine)(const struct target *self); const char *(*asm_constraint)(struct asm_operand *op, int c, const char *str); }; extern const struct target target_default; extern const struct target target_alpha; extern const struct target target_arm; extern const struct target target_arm64; extern const struct target target_bfin; extern const struct target target_h8300; extern const struct target target_m68k; extern const struct target target_microblaze; extern const struct target target_mips32; extern const struct target target_mips64; extern const struct target target_nds32; extern const struct target target_nios2; extern const struct target target_openrisc; extern const struct target target_ppc32; extern const struct target target_ppc64; extern const struct target target_riscv32; extern const struct target target_riscv64; extern const struct target target_s390; extern const struct target target_s390x; extern const struct target target_sh; extern const struct target target_sparc32; extern const struct target target_sparc64; extern const struct target target_i386; extern const struct target target_x86_64; extern const struct target target_xtensa; /* target.c */ extern const struct target *arch_target; enum machine target_parse(const char *name); void target_os(const char *name); void target_config(enum machine mach); void target_init(void); /* * Helper functions for converting bits to bytes and vice versa. */ static inline int bits_to_bytes(int bits) { return bits >= 0 ? (bits + bits_in_char - 1) / bits_in_char : -1; } static inline int bytes_to_bits(int bytes) { return bytes * bits_in_char; } static inline unsigned long array_element_offset(unsigned long base_bits, int idx) { int fragment = base_bits % bits_in_char; if (fragment) base_bits += bits_in_char - fragment; return base_bits * idx; } #endif