Index: lib/Fuzzer/FuzzerTracePC.cpp =================================================================== --- lib/Fuzzer/FuzzerTracePC.cpp +++ lib/Fuzzer/FuzzerTracePC.cpp @@ -265,43 +265,42 @@ } // namespace fuzzer +#if LIBFUZZER_WINDOWS +#define COVERAGE_WEAK(Name) __declspec(dllexport) Name##_impl +#else +#define COVERAGE_WEAK(Name) __attribute__((visibility("default"))) Name +#endif + extern "C" { -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_pc_guard(uint32_t *Guard) { +void COVERAGE_WEAK(__sanitizer_cov_trace_pc_guard)(uint32_t *Guard) { uintptr_t PC = (uintptr_t)__builtin_return_address(0); fuzzer::TPC.HandleTrace(Guard, PC); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_pc_guard_init(uint32_t *Start, uint32_t *Stop) { +void COVERAGE_WEAK(__sanitizer_cov_trace_pc_guard_init)(uint32_t *Start, + uint32_t *Stop) { fuzzer::TPC.HandleInit(Start, Stop); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_pc_indir(uintptr_t Callee) { +void COVERAGE_WEAK(__sanitizer_cov_trace_pc_indir)(uintptr_t Callee) { uintptr_t PC = (uintptr_t)__builtin_return_address(0); fuzzer::TPC.HandleCallerCallee(PC, Callee); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_cmp8(uint64_t Arg1, uint64_t Arg2) { +void COVERAGE_WEAK(__sanitizer_cov_trace_cmp8)(uint64_t Arg1, uint64_t Arg2) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Arg1, Arg2); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_cmp4(uint32_t Arg1, uint32_t Arg2) { +void COVERAGE_WEAK(__sanitizer_cov_trace_cmp4)(uint32_t Arg1, uint32_t Arg2) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Arg1, Arg2); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_cmp2(uint16_t Arg1, uint16_t Arg2) { +void COVERAGE_WEAK(__sanitizer_cov_trace_cmp2)(uint16_t Arg1, uint16_t Arg2) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Arg1, Arg2); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_cmp1(uint8_t Arg1, uint8_t Arg2) { +void COVERAGE_WEAK(__sanitizer_cov_trace_cmp1)(uint8_t Arg1, uint8_t Arg2) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Arg1, Arg2); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_switch(uint64_t Val, uint64_t *Cases) { +void COVERAGE_WEAK(__sanitizer_cov_trace_switch)(uint64_t Val, uint64_t *Cases) { uint64_t N = Cases[0]; uint64_t ValSizeInBits = Cases[1]; uint64_t *Vals = Cases + 2; @@ -325,16 +324,13 @@ fuzzer::TPC.HandleCmp(PC + i, Token, (uint64_t)(0)); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_div4(uint32_t Val) { +void COVERAGE_WEAK(__sanitizer_cov_trace_div4)(uint32_t Val) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Val, (uint32_t)0); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_div8(uint64_t Val) { +void COVERAGE_WEAK(__sanitizer_cov_trace_div8)(uint64_t Val) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Val, (uint64_t)0); } -__attribute__((visibility("default"))) -void __sanitizer_cov_trace_gep(uintptr_t Idx) { +void COVERAGE_WEAK(__sanitizer_cov_trace_gep)(uintptr_t Idx) { fuzzer::TPC.HandleCmp(__builtin_return_address(0), Idx, (uintptr_t)0); }