Suppress -fstack-protector warning on hppa.
[official-gcc.git] / gcc / asan.cc
blobdc7b7f4bcf1803dd2ffbbaad782cf1b515d61ed8
1 /* AddressSanitizer, a fast memory error detector.
2 Copyright (C) 2012-2022 Free Software Foundation, Inc.
3 Contributed by Kostya Serebryany <kcc@google.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "target.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "cfghooks.h"
31 #include "alloc-pool.h"
32 #include "tree-pass.h"
33 #include "memmodel.h"
34 #include "tm_p.h"
35 #include "ssa.h"
36 #include "stringpool.h"
37 #include "tree-ssanames.h"
38 #include "optabs.h"
39 #include "emit-rtl.h"
40 #include "cgraph.h"
41 #include "gimple-pretty-print.h"
42 #include "alias.h"
43 #include "fold-const.h"
44 #include "cfganal.h"
45 #include "gimplify.h"
46 #include "gimple-iterator.h"
47 #include "varasm.h"
48 #include "stor-layout.h"
49 #include "tree-iterator.h"
50 #include "stringpool.h"
51 #include "attribs.h"
52 #include "asan.h"
53 #include "dojump.h"
54 #include "explow.h"
55 #include "expr.h"
56 #include "output.h"
57 #include "langhooks.h"
58 #include "cfgloop.h"
59 #include "gimple-builder.h"
60 #include "gimple-fold.h"
61 #include "ubsan.h"
62 #include "builtins.h"
63 #include "fnmatch.h"
64 #include "tree-inline.h"
65 #include "tree-ssa.h"
66 #include "tree-eh.h"
67 #include "diagnostic-core.h"
69 /* AddressSanitizer finds out-of-bounds and use-after-free bugs
70 with <2x slowdown on average.
72 The tool consists of two parts:
73 instrumentation module (this file) and a run-time library.
74 The instrumentation module adds a run-time check before every memory insn.
75 For a 8- or 16- byte load accessing address X:
76 ShadowAddr = (X >> 3) + Offset
77 ShadowValue = *(char*)ShadowAddr; // *(short*) for 16-byte access.
78 if (ShadowValue)
79 __asan_report_load8(X);
80 For a load of N bytes (N=1, 2 or 4) from address X:
81 ShadowAddr = (X >> 3) + Offset
82 ShadowValue = *(char*)ShadowAddr;
83 if (ShadowValue)
84 if ((X & 7) + N - 1 > ShadowValue)
85 __asan_report_loadN(X);
86 Stores are instrumented similarly, but using __asan_report_storeN functions.
87 A call too __asan_init_vN() is inserted to the list of module CTORs.
88 N is the version number of the AddressSanitizer API. The changes between the
89 API versions are listed in libsanitizer/asan/asan_interface_internal.h.
91 The run-time library redefines malloc (so that redzone are inserted around
92 the allocated memory) and free (so that reuse of free-ed memory is delayed),
93 provides __asan_report* and __asan_init_vN functions.
95 Read more:
96 http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
98 The current implementation supports detection of out-of-bounds and
99 use-after-free in the heap, on the stack and for global variables.
101 [Protection of stack variables]
103 To understand how detection of out-of-bounds and use-after-free works
104 for stack variables, lets look at this example on x86_64 where the
105 stack grows downward:
108 foo ()
110 char a[24] = {0};
111 int b[2] = {0};
113 a[5] = 1;
114 b[1] = 2;
116 return a[5] + b[1];
119 For this function, the stack protected by asan will be organized as
120 follows, from the top of the stack to the bottom:
122 Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
124 Slot 2/ [8 bytes of red zone, that adds up to the space of 'a' to make
125 the next slot be 32 bytes aligned; this one is called Partial
126 Redzone; this 32 bytes alignment is an asan constraint]
128 Slot 3/ [24 bytes for variable 'a']
130 Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
132 Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
134 Slot 6/ [8 bytes for variable 'b']
136 Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
137 'LEFT RedZone']
139 The 32 bytes of LEFT red zone at the bottom of the stack can be
140 decomposed as such:
142 1/ The first 8 bytes contain a magical asan number that is always
143 0x41B58AB3.
145 2/ The following 8 bytes contains a pointer to a string (to be
146 parsed at runtime by the runtime asan library), which format is
147 the following:
149 "<function-name> <space> <num-of-variables-on-the-stack>
150 (<32-bytes-aligned-offset-in-bytes-of-variable> <space>
151 <length-of-var-in-bytes> ){n} "
153 where '(...){n}' means the content inside the parenthesis occurs 'n'
154 times, with 'n' being the number of variables on the stack.
156 3/ The following 8 bytes contain the PC of the current function which
157 will be used by the run-time library to print an error message.
159 4/ The following 8 bytes are reserved for internal use by the run-time.
161 The shadow memory for that stack layout is going to look like this:
163 - content of shadow memory 8 bytes for slot 7: 0xF1F1F1F1.
164 The F1 byte pattern is a magic number called
165 ASAN_STACK_MAGIC_LEFT and is a way for the runtime to know that
166 the memory for that shadow byte is part of a the LEFT red zone
167 intended to seat at the bottom of the variables on the stack.
169 - content of shadow memory 8 bytes for slots 6 and 5:
170 0xF4F4F400. The F4 byte pattern is a magic number
171 called ASAN_STACK_MAGIC_PARTIAL. It flags the fact that the
172 memory region for this shadow byte is a PARTIAL red zone
173 intended to pad a variable A, so that the slot following
174 {A,padding} is 32 bytes aligned.
176 Note that the fact that the least significant byte of this
177 shadow memory content is 00 means that 8 bytes of its
178 corresponding memory (which corresponds to the memory of
179 variable 'b') is addressable.
181 - content of shadow memory 8 bytes for slot 4: 0xF2F2F2F2.
182 The F2 byte pattern is a magic number called
183 ASAN_STACK_MAGIC_MIDDLE. It flags the fact that the memory
184 region for this shadow byte is a MIDDLE red zone intended to
185 seat between two 32 aligned slots of {variable,padding}.
187 - content of shadow memory 8 bytes for slot 3 and 2:
188 0xF4000000. This represents is the concatenation of
189 variable 'a' and the partial red zone following it, like what we
190 had for variable 'b'. The least significant 3 bytes being 00
191 means that the 3 bytes of variable 'a' are addressable.
193 - content of shadow memory 8 bytes for slot 1: 0xF3F3F3F3.
194 The F3 byte pattern is a magic number called
195 ASAN_STACK_MAGIC_RIGHT. It flags the fact that the memory
196 region for this shadow byte is a RIGHT red zone intended to seat
197 at the top of the variables of the stack.
199 Note that the real variable layout is done in expand_used_vars in
200 cfgexpand.cc. As far as Address Sanitizer is concerned, it lays out
201 stack variables as well as the different red zones, emits some
202 prologue code to populate the shadow memory as to poison (mark as
203 non-accessible) the regions of the red zones and mark the regions of
204 stack variables as accessible, and emit some epilogue code to
205 un-poison (mark as accessible) the regions of red zones right before
206 the function exits.
208 [Protection of global variables]
210 The basic idea is to insert a red zone between two global variables
211 and install a constructor function that calls the asan runtime to do
212 the populating of the relevant shadow memory regions at load time.
214 So the global variables are laid out as to insert a red zone between
215 them. The size of the red zones is so that each variable starts on a
216 32 bytes boundary.
218 Then a constructor function is installed so that, for each global
219 variable, it calls the runtime asan library function
220 __asan_register_globals_with an instance of this type:
222 struct __asan_global
224 // Address of the beginning of the global variable.
225 const void *__beg;
227 // Initial size of the global variable.
228 uptr __size;
230 // Size of the global variable + size of the red zone. This
231 // size is 32 bytes aligned.
232 uptr __size_with_redzone;
234 // Name of the global variable.
235 const void *__name;
237 // Name of the module where the global variable is declared.
238 const void *__module_name;
240 // 1 if it has dynamic initialization, 0 otherwise.
241 uptr __has_dynamic_init;
243 // A pointer to struct that contains source location, could be NULL.
244 __asan_global_source_location *__location;
247 A destructor function that calls the runtime asan library function
248 _asan_unregister_globals is also installed. */
250 static unsigned HOST_WIDE_INT asan_shadow_offset_value;
251 static bool asan_shadow_offset_computed;
252 static vec<char *> sanitized_sections;
253 static tree last_alloca_addr;
255 /* Set of variable declarations that are going to be guarded by
256 use-after-scope sanitizer. */
258 hash_set<tree> *asan_handled_variables = NULL;
260 hash_set <tree> *asan_used_labels = NULL;
262 /* Global variables for HWASAN stack tagging. */
263 /* hwasan_frame_tag_offset records the offset from the frame base tag that the
264 next object should have. */
265 static uint8_t hwasan_frame_tag_offset = 0;
266 /* hwasan_frame_base_ptr is a pointer with the same address as
267 `virtual_stack_vars_rtx` for the current frame, and with the frame base tag
268 stored in it. N.b. this global RTX does not need to be marked GTY, but is
269 done so anyway. The need is not there since all uses are in just one pass
270 (cfgexpand) and there are no calls to ggc_collect between the uses. We mark
271 it GTY(()) anyway to allow the use of the variable later on if needed by
272 future features. */
273 static GTY(()) rtx hwasan_frame_base_ptr = NULL_RTX;
274 /* hwasan_frame_base_init_seq is the sequence of RTL insns that will initialize
275 the hwasan_frame_base_ptr. When the hwasan_frame_base_ptr is requested, we
276 generate this sequence but do not emit it. If the sequence was created it
277 is emitted once the function body has been expanded.
279 This delay is because the frame base pointer may be needed anywhere in the
280 function body, or needed by the expand_used_vars function. Emitting once in
281 a known place is simpler than requiring the emission of the instructions to
282 be know where it should go depending on the first place the hwasan frame
283 base is needed. */
284 static GTY(()) rtx_insn *hwasan_frame_base_init_seq = NULL;
286 /* Structure defining the extent of one object on the stack that HWASAN needs
287 to tag in the corresponding shadow stack space.
289 The range this object spans on the stack is between `untagged_base +
290 nearest_offset` and `untagged_base + farthest_offset`.
291 `tagged_base` is an rtx containing the same value as `untagged_base` but
292 with a random tag stored in the top byte. We record both `untagged_base`
293 and `tagged_base` so that `hwasan_emit_prologue` can use both without having
294 to emit RTL into the instruction stream to re-calculate one from the other.
295 (`hwasan_emit_prologue` needs to use both bases since the
296 __hwasan_tag_memory call it emits uses an untagged value, and it calculates
297 the tag to store in shadow memory based on the tag_offset plus the tag in
298 tagged_base). */
299 struct hwasan_stack_var
301 rtx untagged_base;
302 rtx tagged_base;
303 poly_int64 nearest_offset;
304 poly_int64 farthest_offset;
305 uint8_t tag_offset;
308 /* Variable recording all stack variables that HWASAN needs to tag.
309 Does not need to be marked as GTY(()) since every use is in the cfgexpand
310 pass and gcc_collect is not called in the middle of that pass. */
311 static vec<hwasan_stack_var> hwasan_tagged_stack_vars;
314 /* Sets shadow offset to value in string VAL. */
316 bool
317 set_asan_shadow_offset (const char *val)
319 char *endp;
321 errno = 0;
322 #ifdef HAVE_LONG_LONG
323 asan_shadow_offset_value = strtoull (val, &endp, 0);
324 #else
325 asan_shadow_offset_value = strtoul (val, &endp, 0);
326 #endif
327 if (!(*val != '\0' && *endp == '\0' && errno == 0))
328 return false;
330 asan_shadow_offset_computed = true;
332 return true;
335 /* Set list of user-defined sections that need to be sanitized. */
337 void
338 set_sanitized_sections (const char *sections)
340 char *pat;
341 unsigned i;
342 FOR_EACH_VEC_ELT (sanitized_sections, i, pat)
343 free (pat);
344 sanitized_sections.truncate (0);
346 for (const char *s = sections; *s; )
348 const char *end;
349 for (end = s; *end && *end != ','; ++end);
350 size_t len = end - s;
351 sanitized_sections.safe_push (xstrndup (s, len));
352 s = *end ? end + 1 : end;
356 bool
357 asan_mark_p (gimple *stmt, enum asan_mark_flags flag)
359 return (gimple_call_internal_p (stmt, IFN_ASAN_MARK)
360 && tree_to_uhwi (gimple_call_arg (stmt, 0)) == flag);
363 bool
364 asan_sanitize_stack_p (void)
366 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_stack);
369 bool
370 asan_sanitize_allocas_p (void)
372 return (asan_sanitize_stack_p () && param_asan_protect_allocas);
375 bool
376 asan_instrument_reads (void)
378 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_reads);
381 bool
382 asan_instrument_writes (void)
384 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_writes);
387 bool
388 asan_memintrin (void)
390 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_memintrin);
394 /* Checks whether section SEC should be sanitized. */
396 static bool
397 section_sanitized_p (const char *sec)
399 char *pat;
400 unsigned i;
401 FOR_EACH_VEC_ELT (sanitized_sections, i, pat)
402 if (fnmatch (pat, sec, FNM_PERIOD) == 0)
403 return true;
404 return false;
407 /* Returns Asan shadow offset. */
409 static unsigned HOST_WIDE_INT
410 asan_shadow_offset ()
412 if (!asan_shadow_offset_computed)
414 asan_shadow_offset_computed = true;
415 asan_shadow_offset_value = targetm.asan_shadow_offset ();
417 return asan_shadow_offset_value;
420 /* Returns Asan shadow offset has been set. */
421 bool
422 asan_shadow_offset_set_p ()
424 return asan_shadow_offset_computed;
427 alias_set_type asan_shadow_set = -1;
429 /* Pointer types to 1, 2 or 4 byte integers in shadow memory. A separate
430 alias set is used for all shadow memory accesses. */
431 static GTY(()) tree shadow_ptr_types[3];
433 /* Decl for __asan_option_detect_stack_use_after_return. */
434 static GTY(()) tree asan_detect_stack_use_after_return;
436 /* Hashtable support for memory references used by gimple
437 statements. */
439 /* This type represents a reference to a memory region. */
440 struct asan_mem_ref
442 /* The expression of the beginning of the memory region. */
443 tree start;
445 /* The size of the access. */
446 HOST_WIDE_INT access_size;
449 object_allocator <asan_mem_ref> asan_mem_ref_pool ("asan_mem_ref");
451 /* Initializes an instance of asan_mem_ref. */
453 static void
454 asan_mem_ref_init (asan_mem_ref *ref, tree start, HOST_WIDE_INT access_size)
456 ref->start = start;
457 ref->access_size = access_size;
460 /* Allocates memory for an instance of asan_mem_ref into the memory
461 pool returned by asan_mem_ref_get_alloc_pool and initialize it.
462 START is the address of (or the expression pointing to) the
463 beginning of memory reference. ACCESS_SIZE is the size of the
464 access to the referenced memory. */
466 static asan_mem_ref*
467 asan_mem_ref_new (tree start, HOST_WIDE_INT access_size)
469 asan_mem_ref *ref = asan_mem_ref_pool.allocate ();
471 asan_mem_ref_init (ref, start, access_size);
472 return ref;
475 /* This builds and returns a pointer to the end of the memory region
476 that starts at START and of length LEN. */
478 tree
479 asan_mem_ref_get_end (tree start, tree len)
481 if (len == NULL_TREE || integer_zerop (len))
482 return start;
484 if (!ptrofftype_p (len))
485 len = convert_to_ptrofftype (len);
487 return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
490 /* Return a tree expression that represents the end of the referenced
491 memory region. Beware that this function can actually build a new
492 tree expression. */
494 tree
495 asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
497 return asan_mem_ref_get_end (ref->start, len);
500 struct asan_mem_ref_hasher : nofree_ptr_hash <asan_mem_ref>
502 static inline hashval_t hash (const asan_mem_ref *);
503 static inline bool equal (const asan_mem_ref *, const asan_mem_ref *);
506 /* Hash a memory reference. */
508 inline hashval_t
509 asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
511 return iterative_hash_expr (mem_ref->start, 0);
514 /* Compare two memory references. We accept the length of either
515 memory references to be NULL_TREE. */
517 inline bool
518 asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
519 const asan_mem_ref *m2)
521 return operand_equal_p (m1->start, m2->start, 0);
524 static hash_table<asan_mem_ref_hasher> *asan_mem_ref_ht;
526 /* Returns a reference to the hash table containing memory references.
527 This function ensures that the hash table is created. Note that
528 this hash table is updated by the function
529 update_mem_ref_hash_table. */
531 static hash_table<asan_mem_ref_hasher> *
532 get_mem_ref_hash_table ()
534 if (!asan_mem_ref_ht)
535 asan_mem_ref_ht = new hash_table<asan_mem_ref_hasher> (10);
537 return asan_mem_ref_ht;
540 /* Clear all entries from the memory references hash table. */
542 static void
543 empty_mem_ref_hash_table ()
545 if (asan_mem_ref_ht)
546 asan_mem_ref_ht->empty ();
549 /* Free the memory references hash table. */
551 static void
552 free_mem_ref_resources ()
554 delete asan_mem_ref_ht;
555 asan_mem_ref_ht = NULL;
557 asan_mem_ref_pool.release ();
560 /* Return true iff the memory reference REF has been instrumented. */
562 static bool
563 has_mem_ref_been_instrumented (tree ref, HOST_WIDE_INT access_size)
565 asan_mem_ref r;
566 asan_mem_ref_init (&r, ref, access_size);
568 asan_mem_ref *saved_ref = get_mem_ref_hash_table ()->find (&r);
569 return saved_ref && saved_ref->access_size >= access_size;
572 /* Return true iff the memory reference REF has been instrumented. */
574 static bool
575 has_mem_ref_been_instrumented (const asan_mem_ref *ref)
577 return has_mem_ref_been_instrumented (ref->start, ref->access_size);
580 /* Return true iff access to memory region starting at REF and of
581 length LEN has been instrumented. */
583 static bool
584 has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
586 HOST_WIDE_INT size_in_bytes
587 = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
589 return size_in_bytes != -1
590 && has_mem_ref_been_instrumented (ref->start, size_in_bytes);
593 /* Set REF to the memory reference present in a gimple assignment
594 ASSIGNMENT. Return true upon successful completion, false
595 otherwise. */
597 static bool
598 get_mem_ref_of_assignment (const gassign *assignment,
599 asan_mem_ref *ref,
600 bool *ref_is_store)
602 gcc_assert (gimple_assign_single_p (assignment));
604 if (gimple_store_p (assignment)
605 && !gimple_clobber_p (assignment))
607 ref->start = gimple_assign_lhs (assignment);
608 *ref_is_store = true;
610 else if (gimple_assign_load_p (assignment))
612 ref->start = gimple_assign_rhs1 (assignment);
613 *ref_is_store = false;
615 else
616 return false;
618 ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
619 return true;
622 /* Return address of last allocated dynamic alloca. */
624 static tree
625 get_last_alloca_addr ()
627 if (last_alloca_addr)
628 return last_alloca_addr;
630 last_alloca_addr = create_tmp_reg (ptr_type_node, "last_alloca_addr");
631 gassign *g = gimple_build_assign (last_alloca_addr, null_pointer_node);
632 edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
633 gsi_insert_on_edge_immediate (e, g);
634 return last_alloca_addr;
637 /* Insert __asan_allocas_unpoison (top, bottom) call before
638 __builtin_stack_restore (new_sp) call.
639 The pseudocode of this routine should look like this:
640 top = last_alloca_addr;
641 bot = new_sp;
642 __asan_allocas_unpoison (top, bot);
643 last_alloca_addr = new_sp;
644 __builtin_stack_restore (new_sp);
645 In general, we can't use new_sp as bot parameter because on some
646 architectures SP has non zero offset from dynamic stack area. Moreover, on
647 some architectures this offset (STACK_DYNAMIC_OFFSET) becomes known for each
648 particular function only after all callees were expanded to rtl.
649 The most noticeable example is PowerPC{,64}, see
650 http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#DYNAM-STACK.
651 To overcome the issue we use following trick: pass new_sp as a second
652 parameter to __asan_allocas_unpoison and rewrite it during expansion with
653 new_sp + (virtual_dynamic_stack_rtx - sp) later in
654 expand_asan_emit_allocas_unpoison function.
656 HWASAN needs to do very similar, the eventual pseudocode should be:
657 __hwasan_tag_memory (virtual_stack_dynamic_rtx,
659 new_sp - sp);
660 __builtin_stack_restore (new_sp)
662 Need to use the same trick to handle STACK_DYNAMIC_OFFSET as described
663 above. */
665 static void
666 handle_builtin_stack_restore (gcall *call, gimple_stmt_iterator *iter)
668 if (!iter
669 || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
670 return;
672 tree restored_stack = gimple_call_arg (call, 0);
674 gimple *g;
676 if (hwasan_sanitize_allocas_p ())
678 enum internal_fn fn = IFN_HWASAN_ALLOCA_UNPOISON;
679 /* There is only one piece of information `expand_HWASAN_ALLOCA_UNPOISON`
680 needs to work. This is the length of the area that we're
681 deallocating. Since the stack pointer is known at expand time, the
682 position of the new stack pointer after deallocation is enough
683 information to calculate this length. */
684 g = gimple_build_call_internal (fn, 1, restored_stack);
686 else
688 tree last_alloca = get_last_alloca_addr ();
689 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_ALLOCAS_UNPOISON);
690 g = gimple_build_call (fn, 2, last_alloca, restored_stack);
691 gsi_insert_before (iter, g, GSI_SAME_STMT);
692 g = gimple_build_assign (last_alloca, restored_stack);
695 gsi_insert_before (iter, g, GSI_SAME_STMT);
698 /* Deploy and poison redzones around __builtin_alloca call. To do this, we
699 should replace this call with another one with changed parameters and
700 replace all its uses with new address, so
701 addr = __builtin_alloca (old_size, align);
702 is replaced by
703 left_redzone_size = max (align, ASAN_RED_ZONE_SIZE);
704 Following two statements are optimized out if we know that
705 old_size & (ASAN_RED_ZONE_SIZE - 1) == 0, i.e. alloca doesn't need partial
706 redzone.
707 misalign = old_size & (ASAN_RED_ZONE_SIZE - 1);
708 partial_redzone_size = ASAN_RED_ZONE_SIZE - misalign;
709 right_redzone_size = ASAN_RED_ZONE_SIZE;
710 additional_size = left_redzone_size + partial_redzone_size +
711 right_redzone_size;
712 new_size = old_size + additional_size;
713 new_alloca = __builtin_alloca (new_size, max (align, 32))
714 __asan_alloca_poison (new_alloca, old_size)
715 addr = new_alloca + max (align, ASAN_RED_ZONE_SIZE);
716 last_alloca_addr = new_alloca;
717 ADDITIONAL_SIZE is added to make new memory allocation contain not only
718 requested memory, but also left, partial and right redzones as well as some
719 additional space, required by alignment. */
721 static void
722 handle_builtin_alloca (gcall *call, gimple_stmt_iterator *iter)
724 if (!iter
725 || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
726 return;
728 gassign *g;
729 gcall *gg;
730 tree callee = gimple_call_fndecl (call);
731 tree lhs = gimple_call_lhs (call);
732 tree old_size = gimple_call_arg (call, 0);
733 tree ptr_type = lhs ? TREE_TYPE (lhs) : ptr_type_node;
734 tree partial_size = NULL_TREE;
735 unsigned int align
736 = DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
737 ? 0 : tree_to_uhwi (gimple_call_arg (call, 1));
739 bool throws = false;
740 edge e = NULL;
741 if (stmt_can_throw_internal (cfun, call))
743 if (!lhs)
744 return;
745 throws = true;
746 e = find_fallthru_edge (gsi_bb (*iter)->succs);
749 if (hwasan_sanitize_allocas_p ())
751 gimple_seq stmts = NULL;
752 location_t loc = gimple_location (gsi_stmt (*iter));
754 HWASAN needs a different expansion.
756 addr = __builtin_alloca (size, align);
758 should be replaced by
760 new_size = size rounded up to HWASAN_TAG_GRANULE_SIZE byte alignment;
761 untagged_addr = __builtin_alloca (new_size, align);
762 tag = __hwasan_choose_alloca_tag ();
763 addr = ifn_HWASAN_SET_TAG (untagged_addr, tag);
764 __hwasan_tag_memory (untagged_addr, tag, new_size);
766 /* Ensure alignment at least HWASAN_TAG_GRANULE_SIZE bytes so we start on
767 a tag granule. */
768 align = align > HWASAN_TAG_GRANULE_SIZE ? align : HWASAN_TAG_GRANULE_SIZE;
770 tree old_size = gimple_call_arg (call, 0);
771 tree new_size = gimple_build_round_up (&stmts, loc, size_type_node,
772 old_size,
773 HWASAN_TAG_GRANULE_SIZE);
775 /* Make the alloca call */
776 tree untagged_addr
777 = gimple_build (&stmts, loc,
778 as_combined_fn (BUILT_IN_ALLOCA_WITH_ALIGN), ptr_type,
779 new_size, build_int_cst (size_type_node, align));
781 /* Choose the tag.
782 Here we use an internal function so we can choose the tag at expand
783 time. We need the decision to be made after stack variables have been
784 assigned their tag (i.e. once the hwasan_frame_tag_offset variable has
785 been set to one after the last stack variables tag). */
786 tree tag = gimple_build (&stmts, loc, CFN_HWASAN_CHOOSE_TAG,
787 unsigned_char_type_node);
789 /* Add tag to pointer. */
790 tree addr
791 = gimple_build (&stmts, loc, CFN_HWASAN_SET_TAG, ptr_type,
792 untagged_addr, tag);
794 /* Tag shadow memory.
795 NOTE: require using `untagged_addr` here for libhwasan API. */
796 gimple_build (&stmts, loc, as_combined_fn (BUILT_IN_HWASAN_TAG_MEM),
797 void_type_node, untagged_addr, tag, new_size);
799 /* Insert the built up code sequence into the original instruction stream
800 the iterator points to. */
801 gsi_insert_seq_before (iter, stmts, GSI_SAME_STMT);
803 /* Finally, replace old alloca ptr with NEW_ALLOCA. */
804 replace_call_with_value (iter, addr);
805 return;
808 tree last_alloca = get_last_alloca_addr ();
809 const HOST_WIDE_INT redzone_mask = ASAN_RED_ZONE_SIZE - 1;
811 /* If ALIGN > ASAN_RED_ZONE_SIZE, we embed left redzone into first ALIGN
812 bytes of allocated space. Otherwise, align alloca to ASAN_RED_ZONE_SIZE
813 manually. */
814 align = MAX (align, ASAN_RED_ZONE_SIZE * BITS_PER_UNIT);
816 tree alloca_rz_mask = build_int_cst (size_type_node, redzone_mask);
817 tree redzone_size = build_int_cst (size_type_node, ASAN_RED_ZONE_SIZE);
819 /* Extract lower bits from old_size. */
820 wide_int size_nonzero_bits = get_nonzero_bits (old_size);
821 wide_int rz_mask
822 = wi::uhwi (redzone_mask, wi::get_precision (size_nonzero_bits));
823 wide_int old_size_lower_bits = wi::bit_and (size_nonzero_bits, rz_mask);
825 /* If alloca size is aligned to ASAN_RED_ZONE_SIZE, we don't need partial
826 redzone. Otherwise, compute its size here. */
827 if (wi::ne_p (old_size_lower_bits, 0))
829 /* misalign = size & (ASAN_RED_ZONE_SIZE - 1)
830 partial_size = ASAN_RED_ZONE_SIZE - misalign. */
831 g = gimple_build_assign (make_ssa_name (size_type_node, NULL),
832 BIT_AND_EXPR, old_size, alloca_rz_mask);
833 gsi_insert_before (iter, g, GSI_SAME_STMT);
834 tree misalign = gimple_assign_lhs (g);
835 g = gimple_build_assign (make_ssa_name (size_type_node, NULL), MINUS_EXPR,
836 redzone_size, misalign);
837 gsi_insert_before (iter, g, GSI_SAME_STMT);
838 partial_size = gimple_assign_lhs (g);
841 /* additional_size = align + ASAN_RED_ZONE_SIZE. */
842 tree additional_size = build_int_cst (size_type_node, align / BITS_PER_UNIT
843 + ASAN_RED_ZONE_SIZE);
844 /* If alloca has partial redzone, include it to additional_size too. */
845 if (partial_size)
847 /* additional_size += partial_size. */
848 g = gimple_build_assign (make_ssa_name (size_type_node), PLUS_EXPR,
849 partial_size, additional_size);
850 gsi_insert_before (iter, g, GSI_SAME_STMT);
851 additional_size = gimple_assign_lhs (g);
854 /* new_size = old_size + additional_size. */
855 g = gimple_build_assign (make_ssa_name (size_type_node), PLUS_EXPR, old_size,
856 additional_size);
857 gsi_insert_before (iter, g, GSI_SAME_STMT);
858 tree new_size = gimple_assign_lhs (g);
860 /* Build new __builtin_alloca call:
861 new_alloca_with_rz = __builtin_alloca (new_size, align). */
862 tree fn = builtin_decl_implicit (BUILT_IN_ALLOCA_WITH_ALIGN);
863 gg = gimple_build_call (fn, 2, new_size,
864 build_int_cst (size_type_node, align));
865 tree new_alloca_with_rz = make_ssa_name (ptr_type, gg);
866 gimple_call_set_lhs (gg, new_alloca_with_rz);
867 if (throws)
869 gimple_call_set_lhs (call, NULL);
870 gsi_replace (iter, gg, true);
872 else
873 gsi_insert_before (iter, gg, GSI_SAME_STMT);
875 /* new_alloca = new_alloca_with_rz + align. */
876 g = gimple_build_assign (make_ssa_name (ptr_type), POINTER_PLUS_EXPR,
877 new_alloca_with_rz,
878 build_int_cst (size_type_node,
879 align / BITS_PER_UNIT));
880 gimple_stmt_iterator gsi = gsi_none ();
881 if (throws)
883 gsi_insert_on_edge_immediate (e, g);
884 gsi = gsi_for_stmt (g);
886 else
887 gsi_insert_before (iter, g, GSI_SAME_STMT);
888 tree new_alloca = gimple_assign_lhs (g);
890 /* Poison newly created alloca redzones:
891 __asan_alloca_poison (new_alloca, old_size). */
892 fn = builtin_decl_implicit (BUILT_IN_ASAN_ALLOCA_POISON);
893 gg = gimple_build_call (fn, 2, new_alloca, old_size);
894 if (throws)
895 gsi_insert_after (&gsi, gg, GSI_NEW_STMT);
896 else
897 gsi_insert_before (iter, gg, GSI_SAME_STMT);
899 /* Save new_alloca_with_rz value into last_alloca to use it during
900 allocas unpoisoning. */
901 g = gimple_build_assign (last_alloca, new_alloca_with_rz);
902 if (throws)
903 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
904 else
905 gsi_insert_before (iter, g, GSI_SAME_STMT);
907 /* Finally, replace old alloca ptr with NEW_ALLOCA. */
908 if (throws)
910 g = gimple_build_assign (lhs, new_alloca);
911 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
913 else
914 replace_call_with_value (iter, new_alloca);
917 /* Return the memory references contained in a gimple statement
918 representing a builtin call that has to do with memory access. */
920 static bool
921 get_mem_refs_of_builtin_call (gcall *call,
922 asan_mem_ref *src0,
923 tree *src0_len,
924 bool *src0_is_store,
925 asan_mem_ref *src1,
926 tree *src1_len,
927 bool *src1_is_store,
928 asan_mem_ref *dst,
929 tree *dst_len,
930 bool *dst_is_store,
931 bool *dest_is_deref,
932 bool *intercepted_p,
933 gimple_stmt_iterator *iter = NULL)
935 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
937 tree callee = gimple_call_fndecl (call);
938 tree source0 = NULL_TREE, source1 = NULL_TREE,
939 dest = NULL_TREE, len = NULL_TREE;
940 bool is_store = true, got_reference_p = false;
941 HOST_WIDE_INT access_size = 1;
943 *intercepted_p = asan_intercepted_p ((DECL_FUNCTION_CODE (callee)));
945 switch (DECL_FUNCTION_CODE (callee))
947 /* (s, s, n) style memops. */
948 case BUILT_IN_BCMP:
949 case BUILT_IN_MEMCMP:
950 source0 = gimple_call_arg (call, 0);
951 source1 = gimple_call_arg (call, 1);
952 len = gimple_call_arg (call, 2);
953 break;
955 /* (src, dest, n) style memops. */
956 case BUILT_IN_BCOPY:
957 source0 = gimple_call_arg (call, 0);
958 dest = gimple_call_arg (call, 1);
959 len = gimple_call_arg (call, 2);
960 break;
962 /* (dest, src, n) style memops. */
963 case BUILT_IN_MEMCPY:
964 case BUILT_IN_MEMCPY_CHK:
965 case BUILT_IN_MEMMOVE:
966 case BUILT_IN_MEMMOVE_CHK:
967 case BUILT_IN_MEMPCPY:
968 case BUILT_IN_MEMPCPY_CHK:
969 dest = gimple_call_arg (call, 0);
970 source0 = gimple_call_arg (call, 1);
971 len = gimple_call_arg (call, 2);
972 break;
974 /* (dest, n) style memops. */
975 case BUILT_IN_BZERO:
976 dest = gimple_call_arg (call, 0);
977 len = gimple_call_arg (call, 1);
978 break;
980 /* (dest, x, n) style memops*/
981 case BUILT_IN_MEMSET:
982 case BUILT_IN_MEMSET_CHK:
983 dest = gimple_call_arg (call, 0);
984 len = gimple_call_arg (call, 2);
985 break;
987 case BUILT_IN_STRLEN:
988 /* Special case strlen here since its length is taken from its return
989 value.
991 The approach taken by the sanitizers is to check a memory access
992 before it's taken. For ASAN strlen is intercepted by libasan, so no
993 check is inserted by the compiler.
995 This function still returns `true` and provides a length to the rest
996 of the ASAN pass in order to record what areas have been checked,
997 avoiding superfluous checks later on.
999 HWASAN does not intercept any of these internal functions.
1000 This means that checks for memory accesses must be inserted by the
1001 compiler.
1002 strlen is a special case, because we can tell the length from the
1003 return of the function, but that is not known until after the function
1004 has returned.
1006 Hence we can't check the memory access before it happens.
1007 We could check the memory access after it has already happened, but
1008 for now we choose to just ignore `strlen` calls.
1009 This decision was simply made because that means the special case is
1010 limited to this one case of this one function. */
1011 if (hwasan_sanitize_p ())
1012 return false;
1013 source0 = gimple_call_arg (call, 0);
1014 len = gimple_call_lhs (call);
1015 break;
1017 case BUILT_IN_STACK_RESTORE:
1018 handle_builtin_stack_restore (call, iter);
1019 break;
1021 CASE_BUILT_IN_ALLOCA:
1022 handle_builtin_alloca (call, iter);
1023 break;
1024 /* And now the __atomic* and __sync builtins.
1025 These are handled differently from the classical memory
1026 access builtins above. */
1028 case BUILT_IN_ATOMIC_LOAD_1:
1029 is_store = false;
1030 /* FALLTHRU */
1031 case BUILT_IN_SYNC_FETCH_AND_ADD_1:
1032 case BUILT_IN_SYNC_FETCH_AND_SUB_1:
1033 case BUILT_IN_SYNC_FETCH_AND_OR_1:
1034 case BUILT_IN_SYNC_FETCH_AND_AND_1:
1035 case BUILT_IN_SYNC_FETCH_AND_XOR_1:
1036 case BUILT_IN_SYNC_FETCH_AND_NAND_1:
1037 case BUILT_IN_SYNC_ADD_AND_FETCH_1:
1038 case BUILT_IN_SYNC_SUB_AND_FETCH_1:
1039 case BUILT_IN_SYNC_OR_AND_FETCH_1:
1040 case BUILT_IN_SYNC_AND_AND_FETCH_1:
1041 case BUILT_IN_SYNC_XOR_AND_FETCH_1:
1042 case BUILT_IN_SYNC_NAND_AND_FETCH_1:
1043 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1:
1044 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1:
1045 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1:
1046 case BUILT_IN_SYNC_LOCK_RELEASE_1:
1047 case BUILT_IN_ATOMIC_EXCHANGE_1:
1048 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
1049 case BUILT_IN_ATOMIC_STORE_1:
1050 case BUILT_IN_ATOMIC_ADD_FETCH_1:
1051 case BUILT_IN_ATOMIC_SUB_FETCH_1:
1052 case BUILT_IN_ATOMIC_AND_FETCH_1:
1053 case BUILT_IN_ATOMIC_NAND_FETCH_1:
1054 case BUILT_IN_ATOMIC_XOR_FETCH_1:
1055 case BUILT_IN_ATOMIC_OR_FETCH_1:
1056 case BUILT_IN_ATOMIC_FETCH_ADD_1:
1057 case BUILT_IN_ATOMIC_FETCH_SUB_1:
1058 case BUILT_IN_ATOMIC_FETCH_AND_1:
1059 case BUILT_IN_ATOMIC_FETCH_NAND_1:
1060 case BUILT_IN_ATOMIC_FETCH_XOR_1:
1061 case BUILT_IN_ATOMIC_FETCH_OR_1:
1062 access_size = 1;
1063 goto do_atomic;
1065 case BUILT_IN_ATOMIC_LOAD_2:
1066 is_store = false;
1067 /* FALLTHRU */
1068 case BUILT_IN_SYNC_FETCH_AND_ADD_2:
1069 case BUILT_IN_SYNC_FETCH_AND_SUB_2:
1070 case BUILT_IN_SYNC_FETCH_AND_OR_2:
1071 case BUILT_IN_SYNC_FETCH_AND_AND_2:
1072 case BUILT_IN_SYNC_FETCH_AND_XOR_2:
1073 case BUILT_IN_SYNC_FETCH_AND_NAND_2:
1074 case BUILT_IN_SYNC_ADD_AND_FETCH_2:
1075 case BUILT_IN_SYNC_SUB_AND_FETCH_2:
1076 case BUILT_IN_SYNC_OR_AND_FETCH_2:
1077 case BUILT_IN_SYNC_AND_AND_FETCH_2:
1078 case BUILT_IN_SYNC_XOR_AND_FETCH_2:
1079 case BUILT_IN_SYNC_NAND_AND_FETCH_2:
1080 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2:
1081 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2:
1082 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2:
1083 case BUILT_IN_SYNC_LOCK_RELEASE_2:
1084 case BUILT_IN_ATOMIC_EXCHANGE_2:
1085 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
1086 case BUILT_IN_ATOMIC_STORE_2:
1087 case BUILT_IN_ATOMIC_ADD_FETCH_2:
1088 case BUILT_IN_ATOMIC_SUB_FETCH_2:
1089 case BUILT_IN_ATOMIC_AND_FETCH_2:
1090 case BUILT_IN_ATOMIC_NAND_FETCH_2:
1091 case BUILT_IN_ATOMIC_XOR_FETCH_2:
1092 case BUILT_IN_ATOMIC_OR_FETCH_2:
1093 case BUILT_IN_ATOMIC_FETCH_ADD_2:
1094 case BUILT_IN_ATOMIC_FETCH_SUB_2:
1095 case BUILT_IN_ATOMIC_FETCH_AND_2:
1096 case BUILT_IN_ATOMIC_FETCH_NAND_2:
1097 case BUILT_IN_ATOMIC_FETCH_XOR_2:
1098 case BUILT_IN_ATOMIC_FETCH_OR_2:
1099 access_size = 2;
1100 goto do_atomic;
1102 case BUILT_IN_ATOMIC_LOAD_4:
1103 is_store = false;
1104 /* FALLTHRU */
1105 case BUILT_IN_SYNC_FETCH_AND_ADD_4:
1106 case BUILT_IN_SYNC_FETCH_AND_SUB_4:
1107 case BUILT_IN_SYNC_FETCH_AND_OR_4:
1108 case BUILT_IN_SYNC_FETCH_AND_AND_4:
1109 case BUILT_IN_SYNC_FETCH_AND_XOR_4:
1110 case BUILT_IN_SYNC_FETCH_AND_NAND_4:
1111 case BUILT_IN_SYNC_ADD_AND_FETCH_4:
1112 case BUILT_IN_SYNC_SUB_AND_FETCH_4:
1113 case BUILT_IN_SYNC_OR_AND_FETCH_4:
1114 case BUILT_IN_SYNC_AND_AND_FETCH_4:
1115 case BUILT_IN_SYNC_XOR_AND_FETCH_4:
1116 case BUILT_IN_SYNC_NAND_AND_FETCH_4:
1117 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4:
1118 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4:
1119 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4:
1120 case BUILT_IN_SYNC_LOCK_RELEASE_4:
1121 case BUILT_IN_ATOMIC_EXCHANGE_4:
1122 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
1123 case BUILT_IN_ATOMIC_STORE_4:
1124 case BUILT_IN_ATOMIC_ADD_FETCH_4:
1125 case BUILT_IN_ATOMIC_SUB_FETCH_4:
1126 case BUILT_IN_ATOMIC_AND_FETCH_4:
1127 case BUILT_IN_ATOMIC_NAND_FETCH_4:
1128 case BUILT_IN_ATOMIC_XOR_FETCH_4:
1129 case BUILT_IN_ATOMIC_OR_FETCH_4:
1130 case BUILT_IN_ATOMIC_FETCH_ADD_4:
1131 case BUILT_IN_ATOMIC_FETCH_SUB_4:
1132 case BUILT_IN_ATOMIC_FETCH_AND_4:
1133 case BUILT_IN_ATOMIC_FETCH_NAND_4:
1134 case BUILT_IN_ATOMIC_FETCH_XOR_4:
1135 case BUILT_IN_ATOMIC_FETCH_OR_4:
1136 access_size = 4;
1137 goto do_atomic;
1139 case BUILT_IN_ATOMIC_LOAD_8:
1140 is_store = false;
1141 /* FALLTHRU */
1142 case BUILT_IN_SYNC_FETCH_AND_ADD_8:
1143 case BUILT_IN_SYNC_FETCH_AND_SUB_8:
1144 case BUILT_IN_SYNC_FETCH_AND_OR_8:
1145 case BUILT_IN_SYNC_FETCH_AND_AND_8:
1146 case BUILT_IN_SYNC_FETCH_AND_XOR_8:
1147 case BUILT_IN_SYNC_FETCH_AND_NAND_8:
1148 case BUILT_IN_SYNC_ADD_AND_FETCH_8:
1149 case BUILT_IN_SYNC_SUB_AND_FETCH_8:
1150 case BUILT_IN_SYNC_OR_AND_FETCH_8:
1151 case BUILT_IN_SYNC_AND_AND_FETCH_8:
1152 case BUILT_IN_SYNC_XOR_AND_FETCH_8:
1153 case BUILT_IN_SYNC_NAND_AND_FETCH_8:
1154 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8:
1155 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8:
1156 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8:
1157 case BUILT_IN_SYNC_LOCK_RELEASE_8:
1158 case BUILT_IN_ATOMIC_EXCHANGE_8:
1159 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
1160 case BUILT_IN_ATOMIC_STORE_8:
1161 case BUILT_IN_ATOMIC_ADD_FETCH_8:
1162 case BUILT_IN_ATOMIC_SUB_FETCH_8:
1163 case BUILT_IN_ATOMIC_AND_FETCH_8:
1164 case BUILT_IN_ATOMIC_NAND_FETCH_8:
1165 case BUILT_IN_ATOMIC_XOR_FETCH_8:
1166 case BUILT_IN_ATOMIC_OR_FETCH_8:
1167 case BUILT_IN_ATOMIC_FETCH_ADD_8:
1168 case BUILT_IN_ATOMIC_FETCH_SUB_8:
1169 case BUILT_IN_ATOMIC_FETCH_AND_8:
1170 case BUILT_IN_ATOMIC_FETCH_NAND_8:
1171 case BUILT_IN_ATOMIC_FETCH_XOR_8:
1172 case BUILT_IN_ATOMIC_FETCH_OR_8:
1173 access_size = 8;
1174 goto do_atomic;
1176 case BUILT_IN_ATOMIC_LOAD_16:
1177 is_store = false;
1178 /* FALLTHRU */
1179 case BUILT_IN_SYNC_FETCH_AND_ADD_16:
1180 case BUILT_IN_SYNC_FETCH_AND_SUB_16:
1181 case BUILT_IN_SYNC_FETCH_AND_OR_16:
1182 case BUILT_IN_SYNC_FETCH_AND_AND_16:
1183 case BUILT_IN_SYNC_FETCH_AND_XOR_16:
1184 case BUILT_IN_SYNC_FETCH_AND_NAND_16:
1185 case BUILT_IN_SYNC_ADD_AND_FETCH_16:
1186 case BUILT_IN_SYNC_SUB_AND_FETCH_16:
1187 case BUILT_IN_SYNC_OR_AND_FETCH_16:
1188 case BUILT_IN_SYNC_AND_AND_FETCH_16:
1189 case BUILT_IN_SYNC_XOR_AND_FETCH_16:
1190 case BUILT_IN_SYNC_NAND_AND_FETCH_16:
1191 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16:
1192 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16:
1193 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16:
1194 case BUILT_IN_SYNC_LOCK_RELEASE_16:
1195 case BUILT_IN_ATOMIC_EXCHANGE_16:
1196 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
1197 case BUILT_IN_ATOMIC_STORE_16:
1198 case BUILT_IN_ATOMIC_ADD_FETCH_16:
1199 case BUILT_IN_ATOMIC_SUB_FETCH_16:
1200 case BUILT_IN_ATOMIC_AND_FETCH_16:
1201 case BUILT_IN_ATOMIC_NAND_FETCH_16:
1202 case BUILT_IN_ATOMIC_XOR_FETCH_16:
1203 case BUILT_IN_ATOMIC_OR_FETCH_16:
1204 case BUILT_IN_ATOMIC_FETCH_ADD_16:
1205 case BUILT_IN_ATOMIC_FETCH_SUB_16:
1206 case BUILT_IN_ATOMIC_FETCH_AND_16:
1207 case BUILT_IN_ATOMIC_FETCH_NAND_16:
1208 case BUILT_IN_ATOMIC_FETCH_XOR_16:
1209 case BUILT_IN_ATOMIC_FETCH_OR_16:
1210 access_size = 16;
1211 /* FALLTHRU */
1212 do_atomic:
1214 dest = gimple_call_arg (call, 0);
1215 /* DEST represents the address of a memory location.
1216 instrument_derefs wants the memory location, so lets
1217 dereference the address DEST before handing it to
1218 instrument_derefs. */
1219 tree type = build_nonstandard_integer_type (access_size
1220 * BITS_PER_UNIT, 1);
1221 dest = build2 (MEM_REF, type, dest,
1222 build_int_cst (build_pointer_type (char_type_node), 0));
1223 break;
1226 default:
1227 /* The other builtins memory access are not instrumented in this
1228 function because they either don't have any length parameter,
1229 or their length parameter is just a limit. */
1230 break;
1233 if (len != NULL_TREE)
1235 if (source0 != NULL_TREE)
1237 src0->start = source0;
1238 src0->access_size = access_size;
1239 *src0_len = len;
1240 *src0_is_store = false;
1243 if (source1 != NULL_TREE)
1245 src1->start = source1;
1246 src1->access_size = access_size;
1247 *src1_len = len;
1248 *src1_is_store = false;
1251 if (dest != NULL_TREE)
1253 dst->start = dest;
1254 dst->access_size = access_size;
1255 *dst_len = len;
1256 *dst_is_store = true;
1259 got_reference_p = true;
1261 else if (dest)
1263 dst->start = dest;
1264 dst->access_size = access_size;
1265 *dst_len = NULL_TREE;
1266 *dst_is_store = is_store;
1267 *dest_is_deref = true;
1268 got_reference_p = true;
1271 return got_reference_p;
1274 /* Return true iff a given gimple statement has been instrumented.
1275 Note that the statement is "defined" by the memory references it
1276 contains. */
1278 static bool
1279 has_stmt_been_instrumented_p (gimple *stmt)
1281 if (gimple_assign_single_p (stmt))
1283 bool r_is_store;
1284 asan_mem_ref r;
1285 asan_mem_ref_init (&r, NULL, 1);
1287 if (get_mem_ref_of_assignment (as_a <gassign *> (stmt), &r,
1288 &r_is_store))
1290 if (!has_mem_ref_been_instrumented (&r))
1291 return false;
1292 if (r_is_store && gimple_assign_load_p (stmt))
1294 asan_mem_ref src;
1295 asan_mem_ref_init (&src, NULL, 1);
1296 src.start = gimple_assign_rhs1 (stmt);
1297 src.access_size = int_size_in_bytes (TREE_TYPE (src.start));
1298 if (!has_mem_ref_been_instrumented (&src))
1299 return false;
1301 return true;
1304 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
1306 asan_mem_ref src0, src1, dest;
1307 asan_mem_ref_init (&src0, NULL, 1);
1308 asan_mem_ref_init (&src1, NULL, 1);
1309 asan_mem_ref_init (&dest, NULL, 1);
1311 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
1312 bool src0_is_store = false, src1_is_store = false,
1313 dest_is_store = false, dest_is_deref = false, intercepted_p = true;
1314 if (get_mem_refs_of_builtin_call (as_a <gcall *> (stmt),
1315 &src0, &src0_len, &src0_is_store,
1316 &src1, &src1_len, &src1_is_store,
1317 &dest, &dest_len, &dest_is_store,
1318 &dest_is_deref, &intercepted_p))
1320 if (src0.start != NULL_TREE
1321 && !has_mem_ref_been_instrumented (&src0, src0_len))
1322 return false;
1324 if (src1.start != NULL_TREE
1325 && !has_mem_ref_been_instrumented (&src1, src1_len))
1326 return false;
1328 if (dest.start != NULL_TREE
1329 && !has_mem_ref_been_instrumented (&dest, dest_len))
1330 return false;
1332 return true;
1335 else if (is_gimple_call (stmt) && gimple_store_p (stmt))
1337 asan_mem_ref r;
1338 asan_mem_ref_init (&r, NULL, 1);
1340 r.start = gimple_call_lhs (stmt);
1341 r.access_size = int_size_in_bytes (TREE_TYPE (r.start));
1342 return has_mem_ref_been_instrumented (&r);
1345 return false;
1348 /* Insert a memory reference into the hash table. */
1350 static void
1351 update_mem_ref_hash_table (tree ref, HOST_WIDE_INT access_size)
1353 hash_table<asan_mem_ref_hasher> *ht = get_mem_ref_hash_table ();
1355 asan_mem_ref r;
1356 asan_mem_ref_init (&r, ref, access_size);
1358 asan_mem_ref **slot = ht->find_slot (&r, INSERT);
1359 if (*slot == NULL || (*slot)->access_size < access_size)
1360 *slot = asan_mem_ref_new (ref, access_size);
1363 /* Initialize shadow_ptr_types array. */
1365 static void
1366 asan_init_shadow_ptr_types (void)
1368 asan_shadow_set = new_alias_set ();
1369 tree types[3] = { signed_char_type_node, short_integer_type_node,
1370 integer_type_node };
1372 for (unsigned i = 0; i < 3; i++)
1374 shadow_ptr_types[i] = build_distinct_type_copy (types[i]);
1375 TYPE_ALIAS_SET (shadow_ptr_types[i]) = asan_shadow_set;
1376 shadow_ptr_types[i] = build_pointer_type (shadow_ptr_types[i]);
1379 initialize_sanitizer_builtins ();
1382 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
1384 static tree
1385 asan_pp_string (pretty_printer *pp)
1387 const char *buf = pp_formatted_text (pp);
1388 size_t len = strlen (buf);
1389 tree ret = build_string (len + 1, buf);
1390 TREE_TYPE (ret)
1391 = build_array_type (TREE_TYPE (shadow_ptr_types[0]),
1392 build_index_type (size_int (len)));
1393 TREE_READONLY (ret) = 1;
1394 TREE_STATIC (ret) = 1;
1395 return build1 (ADDR_EXPR, shadow_ptr_types[0], ret);
1398 /* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
1399 though. */
1401 static void
1402 asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
1404 rtx_insn *insn, *insns, *jump;
1405 rtx_code_label *top_label;
1406 rtx end, addr, tmp;
1408 gcc_assert ((len & 3) == 0);
1409 start_sequence ();
1410 clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
1411 insns = get_insns ();
1412 end_sequence ();
1413 for (insn = insns; insn; insn = NEXT_INSN (insn))
1414 if (CALL_P (insn))
1415 break;
1416 if (insn == NULL_RTX)
1418 emit_insn (insns);
1419 return;
1422 top_label = gen_label_rtx ();
1423 addr = copy_to_mode_reg (Pmode, XEXP (shadow_mem, 0));
1424 shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
1425 end = force_reg (Pmode, plus_constant (Pmode, addr, len));
1426 emit_label (top_label);
1428 emit_move_insn (shadow_mem, const0_rtx);
1429 tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), addr,
1430 true, OPTAB_LIB_WIDEN);
1431 if (tmp != addr)
1432 emit_move_insn (addr, tmp);
1433 emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
1434 jump = get_last_insn ();
1435 gcc_assert (JUMP_P (jump));
1436 add_reg_br_prob_note (jump,
1437 profile_probability::guessed_always ()
1438 .apply_scale (80, 100));
1441 void
1442 asan_function_start (void)
1444 section *fnsec = function_section (current_function_decl);
1445 switch_to_section (fnsec);
1446 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC",
1447 current_function_funcdef_no);
1450 /* Return number of shadow bytes that are occupied by a local variable
1451 of SIZE bytes. */
1453 static unsigned HOST_WIDE_INT
1454 shadow_mem_size (unsigned HOST_WIDE_INT size)
1456 /* It must be possible to align stack variables to granularity
1457 of shadow memory. */
1458 gcc_assert (BITS_PER_UNIT
1459 * ASAN_SHADOW_GRANULARITY <= MAX_SUPPORTED_STACK_ALIGNMENT);
1461 return ROUND_UP (size, ASAN_SHADOW_GRANULARITY) / ASAN_SHADOW_GRANULARITY;
1464 /* Always emit 4 bytes at a time. */
1465 #define RZ_BUFFER_SIZE 4
1467 /* ASAN redzone buffer container that handles emission of shadow bytes. */
1468 class asan_redzone_buffer
1470 public:
1471 /* Constructor. */
1472 asan_redzone_buffer (rtx shadow_mem, HOST_WIDE_INT prev_offset):
1473 m_shadow_mem (shadow_mem), m_prev_offset (prev_offset),
1474 m_original_offset (prev_offset), m_shadow_bytes (RZ_BUFFER_SIZE)
1477 /* Emit VALUE shadow byte at a given OFFSET. */
1478 void emit_redzone_byte (HOST_WIDE_INT offset, unsigned char value);
1480 /* Emit RTX emission of the content of the buffer. */
1481 void flush_redzone_payload (void);
1483 private:
1484 /* Flush if the content of the buffer is full
1485 (equal to RZ_BUFFER_SIZE). */
1486 void flush_if_full (void);
1488 /* Memory where we last emitted a redzone payload. */
1489 rtx m_shadow_mem;
1491 /* Relative offset where we last emitted a redzone payload. */
1492 HOST_WIDE_INT m_prev_offset;
1494 /* Relative original offset. Used for checking only. */
1495 HOST_WIDE_INT m_original_offset;
1497 public:
1498 /* Buffer with redzone payload. */
1499 auto_vec<unsigned char> m_shadow_bytes;
1502 /* Emit VALUE shadow byte at a given OFFSET. */
1504 void
1505 asan_redzone_buffer::emit_redzone_byte (HOST_WIDE_INT offset,
1506 unsigned char value)
1508 gcc_assert ((offset & (ASAN_SHADOW_GRANULARITY - 1)) == 0);
1509 gcc_assert (offset >= m_prev_offset);
1511 HOST_WIDE_INT off
1512 = m_prev_offset + ASAN_SHADOW_GRANULARITY * m_shadow_bytes.length ();
1513 if (off == offset)
1514 /* Consecutive shadow memory byte. */;
1515 else if (offset < m_prev_offset + (HOST_WIDE_INT) (ASAN_SHADOW_GRANULARITY
1516 * RZ_BUFFER_SIZE)
1517 && !m_shadow_bytes.is_empty ())
1519 /* Shadow memory byte with a small gap. */
1520 for (; off < offset; off += ASAN_SHADOW_GRANULARITY)
1521 m_shadow_bytes.safe_push (0);
1523 else
1525 if (!m_shadow_bytes.is_empty ())
1526 flush_redzone_payload ();
1528 /* Maybe start earlier in order to use aligned store. */
1529 HOST_WIDE_INT align = (offset - m_prev_offset) % ASAN_RED_ZONE_SIZE;
1530 if (align)
1532 offset -= align;
1533 for (unsigned i = 0; i < align / BITS_PER_UNIT; i++)
1534 m_shadow_bytes.safe_push (0);
1537 /* Adjust m_prev_offset and m_shadow_mem. */
1538 HOST_WIDE_INT diff = offset - m_prev_offset;
1539 m_shadow_mem = adjust_address (m_shadow_mem, VOIDmode,
1540 diff >> ASAN_SHADOW_SHIFT);
1541 m_prev_offset = offset;
1543 m_shadow_bytes.safe_push (value);
1544 flush_if_full ();
1547 /* Emit RTX emission of the content of the buffer. */
1549 void
1550 asan_redzone_buffer::flush_redzone_payload (void)
1552 gcc_assert (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN);
1554 if (m_shadow_bytes.is_empty ())
1555 return;
1557 /* Be sure we always emit to an aligned address. */
1558 gcc_assert (((m_prev_offset - m_original_offset)
1559 & (ASAN_RED_ZONE_SIZE - 1)) == 0);
1561 /* Fill it to RZ_BUFFER_SIZE bytes with zeros if needed. */
1562 unsigned l = m_shadow_bytes.length ();
1563 for (unsigned i = 0; i <= RZ_BUFFER_SIZE - l; i++)
1564 m_shadow_bytes.safe_push (0);
1566 if (dump_file && (dump_flags & TDF_DETAILS))
1567 fprintf (dump_file,
1568 "Flushing rzbuffer at offset %" PRId64 " with: ", m_prev_offset);
1570 unsigned HOST_WIDE_INT val = 0;
1571 for (unsigned i = 0; i < RZ_BUFFER_SIZE; i++)
1573 unsigned char v
1574 = m_shadow_bytes[BYTES_BIG_ENDIAN ? RZ_BUFFER_SIZE - i - 1 : i];
1575 val |= (unsigned HOST_WIDE_INT)v << (BITS_PER_UNIT * i);
1576 if (dump_file && (dump_flags & TDF_DETAILS))
1577 fprintf (dump_file, "%02x ", v);
1580 if (dump_file && (dump_flags & TDF_DETAILS))
1581 fprintf (dump_file, "\n");
1583 rtx c = gen_int_mode (val, SImode);
1584 m_shadow_mem = adjust_address (m_shadow_mem, SImode, 0);
1585 emit_move_insn (m_shadow_mem, c);
1586 m_shadow_bytes.truncate (0);
1589 /* Flush if the content of the buffer is full
1590 (equal to RZ_BUFFER_SIZE). */
1592 void
1593 asan_redzone_buffer::flush_if_full (void)
1595 if (m_shadow_bytes.length () == RZ_BUFFER_SIZE)
1596 flush_redzone_payload ();
1600 /* HWAddressSanitizer (hwasan) is a probabilistic method for detecting
1601 out-of-bounds and use-after-free bugs.
1602 Read more:
1603 http://code.google.com/p/address-sanitizer/
1605 Similar to AddressSanitizer (asan) it consists of two parts: the
1606 instrumentation module in this file, and a run-time library.
1608 The instrumentation module adds a run-time check before every memory insn in
1609 the same manner as asan (see the block comment for AddressSanitizer above).
1610 Currently, hwasan only adds out-of-line instrumentation, where each check is
1611 implemented as a function call to the run-time library. Hence a check for a
1612 load of N bytes from address X would be implemented with a function call to
1613 __hwasan_loadN(X), and checking a store of N bytes from address X would be
1614 implemented with a function call to __hwasan_storeN(X).
1616 The main difference between hwasan and asan is in the information stored to
1617 help this checking. Both sanitizers use a shadow memory area which stores
1618 data recording the state of main memory at a corresponding address.
1620 For hwasan, each 16 byte granule in main memory has a corresponding 1 byte
1621 in shadow memory. This shadow address can be calculated with equation:
1622 (addr >> log_2(HWASAN_TAG_GRANULE_SIZE))
1623 + __hwasan_shadow_memory_dynamic_address;
1624 The conversion between real and shadow memory for asan is given in the block
1625 comment at the top of this file.
1626 The description of how this shadow memory is laid out for asan is in the
1627 block comment at the top of this file, here we describe how this shadow
1628 memory is used for hwasan.
1630 For hwasan, each variable is assigned a byte-sized 'tag'. The extent of
1631 the shadow memory for that variable is filled with the assigned tag, and
1632 every pointer referencing that variable has its top byte set to the same
1633 tag. The run-time library redefines malloc so that every allocation returns
1634 a tagged pointer and tags the corresponding shadow memory with the same tag.
1636 On each pointer dereference the tag found in the pointer is compared to the
1637 tag found in the shadow memory corresponding to the accessed memory address.
1638 If these tags are found to differ then this memory access is judged to be
1639 invalid and a report is generated.
1641 This method of bug detection is not perfect -- it can not catch every bad
1642 access -- but catches them probabilistically instead. There is always the
1643 possibility that an invalid memory access will happen to access memory
1644 tagged with the same tag as the pointer that this access used.
1645 The chances of this are approx. 0.4% for any two uncorrelated objects.
1647 Random tag generation can mitigate this problem by decreasing the
1648 probability that an invalid access will be missed in the same manner over
1649 multiple runs. i.e. if two objects are tagged the same in one run of the
1650 binary they are unlikely to be tagged the same in the next run.
1651 Both heap and stack allocated objects have random tags by default.
1653 [16 byte granule implications]
1654 Since the shadow memory only has a resolution on real memory of 16 bytes,
1655 invalid accesses that are within the same 16 byte granule as a valid
1656 address will not be caught.
1658 There is a "short-granule" feature in the runtime library which does catch
1659 such accesses, but this feature is not implemented for stack objects (since
1660 stack objects are allocated and tagged by compiler instrumentation, and
1661 this feature has not yet been implemented in GCC instrumentation).
1663 Another outcome of this 16 byte resolution is that each tagged object must
1664 be 16 byte aligned. If two objects were to share any 16 byte granule in
1665 memory, then they both would have to be given the same tag, and invalid
1666 accesses to one using a pointer to the other would be undetectable.
1668 [Compiler instrumentation]
1669 Compiler instrumentation ensures that two adjacent buffers on the stack are
1670 given different tags, this means an access to one buffer using a pointer
1671 generated from the other (e.g. through buffer overrun) will have mismatched
1672 tags and be caught by hwasan.
1674 We don't randomly tag every object on the stack, since that would require
1675 keeping many registers to record each tag. Instead we randomly generate a
1676 tag for each function frame, and each new stack object uses a tag offset
1677 from that frame tag.
1678 i.e. each object is tagged as RFT + offset, where RFT is the "random frame
1679 tag" generated for this frame.
1680 This means that randomisation does not peturb the difference between tags
1681 on tagged stack objects within a frame, but this is mitigated by the fact
1682 that objects with the same tag within a frame are very far apart
1683 (approx. 2^HWASAN_TAG_SIZE objects apart).
1685 As a demonstration, using the same example program as in the asan block
1686 comment above:
1689 foo ()
1691 char a[24] = {0};
1692 int b[2] = {0};
1694 a[5] = 1;
1695 b[1] = 2;
1697 return a[5] + b[1];
1700 On AArch64 the stack will be ordered as follows for the above function:
1702 Slot 1/ [24 bytes for variable 'a']
1703 Slot 2/ [8 bytes padding for alignment]
1704 Slot 3/ [8 bytes for variable 'b']
1705 Slot 4/ [8 bytes padding for alignment]
1707 (The padding is there to ensure 16 byte alignment as described in the 16
1708 byte granule implications).
1710 While the shadow memory will be ordered as follows:
1712 - 2 bytes (representing 32 bytes in real memory) tagged with RFT + 1.
1713 - 1 byte (representing 16 bytes in real memory) tagged with RFT + 2.
1715 And any pointer to "a" will have the tag RFT + 1, and any pointer to "b"
1716 will have the tag RFT + 2.
1718 [Top Byte Ignore requirements]
1719 Hwasan requires the ability to store an 8 bit tag in every pointer. There
1720 is no instrumentation done to remove this tag from pointers before
1721 dereferencing, which means the hardware must ignore this tag during memory
1722 accesses.
1724 Architectures where this feature is available should indicate this using
1725 the TARGET_MEMTAG_CAN_TAG_ADDRESSES hook.
1727 [Stack requires cleanup on unwinding]
1728 During normal operation of a hwasan sanitized program more space in the
1729 shadow memory becomes tagged as the stack grows. As the stack shrinks this
1730 shadow memory space must become untagged. If it is not untagged then when
1731 the stack grows again (during other function calls later on in the program)
1732 objects on the stack that are usually not tagged (e.g. parameters passed on
1733 the stack) can be placed in memory whose shadow space is tagged with
1734 something else, and accesses can cause false positive reports.
1736 Hence we place untagging code on every epilogue of functions which tag some
1737 stack objects.
1739 Moreover, the run-time library intercepts longjmp & setjmp to untag when
1740 the stack is unwound this way.
1742 C++ exceptions are not yet handled, which means this sanitizer can not
1743 handle C++ code that throws exceptions -- it will give false positives
1744 after an exception has been thrown. The implementation that the hwasan
1745 library has for handling these relies on the frame pointer being after any
1746 local variables. This is not generally the case for GCC. */
1749 /* Returns whether we are tagging pointers and checking those tags on memory
1750 access. */
1751 bool
1752 hwasan_sanitize_p ()
1754 return sanitize_flags_p (SANITIZE_HWADDRESS);
1757 /* Are we tagging the stack? */
1758 bool
1759 hwasan_sanitize_stack_p ()
1761 return (hwasan_sanitize_p () && param_hwasan_instrument_stack);
1764 /* Are we tagging alloca objects? */
1765 bool
1766 hwasan_sanitize_allocas_p (void)
1768 return (hwasan_sanitize_stack_p () && param_hwasan_instrument_allocas);
1771 /* Should we instrument reads? */
1772 bool
1773 hwasan_instrument_reads (void)
1775 return (hwasan_sanitize_p () && param_hwasan_instrument_reads);
1778 /* Should we instrument writes? */
1779 bool
1780 hwasan_instrument_writes (void)
1782 return (hwasan_sanitize_p () && param_hwasan_instrument_writes);
1785 /* Should we instrument builtin calls? */
1786 bool
1787 hwasan_memintrin (void)
1789 return (hwasan_sanitize_p () && param_hwasan_instrument_mem_intrinsics);
1792 /* Insert code to protect stack vars. The prologue sequence should be emitted
1793 directly, epilogue sequence returned. BASE is the register holding the
1794 stack base, against which OFFSETS array offsets are relative to, OFFSETS
1795 array contains pairs of offsets in reverse order, always the end offset
1796 of some gap that needs protection followed by starting offset,
1797 and DECLS is an array of representative decls for each var partition.
1798 LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
1799 elements long (OFFSETS include gap before the first variable as well
1800 as gaps after each stack variable). PBASE is, if non-NULL, some pseudo
1801 register which stack vars DECL_RTLs are based on. Either BASE should be
1802 assigned to PBASE, when not doing use after return protection, or
1803 corresponding address based on __asan_stack_malloc* return value. */
1805 rtx_insn *
1806 asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
1807 HOST_WIDE_INT *offsets, tree *decls, int length)
1809 rtx shadow_base, shadow_mem, ret, mem, orig_base;
1810 rtx_code_label *lab;
1811 rtx_insn *insns;
1812 char buf[32];
1813 HOST_WIDE_INT base_offset = offsets[length - 1];
1814 HOST_WIDE_INT base_align_bias = 0, offset, prev_offset;
1815 HOST_WIDE_INT asan_frame_size = offsets[0] - base_offset;
1816 HOST_WIDE_INT last_offset, last_size, last_size_aligned;
1817 int l;
1818 unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT;
1819 tree str_cst, decl, id;
1820 int use_after_return_class = -1;
1822 /* Don't emit anything when doing error recovery, the assertions
1823 might fail e.g. if a function had a frame offset overflow. */
1824 if (seen_error ())
1825 return NULL;
1827 if (shadow_ptr_types[0] == NULL_TREE)
1828 asan_init_shadow_ptr_types ();
1830 expanded_location cfun_xloc
1831 = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1833 /* First of all, prepare the description string. */
1834 pretty_printer asan_pp;
1836 pp_decimal_int (&asan_pp, length / 2 - 1);
1837 pp_space (&asan_pp);
1838 for (l = length - 2; l; l -= 2)
1840 tree decl = decls[l / 2 - 1];
1841 pp_wide_integer (&asan_pp, offsets[l] - base_offset);
1842 pp_space (&asan_pp);
1843 pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
1844 pp_space (&asan_pp);
1846 expanded_location xloc
1847 = expand_location (DECL_SOURCE_LOCATION (decl));
1848 char location[32];
1850 if (xloc.file == cfun_xloc.file)
1851 sprintf (location, ":%d", xloc.line);
1852 else
1853 location[0] = '\0';
1855 if (DECL_P (decl) && DECL_NAME (decl))
1857 unsigned idlen
1858 = IDENTIFIER_LENGTH (DECL_NAME (decl)) + strlen (location);
1859 pp_decimal_int (&asan_pp, idlen);
1860 pp_space (&asan_pp);
1861 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
1862 pp_string (&asan_pp, location);
1864 else
1865 pp_string (&asan_pp, "9 <unknown>");
1867 if (l > 2)
1868 pp_space (&asan_pp);
1870 str_cst = asan_pp_string (&asan_pp);
1872 /* Emit the prologue sequence. */
1873 if (asan_frame_size > 32 && asan_frame_size <= 65536 && pbase
1874 && param_asan_use_after_return)
1876 use_after_return_class = floor_log2 (asan_frame_size - 1) - 5;
1877 /* __asan_stack_malloc_N guarantees alignment
1878 N < 6 ? (64 << N) : 4096 bytes. */
1879 if (alignb > (use_after_return_class < 6
1880 ? (64U << use_after_return_class) : 4096U))
1881 use_after_return_class = -1;
1882 else if (alignb > ASAN_RED_ZONE_SIZE && (asan_frame_size & (alignb - 1)))
1883 base_align_bias = ((asan_frame_size + alignb - 1)
1884 & ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size;
1887 /* Align base if target is STRICT_ALIGNMENT. */
1888 if (STRICT_ALIGNMENT)
1890 const HOST_WIDE_INT align
1891 = (GET_MODE_ALIGNMENT (SImode) / BITS_PER_UNIT) << ASAN_SHADOW_SHIFT;
1892 base = expand_binop (Pmode, and_optab, base, gen_int_mode (-align, Pmode),
1893 NULL_RTX, 1, OPTAB_DIRECT);
1896 if (use_after_return_class == -1 && pbase)
1897 emit_move_insn (pbase, base);
1899 base = expand_binop (Pmode, add_optab, base,
1900 gen_int_mode (base_offset - base_align_bias, Pmode),
1901 NULL_RTX, 1, OPTAB_DIRECT);
1902 orig_base = NULL_RTX;
1903 if (use_after_return_class != -1)
1905 if (asan_detect_stack_use_after_return == NULL_TREE)
1907 id = get_identifier ("__asan_option_detect_stack_use_after_return");
1908 decl = build_decl (BUILTINS_LOCATION, VAR_DECL, id,
1909 integer_type_node);
1910 SET_DECL_ASSEMBLER_NAME (decl, id);
1911 TREE_ADDRESSABLE (decl) = 1;
1912 DECL_ARTIFICIAL (decl) = 1;
1913 DECL_IGNORED_P (decl) = 1;
1914 DECL_EXTERNAL (decl) = 1;
1915 TREE_STATIC (decl) = 1;
1916 TREE_PUBLIC (decl) = 1;
1917 TREE_USED (decl) = 1;
1918 asan_detect_stack_use_after_return = decl;
1920 orig_base = gen_reg_rtx (Pmode);
1921 emit_move_insn (orig_base, base);
1922 ret = expand_normal (asan_detect_stack_use_after_return);
1923 lab = gen_label_rtx ();
1924 emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1925 VOIDmode, 0, lab,
1926 profile_probability::very_likely ());
1927 snprintf (buf, sizeof buf, "__asan_stack_malloc_%d",
1928 use_after_return_class);
1929 ret = init_one_libfunc (buf);
1930 ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode,
1931 GEN_INT (asan_frame_size
1932 + base_align_bias),
1933 TYPE_MODE (pointer_sized_int_node));
1934 /* __asan_stack_malloc_[n] returns a pointer to fake stack if succeeded
1935 and NULL otherwise. Check RET value is NULL here and jump over the
1936 BASE reassignment in this case. Otherwise, reassign BASE to RET. */
1937 emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1938 VOIDmode, 0, lab,
1939 profile_probability:: very_unlikely ());
1940 ret = convert_memory_address (Pmode, ret);
1941 emit_move_insn (base, ret);
1942 emit_label (lab);
1943 emit_move_insn (pbase, expand_binop (Pmode, add_optab, base,
1944 gen_int_mode (base_align_bias
1945 - base_offset, Pmode),
1946 NULL_RTX, 1, OPTAB_DIRECT));
1948 mem = gen_rtx_MEM (ptr_mode, base);
1949 mem = adjust_address (mem, VOIDmode, base_align_bias);
1950 emit_move_insn (mem, gen_int_mode (ASAN_STACK_FRAME_MAGIC, ptr_mode));
1951 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1952 emit_move_insn (mem, expand_normal (str_cst));
1953 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1954 ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", current_function_funcdef_no);
1955 id = get_identifier (buf);
1956 decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1957 VAR_DECL, id, char_type_node);
1958 SET_DECL_ASSEMBLER_NAME (decl, id);
1959 TREE_ADDRESSABLE (decl) = 1;
1960 TREE_READONLY (decl) = 1;
1961 DECL_ARTIFICIAL (decl) = 1;
1962 DECL_IGNORED_P (decl) = 1;
1963 TREE_STATIC (decl) = 1;
1964 TREE_PUBLIC (decl) = 0;
1965 TREE_USED (decl) = 1;
1966 DECL_INITIAL (decl) = decl;
1967 TREE_ASM_WRITTEN (decl) = 1;
1968 TREE_ASM_WRITTEN (id) = 1;
1969 emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl)));
1970 shadow_base = expand_binop (Pmode, lshr_optab, base,
1971 gen_int_shift_amount (Pmode, ASAN_SHADOW_SHIFT),
1972 NULL_RTX, 1, OPTAB_DIRECT);
1973 shadow_base
1974 = plus_constant (Pmode, shadow_base,
1975 asan_shadow_offset ()
1976 + (base_align_bias >> ASAN_SHADOW_SHIFT));
1977 gcc_assert (asan_shadow_set != -1
1978 && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
1979 shadow_mem = gen_rtx_MEM (SImode, shadow_base);
1980 set_mem_alias_set (shadow_mem, asan_shadow_set);
1981 if (STRICT_ALIGNMENT)
1982 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
1983 prev_offset = base_offset;
1985 asan_redzone_buffer rz_buffer (shadow_mem, prev_offset);
1986 for (l = length; l; l -= 2)
1988 if (l == 2)
1989 cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
1990 offset = offsets[l - 1];
1992 bool extra_byte = (offset - base_offset) & (ASAN_SHADOW_GRANULARITY - 1);
1993 /* If a red-zone is not aligned to ASAN_SHADOW_GRANULARITY then
1994 the previous stack variable has size % ASAN_SHADOW_GRANULARITY != 0.
1995 In that case we have to emit one extra byte that will describe
1996 how many bytes (our of ASAN_SHADOW_GRANULARITY) can be accessed. */
1997 if (extra_byte)
1999 HOST_WIDE_INT aoff
2000 = base_offset + ((offset - base_offset)
2001 & ~(ASAN_SHADOW_GRANULARITY - HOST_WIDE_INT_1));
2002 rz_buffer.emit_redzone_byte (aoff, offset - aoff);
2003 offset = aoff + ASAN_SHADOW_GRANULARITY;
2006 /* Calculate size of red zone payload. */
2007 while (offset < offsets[l - 2])
2009 rz_buffer.emit_redzone_byte (offset, cur_shadow_byte);
2010 offset += ASAN_SHADOW_GRANULARITY;
2013 cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
2016 /* As the automatic variables are aligned to
2017 ASAN_RED_ZONE_SIZE / ASAN_SHADOW_GRANULARITY, the buffer should be
2018 flushed here. */
2019 gcc_assert (rz_buffer.m_shadow_bytes.is_empty ());
2021 do_pending_stack_adjust ();
2023 /* Construct epilogue sequence. */
2024 start_sequence ();
2026 lab = NULL;
2027 if (use_after_return_class != -1)
2029 rtx_code_label *lab2 = gen_label_rtx ();
2030 char c = (char) ASAN_STACK_MAGIC_USE_AFTER_RET;
2031 emit_cmp_and_jump_insns (orig_base, base, EQ, NULL_RTX,
2032 VOIDmode, 0, lab2,
2033 profile_probability::very_likely ());
2034 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
2035 set_mem_alias_set (shadow_mem, asan_shadow_set);
2036 mem = gen_rtx_MEM (ptr_mode, base);
2037 mem = adjust_address (mem, VOIDmode, base_align_bias);
2038 emit_move_insn (mem, gen_int_mode (ASAN_STACK_RETIRED_MAGIC, ptr_mode));
2039 unsigned HOST_WIDE_INT sz = asan_frame_size >> ASAN_SHADOW_SHIFT;
2040 if (use_after_return_class < 5
2041 && can_store_by_pieces (sz, builtin_memset_read_str, &c,
2042 BITS_PER_UNIT, true))
2044 /* Emit:
2045 memset(ShadowBase, kAsanStackAfterReturnMagic, ShadowSize);
2046 **SavedFlagPtr(FakeStack, class_id) = 0
2048 store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c,
2049 BITS_PER_UNIT, true, RETURN_BEGIN);
2051 unsigned HOST_WIDE_INT offset
2052 = (1 << (use_after_return_class + 6));
2053 offset -= GET_MODE_SIZE (ptr_mode);
2054 mem = gen_rtx_MEM (ptr_mode, base);
2055 mem = adjust_address (mem, ptr_mode, offset);
2056 rtx addr = gen_reg_rtx (ptr_mode);
2057 emit_move_insn (addr, mem);
2058 addr = convert_memory_address (Pmode, addr);
2059 mem = gen_rtx_MEM (QImode, addr);
2060 emit_move_insn (mem, const0_rtx);
2062 else if (use_after_return_class >= 5
2063 || !set_storage_via_setmem (shadow_mem,
2064 GEN_INT (sz),
2065 gen_int_mode (c, QImode),
2066 BITS_PER_UNIT, BITS_PER_UNIT,
2067 -1, sz, sz, sz))
2069 snprintf (buf, sizeof buf, "__asan_stack_free_%d",
2070 use_after_return_class);
2071 ret = init_one_libfunc (buf);
2072 rtx addr = convert_memory_address (ptr_mode, base);
2073 rtx orig_addr = convert_memory_address (ptr_mode, orig_base);
2074 emit_library_call (ret, LCT_NORMAL, ptr_mode, addr, ptr_mode,
2075 GEN_INT (asan_frame_size + base_align_bias),
2076 TYPE_MODE (pointer_sized_int_node),
2077 orig_addr, ptr_mode);
2079 lab = gen_label_rtx ();
2080 emit_jump (lab);
2081 emit_label (lab2);
2084 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
2085 set_mem_alias_set (shadow_mem, asan_shadow_set);
2087 if (STRICT_ALIGNMENT)
2088 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
2090 prev_offset = base_offset;
2091 last_offset = base_offset;
2092 last_size = 0;
2093 last_size_aligned = 0;
2094 for (l = length; l; l -= 2)
2096 offset = base_offset + ((offsets[l - 1] - base_offset)
2097 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
2098 if (last_offset + last_size_aligned < offset)
2100 shadow_mem = adjust_address (shadow_mem, VOIDmode,
2101 (last_offset - prev_offset)
2102 >> ASAN_SHADOW_SHIFT);
2103 prev_offset = last_offset;
2104 asan_clear_shadow (shadow_mem, last_size_aligned >> ASAN_SHADOW_SHIFT);
2105 last_offset = offset;
2106 last_size = 0;
2108 else
2109 last_size = offset - last_offset;
2110 last_size += base_offset + ((offsets[l - 2] - base_offset)
2111 & ~(ASAN_MIN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
2112 - offset;
2114 /* Unpoison shadow memory that corresponds to a variable that is
2115 is subject of use-after-return sanitization. */
2116 if (l > 2)
2118 decl = decls[l / 2 - 2];
2119 if (asan_handled_variables != NULL
2120 && asan_handled_variables->contains (decl))
2122 HOST_WIDE_INT size = offsets[l - 3] - offsets[l - 2];
2123 if (dump_file && (dump_flags & TDF_DETAILS))
2125 const char *n = (DECL_NAME (decl)
2126 ? IDENTIFIER_POINTER (DECL_NAME (decl))
2127 : "<unknown>");
2128 fprintf (dump_file, "Unpoisoning shadow stack for variable: "
2129 "%s (%" PRId64 " B)\n", n, size);
2132 last_size += size & ~(ASAN_MIN_RED_ZONE_SIZE - HOST_WIDE_INT_1);
2135 last_size_aligned
2136 = ((last_size + (ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
2137 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
2139 if (last_size_aligned)
2141 shadow_mem = adjust_address (shadow_mem, VOIDmode,
2142 (last_offset - prev_offset)
2143 >> ASAN_SHADOW_SHIFT);
2144 asan_clear_shadow (shadow_mem, last_size_aligned >> ASAN_SHADOW_SHIFT);
2147 /* Clean-up set with instrumented stack variables. */
2148 delete asan_handled_variables;
2149 asan_handled_variables = NULL;
2150 delete asan_used_labels;
2151 asan_used_labels = NULL;
2153 do_pending_stack_adjust ();
2154 if (lab)
2155 emit_label (lab);
2157 insns = get_insns ();
2158 end_sequence ();
2159 return insns;
2162 /* Emit __asan_allocas_unpoison (top, bot) call. The BASE parameter corresponds
2163 to BOT argument, for TOP virtual_stack_dynamic_rtx is used. NEW_SEQUENCE
2164 indicates whether we're emitting new instructions sequence or not. */
2166 rtx_insn *
2167 asan_emit_allocas_unpoison (rtx top, rtx bot, rtx_insn *before)
2169 if (before)
2170 push_to_sequence (before);
2171 else
2172 start_sequence ();
2173 rtx ret = init_one_libfunc ("__asan_allocas_unpoison");
2174 top = convert_memory_address (ptr_mode, top);
2175 bot = convert_memory_address (ptr_mode, bot);
2176 emit_library_call (ret, LCT_NORMAL, ptr_mode,
2177 top, ptr_mode, bot, ptr_mode);
2179 do_pending_stack_adjust ();
2180 rtx_insn *insns = get_insns ();
2181 end_sequence ();
2182 return insns;
2185 /* Return true if DECL, a global var, might be overridden and needs
2186 therefore a local alias. */
2188 static bool
2189 asan_needs_local_alias (tree decl)
2191 return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
2194 /* Return true if DECL, a global var, is an artificial ODR indicator symbol
2195 therefore doesn't need protection. */
2197 static bool
2198 is_odr_indicator (tree decl)
2200 return (DECL_ARTIFICIAL (decl)
2201 && lookup_attribute ("asan odr indicator", DECL_ATTRIBUTES (decl)));
2204 /* Return true if DECL is a VAR_DECL that should be protected
2205 by Address Sanitizer, by appending a red zone with protected
2206 shadow memory after it and aligning it to at least
2207 ASAN_RED_ZONE_SIZE bytes. */
2209 bool
2210 asan_protect_global (tree decl, bool ignore_decl_rtl_set_p)
2212 if (!param_asan_globals)
2213 return false;
2215 rtx rtl, symbol;
2217 if (TREE_CODE (decl) == STRING_CST)
2219 /* Instrument all STRING_CSTs except those created
2220 by asan_pp_string here. */
2221 if (shadow_ptr_types[0] != NULL_TREE
2222 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
2223 && TREE_TYPE (TREE_TYPE (decl)) == TREE_TYPE (shadow_ptr_types[0]))
2224 return false;
2225 return true;
2227 if (!VAR_P (decl)
2228 /* TLS vars aren't statically protectable. */
2229 || DECL_THREAD_LOCAL_P (decl)
2230 /* Externs will be protected elsewhere. */
2231 || DECL_EXTERNAL (decl)
2232 /* PR sanitizer/81697: For architectures that use section anchors first
2233 call to asan_protect_global may occur before DECL_RTL (decl) is set.
2234 We should ignore DECL_RTL_SET_P then, because otherwise the first call
2235 to asan_protect_global will return FALSE and the following calls on the
2236 same decl after setting DECL_RTL (decl) will return TRUE and we'll end
2237 up with inconsistency at runtime. */
2238 || (!DECL_RTL_SET_P (decl) && !ignore_decl_rtl_set_p)
2239 /* Comdat vars pose an ABI problem, we can't know if
2240 the var that is selected by the linker will have
2241 padding or not. */
2242 || DECL_ONE_ONLY (decl)
2243 /* Similarly for common vars. People can use -fno-common.
2244 Note: Linux kernel is built with -fno-common, so we do instrument
2245 globals there even if it is C. */
2246 || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
2247 /* Don't protect if using user section, often vars placed
2248 into user section from multiple TUs are then assumed
2249 to be an array of such vars, putting padding in there
2250 breaks this assumption. */
2251 || (DECL_SECTION_NAME (decl) != NULL
2252 && !symtab_node::get (decl)->implicit_section
2253 && !section_sanitized_p (DECL_SECTION_NAME (decl)))
2254 || DECL_SIZE (decl) == 0
2255 || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
2256 || TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
2257 || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
2258 || DECL_ALIGN_UNIT (decl) > 2 * ASAN_RED_ZONE_SIZE
2259 || TREE_TYPE (decl) == ubsan_get_source_location_type ()
2260 || is_odr_indicator (decl))
2261 return false;
2263 if (!ignore_decl_rtl_set_p || DECL_RTL_SET_P (decl))
2266 rtl = DECL_RTL (decl);
2267 if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF)
2268 return false;
2269 symbol = XEXP (rtl, 0);
2271 if (CONSTANT_POOL_ADDRESS_P (symbol)
2272 || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
2273 return false;
2276 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
2277 return false;
2279 if (!TARGET_SUPPORTS_ALIASES && asan_needs_local_alias (decl))
2280 return false;
2282 return true;
2285 /* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16,_n}.
2286 IS_STORE is either 1 (for a store) or 0 (for a load). */
2288 static tree
2289 report_error_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2290 int *nargs)
2292 gcc_assert (!hwasan_sanitize_p ());
2294 static enum built_in_function report[2][2][6]
2295 = { { { BUILT_IN_ASAN_REPORT_LOAD1, BUILT_IN_ASAN_REPORT_LOAD2,
2296 BUILT_IN_ASAN_REPORT_LOAD4, BUILT_IN_ASAN_REPORT_LOAD8,
2297 BUILT_IN_ASAN_REPORT_LOAD16, BUILT_IN_ASAN_REPORT_LOAD_N },
2298 { BUILT_IN_ASAN_REPORT_STORE1, BUILT_IN_ASAN_REPORT_STORE2,
2299 BUILT_IN_ASAN_REPORT_STORE4, BUILT_IN_ASAN_REPORT_STORE8,
2300 BUILT_IN_ASAN_REPORT_STORE16, BUILT_IN_ASAN_REPORT_STORE_N } },
2301 { { BUILT_IN_ASAN_REPORT_LOAD1_NOABORT,
2302 BUILT_IN_ASAN_REPORT_LOAD2_NOABORT,
2303 BUILT_IN_ASAN_REPORT_LOAD4_NOABORT,
2304 BUILT_IN_ASAN_REPORT_LOAD8_NOABORT,
2305 BUILT_IN_ASAN_REPORT_LOAD16_NOABORT,
2306 BUILT_IN_ASAN_REPORT_LOAD_N_NOABORT },
2307 { BUILT_IN_ASAN_REPORT_STORE1_NOABORT,
2308 BUILT_IN_ASAN_REPORT_STORE2_NOABORT,
2309 BUILT_IN_ASAN_REPORT_STORE4_NOABORT,
2310 BUILT_IN_ASAN_REPORT_STORE8_NOABORT,
2311 BUILT_IN_ASAN_REPORT_STORE16_NOABORT,
2312 BUILT_IN_ASAN_REPORT_STORE_N_NOABORT } } };
2313 if (size_in_bytes == -1)
2315 *nargs = 2;
2316 return builtin_decl_implicit (report[recover_p][is_store][5]);
2318 *nargs = 1;
2319 int size_log2 = exact_log2 (size_in_bytes);
2320 return builtin_decl_implicit (report[recover_p][is_store][size_log2]);
2323 /* Construct a function tree for __asan_{load,store}{1,2,4,8,16,_n}.
2324 IS_STORE is either 1 (for a store) or 0 (for a load). */
2326 static tree
2327 check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2328 int *nargs)
2330 static enum built_in_function check[2][2][6]
2331 = { { { BUILT_IN_ASAN_LOAD1, BUILT_IN_ASAN_LOAD2,
2332 BUILT_IN_ASAN_LOAD4, BUILT_IN_ASAN_LOAD8,
2333 BUILT_IN_ASAN_LOAD16, BUILT_IN_ASAN_LOADN },
2334 { BUILT_IN_ASAN_STORE1, BUILT_IN_ASAN_STORE2,
2335 BUILT_IN_ASAN_STORE4, BUILT_IN_ASAN_STORE8,
2336 BUILT_IN_ASAN_STORE16, BUILT_IN_ASAN_STOREN } },
2337 { { BUILT_IN_ASAN_LOAD1_NOABORT,
2338 BUILT_IN_ASAN_LOAD2_NOABORT,
2339 BUILT_IN_ASAN_LOAD4_NOABORT,
2340 BUILT_IN_ASAN_LOAD8_NOABORT,
2341 BUILT_IN_ASAN_LOAD16_NOABORT,
2342 BUILT_IN_ASAN_LOADN_NOABORT },
2343 { BUILT_IN_ASAN_STORE1_NOABORT,
2344 BUILT_IN_ASAN_STORE2_NOABORT,
2345 BUILT_IN_ASAN_STORE4_NOABORT,
2346 BUILT_IN_ASAN_STORE8_NOABORT,
2347 BUILT_IN_ASAN_STORE16_NOABORT,
2348 BUILT_IN_ASAN_STOREN_NOABORT } } };
2349 if (size_in_bytes == -1)
2351 *nargs = 2;
2352 return builtin_decl_implicit (check[recover_p][is_store][5]);
2354 *nargs = 1;
2355 int size_log2 = exact_log2 (size_in_bytes);
2356 return builtin_decl_implicit (check[recover_p][is_store][size_log2]);
2359 /* Split the current basic block and create a condition statement
2360 insertion point right before or after the statement pointed to by
2361 ITER. Return an iterator to the point at which the caller might
2362 safely insert the condition statement.
2364 THEN_BLOCK must be set to the address of an uninitialized instance
2365 of basic_block. The function will then set *THEN_BLOCK to the
2366 'then block' of the condition statement to be inserted by the
2367 caller.
2369 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
2370 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
2372 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
2373 block' of the condition statement to be inserted by the caller.
2375 Note that *FALLTHROUGH_BLOCK is a new block that contains the
2376 statements starting from *ITER, and *THEN_BLOCK is a new empty
2377 block.
2379 *ITER is adjusted to point to always point to the first statement
2380 of the basic block * FALLTHROUGH_BLOCK. That statement is the
2381 same as what ITER was pointing to prior to calling this function,
2382 if BEFORE_P is true; otherwise, it is its following statement. */
2384 gimple_stmt_iterator
2385 create_cond_insert_point (gimple_stmt_iterator *iter,
2386 bool before_p,
2387 bool then_more_likely_p,
2388 bool create_then_fallthru_edge,
2389 basic_block *then_block,
2390 basic_block *fallthrough_block)
2392 gimple_stmt_iterator gsi = *iter;
2394 if (!gsi_end_p (gsi) && before_p)
2395 gsi_prev (&gsi);
2397 basic_block cur_bb = gsi_bb (*iter);
2399 edge e = split_block (cur_bb, gsi_stmt (gsi));
2401 /* Get a hold on the 'condition block', the 'then block' and the
2402 'else block'. */
2403 basic_block cond_bb = e->src;
2404 basic_block fallthru_bb = e->dest;
2405 basic_block then_bb = create_empty_bb (cond_bb);
2406 if (current_loops)
2408 add_bb_to_loop (then_bb, cond_bb->loop_father);
2409 loops_state_set (LOOPS_NEED_FIXUP);
2412 /* Set up the newly created 'then block'. */
2413 e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
2414 profile_probability fallthrough_probability
2415 = then_more_likely_p
2416 ? profile_probability::very_unlikely ()
2417 : profile_probability::very_likely ();
2418 e->probability = fallthrough_probability.invert ();
2419 then_bb->count = e->count ();
2420 if (create_then_fallthru_edge)
2421 make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU);
2423 /* Set up the fallthrough basic block. */
2424 e = find_edge (cond_bb, fallthru_bb);
2425 e->flags = EDGE_FALSE_VALUE;
2426 e->probability = fallthrough_probability;
2428 /* Update dominance info for the newly created then_bb; note that
2429 fallthru_bb's dominance info has already been updated by
2430 split_bock. */
2431 if (dom_info_available_p (CDI_DOMINATORS))
2432 set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
2434 *then_block = then_bb;
2435 *fallthrough_block = fallthru_bb;
2436 *iter = gsi_start_bb (fallthru_bb);
2438 return gsi_last_bb (cond_bb);
2441 /* Insert an if condition followed by a 'then block' right before the
2442 statement pointed to by ITER. The fallthrough block -- which is the
2443 else block of the condition as well as the destination of the
2444 outcoming edge of the 'then block' -- starts with the statement
2445 pointed to by ITER.
2447 COND is the condition of the if.
2449 If THEN_MORE_LIKELY_P is true, the probability of the edge to the
2450 'then block' is higher than the probability of the edge to the
2451 fallthrough block.
2453 Upon completion of the function, *THEN_BB is set to the newly
2454 inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
2455 fallthrough block.
2457 *ITER is adjusted to still point to the same statement it was
2458 pointing to initially. */
2460 static void
2461 insert_if_then_before_iter (gcond *cond,
2462 gimple_stmt_iterator *iter,
2463 bool then_more_likely_p,
2464 basic_block *then_bb,
2465 basic_block *fallthrough_bb)
2467 gimple_stmt_iterator cond_insert_point =
2468 create_cond_insert_point (iter,
2469 /*before_p=*/true,
2470 then_more_likely_p,
2471 /*create_then_fallthru_edge=*/true,
2472 then_bb,
2473 fallthrough_bb);
2474 gsi_insert_after (&cond_insert_point, cond, GSI_NEW_STMT);
2477 /* Build (base_addr >> ASAN_SHADOW_SHIFT) + asan_shadow_offset ().
2478 If RETURN_ADDRESS is set to true, return memory location instread
2479 of a value in the shadow memory. */
2481 static tree
2482 build_shadow_mem_access (gimple_stmt_iterator *gsi, location_t location,
2483 tree base_addr, tree shadow_ptr_type,
2484 bool return_address = false)
2486 tree t, uintptr_type = TREE_TYPE (base_addr);
2487 tree shadow_type = TREE_TYPE (shadow_ptr_type);
2488 gimple *g;
2490 t = build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT);
2491 g = gimple_build_assign (make_ssa_name (uintptr_type), RSHIFT_EXPR,
2492 base_addr, t);
2493 gimple_set_location (g, location);
2494 gsi_insert_after (gsi, g, GSI_NEW_STMT);
2496 t = build_int_cst (uintptr_type, asan_shadow_offset ());
2497 g = gimple_build_assign (make_ssa_name (uintptr_type), PLUS_EXPR,
2498 gimple_assign_lhs (g), t);
2499 gimple_set_location (g, location);
2500 gsi_insert_after (gsi, g, GSI_NEW_STMT);
2502 g = gimple_build_assign (make_ssa_name (shadow_ptr_type), NOP_EXPR,
2503 gimple_assign_lhs (g));
2504 gimple_set_location (g, location);
2505 gsi_insert_after (gsi, g, GSI_NEW_STMT);
2507 if (!return_address)
2509 t = build2 (MEM_REF, shadow_type, gimple_assign_lhs (g),
2510 build_int_cst (shadow_ptr_type, 0));
2511 g = gimple_build_assign (make_ssa_name (shadow_type), MEM_REF, t);
2512 gimple_set_location (g, location);
2513 gsi_insert_after (gsi, g, GSI_NEW_STMT);
2516 return gimple_assign_lhs (g);
2519 /* BASE can already be an SSA_NAME; in that case, do not create a
2520 new SSA_NAME for it. */
2522 static tree
2523 maybe_create_ssa_name (location_t loc, tree base, gimple_stmt_iterator *iter,
2524 bool before_p)
2526 STRIP_USELESS_TYPE_CONVERSION (base);
2527 if (TREE_CODE (base) == SSA_NAME)
2528 return base;
2529 gimple *g = gimple_build_assign (make_ssa_name (TREE_TYPE (base)), base);
2530 gimple_set_location (g, loc);
2531 if (before_p)
2532 gsi_insert_before (iter, g, GSI_SAME_STMT);
2533 else
2534 gsi_insert_after (iter, g, GSI_NEW_STMT);
2535 return gimple_assign_lhs (g);
2538 /* LEN can already have necessary size and precision;
2539 in that case, do not create a new variable. */
2541 tree
2542 maybe_cast_to_ptrmode (location_t loc, tree len, gimple_stmt_iterator *iter,
2543 bool before_p)
2545 if (ptrofftype_p (len))
2546 return len;
2547 gimple *g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
2548 NOP_EXPR, len);
2549 gimple_set_location (g, loc);
2550 if (before_p)
2551 gsi_insert_before (iter, g, GSI_SAME_STMT);
2552 else
2553 gsi_insert_after (iter, g, GSI_NEW_STMT);
2554 return gimple_assign_lhs (g);
2557 /* Instrument the memory access instruction BASE. Insert new
2558 statements before or after ITER.
2560 Note that the memory access represented by BASE can be either an
2561 SSA_NAME, or a non-SSA expression. LOCATION is the source code
2562 location. IS_STORE is TRUE for a store, FALSE for a load.
2563 BEFORE_P is TRUE for inserting the instrumentation code before
2564 ITER, FALSE for inserting it after ITER. IS_SCALAR_ACCESS is TRUE
2565 for a scalar memory access and FALSE for memory region access.
2566 NON_ZERO_P is TRUE if memory region is guaranteed to have non-zero
2567 length. ALIGN tells alignment of accessed memory object.
2569 START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
2570 memory region have already been instrumented.
2572 If BEFORE_P is TRUE, *ITER is arranged to still point to the
2573 statement it was pointing to prior to calling this function,
2574 otherwise, it points to the statement logically following it. */
2576 static void
2577 build_check_stmt (location_t loc, tree base, tree len,
2578 HOST_WIDE_INT size_in_bytes, gimple_stmt_iterator *iter,
2579 bool is_non_zero_len, bool before_p, bool is_store,
2580 bool is_scalar_access, unsigned int align = 0)
2582 gimple_stmt_iterator gsi = *iter;
2583 gimple *g;
2585 gcc_assert (!(size_in_bytes > 0 && !is_non_zero_len));
2586 gcc_assert (size_in_bytes == -1 || size_in_bytes >= 1);
2588 gsi = *iter;
2590 base = unshare_expr (base);
2591 base = maybe_create_ssa_name (loc, base, &gsi, before_p);
2593 if (len)
2595 len = unshare_expr (len);
2596 len = maybe_cast_to_ptrmode (loc, len, iter, before_p);
2598 else
2600 gcc_assert (size_in_bytes != -1);
2601 len = build_int_cst (pointer_sized_int_node, size_in_bytes);
2604 if (size_in_bytes > 1)
2606 if ((size_in_bytes & (size_in_bytes - 1)) != 0
2607 || size_in_bytes > 16)
2608 is_scalar_access = false;
2609 else if (align && align < size_in_bytes * BITS_PER_UNIT)
2611 /* On non-strict alignment targets, if
2612 16-byte access is just 8-byte aligned,
2613 this will result in misaligned shadow
2614 memory 2 byte load, but otherwise can
2615 be handled using one read. */
2616 if (size_in_bytes != 16
2617 || STRICT_ALIGNMENT
2618 || align < 8 * BITS_PER_UNIT)
2619 is_scalar_access = false;
2623 HOST_WIDE_INT flags = 0;
2624 if (is_store)
2625 flags |= ASAN_CHECK_STORE;
2626 if (is_non_zero_len)
2627 flags |= ASAN_CHECK_NON_ZERO_LEN;
2628 if (is_scalar_access)
2629 flags |= ASAN_CHECK_SCALAR_ACCESS;
2631 enum internal_fn fn = hwasan_sanitize_p ()
2632 ? IFN_HWASAN_CHECK
2633 : IFN_ASAN_CHECK;
2635 g = gimple_build_call_internal (fn, 4,
2636 build_int_cst (integer_type_node, flags),
2637 base, len,
2638 build_int_cst (integer_type_node,
2639 align / BITS_PER_UNIT));
2640 gimple_set_location (g, loc);
2641 if (before_p)
2642 gsi_insert_before (&gsi, g, GSI_SAME_STMT);
2643 else
2645 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2646 gsi_next (&gsi);
2647 *iter = gsi;
2651 /* If T represents a memory access, add instrumentation code before ITER.
2652 LOCATION is source code location.
2653 IS_STORE is either TRUE (for a store) or FALSE (for a load). */
2655 static void
2656 instrument_derefs (gimple_stmt_iterator *iter, tree t,
2657 location_t location, bool is_store)
2659 if (is_store && !(asan_instrument_writes () || hwasan_instrument_writes ()))
2660 return;
2661 if (!is_store && !(asan_instrument_reads () || hwasan_instrument_reads ()))
2662 return;
2664 tree type, base;
2665 HOST_WIDE_INT size_in_bytes;
2666 if (location == UNKNOWN_LOCATION)
2667 location = EXPR_LOCATION (t);
2669 type = TREE_TYPE (t);
2670 switch (TREE_CODE (t))
2672 case ARRAY_REF:
2673 case COMPONENT_REF:
2674 case INDIRECT_REF:
2675 case MEM_REF:
2676 case VAR_DECL:
2677 case BIT_FIELD_REF:
2678 break;
2679 /* FALLTHRU */
2680 default:
2681 return;
2684 size_in_bytes = int_size_in_bytes (type);
2685 if (size_in_bytes <= 0)
2686 return;
2688 poly_int64 bitsize, bitpos;
2689 tree offset;
2690 machine_mode mode;
2691 int unsignedp, reversep, volatilep = 0;
2692 tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset, &mode,
2693 &unsignedp, &reversep, &volatilep);
2695 if (TREE_CODE (t) == COMPONENT_REF
2696 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
2698 tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
2699 instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
2700 TREE_OPERAND (t, 0), repr,
2701 TREE_OPERAND (t, 2)),
2702 location, is_store);
2703 return;
2706 if (!multiple_p (bitpos, BITS_PER_UNIT)
2707 || maybe_ne (bitsize, size_in_bytes * BITS_PER_UNIT))
2708 return;
2710 if (VAR_P (inner) && DECL_HARD_REGISTER (inner))
2711 return;
2713 poly_int64 decl_size;
2714 if ((VAR_P (inner) || TREE_CODE (inner) == RESULT_DECL)
2715 && offset == NULL_TREE
2716 && DECL_SIZE (inner)
2717 && poly_int_tree_p (DECL_SIZE (inner), &decl_size)
2718 && known_subrange_p (bitpos, bitsize, 0, decl_size))
2720 if (VAR_P (inner) && DECL_THREAD_LOCAL_P (inner))
2721 return;
2722 /* If we're not sanitizing globals and we can tell statically that this
2723 access is inside a global variable, then there's no point adding
2724 instrumentation to check the access. N.b. hwasan currently never
2725 sanitizes globals. */
2726 if ((hwasan_sanitize_p () || !param_asan_globals)
2727 && is_global_var (inner))
2728 return;
2729 if (!TREE_STATIC (inner))
2731 /* Automatic vars in the current function will be always
2732 accessible. */
2733 if (decl_function_context (inner) == current_function_decl
2734 && (!asan_sanitize_use_after_scope ()
2735 || !TREE_ADDRESSABLE (inner)))
2736 return;
2738 /* Always instrument external vars, they might be dynamically
2739 initialized. */
2740 else if (!DECL_EXTERNAL (inner))
2742 /* For static vars if they are known not to be dynamically
2743 initialized, they will be always accessible. */
2744 varpool_node *vnode = varpool_node::get (inner);
2745 if (vnode && !vnode->dynamically_initialized)
2746 return;
2750 if (DECL_P (inner)
2751 && decl_function_context (inner) == current_function_decl
2752 && !TREE_ADDRESSABLE (inner))
2753 mark_addressable (inner);
2755 base = build_fold_addr_expr (t);
2756 if (!has_mem_ref_been_instrumented (base, size_in_bytes))
2758 unsigned int align = get_object_alignment (t);
2759 build_check_stmt (location, base, NULL_TREE, size_in_bytes, iter,
2760 /*is_non_zero_len*/size_in_bytes > 0, /*before_p=*/true,
2761 is_store, /*is_scalar_access*/true, align);
2762 update_mem_ref_hash_table (base, size_in_bytes);
2763 update_mem_ref_hash_table (t, size_in_bytes);
2768 /* Insert a memory reference into the hash table if access length
2769 can be determined in compile time. */
2771 static void
2772 maybe_update_mem_ref_hash_table (tree base, tree len)
2774 if (!POINTER_TYPE_P (TREE_TYPE (base))
2775 || !INTEGRAL_TYPE_P (TREE_TYPE (len)))
2776 return;
2778 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2780 if (size_in_bytes != -1)
2781 update_mem_ref_hash_table (base, size_in_bytes);
2784 /* Instrument an access to a contiguous memory region that starts at
2785 the address pointed to by BASE, over a length of LEN (expressed in
2786 the sizeof (*BASE) bytes). ITER points to the instruction before
2787 which the instrumentation instructions must be inserted. LOCATION
2788 is the source location that the instrumentation instructions must
2789 have. If IS_STORE is true, then the memory access is a store;
2790 otherwise, it's a load. */
2792 static void
2793 instrument_mem_region_access (tree base, tree len,
2794 gimple_stmt_iterator *iter,
2795 location_t location, bool is_store)
2797 if (!POINTER_TYPE_P (TREE_TYPE (base))
2798 || !INTEGRAL_TYPE_P (TREE_TYPE (len))
2799 || integer_zerop (len))
2800 return;
2802 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2804 if ((size_in_bytes == -1)
2805 || !has_mem_ref_been_instrumented (base, size_in_bytes))
2807 build_check_stmt (location, base, len, size_in_bytes, iter,
2808 /*is_non_zero_len*/size_in_bytes > 0, /*before_p*/true,
2809 is_store, /*is_scalar_access*/false, /*align*/0);
2812 maybe_update_mem_ref_hash_table (base, len);
2813 *iter = gsi_for_stmt (gsi_stmt (*iter));
2816 /* Instrument the call to a built-in memory access function that is
2817 pointed to by the iterator ITER.
2819 Upon completion, return TRUE iff *ITER has been advanced to the
2820 statement following the one it was originally pointing to. */
2822 static bool
2823 instrument_builtin_call (gimple_stmt_iterator *iter)
2825 if (!(asan_memintrin () || hwasan_memintrin ()))
2826 return false;
2828 bool iter_advanced_p = false;
2829 gcall *call = as_a <gcall *> (gsi_stmt (*iter));
2831 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
2833 location_t loc = gimple_location (call);
2835 asan_mem_ref src0, src1, dest;
2836 asan_mem_ref_init (&src0, NULL, 1);
2837 asan_mem_ref_init (&src1, NULL, 1);
2838 asan_mem_ref_init (&dest, NULL, 1);
2840 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
2841 bool src0_is_store = false, src1_is_store = false, dest_is_store = false,
2842 dest_is_deref = false, intercepted_p = true;
2844 if (get_mem_refs_of_builtin_call (call,
2845 &src0, &src0_len, &src0_is_store,
2846 &src1, &src1_len, &src1_is_store,
2847 &dest, &dest_len, &dest_is_store,
2848 &dest_is_deref, &intercepted_p, iter))
2850 if (dest_is_deref)
2852 instrument_derefs (iter, dest.start, loc, dest_is_store);
2853 gsi_next (iter);
2854 iter_advanced_p = true;
2856 else if (!intercepted_p
2857 && (src0_len || src1_len || dest_len))
2859 if (src0.start != NULL_TREE)
2860 instrument_mem_region_access (src0.start, src0_len,
2861 iter, loc, /*is_store=*/false);
2862 if (src1.start != NULL_TREE)
2863 instrument_mem_region_access (src1.start, src1_len,
2864 iter, loc, /*is_store=*/false);
2865 if (dest.start != NULL_TREE)
2866 instrument_mem_region_access (dest.start, dest_len,
2867 iter, loc, /*is_store=*/true);
2869 *iter = gsi_for_stmt (call);
2870 gsi_next (iter);
2871 iter_advanced_p = true;
2873 else
2875 if (src0.start != NULL_TREE)
2876 maybe_update_mem_ref_hash_table (src0.start, src0_len);
2877 if (src1.start != NULL_TREE)
2878 maybe_update_mem_ref_hash_table (src1.start, src1_len);
2879 if (dest.start != NULL_TREE)
2880 maybe_update_mem_ref_hash_table (dest.start, dest_len);
2883 return iter_advanced_p;
2886 /* Instrument the assignment statement ITER if it is subject to
2887 instrumentation. Return TRUE iff instrumentation actually
2888 happened. In that case, the iterator ITER is advanced to the next
2889 logical expression following the one initially pointed to by ITER,
2890 and the relevant memory reference that which access has been
2891 instrumented is added to the memory references hash table. */
2893 static bool
2894 maybe_instrument_assignment (gimple_stmt_iterator *iter)
2896 gimple *s = gsi_stmt (*iter);
2898 gcc_assert (gimple_assign_single_p (s));
2900 tree ref_expr = NULL_TREE;
2901 bool is_store, is_instrumented = false;
2903 if (gimple_store_p (s))
2905 ref_expr = gimple_assign_lhs (s);
2906 is_store = true;
2907 instrument_derefs (iter, ref_expr,
2908 gimple_location (s),
2909 is_store);
2910 is_instrumented = true;
2913 if (gimple_assign_load_p (s))
2915 ref_expr = gimple_assign_rhs1 (s);
2916 is_store = false;
2917 instrument_derefs (iter, ref_expr,
2918 gimple_location (s),
2919 is_store);
2920 is_instrumented = true;
2923 if (is_instrumented)
2924 gsi_next (iter);
2926 return is_instrumented;
2929 /* Instrument the function call pointed to by the iterator ITER, if it
2930 is subject to instrumentation. At the moment, the only function
2931 calls that are instrumented are some built-in functions that access
2932 memory. Look at instrument_builtin_call to learn more.
2934 Upon completion return TRUE iff *ITER was advanced to the statement
2935 following the one it was originally pointing to. */
2937 static bool
2938 maybe_instrument_call (gimple_stmt_iterator *iter)
2940 gimple *stmt = gsi_stmt (*iter);
2941 bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
2943 if (is_builtin && instrument_builtin_call (iter))
2944 return true;
2946 if (gimple_call_noreturn_p (stmt))
2948 if (is_builtin)
2950 tree callee = gimple_call_fndecl (stmt);
2951 switch (DECL_FUNCTION_CODE (callee))
2953 case BUILT_IN_UNREACHABLE:
2954 case BUILT_IN_TRAP:
2955 /* Don't instrument these. */
2956 return false;
2957 default:
2958 break;
2961 /* If a function does not return, then we must handle clearing up the
2962 shadow stack accordingly. For ASAN we can simply set the entire stack
2963 to "valid" for accesses by setting the shadow space to 0 and all
2964 accesses will pass checks. That means that some bad accesses may be
2965 missed, but we will not report any false positives.
2967 This is not possible for HWASAN. Since there is no "always valid" tag
2968 we can not set any space to "always valid". If we were to clear the
2969 entire shadow stack then code resuming from `longjmp` or a caught
2970 exception would trigger false positives when correctly accessing
2971 variables on the stack. Hence we need to handle things like
2972 `longjmp`, thread exit, and exceptions in a different way. These
2973 problems must be handled externally to the compiler, e.g. in the
2974 language runtime. */
2975 if (! hwasan_sanitize_p ())
2977 tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN);
2978 gimple *g = gimple_build_call (decl, 0);
2979 gimple_set_location (g, gimple_location (stmt));
2980 gsi_insert_before (iter, g, GSI_SAME_STMT);
2984 bool instrumented = false;
2985 if (gimple_store_p (stmt))
2987 tree ref_expr = gimple_call_lhs (stmt);
2988 instrument_derefs (iter, ref_expr,
2989 gimple_location (stmt),
2990 /*is_store=*/true);
2992 instrumented = true;
2995 /* Walk through gimple_call arguments and check them id needed. */
2996 unsigned args_num = gimple_call_num_args (stmt);
2997 for (unsigned i = 0; i < args_num; ++i)
2999 tree arg = gimple_call_arg (stmt, i);
3000 /* If ARG is not a non-aggregate register variable, compiler in general
3001 creates temporary for it and pass it as argument to gimple call.
3002 But in some cases, e.g. when we pass by value a small structure that
3003 fits to register, compiler can avoid extra overhead by pulling out
3004 these temporaries. In this case, we should check the argument. */
3005 if (!is_gimple_reg (arg) && !is_gimple_min_invariant (arg))
3007 instrument_derefs (iter, arg,
3008 gimple_location (stmt),
3009 /*is_store=*/false);
3010 instrumented = true;
3013 if (instrumented)
3014 gsi_next (iter);
3015 return instrumented;
3018 /* Walk each instruction of all basic block and instrument those that
3019 represent memory references: loads, stores, or function calls.
3020 In a given basic block, this function avoids instrumenting memory
3021 references that have already been instrumented. */
3023 static void
3024 transform_statements (void)
3026 basic_block bb, last_bb = NULL;
3027 gimple_stmt_iterator i;
3028 int saved_last_basic_block = last_basic_block_for_fn (cfun);
3030 FOR_EACH_BB_FN (bb, cfun)
3032 basic_block prev_bb = bb;
3034 if (bb->index >= saved_last_basic_block) continue;
3036 /* Flush the mem ref hash table, if current bb doesn't have
3037 exactly one predecessor, or if that predecessor (skipping
3038 over asan created basic blocks) isn't the last processed
3039 basic block. Thus we effectively flush on extended basic
3040 block boundaries. */
3041 while (single_pred_p (prev_bb))
3043 prev_bb = single_pred (prev_bb);
3044 if (prev_bb->index < saved_last_basic_block)
3045 break;
3047 if (prev_bb != last_bb)
3048 empty_mem_ref_hash_table ();
3049 last_bb = bb;
3051 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
3053 gimple *s = gsi_stmt (i);
3055 if (has_stmt_been_instrumented_p (s))
3056 gsi_next (&i);
3057 else if (gimple_assign_single_p (s)
3058 && !gimple_clobber_p (s)
3059 && maybe_instrument_assignment (&i))
3060 /* Nothing to do as maybe_instrument_assignment advanced
3061 the iterator I. */;
3062 else if (is_gimple_call (s) && maybe_instrument_call (&i))
3063 /* Nothing to do as maybe_instrument_call
3064 advanced the iterator I. */;
3065 else
3067 /* No instrumentation happened.
3069 If the current instruction is a function call that
3070 might free something, let's forget about the memory
3071 references that got instrumented. Otherwise we might
3072 miss some instrumentation opportunities. Do the same
3073 for a ASAN_MARK poisoning internal function. */
3074 if (is_gimple_call (s)
3075 && (!nonfreeing_call_p (s)
3076 || asan_mark_p (s, ASAN_MARK_POISON)))
3077 empty_mem_ref_hash_table ();
3079 gsi_next (&i);
3083 free_mem_ref_resources ();
3086 /* Build
3087 __asan_before_dynamic_init (module_name)
3089 __asan_after_dynamic_init ()
3090 call. */
3092 tree
3093 asan_dynamic_init_call (bool after_p)
3095 if (shadow_ptr_types[0] == NULL_TREE)
3096 asan_init_shadow_ptr_types ();
3098 tree fn = builtin_decl_implicit (after_p
3099 ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
3100 : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT);
3101 tree module_name_cst = NULL_TREE;
3102 if (!after_p)
3104 pretty_printer module_name_pp;
3105 pp_string (&module_name_pp, main_input_filename);
3107 module_name_cst = asan_pp_string (&module_name_pp);
3108 module_name_cst = fold_convert (const_ptr_type_node,
3109 module_name_cst);
3112 return build_call_expr (fn, after_p ? 0 : 1, module_name_cst);
3115 /* Build
3116 struct __asan_global
3118 const void *__beg;
3119 uptr __size;
3120 uptr __size_with_redzone;
3121 const void *__name;
3122 const void *__module_name;
3123 uptr __has_dynamic_init;
3124 __asan_global_source_location *__location;
3125 char *__odr_indicator;
3126 } type. */
3128 static tree
3129 asan_global_struct (void)
3131 static const char *field_names[]
3132 = { "__beg", "__size", "__size_with_redzone",
3133 "__name", "__module_name", "__has_dynamic_init", "__location",
3134 "__odr_indicator" };
3135 tree fields[ARRAY_SIZE (field_names)], ret;
3136 unsigned i;
3138 ret = make_node (RECORD_TYPE);
3139 for (i = 0; i < ARRAY_SIZE (field_names); i++)
3141 fields[i]
3142 = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
3143 get_identifier (field_names[i]),
3144 (i == 0 || i == 3) ? const_ptr_type_node
3145 : pointer_sized_int_node);
3146 DECL_CONTEXT (fields[i]) = ret;
3147 if (i)
3148 DECL_CHAIN (fields[i - 1]) = fields[i];
3150 tree type_decl = build_decl (input_location, TYPE_DECL,
3151 get_identifier ("__asan_global"), ret);
3152 DECL_IGNORED_P (type_decl) = 1;
3153 DECL_ARTIFICIAL (type_decl) = 1;
3154 TYPE_FIELDS (ret) = fields[0];
3155 TYPE_NAME (ret) = type_decl;
3156 TYPE_STUB_DECL (ret) = type_decl;
3157 TYPE_ARTIFICIAL (ret) = 1;
3158 layout_type (ret);
3159 return ret;
3162 /* Create and return odr indicator symbol for DECL.
3163 TYPE is __asan_global struct type as returned by asan_global_struct. */
3165 static tree
3166 create_odr_indicator (tree decl, tree type)
3168 char *name;
3169 tree uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
3170 tree decl_name
3171 = (HAS_DECL_ASSEMBLER_NAME_P (decl) ? DECL_ASSEMBLER_NAME (decl)
3172 : DECL_NAME (decl));
3173 /* DECL_NAME theoretically might be NULL. Bail out with 0 in this case. */
3174 if (decl_name == NULL_TREE)
3175 return build_int_cst (uptr, 0);
3176 const char *dname = IDENTIFIER_POINTER (decl_name);
3177 if (HAS_DECL_ASSEMBLER_NAME_P (decl))
3178 dname = targetm.strip_name_encoding (dname);
3179 size_t len = strlen (dname) + sizeof ("__odr_asan_");
3180 name = XALLOCAVEC (char, len);
3181 snprintf (name, len, "__odr_asan_%s", dname);
3182 #ifndef NO_DOT_IN_LABEL
3183 name[sizeof ("__odr_asan") - 1] = '.';
3184 #elif !defined(NO_DOLLAR_IN_LABEL)
3185 name[sizeof ("__odr_asan") - 1] = '$';
3186 #endif
3187 tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (name),
3188 char_type_node);
3189 TREE_ADDRESSABLE (var) = 1;
3190 TREE_READONLY (var) = 0;
3191 TREE_THIS_VOLATILE (var) = 1;
3192 DECL_ARTIFICIAL (var) = 1;
3193 DECL_IGNORED_P (var) = 1;
3194 TREE_STATIC (var) = 1;
3195 TREE_PUBLIC (var) = 1;
3196 DECL_VISIBILITY (var) = DECL_VISIBILITY (decl);
3197 DECL_VISIBILITY_SPECIFIED (var) = DECL_VISIBILITY_SPECIFIED (decl);
3199 TREE_USED (var) = 1;
3200 tree ctor = build_constructor_va (TREE_TYPE (var), 1, NULL_TREE,
3201 build_int_cst (unsigned_type_node, 0));
3202 TREE_CONSTANT (ctor) = 1;
3203 TREE_STATIC (ctor) = 1;
3204 DECL_INITIAL (var) = ctor;
3205 DECL_ATTRIBUTES (var) = tree_cons (get_identifier ("asan odr indicator"),
3206 NULL, DECL_ATTRIBUTES (var));
3207 make_decl_rtl (var);
3208 varpool_node::finalize_decl (var);
3209 return fold_convert (uptr, build_fold_addr_expr (var));
3212 /* Return true if DECL, a global var, might be overridden and needs
3213 an additional odr indicator symbol. */
3215 static bool
3216 asan_needs_odr_indicator_p (tree decl)
3218 /* Don't emit ODR indicators for kernel because:
3219 a) Kernel is written in C thus doesn't need ODR indicators.
3220 b) Some kernel code may have assumptions about symbols containing specific
3221 patterns in their names. Since ODR indicators contain original names
3222 of symbols they are emitted for, these assumptions would be broken for
3223 ODR indicator symbols. */
3224 return (!(flag_sanitize & SANITIZE_KERNEL_ADDRESS)
3225 && !DECL_ARTIFICIAL (decl)
3226 && !DECL_WEAK (decl)
3227 && TREE_PUBLIC (decl));
3230 /* Append description of a single global DECL into vector V.
3231 TYPE is __asan_global struct type as returned by asan_global_struct. */
3233 static void
3234 asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
3236 tree init, uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
3237 unsigned HOST_WIDE_INT size;
3238 tree str_cst, module_name_cst, refdecl = decl;
3239 vec<constructor_elt, va_gc> *vinner = NULL;
3241 pretty_printer asan_pp, module_name_pp;
3243 if (DECL_NAME (decl))
3244 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
3245 else
3246 pp_string (&asan_pp, "<unknown>");
3247 str_cst = asan_pp_string (&asan_pp);
3249 pp_string (&module_name_pp, main_input_filename);
3250 module_name_cst = asan_pp_string (&module_name_pp);
3252 if (asan_needs_local_alias (decl))
3254 char buf[20];
3255 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
3256 refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
3257 VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
3258 TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
3259 TREE_READONLY (refdecl) = TREE_READONLY (decl);
3260 TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
3261 DECL_NOT_GIMPLE_REG_P (refdecl) = DECL_NOT_GIMPLE_REG_P (decl);
3262 DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
3263 DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
3264 TREE_STATIC (refdecl) = 1;
3265 TREE_PUBLIC (refdecl) = 0;
3266 TREE_USED (refdecl) = 1;
3267 assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
3270 tree odr_indicator_ptr
3271 = (asan_needs_odr_indicator_p (decl) ? create_odr_indicator (decl, type)
3272 : build_int_cst (uptr, 0));
3273 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3274 fold_convert (const_ptr_type_node,
3275 build_fold_addr_expr (refdecl)));
3276 size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
3277 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3278 size += asan_red_zone_size (size);
3279 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3280 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3281 fold_convert (const_ptr_type_node, str_cst));
3282 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3283 fold_convert (const_ptr_type_node, module_name_cst));
3284 varpool_node *vnode = varpool_node::get (decl);
3285 int has_dynamic_init = 0;
3286 /* FIXME: Enable initialization order fiasco detection in LTO mode once
3287 proper fix for PR 79061 will be applied. */
3288 if (!in_lto_p)
3289 has_dynamic_init = vnode ? vnode->dynamically_initialized : 0;
3290 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3291 build_int_cst (uptr, has_dynamic_init));
3292 tree locptr = NULL_TREE;
3293 location_t loc = DECL_SOURCE_LOCATION (decl);
3294 expanded_location xloc = expand_location (loc);
3295 if (xloc.file != NULL)
3297 static int lasanloccnt = 0;
3298 char buf[25];
3299 ASM_GENERATE_INTERNAL_LABEL (buf, "LASANLOC", ++lasanloccnt);
3300 tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3301 ubsan_get_source_location_type ());
3302 TREE_STATIC (var) = 1;
3303 TREE_PUBLIC (var) = 0;
3304 DECL_ARTIFICIAL (var) = 1;
3305 DECL_IGNORED_P (var) = 1;
3306 pretty_printer filename_pp;
3307 pp_string (&filename_pp, xloc.file);
3308 tree str = asan_pp_string (&filename_pp);
3309 tree ctor = build_constructor_va (TREE_TYPE (var), 3,
3310 NULL_TREE, str, NULL_TREE,
3311 build_int_cst (unsigned_type_node,
3312 xloc.line), NULL_TREE,
3313 build_int_cst (unsigned_type_node,
3314 xloc.column));
3315 TREE_CONSTANT (ctor) = 1;
3316 TREE_STATIC (ctor) = 1;
3317 DECL_INITIAL (var) = ctor;
3318 varpool_node::finalize_decl (var);
3319 locptr = fold_convert (uptr, build_fold_addr_expr (var));
3321 else
3322 locptr = build_int_cst (uptr, 0);
3323 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, locptr);
3324 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, odr_indicator_ptr);
3325 init = build_constructor (type, vinner);
3326 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
3329 /* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
3330 void
3331 initialize_sanitizer_builtins (void)
3333 tree decl;
3335 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
3336 return;
3338 tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
3339 tree BT_FN_VOID_PTR
3340 = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
3341 tree BT_FN_VOID_CONST_PTR
3342 = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
3343 tree BT_FN_VOID_PTR_PTR
3344 = build_function_type_list (void_type_node, ptr_type_node,
3345 ptr_type_node, NULL_TREE);
3346 tree BT_FN_VOID_PTR_PTR_PTR
3347 = build_function_type_list (void_type_node, ptr_type_node,
3348 ptr_type_node, ptr_type_node, NULL_TREE);
3349 tree BT_FN_VOID_PTR_PTRMODE
3350 = build_function_type_list (void_type_node, ptr_type_node,
3351 pointer_sized_int_node, NULL_TREE);
3352 tree BT_FN_VOID_INT
3353 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
3354 tree BT_FN_SIZE_CONST_PTR_INT
3355 = build_function_type_list (size_type_node, const_ptr_type_node,
3356 integer_type_node, NULL_TREE);
3358 tree BT_FN_VOID_UINT8_UINT8
3359 = build_function_type_list (void_type_node, unsigned_char_type_node,
3360 unsigned_char_type_node, NULL_TREE);
3361 tree BT_FN_VOID_UINT16_UINT16
3362 = build_function_type_list (void_type_node, uint16_type_node,
3363 uint16_type_node, NULL_TREE);
3364 tree BT_FN_VOID_UINT32_UINT32
3365 = build_function_type_list (void_type_node, uint32_type_node,
3366 uint32_type_node, NULL_TREE);
3367 tree BT_FN_VOID_UINT64_UINT64
3368 = build_function_type_list (void_type_node, uint64_type_node,
3369 uint64_type_node, NULL_TREE);
3370 tree BT_FN_VOID_FLOAT_FLOAT
3371 = build_function_type_list (void_type_node, float_type_node,
3372 float_type_node, NULL_TREE);
3373 tree BT_FN_VOID_DOUBLE_DOUBLE
3374 = build_function_type_list (void_type_node, double_type_node,
3375 double_type_node, NULL_TREE);
3376 tree BT_FN_VOID_UINT64_PTR
3377 = build_function_type_list (void_type_node, uint64_type_node,
3378 ptr_type_node, NULL_TREE);
3380 tree BT_FN_PTR_CONST_PTR_UINT8
3381 = build_function_type_list (ptr_type_node, const_ptr_type_node,
3382 unsigned_char_type_node, NULL_TREE);
3383 tree BT_FN_VOID_PTR_UINT8_PTRMODE
3384 = build_function_type_list (void_type_node, ptr_type_node,
3385 unsigned_char_type_node,
3386 pointer_sized_int_node, NULL_TREE);
3388 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
3389 tree BT_FN_IX_CONST_VPTR_INT[5];
3390 tree BT_FN_IX_VPTR_IX_INT[5];
3391 tree BT_FN_VOID_VPTR_IX_INT[5];
3392 tree vptr
3393 = build_pointer_type (build_qualified_type (void_type_node,
3394 TYPE_QUAL_VOLATILE));
3395 tree cvptr
3396 = build_pointer_type (build_qualified_type (void_type_node,
3397 TYPE_QUAL_VOLATILE
3398 |TYPE_QUAL_CONST));
3399 tree boolt
3400 = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
3401 int i;
3402 for (i = 0; i < 5; i++)
3404 tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
3405 BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
3406 = build_function_type_list (boolt, vptr, ptr_type_node, ix,
3407 integer_type_node, integer_type_node,
3408 NULL_TREE);
3409 BT_FN_IX_CONST_VPTR_INT[i]
3410 = build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
3411 BT_FN_IX_VPTR_IX_INT[i]
3412 = build_function_type_list (ix, vptr, ix, integer_type_node,
3413 NULL_TREE);
3414 BT_FN_VOID_VPTR_IX_INT[i]
3415 = build_function_type_list (void_type_node, vptr, ix,
3416 integer_type_node, NULL_TREE);
3418 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
3419 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
3420 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
3421 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
3422 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
3423 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
3424 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
3425 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
3426 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
3427 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
3428 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
3429 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
3430 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
3431 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
3432 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
3433 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
3434 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
3435 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
3436 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
3437 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
3438 #undef ATTR_NOTHROW_LIST
3439 #define ATTR_NOTHROW_LIST ECF_NOTHROW
3440 #undef ATTR_NOTHROW_LEAF_LIST
3441 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
3442 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
3443 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
3444 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
3445 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
3446 #undef ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3447 #define ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST \
3448 ECF_CONST | ATTR_NORETURN_NOTHROW_LEAF_LIST
3449 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
3450 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
3451 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
3452 #undef ATTR_COLD_NOTHROW_LEAF_LIST
3453 #define ATTR_COLD_NOTHROW_LEAF_LIST \
3454 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
3455 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
3456 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
3457 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
3458 #undef ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST
3459 #define ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST \
3460 /* ECF_COLD missing */ ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3461 #undef ATTR_PURE_NOTHROW_LEAF_LIST
3462 #define ATTR_PURE_NOTHROW_LEAF_LIST ECF_PURE | ATTR_NOTHROW_LEAF_LIST
3463 #undef DEF_BUILTIN_STUB
3464 #define DEF_BUILTIN_STUB(ENUM, NAME)
3465 #undef DEF_SANITIZER_BUILTIN_1
3466 #define DEF_SANITIZER_BUILTIN_1(ENUM, NAME, TYPE, ATTRS) \
3467 do { \
3468 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
3469 BUILT_IN_NORMAL, NAME, NULL_TREE); \
3470 set_call_expr_flags (decl, ATTRS); \
3471 set_builtin_decl (ENUM, decl, true); \
3472 } while (0)
3473 #undef DEF_SANITIZER_BUILTIN
3474 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
3475 DEF_SANITIZER_BUILTIN_1 (ENUM, NAME, TYPE, ATTRS);
3477 #include "sanitizer.def"
3479 /* -fsanitize=object-size uses __builtin_dynamic_object_size and
3480 __builtin_object_size, but they might not be available for e.g. Fortran at
3481 this point. We use DEF_SANITIZER_BUILTIN here only as a convenience
3482 macro. */
3483 if (flag_sanitize & SANITIZE_OBJECT_SIZE)
3485 if (!builtin_decl_implicit_p (BUILT_IN_OBJECT_SIZE))
3486 DEF_SANITIZER_BUILTIN_1 (BUILT_IN_OBJECT_SIZE, "object_size",
3487 BT_FN_SIZE_CONST_PTR_INT,
3488 ATTR_PURE_NOTHROW_LEAF_LIST);
3489 if (!builtin_decl_implicit_p (BUILT_IN_DYNAMIC_OBJECT_SIZE))
3490 DEF_SANITIZER_BUILTIN_1 (BUILT_IN_DYNAMIC_OBJECT_SIZE,
3491 "dynamic_object_size",
3492 BT_FN_SIZE_CONST_PTR_INT,
3493 ATTR_PURE_NOTHROW_LEAF_LIST);
3496 #undef DEF_SANITIZER_BUILTIN_1
3497 #undef DEF_SANITIZER_BUILTIN
3498 #undef DEF_BUILTIN_STUB
3501 /* Called via htab_traverse. Count number of emitted
3502 STRING_CSTs in the constant hash table. */
3505 count_string_csts (constant_descriptor_tree **slot,
3506 unsigned HOST_WIDE_INT *data)
3508 struct constant_descriptor_tree *desc = *slot;
3509 if (TREE_CODE (desc->value) == STRING_CST
3510 && TREE_ASM_WRITTEN (desc->value)
3511 && asan_protect_global (desc->value))
3512 ++*data;
3513 return 1;
3516 /* Helper structure to pass two parameters to
3517 add_string_csts. */
3519 struct asan_add_string_csts_data
3521 tree type;
3522 vec<constructor_elt, va_gc> *v;
3525 /* Called via hash_table::traverse. Call asan_add_global
3526 on emitted STRING_CSTs from the constant hash table. */
3529 add_string_csts (constant_descriptor_tree **slot,
3530 asan_add_string_csts_data *aascd)
3532 struct constant_descriptor_tree *desc = *slot;
3533 if (TREE_CODE (desc->value) == STRING_CST
3534 && TREE_ASM_WRITTEN (desc->value)
3535 && asan_protect_global (desc->value))
3537 asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
3538 aascd->type, aascd->v);
3540 return 1;
3543 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
3544 invoke ggc_collect. */
3545 static GTY(()) tree asan_ctor_statements;
3547 /* Module-level instrumentation.
3548 - Insert __asan_init_vN() into the list of CTORs.
3549 - TODO: insert redzones around globals.
3552 void
3553 asan_finish_file (void)
3555 varpool_node *vnode;
3556 unsigned HOST_WIDE_INT gcount = 0;
3558 if (shadow_ptr_types[0] == NULL_TREE)
3559 asan_init_shadow_ptr_types ();
3560 /* Avoid instrumenting code in the asan ctors/dtors.
3561 We don't need to insert padding after the description strings,
3562 nor after .LASAN* array. */
3563 flag_sanitize &= ~SANITIZE_ADDRESS;
3565 /* For user-space we want asan constructors to run first.
3566 Linux kernel does not support priorities other than default, and the only
3567 other user of constructors is coverage. So we run with the default
3568 priority. */
3569 int priority = flag_sanitize & SANITIZE_USER_ADDRESS
3570 ? MAX_RESERVED_INIT_PRIORITY - 1 : DEFAULT_INIT_PRIORITY;
3572 if (flag_sanitize & SANITIZE_USER_ADDRESS)
3574 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
3575 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3576 fn = builtin_decl_implicit (BUILT_IN_ASAN_VERSION_MISMATCH_CHECK);
3577 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3579 FOR_EACH_DEFINED_VARIABLE (vnode)
3580 if (TREE_ASM_WRITTEN (vnode->decl)
3581 && asan_protect_global (vnode->decl))
3582 ++gcount;
3583 hash_table<tree_descriptor_hasher> *const_desc_htab = constant_pool_htab ();
3584 const_desc_htab->traverse<unsigned HOST_WIDE_INT *, count_string_csts>
3585 (&gcount);
3586 if (gcount)
3588 tree type = asan_global_struct (), var, ctor;
3589 tree dtor_statements = NULL_TREE;
3590 vec<constructor_elt, va_gc> *v;
3591 char buf[20];
3593 type = build_array_type_nelts (type, gcount);
3594 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
3595 var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3596 type);
3597 TREE_STATIC (var) = 1;
3598 TREE_PUBLIC (var) = 0;
3599 DECL_ARTIFICIAL (var) = 1;
3600 DECL_IGNORED_P (var) = 1;
3601 vec_alloc (v, gcount);
3602 FOR_EACH_DEFINED_VARIABLE (vnode)
3603 if (TREE_ASM_WRITTEN (vnode->decl)
3604 && asan_protect_global (vnode->decl))
3605 asan_add_global (vnode->decl, TREE_TYPE (type), v);
3606 struct asan_add_string_csts_data aascd;
3607 aascd.type = TREE_TYPE (type);
3608 aascd.v = v;
3609 const_desc_htab->traverse<asan_add_string_csts_data *, add_string_csts>
3610 (&aascd);
3611 ctor = build_constructor (type, v);
3612 TREE_CONSTANT (ctor) = 1;
3613 TREE_STATIC (ctor) = 1;
3614 DECL_INITIAL (var) = ctor;
3615 SET_DECL_ALIGN (var, MAX (DECL_ALIGN (var),
3616 ASAN_SHADOW_GRANULARITY * BITS_PER_UNIT));
3618 varpool_node::finalize_decl (var);
3620 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
3621 tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
3622 append_to_statement_list (build_call_expr (fn, 2,
3623 build_fold_addr_expr (var),
3624 gcount_tree),
3625 &asan_ctor_statements);
3627 fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
3628 append_to_statement_list (build_call_expr (fn, 2,
3629 build_fold_addr_expr (var),
3630 gcount_tree),
3631 &dtor_statements);
3632 cgraph_build_static_cdtor ('D', dtor_statements, priority);
3634 if (asan_ctor_statements)
3635 cgraph_build_static_cdtor ('I', asan_ctor_statements, priority);
3636 flag_sanitize |= SANITIZE_ADDRESS;
3639 /* Poison or unpoison (depending on IS_CLOBBER variable) shadow memory based
3640 on SHADOW address. Newly added statements will be added to ITER with
3641 given location LOC. We mark SIZE bytes in shadow memory, where
3642 LAST_CHUNK_SIZE is greater than zero in situation where we are at the
3643 end of a variable. */
3645 static void
3646 asan_store_shadow_bytes (gimple_stmt_iterator *iter, location_t loc,
3647 tree shadow,
3648 unsigned HOST_WIDE_INT base_addr_offset,
3649 bool is_clobber, unsigned size,
3650 unsigned last_chunk_size)
3652 tree shadow_ptr_type;
3654 switch (size)
3656 case 1:
3657 shadow_ptr_type = shadow_ptr_types[0];
3658 break;
3659 case 2:
3660 shadow_ptr_type = shadow_ptr_types[1];
3661 break;
3662 case 4:
3663 shadow_ptr_type = shadow_ptr_types[2];
3664 break;
3665 default:
3666 gcc_unreachable ();
3669 unsigned char c = (char) is_clobber ? ASAN_STACK_MAGIC_USE_AFTER_SCOPE : 0;
3670 unsigned HOST_WIDE_INT val = 0;
3671 unsigned last_pos = size;
3672 if (last_chunk_size && !is_clobber)
3673 last_pos = BYTES_BIG_ENDIAN ? 0 : size - 1;
3674 for (unsigned i = 0; i < size; ++i)
3676 unsigned char shadow_c = c;
3677 if (i == last_pos)
3678 shadow_c = last_chunk_size;
3679 val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
3682 /* Handle last chunk in unpoisoning. */
3683 tree magic = build_int_cst (TREE_TYPE (shadow_ptr_type), val);
3685 tree dest = build2 (MEM_REF, TREE_TYPE (shadow_ptr_type), shadow,
3686 build_int_cst (shadow_ptr_type, base_addr_offset));
3688 gimple *g = gimple_build_assign (dest, magic);
3689 gimple_set_location (g, loc);
3690 gsi_insert_after (iter, g, GSI_NEW_STMT);
3693 /* Expand the ASAN_MARK builtins. */
3695 bool
3696 asan_expand_mark_ifn (gimple_stmt_iterator *iter)
3698 gimple *g = gsi_stmt (*iter);
3699 location_t loc = gimple_location (g);
3700 HOST_WIDE_INT flag = tree_to_shwi (gimple_call_arg (g, 0));
3701 bool is_poison = ((asan_mark_flags)flag) == ASAN_MARK_POISON;
3703 tree base = gimple_call_arg (g, 1);
3704 gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
3705 tree decl = TREE_OPERAND (base, 0);
3707 /* For a nested function, we can have: ASAN_MARK (2, &FRAME.2.fp_input, 4) */
3708 if (TREE_CODE (decl) == COMPONENT_REF
3709 && DECL_NONLOCAL_FRAME (TREE_OPERAND (decl, 0)))
3710 decl = TREE_OPERAND (decl, 0);
3712 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
3714 if (hwasan_sanitize_p ())
3716 gcc_assert (param_hwasan_instrument_stack);
3717 gimple_seq stmts = NULL;
3718 /* Here we swap ASAN_MARK calls for HWASAN_MARK.
3719 This is because we are using the approach of using ASAN_MARK as a
3720 synonym until here.
3721 That approach means we don't yet have to duplicate all the special
3722 cases for ASAN_MARK and ASAN_POISON with the exact same handling but
3723 called HWASAN_MARK etc.
3725 N.b. __asan_poison_stack_memory (which implements ASAN_MARK for ASAN)
3726 rounds the size up to its shadow memory granularity, while
3727 __hwasan_tag_memory (which implements the same for HWASAN) does not.
3728 Hence we emit HWASAN_MARK with an aligned size unlike ASAN_MARK. */
3729 tree len = gimple_call_arg (g, 2);
3730 tree new_len = gimple_build_round_up (&stmts, loc, size_type_node, len,
3731 HWASAN_TAG_GRANULE_SIZE);
3732 gimple_build (&stmts, loc, CFN_HWASAN_MARK,
3733 void_type_node, gimple_call_arg (g, 0),
3734 base, new_len);
3735 gsi_replace_with_seq (iter, stmts, true);
3736 return false;
3739 if (is_poison)
3741 if (asan_handled_variables == NULL)
3742 asan_handled_variables = new hash_set<tree> (16);
3743 asan_handled_variables->add (decl);
3745 tree len = gimple_call_arg (g, 2);
3747 gcc_assert (tree_fits_shwi_p (len));
3748 unsigned HOST_WIDE_INT size_in_bytes = tree_to_shwi (len);
3749 gcc_assert (size_in_bytes);
3751 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3752 NOP_EXPR, base);
3753 gimple_set_location (g, loc);
3754 gsi_replace (iter, g, false);
3755 tree base_addr = gimple_assign_lhs (g);
3757 /* Generate direct emission if size_in_bytes is small. */
3758 if (size_in_bytes
3759 <= (unsigned)param_use_after_scope_direct_emission_threshold)
3761 const unsigned HOST_WIDE_INT shadow_size
3762 = shadow_mem_size (size_in_bytes);
3763 const unsigned int shadow_align
3764 = (get_pointer_alignment (base) / BITS_PER_UNIT) >> ASAN_SHADOW_SHIFT;
3766 tree shadow = build_shadow_mem_access (iter, loc, base_addr,
3767 shadow_ptr_types[0], true);
3769 for (unsigned HOST_WIDE_INT offset = 0; offset < shadow_size;)
3771 unsigned size = 1;
3772 if (shadow_size - offset >= 4
3773 && (!STRICT_ALIGNMENT || shadow_align >= 4))
3774 size = 4;
3775 else if (shadow_size - offset >= 2
3776 && (!STRICT_ALIGNMENT || shadow_align >= 2))
3777 size = 2;
3779 unsigned HOST_WIDE_INT last_chunk_size = 0;
3780 unsigned HOST_WIDE_INT s = (offset + size) * ASAN_SHADOW_GRANULARITY;
3781 if (s > size_in_bytes)
3782 last_chunk_size = ASAN_SHADOW_GRANULARITY - (s - size_in_bytes);
3784 asan_store_shadow_bytes (iter, loc, shadow, offset, is_poison,
3785 size, last_chunk_size);
3786 offset += size;
3789 else
3791 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3792 NOP_EXPR, len);
3793 gimple_set_location (g, loc);
3794 gsi_insert_before (iter, g, GSI_SAME_STMT);
3795 tree sz_arg = gimple_assign_lhs (g);
3797 tree fun
3798 = builtin_decl_implicit (is_poison ? BUILT_IN_ASAN_POISON_STACK_MEMORY
3799 : BUILT_IN_ASAN_UNPOISON_STACK_MEMORY);
3800 g = gimple_build_call (fun, 2, base_addr, sz_arg);
3801 gimple_set_location (g, loc);
3802 gsi_insert_after (iter, g, GSI_NEW_STMT);
3805 return false;
3808 /* Expand the ASAN_{LOAD,STORE} builtins. */
3810 bool
3811 asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
3813 gcc_assert (!hwasan_sanitize_p ());
3814 gimple *g = gsi_stmt (*iter);
3815 location_t loc = gimple_location (g);
3816 bool recover_p;
3817 if (flag_sanitize & SANITIZE_USER_ADDRESS)
3818 recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
3819 else
3820 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
3822 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
3823 gcc_assert (flags < ASAN_CHECK_LAST);
3824 bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
3825 bool is_store = (flags & ASAN_CHECK_STORE) != 0;
3826 bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
3828 tree base = gimple_call_arg (g, 1);
3829 tree len = gimple_call_arg (g, 2);
3830 HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3));
3832 HOST_WIDE_INT size_in_bytes
3833 = is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
3835 if (use_calls)
3837 /* Instrument using callbacks. */
3838 gimple *g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3839 NOP_EXPR, base);
3840 gimple_set_location (g, loc);
3841 gsi_insert_before (iter, g, GSI_SAME_STMT);
3842 tree base_addr = gimple_assign_lhs (g);
3844 int nargs;
3845 tree fun = check_func (is_store, recover_p, size_in_bytes, &nargs);
3846 if (nargs == 1)
3847 g = gimple_build_call (fun, 1, base_addr);
3848 else
3850 gcc_assert (nargs == 2);
3851 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3852 NOP_EXPR, len);
3853 gimple_set_location (g, loc);
3854 gsi_insert_before (iter, g, GSI_SAME_STMT);
3855 tree sz_arg = gimple_assign_lhs (g);
3856 g = gimple_build_call (fun, nargs, base_addr, sz_arg);
3858 gimple_set_location (g, loc);
3859 gsi_replace (iter, g, false);
3860 return false;
3863 HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
3865 tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
3866 tree shadow_type = TREE_TYPE (shadow_ptr_type);
3868 gimple_stmt_iterator gsi = *iter;
3870 if (!is_non_zero_len)
3872 /* So, the length of the memory area to asan-protect is
3873 non-constant. Let's guard the generated instrumentation code
3874 like:
3876 if (len != 0)
3878 //asan instrumentation code goes here.
3880 // falltrough instructions, starting with *ITER. */
3882 g = gimple_build_cond (NE_EXPR,
3883 len,
3884 build_int_cst (TREE_TYPE (len), 0),
3885 NULL_TREE, NULL_TREE);
3886 gimple_set_location (g, loc);
3888 basic_block then_bb, fallthrough_bb;
3889 insert_if_then_before_iter (as_a <gcond *> (g), iter,
3890 /*then_more_likely_p=*/true,
3891 &then_bb, &fallthrough_bb);
3892 /* Note that fallthrough_bb starts with the statement that was
3893 pointed to by ITER. */
3895 /* The 'then block' of the 'if (len != 0) condition is where
3896 we'll generate the asan instrumentation code now. */
3897 gsi = gsi_last_bb (then_bb);
3900 /* Get an iterator on the point where we can add the condition
3901 statement for the instrumentation. */
3902 basic_block then_bb, else_bb;
3903 gsi = create_cond_insert_point (&gsi, /*before_p*/false,
3904 /*then_more_likely_p=*/false,
3905 /*create_then_fallthru_edge*/recover_p,
3906 &then_bb,
3907 &else_bb);
3909 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3910 NOP_EXPR, base);
3911 gimple_set_location (g, loc);
3912 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
3913 tree base_addr = gimple_assign_lhs (g);
3915 tree t = NULL_TREE;
3916 if (real_size_in_bytes >= 8)
3918 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3919 shadow_ptr_type);
3920 t = shadow;
3922 else
3924 /* Slow path for 1, 2 and 4 byte accesses. */
3925 /* Test (shadow != 0)
3926 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow). */
3927 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3928 shadow_ptr_type);
3929 gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
3930 gimple_seq seq = NULL;
3931 gimple_seq_add_stmt (&seq, shadow_test);
3932 /* Aligned (>= 8 bytes) can test just
3933 (real_size_in_bytes - 1 >= shadow), as base_addr & 7 is known
3934 to be 0. */
3935 if (align < 8)
3937 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
3938 base_addr, 7));
3939 gimple_seq_add_stmt (&seq,
3940 build_type_cast (shadow_type,
3941 gimple_seq_last (seq)));
3942 if (real_size_in_bytes > 1)
3943 gimple_seq_add_stmt (&seq,
3944 build_assign (PLUS_EXPR,
3945 gimple_seq_last (seq),
3946 real_size_in_bytes - 1));
3947 t = gimple_assign_lhs (gimple_seq_last_stmt (seq));
3949 else
3950 t = build_int_cst (shadow_type, real_size_in_bytes - 1);
3951 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR, t, shadow));
3952 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
3953 gimple_seq_last (seq)));
3954 t = gimple_assign_lhs (gimple_seq_last (seq));
3955 gimple_seq_set_location (seq, loc);
3956 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
3958 /* For non-constant, misaligned or otherwise weird access sizes,
3959 check first and last byte. */
3960 if (size_in_bytes == -1)
3962 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3963 MINUS_EXPR, len,
3964 build_int_cst (pointer_sized_int_node, 1));
3965 gimple_set_location (g, loc);
3966 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3967 tree last = gimple_assign_lhs (g);
3968 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3969 PLUS_EXPR, base_addr, last);
3970 gimple_set_location (g, loc);
3971 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3972 tree base_end_addr = gimple_assign_lhs (g);
3974 tree shadow = build_shadow_mem_access (&gsi, loc, base_end_addr,
3975 shadow_ptr_type);
3976 gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
3977 gimple_seq seq = NULL;
3978 gimple_seq_add_stmt (&seq, shadow_test);
3979 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
3980 base_end_addr, 7));
3981 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
3982 gimple_seq_last (seq)));
3983 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
3984 gimple_seq_last (seq),
3985 shadow));
3986 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
3987 gimple_seq_last (seq)));
3988 gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
3989 gimple_seq_last (seq)));
3990 t = gimple_assign_lhs (gimple_seq_last (seq));
3991 gimple_seq_set_location (seq, loc);
3992 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
3996 g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
3997 NULL_TREE, NULL_TREE);
3998 gimple_set_location (g, loc);
3999 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4001 /* Generate call to the run-time library (e.g. __asan_report_load8). */
4002 gsi = gsi_start_bb (then_bb);
4003 int nargs;
4004 tree fun = report_error_func (is_store, recover_p, size_in_bytes, &nargs);
4005 g = gimple_build_call (fun, nargs, base_addr, len);
4006 gimple_set_location (g, loc);
4007 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4009 gsi_remove (iter, true);
4010 *iter = gsi_start_bb (else_bb);
4012 return true;
4015 /* Create ASAN shadow variable for a VAR_DECL which has been rewritten
4016 into SSA. Already seen VAR_DECLs are stored in SHADOW_VARS_MAPPING. */
4018 static tree
4019 create_asan_shadow_var (tree var_decl,
4020 hash_map<tree, tree> &shadow_vars_mapping)
4022 tree *slot = shadow_vars_mapping.get (var_decl);
4023 if (slot == NULL)
4025 tree shadow_var = copy_node (var_decl);
4027 copy_body_data id;
4028 memset (&id, 0, sizeof (copy_body_data));
4029 id.src_fn = id.dst_fn = current_function_decl;
4030 copy_decl_for_dup_finish (&id, var_decl, shadow_var);
4032 DECL_ARTIFICIAL (shadow_var) = 1;
4033 DECL_IGNORED_P (shadow_var) = 1;
4034 DECL_SEEN_IN_BIND_EXPR_P (shadow_var) = 0;
4035 gimple_add_tmp_var (shadow_var);
4037 shadow_vars_mapping.put (var_decl, shadow_var);
4038 return shadow_var;
4040 else
4041 return *slot;
4044 /* Expand ASAN_POISON ifn. */
4046 bool
4047 asan_expand_poison_ifn (gimple_stmt_iterator *iter,
4048 bool *need_commit_edge_insert,
4049 hash_map<tree, tree> &shadow_vars_mapping)
4051 gimple *g = gsi_stmt (*iter);
4052 tree poisoned_var = gimple_call_lhs (g);
4053 if (!poisoned_var || has_zero_uses (poisoned_var))
4055 gsi_remove (iter, true);
4056 return true;
4059 if (SSA_NAME_VAR (poisoned_var) == NULL_TREE)
4060 SET_SSA_NAME_VAR_OR_IDENTIFIER (poisoned_var,
4061 create_tmp_var (TREE_TYPE (poisoned_var)));
4063 tree shadow_var = create_asan_shadow_var (SSA_NAME_VAR (poisoned_var),
4064 shadow_vars_mapping);
4066 bool recover_p;
4067 if (flag_sanitize & SANITIZE_USER_ADDRESS)
4068 recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
4069 else
4070 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
4071 tree size = DECL_SIZE_UNIT (shadow_var);
4072 gimple *poison_call
4073 = gimple_build_call_internal (IFN_ASAN_MARK, 3,
4074 build_int_cst (integer_type_node,
4075 ASAN_MARK_POISON),
4076 build_fold_addr_expr (shadow_var), size);
4078 gimple *use;
4079 imm_use_iterator imm_iter;
4080 FOR_EACH_IMM_USE_STMT (use, imm_iter, poisoned_var)
4082 if (is_gimple_debug (use))
4083 continue;
4085 int nargs;
4086 bool store_p = gimple_call_internal_p (use, IFN_ASAN_POISON_USE);
4087 gcall *call;
4088 if (hwasan_sanitize_p ())
4090 tree fun = builtin_decl_implicit (BUILT_IN_HWASAN_TAG_MISMATCH4);
4091 /* NOTE: hwasan has no __hwasan_report_* functions like asan does.
4092 We use __hwasan_tag_mismatch4 with arguments that tell it the
4093 size of access and load to report all tag mismatches.
4095 The arguments to this function are:
4096 Address of invalid access.
4097 Bitfield containing information about the access
4098 (access_info)
4099 Pointer to a frame of registers
4100 (for use in printing the contents of registers in a dump)
4101 Not used yet -- to be used by inline instrumentation.
4102 Size of access.
4104 The access_info bitfield encodes the following pieces of
4105 information:
4106 - Is this a store or load?
4107 access_info & 0x10 => store
4108 - Should the program continue after reporting the error?
4109 access_info & 0x20 => recover
4110 - What size access is this (not used here since we can always
4111 pass the size in the last argument)
4113 if (access_info & 0xf == 0xf)
4114 size is taken from last argument.
4115 else
4116 size == 1 << (access_info & 0xf)
4118 The last argument contains the size of the access iff the
4119 access_info size indicator is 0xf (we always use this argument
4120 rather than storing the size in the access_info bitfield).
4122 See the function definition `__hwasan_tag_mismatch4` in
4123 libsanitizer/hwasan for the full definition.
4125 unsigned access_info = (0x20 * recover_p)
4126 + (0x10 * store_p)
4127 + (0xf);
4128 call = gimple_build_call (fun, 4,
4129 build_fold_addr_expr (shadow_var),
4130 build_int_cst (pointer_sized_int_node,
4131 access_info),
4132 build_int_cst (pointer_sized_int_node, 0),
4133 size);
4135 else
4137 tree fun = report_error_func (store_p, recover_p, tree_to_uhwi (size),
4138 &nargs);
4139 call = gimple_build_call (fun, 1,
4140 build_fold_addr_expr (shadow_var));
4142 gimple_set_location (call, gimple_location (use));
4143 gimple *call_to_insert = call;
4145 /* The USE can be a gimple PHI node. If so, insert the call on
4146 all edges leading to the PHI node. */
4147 if (is_a <gphi *> (use))
4149 gphi *phi = dyn_cast<gphi *> (use);
4150 for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
4151 if (gimple_phi_arg_def (phi, i) == poisoned_var)
4153 edge e = gimple_phi_arg_edge (phi, i);
4155 /* Do not insert on an edge we can't split. */
4156 if (e->flags & EDGE_ABNORMAL)
4157 continue;
4159 if (call_to_insert == NULL)
4160 call_to_insert = gimple_copy (call);
4162 gsi_insert_seq_on_edge (e, call_to_insert);
4163 *need_commit_edge_insert = true;
4164 call_to_insert = NULL;
4167 else
4169 gimple_stmt_iterator gsi = gsi_for_stmt (use);
4170 if (store_p)
4171 gsi_replace (&gsi, call, true);
4172 else
4173 gsi_insert_before (&gsi, call, GSI_NEW_STMT);
4177 SSA_NAME_IS_DEFAULT_DEF (poisoned_var) = true;
4178 SSA_NAME_DEF_STMT (poisoned_var) = gimple_build_nop ();
4179 gsi_replace (iter, poison_call, false);
4181 return true;
4184 /* Instrument the current function. */
4186 static unsigned int
4187 asan_instrument (void)
4189 if (hwasan_sanitize_p ())
4191 transform_statements ();
4192 return 0;
4195 if (shadow_ptr_types[0] == NULL_TREE)
4196 asan_init_shadow_ptr_types ();
4197 transform_statements ();
4198 last_alloca_addr = NULL_TREE;
4199 return 0;
4202 static bool
4203 gate_asan (void)
4205 return sanitize_flags_p (SANITIZE_ADDRESS);
4208 namespace {
4210 const pass_data pass_data_asan =
4212 GIMPLE_PASS, /* type */
4213 "asan", /* name */
4214 OPTGROUP_NONE, /* optinfo_flags */
4215 TV_NONE, /* tv_id */
4216 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4217 0, /* properties_provided */
4218 0, /* properties_destroyed */
4219 0, /* todo_flags_start */
4220 TODO_update_ssa, /* todo_flags_finish */
4223 class pass_asan : public gimple_opt_pass
4225 public:
4226 pass_asan (gcc::context *ctxt)
4227 : gimple_opt_pass (pass_data_asan, ctxt)
4230 /* opt_pass methods: */
4231 opt_pass * clone () final override { return new pass_asan (m_ctxt); }
4232 bool gate (function *) final override
4234 return gate_asan () || gate_hwasan ();
4236 unsigned int execute (function *) final override
4238 return asan_instrument ();
4241 }; // class pass_asan
4243 } // anon namespace
4245 gimple_opt_pass *
4246 make_pass_asan (gcc::context *ctxt)
4248 return new pass_asan (ctxt);
4251 namespace {
4253 const pass_data pass_data_asan_O0 =
4255 GIMPLE_PASS, /* type */
4256 "asan0", /* name */
4257 OPTGROUP_NONE, /* optinfo_flags */
4258 TV_NONE, /* tv_id */
4259 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4260 0, /* properties_provided */
4261 0, /* properties_destroyed */
4262 0, /* todo_flags_start */
4263 TODO_update_ssa, /* todo_flags_finish */
4266 class pass_asan_O0 : public gimple_opt_pass
4268 public:
4269 pass_asan_O0 (gcc::context *ctxt)
4270 : gimple_opt_pass (pass_data_asan_O0, ctxt)
4273 /* opt_pass methods: */
4274 bool gate (function *) final override
4276 return !optimize && (gate_asan () || gate_hwasan ());
4278 unsigned int execute (function *) final override
4280 return asan_instrument ();
4283 }; // class pass_asan_O0
4285 } // anon namespace
4287 gimple_opt_pass *
4288 make_pass_asan_O0 (gcc::context *ctxt)
4290 return new pass_asan_O0 (ctxt);
4293 /* HWASAN */
4295 /* For stack tagging:
4297 Return the offset from the frame base tag that the "next" expanded object
4298 should have. */
4299 uint8_t
4300 hwasan_current_frame_tag ()
4302 return hwasan_frame_tag_offset;
4305 /* For stack tagging:
4307 Return the 'base pointer' for this function. If that base pointer has not
4308 yet been created then we create a register to hold it and record the insns
4309 to initialize the register in `hwasan_frame_base_init_seq` for later
4310 emission. */
4312 hwasan_frame_base ()
4314 if (! hwasan_frame_base_ptr)
4316 start_sequence ();
4317 hwasan_frame_base_ptr
4318 = force_reg (Pmode,
4319 targetm.memtag.insert_random_tag (virtual_stack_vars_rtx,
4320 NULL_RTX));
4321 hwasan_frame_base_init_seq = get_insns ();
4322 end_sequence ();
4325 return hwasan_frame_base_ptr;
4328 /* For stack tagging:
4330 Check whether this RTX is a standard pointer addressing the base of the
4331 stack variables for this frame. Returns true if the RTX is either
4332 virtual_stack_vars_rtx or hwasan_frame_base_ptr. */
4333 bool
4334 stack_vars_base_reg_p (rtx base)
4336 return base == virtual_stack_vars_rtx || base == hwasan_frame_base_ptr;
4339 /* For stack tagging:
4341 Emit frame base initialisation.
4342 If hwasan_frame_base has been used before here then
4343 hwasan_frame_base_init_seq contains the sequence of instructions to
4344 initialize it. This must be put just before the hwasan prologue, so we emit
4345 the insns before parm_birth_insn (which will point to the first instruction
4346 of the hwasan prologue if it exists).
4348 We update `parm_birth_insn` to point to the start of this initialisation
4349 since that represents the end of the initialisation done by
4350 expand_function_{start,end} functions and we want to maintain that. */
4351 void
4352 hwasan_maybe_emit_frame_base_init ()
4354 if (! hwasan_frame_base_init_seq)
4355 return;
4356 emit_insn_before (hwasan_frame_base_init_seq, parm_birth_insn);
4357 parm_birth_insn = hwasan_frame_base_init_seq;
4360 /* Record a compile-time constant size stack variable that HWASAN will need to
4361 tag. This record of the range of a stack variable will be used by
4362 `hwasan_emit_prologue` to emit the RTL at the start of each frame which will
4363 set tags in the shadow memory according to the assigned tag for each object.
4365 The range that the object spans in stack space should be described by the
4366 bounds `untagged_base + nearest_offset` and
4367 `untagged_base + farthest_offset`.
4368 `tagged_base` is the base address which contains the "base frame tag" for
4369 this frame, and from which the value to address this object with will be
4370 calculated.
4372 We record the `untagged_base` since the functions in the hwasan library we
4373 use to tag memory take pointers without a tag. */
4374 void
4375 hwasan_record_stack_var (rtx untagged_base, rtx tagged_base,
4376 poly_int64 nearest_offset, poly_int64 farthest_offset)
4378 hwasan_stack_var cur_var;
4379 cur_var.untagged_base = untagged_base;
4380 cur_var.tagged_base = tagged_base;
4381 cur_var.nearest_offset = nearest_offset;
4382 cur_var.farthest_offset = farthest_offset;
4383 cur_var.tag_offset = hwasan_current_frame_tag ();
4385 hwasan_tagged_stack_vars.safe_push (cur_var);
4388 /* Return the RTX representing the farthest extent of the statically allocated
4389 stack objects for this frame. If hwasan_frame_base_ptr has not been
4390 initialized then we are not storing any static variables on the stack in
4391 this frame. In this case we return NULL_RTX to represent that.
4393 Otherwise simply return virtual_stack_vars_rtx + frame_offset. */
4395 hwasan_get_frame_extent ()
4397 return (hwasan_frame_base_ptr
4398 ? plus_constant (Pmode, virtual_stack_vars_rtx, frame_offset)
4399 : NULL_RTX);
4402 /* For stack tagging:
4404 Increment the frame tag offset modulo the size a tag can represent. */
4405 void
4406 hwasan_increment_frame_tag ()
4408 uint8_t tag_bits = HWASAN_TAG_SIZE;
4409 gcc_assert (HWASAN_TAG_SIZE
4410 <= sizeof (hwasan_frame_tag_offset) * CHAR_BIT);
4411 hwasan_frame_tag_offset = (hwasan_frame_tag_offset + 1) % (1 << tag_bits);
4412 /* The "background tag" of the stack is zero by definition.
4413 This is the tag that objects like parameters passed on the stack and
4414 spilled registers are given. It is handy to avoid this tag for objects
4415 whose tags we decide ourselves, partly to ensure that buffer overruns
4416 can't affect these important variables (e.g. saved link register, saved
4417 stack pointer etc) and partly to make debugging easier (everything with a
4418 tag of zero is space allocated automatically by the compiler).
4420 This is not feasible when using random frame tags (the default
4421 configuration for hwasan) since the tag for the given frame is randomly
4422 chosen at runtime. In order to avoid any tags matching the stack
4423 background we would need to decide tag offsets at runtime instead of
4424 compile time (and pay the resulting performance cost).
4426 When not using random base tags for each frame (i.e. when compiled with
4427 `--param hwasan-random-frame-tag=0`) the base tag for each frame is zero.
4428 This means the tag that each object gets is equal to the
4429 hwasan_frame_tag_offset used in determining it.
4430 When this is the case we *can* ensure no object gets the tag of zero by
4431 simply ensuring no object has the hwasan_frame_tag_offset of zero.
4433 There is the extra complication that we only record the
4434 hwasan_frame_tag_offset here (which is the offset from the tag stored in
4435 the stack pointer). In the kernel, the tag in the stack pointer is 0xff
4436 rather than zero. This does not cause problems since tags of 0xff are
4437 never checked in the kernel. As mentioned at the beginning of this
4438 comment the background tag of the stack is zero by definition, which means
4439 that for the kernel we should skip offsets of both 0 and 1 from the stack
4440 pointer. Avoiding the offset of 0 ensures we use a tag which will be
4441 checked, avoiding the offset of 1 ensures we use a tag that is not the
4442 same as the background. */
4443 if (hwasan_frame_tag_offset == 0 && ! param_hwasan_random_frame_tag)
4444 hwasan_frame_tag_offset += 1;
4445 if (hwasan_frame_tag_offset == 1 && ! param_hwasan_random_frame_tag
4446 && sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS))
4447 hwasan_frame_tag_offset += 1;
4450 /* Clear internal state for the next function.
4451 This function is called before variables on the stack get expanded, in
4452 `init_vars_expansion`. */
4453 void
4454 hwasan_record_frame_init ()
4456 delete asan_used_labels;
4457 asan_used_labels = NULL;
4459 /* If this isn't the case then some stack variable was recorded *before*
4460 hwasan_record_frame_init is called, yet *after* the hwasan prologue for
4461 the previous frame was emitted. Such stack variables would not have
4462 their shadow stack filled in. */
4463 gcc_assert (hwasan_tagged_stack_vars.is_empty ());
4464 hwasan_frame_base_ptr = NULL_RTX;
4465 hwasan_frame_base_init_seq = NULL;
4467 /* When not using a random frame tag we can avoid the background stack
4468 color which gives the user a little better debug output upon a crash.
4469 Meanwhile, when using a random frame tag it will be nice to avoid adding
4470 tags for the first object since that is unnecessary extra work.
4471 Hence set the initial hwasan_frame_tag_offset to be 0 if using a random
4472 frame tag and 1 otherwise.
4474 As described in hwasan_increment_frame_tag, in the kernel the stack
4475 pointer has the tag 0xff. That means that to avoid 0xff and 0 (the tag
4476 which the kernel does not check and the background tag respectively) we
4477 start with a tag offset of 2. */
4478 hwasan_frame_tag_offset = param_hwasan_random_frame_tag
4480 : sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS) ? 2 : 1;
4483 /* For stack tagging:
4484 (Emits HWASAN equivalent of what is emitted by
4485 `asan_emit_stack_protection`).
4487 Emits the extra prologue code to set the shadow stack as required for HWASAN
4488 stack instrumentation.
4490 Uses the vector of recorded stack variables hwasan_tagged_stack_vars. When
4491 this function has completed hwasan_tagged_stack_vars is empty and all
4492 objects it had pointed to are deallocated. */
4493 void
4494 hwasan_emit_prologue ()
4496 /* We need untagged base pointers since libhwasan only accepts untagged
4497 pointers in __hwasan_tag_memory. We need the tagged base pointer to obtain
4498 the base tag for an offset. */
4500 if (hwasan_tagged_stack_vars.is_empty ())
4501 return;
4503 poly_int64 bot = 0, top = 0;
4504 for (hwasan_stack_var &cur : hwasan_tagged_stack_vars)
4506 poly_int64 nearest = cur.nearest_offset;
4507 poly_int64 farthest = cur.farthest_offset;
4509 if (known_ge (nearest, farthest))
4511 top = nearest;
4512 bot = farthest;
4514 else
4516 /* Given how these values are calculated, one must be known greater
4517 than the other. */
4518 gcc_assert (known_le (nearest, farthest));
4519 top = farthest;
4520 bot = nearest;
4522 poly_int64 size = (top - bot);
4524 /* Assert the edge of each variable is aligned to the HWASAN tag granule
4525 size. */
4526 gcc_assert (multiple_p (top, HWASAN_TAG_GRANULE_SIZE));
4527 gcc_assert (multiple_p (bot, HWASAN_TAG_GRANULE_SIZE));
4528 gcc_assert (multiple_p (size, HWASAN_TAG_GRANULE_SIZE));
4530 rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4531 rtx base_tag = targetm.memtag.extract_tag (cur.tagged_base, NULL_RTX);
4532 rtx tag = plus_constant (QImode, base_tag, cur.tag_offset);
4533 tag = hwasan_truncate_to_tag_size (tag, NULL_RTX);
4535 rtx bottom = convert_memory_address (ptr_mode,
4536 plus_constant (Pmode,
4537 cur.untagged_base,
4538 bot));
4539 emit_library_call (fn, LCT_NORMAL, VOIDmode,
4540 bottom, ptr_mode,
4541 tag, QImode,
4542 gen_int_mode (size, ptr_mode), ptr_mode);
4544 /* Clear the stack vars, we've emitted the prologue for them all now. */
4545 hwasan_tagged_stack_vars.truncate (0);
4548 /* For stack tagging:
4550 Return RTL insns to clear the tags between DYNAMIC and VARS pointers
4551 into the stack. These instructions should be emitted at the end of
4552 every function.
4554 If `dynamic` is NULL_RTX then no insns are returned. */
4555 rtx_insn *
4556 hwasan_emit_untag_frame (rtx dynamic, rtx vars)
4558 if (! dynamic)
4559 return NULL;
4561 start_sequence ();
4563 dynamic = convert_memory_address (ptr_mode, dynamic);
4564 vars = convert_memory_address (ptr_mode, vars);
4566 rtx top_rtx;
4567 rtx bot_rtx;
4568 if (FRAME_GROWS_DOWNWARD)
4570 top_rtx = vars;
4571 bot_rtx = dynamic;
4573 else
4575 top_rtx = dynamic;
4576 bot_rtx = vars;
4579 rtx size_rtx = expand_simple_binop (ptr_mode, MINUS, top_rtx, bot_rtx,
4580 NULL_RTX, /* unsignedp = */0,
4581 OPTAB_DIRECT);
4583 rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4584 emit_library_call (fn, LCT_NORMAL, VOIDmode,
4585 bot_rtx, ptr_mode,
4586 HWASAN_STACK_BACKGROUND, QImode,
4587 size_rtx, ptr_mode);
4589 do_pending_stack_adjust ();
4590 rtx_insn *insns = get_insns ();
4591 end_sequence ();
4592 return insns;
4595 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
4596 invoke ggc_collect. */
4597 static GTY(()) tree hwasan_ctor_statements;
4599 /* Insert module initialization into this TU. This initialization calls the
4600 initialization code for libhwasan. */
4601 void
4602 hwasan_finish_file (void)
4604 /* Do not emit constructor initialization for the kernel.
4605 (the kernel has its own initialization already). */
4606 if (flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
4607 return;
4609 /* Avoid instrumenting code in the hwasan constructors/destructors. */
4610 flag_sanitize &= ~SANITIZE_HWADDRESS;
4611 int priority = MAX_RESERVED_INIT_PRIORITY - 1;
4612 tree fn = builtin_decl_implicit (BUILT_IN_HWASAN_INIT);
4613 append_to_statement_list (build_call_expr (fn, 0), &hwasan_ctor_statements);
4614 cgraph_build_static_cdtor ('I', hwasan_ctor_statements, priority);
4615 flag_sanitize |= SANITIZE_HWADDRESS;
4618 /* For stack tagging:
4620 Truncate `tag` to the number of bits that a tag uses (i.e. to
4621 HWASAN_TAG_SIZE). Store the result in `target` if it's convenient. */
4623 hwasan_truncate_to_tag_size (rtx tag, rtx target)
4625 gcc_assert (GET_MODE (tag) == QImode);
4626 if (HWASAN_TAG_SIZE != GET_MODE_PRECISION (QImode))
4628 gcc_assert (GET_MODE_PRECISION (QImode) > HWASAN_TAG_SIZE);
4629 rtx mask = gen_int_mode ((HOST_WIDE_INT_1U << HWASAN_TAG_SIZE) - 1,
4630 QImode);
4631 tag = expand_simple_binop (QImode, AND, tag, mask, target,
4632 /* unsignedp = */1, OPTAB_WIDEN);
4633 gcc_assert (tag);
4635 return tag;
4638 /* Construct a function tree for __hwasan_{load,store}{1,2,4,8,16,_n}.
4639 IS_STORE is either 1 (for a store) or 0 (for a load). */
4640 static combined_fn
4641 hwasan_check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
4642 int *nargs)
4644 static enum built_in_function check[2][2][6]
4645 = { { { BUILT_IN_HWASAN_LOAD1, BUILT_IN_HWASAN_LOAD2,
4646 BUILT_IN_HWASAN_LOAD4, BUILT_IN_HWASAN_LOAD8,
4647 BUILT_IN_HWASAN_LOAD16, BUILT_IN_HWASAN_LOADN },
4648 { BUILT_IN_HWASAN_STORE1, BUILT_IN_HWASAN_STORE2,
4649 BUILT_IN_HWASAN_STORE4, BUILT_IN_HWASAN_STORE8,
4650 BUILT_IN_HWASAN_STORE16, BUILT_IN_HWASAN_STOREN } },
4651 { { BUILT_IN_HWASAN_LOAD1_NOABORT,
4652 BUILT_IN_HWASAN_LOAD2_NOABORT,
4653 BUILT_IN_HWASAN_LOAD4_NOABORT,
4654 BUILT_IN_HWASAN_LOAD8_NOABORT,
4655 BUILT_IN_HWASAN_LOAD16_NOABORT,
4656 BUILT_IN_HWASAN_LOADN_NOABORT },
4657 { BUILT_IN_HWASAN_STORE1_NOABORT,
4658 BUILT_IN_HWASAN_STORE2_NOABORT,
4659 BUILT_IN_HWASAN_STORE4_NOABORT,
4660 BUILT_IN_HWASAN_STORE8_NOABORT,
4661 BUILT_IN_HWASAN_STORE16_NOABORT,
4662 BUILT_IN_HWASAN_STOREN_NOABORT } } };
4663 if (size_in_bytes == -1)
4665 *nargs = 2;
4666 return as_combined_fn (check[recover_p][is_store][5]);
4668 *nargs = 1;
4669 int size_log2 = exact_log2 (size_in_bytes);
4670 gcc_assert (size_log2 >= 0 && size_log2 <= 5);
4671 return as_combined_fn (check[recover_p][is_store][size_log2]);
4674 /* Expand the HWASAN_{LOAD,STORE} builtins. */
4675 bool
4676 hwasan_expand_check_ifn (gimple_stmt_iterator *iter, bool)
4678 gimple *g = gsi_stmt (*iter);
4679 location_t loc = gimple_location (g);
4680 bool recover_p;
4681 if (flag_sanitize & SANITIZE_USER_HWADDRESS)
4682 recover_p = (flag_sanitize_recover & SANITIZE_USER_HWADDRESS) != 0;
4683 else
4684 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_HWADDRESS) != 0;
4686 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
4687 gcc_assert (flags < ASAN_CHECK_LAST);
4688 bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
4689 bool is_store = (flags & ASAN_CHECK_STORE) != 0;
4690 bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
4692 tree base = gimple_call_arg (g, 1);
4693 tree len = gimple_call_arg (g, 2);
4695 /* `align` is unused for HWASAN_CHECK, but we pass the argument anyway
4696 since that way the arguments match ASAN_CHECK. */
4697 /* HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3)); */
4699 unsigned HOST_WIDE_INT size_in_bytes
4700 = is_scalar_access ? tree_to_shwi (len) : -1;
4702 gimple_stmt_iterator gsi = *iter;
4704 if (!is_non_zero_len)
4706 /* So, the length of the memory area to hwasan-protect is
4707 non-constant. Let's guard the generated instrumentation code
4708 like:
4710 if (len != 0)
4712 // hwasan instrumentation code goes here.
4714 // falltrough instructions, starting with *ITER. */
4716 g = gimple_build_cond (NE_EXPR,
4717 len,
4718 build_int_cst (TREE_TYPE (len), 0),
4719 NULL_TREE, NULL_TREE);
4720 gimple_set_location (g, loc);
4722 basic_block then_bb, fallthrough_bb;
4723 insert_if_then_before_iter (as_a <gcond *> (g), iter,
4724 /*then_more_likely_p=*/true,
4725 &then_bb, &fallthrough_bb);
4726 /* Note that fallthrough_bb starts with the statement that was
4727 pointed to by ITER. */
4729 /* The 'then block' of the 'if (len != 0) condition is where
4730 we'll generate the hwasan instrumentation code now. */
4731 gsi = gsi_last_bb (then_bb);
4734 gimple_seq stmts = NULL;
4735 tree base_addr = gimple_build (&stmts, loc, NOP_EXPR,
4736 pointer_sized_int_node, base);
4738 int nargs = 0;
4739 combined_fn fn
4740 = hwasan_check_func (is_store, recover_p, size_in_bytes, &nargs);
4741 if (nargs == 1)
4742 gimple_build (&stmts, loc, fn, void_type_node, base_addr);
4743 else
4745 gcc_assert (nargs == 2);
4746 tree sz_arg = gimple_build (&stmts, loc, NOP_EXPR,
4747 pointer_sized_int_node, len);
4748 gimple_build (&stmts, loc, fn, void_type_node, base_addr, sz_arg);
4751 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT);
4752 gsi_remove (iter, true);
4753 *iter = gsi;
4754 return false;
4757 /* For stack tagging:
4759 Dummy: the HWASAN_MARK internal function should only ever be in the code
4760 after the sanopt pass. */
4761 bool
4762 hwasan_expand_mark_ifn (gimple_stmt_iterator *)
4764 gcc_unreachable ();
4767 bool
4768 gate_hwasan ()
4770 return hwasan_sanitize_p ();
4773 #include "gt-asan.h"