llvm-runtime-resources-darwin 0.0.0 → 22.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +33 -0
  3. package/include/__clang_cuda_builtin_vars.h +121 -0
  4. package/include/__clang_cuda_cmath.h +512 -0
  5. package/include/__clang_cuda_complex_builtins.h +229 -0
  6. package/include/__clang_cuda_device_functions.h +1572 -0
  7. package/include/__clang_cuda_intrinsics.h +994 -0
  8. package/include/__clang_cuda_libdevice_declares.h +468 -0
  9. package/include/__clang_cuda_math.h +353 -0
  10. package/include/__clang_cuda_math_forward_declares.h +284 -0
  11. package/include/__clang_cuda_runtime_wrapper.h +522 -0
  12. package/include/__clang_cuda_texture_intrinsics.h +1177 -0
  13. package/include/__clang_hip_cmath.h +848 -0
  14. package/include/__clang_hip_libdevice_declares.h +340 -0
  15. package/include/__clang_hip_math.h +1405 -0
  16. package/include/__clang_hip_runtime_wrapper.h +165 -0
  17. package/include/__clang_hip_stdlib.h +43 -0
  18. package/include/__clang_spirv_builtins.h +217 -0
  19. package/include/__float_float.h +176 -0
  20. package/include/__float_header_macro.h +12 -0
  21. package/include/__float_infinity_nan.h +20 -0
  22. package/include/__stdarg___gnuc_va_list.h +13 -0
  23. package/include/__stdarg___va_copy.h +12 -0
  24. package/include/__stdarg_header_macro.h +12 -0
  25. package/include/__stdarg_va_arg.h +22 -0
  26. package/include/__stdarg_va_copy.h +12 -0
  27. package/include/__stdarg_va_list.h +13 -0
  28. package/include/__stddef_header_macro.h +12 -0
  29. package/include/__stddef_max_align_t.h +27 -0
  30. package/include/__stddef_null.h +29 -0
  31. package/include/__stddef_nullptr_t.h +29 -0
  32. package/include/__stddef_offsetof.h +17 -0
  33. package/include/__stddef_ptrdiff_t.h +20 -0
  34. package/include/__stddef_rsize_t.h +20 -0
  35. package/include/__stddef_size_t.h +20 -0
  36. package/include/__stddef_unreachable.h +21 -0
  37. package/include/__stddef_wchar_t.h +28 -0
  38. package/include/__stddef_wint_t.h +15 -0
  39. package/include/__wmmintrin_aes.h +140 -0
  40. package/include/__wmmintrin_pclmul.h +48 -0
  41. package/include/adcintrin.h +165 -0
  42. package/include/adxintrin.h +107 -0
  43. package/include/altivec.h +19364 -0
  44. package/include/amdgpuintrin.h +191 -0
  45. package/include/ammintrin.h +183 -0
  46. package/include/amo.h +131 -0
  47. package/include/amxavx512intrin.h +596 -0
  48. package/include/amxcomplexintrin.h +167 -0
  49. package/include/amxfp16intrin.h +93 -0
  50. package/include/amxfp8intrin.h +230 -0
  51. package/include/amxintrin.h +492 -0
  52. package/include/amxmovrsintrin.h +48 -0
  53. package/include/amxtf32intrin.h +108 -0
  54. package/include/andes_vector.h +16 -0
  55. package/include/arm64intr.h +35 -0
  56. package/include/arm_acle.h +865 -0
  57. package/include/arm_bf16.h +20 -0
  58. package/include/arm_cde.h +410 -0
  59. package/include/arm_cmse.h +217 -0
  60. package/include/arm_fp16.h +596 -0
  61. package/include/arm_mve.h +19187 -0
  62. package/include/arm_neon.h +74183 -0
  63. package/include/arm_neon_sve_bridge.h +182 -0
  64. package/include/arm_sme.h +3741 -0
  65. package/include/arm_sve.h +32278 -0
  66. package/include/arm_vector_types.h +432 -0
  67. package/include/armintr.h +31 -0
  68. package/include/avx10_2_512bf16intrin.h +568 -0
  69. package/include/avx10_2_512convertintrin.h +322 -0
  70. package/include/avx10_2_512minmaxintrin.h +127 -0
  71. package/include/avx10_2_512niintrin.h +314 -0
  72. package/include/avx10_2_512satcvtdsintrin.h +307 -0
  73. package/include/avx10_2_512satcvtintrin.h +301 -0
  74. package/include/avx10_2bf16intrin.h +1094 -0
  75. package/include/avx10_2convertintrin.h +3257 -0
  76. package/include/avx10_2copyintrin.h +66 -0
  77. package/include/avx10_2minmaxintrin.h +232 -0
  78. package/include/avx10_2niintrin.h +409 -0
  79. package/include/avx10_2satcvtdsintrin.h +376 -0
  80. package/include/avx10_2satcvtintrin.h +312 -0
  81. package/include/avx2intrin.h +5191 -0
  82. package/include/avx512bf16intrin.h +292 -0
  83. package/include/avx512bitalgintrin.h +75 -0
  84. package/include/avx512bwintrin.h +1895 -0
  85. package/include/avx512cdintrin.h +112 -0
  86. package/include/avx512dqintrin.h +1350 -0
  87. package/include/avx512fintrin.h +9378 -0
  88. package/include/avx512fp16intrin.h +3355 -0
  89. package/include/avx512ifmaintrin.h +68 -0
  90. package/include/avx512ifmavlintrin.h +138 -0
  91. package/include/avx512vbmi2intrin.h +368 -0
  92. package/include/avx512vbmiintrin.h +98 -0
  93. package/include/avx512vbmivlintrin.h +179 -0
  94. package/include/avx512vlbf16intrin.h +527 -0
  95. package/include/avx512vlbitalgintrin.h +135 -0
  96. package/include/avx512vlbwintrin.h +3064 -0
  97. package/include/avx512vlcdintrin.h +202 -0
  98. package/include/avx512vldqintrin.h +1156 -0
  99. package/include/avx512vlfp16intrin.h +2090 -0
  100. package/include/avx512vlintrin.h +8083 -0
  101. package/include/avx512vlvbmi2intrin.h +710 -0
  102. package/include/avx512vlvnniintrin.h +313 -0
  103. package/include/avx512vlvp2intersectintrin.h +123 -0
  104. package/include/avx512vnniintrin.h +116 -0
  105. package/include/avx512vp2intersectintrin.h +77 -0
  106. package/include/avx512vpopcntdqintrin.h +62 -0
  107. package/include/avx512vpopcntdqvlintrin.h +105 -0
  108. package/include/avxifmaintrin.h +193 -0
  109. package/include/avxintrin.h +5064 -0
  110. package/include/avxneconvertintrin.h +484 -0
  111. package/include/avxvnniint16intrin.h +451 -0
  112. package/include/avxvnniint8intrin.h +454 -0
  113. package/include/avxvnniintrin.h +233 -0
  114. package/include/bmi2intrin.h +253 -0
  115. package/include/bmiintrin.h +604 -0
  116. package/include/builtins.h +19 -0
  117. package/include/cet.h +66 -0
  118. package/include/cetintrin.h +115 -0
  119. package/include/cldemoteintrin.h +36 -0
  120. package/include/clflushoptintrin.h +36 -0
  121. package/include/clwbintrin.h +38 -0
  122. package/include/clzerointrin.h +38 -0
  123. package/include/cmpccxaddintrin.h +70 -0
  124. package/include/cpuid.h +451 -0
  125. package/include/crc32intrin.h +100 -0
  126. package/include/cuda_wrappers/__utility/declval.h +28 -0
  127. package/include/cuda_wrappers/algorithm +116 -0
  128. package/include/cuda_wrappers/bits/basic_string.h +9 -0
  129. package/include/cuda_wrappers/bits/basic_string.tcc +9 -0
  130. package/include/cuda_wrappers/bits/c++config.h +61 -0
  131. package/include/cuda_wrappers/bits/shared_ptr_base.h +9 -0
  132. package/include/cuda_wrappers/cmath +44 -0
  133. package/include/cuda_wrappers/complex +90 -0
  134. package/include/cuda_wrappers/new +108 -0
  135. package/include/emmintrin.h +4940 -0
  136. package/include/enqcmdintrin.h +63 -0
  137. package/include/f16cintrin.h +176 -0
  138. package/include/float.h +48 -0
  139. package/include/fma4intrin.h +220 -0
  140. package/include/fmaintrin.h +826 -0
  141. package/include/fuzzer/FuzzedDataProvider.h +397 -0
  142. package/include/fxsrintrin.h +91 -0
  143. package/include/gfniintrin.h +238 -0
  144. package/include/gpuintrin.h +330 -0
  145. package/include/hexagon_circ_brev_intrinsics.h +298 -0
  146. package/include/hexagon_protos.h +8439 -0
  147. package/include/hexagon_types.h +2628 -0
  148. package/include/hresetintrin.h +49 -0
  149. package/include/htmintrin.h +212 -0
  150. package/include/htmxlintrin.h +345 -0
  151. package/include/hvx_hexagon_protos.h +5399 -0
  152. package/include/ia32intrin.h +863 -0
  153. package/include/immintrin.h +595 -0
  154. package/include/intrin.h +491 -0
  155. package/include/intrin0.h +256 -0
  156. package/include/inttypes.h +101 -0
  157. package/include/invpcidintrin.h +23 -0
  158. package/include/iso646.h +31 -0
  159. package/include/keylockerintrin.h +518 -0
  160. package/include/larchintrin.h +260 -0
  161. package/include/lasxintrin.h +3999 -0
  162. package/include/limits.h +133 -0
  163. package/include/llvm_libc_wrappers/assert.h +32 -0
  164. package/include/llvm_libc_wrappers/ctype.h +28 -0
  165. package/include/llvm_libc_wrappers/inttypes.h +32 -0
  166. package/include/llvm_libc_wrappers/stdio.h +52 -0
  167. package/include/llvm_libc_wrappers/stdlib.h +32 -0
  168. package/include/llvm_libc_wrappers/string.h +28 -0
  169. package/include/llvm_libc_wrappers/time.h +28 -0
  170. package/include/llvm_offload_wrappers/__llvm_offload.h +31 -0
  171. package/include/llvm_offload_wrappers/__llvm_offload_device.h +10 -0
  172. package/include/llvm_offload_wrappers/__llvm_offload_host.h +15 -0
  173. package/include/lsxintrin.h +3752 -0
  174. package/include/lwpintrin.h +136 -0
  175. package/include/lzcntintrin.h +109 -0
  176. package/include/mm3dnow.h +22 -0
  177. package/include/mm_malloc.h +67 -0
  178. package/include/mmintrin.h +1541 -0
  179. package/include/module.modulemap +360 -0
  180. package/include/movdirintrin.h +49 -0
  181. package/include/movrs_avx10_2_512intrin.h +98 -0
  182. package/include/movrs_avx10_2intrin.h +174 -0
  183. package/include/movrsintrin.h +59 -0
  184. package/include/msa.h +573 -0
  185. package/include/mwaitxintrin.h +62 -0
  186. package/include/nmmintrin.h +20 -0
  187. package/include/nvptxintrin.h +219 -0
  188. package/include/opencl-c-base.h +758 -0
  189. package/include/opencl-c.h +18676 -0
  190. package/include/openmp_wrappers/__clang_openmp_device_functions.h +104 -0
  191. package/include/openmp_wrappers/cmath +132 -0
  192. package/include/openmp_wrappers/complex +55 -0
  193. package/include/openmp_wrappers/complex.h +35 -0
  194. package/include/openmp_wrappers/complex_cmath.h +393 -0
  195. package/include/openmp_wrappers/math.h +61 -0
  196. package/include/openmp_wrappers/new +48 -0
  197. package/include/pconfigintrin.h +40 -0
  198. package/include/pkuintrin.h +34 -0
  199. package/include/pmmintrin.h +302 -0
  200. package/include/popcntintrin.h +59 -0
  201. package/include/ppc_wrappers/bmi2intrin.h +134 -0
  202. package/include/ppc_wrappers/bmiintrin.h +165 -0
  203. package/include/ppc_wrappers/emmintrin.h +2269 -0
  204. package/include/ppc_wrappers/immintrin.h +27 -0
  205. package/include/ppc_wrappers/mm_malloc.h +45 -0
  206. package/include/ppc_wrappers/mmintrin.h +1453 -0
  207. package/include/ppc_wrappers/nmmintrin.h +26 -0
  208. package/include/ppc_wrappers/pmmintrin.h +145 -0
  209. package/include/ppc_wrappers/smmintrin.h +683 -0
  210. package/include/ppc_wrappers/tmmintrin.h +453 -0
  211. package/include/ppc_wrappers/x86gprintrin.h +17 -0
  212. package/include/ppc_wrappers/x86intrin.h +28 -0
  213. package/include/ppc_wrappers/xmmintrin.h +1827 -0
  214. package/include/prfchiintrin.h +61 -0
  215. package/include/prfchwintrin.h +57 -0
  216. package/include/profile/InstrProfData.inc +1001 -0
  217. package/include/profile/instr_prof_interface.h +88 -0
  218. package/include/ptrauth.h +407 -0
  219. package/include/ptwriteintrin.h +37 -0
  220. package/include/raointintrin.h +203 -0
  221. package/include/rdpruintrin.h +57 -0
  222. package/include/rdseedintrin.h +105 -0
  223. package/include/riscv_bitmanip.h +195 -0
  224. package/include/riscv_corev_alu.h +128 -0
  225. package/include/riscv_crypto.h +170 -0
  226. package/include/riscv_mips.h +34 -0
  227. package/include/riscv_nds.h +89 -0
  228. package/include/riscv_ntlh.h +26 -0
  229. package/include/riscv_vector.h +422 -0
  230. package/include/rtmintrin.h +45 -0
  231. package/include/s390intrin.h +25 -0
  232. package/include/sanitizer/allocator_interface.h +106 -0
  233. package/include/sanitizer/asan_interface.h +348 -0
  234. package/include/sanitizer/common_interface_defs.h +544 -0
  235. package/include/sanitizer/coverage_interface.h +36 -0
  236. package/include/sanitizer/dfsan_interface.h +220 -0
  237. package/include/sanitizer/hwasan_interface.h +109 -0
  238. package/include/sanitizer/linux_syscall_hooks.h +3112 -0
  239. package/include/sanitizer/lsan_interface.h +89 -0
  240. package/include/sanitizer/msan_interface.h +135 -0
  241. package/include/sanitizer/netbsd_syscall_hooks.h +5005 -0
  242. package/include/sanitizer/rtsan_interface.h +75 -0
  243. package/include/sanitizer/scudo_interface.h +38 -0
  244. package/include/sanitizer/tsan_interface.h +316 -0
  245. package/include/sanitizer/tsan_interface_atomic.h +223 -0
  246. package/include/sanitizer/ubsan_interface.h +34 -0
  247. package/include/serializeintrin.h +30 -0
  248. package/include/sgxintrin.h +60 -0
  249. package/include/sha512intrin.h +200 -0
  250. package/include/shaintrin.h +190 -0
  251. package/include/sifive_vector.h +174 -0
  252. package/include/sm3intrin.h +238 -0
  253. package/include/sm4evexintrin.h +32 -0
  254. package/include/sm4intrin.h +269 -0
  255. package/include/smmintrin.h +2352 -0
  256. package/include/spirvintrin.h +194 -0
  257. package/include/stdalign.h +24 -0
  258. package/include/stdarg.h +75 -0
  259. package/include/stdatomic.h +204 -0
  260. package/include/stdbool.h +39 -0
  261. package/include/stdckdint.h +42 -0
  262. package/include/stdcountof.h +15 -0
  263. package/include/stddef.h +139 -0
  264. package/include/stddefer.h +19 -0
  265. package/include/stdint.h +844 -0
  266. package/include/stdnoreturn.h +35 -0
  267. package/include/tbmintrin.h +128 -0
  268. package/include/tgmath.h +1368 -0
  269. package/include/tmmintrin.h +779 -0
  270. package/include/tsxldtrkintrin.h +56 -0
  271. package/include/uintrintrin.h +157 -0
  272. package/include/unwind.h +332 -0
  273. package/include/usermsrintrin.h +51 -0
  274. package/include/vadefs.h +51 -0
  275. package/include/vaesintrin.h +86 -0
  276. package/include/varargs.h +16 -0
  277. package/include/vecintrin.h +12868 -0
  278. package/include/velintrin.h +71 -0
  279. package/include/velintrin_approx.h +120 -0
  280. package/include/velintrin_gen.h +1257 -0
  281. package/include/vpclmulqdqintrin.h +30 -0
  282. package/include/waitpkgintrin.h +42 -0
  283. package/include/wasm_simd128.h +2143 -0
  284. package/include/wbnoinvdintrin.h +24 -0
  285. package/include/wmmintrin.h +23 -0
  286. package/include/x86gprintrin.h +49 -0
  287. package/include/x86intrin.h +35 -0
  288. package/include/xmmintrin.h +3175 -0
  289. package/include/xopintrin.h +780 -0
  290. package/include/xsavecintrin.h +84 -0
  291. package/include/xsaveintrin.h +63 -0
  292. package/include/xsaveoptintrin.h +34 -0
  293. package/include/xsavesintrin.h +44 -0
  294. package/include/xtestintrin.h +27 -0
  295. package/include/yvals_core.h +25 -0
  296. package/include/zos_wrappers/builtins.h +18 -0
  297. package/index.js +5 -0
  298. package/lib/darwin/libclang_rt.asan_abi_ios.a +0 -0
  299. package/lib/darwin/libclang_rt.asan_abi_iossim.a +0 -0
  300. package/lib/darwin/libclang_rt.asan_abi_osx.a +0 -0
  301. package/lib/darwin/libclang_rt.asan_ios_dynamic.dylib +0 -0
  302. package/lib/darwin/libclang_rt.asan_iossim_dynamic.dylib +0 -0
  303. package/lib/darwin/libclang_rt.asan_osx_dynamic.dylib +0 -0
  304. package/lib/darwin/libclang_rt.cc_kext.a +0 -0
  305. package/lib/darwin/libclang_rt.cc_kext_ios.a +0 -0
  306. package/lib/darwin/libclang_rt.fuzzer_interceptors_ios.a +0 -0
  307. package/lib/darwin/libclang_rt.fuzzer_interceptors_iossim.a +0 -0
  308. package/lib/darwin/libclang_rt.fuzzer_interceptors_osx.a +0 -0
  309. package/lib/darwin/libclang_rt.fuzzer_ios.a +0 -0
  310. package/lib/darwin/libclang_rt.fuzzer_iossim.a +0 -0
  311. package/lib/darwin/libclang_rt.fuzzer_no_main_ios.a +0 -0
  312. package/lib/darwin/libclang_rt.fuzzer_no_main_iossim.a +0 -0
  313. package/lib/darwin/libclang_rt.fuzzer_no_main_osx.a +0 -0
  314. package/lib/darwin/libclang_rt.fuzzer_osx.a +0 -0
  315. package/lib/darwin/libclang_rt.ios.a +0 -0
  316. package/lib/darwin/libclang_rt.iossim.a +0 -0
  317. package/lib/darwin/libclang_rt.lsan_ios_dynamic.dylib +0 -0
  318. package/lib/darwin/libclang_rt.lsan_iossim_dynamic.dylib +0 -0
  319. package/lib/darwin/libclang_rt.lsan_osx_dynamic.dylib +0 -0
  320. package/lib/darwin/libclang_rt.osx.a +0 -0
  321. package/lib/darwin/libclang_rt.profile_ios.a +0 -0
  322. package/lib/darwin/libclang_rt.profile_iossim.a +0 -0
  323. package/lib/darwin/libclang_rt.profile_osx.a +0 -0
  324. package/lib/darwin/libclang_rt.rtsan_ios_dynamic.dylib +0 -0
  325. package/lib/darwin/libclang_rt.rtsan_iossim_dynamic.dylib +0 -0
  326. package/lib/darwin/libclang_rt.rtsan_osx_dynamic.dylib +0 -0
  327. package/lib/darwin/libclang_rt.stats_client_ios.a +0 -0
  328. package/lib/darwin/libclang_rt.stats_client_iossim.a +0 -0
  329. package/lib/darwin/libclang_rt.stats_client_osx.a +0 -0
  330. package/lib/darwin/libclang_rt.stats_ios_dynamic.dylib +0 -0
  331. package/lib/darwin/libclang_rt.stats_iossim_dynamic.dylib +0 -0
  332. package/lib/darwin/libclang_rt.stats_osx_dynamic.dylib +0 -0
  333. package/lib/darwin/libclang_rt.tsan_ios_dynamic.dylib +0 -0
  334. package/lib/darwin/libclang_rt.tsan_iossim_dynamic.dylib +0 -0
  335. package/lib/darwin/libclang_rt.tsan_osx_dynamic.dylib +0 -0
  336. package/lib/darwin/libclang_rt.tysan_ios_dynamic.dylib +0 -0
  337. package/lib/darwin/libclang_rt.tysan_iossim_dynamic.dylib +0 -0
  338. package/lib/darwin/libclang_rt.tysan_osx_dynamic.dylib +0 -0
  339. package/lib/darwin/libclang_rt.ubsan_ios_dynamic.dylib +0 -0
  340. package/lib/darwin/libclang_rt.ubsan_iossim_dynamic.dylib +0 -0
  341. package/lib/darwin/libclang_rt.ubsan_minimal_ios.a +0 -0
  342. package/lib/darwin/libclang_rt.ubsan_minimal_ios_dynamic.dylib +0 -0
  343. package/lib/darwin/libclang_rt.ubsan_minimal_iossim.a +0 -0
  344. package/lib/darwin/libclang_rt.ubsan_minimal_iossim_dynamic.dylib +0 -0
  345. package/lib/darwin/libclang_rt.ubsan_minimal_osx.a +0 -0
  346. package/lib/darwin/libclang_rt.ubsan_minimal_osx_dynamic.dylib +0 -0
  347. package/lib/darwin/libclang_rt.ubsan_osx_dynamic.dylib +0 -0
  348. package/package.json +40 -1
  349. package/share/asan_ignorelist.txt +14 -0
  350. package/share/cfi_ignorelist.txt +17 -0
@@ -0,0 +1,1001 @@
1
+ /*===-- InstrProfData.inc - instr profiling runtime structures -*- C++ -*-=== *\
2
+ |*
3
+ |* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
+ |* See https://llvm.org/LICENSE.txt for license information.
5
+ |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
+ |*
7
+ \*===----------------------------------------------------------------------===*/
8
+ /*
9
+ * This is the main file that defines all the data structure, signature,
10
+ * constant literals that are shared across profiling runtime library,
11
+ * compiler (instrumentation), and host tools (reader/writer). The entities
12
+ * defined in this file affect the profile runtime ABI, the raw profile format,
13
+ * or both.
14
+ *
15
+ * The file has two identical copies. The primary copy lives in LLVM and
16
+ * the other one sits in compiler-rt/lib/profile directory. To make changes
17
+ * in this file, first modify the primary copy and copy it over to compiler-rt.
18
+ * Testing of any change in this file can start only after the two copies are
19
+ * synced up.
20
+ *
21
+ * The first part of the file includes macros that defines types, names, and
22
+ * initializers for the member fields of the core data structures. The field
23
+ * declarations for one structure is enabled by defining the field activation
24
+ * macro associated with that structure. Only one field activation record
25
+ * can be defined at one time and the rest definitions will be filtered out by
26
+ * the preprocessor.
27
+ *
28
+ * Examples of how the template is used to instantiate structure definition:
29
+ * 1. To declare a structure:
30
+ *
31
+ * struct ProfData {
32
+ * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
33
+ * Type Name;
34
+ * #include "llvm/ProfileData/InstrProfData.inc"
35
+ * };
36
+ *
37
+ * 2. To construct LLVM type arrays for the struct type:
38
+ *
39
+ * Type *DataTypes[] = {
40
+ * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
41
+ * LLVMType,
42
+ * #include "llvm/ProfileData/InstrProfData.inc"
43
+ * };
44
+ *
45
+ * 4. To construct constant array for the initializers:
46
+ * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
47
+ * Initializer,
48
+ * Constant *ConstantVals[] = {
49
+ * #include "llvm/ProfileData/InstrProfData.inc"
50
+ * };
51
+ *
52
+ *
53
+ * The second part of the file includes definitions all other entities that
54
+ * are related to runtime ABI and format. When no field activation macro is
55
+ * defined, this file can be included to introduce the definitions.
56
+ *
57
+ \*===----------------------------------------------------------------------===*/
58
+
59
+ /* Functions marked with INSTR_PROF_VISIBILITY must have hidden visibility in
60
+ * the compiler runtime. */
61
+ #ifndef INSTR_PROF_VISIBILITY
62
+ #define INSTR_PROF_VISIBILITY
63
+ #endif
64
+
65
+ // clang-format off:consider re-enabling clang-format if auto-formatted C macros
66
+ // are readable (e.g., after `issue #82426` is fixed)
67
+ /* INSTR_PROF_DATA start. */
68
+ /* Definition of member fields of the per-function control structure. */
69
+ #ifndef INSTR_PROF_DATA
70
+ #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
71
+ #else
72
+ #define INSTR_PROF_DATA_DEFINED
73
+ #endif
74
+ INSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), NameRef, \
75
+ ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
76
+ IndexedInstrProf::ComputeHash(getPGOFuncNameVarInitializer(Inc->getName()))))
77
+ INSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
78
+ ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
79
+ Inc->getHash()->getZExtValue()))
80
+ INSTR_PROF_DATA(const IntPtrT, IntPtrTy, CounterPtr, RelativeCounterPtr)
81
+ INSTR_PROF_DATA(const IntPtrT, IntPtrTy, BitmapPtr, RelativeBitmapPtr)
82
+ /* This is used to map function pointers for the indirect call targets to
83
+ * function name hashes during the conversion from raw to merged profile
84
+ * data.
85
+ */
86
+ INSTR_PROF_DATA(const IntPtrT, llvm::PointerType::getUnqual(Ctx), FunctionPointer, \
87
+ FunctionAddr)
88
+ INSTR_PROF_DATA(IntPtrT, llvm::PointerType::getUnqual(Ctx), Values, \
89
+ ValuesPtrExpr)
90
+ INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumCounters, \
91
+ ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumCounters))
92
+ INSTR_PROF_DATA(const uint16_t, Int16ArrayTy, NumValueSites[IPVK_Last+1], \
93
+ ConstantArray::get(Int16ArrayTy, Int16ArrayVals)) \
94
+ INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumBitmapBytes, \
95
+ ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumBitmapBytes))
96
+ #undef INSTR_PROF_DATA
97
+ /* INSTR_PROF_DATA end. */
98
+
99
+ /* For a virtual table object, record the name hash to associate profiled
100
+ * addresses with global variables, and record {starting address, size in bytes}
101
+ * to map the profiled virtual table (which usually have an offset from the
102
+ * starting address) back to a virtual table object. */
103
+ #ifndef INSTR_PROF_VTABLE_DATA
104
+ #define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Initializer)
105
+ #else
106
+ #define INSTR_PROF_VTABLE_DATA_DEFINED
107
+ #endif
108
+ INSTR_PROF_VTABLE_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), \
109
+ VTableNameHash, ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
110
+ IndexedInstrProf::ComputeHash(PGOVTableName)))
111
+ INSTR_PROF_VTABLE_DATA(const IntPtrT, llvm::PointerType::getUnqual(Ctx), \
112
+ VTablePointer, VTableAddr)
113
+ INSTR_PROF_VTABLE_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), VTableSize, \
114
+ ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \
115
+ VTableSizeVal))
116
+ #undef INSTR_PROF_VTABLE_DATA
117
+ /* INSTR_PROF_VTABLE_DATA end. */
118
+
119
+ /* This is an internal data structure used by value profiler. It
120
+ * is defined here to allow serialization code sharing by LLVM
121
+ * to be used in unit test.
122
+ *
123
+ * typedef struct ValueProfNode {
124
+ * // InstrProfValueData VData;
125
+ * uint64_t Value;
126
+ * uint64_t Count;
127
+ * struct ValueProfNode *Next;
128
+ * } ValueProfNode;
129
+ */
130
+ /* INSTR_PROF_VALUE_NODE start. */
131
+ #ifndef INSTR_PROF_VALUE_NODE
132
+ #define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer)
133
+ #else
134
+ #define INSTR_PROF_DATA_DEFINED
135
+ #endif
136
+ INSTR_PROF_VALUE_NODE(uint64_t, llvm::Type::getInt64Ty(Ctx), Value, \
137
+ ConstantInt::get(llvm::Type::GetInt64Ty(Ctx), 0))
138
+ INSTR_PROF_VALUE_NODE(uint64_t, llvm::Type::getInt64Ty(Ctx), Count, \
139
+ ConstantInt::get(llvm::Type::GetInt64Ty(Ctx), 0))
140
+ INSTR_PROF_VALUE_NODE(PtrToNodeT, llvm::PointerType::getUnqual(Ctx), Next, \
141
+ ConstantInt::get(llvm::PointerType::getUnqual(Ctx), 0))
142
+ #undef INSTR_PROF_VALUE_NODE
143
+ /* INSTR_PROF_VALUE_NODE end. */
144
+
145
+ /* INSTR_PROF_RAW_HEADER start */
146
+ /* Definition of member fields of the raw profile header data structure. */
147
+ /* Please update llvm/docs/InstrProfileFormat.rst as appropriate when updating
148
+ raw profile format. */
149
+ #ifndef INSTR_PROF_RAW_HEADER
150
+ #define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
151
+ #else
152
+ #define INSTR_PROF_DATA_DEFINED
153
+ #endif
154
+ INSTR_PROF_RAW_HEADER(uint64_t, Magic, __llvm_profile_get_magic())
155
+ INSTR_PROF_RAW_HEADER(uint64_t, Version, __llvm_profile_get_version())
156
+ INSTR_PROF_RAW_HEADER(uint64_t, BinaryIdsSize, __llvm_write_binary_ids(NULL))
157
+ INSTR_PROF_RAW_HEADER(uint64_t, NumData, NumData)
158
+ INSTR_PROF_RAW_HEADER(uint64_t, PaddingBytesBeforeCounters, PaddingBytesBeforeCounters)
159
+ INSTR_PROF_RAW_HEADER(uint64_t, NumCounters, NumCounters)
160
+ INSTR_PROF_RAW_HEADER(uint64_t, PaddingBytesAfterCounters, PaddingBytesAfterCounters)
161
+ INSTR_PROF_RAW_HEADER(uint64_t, NumBitmapBytes, NumBitmapBytes)
162
+ INSTR_PROF_RAW_HEADER(uint64_t, PaddingBytesAfterBitmapBytes, PaddingBytesAfterBitmapBytes)
163
+ INSTR_PROF_RAW_HEADER(uint64_t, NamesSize, NamesSize)
164
+ INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta,
165
+ (uintptr_t)CountersBegin - (uintptr_t)DataBegin)
166
+ INSTR_PROF_RAW_HEADER(uint64_t, BitmapDelta,
167
+ (uintptr_t)BitmapBegin - (uintptr_t)DataBegin)
168
+ INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
169
+ INSTR_PROF_RAW_HEADER(uint64_t, NumVTables, NumVTables)
170
+ INSTR_PROF_RAW_HEADER(uint64_t, VNamesSize, VNamesSize)
171
+ INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
172
+ #undef INSTR_PROF_RAW_HEADER
173
+ /* INSTR_PROF_RAW_HEADER end */
174
+
175
+ /* VALUE_PROF_FUNC_PARAM start */
176
+ /* Definition of parameter types of the runtime API used to do value profiling
177
+ * for a given value site.
178
+ */
179
+ #ifndef VALUE_PROF_FUNC_PARAM
180
+ #define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
181
+ #define INSTR_PROF_COMMA
182
+ #else
183
+ #define INSTR_PROF_DATA_DEFINED
184
+ #define INSTR_PROF_COMMA ,
185
+ #endif
186
+ VALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \
187
+ INSTR_PROF_COMMA
188
+ VALUE_PROF_FUNC_PARAM(void *, Data, PointerType::getUnqual(Ctx)) INSTR_PROF_COMMA
189
+ VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))
190
+ #undef VALUE_PROF_FUNC_PARAM
191
+ #undef INSTR_PROF_COMMA
192
+ /* VALUE_PROF_FUNC_PARAM end */
193
+
194
+ /* VALUE_PROF_KIND start */
195
+ #ifndef VALUE_PROF_KIND
196
+ #define VALUE_PROF_KIND(Enumerator, Value, Descr)
197
+ #else
198
+ #define INSTR_PROF_DATA_DEFINED
199
+ #endif
200
+ /* For indirect function call value profiling, the addresses of the target
201
+ * functions are profiled by the instrumented code. The target addresses are
202
+ * written in the raw profile data and converted to target function name's MD5
203
+ * hash by the profile reader during deserialization. Typically, this happens
204
+ * when the raw profile data is read during profile merging.
205
+ *
206
+ * For this remapping the ProfData is used. ProfData contains both the function
207
+ * name hash and the function address.
208
+ */
209
+ VALUE_PROF_KIND(IPVK_IndirectCallTarget, 0, "indirect call target")
210
+ /* For memory intrinsic functions size profiling. */
211
+ VALUE_PROF_KIND(IPVK_MemOPSize, 1, "memory intrinsic functions size")
212
+ /* For virtual table address profiling, the address point of the virtual table
213
+ * (i.e., the address contained in objects pointing to a virtual table) are
214
+ * profiled. Note this may not be the address of the per C++ class virtual table
215
+ * object (e.g., there might be an offset).
216
+ *
217
+ * The profiled addresses are stored in raw profile, together with the following
218
+ * two types of information.
219
+ * 1. The (starting and ending) addresses of per C++ class virtual table objects.
220
+ * 2. The (compressed) virtual table object names.
221
+ * RawInstrProfReader converts profiled virtual table addresses to virtual table
222
+ * objects' MD5 hash.
223
+ */
224
+ VALUE_PROF_KIND(IPVK_VTableTarget, 2, "The profiled address point of the vtable")
225
+ /* These two kinds must be the last to be
226
+ * declared. This is to make sure the string
227
+ * array created with the template can be
228
+ * indexed with the kind value.
229
+ */
230
+ VALUE_PROF_KIND(IPVK_First, IPVK_IndirectCallTarget, "first")
231
+ VALUE_PROF_KIND(IPVK_Last, IPVK_VTableTarget, "last")
232
+
233
+ #undef VALUE_PROF_KIND
234
+ /* VALUE_PROF_KIND end */
235
+
236
+ #undef COVMAP_V2_OR_V3
237
+ #ifdef COVMAP_V2
238
+ #define COVMAP_V2_OR_V3
239
+ #endif
240
+ #ifdef COVMAP_V3
241
+ #define COVMAP_V2_OR_V3
242
+ #endif
243
+
244
+ /* COVMAP_FUNC_RECORD start */
245
+ /* Definition of member fields of the function record structure in coverage
246
+ * map.
247
+ */
248
+ #ifndef COVMAP_FUNC_RECORD
249
+ #define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
250
+ #else
251
+ #define INSTR_PROF_DATA_DEFINED
252
+ #endif
253
+ #ifdef COVMAP_V1
254
+ COVMAP_FUNC_RECORD(const IntPtrT, llvm::PointerType::getUnqual(Ctx), \
255
+ NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, \
256
+ llvm::PointerType::getUnqual(Ctx)))
257
+ COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
258
+ llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \
259
+ NameValue.size()))
260
+ #endif
261
+ #ifdef COVMAP_V2_OR_V3
262
+ COVMAP_FUNC_RECORD(const int64_t, llvm::Type::getInt64Ty(Ctx), NameRef, \
263
+ llvm::ConstantInt::get( \
264
+ llvm::Type::getInt64Ty(Ctx), NameHash))
265
+ #endif
266
+ COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), DataSize, \
267
+ llvm::ConstantInt::get( \
268
+ llvm::Type::getInt32Ty(Ctx), CoverageMapping.size()))
269
+ COVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
270
+ llvm::ConstantInt::get( \
271
+ llvm::Type::getInt64Ty(Ctx), FuncHash))
272
+ #ifdef COVMAP_V3
273
+ COVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FilenamesRef, \
274
+ llvm::ConstantInt::get( \
275
+ llvm::Type::getInt64Ty(Ctx), FilenamesRef))
276
+ COVMAP_FUNC_RECORD(const char, \
277
+ llvm::ArrayType::get(llvm::Type::getInt8Ty(Ctx), \
278
+ CoverageMapping.size()), \
279
+ CoverageMapping,
280
+ llvm::ConstantDataArray::getRaw( \
281
+ CoverageMapping, CoverageMapping.size(), \
282
+ llvm::Type::getInt8Ty(Ctx)))
283
+ #endif
284
+ #undef COVMAP_FUNC_RECORD
285
+ /* COVMAP_FUNC_RECORD end. */
286
+
287
+ /* COVMAP_HEADER start */
288
+ /* Definition of member fields of coverage map header.
289
+ */
290
+ #ifndef COVMAP_HEADER
291
+ #define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
292
+ #else
293
+ #define INSTR_PROF_DATA_DEFINED
294
+ #endif
295
+ COVMAP_HEADER(uint32_t, Int32Ty, NRecords, \
296
+ llvm::ConstantInt::get(Int32Ty, NRecords))
297
+ COVMAP_HEADER(uint32_t, Int32Ty, FilenamesSize, \
298
+ llvm::ConstantInt::get(Int32Ty, FilenamesSize))
299
+ COVMAP_HEADER(uint32_t, Int32Ty, CoverageSize, \
300
+ llvm::ConstantInt::get(Int32Ty, CoverageMappingSize))
301
+ COVMAP_HEADER(uint32_t, Int32Ty, Version, \
302
+ llvm::ConstantInt::get(Int32Ty, CovMapVersion::CurrentVersion))
303
+ #undef COVMAP_HEADER
304
+ /* COVMAP_HEADER end. */
305
+
306
+ /* COVINIT_FUNC start */
307
+ #ifndef COVINIT_FUNC
308
+ #define COVINIT_FUNC(Type, LLVMType, Name, Initializer)
309
+ #else
310
+ #define INSTR_PROF_DATA_DEFINED
311
+ #endif
312
+ COVINIT_FUNC(IntPtrT, llvm::PointerType::getUnqual(Ctx), WriteoutFunction, \
313
+ WriteoutF)
314
+ COVINIT_FUNC(IntPtrT, llvm::PointerType::getUnqual(Ctx), ResetFunction, \
315
+ ResetF)
316
+ #undef COVINIT_FUNC
317
+ /* COVINIT_FUNC end */
318
+
319
+ #ifdef INSTR_PROF_SECT_ENTRY
320
+ #define INSTR_PROF_DATA_DEFINED
321
+ INSTR_PROF_SECT_ENTRY(IPSK_data, \
322
+ INSTR_PROF_QUOTE(INSTR_PROF_DATA_COMMON), \
323
+ INSTR_PROF_DATA_COFF, "__DATA,")
324
+ INSTR_PROF_SECT_ENTRY(IPSK_cnts, \
325
+ INSTR_PROF_QUOTE(INSTR_PROF_CNTS_COMMON), \
326
+ INSTR_PROF_CNTS_COFF, "__DATA,")
327
+ INSTR_PROF_SECT_ENTRY(IPSK_bitmap, \
328
+ INSTR_PROF_QUOTE(INSTR_PROF_BITS_COMMON), \
329
+ INSTR_PROF_BITS_COFF, "__DATA,")
330
+ INSTR_PROF_SECT_ENTRY(IPSK_name, \
331
+ INSTR_PROF_QUOTE(INSTR_PROF_NAME_COMMON), \
332
+ INSTR_PROF_NAME_COFF, "__DATA,")
333
+ INSTR_PROF_SECT_ENTRY(IPSK_vname, \
334
+ INSTR_PROF_QUOTE(INSTR_PROF_VNAME_COMMON), \
335
+ INSTR_PROF_VNAME_COFF, "__DATA,")
336
+ INSTR_PROF_SECT_ENTRY(IPSK_vals, \
337
+ INSTR_PROF_QUOTE(INSTR_PROF_VALS_COMMON), \
338
+ INSTR_PROF_VALS_COFF, "__DATA,")
339
+ INSTR_PROF_SECT_ENTRY(IPSK_vnodes, \
340
+ INSTR_PROF_QUOTE(INSTR_PROF_VNODES_COMMON), \
341
+ INSTR_PROF_VNODES_COFF, "__DATA,")
342
+ INSTR_PROF_SECT_ENTRY(IPSK_vtab, \
343
+ INSTR_PROF_QUOTE(INSTR_PROF_VTAB_COMMON), \
344
+ INSTR_PROF_VTAB_COFF, "__DATA,")
345
+ INSTR_PROF_SECT_ENTRY(IPSK_covmap, \
346
+ INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_COMMON), \
347
+ INSTR_PROF_COVMAP_COFF, "__LLVM_COV,")
348
+ INSTR_PROF_SECT_ENTRY(IPSK_covfun, \
349
+ INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON), \
350
+ INSTR_PROF_COVFUN_COFF, "__LLVM_COV,")
351
+ INSTR_PROF_SECT_ENTRY(IPSK_covdata, \
352
+ INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON), \
353
+ INSTR_PROF_COVDATA_COFF, "__LLVM_COV,")
354
+ INSTR_PROF_SECT_ENTRY(IPSK_covname, \
355
+ INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON), \
356
+ INSTR_PROF_COVNAME_COFF, "__LLVM_COV,")
357
+ INSTR_PROF_SECT_ENTRY(IPSK_covinit, \
358
+ INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON), \
359
+ INSTR_PROF_COVINIT_COFF, "__LLVM_COV,")
360
+
361
+ #undef INSTR_PROF_SECT_ENTRY
362
+ #endif
363
+
364
+
365
+ #ifdef INSTR_PROF_VALUE_PROF_DATA
366
+ #define INSTR_PROF_DATA_DEFINED
367
+
368
+ #define INSTR_PROF_MAX_NUM_VAL_PER_SITE 255
369
+ /*!
370
+ * This is the header of the data structure that defines the on-disk
371
+ * layout of the value profile data of a particular kind for one function.
372
+ */
373
+ typedef struct ValueProfRecord {
374
+ /* The kind of the value profile record. */
375
+ uint32_t Kind;
376
+ /*
377
+ * The number of value profile sites. It is guaranteed to be non-zero;
378
+ * otherwise the record for this kind won't be emitted.
379
+ */
380
+ uint32_t NumValueSites;
381
+ /*
382
+ * The first element of the array that stores the number of profiled
383
+ * values for each value site. The size of the array is NumValueSites.
384
+ * Since NumValueSites is greater than zero, there is at least one
385
+ * element in the array.
386
+ */
387
+ uint8_t SiteCountArray[1];
388
+
389
+ /*
390
+ * The fake declaration is for documentation purpose only.
391
+ * Align the start of next field to be on 8 byte boundaries.
392
+ uint8_t Padding[X];
393
+ */
394
+
395
+ /* The array of value profile data. The size of the array is the sum
396
+ * of all elements in SiteCountArray[].
397
+ InstrProfValueData ValueData[];
398
+ */
399
+
400
+ #ifdef __cplusplus
401
+ /*!
402
+ * Return the number of value sites.
403
+ */
404
+ uint32_t getNumValueSites() const { return NumValueSites; }
405
+ /*!
406
+ * Read data from this record and save it to Record.
407
+ */
408
+ LLVM_ABI void deserializeTo(InstrProfRecord &Record,
409
+ InstrProfSymtab *SymTab);
410
+ /*
411
+ * In-place byte swap:
412
+ * Do byte swap for this instance. \c Old is the original order before
413
+ * the swap, and \c New is the New byte order.
414
+ */
415
+ LLVM_ABI void swapBytes(llvm::endianness Old, llvm::endianness New);
416
+ #endif
417
+ } ValueProfRecord;
418
+
419
+ /*!
420
+ * Per-function header/control data structure for value profiling
421
+ * data in indexed format.
422
+ */
423
+ typedef struct ValueProfData {
424
+ /*
425
+ * Total size in bytes including this field. It must be a multiple
426
+ * of sizeof(uint64_t).
427
+ */
428
+ uint32_t TotalSize;
429
+ /*
430
+ *The number of value profile kinds that has value profile data.
431
+ * In this implementation, a value profile kind is considered to
432
+ * have profile data if the number of value profile sites for the
433
+ * kind is not zero. More aggressively, the implementation can
434
+ * choose to check the actual data value: if none of the value sites
435
+ * has any profiled values, the kind can be skipped.
436
+ */
437
+ uint32_t NumValueKinds;
438
+
439
+ /*
440
+ * Following are a sequence of variable length records. The prefix/header
441
+ * of each record is defined by ValueProfRecord type. The number of
442
+ * records is NumValueKinds.
443
+ * ValueProfRecord Record_1;
444
+ * ValueProfRecord Record_N;
445
+ */
446
+
447
+ #if __cplusplus
448
+ /*!
449
+ * Return the total size in bytes of the on-disk value profile data
450
+ * given the data stored in Record.
451
+ */
452
+ LLVM_ABI static uint32_t getSize(const InstrProfRecord &Record);
453
+ /*!
454
+ * Return a pointer to \c ValueProfData instance ready to be streamed.
455
+ */
456
+ LLVM_ABI static std::unique_ptr<ValueProfData>
457
+ serializeFrom(const InstrProfRecord &Record);
458
+ /*!
459
+ * Check the integrity of the record.
460
+ */
461
+ LLVM_ABI Error checkIntegrity();
462
+ /*!
463
+ * Return a pointer to \c ValueProfileData instance ready to be read.
464
+ * All data in the instance are properly byte swapped. The input
465
+ * data is assumed to be in little endian order.
466
+ */
467
+ LLVM_ABI static Expected<std::unique_ptr<ValueProfData>>
468
+ getValueProfData(const unsigned char *SrcBuffer,
469
+ const unsigned char *const SrcBufferEnd,
470
+ llvm::endianness SrcDataEndianness);
471
+ /*!
472
+ * Swap byte order from \c Endianness order to host byte order.
473
+ */
474
+ LLVM_ABI void swapBytesToHost(llvm::endianness Endianness);
475
+ /*!
476
+ * Swap byte order from host byte order to \c Endianness order.
477
+ */
478
+ LLVM_ABI void swapBytesFromHost(llvm::endianness Endianness);
479
+ /*!
480
+ * Return the total size of \c ValueProfileData.
481
+ */
482
+ LLVM_ABI uint32_t getSize() const { return TotalSize; }
483
+ /*!
484
+ * Read data from this data and save it to \c Record.
485
+ */
486
+ LLVM_ABI void deserializeTo(InstrProfRecord &Record,
487
+ InstrProfSymtab *SymTab);
488
+ void operator delete(void *ptr) { ::operator delete(ptr); }
489
+ #endif
490
+ } ValueProfData;
491
+
492
+ /*
493
+ * The closure is designed to abstract away two types of value profile data:
494
+ * - InstrProfRecord which is the primary data structure used to
495
+ * represent profile data in host tools (reader, writer, and profile-use)
496
+ * - value profile runtime data structure suitable to be used by C
497
+ * runtime library.
498
+ *
499
+ * Both sources of data need to serialize to disk/memory-buffer in common
500
+ * format: ValueProfData. The abstraction allows compiler-rt's raw profiler
501
+ * writer to share the same format and code with indexed profile writer.
502
+ *
503
+ * For documentation of the member methods below, refer to corresponding methods
504
+ * in class InstrProfRecord.
505
+ */
506
+ typedef struct ValueProfRecordClosure {
507
+ const void *Record;
508
+ uint32_t (*GetNumValueKinds)(const void *Record);
509
+ uint32_t (*GetNumValueSites)(const void *Record, uint32_t VKind);
510
+ uint32_t (*GetNumValueData)(const void *Record, uint32_t VKind);
511
+ uint32_t (*GetNumValueDataForSite)(const void *R, uint32_t VK, uint32_t S);
512
+
513
+ /*
514
+ * After extracting the value profile data from the value profile record,
515
+ * this method is used to map the in-memory value to on-disk value. If
516
+ * the method is null, value will be written out untranslated.
517
+ */
518
+ uint64_t (*RemapValueData)(uint32_t, uint64_t Value);
519
+ void (*GetValueForSite)(const void *R, InstrProfValueData *Dst, uint32_t K,
520
+ uint32_t S);
521
+ ValueProfData *(*AllocValueProfData)(size_t TotalSizeInBytes);
522
+ } ValueProfRecordClosure;
523
+
524
+ INSTR_PROF_VISIBILITY ValueProfRecord *
525
+ getFirstValueProfRecord(ValueProfData *VPD);
526
+ INSTR_PROF_VISIBILITY ValueProfRecord *
527
+ getValueProfRecordNext(ValueProfRecord *VPR);
528
+ INSTR_PROF_VISIBILITY InstrProfValueData *
529
+ getValueProfRecordValueData(ValueProfRecord *VPR);
530
+ INSTR_PROF_VISIBILITY uint32_t
531
+ getValueProfRecordHeaderSize(uint32_t NumValueSites);
532
+
533
+ #undef INSTR_PROF_VALUE_PROF_DATA
534
+ #endif /* INSTR_PROF_VALUE_PROF_DATA */
535
+
536
+
537
+ #ifdef INSTR_PROF_COMMON_API_IMPL
538
+ #define INSTR_PROF_DATA_DEFINED
539
+ #ifdef __cplusplus
540
+ #define INSTR_PROF_INLINE inline
541
+ #define INSTR_PROF_NULLPTR nullptr
542
+ #else
543
+ #define INSTR_PROF_INLINE
544
+ #define INSTR_PROF_NULLPTR NULL
545
+ #endif
546
+
547
+ #ifndef offsetof
548
+ #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
549
+ #endif
550
+
551
+ // clang-format on
552
+
553
+ /*!
554
+ * Return the \c ValueProfRecord header size including the
555
+ * padding bytes.
556
+ */
557
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t
558
+ getValueProfRecordHeaderSize(uint32_t NumValueSites) {
559
+ uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) +
560
+ sizeof(uint8_t) * NumValueSites;
561
+ /* Round the size to multiple of 8 bytes. */
562
+ Size = (Size + 7) & ~7;
563
+ return Size;
564
+ }
565
+
566
+ /*!
567
+ * Return the total size of the value profile record including the
568
+ * header and the value data.
569
+ */
570
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t
571
+ getValueProfRecordSize(uint32_t NumValueSites, uint32_t NumValueData) {
572
+ return getValueProfRecordHeaderSize(NumValueSites) +
573
+ sizeof(InstrProfValueData) * NumValueData;
574
+ }
575
+
576
+ /*!
577
+ * Return the pointer to the start of value data array.
578
+ */
579
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE InstrProfValueData *
580
+ getValueProfRecordValueData(ValueProfRecord *This) {
581
+ return (InstrProfValueData *)((char *)This + getValueProfRecordHeaderSize(
582
+ This->NumValueSites));
583
+ }
584
+
585
+ /*!
586
+ * Return the total number of value data for \c This record.
587
+ */
588
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t
589
+ getValueProfRecordNumValueData(ValueProfRecord *This) {
590
+ uint32_t NumValueData = 0;
591
+ uint32_t I;
592
+ for (I = 0; I < This->NumValueSites; I++)
593
+ NumValueData += This->SiteCountArray[I];
594
+ return NumValueData;
595
+ }
596
+
597
+ /*!
598
+ * Use this method to advance to the next \c This \c ValueProfRecord.
599
+ */
600
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE ValueProfRecord *
601
+ getValueProfRecordNext(ValueProfRecord *This) {
602
+ uint32_t NumValueData = getValueProfRecordNumValueData(This);
603
+ return (ValueProfRecord *)((char *)This +
604
+ getValueProfRecordSize(This->NumValueSites,
605
+ NumValueData));
606
+ }
607
+
608
+ /*!
609
+ * Return the first \c ValueProfRecord instance.
610
+ */
611
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE ValueProfRecord *
612
+ getFirstValueProfRecord(ValueProfData *This) {
613
+ return (ValueProfRecord *)((char *)This + sizeof(ValueProfData));
614
+ }
615
+
616
+ /* Closure based interfaces. */
617
+
618
+ /*!
619
+ * Return the total size in bytes of the on-disk value profile data
620
+ * given the data stored in Record.
621
+ */
622
+ INSTR_PROF_VISIBILITY uint32_t
623
+ getValueProfDataSize(ValueProfRecordClosure *Closure) {
624
+ uint32_t Kind;
625
+ uint32_t TotalSize = sizeof(ValueProfData);
626
+ const void *Record = Closure->Record;
627
+
628
+ for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
629
+ uint32_t NumValueSites = Closure->GetNumValueSites(Record, Kind);
630
+ if (!NumValueSites)
631
+ continue;
632
+ TotalSize += getValueProfRecordSize(NumValueSites,
633
+ Closure->GetNumValueData(Record, Kind));
634
+ }
635
+ return TotalSize;
636
+ }
637
+
638
+ /*!
639
+ * Extract value profile data of a function for the profile kind \c ValueKind
640
+ * from the \c Closure and serialize the data into \c This record instance.
641
+ */
642
+ INSTR_PROF_VISIBILITY void
643
+ serializeValueProfRecordFrom(ValueProfRecord *This,
644
+ ValueProfRecordClosure *Closure,
645
+ uint32_t ValueKind, uint32_t NumValueSites) {
646
+ uint32_t S;
647
+ const void *Record = Closure->Record;
648
+ This->Kind = ValueKind;
649
+ This->NumValueSites = NumValueSites;
650
+ InstrProfValueData *DstVD = getValueProfRecordValueData(This);
651
+
652
+ for (S = 0; S < NumValueSites; S++) {
653
+ uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S);
654
+ This->SiteCountArray[S] = ND;
655
+ Closure->GetValueForSite(Record, DstVD, ValueKind, S);
656
+ DstVD += ND;
657
+ }
658
+ }
659
+
660
+ /*!
661
+ * Extract value profile data of a function from the \c Closure
662
+ * and serialize the data into \c DstData if it is not NULL or heap
663
+ * memory allocated by the \c Closure's allocator method. If \c
664
+ * DstData is not null, the caller is expected to set the TotalSize
665
+ * in DstData.
666
+ */
667
+ INSTR_PROF_VISIBILITY ValueProfData *
668
+ serializeValueProfDataFrom(ValueProfRecordClosure *Closure,
669
+ ValueProfData *DstData) {
670
+ uint32_t Kind;
671
+ uint32_t TotalSize =
672
+ DstData ? DstData->TotalSize : getValueProfDataSize(Closure);
673
+
674
+ ValueProfData *VPD =
675
+ DstData ? DstData : Closure->AllocValueProfData(TotalSize);
676
+
677
+ VPD->TotalSize = TotalSize;
678
+ VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
679
+ ValueProfRecord *VR = getFirstValueProfRecord(VPD);
680
+ for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
681
+ uint32_t NumValueSites = Closure->GetNumValueSites(Closure->Record, Kind);
682
+ if (!NumValueSites)
683
+ continue;
684
+ serializeValueProfRecordFrom(VR, Closure, Kind, NumValueSites);
685
+ VR = getValueProfRecordNext(VR);
686
+ }
687
+ return VPD;
688
+ }
689
+
690
+ #undef INSTR_PROF_COMMON_API_IMPL
691
+ #endif /* INSTR_PROF_COMMON_API_IMPL */
692
+
693
+ /*============================================================================*/
694
+
695
+ // clang-format off:consider re-enabling clang-format if auto-formatted C macros
696
+ // are readable (e.g., after `issue #82426` is fixed)
697
+ #ifndef INSTR_PROF_DATA_DEFINED
698
+
699
+ #ifndef INSTR_PROF_DATA_INC
700
+ #define INSTR_PROF_DATA_INC
701
+
702
+ /* Helper macros. */
703
+ #define INSTR_PROF_SIMPLE_QUOTE(x) #x
704
+ #define INSTR_PROF_QUOTE(x) INSTR_PROF_SIMPLE_QUOTE(x)
705
+ #define INSTR_PROF_SIMPLE_CONCAT(x,y) x ## y
706
+ #define INSTR_PROF_CONCAT(x,y) INSTR_PROF_SIMPLE_CONCAT(x,y)
707
+
708
+ /* Magic number to detect file format and endianness.
709
+ * Use 255 at one end, since no UTF-8 file can use that character. Avoid 0,
710
+ * so that utilities, like strings, don't grab it as a string. 129 is also
711
+ * invalid UTF-8, and high enough to be interesting.
712
+ * Use "lprofr" in the centre to stand for "LLVM Profile Raw", or "lprofR"
713
+ * for 32-bit platforms.
714
+ */
715
+ #define INSTR_PROF_RAW_MAGIC_64 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
716
+ (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
717
+ (uint64_t)'f' << 16 | (uint64_t)'r' << 8 | (uint64_t)129
718
+ #define INSTR_PROF_RAW_MAGIC_32 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
719
+ (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
720
+ (uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
721
+
722
+ /* Raw profile format version (start from 1). */
723
+ #define INSTR_PROF_RAW_VERSION 10
724
+ /* Indexed profile format version (start from 1). */
725
+ #define INSTR_PROF_INDEX_VERSION 13
726
+ /* Coverage mapping format version (start from 0). */
727
+ #define INSTR_PROF_COVMAP_VERSION 6
728
+
729
+ /* Profile version is always of type uint64_t. Reserve the upper 32 bits in the
730
+ * version for other variants of profile. We set the 8th most significant bit
731
+ * (i.e. bit 56) to 1 to indicate if this is an IR-level instrumentation
732
+ * generated profile, and 0 if this is a Clang FE generated profile.
733
+ * 1 in bit 57 indicates there are context-sensitive records in the profile.
734
+ * The 54th bit indicates whether to always instrument loop entry blocks.
735
+ * The 58th bit indicates whether to always instrument function entry blocks.
736
+ * The 59th bit indicates whether to use debug info to correlate profiles.
737
+ * The 60th bit indicates single byte coverage instrumentation.
738
+ * The 61st bit indicates function entry instrumentation only.
739
+ * The 62nd bit indicates whether memory profile information is present.
740
+ * The 63rd bit indicates if this is a temporal profile.
741
+ */
742
+ #define VARIANT_MASKS_ALL 0xffffffff00000000ULL
743
+ #define GET_VERSION(V) ((V) & ~VARIANT_MASKS_ALL)
744
+ #define VARIANT_MASK_INSTR_LOOP_ENTRIES (0x1ULL << 55)
745
+ #define VARIANT_MASK_IR_PROF (0x1ULL << 56)
746
+ #define VARIANT_MASK_CSIR_PROF (0x1ULL << 57)
747
+ #define VARIANT_MASK_INSTR_ENTRY (0x1ULL << 58)
748
+ #define VARIANT_MASK_DBG_CORRELATE (0x1ULL << 59)
749
+ #define VARIANT_MASK_BYTE_COVERAGE (0x1ULL << 60)
750
+ #define VARIANT_MASK_FUNCTION_ENTRY_ONLY (0x1ULL << 61)
751
+ #define VARIANT_MASK_MEMPROF (0x1ULL << 62)
752
+ #define VARIANT_MASK_TEMPORAL_PROF (0x1ULL << 63)
753
+ #define INSTR_PROF_RAW_VERSION_VAR __llvm_profile_raw_version
754
+ #define INSTR_PROF_PROFILE_RUNTIME_VAR __llvm_profile_runtime
755
+ #define INSTR_PROF_PROFILE_COUNTER_BIAS_VAR __llvm_profile_counter_bias
756
+ #define INSTR_PROF_PROFILE_BITMAP_BIAS_VAR __llvm_profile_bitmap_bias
757
+ #define INSTR_PROF_PROFILE_SET_TIMESTAMP __llvm_profile_set_timestamp
758
+ #define INSTR_PROF_PROFILE_SAMPLING_VAR __llvm_profile_sampling
759
+
760
+ /* The variable that holds the name of the profile data
761
+ * specified via command line. */
762
+ #define INSTR_PROF_PROFILE_NAME_VAR __llvm_profile_filename
763
+
764
+ /* section name strings common to all targets other
765
+ than WIN32 */
766
+ #define INSTR_PROF_DATA_COMMON __llvm_prf_data
767
+ #define INSTR_PROF_NAME_COMMON __llvm_prf_names
768
+ #define INSTR_PROF_VNAME_COMMON __llvm_prf_vns
769
+ #define INSTR_PROF_CNTS_COMMON __llvm_prf_cnts
770
+ #define INSTR_PROF_BITS_COMMON __llvm_prf_bits
771
+ #define INSTR_PROF_VALS_COMMON __llvm_prf_vals
772
+ #define INSTR_PROF_VNODES_COMMON __llvm_prf_vnds
773
+ #define INSTR_PROF_VTAB_COMMON __llvm_prf_vtab
774
+ #define INSTR_PROF_COVMAP_COMMON __llvm_covmap
775
+ #define INSTR_PROF_COVFUN_COMMON __llvm_covfun
776
+ #define INSTR_PROF_COVDATA_COMMON __llvm_covdata
777
+ #define INSTR_PROF_COVNAME_COMMON __llvm_covnames
778
+ #define INSTR_PROF_COVINIT_COMMON __llvm_covinit
779
+
780
+ /* Windows section names. Because these section names contain dollar characters,
781
+ * they must be quoted.
782
+ */
783
+ #define INSTR_PROF_DATA_COFF ".lprfd$M"
784
+ #define INSTR_PROF_NAME_COFF ".lprfn$M"
785
+ #define INSTR_PROF_VNAME_COFF ".lprfvn$M"
786
+ #define INSTR_PROF_CNTS_COFF ".lprfc$M"
787
+ #define INSTR_PROF_BITS_COFF ".lprfb$M"
788
+ #define INSTR_PROF_VALS_COFF ".lprfv$M"
789
+ #define INSTR_PROF_VNODES_COFF ".lprfnd$M"
790
+ #define INSTR_PROF_VTAB_COFF ".lprfvt$M"
791
+ #define INSTR_PROF_COVMAP_COFF ".lcovmap$M"
792
+ #define INSTR_PROF_COVFUN_COFF ".lcovfun$M"
793
+ /* Since cov data and cov names sections are not allocated, we don't need to
794
+ * access them at runtime.
795
+ */
796
+ #define INSTR_PROF_COVDATA_COFF ".lcovd"
797
+ #define INSTR_PROF_COVNAME_COFF ".lcovn"
798
+
799
+ // FIXME: Placeholder for Windows. Windows currently does not initialize
800
+ // the GCOV functions in the runtime.
801
+ #define INSTR_PROF_COVINIT_COFF ".lcovd$M"
802
+
803
+ #ifdef _WIN32
804
+ /* Runtime section names and name strings. */
805
+ #define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_DATA_COFF
806
+ #define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_NAME_COFF
807
+ #define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_CNTS_COFF
808
+ #define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_BITS_COFF
809
+ #define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_VTAB_COFF
810
+ #define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_VNAME_COFF
811
+ /* Array of pointers. Each pointer points to a list
812
+ * of value nodes associated with one value site.
813
+ */
814
+ #define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_VALS_COFF
815
+ /* Value profile nodes section. */
816
+ #define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_VNODES_COFF
817
+ #define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_COVMAP_COFF
818
+ #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_COVFUN_COFF
819
+ #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_COVDATA_COFF
820
+ #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_COVNAME_COFF
821
+ #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_COVINIT_COFF
822
+ #else
823
+ /* Runtime section names and name strings. */
824
+ #define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_DATA_COMMON)
825
+ #define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_NAME_COMMON)
826
+ #define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_CNTS_COMMON)
827
+ #define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_BITS_COMMON)
828
+ #define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VTAB_COMMON)
829
+ #define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNAME_COMMON)
830
+ /* Array of pointers. Each pointer points to a list
831
+ * of value nodes associated with one value site.
832
+ */
833
+ #define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VALS_COMMON)
834
+ /* Value profile nodes section. */
835
+ #define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNODES_COMMON)
836
+ #define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_COMMON)
837
+ #define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON)
838
+ #define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON)
839
+ #define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON)
840
+ #define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON)
841
+ #endif
842
+
843
+ /* Macros to define start/stop section symbol for a given
844
+ * section on Linux. For instance
845
+ * INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME) will
846
+ * expand to __start___llvm_prof_data
847
+ */
848
+ #define INSTR_PROF_SECT_START(Sect) \
849
+ INSTR_PROF_CONCAT(__start_,Sect)
850
+ #define INSTR_PROF_SECT_STOP(Sect) \
851
+ INSTR_PROF_CONCAT(__stop_,Sect)
852
+
853
+ /* Value Profiling API linkage name. */
854
+ #define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
855
+ #define INSTR_PROF_VALUE_PROF_FUNC_STR \
856
+ INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
857
+ #define INSTR_PROF_VALUE_PROF_MEMOP_FUNC __llvm_profile_instrument_memop
858
+ #define INSTR_PROF_VALUE_PROF_MEMOP_FUNC_STR \
859
+ INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_MEMOP_FUNC)
860
+
861
+ /* InstrProfile per-function control data alignment. */
862
+ #define INSTR_PROF_DATA_ALIGNMENT 8
863
+
864
+ /* The data structure that represents a tracked value by the
865
+ * value profiler.
866
+ */
867
+ typedef struct InstrProfValueData {
868
+ /* Profiled value. */
869
+ uint64_t Value;
870
+ /* Number of times the value appears in the training run. */
871
+ uint64_t Count;
872
+ } InstrProfValueData;
873
+
874
+ #endif /* INSTR_PROF_DATA_INC */
875
+
876
+ #else
877
+ #undef INSTR_PROF_DATA_DEFINED
878
+ #endif
879
+
880
+ #undef COVMAP_V2_OR_V3
881
+
882
+ #ifdef INSTR_PROF_VALUE_PROF_MEMOP_API
883
+
884
+ #ifdef __cplusplus
885
+ #define INSTR_PROF_INLINE inline
886
+ #else
887
+ #define INSTR_PROF_INLINE
888
+ #endif
889
+
890
+ /* The value range buckets (22 buckets) for the memop size value profiling looks
891
+ * like:
892
+ *
893
+ * [0, 0]
894
+ * [1, 1]
895
+ * [2, 2]
896
+ * [3, 3]
897
+ * [4, 4]
898
+ * [5, 5]
899
+ * [6, 6]
900
+ * [7, 7]
901
+ * [8, 8]
902
+ * [9, 15]
903
+ * [16, 16]
904
+ * [17, 31]
905
+ * [32, 32]
906
+ * [33, 63]
907
+ * [64, 64]
908
+ * [65, 127]
909
+ * [128, 128]
910
+ * [129, 255]
911
+ * [256, 256]
912
+ * [257, 511]
913
+ * [512, 512]
914
+ * [513, UINT64_MAX]
915
+ *
916
+ * Each range has a 'representative value' which is the lower end value of the
917
+ * range and used to store in the runtime profile data records and the VP
918
+ * metadata. For example, it's 2 for [2, 2] and 64 for [65, 127].
919
+ */
920
+ #define INSTR_PROF_NUM_BUCKETS 22
921
+
922
+ /*
923
+ * Clz and Popcount. This code was copied from
924
+ * compiler-rt/lib/fuzzer/{FuzzerBuiltins.h,FuzzerBuiltinsMsvc.h} and
925
+ * llvm/include/llvm/Support/MathExtras.h.
926
+ */
927
+ #if defined(_MSC_VER) && !defined(__clang__)
928
+
929
+ #include <intrin.h>
930
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE
931
+ int InstProfClzll(unsigned long long X) {
932
+ unsigned long LeadZeroIdx = 0;
933
+ #if !defined(_M_ARM64) && !defined(_M_X64)
934
+ // Scan the high 32 bits.
935
+ if (_BitScanReverse(&LeadZeroIdx, (unsigned long)(X >> 32)))
936
+ return (int)(63 - (LeadZeroIdx + 32)); // Create a bit offset
937
+ // from the MSB.
938
+ // Scan the low 32 bits.
939
+ if (_BitScanReverse(&LeadZeroIdx, (unsigned long)(X)))
940
+ return (int)(63 - LeadZeroIdx);
941
+ #else
942
+ if (_BitScanReverse64(&LeadZeroIdx, X)) return 63 - LeadZeroIdx;
943
+ #endif
944
+ return 64;
945
+ }
946
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE
947
+ int InstProfPopcountll(unsigned long long X) {
948
+ // This code originates from https://reviews.llvm.org/rG30626254510f.
949
+ unsigned long long v = X;
950
+ v = v - ((v >> 1) & 0x5555555555555555ULL);
951
+ v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
952
+ v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
953
+ return (int)((unsigned long long)(v * 0x0101010101010101ULL) >> 56);
954
+ }
955
+
956
+ #else
957
+
958
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE
959
+ int InstProfClzll(unsigned long long X) { return __builtin_clzll(X); }
960
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE
961
+ int InstProfPopcountll(unsigned long long X) { return __builtin_popcountll(X); }
962
+
963
+ #endif /* defined(_MSC_VER) && !defined(__clang__) */
964
+
965
+ // clang-format on
966
+
967
+ /* Map an (observed) memop size value to the representative value of its range.
968
+ * For example, 5 -> 5, 22 -> 17, 99 -> 65, 256 -> 256, 1001 -> 513. */
969
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint64_t
970
+ InstrProfGetRangeRepValue(uint64_t Value) {
971
+ if (Value <= 8)
972
+ // The first ranges are individually tracked. Use the value as is.
973
+ return Value;
974
+ else if (Value >= 513)
975
+ // The last range is mapped to its lowest value.
976
+ return 513;
977
+ else if (InstProfPopcountll(Value) == 1)
978
+ // If it's a power of two, use it as is.
979
+ return Value;
980
+ else
981
+ // Otherwise, take to the previous power of two + 1.
982
+ return (UINT64_C(1) << (64 - InstProfClzll(Value) - 1)) + 1;
983
+ }
984
+
985
+ /* Return true if the range that an (observed) memop size value belongs to has
986
+ * only a single value in the range. For example, 0 -> true, 8 -> true, 10 ->
987
+ * false, 64 -> true, 100 -> false, 513 -> false. */
988
+ INSTR_PROF_VISIBILITY INSTR_PROF_INLINE unsigned
989
+ InstrProfIsSingleValRange(uint64_t Value) {
990
+ if (Value <= 8)
991
+ // The first ranges are individually tracked.
992
+ return 1;
993
+ else if (InstProfPopcountll(Value) == 1)
994
+ // If it's a power of two, there's only one value.
995
+ return 1;
996
+ else
997
+ // Otherwise, there's more than one value in the range.
998
+ return 0;
999
+ }
1000
+
1001
+ #endif /* INSTR_PROF_VALUE_PROF_MEMOP_API */