1 #ifndef TARGET_H
   2 #define TARGET_H
   3 
   4 extern struct symbol *size_t_ctype;
   5 extern struct symbol *ssize_t_ctype;
   6 
   7 /*
   8  * For "__attribute__((aligned))"
   9  */
  10 extern int max_alignment;
  11 
  12 /*
  13  * Integer data types
  14  */
  15 extern int bits_in_bool;
  16 extern int bits_in_char;
  17 extern int bits_in_short;
  18 extern int bits_in_int;
  19 extern int bits_in_long;
  20 extern int bits_in_longlong;
  21 extern int bits_in_longlonglong;
  22 
  23 extern int bits_in_wchar;
  24 
  25 extern int max_int_alignment;
  26 
  27 /*
  28  * Floating point data types
  29  */
  30 extern int bits_in_float;
  31 extern int bits_in_double;
  32 extern int bits_in_longdouble;
  33 
  34 extern int max_fp_alignment;
  35 
  36 /*
  37  * Pointer data type
  38  */
  39 extern int bits_in_pointer;
  40 extern int pointer_alignment;
  41 
  42 /*
  43  * Enum data types
  44  */
  45 extern int bits_in_enum;
  46 extern int enum_alignment;
  47 
  48 /*
  49  * Helper functions for converting bits to bytes and vice versa.
  50  */
  51 
  52 static inline int bits_to_bytes(int bits)
  53 {
  54         return bits >= 0 ? (bits + bits_in_char - 1) / bits_in_char : -1;
  55 }
  56 
  57 static inline int bytes_to_bits(int bytes)
  58 {
  59         return bytes * bits_in_char;
  60 }
  61 
  62 static inline unsigned long array_element_offset(unsigned long base_bits, int idx)
  63 {
  64         int fragment = base_bits % bits_in_char;
  65         if (fragment)
  66                 base_bits += bits_in_char - fragment;
  67         return base_bits * idx;
  68 }
  69 
  70 #endif