Hi!
Alex reported that since my r17-2388 fix we now emit an undesirable
__asan_handle_no_return call before the __asan_report_{load,store}*
calls added during bitintlower pass. Normally (when large/huge _BitInt
is not involved), those are added by the sanopt pass which runs after
the asan pass and so aren't instrumented.
The following patch avoids instrumenting those.
Unfortunately the first hunk isn't all that is needed.
That is because for the bitintlower added __asan_report_* calls
gimple_call_builtin_p (stmt, BUILT_IN_NORMAL) returns false
due to argument type mismatch.
THe C/C++/Fortran FEs use
DEF_PRIMITIVE_TYPE (BT_PTRMODE, (*lang_hooks.types.type_for_mode)(ptr_mode, 0))
and so use signed type with TYPE_MODE (ptr_mode).
The fallback initialization in initialize_sanitizer_builtins
(done for non-C/C++/Fortran FEs) uses for PTRMODE instead
pointer_sized_int_node type, which is initialized to:
pointer_sized_int_node = build_nonstandard_integer_type (POINTER_SIZE, 1);
where
ptr_mode = as_a <scalar_int_mode>
(mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0).require ());
so, I think both have the same precision, just one is signed and one
unsigned. And then asan_expand_poison_ifn uses pointer_sized_int_node.
The following patch just changes initialize_sanitizer_builtins and
asan_expand_poison_ifn to do the same thing as the C/C++/Fortran FEs here.
Seems asan.cc is full of similar builtin argument type mismatches, but
I've changed only what was needed for this patch.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2026-07-29 Jakub Jelinek <[email protected]>
PR middle-end/126084
* asan.cc (maybe_instrument_call): Don't instrument
BUILT_IN_ASAN_REPORT_{LOAD,STORE}{1,2,4,8,16,_N} builtins.
(initialize_sanitizer_builtins): Use
(*lang_hooks.types.type_for_mode) (ptr_mode, 0) instead of
pointer_sized_int_mode for PTRMODE arguments.
(asan_expand_poison_ifn): Likewise.
--- gcc/asan.cc.jj 2026-07-14 10:39:46.550212889 +0200
+++ gcc/asan.cc 2026-07-29 11:53:43.529201551 +0200
@@ -3185,6 +3185,18 @@ maybe_instrument_call (gimple_stmt_itera
case BUILT_IN_UNREACHABLE:
case BUILT_IN_UNREACHABLE_TRAP:
case BUILT_IN_TRAP:
+ case BUILT_IN_ASAN_REPORT_LOAD1:
+ case BUILT_IN_ASAN_REPORT_LOAD2:
+ case BUILT_IN_ASAN_REPORT_LOAD4:
+ case BUILT_IN_ASAN_REPORT_LOAD8:
+ case BUILT_IN_ASAN_REPORT_LOAD16:
+ case BUILT_IN_ASAN_REPORT_LOAD_N:
+ case BUILT_IN_ASAN_REPORT_STORE1:
+ case BUILT_IN_ASAN_REPORT_STORE2:
+ case BUILT_IN_ASAN_REPORT_STORE4:
+ case BUILT_IN_ASAN_REPORT_STORE8:
+ case BUILT_IN_ASAN_REPORT_STORE16:
+ case BUILT_IN_ASAN_REPORT_STORE_N:
/* Don't instrument these. */
return false;
default:
@@ -3585,6 +3597,7 @@ initialize_sanitizer_builtins (void)
if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
return;
+ tree ptrmode_type = (*lang_hooks.types.type_for_mode) (ptr_mode, 0);
tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
tree BT_FN_VOID_PTR
= build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
@@ -3598,7 +3611,7 @@ initialize_sanitizer_builtins (void)
ptr_type_node, ptr_type_node, NULL_TREE);
tree BT_FN_VOID_PTR_PTRMODE
= build_function_type_list (void_type_node, ptr_type_node,
- pointer_sized_int_node, NULL_TREE);
+ ptrmode_type, NULL_TREE);
tree BT_FN_VOID_INT
= build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
tree BT_FN_SIZE_CONST_PTR_INT
@@ -3633,7 +3646,7 @@ initialize_sanitizer_builtins (void)
tree BT_FN_VOID_PTR_UINT8_PTRMODE
= build_function_type_list (void_type_node, ptr_type_node,
unsigned_char_type_node,
- pointer_sized_int_node, NULL_TREE);
+ ptrmode_type, NULL_TREE);
tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
tree BT_FN_IX_CONST_VPTR_INT[5];
@@ -4385,11 +4398,13 @@ asan_expand_poison_ifn (gimple_stmt_iter
{
tree fun = report_error_func (store_p, recover_p, tree_to_uhwi (size),
&nargs);
+ tree ptrmode_type
+ = (nargs == 2 ? (*lang_hooks.types.type_for_mode) (ptr_mode, 0)
+ : NULL_TREE);
call = gimple_build_call (fun, nargs,
build_fold_addr_expr (shadow_var),
nargs == 2
- ? fold_convert (pointer_sized_int_node,
- size)
+ ? fold_convert (ptrmode_type, size)
: NULL_TREE);
}
gimple_set_location (call, gimple_location (use));
Jakub