diff options
author | Dan Blackwell <dan_blackwell@apple.com> | 2025-08-01 16:33:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-01 08:33:23 -0700 |
commit | e7e74945a6c77349963e03ba42989faad715b6bc (patch) | |
tree | 1e06e25626833139f7957fe2067d53c2c7e197be | |
parent | 89c1da6f78842feaa5fb2adae4a813384a2bbcbe (diff) | |
download | llvm-e7e74945a6c77349963e03ba42989faad715b6bc.zip llvm-e7e74945a6c77349963e03ba42989faad715b6bc.tar.gz llvm-e7e74945a6c77349963e03ba42989faad715b6bc.tar.bz2 |
[TSan] Fix asan_mac.cpp function pointer cast warnings (#151517)
Fixes these compiler warnings:
```
.../llvm-project/compiler-rt/lib/asan/asan_mac.cpp:252:4: warning: cast from 'dispatch_function_t' (aka 'void (*)(void *)') to 'void (*)(void *, size_t)' (aka 'void (*)(void *, unsigned long)') converts to incompatible function type [-Wcast-function-type-mismatch]
252 | ((void (*)(void *, size_t))asan_ctxt->func)(asan_ctxt->block, iteration);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../llvm-project/compiler-rt/lib/asan/asan_mac.cpp:259:32: warning: cast from 'void (*)(void *, size_t)' (aka 'void (*)(void *, unsigned long)') to 'dispatch_function_t' (aka 'void (*)(void *)') converts to incompatible function type [-Wcast-function-type-mismatch]
259 | alloc_asan_context(ctxt, (dispatch_function_t)work, &stack);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
```
-rw-r--r-- | compiler-rt/lib/asan/asan_mac.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/compiler-rt/lib/asan/asan_mac.cpp b/compiler-rt/lib/asan/asan_mac.cpp index 1f3c79e..a68e362 100644 --- a/compiler-rt/lib/asan/asan_mac.cpp +++ b/compiler-rt/lib/asan/asan_mac.cpp @@ -130,6 +130,7 @@ typedef void* dispatch_queue_t; typedef void* dispatch_source_t; typedef u64 dispatch_time_t; typedef void (*dispatch_function_t)(void *block); +typedef void (*dispatch_apply_function_t)(void *, size_t); typedef void* (*worker_t)(void *block); typedef unsigned long dispatch_mach_reason; typedef void *dispatch_mach_msg_t; @@ -149,7 +150,11 @@ typedef void (^dispatch_mach_handler_t)(dispatch_mach_reason reason, // A wrapper for the ObjC blocks used to support libdispatch. typedef struct { void *block; - dispatch_function_t func; + union { + dispatch_function_t dispatch_func; + dispatch_apply_function_t dispatch_apply_func; + static_assert(sizeof(dispatch_func) == sizeof(dispatch_apply_func)); + }; u32 parent_tid; } asan_block_context_t; @@ -177,7 +182,7 @@ void asan_dispatch_call_block_and_release(void *block) { block, (void*)pthread_self()); asan_register_worker_thread(context->parent_tid, &stack); // Call the original dispatcher for the block. - context->func(context->block); + context->dispatch_func(context->block); asan_free(context, &stack); } @@ -193,7 +198,7 @@ asan_block_context_t *alloc_asan_context(void *ctxt, dispatch_function_t func, asan_block_context_t *asan_ctxt = (asan_block_context_t*) asan_malloc(sizeof(asan_block_context_t), stack); asan_ctxt->block = ctxt; - asan_ctxt->func = func; + asan_ctxt->dispatch_func = func; asan_ctxt->parent_tid = GetCurrentTidOrInvalid(); return asan_ctxt; } @@ -249,14 +254,17 @@ extern "C" void asan_dispatch_apply_f_work(void *context, size_t iteration) { GET_STACK_TRACE_THREAD; asan_block_context_t *asan_ctxt = (asan_block_context_t *)context; asan_register_worker_thread(asan_ctxt->parent_tid, &stack); - ((void (*)(void *, size_t))asan_ctxt->func)(asan_ctxt->block, iteration); + asan_ctxt->dispatch_apply_func(asan_ctxt->block, iteration); } INTERCEPTOR(void, dispatch_apply_f, size_t iterations, dispatch_queue_t queue, - void *ctxt, void (*work)(void *, size_t)) { + void *ctxt, dispatch_apply_function_t work) { GET_STACK_TRACE_THREAD; asan_block_context_t *asan_ctxt = - alloc_asan_context(ctxt, (dispatch_function_t)work, &stack); + (asan_block_context_t *)asan_malloc(sizeof(asan_block_context_t), &stack); + asan_ctxt->block = ctxt; + asan_ctxt->dispatch_apply_func = work; + asan_ctxt->parent_tid = GetCurrentTidOrInvalid(); REAL(dispatch_apply_f)(iterations, queue, (void *)asan_ctxt, asan_dispatch_apply_f_work); } |