predefine.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. // SPDX-License-Identifier: MIT
  2. // Copyright (C) 2017-2020 Luc Van Oostenryck.
  3. #include <stdio.h>
  4. #include "lib.h"
  5. #include "machine.h"
  6. #include "symbol.h"
  7. #define PTYPE_SIZEOF (1U << 0)
  8. #define PTYPE_T (1U << 1)
  9. #define PTYPE_MAX (1U << 2)
  10. #define PTYPE_MIN (1U << 3)
  11. #define PTYPE_WIDTH (1U << 4)
  12. #define PTYPE_TYPE (1U << 5)
  13. #define PTYPE_ALL (PTYPE_MAX|PTYPE_SIZEOF|PTYPE_WIDTH)
  14. #define PTYPE_ALL_T (PTYPE_MAX|PTYPE_SIZEOF|PTYPE_WIDTH|PTYPE_T)
  15. static void predefined_sizeof(const char *name, const char *suffix, unsigned bits)
  16. {
  17. char buf[32];
  18. snprintf(buf, sizeof(buf), "__SIZEOF_%s%s__", name, suffix);
  19. predefine(buf, 1, "%d", bits/8);
  20. }
  21. static void predefined_width(const char *name, struct symbol *type)
  22. {
  23. char buf[32];
  24. snprintf(buf, sizeof(buf), "__%s_WIDTH__", name);
  25. predefine(buf, 1, "%d", type->bit_size);
  26. }
  27. static void predefined_max(const char *name, struct symbol *type)
  28. {
  29. const char *suffix = builtin_type_suffix(type);
  30. unsigned bits = type->bit_size - is_signed_type(type);
  31. unsigned long long max = bits_mask(bits);
  32. char buf[32];
  33. snprintf(buf, sizeof(buf), "__%s_MAX__", name);
  34. predefine(buf, 1, "%#llx%s", max, suffix);
  35. }
  36. static void predefined_min(const char *name, struct symbol *type)
  37. {
  38. const char *suffix = builtin_type_suffix(type);
  39. char buf[32];
  40. snprintf(buf, sizeof(buf), "__%s_MIN__", name);
  41. if (is_signed_type(type))
  42. add_pre_buffer("#weak_define %s (-__%s_MAX__ - 1)\n", buf, name);
  43. else
  44. predefine(buf, 1, "0%s", suffix);
  45. }
  46. static void predefined_type(const char *name, struct symbol *type)
  47. {
  48. const char *typename = builtin_typename(type);
  49. add_pre_buffer("#weak_define __%s_TYPE__ %s\n", name, typename);
  50. }
  51. static void predefined_ctype(const char *name, struct symbol *type, int flags)
  52. {
  53. unsigned bits = type->bit_size;
  54. if (flags & PTYPE_SIZEOF) {
  55. const char *suffix = (flags & PTYPE_T) ? "_T" : "";
  56. predefined_sizeof(name, suffix, bits);
  57. }
  58. if (flags & PTYPE_MAX)
  59. predefined_max(name, type);
  60. if (flags & PTYPE_MIN)
  61. predefined_min(name, type);
  62. if (flags & PTYPE_TYPE)
  63. predefined_type(name, type);
  64. if (flags & PTYPE_WIDTH)
  65. predefined_width(name, type);
  66. }
  67. void predefined_macros(void)
  68. {
  69. predefine("__CHECKER__", 0, "1");
  70. predefine("__GNUC__", 1, "%d", gcc_major);
  71. predefine("__GNUC_MINOR__", 1, "%d", gcc_minor);
  72. predefine("__GNUC_PATCHLEVEL__", 1, "%d", gcc_patchlevel);
  73. predefine("__STDC__", 1, "1");
  74. predefine("__STDC_HOSTED__", 0, fhosted ? "1" : "0");
  75. switch (standard) {
  76. default:
  77. break;
  78. case STANDARD_C94:
  79. predefine("__STDC_VERSION__", 1, "199409L");
  80. break;
  81. case STANDARD_C99:
  82. case STANDARD_GNU99:
  83. predefine("__STDC_VERSION__", 1, "199901L");
  84. break;
  85. case STANDARD_C11:
  86. case STANDARD_GNU11:
  87. predefine("__STDC_VERSION__", 1, "201112L");
  88. break;
  89. case STANDARD_C17:
  90. case STANDARD_GNU17:
  91. predefine("__STDC_VERSION__", 1, "201710L");
  92. break;
  93. }
  94. if (!(standard & STANDARD_GNU) && (standard != STANDARD_NONE))
  95. predefine("__STRICT_ANSI__", 1, "1");
  96. if (standard >= STANDARD_C11) {
  97. predefine("__STDC_NO_ATOMICS__", 1, "1");
  98. predefine("__STDC_NO_COMPLEX__", 1, "1");
  99. predefine("__STDC_NO_THREADS__", 1, "1");
  100. }
  101. predefine("__CHAR_BIT__", 1, "%d", bits_in_char);
  102. if (funsigned_char)
  103. predefine("__CHAR_UNSIGNED__", 1, "1");
  104. predefined_ctype("SHORT", &short_ctype, PTYPE_SIZEOF);
  105. predefined_ctype("SHRT", &short_ctype, PTYPE_MAX|PTYPE_WIDTH);
  106. predefined_ctype("SCHAR", &schar_ctype, PTYPE_MAX|PTYPE_WIDTH);
  107. predefined_ctype("WCHAR", wchar_ctype, PTYPE_ALL_T|PTYPE_MIN|PTYPE_TYPE);
  108. predefined_ctype("WINT", wint_ctype, PTYPE_ALL_T|PTYPE_MIN|PTYPE_TYPE);
  109. predefined_ctype("CHAR16", &ushort_ctype, PTYPE_TYPE);
  110. predefined_ctype("CHAR32", uint32_ctype, PTYPE_TYPE);
  111. predefined_ctype("INT", &int_ctype, PTYPE_ALL);
  112. predefined_ctype("LONG", &long_ctype, PTYPE_ALL);
  113. predefined_ctype("LONG_LONG", &llong_ctype, PTYPE_ALL);
  114. predefined_ctype("INT8", &schar_ctype, PTYPE_MAX|PTYPE_TYPE);
  115. predefined_ctype("UINT8", &uchar_ctype, PTYPE_MAX|PTYPE_TYPE);
  116. predefined_ctype("INT16", &short_ctype, PTYPE_MAX|PTYPE_TYPE);
  117. predefined_ctype("UINT16", &ushort_ctype, PTYPE_MAX|PTYPE_TYPE);
  118. predefined_ctype("INT32", int32_ctype, PTYPE_MAX|PTYPE_TYPE);
  119. predefined_ctype("UINT32", uint32_ctype, PTYPE_MAX|PTYPE_TYPE);
  120. predefined_ctype("INT64", int64_ctype, PTYPE_MAX|PTYPE_TYPE);
  121. predefined_ctype("UINT64", uint64_ctype, PTYPE_MAX|PTYPE_TYPE);
  122. predefined_ctype("INT_LEAST8", &schar_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  123. predefined_ctype("UINT_LEAST8", &uchar_ctype, PTYPE_MAX|PTYPE_TYPE);
  124. predefined_ctype("INT_LEAST16", &short_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  125. predefined_ctype("UINT_LEAST16",&ushort_ctype, PTYPE_MAX|PTYPE_TYPE);
  126. predefined_ctype("INT_LEAST32", int32_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  127. predefined_ctype("UINT_LEAST32", uint32_ctype, PTYPE_MAX|PTYPE_TYPE);
  128. predefined_ctype("INT_LEAST64", int64_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  129. predefined_ctype("UINT_LEAST64", uint64_ctype, PTYPE_MAX|PTYPE_TYPE);
  130. predefined_ctype("INT_FAST8", fast8_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  131. predefined_ctype("UINT_FAST8", ufast8_ctype, PTYPE_MAX|PTYPE_TYPE);
  132. predefined_ctype("INT_FAST16", fast16_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  133. predefined_ctype("UINT_FAST16",ufast16_ctype, PTYPE_MAX|PTYPE_TYPE);
  134. predefined_ctype("INT_FAST32", fast32_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  135. predefined_ctype("UINT_FAST32",ufast32_ctype, PTYPE_MAX|PTYPE_TYPE);
  136. predefined_ctype("INT_FAST64", fast64_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  137. predefined_ctype("UINT_FAST64",ufast64_ctype, PTYPE_MAX|PTYPE_TYPE);
  138. predefined_ctype("INTMAX", intmax_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  139. predefined_ctype("UINTMAX", uintmax_ctype, PTYPE_MAX|PTYPE_TYPE);
  140. predefined_ctype("INTPTR", intptr_ctype, PTYPE_MAX|PTYPE_TYPE|PTYPE_WIDTH);
  141. predefined_ctype("UINTPTR", uintptr_ctype, PTYPE_MAX|PTYPE_TYPE);
  142. predefined_ctype("PTRDIFF", ptrdiff_ctype, PTYPE_ALL_T|PTYPE_TYPE);
  143. predefined_ctype("SIZE", size_t_ctype, PTYPE_ALL_T|PTYPE_TYPE);
  144. predefined_ctype("POINTER", &ptr_ctype, PTYPE_SIZEOF);
  145. predefined_ctype("SIG_ATOMIC", sig_atomic_ctype, PTYPE_MAX|PTYPE_MIN|PTYPE_TYPE|PTYPE_WIDTH);
  146. predefined_sizeof("FLOAT", "", bits_in_float);
  147. predefined_sizeof("DOUBLE", "", bits_in_double);
  148. predefined_sizeof("LONG_DOUBLE", "", bits_in_longdouble);
  149. if (arch_target->has_int128)
  150. predefined_sizeof("INT128", "", 128);
  151. predefine("__ORDER_LITTLE_ENDIAN__", 1, "1234");
  152. predefine("__ORDER_BIG_ENDIAN__", 1, "4321");
  153. predefine("__ORDER_PDP_ENDIAN__", 1, "3412");
  154. if (arch_big_endian) {
  155. predefine("__BIG_ENDIAN__", 1, "1");
  156. predefine("__BYTE_ORDER__", 1, "__ORDER_BIG_ENDIAN__");
  157. } else {
  158. predefine("__LITTLE_ENDIAN__", 1, "1");
  159. predefine("__BYTE_ORDER__", 1, "__ORDER_LITTLE_ENDIAN__");
  160. }
  161. if (optimize_level)
  162. predefine("__OPTIMIZE__", 0, "1");
  163. if (optimize_size)
  164. predefine("__OPTIMIZE_SIZE__", 0, "1");
  165. predefine("__PRAGMA_REDEFINE_EXTNAME", 1, "1");
  166. // Temporary hacks
  167. predefine("__extension__", 0, NULL);
  168. predefine("__pragma__", 0, NULL);
  169. switch (arch_m64) {
  170. case ARCH_LP32:
  171. break;
  172. case ARCH_X32:
  173. predefine("__ILP32__", 1, "1");
  174. predefine("_ILP32", 1, "1");
  175. break;
  176. case ARCH_LP64:
  177. predefine("__LP64__", 1, "1");
  178. predefine("_LP64", 1, "1");
  179. break;
  180. case ARCH_LLP64:
  181. predefine("__LLP64__", 1, "1");
  182. break;
  183. }
  184. if (fpic) {
  185. predefine("__pic__", 0, "%d", fpic);
  186. predefine("__PIC__", 0, "%d", fpic);
  187. }
  188. if (fpie) {
  189. predefine("__pie__", 0, "%d", fpie);
  190. predefine("__PIE__", 0, "%d", fpie);
  191. }
  192. if (arch_target->predefine)
  193. arch_target->predefine(arch_target);
  194. if (arch_os >= OS_UNIX && arch_os != OS_DARWIN) {
  195. predefine("__unix__", 1, "1");
  196. predefine("__unix", 1, "1");
  197. predefine_nostd("unix");
  198. }
  199. switch (arch_os) {
  200. case OS_CYGWIN:
  201. predefine("__CYGWIN__", 1, "1");
  202. if (arch_m64 == ARCH_LP32)
  203. predefine("__CYGWIN32__", 1, "1");
  204. add_pre_buffer("#define __cdecl __attribute__((__cdecl__))\n");
  205. add_pre_buffer("#define __declspec(x) __attribute__((x))\n");
  206. add_pre_buffer("#define __fastcall __attribute__((__fastcall__))\n");
  207. add_pre_buffer("#define __stdcall __attribute__((__stdcall__))\n");
  208. add_pre_buffer("#define __thiscall __attribute__((__thiscall__))\n");
  209. add_pre_buffer("#define _cdecl __attribute__((__cdecl__))\n");
  210. add_pre_buffer("#define _fastcall __attribute__((__fastcall__))\n");
  211. add_pre_buffer("#define _stdcall __attribute__((__stdcall__))\n");
  212. add_pre_buffer("#define _thiscall __attribute__((__thiscall__))\n");
  213. break;
  214. case OS_DARWIN:
  215. predefine("__APPLE__", 1, "1");
  216. predefine("__APPLE_CC__", 1, "1");
  217. predefine("__MACH__", 1, "1");
  218. break;
  219. case OS_FREEBSD:
  220. predefine("__FreeBSD__", 1, "1");
  221. break;
  222. case OS_LINUX:
  223. predefine("__linux__", 1, "1");
  224. predefine("__linux", 1, "1");
  225. break;
  226. case OS_NETBSD:
  227. predefine("__NetBSD__", 1, "1");
  228. break;
  229. case OS_OPENBSD:
  230. predefine("__OpenBSD__", 1, "1");
  231. break;
  232. case OS_SUNOS:
  233. predefine("__sun__", 1, "1");
  234. predefine("__sun", 1, "1");
  235. predefine_nostd("sun");
  236. predefine("__svr4__", 1, "1");
  237. break;
  238. }
  239. }