13cab2bb3Spatrick //===-- sanitizer_interface_internal.h --------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is shared between run-time libraries of sanitizers. 103cab2bb3Spatrick // 113cab2bb3Spatrick // This header declares the sanitizer runtime interface functions. 123cab2bb3Spatrick // The runtime library has to define these functions so the instrumented program 133cab2bb3Spatrick // could call them. 143cab2bb3Spatrick // 153cab2bb3Spatrick // See also include/sanitizer/common_interface_defs.h 163cab2bb3Spatrick //===----------------------------------------------------------------------===// 173cab2bb3Spatrick #ifndef SANITIZER_INTERFACE_INTERNAL_H 183cab2bb3Spatrick #define SANITIZER_INTERFACE_INTERNAL_H 193cab2bb3Spatrick 203cab2bb3Spatrick #include "sanitizer_internal_defs.h" 213cab2bb3Spatrick 223cab2bb3Spatrick extern "C" { 233cab2bb3Spatrick // Tell the tools to write their reports to "path.<pid>" instead of stderr. 243cab2bb3Spatrick // The special values are "stdout" and "stderr". 253cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 263cab2bb3Spatrick void __sanitizer_set_report_path(const char *path); 273cab2bb3Spatrick // Tell the tools to write their reports to the provided file descriptor 283cab2bb3Spatrick // (casted to void *). 293cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 303cab2bb3Spatrick void __sanitizer_set_report_fd(void *fd); 31d89ec533Spatrick // Get the current full report file path, if a path was specified by 32d89ec533Spatrick // an earlier call to __sanitizer_set_report_path. Returns null otherwise. 33d89ec533Spatrick SANITIZER_INTERFACE_ATTRIBUTE 34d89ec533Spatrick const char *__sanitizer_get_report_path(); 353cab2bb3Spatrick 363cab2bb3Spatrick typedef struct { 373cab2bb3Spatrick int coverage_sandboxed; 383cab2bb3Spatrick __sanitizer::sptr coverage_fd; 393cab2bb3Spatrick unsigned int coverage_max_block_size; 403cab2bb3Spatrick } __sanitizer_sandbox_arguments; 413cab2bb3Spatrick 423cab2bb3Spatrick // Notify the tools that the sandbox is going to be turned on. 433cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 443cab2bb3Spatrick __sanitizer_sandbox_on_notify(__sanitizer_sandbox_arguments *args); 453cab2bb3Spatrick 463cab2bb3Spatrick // This function is called by the tool when it has just finished reporting 473cab2bb3Spatrick // an error. 'error_summary' is a one-line string that summarizes 483cab2bb3Spatrick // the error message. This function can be overridden by the client. 49*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 50*810390e3Srobert __sanitizer_report_error_summary(const char *error_summary); 513cab2bb3Spatrick 523cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov_dump(); 533cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage( 543cab2bb3Spatrick const __sanitizer::uptr *pcs, const __sanitizer::uptr len); 553cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_trace_pc_guard_coverage(); 563cab2bb3Spatrick 573cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_cov(__sanitizer::u32 *guard); 583cab2bb3Spatrick 593cab2bb3Spatrick // Returns 1 on the first call, then returns 0 thereafter. Called by the tool 603cab2bb3Spatrick // to ensure only one report is printed when multiple errors occur 613cab2bb3Spatrick // simultaneously. 623cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE int __sanitizer_acquire_crash_state(); 633cab2bb3Spatrick 643cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 65*810390e3Srobert void __sanitizer_annotate_contiguous_container(const void *beg, const void *end, 663cab2bb3Spatrick const void *old_mid, 673cab2bb3Spatrick const void *new_mid); 683cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 69*810390e3Srobert void __sanitizer_annotate_double_ended_contiguous_container( 70*810390e3Srobert const void *storage_beg, const void *storage_end, 71*810390e3Srobert const void *old_container_beg, const void *old_container_end, 72*810390e3Srobert const void *new_container_beg, const void *new_container_end); 73*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE 743cab2bb3Spatrick int __sanitizer_verify_contiguous_container(const void *beg, const void *mid, 753cab2bb3Spatrick const void *end); 763cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 77*810390e3Srobert int __sanitizer_verify_double_ended_contiguous_container( 78*810390e3Srobert const void *storage_beg, const void *container_beg, 79*810390e3Srobert const void *container_end, const void *storage_end); 80*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE 81*810390e3Srobert const void *__sanitizer_contiguous_container_find_bad_address(const void *beg, 82*810390e3Srobert const void *mid, 83*810390e3Srobert const void *end); 84*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE 85*810390e3Srobert const void *__sanitizer_double_ended_contiguous_container_find_bad_address( 86*810390e3Srobert const void *storage_beg, const void *container_beg, 87*810390e3Srobert const void *container_end, const void *storage_end); 883cab2bb3Spatrick 893cab2bb3Spatrick SANITIZER_INTERFACE_ATTRIBUTE 90*810390e3Srobert int __sanitizer_get_module_and_offset_for_pc(void *pc, char *module_path, 91*810390e3Srobert __sanitizer::uptr module_path_len, 92*810390e3Srobert void **pc_offset); 93*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 94*810390e3Srobert __sanitizer_cov_trace_cmp(); 95*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 96*810390e3Srobert __sanitizer_cov_trace_cmp1(); 97*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 98*810390e3Srobert __sanitizer_cov_trace_cmp2(); 99*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 100*810390e3Srobert __sanitizer_cov_trace_cmp4(); 101*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 102*810390e3Srobert __sanitizer_cov_trace_cmp8(); 103*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 104*810390e3Srobert __sanitizer_cov_trace_const_cmp1(); 105*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 106*810390e3Srobert __sanitizer_cov_trace_const_cmp2(); 107*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 108*810390e3Srobert __sanitizer_cov_trace_const_cmp4(); 109*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 110*810390e3Srobert __sanitizer_cov_trace_const_cmp8(); 111*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 112*810390e3Srobert __sanitizer_cov_trace_switch(); 113*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 114*810390e3Srobert __sanitizer_cov_trace_div4(); 115*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 116*810390e3Srobert __sanitizer_cov_trace_div8(); 117*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 118*810390e3Srobert __sanitizer_cov_trace_gep(); 119*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 120*810390e3Srobert __sanitizer_cov_trace_pc_indir(); 121*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 122*810390e3Srobert __sanitizer_cov_load1(); 123*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 124*810390e3Srobert __sanitizer_cov_load2(); 125*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 126*810390e3Srobert __sanitizer_cov_load4(); 127*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 128*810390e3Srobert __sanitizer_cov_load8(); 129*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 130*810390e3Srobert __sanitizer_cov_load16(); 131*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 132*810390e3Srobert __sanitizer_cov_store1(); 133*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 134*810390e3Srobert __sanitizer_cov_store2(); 135*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 136*810390e3Srobert __sanitizer_cov_store4(); 137*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 138*810390e3Srobert __sanitizer_cov_store8(); 139*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 140*810390e3Srobert __sanitizer_cov_store16(); 141*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 142*810390e3Srobert __sanitizer_cov_trace_pc_guard(__sanitizer::u32 *); 143*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 144*810390e3Srobert __sanitizer_cov_trace_pc_guard_init(__sanitizer::u32 *, __sanitizer::u32 *); 145*810390e3Srobert SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 146*810390e3Srobert __sanitizer_cov_8bit_counters_init(char *, char *); 1471f9cb04fSpatrick SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 1481f9cb04fSpatrick __sanitizer_cov_bool_flag_init(); 1491f9cb04fSpatrick SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void 150*810390e3Srobert __sanitizer_cov_pcs_init(const __sanitizer::uptr *, const __sanitizer::uptr *); 1513cab2bb3Spatrick } // extern "C" 1523cab2bb3Spatrick 1533cab2bb3Spatrick #endif // SANITIZER_INTERFACE_INTERNAL_H 154