]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/asan.cc
asan: adjust module name for global variables
[thirdparty/gcc.git] / gcc / asan.cc
1 /* AddressSanitizer, a fast memory error detector.
2 Copyright (C) 2012-2022 Free Software Foundation, Inc.
3 Contributed by Kostya Serebryany <kcc@google.com>
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>. */
20
21
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"
68
69 /* AddressSanitizer finds out-of-bounds and use-after-free bugs
70 with <2x slowdown on average.
71
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.
90
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.
94
95 Read more:
96 http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
97
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.
100
101 [Protection of stack variables]
102
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:
106
107 int
108 foo ()
109 {
110 char a[24] = {0};
111 int b[2] = {0};
112
113 a[5] = 1;
114 b[1] = 2;
115
116 return a[5] + b[1];
117 }
118
119 For this function, the stack protected by asan will be organized as
120 follows, from the top of the stack to the bottom:
121
122 Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
123
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]
127
128 Slot 3/ [24 bytes for variable 'a']
129
130 Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
131
132 Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
133
134 Slot 6/ [8 bytes for variable 'b']
135
136 Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
137 'LEFT RedZone']
138
139 The 32 bytes of LEFT red zone at the bottom of the stack can be
140 decomposed as such:
141
142 1/ The first 8 bytes contain a magical asan number that is always
143 0x41B58AB3.
144
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:
148
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} "
152
153 where '(...){n}' means the content inside the parenthesis occurs 'n'
154 times, with 'n' being the number of variables on the stack.
155
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.
158
159 4/ The following 8 bytes are reserved for internal use by the run-time.
160
161 The shadow memory for that stack layout is going to look like this:
162
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.
168
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.
175
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.
180
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}.
186
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.
192
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.
198
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.
207
208 [Protection of global variables]
209
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.
213
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.
217
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:
221
222 struct __asan_global
223 {
224 // Address of the beginning of the global variable.
225 const void *__beg;
226
227 // Initial size of the global variable.
228 uptr __size;
229
230 // Size of the global variable + size of the red zone. This
231 // size is 32 bytes aligned.
232 uptr __size_with_redzone;
233
234 // Name of the global variable.
235 const void *__name;
236
237 // Name of the module where the global variable is declared.
238 const void *__module_name;
239
240 // 1 if it has dynamic initialization, 0 otherwise.
241 uptr __has_dynamic_init;
242
243 // A pointer to struct that contains source location, could be NULL.
244 __asan_global_source_location *__location;
245 }
246
247 A destructor function that calls the runtime asan library function
248 _asan_unregister_globals is also installed. */
249
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;
254
255 /* Set of variable declarations that are going to be guarded by
256 use-after-scope sanitizer. */
257
258 hash_set<tree> *asan_handled_variables = NULL;
259
260 hash_set <tree> *asan_used_labels = NULL;
261
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.
278
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;
285
286 /* Structure defining the extent of one object on the stack that HWASAN needs
287 to tag in the corresponding shadow stack space.
288
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
300 {
301 rtx untagged_base;
302 rtx tagged_base;
303 poly_int64 nearest_offset;
304 poly_int64 farthest_offset;
305 uint8_t tag_offset;
306 };
307
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;
312
313
314 /* Sets shadow offset to value in string VAL. */
315
316 bool
317 set_asan_shadow_offset (const char *val)
318 {
319 char *endp;
320
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;
329
330 asan_shadow_offset_computed = true;
331
332 return true;
333 }
334
335 /* Set list of user-defined sections that need to be sanitized. */
336
337 void
338 set_sanitized_sections (const char *sections)
339 {
340 char *pat;
341 unsigned i;
342 FOR_EACH_VEC_ELT (sanitized_sections, i, pat)
343 free (pat);
344 sanitized_sections.truncate (0);
345
346 for (const char *s = sections; *s; )
347 {
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;
353 }
354 }
355
356 bool
357 asan_mark_p (gimple *stmt, enum asan_mark_flags flag)
358 {
359 return (gimple_call_internal_p (stmt, IFN_ASAN_MARK)
360 && tree_to_uhwi (gimple_call_arg (stmt, 0)) == flag);
361 }
362
363 bool
364 asan_sanitize_stack_p (void)
365 {
366 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_stack);
367 }
368
369 bool
370 asan_sanitize_allocas_p (void)
371 {
372 return (asan_sanitize_stack_p () && param_asan_protect_allocas);
373 }
374
375 bool
376 asan_instrument_reads (void)
377 {
378 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_reads);
379 }
380
381 bool
382 asan_instrument_writes (void)
383 {
384 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_writes);
385 }
386
387 bool
388 asan_memintrin (void)
389 {
390 return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_memintrin);
391 }
392
393
394 /* Checks whether section SEC should be sanitized. */
395
396 static bool
397 section_sanitized_p (const char *sec)
398 {
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;
405 }
406
407 /* Returns Asan shadow offset. */
408
409 static unsigned HOST_WIDE_INT
410 asan_shadow_offset ()
411 {
412 if (!asan_shadow_offset_computed)
413 {
414 asan_shadow_offset_computed = true;
415 asan_shadow_offset_value = targetm.asan_shadow_offset ();
416 }
417 return asan_shadow_offset_value;
418 }
419
420 /* Returns Asan shadow offset has been set. */
421 bool
422 asan_shadow_offset_set_p ()
423 {
424 return asan_shadow_offset_computed;
425 }
426
427 alias_set_type asan_shadow_set = -1;
428
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];
432
433 /* Decl for __asan_option_detect_stack_use_after_return. */
434 static GTY(()) tree asan_detect_stack_use_after_return;
435
436 /* Hashtable support for memory references used by gimple
437 statements. */
438
439 /* This type represents a reference to a memory region. */
440 struct asan_mem_ref
441 {
442 /* The expression of the beginning of the memory region. */
443 tree start;
444
445 /* The size of the access. */
446 HOST_WIDE_INT access_size;
447 };
448
449 object_allocator <asan_mem_ref> asan_mem_ref_pool ("asan_mem_ref");
450
451 /* Initializes an instance of asan_mem_ref. */
452
453 static void
454 asan_mem_ref_init (asan_mem_ref *ref, tree start, HOST_WIDE_INT access_size)
455 {
456 ref->start = start;
457 ref->access_size = access_size;
458 }
459
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. */
465
466 static asan_mem_ref*
467 asan_mem_ref_new (tree start, HOST_WIDE_INT access_size)
468 {
469 asan_mem_ref *ref = asan_mem_ref_pool.allocate ();
470
471 asan_mem_ref_init (ref, start, access_size);
472 return ref;
473 }
474
475 /* This builds and returns a pointer to the end of the memory region
476 that starts at START and of length LEN. */
477
478 tree
479 asan_mem_ref_get_end (tree start, tree len)
480 {
481 if (len == NULL_TREE || integer_zerop (len))
482 return start;
483
484 if (!ptrofftype_p (len))
485 len = convert_to_ptrofftype (len);
486
487 return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
488 }
489
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. */
493
494 tree
495 asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
496 {
497 return asan_mem_ref_get_end (ref->start, len);
498 }
499
500 struct asan_mem_ref_hasher : nofree_ptr_hash <asan_mem_ref>
501 {
502 static inline hashval_t hash (const asan_mem_ref *);
503 static inline bool equal (const asan_mem_ref *, const asan_mem_ref *);
504 };
505
506 /* Hash a memory reference. */
507
508 inline hashval_t
509 asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
510 {
511 return iterative_hash_expr (mem_ref->start, 0);
512 }
513
514 /* Compare two memory references. We accept the length of either
515 memory references to be NULL_TREE. */
516
517 inline bool
518 asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
519 const asan_mem_ref *m2)
520 {
521 return operand_equal_p (m1->start, m2->start, 0);
522 }
523
524 static hash_table<asan_mem_ref_hasher> *asan_mem_ref_ht;
525
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. */
530
531 static hash_table<asan_mem_ref_hasher> *
532 get_mem_ref_hash_table ()
533 {
534 if (!asan_mem_ref_ht)
535 asan_mem_ref_ht = new hash_table<asan_mem_ref_hasher> (10);
536
537 return asan_mem_ref_ht;
538 }
539
540 /* Clear all entries from the memory references hash table. */
541
542 static void
543 empty_mem_ref_hash_table ()
544 {
545 if (asan_mem_ref_ht)
546 asan_mem_ref_ht->empty ();
547 }
548
549 /* Free the memory references hash table. */
550
551 static void
552 free_mem_ref_resources ()
553 {
554 delete asan_mem_ref_ht;
555 asan_mem_ref_ht = NULL;
556
557 asan_mem_ref_pool.release ();
558 }
559
560 /* Return true iff the memory reference REF has been instrumented. */
561
562 static bool
563 has_mem_ref_been_instrumented (tree ref, HOST_WIDE_INT access_size)
564 {
565 asan_mem_ref r;
566 asan_mem_ref_init (&r, ref, access_size);
567
568 asan_mem_ref *saved_ref = get_mem_ref_hash_table ()->find (&r);
569 return saved_ref && saved_ref->access_size >= access_size;
570 }
571
572 /* Return true iff the memory reference REF has been instrumented. */
573
574 static bool
575 has_mem_ref_been_instrumented (const asan_mem_ref *ref)
576 {
577 return has_mem_ref_been_instrumented (ref->start, ref->access_size);
578 }
579
580 /* Return true iff access to memory region starting at REF and of
581 length LEN has been instrumented. */
582
583 static bool
584 has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
585 {
586 HOST_WIDE_INT size_in_bytes
587 = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
588
589 return size_in_bytes != -1
590 && has_mem_ref_been_instrumented (ref->start, size_in_bytes);
591 }
592
593 /* Set REF to the memory reference present in a gimple assignment
594 ASSIGNMENT. Return true upon successful completion, false
595 otherwise. */
596
597 static bool
598 get_mem_ref_of_assignment (const gassign *assignment,
599 asan_mem_ref *ref,
600 bool *ref_is_store)
601 {
602 gcc_assert (gimple_assign_single_p (assignment));
603
604 if (gimple_store_p (assignment)
605 && !gimple_clobber_p (assignment))
606 {
607 ref->start = gimple_assign_lhs (assignment);
608 *ref_is_store = true;
609 }
610 else if (gimple_assign_load_p (assignment))
611 {
612 ref->start = gimple_assign_rhs1 (assignment);
613 *ref_is_store = false;
614 }
615 else
616 return false;
617
618 ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
619 return true;
620 }
621
622 /* Return address of last allocated dynamic alloca. */
623
624 static tree
625 get_last_alloca_addr ()
626 {
627 if (last_alloca_addr)
628 return last_alloca_addr;
629
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;
635 }
636
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.
655
656 HWASAN needs to do very similar, the eventual pseudocode should be:
657 __hwasan_tag_memory (virtual_stack_dynamic_rtx,
658 0,
659 new_sp - sp);
660 __builtin_stack_restore (new_sp)
661
662 Need to use the same trick to handle STACK_DYNAMIC_OFFSET as described
663 above. */
664
665 static void
666 handle_builtin_stack_restore (gcall *call, gimple_stmt_iterator *iter)
667 {
668 if (!iter
669 || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
670 return;
671
672 tree restored_stack = gimple_call_arg (call, 0);
673
674 gimple *g;
675
676 if (hwasan_sanitize_allocas_p ())
677 {
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);
685 }
686 else
687 {
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);
693 }
694
695 gsi_insert_before (iter, g, GSI_SAME_STMT);
696 }
697
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. */
720
721 static void
722 handle_builtin_alloca (gcall *call, gimple_stmt_iterator *iter)
723 {
724 if (!iter
725 || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
726 return;
727
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));
738
739 bool throws = false;
740 edge e = NULL;
741 if (stmt_can_throw_internal (cfun, call))
742 {
743 if (!lhs)
744 return;
745 throws = true;
746 e = find_fallthru_edge (gsi_bb (*iter)->succs);
747 }
748
749 if (hwasan_sanitize_allocas_p ())
750 {
751 gimple_seq stmts = NULL;
752 location_t loc = gimple_location (gsi_stmt (*iter));
753 /*
754 HWASAN needs a different expansion.
755
756 addr = __builtin_alloca (size, align);
757
758 should be replaced by
759
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);
765 */
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;
769
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);
774
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));
780
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);
788
789 /* Add tag to pointer. */
790 tree addr
791 = gimple_build (&stmts, loc, CFN_HWASAN_SET_TAG, ptr_type,
792 untagged_addr, tag);
793
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);
798
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);
802
803 /* Finally, replace old alloca ptr with NEW_ALLOCA. */
804 replace_call_with_value (iter, addr);
805 return;
806 }
807
808 tree last_alloca = get_last_alloca_addr ();
809 const HOST_WIDE_INT redzone_mask = ASAN_RED_ZONE_SIZE - 1;
810
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);
815
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);
818
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);
824
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))
828 {
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);
839 }
840
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)
846 {
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);
852 }
853
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);
859
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)
868 {
869 gimple_call_set_lhs (call, NULL);
870 gsi_replace (iter, gg, true);
871 }
872 else
873 gsi_insert_before (iter, gg, GSI_SAME_STMT);
874
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)
882 {
883 gsi_insert_on_edge_immediate (e, g);
884 gsi = gsi_for_stmt (g);
885 }
886 else
887 gsi_insert_before (iter, g, GSI_SAME_STMT);
888 tree new_alloca = gimple_assign_lhs (g);
889
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);
898
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);
906
907 /* Finally, replace old alloca ptr with NEW_ALLOCA. */
908 if (throws)
909 {
910 g = gimple_build_assign (lhs, new_alloca);
911 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
912 }
913 else
914 replace_call_with_value (iter, new_alloca);
915 }
916
917 /* Return the memory references contained in a gimple statement
918 representing a builtin call that has to do with memory access. */
919
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)
934 {
935 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
936
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;
942
943 *intercepted_p = asan_intercepted_p ((DECL_FUNCTION_CODE (callee)));
944
945 switch (DECL_FUNCTION_CODE (callee))
946 {
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;
954
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;
961
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;
973
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;
979
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;
986
987 case BUILT_IN_STRLEN:
988 /* Special case strlen here since its length is taken from its return
989 value.
990
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.
994
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.
998
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.
1005
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;
1016
1017 case BUILT_IN_STACK_RESTORE:
1018 handle_builtin_stack_restore (call, iter);
1019 break;
1020
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. */
1027
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;
1064
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;
1101
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;
1138
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;
1175
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:
1213 {
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;
1224 }
1225
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;
1231 }
1232
1233 if (len != NULL_TREE)
1234 {
1235 if (source0 != NULL_TREE)
1236 {
1237 src0->start = source0;
1238 src0->access_size = access_size;
1239 *src0_len = len;
1240 *src0_is_store = false;
1241 }
1242
1243 if (source1 != NULL_TREE)
1244 {
1245 src1->start = source1;
1246 src1->access_size = access_size;
1247 *src1_len = len;
1248 *src1_is_store = false;
1249 }
1250
1251 if (dest != NULL_TREE)
1252 {
1253 dst->start = dest;
1254 dst->access_size = access_size;
1255 *dst_len = len;
1256 *dst_is_store = true;
1257 }
1258
1259 got_reference_p = true;
1260 }
1261 else if (dest)
1262 {
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;
1269 }
1270
1271 return got_reference_p;
1272 }
1273
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. */
1277
1278 static bool
1279 has_stmt_been_instrumented_p (gimple *stmt)
1280 {
1281 if (gimple_assign_single_p (stmt))
1282 {
1283 bool r_is_store;
1284 asan_mem_ref r;
1285 asan_mem_ref_init (&r, NULL, 1);
1286
1287 if (get_mem_ref_of_assignment (as_a <gassign *> (stmt), &r,
1288 &r_is_store))
1289 {
1290 if (!has_mem_ref_been_instrumented (&r))
1291 return false;
1292 if (r_is_store && gimple_assign_load_p (stmt))
1293 {
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;
1300 }
1301 return true;
1302 }
1303 }
1304 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
1305 {
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);
1310
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))
1319 {
1320 if (src0.start != NULL_TREE
1321 && !has_mem_ref_been_instrumented (&src0, src0_len))
1322 return false;
1323
1324 if (src1.start != NULL_TREE
1325 && !has_mem_ref_been_instrumented (&src1, src1_len))
1326 return false;
1327
1328 if (dest.start != NULL_TREE
1329 && !has_mem_ref_been_instrumented (&dest, dest_len))
1330 return false;
1331
1332 return true;
1333 }
1334 }
1335 else if (is_gimple_call (stmt) && gimple_store_p (stmt))
1336 {
1337 asan_mem_ref r;
1338 asan_mem_ref_init (&r, NULL, 1);
1339
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);
1343 }
1344
1345 return false;
1346 }
1347
1348 /* Insert a memory reference into the hash table. */
1349
1350 static void
1351 update_mem_ref_hash_table (tree ref, HOST_WIDE_INT access_size)
1352 {
1353 hash_table<asan_mem_ref_hasher> *ht = get_mem_ref_hash_table ();
1354
1355 asan_mem_ref r;
1356 asan_mem_ref_init (&r, ref, access_size);
1357
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);
1361 }
1362
1363 /* Initialize shadow_ptr_types array. */
1364
1365 static void
1366 asan_init_shadow_ptr_types (void)
1367 {
1368 asan_shadow_set = new_alias_set ();
1369 tree types[3] = { signed_char_type_node, short_integer_type_node,
1370 integer_type_node };
1371
1372 for (unsigned i = 0; i < 3; i++)
1373 {
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]);
1377 }
1378
1379 initialize_sanitizer_builtins ();
1380 }
1381
1382 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
1383
1384 static tree
1385 asan_pp_string (pretty_printer *pp)
1386 {
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);
1396 }
1397
1398 /* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
1399 though. */
1400
1401 static void
1402 asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
1403 {
1404 rtx_insn *insn, *insns, *jump;
1405 rtx_code_label *top_label;
1406 rtx end, addr, tmp;
1407
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)
1417 {
1418 emit_insn (insns);
1419 return;
1420 }
1421
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);
1427
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));
1439 }
1440
1441 void
1442 asan_function_start (void)
1443 {
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);
1448 }
1449
1450 /* Return number of shadow bytes that are occupied by a local variable
1451 of SIZE bytes. */
1452
1453 static unsigned HOST_WIDE_INT
1454 shadow_mem_size (unsigned HOST_WIDE_INT size)
1455 {
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);
1460
1461 return ROUND_UP (size, ASAN_SHADOW_GRANULARITY) / ASAN_SHADOW_GRANULARITY;
1462 }
1463
1464 /* Always emit 4 bytes at a time. */
1465 #define RZ_BUFFER_SIZE 4
1466
1467 /* ASAN redzone buffer container that handles emission of shadow bytes. */
1468 class asan_redzone_buffer
1469 {
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)
1475 {}
1476
1477 /* Emit VALUE shadow byte at a given OFFSET. */
1478 void emit_redzone_byte (HOST_WIDE_INT offset, unsigned char value);
1479
1480 /* Emit RTX emission of the content of the buffer. */
1481 void flush_redzone_payload (void);
1482
1483 private:
1484 /* Flush if the content of the buffer is full
1485 (equal to RZ_BUFFER_SIZE). */
1486 void flush_if_full (void);
1487
1488 /* Memory where we last emitted a redzone payload. */
1489 rtx m_shadow_mem;
1490
1491 /* Relative offset where we last emitted a redzone payload. */
1492 HOST_WIDE_INT m_prev_offset;
1493
1494 /* Relative original offset. Used for checking only. */
1495 HOST_WIDE_INT m_original_offset;
1496
1497 public:
1498 /* Buffer with redzone payload. */
1499 auto_vec<unsigned char> m_shadow_bytes;
1500 };
1501
1502 /* Emit VALUE shadow byte at a given OFFSET. */
1503
1504 void
1505 asan_redzone_buffer::emit_redzone_byte (HOST_WIDE_INT offset,
1506 unsigned char value)
1507 {
1508 gcc_assert ((offset & (ASAN_SHADOW_GRANULARITY - 1)) == 0);
1509 gcc_assert (offset >= m_prev_offset);
1510
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 ())
1518 {
1519 /* Shadow memory byte with a small gap. */
1520 for (; off < offset; off += ASAN_SHADOW_GRANULARITY)
1521 m_shadow_bytes.safe_push (0);
1522 }
1523 else
1524 {
1525 if (!m_shadow_bytes.is_empty ())
1526 flush_redzone_payload ();
1527
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)
1531 {
1532 offset -= align;
1533 for (unsigned i = 0; i < align / BITS_PER_UNIT; i++)
1534 m_shadow_bytes.safe_push (0);
1535 }
1536
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;
1542 }
1543 m_shadow_bytes.safe_push (value);
1544 flush_if_full ();
1545 }
1546
1547 /* Emit RTX emission of the content of the buffer. */
1548
1549 void
1550 asan_redzone_buffer::flush_redzone_payload (void)
1551 {
1552 gcc_assert (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN);
1553
1554 if (m_shadow_bytes.is_empty ())
1555 return;
1556
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);
1560
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);
1565
1566 if (dump_file && (dump_flags & TDF_DETAILS))
1567 fprintf (dump_file,
1568 "Flushing rzbuffer at offset %" PRId64 " with: ", m_prev_offset);
1569
1570 unsigned HOST_WIDE_INT val = 0;
1571 for (unsigned i = 0; i < RZ_BUFFER_SIZE; i++)
1572 {
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);
1578 }
1579
1580 if (dump_file && (dump_flags & TDF_DETAILS))
1581 fprintf (dump_file, "\n");
1582
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);
1587 }
1588
1589 /* Flush if the content of the buffer is full
1590 (equal to RZ_BUFFER_SIZE). */
1591
1592 void
1593 asan_redzone_buffer::flush_if_full (void)
1594 {
1595 if (m_shadow_bytes.length () == RZ_BUFFER_SIZE)
1596 flush_redzone_payload ();
1597 }
1598
1599
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/
1604
1605 Similar to AddressSanitizer (asan) it consists of two parts: the
1606 instrumentation module in this file, and a run-time library.
1607
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).
1615
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.
1619
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.
1629
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.
1635
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.
1640
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.
1646
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.
1652
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.
1657
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).
1662
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.
1667
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.
1673
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).
1684
1685 As a demonstration, using the same example program as in the asan block
1686 comment above:
1687
1688 int
1689 foo ()
1690 {
1691 char a[24] = {0};
1692 int b[2] = {0};
1693
1694 a[5] = 1;
1695 b[1] = 2;
1696
1697 return a[5] + b[1];
1698 }
1699
1700 On AArch64 the stack will be ordered as follows for the above function:
1701
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]
1706
1707 (The padding is there to ensure 16 byte alignment as described in the 16
1708 byte granule implications).
1709
1710 While the shadow memory will be ordered as follows:
1711
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.
1714
1715 And any pointer to "a" will have the tag RFT + 1, and any pointer to "b"
1716 will have the tag RFT + 2.
1717
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.
1723
1724 Architectures where this feature is available should indicate this using
1725 the TARGET_MEMTAG_CAN_TAG_ADDRESSES hook.
1726
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.
1735
1736 Hence we place untagging code on every epilogue of functions which tag some
1737 stack objects.
1738
1739 Moreover, the run-time library intercepts longjmp & setjmp to untag when
1740 the stack is unwound this way.
1741
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. */
1747
1748
1749 /* Returns whether we are tagging pointers and checking those tags on memory
1750 access. */
1751 bool
1752 hwasan_sanitize_p ()
1753 {
1754 return sanitize_flags_p (SANITIZE_HWADDRESS);
1755 }
1756
1757 /* Are we tagging the stack? */
1758 bool
1759 hwasan_sanitize_stack_p ()
1760 {
1761 return (hwasan_sanitize_p () && param_hwasan_instrument_stack);
1762 }
1763
1764 /* Are we tagging alloca objects? */
1765 bool
1766 hwasan_sanitize_allocas_p (void)
1767 {
1768 return (hwasan_sanitize_stack_p () && param_hwasan_instrument_allocas);
1769 }
1770
1771 /* Should we instrument reads? */
1772 bool
1773 hwasan_instrument_reads (void)
1774 {
1775 return (hwasan_sanitize_p () && param_hwasan_instrument_reads);
1776 }
1777
1778 /* Should we instrument writes? */
1779 bool
1780 hwasan_instrument_writes (void)
1781 {
1782 return (hwasan_sanitize_p () && param_hwasan_instrument_writes);
1783 }
1784
1785 /* Should we instrument builtin calls? */
1786 bool
1787 hwasan_memintrin (void)
1788 {
1789 return (hwasan_sanitize_p () && param_hwasan_instrument_mem_intrinsics);
1790 }
1791
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. */
1804
1805 rtx_insn *
1806 asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
1807 HOST_WIDE_INT *offsets, tree *decls, int length)
1808 {
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;
1821
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;
1826
1827 if (shadow_ptr_types[0] == NULL_TREE)
1828 asan_init_shadow_ptr_types ();
1829
1830 expanded_location cfun_xloc
1831 = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1832
1833 /* First of all, prepare the description string. */
1834 pretty_printer asan_pp;
1835
1836 pp_decimal_int (&asan_pp, length / 2 - 1);
1837 pp_space (&asan_pp);
1838 for (l = length - 2; l; l -= 2)
1839 {
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);
1845
1846 expanded_location xloc
1847 = expand_location (DECL_SOURCE_LOCATION (decl));
1848 char location[32];
1849
1850 if (xloc.file == cfun_xloc.file)
1851 sprintf (location, ":%d", xloc.line);
1852 else
1853 location[0] = '\0';
1854
1855 if (DECL_P (decl) && DECL_NAME (decl))
1856 {
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);
1863 }
1864 else
1865 pp_string (&asan_pp, "9 <unknown>");
1866
1867 if (l > 2)
1868 pp_space (&asan_pp);
1869 }
1870 str_cst = asan_pp_string (&asan_pp);
1871
1872 /* Emit the prologue sequence. */
1873 if (asan_frame_size > 32 && asan_frame_size <= 65536 && pbase
1874 && param_asan_use_after_return)
1875 {
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;
1885 }
1886
1887 /* Align base if target is STRICT_ALIGNMENT. */
1888 if (STRICT_ALIGNMENT)
1889 {
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);
1894 }
1895
1896 if (use_after_return_class == -1 && pbase)
1897 emit_move_insn (pbase, base);
1898
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)
1904 {
1905 if (asan_detect_stack_use_after_return == NULL_TREE)
1906 {
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;
1919 }
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));
1947 }
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;
1984
1985 asan_redzone_buffer rz_buffer (shadow_mem, prev_offset);
1986 for (l = length; l; l -= 2)
1987 {
1988 if (l == 2)
1989 cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
1990 offset = offsets[l - 1];
1991
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)
1998 {
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;
2004 }
2005
2006 /* Calculate size of red zone payload. */
2007 while (offset < offsets[l - 2])
2008 {
2009 rz_buffer.emit_redzone_byte (offset, cur_shadow_byte);
2010 offset += ASAN_SHADOW_GRANULARITY;
2011 }
2012
2013 cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
2014 }
2015
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 ());
2020
2021 do_pending_stack_adjust ();
2022
2023 /* Construct epilogue sequence. */
2024 start_sequence ();
2025
2026 lab = NULL;
2027 if (use_after_return_class != -1)
2028 {
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))
2043 {
2044 /* Emit:
2045 memset(ShadowBase, kAsanStackAfterReturnMagic, ShadowSize);
2046 **SavedFlagPtr(FakeStack, class_id) = 0
2047 */
2048 store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c,
2049 BITS_PER_UNIT, true, RETURN_BEGIN);
2050
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);
2061 }
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))
2068 {
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);
2078 }
2079 lab = gen_label_rtx ();
2080 emit_jump (lab);
2081 emit_label (lab2);
2082 }
2083
2084 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
2085 set_mem_alias_set (shadow_mem, asan_shadow_set);
2086
2087 if (STRICT_ALIGNMENT)
2088 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
2089
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)
2095 {
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)
2099 {
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;
2107 }
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;
2113
2114 /* Unpoison shadow memory that corresponds to a variable that is
2115 is subject of use-after-return sanitization. */
2116 if (l > 2)
2117 {
2118 decl = decls[l / 2 - 2];
2119 if (asan_handled_variables != NULL
2120 && asan_handled_variables->contains (decl))
2121 {
2122 HOST_WIDE_INT size = offsets[l - 3] - offsets[l - 2];
2123 if (dump_file && (dump_flags & TDF_DETAILS))
2124 {
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);
2130 }
2131
2132 last_size += size & ~(ASAN_MIN_RED_ZONE_SIZE - HOST_WIDE_INT_1);
2133 }
2134 }
2135 last_size_aligned
2136 = ((last_size + (ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
2137 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
2138 }
2139 if (last_size_aligned)
2140 {
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);
2145 }
2146
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;
2152
2153 do_pending_stack_adjust ();
2154 if (lab)
2155 emit_label (lab);
2156
2157 insns = get_insns ();
2158 end_sequence ();
2159 return insns;
2160 }
2161
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. */
2165
2166 rtx_insn *
2167 asan_emit_allocas_unpoison (rtx top, rtx bot, rtx_insn *before)
2168 {
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);
2178
2179 do_pending_stack_adjust ();
2180 rtx_insn *insns = get_insns ();
2181 end_sequence ();
2182 return insns;
2183 }
2184
2185 /* Return true if DECL, a global var, might be overridden and needs
2186 therefore a local alias. */
2187
2188 static bool
2189 asan_needs_local_alias (tree decl)
2190 {
2191 return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
2192 }
2193
2194 /* Return true if DECL, a global var, is an artificial ODR indicator symbol
2195 therefore doesn't need protection. */
2196
2197 static bool
2198 is_odr_indicator (tree decl)
2199 {
2200 return (DECL_ARTIFICIAL (decl)
2201 && lookup_attribute ("asan odr indicator", DECL_ATTRIBUTES (decl)));
2202 }
2203
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. */
2208
2209 bool
2210 asan_protect_global (tree decl, bool ignore_decl_rtl_set_p)
2211 {
2212 if (!param_asan_globals)
2213 return false;
2214
2215 rtx rtl, symbol;
2216
2217 if (TREE_CODE (decl) == STRING_CST)
2218 {
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;
2226 }
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;
2262
2263 if (!ignore_decl_rtl_set_p || DECL_RTL_SET_P (decl))
2264 {
2265
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);
2270
2271 if (CONSTANT_POOL_ADDRESS_P (symbol)
2272 || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
2273 return false;
2274 }
2275
2276 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
2277 return false;
2278
2279 if (!TARGET_SUPPORTS_ALIASES && asan_needs_local_alias (decl))
2280 return false;
2281
2282 return true;
2283 }
2284
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). */
2287
2288 static tree
2289 report_error_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2290 int *nargs)
2291 {
2292 gcc_assert (!hwasan_sanitize_p ());
2293
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)
2314 {
2315 *nargs = 2;
2316 return builtin_decl_implicit (report[recover_p][is_store][5]);
2317 }
2318 *nargs = 1;
2319 int size_log2 = exact_log2 (size_in_bytes);
2320 return builtin_decl_implicit (report[recover_p][is_store][size_log2]);
2321 }
2322
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). */
2325
2326 static tree
2327 check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2328 int *nargs)
2329 {
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)
2350 {
2351 *nargs = 2;
2352 return builtin_decl_implicit (check[recover_p][is_store][5]);
2353 }
2354 *nargs = 1;
2355 int size_log2 = exact_log2 (size_in_bytes);
2356 return builtin_decl_implicit (check[recover_p][is_store][size_log2]);
2357 }
2358
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.
2363
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.
2368
2369 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
2370 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
2371
2372 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
2373 block' of the condition statement to be inserted by the caller.
2374
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.
2378
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. */
2383
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)
2391 {
2392 gimple_stmt_iterator gsi = *iter;
2393
2394 if (!gsi_end_p (gsi) && before_p)
2395 gsi_prev (&gsi);
2396
2397 basic_block cur_bb = gsi_bb (*iter);
2398
2399 edge e = split_block (cur_bb, gsi_stmt (gsi));
2400
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)
2407 {
2408 add_bb_to_loop (then_bb, cond_bb->loop_father);
2409 loops_state_set (LOOPS_NEED_FIXUP);
2410 }
2411
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);
2422
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;
2427
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);
2433
2434 *then_block = then_bb;
2435 *fallthrough_block = fallthru_bb;
2436 *iter = gsi_start_bb (fallthru_bb);
2437
2438 return gsi_last_bb (cond_bb);
2439 }
2440
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.
2446
2447 COND is the condition of the if.
2448
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.
2452
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.
2456
2457 *ITER is adjusted to still point to the same statement it was
2458 pointing to initially. */
2459
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)
2466 {
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);
2475 }
2476
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. */
2480
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)
2485 {
2486 tree t, uintptr_type = TREE_TYPE (base_addr);
2487 tree shadow_type = TREE_TYPE (shadow_ptr_type);
2488 gimple *g;
2489
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);
2495
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);
2501
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);
2506
2507 if (!return_address)
2508 {
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);
2514 }
2515
2516 return gimple_assign_lhs (g);
2517 }
2518
2519 /* BASE can already be an SSA_NAME; in that case, do not create a
2520 new SSA_NAME for it. */
2521
2522 static tree
2523 maybe_create_ssa_name (location_t loc, tree base, gimple_stmt_iterator *iter,
2524 bool before_p)
2525 {
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);
2536 }
2537
2538 /* LEN can already have necessary size and precision;
2539 in that case, do not create a new variable. */
2540
2541 tree
2542 maybe_cast_to_ptrmode (location_t loc, tree len, gimple_stmt_iterator *iter,
2543 bool before_p)
2544 {
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);
2555 }
2556
2557 /* Instrument the memory access instruction BASE. Insert new
2558 statements before or after ITER.
2559
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.
2568
2569 START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
2570 memory region have already been instrumented.
2571
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. */
2575
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)
2581 {
2582 gimple_stmt_iterator gsi = *iter;
2583 gimple *g;
2584
2585 gcc_assert (!(size_in_bytes > 0 && !is_non_zero_len));
2586 gcc_assert (size_in_bytes == -1 || size_in_bytes >= 1);
2587
2588 gsi = *iter;
2589
2590 base = unshare_expr (base);
2591 base = maybe_create_ssa_name (loc, base, &gsi, before_p);
2592
2593 if (len)
2594 {
2595 len = unshare_expr (len);
2596 len = maybe_cast_to_ptrmode (loc, len, iter, before_p);
2597 }
2598 else
2599 {
2600 gcc_assert (size_in_bytes != -1);
2601 len = build_int_cst (pointer_sized_int_node, size_in_bytes);
2602 }
2603
2604 if (size_in_bytes > 1)
2605 {
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)
2610 {
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;
2620 }
2621 }
2622
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;
2630
2631 enum internal_fn fn = hwasan_sanitize_p ()
2632 ? IFN_HWASAN_CHECK
2633 : IFN_ASAN_CHECK;
2634
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
2644 {
2645 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2646 gsi_next (&gsi);
2647 *iter = gsi;
2648 }
2649 }
2650
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). */
2654
2655 static void
2656 instrument_derefs (gimple_stmt_iterator *iter, tree t,
2657 location_t location, bool is_store)
2658 {
2659 if (is_store && !(asan_instrument_writes () || hwasan_instrument_writes ()))
2660 return;
2661 if (!is_store && !(asan_instrument_reads () || hwasan_instrument_reads ()))
2662 return;
2663
2664 tree type, base;
2665 HOST_WIDE_INT size_in_bytes;
2666 if (location == UNKNOWN_LOCATION)
2667 location = EXPR_LOCATION (t);
2668
2669 type = TREE_TYPE (t);
2670 switch (TREE_CODE (t))
2671 {
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;
2682 }
2683
2684 size_in_bytes = int_size_in_bytes (type);
2685 if (size_in_bytes <= 0)
2686 return;
2687
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);
2694
2695 if (TREE_CODE (t) == COMPONENT_REF
2696 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
2697 {
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;
2704 }
2705
2706 if (!multiple_p (bitpos, BITS_PER_UNIT)
2707 || maybe_ne (bitsize, size_in_bytes * BITS_PER_UNIT))
2708 return;
2709
2710 if (VAR_P (inner) && DECL_HARD_REGISTER (inner))
2711 return;
2712
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))
2719 {
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))
2730 {
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;
2737 }
2738 /* Always instrument external vars, they might be dynamically
2739 initialized. */
2740 else if (!DECL_EXTERNAL (inner))
2741 {
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;
2747 }
2748 }
2749
2750 if (DECL_P (inner)
2751 && decl_function_context (inner) == current_function_decl
2752 && !TREE_ADDRESSABLE (inner))
2753 mark_addressable (inner);
2754
2755 base = build_fold_addr_expr (t);
2756 if (!has_mem_ref_been_instrumented (base, size_in_bytes))
2757 {
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);
2764 }
2765
2766 }
2767
2768 /* Insert a memory reference into the hash table if access length
2769 can be determined in compile time. */
2770
2771 static void
2772 maybe_update_mem_ref_hash_table (tree base, tree len)
2773 {
2774 if (!POINTER_TYPE_P (TREE_TYPE (base))
2775 || !INTEGRAL_TYPE_P (TREE_TYPE (len)))
2776 return;
2777
2778 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2779
2780 if (size_in_bytes != -1)
2781 update_mem_ref_hash_table (base, size_in_bytes);
2782 }
2783
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. */
2791
2792 static void
2793 instrument_mem_region_access (tree base, tree len,
2794 gimple_stmt_iterator *iter,
2795 location_t location, bool is_store)
2796 {
2797 if (!POINTER_TYPE_P (TREE_TYPE (base))
2798 || !INTEGRAL_TYPE_P (TREE_TYPE (len))
2799 || integer_zerop (len))
2800 return;
2801
2802 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2803
2804 if ((size_in_bytes == -1)
2805 || !has_mem_ref_been_instrumented (base, size_in_bytes))
2806 {
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);
2810 }
2811
2812 maybe_update_mem_ref_hash_table (base, len);
2813 *iter = gsi_for_stmt (gsi_stmt (*iter));
2814 }
2815
2816 /* Instrument the call to a built-in memory access function that is
2817 pointed to by the iterator ITER.
2818
2819 Upon completion, return TRUE iff *ITER has been advanced to the
2820 statement following the one it was originally pointing to. */
2821
2822 static bool
2823 instrument_builtin_call (gimple_stmt_iterator *iter)
2824 {
2825 if (!(asan_memintrin () || hwasan_memintrin ()))
2826 return false;
2827
2828 bool iter_advanced_p = false;
2829 gcall *call = as_a <gcall *> (gsi_stmt (*iter));
2830
2831 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
2832
2833 location_t loc = gimple_location (call);
2834
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);
2839
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;
2843
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))
2849 {
2850 if (dest_is_deref)
2851 {
2852 instrument_derefs (iter, dest.start, loc, dest_is_store);
2853 gsi_next (iter);
2854 iter_advanced_p = true;
2855 }
2856 else if (!intercepted_p
2857 && (src0_len || src1_len || dest_len))
2858 {
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);
2868
2869 *iter = gsi_for_stmt (call);
2870 gsi_next (iter);
2871 iter_advanced_p = true;
2872 }
2873 else
2874 {
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);
2881 }
2882 }
2883 return iter_advanced_p;
2884 }
2885
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. */
2892
2893 static bool
2894 maybe_instrument_assignment (gimple_stmt_iterator *iter)
2895 {
2896 gimple *s = gsi_stmt (*iter);
2897
2898 gcc_assert (gimple_assign_single_p (s));
2899
2900 tree ref_expr = NULL_TREE;
2901 bool is_store, is_instrumented = false;
2902
2903 if (gimple_store_p (s))
2904 {
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;
2911 }
2912
2913 if (gimple_assign_load_p (s))
2914 {
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;
2921 }
2922
2923 if (is_instrumented)
2924 gsi_next (iter);
2925
2926 return is_instrumented;
2927 }
2928
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.
2933
2934 Upon completion return TRUE iff *ITER was advanced to the statement
2935 following the one it was originally pointing to. */
2936
2937 static bool
2938 maybe_instrument_call (gimple_stmt_iterator *iter)
2939 {
2940 gimple *stmt = gsi_stmt (*iter);
2941 bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
2942
2943 if (is_builtin && instrument_builtin_call (iter))
2944 return true;
2945
2946 if (gimple_call_noreturn_p (stmt))
2947 {
2948 if (is_builtin)
2949 {
2950 tree callee = gimple_call_fndecl (stmt);
2951 switch (DECL_FUNCTION_CODE (callee))
2952 {
2953 case BUILT_IN_UNREACHABLE:
2954 case BUILT_IN_TRAP:
2955 /* Don't instrument these. */
2956 return false;
2957 default:
2958 break;
2959 }
2960 }
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.
2966
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 ())
2976 {
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);
2981 }
2982 }
2983
2984 bool instrumented = false;
2985 if (gimple_store_p (stmt))
2986 {
2987 tree ref_expr = gimple_call_lhs (stmt);
2988 instrument_derefs (iter, ref_expr,
2989 gimple_location (stmt),
2990 /*is_store=*/true);
2991
2992 instrumented = true;
2993 }
2994
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)
2998 {
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))
3006 {
3007 instrument_derefs (iter, arg,
3008 gimple_location (stmt),
3009 /*is_store=*/false);
3010 instrumented = true;
3011 }
3012 }
3013 if (instrumented)
3014 gsi_next (iter);
3015 return instrumented;
3016 }
3017
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. */
3022
3023 static void
3024 transform_statements (void)
3025 {
3026 basic_block bb, last_bb = NULL;
3027 gimple_stmt_iterator i;
3028 int saved_last_basic_block = last_basic_block_for_fn (cfun);
3029
3030 FOR_EACH_BB_FN (bb, cfun)
3031 {
3032 basic_block prev_bb = bb;
3033
3034 if (bb->index >= saved_last_basic_block) continue;
3035
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))
3042 {
3043 prev_bb = single_pred (prev_bb);
3044 if (prev_bb->index < saved_last_basic_block)
3045 break;
3046 }
3047 if (prev_bb != last_bb)
3048 empty_mem_ref_hash_table ();
3049 last_bb = bb;
3050
3051 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
3052 {
3053 gimple *s = gsi_stmt (i);
3054
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
3066 {
3067 /* No instrumentation happened.
3068
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 ();
3078
3079 gsi_next (&i);
3080 }
3081 }
3082 }
3083 free_mem_ref_resources ();
3084 }
3085
3086 /* Build
3087 __asan_before_dynamic_init (module_name)
3088 or
3089 __asan_after_dynamic_init ()
3090 call. */
3091
3092 tree
3093 asan_dynamic_init_call (bool after_p)
3094 {
3095 if (shadow_ptr_types[0] == NULL_TREE)
3096 asan_init_shadow_ptr_types ();
3097
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)
3103 {
3104 pretty_printer module_name_pp;
3105 pp_string (&module_name_pp, main_input_filename);
3106
3107 module_name_cst = asan_pp_string (&module_name_pp);
3108 module_name_cst = fold_convert (const_ptr_type_node,
3109 module_name_cst);
3110 }
3111
3112 return build_call_expr (fn, after_p ? 0 : 1, module_name_cst);
3113 }
3114
3115 /* Build
3116 struct __asan_global
3117 {
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. */
3127
3128 static tree
3129 asan_global_struct (void)
3130 {
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;
3137
3138 ret = make_node (RECORD_TYPE);
3139 for (i = 0; i < ARRAY_SIZE (field_names); i++)
3140 {
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];
3149 }
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;
3160 }
3161
3162 /* Create and return odr indicator symbol for DECL.
3163 TYPE is __asan_global struct type as returned by asan_global_struct. */
3164
3165 static tree
3166 create_odr_indicator (tree decl, tree type)
3167 {
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);
3198
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));
3210 }
3211
3212 /* Return true if DECL, a global var, might be overridden and needs
3213 an additional odr indicator symbol. */
3214
3215 static bool
3216 asan_needs_odr_indicator_p (tree decl)
3217 {
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));
3228 }
3229
3230 /* Append description of a single global DECL into vector V.
3231 TYPE is __asan_global struct type as returned by asan_global_struct. */
3232
3233 static void
3234 asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
3235 {
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;
3240
3241 pretty_printer asan_pp, module_name_pp;
3242
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);
3248
3249 if (!in_lto_p)
3250 pp_string (&module_name_pp, main_input_filename);
3251 else
3252 {
3253 const_tree tu = get_ultimate_context ((const_tree)decl);
3254 if (tu != NULL_TREE)
3255 pp_string (&module_name_pp, IDENTIFIER_POINTER (DECL_NAME (tu)));
3256 else
3257 pp_string (&module_name_pp, aux_base_name);
3258 }
3259
3260 module_name_cst = asan_pp_string (&module_name_pp);
3261
3262 if (asan_needs_local_alias (decl))
3263 {
3264 char buf[20];
3265 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
3266 refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
3267 VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
3268 TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
3269 TREE_READONLY (refdecl) = TREE_READONLY (decl);
3270 TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
3271 DECL_NOT_GIMPLE_REG_P (refdecl) = DECL_NOT_GIMPLE_REG_P (decl);
3272 DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
3273 DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
3274 TREE_STATIC (refdecl) = 1;
3275 TREE_PUBLIC (refdecl) = 0;
3276 TREE_USED (refdecl) = 1;
3277 assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
3278 }
3279
3280 tree odr_indicator_ptr
3281 = (asan_needs_odr_indicator_p (decl) ? create_odr_indicator (decl, type)
3282 : build_int_cst (uptr, 0));
3283 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3284 fold_convert (const_ptr_type_node,
3285 build_fold_addr_expr (refdecl)));
3286 size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
3287 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3288 size += asan_red_zone_size (size);
3289 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3290 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3291 fold_convert (const_ptr_type_node, str_cst));
3292 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3293 fold_convert (const_ptr_type_node, module_name_cst));
3294 varpool_node *vnode = varpool_node::get (decl);
3295 int has_dynamic_init = 0;
3296 /* FIXME: Enable initialization order fiasco detection in LTO mode once
3297 proper fix for PR 79061 will be applied. */
3298 if (!in_lto_p)
3299 has_dynamic_init = vnode ? vnode->dynamically_initialized : 0;
3300 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3301 build_int_cst (uptr, has_dynamic_init));
3302 tree locptr = NULL_TREE;
3303 location_t loc = DECL_SOURCE_LOCATION (decl);
3304 expanded_location xloc = expand_location (loc);
3305 if (xloc.file != NULL)
3306 {
3307 static int lasanloccnt = 0;
3308 char buf[25];
3309 ASM_GENERATE_INTERNAL_LABEL (buf, "LASANLOC", ++lasanloccnt);
3310 tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3311 ubsan_get_source_location_type ());
3312 TREE_STATIC (var) = 1;
3313 TREE_PUBLIC (var) = 0;
3314 DECL_ARTIFICIAL (var) = 1;
3315 DECL_IGNORED_P (var) = 1;
3316 pretty_printer filename_pp;
3317 pp_string (&filename_pp, xloc.file);
3318 tree str = asan_pp_string (&filename_pp);
3319 tree ctor = build_constructor_va (TREE_TYPE (var), 3,
3320 NULL_TREE, str, NULL_TREE,
3321 build_int_cst (unsigned_type_node,
3322 xloc.line), NULL_TREE,
3323 build_int_cst (unsigned_type_node,
3324 xloc.column));
3325 TREE_CONSTANT (ctor) = 1;
3326 TREE_STATIC (ctor) = 1;
3327 DECL_INITIAL (var) = ctor;
3328 varpool_node::finalize_decl (var);
3329 locptr = fold_convert (uptr, build_fold_addr_expr (var));
3330 }
3331 else
3332 locptr = build_int_cst (uptr, 0);
3333 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, locptr);
3334 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, odr_indicator_ptr);
3335 init = build_constructor (type, vinner);
3336 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
3337 }
3338
3339 /* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
3340 void
3341 initialize_sanitizer_builtins (void)
3342 {
3343 tree decl;
3344
3345 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
3346 return;
3347
3348 tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
3349 tree BT_FN_VOID_PTR
3350 = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
3351 tree BT_FN_VOID_CONST_PTR
3352 = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
3353 tree BT_FN_VOID_PTR_PTR
3354 = build_function_type_list (void_type_node, ptr_type_node,
3355 ptr_type_node, NULL_TREE);
3356 tree BT_FN_VOID_PTR_PTR_PTR
3357 = build_function_type_list (void_type_node, ptr_type_node,
3358 ptr_type_node, ptr_type_node, NULL_TREE);
3359 tree BT_FN_VOID_PTR_PTRMODE
3360 = build_function_type_list (void_type_node, ptr_type_node,
3361 pointer_sized_int_node, NULL_TREE);
3362 tree BT_FN_VOID_INT
3363 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
3364 tree BT_FN_SIZE_CONST_PTR_INT
3365 = build_function_type_list (size_type_node, const_ptr_type_node,
3366 integer_type_node, NULL_TREE);
3367
3368 tree BT_FN_VOID_UINT8_UINT8
3369 = build_function_type_list (void_type_node, unsigned_char_type_node,
3370 unsigned_char_type_node, NULL_TREE);
3371 tree BT_FN_VOID_UINT16_UINT16
3372 = build_function_type_list (void_type_node, uint16_type_node,
3373 uint16_type_node, NULL_TREE);
3374 tree BT_FN_VOID_UINT32_UINT32
3375 = build_function_type_list (void_type_node, uint32_type_node,
3376 uint32_type_node, NULL_TREE);
3377 tree BT_FN_VOID_UINT64_UINT64
3378 = build_function_type_list (void_type_node, uint64_type_node,
3379 uint64_type_node, NULL_TREE);
3380 tree BT_FN_VOID_FLOAT_FLOAT
3381 = build_function_type_list (void_type_node, float_type_node,
3382 float_type_node, NULL_TREE);
3383 tree BT_FN_VOID_DOUBLE_DOUBLE
3384 = build_function_type_list (void_type_node, double_type_node,
3385 double_type_node, NULL_TREE);
3386 tree BT_FN_VOID_UINT64_PTR
3387 = build_function_type_list (void_type_node, uint64_type_node,
3388 ptr_type_node, NULL_TREE);
3389
3390 tree BT_FN_PTR_CONST_PTR_UINT8
3391 = build_function_type_list (ptr_type_node, const_ptr_type_node,
3392 unsigned_char_type_node, NULL_TREE);
3393 tree BT_FN_VOID_PTR_UINT8_PTRMODE
3394 = build_function_type_list (void_type_node, ptr_type_node,
3395 unsigned_char_type_node,
3396 pointer_sized_int_node, NULL_TREE);
3397
3398 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
3399 tree BT_FN_IX_CONST_VPTR_INT[5];
3400 tree BT_FN_IX_VPTR_IX_INT[5];
3401 tree BT_FN_VOID_VPTR_IX_INT[5];
3402 tree vptr
3403 = build_pointer_type (build_qualified_type (void_type_node,
3404 TYPE_QUAL_VOLATILE));
3405 tree cvptr
3406 = build_pointer_type (build_qualified_type (void_type_node,
3407 TYPE_QUAL_VOLATILE
3408 |TYPE_QUAL_CONST));
3409 tree boolt
3410 = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
3411 int i;
3412 for (i = 0; i < 5; i++)
3413 {
3414 tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
3415 BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
3416 = build_function_type_list (boolt, vptr, ptr_type_node, ix,
3417 integer_type_node, integer_type_node,
3418 NULL_TREE);
3419 BT_FN_IX_CONST_VPTR_INT[i]
3420 = build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
3421 BT_FN_IX_VPTR_IX_INT[i]
3422 = build_function_type_list (ix, vptr, ix, integer_type_node,
3423 NULL_TREE);
3424 BT_FN_VOID_VPTR_IX_INT[i]
3425 = build_function_type_list (void_type_node, vptr, ix,
3426 integer_type_node, NULL_TREE);
3427 }
3428 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
3429 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
3430 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
3431 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
3432 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
3433 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
3434 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
3435 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
3436 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
3437 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
3438 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
3439 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
3440 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
3441 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
3442 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
3443 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
3444 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
3445 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
3446 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
3447 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
3448 #undef ATTR_NOTHROW_LIST
3449 #define ATTR_NOTHROW_LIST ECF_NOTHROW
3450 #undef ATTR_NOTHROW_LEAF_LIST
3451 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
3452 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
3453 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
3454 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
3455 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
3456 #undef ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3457 #define ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST \
3458 ECF_CONST | ATTR_NORETURN_NOTHROW_LEAF_LIST
3459 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
3460 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
3461 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
3462 #undef ATTR_COLD_NOTHROW_LEAF_LIST
3463 #define ATTR_COLD_NOTHROW_LEAF_LIST \
3464 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
3465 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
3466 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
3467 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
3468 #undef ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST
3469 #define ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST \
3470 /* ECF_COLD missing */ ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3471 #undef ATTR_PURE_NOTHROW_LEAF_LIST
3472 #define ATTR_PURE_NOTHROW_LEAF_LIST ECF_PURE | ATTR_NOTHROW_LEAF_LIST
3473 #undef DEF_BUILTIN_STUB
3474 #define DEF_BUILTIN_STUB(ENUM, NAME)
3475 #undef DEF_SANITIZER_BUILTIN_1
3476 #define DEF_SANITIZER_BUILTIN_1(ENUM, NAME, TYPE, ATTRS) \
3477 do { \
3478 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
3479 BUILT_IN_NORMAL, NAME, NULL_TREE); \
3480 set_call_expr_flags (decl, ATTRS); \
3481 set_builtin_decl (ENUM, decl, true); \
3482 } while (0)
3483 #undef DEF_SANITIZER_BUILTIN
3484 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
3485 DEF_SANITIZER_BUILTIN_1 (ENUM, NAME, TYPE, ATTRS);
3486
3487 #include "sanitizer.def"
3488
3489 /* -fsanitize=object-size uses __builtin_object_size, but that might
3490 not be available for e.g. Fortran at this point. We use
3491 DEF_SANITIZER_BUILTIN here only as a convenience macro. */
3492 if ((flag_sanitize & SANITIZE_OBJECT_SIZE)
3493 && !builtin_decl_implicit_p (BUILT_IN_OBJECT_SIZE))
3494 DEF_SANITIZER_BUILTIN_1 (BUILT_IN_OBJECT_SIZE, "object_size",
3495 BT_FN_SIZE_CONST_PTR_INT,
3496 ATTR_PURE_NOTHROW_LEAF_LIST);
3497
3498 #undef DEF_SANITIZER_BUILTIN_1
3499 #undef DEF_SANITIZER_BUILTIN
3500 #undef DEF_BUILTIN_STUB
3501 }
3502
3503 /* Called via htab_traverse. Count number of emitted
3504 STRING_CSTs in the constant hash table. */
3505
3506 int
3507 count_string_csts (constant_descriptor_tree **slot,
3508 unsigned HOST_WIDE_INT *data)
3509 {
3510 struct constant_descriptor_tree *desc = *slot;
3511 if (TREE_CODE (desc->value) == STRING_CST
3512 && TREE_ASM_WRITTEN (desc->value)
3513 && asan_protect_global (desc->value))
3514 ++*data;
3515 return 1;
3516 }
3517
3518 /* Helper structure to pass two parameters to
3519 add_string_csts. */
3520
3521 struct asan_add_string_csts_data
3522 {
3523 tree type;
3524 vec<constructor_elt, va_gc> *v;
3525 };
3526
3527 /* Called via hash_table::traverse. Call asan_add_global
3528 on emitted STRING_CSTs from the constant hash table. */
3529
3530 int
3531 add_string_csts (constant_descriptor_tree **slot,
3532 asan_add_string_csts_data *aascd)
3533 {
3534 struct constant_descriptor_tree *desc = *slot;
3535 if (TREE_CODE (desc->value) == STRING_CST
3536 && TREE_ASM_WRITTEN (desc->value)
3537 && asan_protect_global (desc->value))
3538 {
3539 asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
3540 aascd->type, aascd->v);
3541 }
3542 return 1;
3543 }
3544
3545 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
3546 invoke ggc_collect. */
3547 static GTY(()) tree asan_ctor_statements;
3548
3549 /* Module-level instrumentation.
3550 - Insert __asan_init_vN() into the list of CTORs.
3551 - TODO: insert redzones around globals.
3552 */
3553
3554 void
3555 asan_finish_file (void)
3556 {
3557 varpool_node *vnode;
3558 unsigned HOST_WIDE_INT gcount = 0;
3559
3560 if (shadow_ptr_types[0] == NULL_TREE)
3561 asan_init_shadow_ptr_types ();
3562 /* Avoid instrumenting code in the asan ctors/dtors.
3563 We don't need to insert padding after the description strings,
3564 nor after .LASAN* array. */
3565 flag_sanitize &= ~SANITIZE_ADDRESS;
3566
3567 /* For user-space we want asan constructors to run first.
3568 Linux kernel does not support priorities other than default, and the only
3569 other user of constructors is coverage. So we run with the default
3570 priority. */
3571 int priority = flag_sanitize & SANITIZE_USER_ADDRESS
3572 ? MAX_RESERVED_INIT_PRIORITY - 1 : DEFAULT_INIT_PRIORITY;
3573
3574 if (flag_sanitize & SANITIZE_USER_ADDRESS)
3575 {
3576 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
3577 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3578 fn = builtin_decl_implicit (BUILT_IN_ASAN_VERSION_MISMATCH_CHECK);
3579 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3580 }
3581 FOR_EACH_DEFINED_VARIABLE (vnode)
3582 if (TREE_ASM_WRITTEN (vnode->decl)
3583 && asan_protect_global (vnode->decl))
3584 ++gcount;
3585 hash_table<tree_descriptor_hasher> *const_desc_htab = constant_pool_htab ();
3586 const_desc_htab->traverse<unsigned HOST_WIDE_INT *, count_string_csts>
3587 (&gcount);
3588 if (gcount)
3589 {
3590 tree type = asan_global_struct (), var, ctor;
3591 tree dtor_statements = NULL_TREE;
3592 vec<constructor_elt, va_gc> *v;
3593 char buf[20];
3594
3595 type = build_array_type_nelts (type, gcount);
3596 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
3597 var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3598 type);
3599 TREE_STATIC (var) = 1;
3600 TREE_PUBLIC (var) = 0;
3601 DECL_ARTIFICIAL (var) = 1;
3602 DECL_IGNORED_P (var) = 1;
3603 vec_alloc (v, gcount);
3604 FOR_EACH_DEFINED_VARIABLE (vnode)
3605 if (TREE_ASM_WRITTEN (vnode->decl)
3606 && asan_protect_global (vnode->decl))
3607 asan_add_global (vnode->decl, TREE_TYPE (type), v);
3608 struct asan_add_string_csts_data aascd;
3609 aascd.type = TREE_TYPE (type);
3610 aascd.v = v;
3611 const_desc_htab->traverse<asan_add_string_csts_data *, add_string_csts>
3612 (&aascd);
3613 ctor = build_constructor (type, v);
3614 TREE_CONSTANT (ctor) = 1;
3615 TREE_STATIC (ctor) = 1;
3616 DECL_INITIAL (var) = ctor;
3617 SET_DECL_ALIGN (var, MAX (DECL_ALIGN (var),
3618 ASAN_SHADOW_GRANULARITY * BITS_PER_UNIT));
3619
3620 varpool_node::finalize_decl (var);
3621
3622 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
3623 tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
3624 append_to_statement_list (build_call_expr (fn, 2,
3625 build_fold_addr_expr (var),
3626 gcount_tree),
3627 &asan_ctor_statements);
3628
3629 fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
3630 append_to_statement_list (build_call_expr (fn, 2,
3631 build_fold_addr_expr (var),
3632 gcount_tree),
3633 &dtor_statements);
3634 cgraph_build_static_cdtor ('D', dtor_statements, priority);
3635 }
3636 if (asan_ctor_statements)
3637 cgraph_build_static_cdtor ('I', asan_ctor_statements, priority);
3638 flag_sanitize |= SANITIZE_ADDRESS;
3639 }
3640
3641 /* Poison or unpoison (depending on IS_CLOBBER variable) shadow memory based
3642 on SHADOW address. Newly added statements will be added to ITER with
3643 given location LOC. We mark SIZE bytes in shadow memory, where
3644 LAST_CHUNK_SIZE is greater than zero in situation where we are at the
3645 end of a variable. */
3646
3647 static void
3648 asan_store_shadow_bytes (gimple_stmt_iterator *iter, location_t loc,
3649 tree shadow,
3650 unsigned HOST_WIDE_INT base_addr_offset,
3651 bool is_clobber, unsigned size,
3652 unsigned last_chunk_size)
3653 {
3654 tree shadow_ptr_type;
3655
3656 switch (size)
3657 {
3658 case 1:
3659 shadow_ptr_type = shadow_ptr_types[0];
3660 break;
3661 case 2:
3662 shadow_ptr_type = shadow_ptr_types[1];
3663 break;
3664 case 4:
3665 shadow_ptr_type = shadow_ptr_types[2];
3666 break;
3667 default:
3668 gcc_unreachable ();
3669 }
3670
3671 unsigned char c = (char) is_clobber ? ASAN_STACK_MAGIC_USE_AFTER_SCOPE : 0;
3672 unsigned HOST_WIDE_INT val = 0;
3673 unsigned last_pos = size;
3674 if (last_chunk_size && !is_clobber)
3675 last_pos = BYTES_BIG_ENDIAN ? 0 : size - 1;
3676 for (unsigned i = 0; i < size; ++i)
3677 {
3678 unsigned char shadow_c = c;
3679 if (i == last_pos)
3680 shadow_c = last_chunk_size;
3681 val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
3682 }
3683
3684 /* Handle last chunk in unpoisoning. */
3685 tree magic = build_int_cst (TREE_TYPE (shadow_ptr_type), val);
3686
3687 tree dest = build2 (MEM_REF, TREE_TYPE (shadow_ptr_type), shadow,
3688 build_int_cst (shadow_ptr_type, base_addr_offset));
3689
3690 gimple *g = gimple_build_assign (dest, magic);
3691 gimple_set_location (g, loc);
3692 gsi_insert_after (iter, g, GSI_NEW_STMT);
3693 }
3694
3695 /* Expand the ASAN_MARK builtins. */
3696
3697 bool
3698 asan_expand_mark_ifn (gimple_stmt_iterator *iter)
3699 {
3700 gimple *g = gsi_stmt (*iter);
3701 location_t loc = gimple_location (g);
3702 HOST_WIDE_INT flag = tree_to_shwi (gimple_call_arg (g, 0));
3703 bool is_poison = ((asan_mark_flags)flag) == ASAN_MARK_POISON;
3704
3705 tree base = gimple_call_arg (g, 1);
3706 gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
3707 tree decl = TREE_OPERAND (base, 0);
3708
3709 /* For a nested function, we can have: ASAN_MARK (2, &FRAME.2.fp_input, 4) */
3710 if (TREE_CODE (decl) == COMPONENT_REF
3711 && DECL_NONLOCAL_FRAME (TREE_OPERAND (decl, 0)))
3712 decl = TREE_OPERAND (decl, 0);
3713
3714 gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
3715
3716 if (hwasan_sanitize_p ())
3717 {
3718 gcc_assert (param_hwasan_instrument_stack);
3719 gimple_seq stmts = NULL;
3720 /* Here we swap ASAN_MARK calls for HWASAN_MARK.
3721 This is because we are using the approach of using ASAN_MARK as a
3722 synonym until here.
3723 That approach means we don't yet have to duplicate all the special
3724 cases for ASAN_MARK and ASAN_POISON with the exact same handling but
3725 called HWASAN_MARK etc.
3726
3727 N.b. __asan_poison_stack_memory (which implements ASAN_MARK for ASAN)
3728 rounds the size up to its shadow memory granularity, while
3729 __hwasan_tag_memory (which implements the same for HWASAN) does not.
3730 Hence we emit HWASAN_MARK with an aligned size unlike ASAN_MARK. */
3731 tree len = gimple_call_arg (g, 2);
3732 tree new_len = gimple_build_round_up (&stmts, loc, size_type_node, len,
3733 HWASAN_TAG_GRANULE_SIZE);
3734 gimple_build (&stmts, loc, CFN_HWASAN_MARK,
3735 void_type_node, gimple_call_arg (g, 0),
3736 base, new_len);
3737 gsi_replace_with_seq (iter, stmts, true);
3738 return false;
3739 }
3740
3741 if (is_poison)
3742 {
3743 if (asan_handled_variables == NULL)
3744 asan_handled_variables = new hash_set<tree> (16);
3745 asan_handled_variables->add (decl);
3746 }
3747 tree len = gimple_call_arg (g, 2);
3748
3749 gcc_assert (tree_fits_shwi_p (len));
3750 unsigned HOST_WIDE_INT size_in_bytes = tree_to_shwi (len);
3751 gcc_assert (size_in_bytes);
3752
3753 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3754 NOP_EXPR, base);
3755 gimple_set_location (g, loc);
3756 gsi_replace (iter, g, false);
3757 tree base_addr = gimple_assign_lhs (g);
3758
3759 /* Generate direct emission if size_in_bytes is small. */
3760 if (size_in_bytes
3761 <= (unsigned)param_use_after_scope_direct_emission_threshold)
3762 {
3763 const unsigned HOST_WIDE_INT shadow_size
3764 = shadow_mem_size (size_in_bytes);
3765 const unsigned int shadow_align
3766 = (get_pointer_alignment (base) / BITS_PER_UNIT) >> ASAN_SHADOW_SHIFT;
3767
3768 tree shadow = build_shadow_mem_access (iter, loc, base_addr,
3769 shadow_ptr_types[0], true);
3770
3771 for (unsigned HOST_WIDE_INT offset = 0; offset < shadow_size;)
3772 {
3773 unsigned size = 1;
3774 if (shadow_size - offset >= 4
3775 && (!STRICT_ALIGNMENT || shadow_align >= 4))
3776 size = 4;
3777 else if (shadow_size - offset >= 2
3778 && (!STRICT_ALIGNMENT || shadow_align >= 2))
3779 size = 2;
3780
3781 unsigned HOST_WIDE_INT last_chunk_size = 0;
3782 unsigned HOST_WIDE_INT s = (offset + size) * ASAN_SHADOW_GRANULARITY;
3783 if (s > size_in_bytes)
3784 last_chunk_size = ASAN_SHADOW_GRANULARITY - (s - size_in_bytes);
3785
3786 asan_store_shadow_bytes (iter, loc, shadow, offset, is_poison,
3787 size, last_chunk_size);
3788 offset += size;
3789 }
3790 }
3791 else
3792 {
3793 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3794 NOP_EXPR, len);
3795 gimple_set_location (g, loc);
3796 gsi_insert_before (iter, g, GSI_SAME_STMT);
3797 tree sz_arg = gimple_assign_lhs (g);
3798
3799 tree fun
3800 = builtin_decl_implicit (is_poison ? BUILT_IN_ASAN_POISON_STACK_MEMORY
3801 : BUILT_IN_ASAN_UNPOISON_STACK_MEMORY);
3802 g = gimple_build_call (fun, 2, base_addr, sz_arg);
3803 gimple_set_location (g, loc);
3804 gsi_insert_after (iter, g, GSI_NEW_STMT);
3805 }
3806
3807 return false;
3808 }
3809
3810 /* Expand the ASAN_{LOAD,STORE} builtins. */
3811
3812 bool
3813 asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
3814 {
3815 gcc_assert (!hwasan_sanitize_p ());
3816 gimple *g = gsi_stmt (*iter);
3817 location_t loc = gimple_location (g);
3818 bool recover_p;
3819 if (flag_sanitize & SANITIZE_USER_ADDRESS)
3820 recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
3821 else
3822 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
3823
3824 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
3825 gcc_assert (flags < ASAN_CHECK_LAST);
3826 bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
3827 bool is_store = (flags & ASAN_CHECK_STORE) != 0;
3828 bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
3829
3830 tree base = gimple_call_arg (g, 1);
3831 tree len = gimple_call_arg (g, 2);
3832 HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3));
3833
3834 HOST_WIDE_INT size_in_bytes
3835 = is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
3836
3837 if (use_calls)
3838 {
3839 /* Instrument using callbacks. */
3840 gimple *g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3841 NOP_EXPR, base);
3842 gimple_set_location (g, loc);
3843 gsi_insert_before (iter, g, GSI_SAME_STMT);
3844 tree base_addr = gimple_assign_lhs (g);
3845
3846 int nargs;
3847 tree fun = check_func (is_store, recover_p, size_in_bytes, &nargs);
3848 if (nargs == 1)
3849 g = gimple_build_call (fun, 1, base_addr);
3850 else
3851 {
3852 gcc_assert (nargs == 2);
3853 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3854 NOP_EXPR, len);
3855 gimple_set_location (g, loc);
3856 gsi_insert_before (iter, g, GSI_SAME_STMT);
3857 tree sz_arg = gimple_assign_lhs (g);
3858 g = gimple_build_call (fun, nargs, base_addr, sz_arg);
3859 }
3860 gimple_set_location (g, loc);
3861 gsi_replace (iter, g, false);
3862 return false;
3863 }
3864
3865 HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
3866
3867 tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
3868 tree shadow_type = TREE_TYPE (shadow_ptr_type);
3869
3870 gimple_stmt_iterator gsi = *iter;
3871
3872 if (!is_non_zero_len)
3873 {
3874 /* So, the length of the memory area to asan-protect is
3875 non-constant. Let's guard the generated instrumentation code
3876 like:
3877
3878 if (len != 0)
3879 {
3880 //asan instrumentation code goes here.
3881 }
3882 // falltrough instructions, starting with *ITER. */
3883
3884 g = gimple_build_cond (NE_EXPR,
3885 len,
3886 build_int_cst (TREE_TYPE (len), 0),
3887 NULL_TREE, NULL_TREE);
3888 gimple_set_location (g, loc);
3889
3890 basic_block then_bb, fallthrough_bb;
3891 insert_if_then_before_iter (as_a <gcond *> (g), iter,
3892 /*then_more_likely_p=*/true,
3893 &then_bb, &fallthrough_bb);
3894 /* Note that fallthrough_bb starts with the statement that was
3895 pointed to by ITER. */
3896
3897 /* The 'then block' of the 'if (len != 0) condition is where
3898 we'll generate the asan instrumentation code now. */
3899 gsi = gsi_last_bb (then_bb);
3900 }
3901
3902 /* Get an iterator on the point where we can add the condition
3903 statement for the instrumentation. */
3904 basic_block then_bb, else_bb;
3905 gsi = create_cond_insert_point (&gsi, /*before_p*/false,
3906 /*then_more_likely_p=*/false,
3907 /*create_then_fallthru_edge*/recover_p,
3908 &then_bb,
3909 &else_bb);
3910
3911 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3912 NOP_EXPR, base);
3913 gimple_set_location (g, loc);
3914 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
3915 tree base_addr = gimple_assign_lhs (g);
3916
3917 tree t = NULL_TREE;
3918 if (real_size_in_bytes >= 8)
3919 {
3920 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3921 shadow_ptr_type);
3922 t = shadow;
3923 }
3924 else
3925 {
3926 /* Slow path for 1, 2 and 4 byte accesses. */
3927 /* Test (shadow != 0)
3928 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow). */
3929 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3930 shadow_ptr_type);
3931 gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
3932 gimple_seq seq = NULL;
3933 gimple_seq_add_stmt (&seq, shadow_test);
3934 /* Aligned (>= 8 bytes) can test just
3935 (real_size_in_bytes - 1 >= shadow), as base_addr & 7 is known
3936 to be 0. */
3937 if (align < 8)
3938 {
3939 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
3940 base_addr, 7));
3941 gimple_seq_add_stmt (&seq,
3942 build_type_cast (shadow_type,
3943 gimple_seq_last (seq)));
3944 if (real_size_in_bytes > 1)
3945 gimple_seq_add_stmt (&seq,
3946 build_assign (PLUS_EXPR,
3947 gimple_seq_last (seq),
3948 real_size_in_bytes - 1));
3949 t = gimple_assign_lhs (gimple_seq_last_stmt (seq));
3950 }
3951 else
3952 t = build_int_cst (shadow_type, real_size_in_bytes - 1);
3953 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR, t, shadow));
3954 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
3955 gimple_seq_last (seq)));
3956 t = gimple_assign_lhs (gimple_seq_last (seq));
3957 gimple_seq_set_location (seq, loc);
3958 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
3959
3960 /* For non-constant, misaligned or otherwise weird access sizes,
3961 check first and last byte. */
3962 if (size_in_bytes == -1)
3963 {
3964 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3965 MINUS_EXPR, len,
3966 build_int_cst (pointer_sized_int_node, 1));
3967 gimple_set_location (g, loc);
3968 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3969 tree last = gimple_assign_lhs (g);
3970 g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3971 PLUS_EXPR, base_addr, last);
3972 gimple_set_location (g, loc);
3973 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3974 tree base_end_addr = gimple_assign_lhs (g);
3975
3976 tree shadow = build_shadow_mem_access (&gsi, loc, base_end_addr,
3977 shadow_ptr_type);
3978 gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
3979 gimple_seq seq = NULL;
3980 gimple_seq_add_stmt (&seq, shadow_test);
3981 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
3982 base_end_addr, 7));
3983 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
3984 gimple_seq_last (seq)));
3985 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
3986 gimple_seq_last (seq),
3987 shadow));
3988 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
3989 gimple_seq_last (seq)));
3990 gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
3991 gimple_seq_last (seq)));
3992 t = gimple_assign_lhs (gimple_seq_last (seq));
3993 gimple_seq_set_location (seq, loc);
3994 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
3995 }
3996 }
3997
3998 g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
3999 NULL_TREE, NULL_TREE);
4000 gimple_set_location (g, loc);
4001 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4002
4003 /* Generate call to the run-time library (e.g. __asan_report_load8). */
4004 gsi = gsi_start_bb (then_bb);
4005 int nargs;
4006 tree fun = report_error_func (is_store, recover_p, size_in_bytes, &nargs);
4007 g = gimple_build_call (fun, nargs, base_addr, len);
4008 gimple_set_location (g, loc);
4009 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4010
4011 gsi_remove (iter, true);
4012 *iter = gsi_start_bb (else_bb);
4013
4014 return true;
4015 }
4016
4017 /* Create ASAN shadow variable for a VAR_DECL which has been rewritten
4018 into SSA. Already seen VAR_DECLs are stored in SHADOW_VARS_MAPPING. */
4019
4020 static tree
4021 create_asan_shadow_var (tree var_decl,
4022 hash_map<tree, tree> &shadow_vars_mapping)
4023 {
4024 tree *slot = shadow_vars_mapping.get (var_decl);
4025 if (slot == NULL)
4026 {
4027 tree shadow_var = copy_node (var_decl);
4028
4029 copy_body_data id;
4030 memset (&id, 0, sizeof (copy_body_data));
4031 id.src_fn = id.dst_fn = current_function_decl;
4032 copy_decl_for_dup_finish (&id, var_decl, shadow_var);
4033
4034 DECL_ARTIFICIAL (shadow_var) = 1;
4035 DECL_IGNORED_P (shadow_var) = 1;
4036 DECL_SEEN_IN_BIND_EXPR_P (shadow_var) = 0;
4037 gimple_add_tmp_var (shadow_var);
4038
4039 shadow_vars_mapping.put (var_decl, shadow_var);
4040 return shadow_var;
4041 }
4042 else
4043 return *slot;
4044 }
4045
4046 /* Expand ASAN_POISON ifn. */
4047
4048 bool
4049 asan_expand_poison_ifn (gimple_stmt_iterator *iter,
4050 bool *need_commit_edge_insert,
4051 hash_map<tree, tree> &shadow_vars_mapping)
4052 {
4053 gimple *g = gsi_stmt (*iter);
4054 tree poisoned_var = gimple_call_lhs (g);
4055 if (!poisoned_var || has_zero_uses (poisoned_var))
4056 {
4057 gsi_remove (iter, true);
4058 return true;
4059 }
4060
4061 if (SSA_NAME_VAR (poisoned_var) == NULL_TREE)
4062 SET_SSA_NAME_VAR_OR_IDENTIFIER (poisoned_var,
4063 create_tmp_var (TREE_TYPE (poisoned_var)));
4064
4065 tree shadow_var = create_asan_shadow_var (SSA_NAME_VAR (poisoned_var),
4066 shadow_vars_mapping);
4067
4068 bool recover_p;
4069 if (flag_sanitize & SANITIZE_USER_ADDRESS)
4070 recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
4071 else
4072 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
4073 tree size = DECL_SIZE_UNIT (shadow_var);
4074 gimple *poison_call
4075 = gimple_build_call_internal (IFN_ASAN_MARK, 3,
4076 build_int_cst (integer_type_node,
4077 ASAN_MARK_POISON),
4078 build_fold_addr_expr (shadow_var), size);
4079
4080 gimple *use;
4081 imm_use_iterator imm_iter;
4082 FOR_EACH_IMM_USE_STMT (use, imm_iter, poisoned_var)
4083 {
4084 if (is_gimple_debug (use))
4085 continue;
4086
4087 int nargs;
4088 bool store_p = gimple_call_internal_p (use, IFN_ASAN_POISON_USE);
4089 gcall *call;
4090 if (hwasan_sanitize_p ())
4091 {
4092 tree fun = builtin_decl_implicit (BUILT_IN_HWASAN_TAG_MISMATCH4);
4093 /* NOTE: hwasan has no __hwasan_report_* functions like asan does.
4094 We use __hwasan_tag_mismatch4 with arguments that tell it the
4095 size of access and load to report all tag mismatches.
4096
4097 The arguments to this function are:
4098 Address of invalid access.
4099 Bitfield containing information about the access
4100 (access_info)
4101 Pointer to a frame of registers
4102 (for use in printing the contents of registers in a dump)
4103 Not used yet -- to be used by inline instrumentation.
4104 Size of access.
4105
4106 The access_info bitfield encodes the following pieces of
4107 information:
4108 - Is this a store or load?
4109 access_info & 0x10 => store
4110 - Should the program continue after reporting the error?
4111 access_info & 0x20 => recover
4112 - What size access is this (not used here since we can always
4113 pass the size in the last argument)
4114
4115 if (access_info & 0xf == 0xf)
4116 size is taken from last argument.
4117 else
4118 size == 1 << (access_info & 0xf)
4119
4120 The last argument contains the size of the access iff the
4121 access_info size indicator is 0xf (we always use this argument
4122 rather than storing the size in the access_info bitfield).
4123
4124 See the function definition `__hwasan_tag_mismatch4` in
4125 libsanitizer/hwasan for the full definition.
4126 */
4127 unsigned access_info = (0x20 * recover_p)
4128 + (0x10 * store_p)
4129 + (0xf);
4130 call = gimple_build_call (fun, 4,
4131 build_fold_addr_expr (shadow_var),
4132 build_int_cst (pointer_sized_int_node,
4133 access_info),
4134 build_int_cst (pointer_sized_int_node, 0),
4135 size);
4136 }
4137 else
4138 {
4139 tree fun = report_error_func (store_p, recover_p, tree_to_uhwi (size),
4140 &nargs);
4141 call = gimple_build_call (fun, 1,
4142 build_fold_addr_expr (shadow_var));
4143 }
4144 gimple_set_location (call, gimple_location (use));
4145 gimple *call_to_insert = call;
4146
4147 /* The USE can be a gimple PHI node. If so, insert the call on
4148 all edges leading to the PHI node. */
4149 if (is_a <gphi *> (use))
4150 {
4151 gphi *phi = dyn_cast<gphi *> (use);
4152 for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
4153 if (gimple_phi_arg_def (phi, i) == poisoned_var)
4154 {
4155 edge e = gimple_phi_arg_edge (phi, i);
4156
4157 /* Do not insert on an edge we can't split. */
4158 if (e->flags & EDGE_ABNORMAL)
4159 continue;
4160
4161 if (call_to_insert == NULL)
4162 call_to_insert = gimple_copy (call);
4163
4164 gsi_insert_seq_on_edge (e, call_to_insert);
4165 *need_commit_edge_insert = true;
4166 call_to_insert = NULL;
4167 }
4168 }
4169 else
4170 {
4171 gimple_stmt_iterator gsi = gsi_for_stmt (use);
4172 if (store_p)
4173 gsi_replace (&gsi, call, true);
4174 else
4175 gsi_insert_before (&gsi, call, GSI_NEW_STMT);
4176 }
4177 }
4178
4179 SSA_NAME_IS_DEFAULT_DEF (poisoned_var) = true;
4180 SSA_NAME_DEF_STMT (poisoned_var) = gimple_build_nop ();
4181 gsi_replace (iter, poison_call, false);
4182
4183 return true;
4184 }
4185
4186 /* Instrument the current function. */
4187
4188 static unsigned int
4189 asan_instrument (void)
4190 {
4191 if (hwasan_sanitize_p ())
4192 {
4193 transform_statements ();
4194 return 0;
4195 }
4196
4197 if (shadow_ptr_types[0] == NULL_TREE)
4198 asan_init_shadow_ptr_types ();
4199 transform_statements ();
4200 last_alloca_addr = NULL_TREE;
4201 return 0;
4202 }
4203
4204 static bool
4205 gate_asan (void)
4206 {
4207 return sanitize_flags_p (SANITIZE_ADDRESS);
4208 }
4209
4210 namespace {
4211
4212 const pass_data pass_data_asan =
4213 {
4214 GIMPLE_PASS, /* type */
4215 "asan", /* name */
4216 OPTGROUP_NONE, /* optinfo_flags */
4217 TV_NONE, /* tv_id */
4218 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4219 0, /* properties_provided */
4220 0, /* properties_destroyed */
4221 0, /* todo_flags_start */
4222 TODO_update_ssa, /* todo_flags_finish */
4223 };
4224
4225 class pass_asan : public gimple_opt_pass
4226 {
4227 public:
4228 pass_asan (gcc::context *ctxt)
4229 : gimple_opt_pass (pass_data_asan, ctxt)
4230 {}
4231
4232 /* opt_pass methods: */
4233 opt_pass * clone () { return new pass_asan (m_ctxt); }
4234 virtual bool gate (function *) { return gate_asan () || gate_hwasan (); }
4235 virtual unsigned int execute (function *) { return asan_instrument (); }
4236
4237 }; // class pass_asan
4238
4239 } // anon namespace
4240
4241 gimple_opt_pass *
4242 make_pass_asan (gcc::context *ctxt)
4243 {
4244 return new pass_asan (ctxt);
4245 }
4246
4247 namespace {
4248
4249 const pass_data pass_data_asan_O0 =
4250 {
4251 GIMPLE_PASS, /* type */
4252 "asan0", /* name */
4253 OPTGROUP_NONE, /* optinfo_flags */
4254 TV_NONE, /* tv_id */
4255 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4256 0, /* properties_provided */
4257 0, /* properties_destroyed */
4258 0, /* todo_flags_start */
4259 TODO_update_ssa, /* todo_flags_finish */
4260 };
4261
4262 class pass_asan_O0 : public gimple_opt_pass
4263 {
4264 public:
4265 pass_asan_O0 (gcc::context *ctxt)
4266 : gimple_opt_pass (pass_data_asan_O0, ctxt)
4267 {}
4268
4269 /* opt_pass methods: */
4270 virtual bool gate (function *)
4271 {
4272 return !optimize && (gate_asan () || gate_hwasan ());
4273 }
4274 virtual unsigned int execute (function *) { return asan_instrument (); }
4275
4276 }; // class pass_asan_O0
4277
4278 } // anon namespace
4279
4280 gimple_opt_pass *
4281 make_pass_asan_O0 (gcc::context *ctxt)
4282 {
4283 return new pass_asan_O0 (ctxt);
4284 }
4285
4286 /* HWASAN */
4287
4288 /* For stack tagging:
4289
4290 Return the offset from the frame base tag that the "next" expanded object
4291 should have. */
4292 uint8_t
4293 hwasan_current_frame_tag ()
4294 {
4295 return hwasan_frame_tag_offset;
4296 }
4297
4298 /* For stack tagging:
4299
4300 Return the 'base pointer' for this function. If that base pointer has not
4301 yet been created then we create a register to hold it and record the insns
4302 to initialize the register in `hwasan_frame_base_init_seq` for later
4303 emission. */
4304 rtx
4305 hwasan_frame_base ()
4306 {
4307 if (! hwasan_frame_base_ptr)
4308 {
4309 start_sequence ();
4310 hwasan_frame_base_ptr
4311 = force_reg (Pmode,
4312 targetm.memtag.insert_random_tag (virtual_stack_vars_rtx,
4313 NULL_RTX));
4314 hwasan_frame_base_init_seq = get_insns ();
4315 end_sequence ();
4316 }
4317
4318 return hwasan_frame_base_ptr;
4319 }
4320
4321 /* For stack tagging:
4322
4323 Check whether this RTX is a standard pointer addressing the base of the
4324 stack variables for this frame. Returns true if the RTX is either
4325 virtual_stack_vars_rtx or hwasan_frame_base_ptr. */
4326 bool
4327 stack_vars_base_reg_p (rtx base)
4328 {
4329 return base == virtual_stack_vars_rtx || base == hwasan_frame_base_ptr;
4330 }
4331
4332 /* For stack tagging:
4333
4334 Emit frame base initialisation.
4335 If hwasan_frame_base has been used before here then
4336 hwasan_frame_base_init_seq contains the sequence of instructions to
4337 initialize it. This must be put just before the hwasan prologue, so we emit
4338 the insns before parm_birth_insn (which will point to the first instruction
4339 of the hwasan prologue if it exists).
4340
4341 We update `parm_birth_insn` to point to the start of this initialisation
4342 since that represents the end of the initialisation done by
4343 expand_function_{start,end} functions and we want to maintain that. */
4344 void
4345 hwasan_maybe_emit_frame_base_init ()
4346 {
4347 if (! hwasan_frame_base_init_seq)
4348 return;
4349 emit_insn_before (hwasan_frame_base_init_seq, parm_birth_insn);
4350 parm_birth_insn = hwasan_frame_base_init_seq;
4351 }
4352
4353 /* Record a compile-time constant size stack variable that HWASAN will need to
4354 tag. This record of the range of a stack variable will be used by
4355 `hwasan_emit_prologue` to emit the RTL at the start of each frame which will
4356 set tags in the shadow memory according to the assigned tag for each object.
4357
4358 The range that the object spans in stack space should be described by the
4359 bounds `untagged_base + nearest_offset` and
4360 `untagged_base + farthest_offset`.
4361 `tagged_base` is the base address which contains the "base frame tag" for
4362 this frame, and from which the value to address this object with will be
4363 calculated.
4364
4365 We record the `untagged_base` since the functions in the hwasan library we
4366 use to tag memory take pointers without a tag. */
4367 void
4368 hwasan_record_stack_var (rtx untagged_base, rtx tagged_base,
4369 poly_int64 nearest_offset, poly_int64 farthest_offset)
4370 {
4371 hwasan_stack_var cur_var;
4372 cur_var.untagged_base = untagged_base;
4373 cur_var.tagged_base = tagged_base;
4374 cur_var.nearest_offset = nearest_offset;
4375 cur_var.farthest_offset = farthest_offset;
4376 cur_var.tag_offset = hwasan_current_frame_tag ();
4377
4378 hwasan_tagged_stack_vars.safe_push (cur_var);
4379 }
4380
4381 /* Return the RTX representing the farthest extent of the statically allocated
4382 stack objects for this frame. If hwasan_frame_base_ptr has not been
4383 initialized then we are not storing any static variables on the stack in
4384 this frame. In this case we return NULL_RTX to represent that.
4385
4386 Otherwise simply return virtual_stack_vars_rtx + frame_offset. */
4387 rtx
4388 hwasan_get_frame_extent ()
4389 {
4390 return (hwasan_frame_base_ptr
4391 ? plus_constant (Pmode, virtual_stack_vars_rtx, frame_offset)
4392 : NULL_RTX);
4393 }
4394
4395 /* For stack tagging:
4396
4397 Increment the frame tag offset modulo the size a tag can represent. */
4398 void
4399 hwasan_increment_frame_tag ()
4400 {
4401 uint8_t tag_bits = HWASAN_TAG_SIZE;
4402 gcc_assert (HWASAN_TAG_SIZE
4403 <= sizeof (hwasan_frame_tag_offset) * CHAR_BIT);
4404 hwasan_frame_tag_offset = (hwasan_frame_tag_offset + 1) % (1 << tag_bits);
4405 /* The "background tag" of the stack is zero by definition.
4406 This is the tag that objects like parameters passed on the stack and
4407 spilled registers are given. It is handy to avoid this tag for objects
4408 whose tags we decide ourselves, partly to ensure that buffer overruns
4409 can't affect these important variables (e.g. saved link register, saved
4410 stack pointer etc) and partly to make debugging easier (everything with a
4411 tag of zero is space allocated automatically by the compiler).
4412
4413 This is not feasible when using random frame tags (the default
4414 configuration for hwasan) since the tag for the given frame is randomly
4415 chosen at runtime. In order to avoid any tags matching the stack
4416 background we would need to decide tag offsets at runtime instead of
4417 compile time (and pay the resulting performance cost).
4418
4419 When not using random base tags for each frame (i.e. when compiled with
4420 `--param hwasan-random-frame-tag=0`) the base tag for each frame is zero.
4421 This means the tag that each object gets is equal to the
4422 hwasan_frame_tag_offset used in determining it.
4423 When this is the case we *can* ensure no object gets the tag of zero by
4424 simply ensuring no object has the hwasan_frame_tag_offset of zero.
4425
4426 There is the extra complication that we only record the
4427 hwasan_frame_tag_offset here (which is the offset from the tag stored in
4428 the stack pointer). In the kernel, the tag in the stack pointer is 0xff
4429 rather than zero. This does not cause problems since tags of 0xff are
4430 never checked in the kernel. As mentioned at the beginning of this
4431 comment the background tag of the stack is zero by definition, which means
4432 that for the kernel we should skip offsets of both 0 and 1 from the stack
4433 pointer. Avoiding the offset of 0 ensures we use a tag which will be
4434 checked, avoiding the offset of 1 ensures we use a tag that is not the
4435 same as the background. */
4436 if (hwasan_frame_tag_offset == 0 && ! param_hwasan_random_frame_tag)
4437 hwasan_frame_tag_offset += 1;
4438 if (hwasan_frame_tag_offset == 1 && ! param_hwasan_random_frame_tag
4439 && sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS))
4440 hwasan_frame_tag_offset += 1;
4441 }
4442
4443 /* Clear internal state for the next function.
4444 This function is called before variables on the stack get expanded, in
4445 `init_vars_expansion`. */
4446 void
4447 hwasan_record_frame_init ()
4448 {
4449 delete asan_used_labels;
4450 asan_used_labels = NULL;
4451
4452 /* If this isn't the case then some stack variable was recorded *before*
4453 hwasan_record_frame_init is called, yet *after* the hwasan prologue for
4454 the previous frame was emitted. Such stack variables would not have
4455 their shadow stack filled in. */
4456 gcc_assert (hwasan_tagged_stack_vars.is_empty ());
4457 hwasan_frame_base_ptr = NULL_RTX;
4458 hwasan_frame_base_init_seq = NULL;
4459
4460 /* When not using a random frame tag we can avoid the background stack
4461 color which gives the user a little better debug output upon a crash.
4462 Meanwhile, when using a random frame tag it will be nice to avoid adding
4463 tags for the first object since that is unnecessary extra work.
4464 Hence set the initial hwasan_frame_tag_offset to be 0 if using a random
4465 frame tag and 1 otherwise.
4466
4467 As described in hwasan_increment_frame_tag, in the kernel the stack
4468 pointer has the tag 0xff. That means that to avoid 0xff and 0 (the tag
4469 which the kernel does not check and the background tag respectively) we
4470 start with a tag offset of 2. */
4471 hwasan_frame_tag_offset = param_hwasan_random_frame_tag
4472 ? 0
4473 : sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS) ? 2 : 1;
4474 }
4475
4476 /* For stack tagging:
4477 (Emits HWASAN equivalent of what is emitted by
4478 `asan_emit_stack_protection`).
4479
4480 Emits the extra prologue code to set the shadow stack as required for HWASAN
4481 stack instrumentation.
4482
4483 Uses the vector of recorded stack variables hwasan_tagged_stack_vars. When
4484 this function has completed hwasan_tagged_stack_vars is empty and all
4485 objects it had pointed to are deallocated. */
4486 void
4487 hwasan_emit_prologue ()
4488 {
4489 /* We need untagged base pointers since libhwasan only accepts untagged
4490 pointers in __hwasan_tag_memory. We need the tagged base pointer to obtain
4491 the base tag for an offset. */
4492
4493 if (hwasan_tagged_stack_vars.is_empty ())
4494 return;
4495
4496 poly_int64 bot = 0, top = 0;
4497 for (hwasan_stack_var &cur : hwasan_tagged_stack_vars)
4498 {
4499 poly_int64 nearest = cur.nearest_offset;
4500 poly_int64 farthest = cur.farthest_offset;
4501
4502 if (known_ge (nearest, farthest))
4503 {
4504 top = nearest;
4505 bot = farthest;
4506 }
4507 else
4508 {
4509 /* Given how these values are calculated, one must be known greater
4510 than the other. */
4511 gcc_assert (known_le (nearest, farthest));
4512 top = farthest;
4513 bot = nearest;
4514 }
4515 poly_int64 size = (top - bot);
4516
4517 /* Assert the edge of each variable is aligned to the HWASAN tag granule
4518 size. */
4519 gcc_assert (multiple_p (top, HWASAN_TAG_GRANULE_SIZE));
4520 gcc_assert (multiple_p (bot, HWASAN_TAG_GRANULE_SIZE));
4521 gcc_assert (multiple_p (size, HWASAN_TAG_GRANULE_SIZE));
4522
4523 rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4524 rtx base_tag = targetm.memtag.extract_tag (cur.tagged_base, NULL_RTX);
4525 rtx tag = plus_constant (QImode, base_tag, cur.tag_offset);
4526 tag = hwasan_truncate_to_tag_size (tag, NULL_RTX);
4527
4528 rtx bottom = convert_memory_address (ptr_mode,
4529 plus_constant (Pmode,
4530 cur.untagged_base,
4531 bot));
4532 emit_library_call (fn, LCT_NORMAL, VOIDmode,
4533 bottom, ptr_mode,
4534 tag, QImode,
4535 gen_int_mode (size, ptr_mode), ptr_mode);
4536 }
4537 /* Clear the stack vars, we've emitted the prologue for them all now. */
4538 hwasan_tagged_stack_vars.truncate (0);
4539 }
4540
4541 /* For stack tagging:
4542
4543 Return RTL insns to clear the tags between DYNAMIC and VARS pointers
4544 into the stack. These instructions should be emitted at the end of
4545 every function.
4546
4547 If `dynamic` is NULL_RTX then no insns are returned. */
4548 rtx_insn *
4549 hwasan_emit_untag_frame (rtx dynamic, rtx vars)
4550 {
4551 if (! dynamic)
4552 return NULL;
4553
4554 start_sequence ();
4555
4556 dynamic = convert_memory_address (ptr_mode, dynamic);
4557 vars = convert_memory_address (ptr_mode, vars);
4558
4559 rtx top_rtx;
4560 rtx bot_rtx;
4561 if (FRAME_GROWS_DOWNWARD)
4562 {
4563 top_rtx = vars;
4564 bot_rtx = dynamic;
4565 }
4566 else
4567 {
4568 top_rtx = dynamic;
4569 bot_rtx = vars;
4570 }
4571
4572 rtx size_rtx = expand_simple_binop (ptr_mode, MINUS, top_rtx, bot_rtx,
4573 NULL_RTX, /* unsignedp = */0,
4574 OPTAB_DIRECT);
4575
4576 rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4577 emit_library_call (fn, LCT_NORMAL, VOIDmode,
4578 bot_rtx, ptr_mode,
4579 HWASAN_STACK_BACKGROUND, QImode,
4580 size_rtx, ptr_mode);
4581
4582 do_pending_stack_adjust ();
4583 rtx_insn *insns = get_insns ();
4584 end_sequence ();
4585 return insns;
4586 }
4587
4588 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
4589 invoke ggc_collect. */
4590 static GTY(()) tree hwasan_ctor_statements;
4591
4592 /* Insert module initialization into this TU. This initialization calls the
4593 initialization code for libhwasan. */
4594 void
4595 hwasan_finish_file (void)
4596 {
4597 /* Do not emit constructor initialization for the kernel.
4598 (the kernel has its own initialization already). */
4599 if (flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
4600 return;
4601
4602 /* Avoid instrumenting code in the hwasan constructors/destructors. */
4603 flag_sanitize &= ~SANITIZE_HWADDRESS;
4604 int priority = MAX_RESERVED_INIT_PRIORITY - 1;
4605 tree fn = builtin_decl_implicit (BUILT_IN_HWASAN_INIT);
4606 append_to_statement_list (build_call_expr (fn, 0), &hwasan_ctor_statements);
4607 cgraph_build_static_cdtor ('I', hwasan_ctor_statements, priority);
4608 flag_sanitize |= SANITIZE_HWADDRESS;
4609 }
4610
4611 /* For stack tagging:
4612
4613 Truncate `tag` to the number of bits that a tag uses (i.e. to
4614 HWASAN_TAG_SIZE). Store the result in `target` if it's convenient. */
4615 rtx
4616 hwasan_truncate_to_tag_size (rtx tag, rtx target)
4617 {
4618 gcc_assert (GET_MODE (tag) == QImode);
4619 if (HWASAN_TAG_SIZE != GET_MODE_PRECISION (QImode))
4620 {
4621 gcc_assert (GET_MODE_PRECISION (QImode) > HWASAN_TAG_SIZE);
4622 rtx mask = gen_int_mode ((HOST_WIDE_INT_1U << HWASAN_TAG_SIZE) - 1,
4623 QImode);
4624 tag = expand_simple_binop (QImode, AND, tag, mask, target,
4625 /* unsignedp = */1, OPTAB_WIDEN);
4626 gcc_assert (tag);
4627 }
4628 return tag;
4629 }
4630
4631 /* Construct a function tree for __hwasan_{load,store}{1,2,4,8,16,_n}.
4632 IS_STORE is either 1 (for a store) or 0 (for a load). */
4633 static combined_fn
4634 hwasan_check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
4635 int *nargs)
4636 {
4637 static enum built_in_function check[2][2][6]
4638 = { { { BUILT_IN_HWASAN_LOAD1, BUILT_IN_HWASAN_LOAD2,
4639 BUILT_IN_HWASAN_LOAD4, BUILT_IN_HWASAN_LOAD8,
4640 BUILT_IN_HWASAN_LOAD16, BUILT_IN_HWASAN_LOADN },
4641 { BUILT_IN_HWASAN_STORE1, BUILT_IN_HWASAN_STORE2,
4642 BUILT_IN_HWASAN_STORE4, BUILT_IN_HWASAN_STORE8,
4643 BUILT_IN_HWASAN_STORE16, BUILT_IN_HWASAN_STOREN } },
4644 { { BUILT_IN_HWASAN_LOAD1_NOABORT,
4645 BUILT_IN_HWASAN_LOAD2_NOABORT,
4646 BUILT_IN_HWASAN_LOAD4_NOABORT,
4647 BUILT_IN_HWASAN_LOAD8_NOABORT,
4648 BUILT_IN_HWASAN_LOAD16_NOABORT,
4649 BUILT_IN_HWASAN_LOADN_NOABORT },
4650 { BUILT_IN_HWASAN_STORE1_NOABORT,
4651 BUILT_IN_HWASAN_STORE2_NOABORT,
4652 BUILT_IN_HWASAN_STORE4_NOABORT,
4653 BUILT_IN_HWASAN_STORE8_NOABORT,
4654 BUILT_IN_HWASAN_STORE16_NOABORT,
4655 BUILT_IN_HWASAN_STOREN_NOABORT } } };
4656 if (size_in_bytes == -1)
4657 {
4658 *nargs = 2;
4659 return as_combined_fn (check[recover_p][is_store][5]);
4660 }
4661 *nargs = 1;
4662 int size_log2 = exact_log2 (size_in_bytes);
4663 gcc_assert (size_log2 >= 0 && size_log2 <= 5);
4664 return as_combined_fn (check[recover_p][is_store][size_log2]);
4665 }
4666
4667 /* Expand the HWASAN_{LOAD,STORE} builtins. */
4668 bool
4669 hwasan_expand_check_ifn (gimple_stmt_iterator *iter, bool)
4670 {
4671 gimple *g = gsi_stmt (*iter);
4672 location_t loc = gimple_location (g);
4673 bool recover_p;
4674 if (flag_sanitize & SANITIZE_USER_HWADDRESS)
4675 recover_p = (flag_sanitize_recover & SANITIZE_USER_HWADDRESS) != 0;
4676 else
4677 recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_HWADDRESS) != 0;
4678
4679 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
4680 gcc_assert (flags < ASAN_CHECK_LAST);
4681 bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
4682 bool is_store = (flags & ASAN_CHECK_STORE) != 0;
4683 bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
4684
4685 tree base = gimple_call_arg (g, 1);
4686 tree len = gimple_call_arg (g, 2);
4687
4688 /* `align` is unused for HWASAN_CHECK, but we pass the argument anyway
4689 since that way the arguments match ASAN_CHECK. */
4690 /* HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3)); */
4691
4692 unsigned HOST_WIDE_INT size_in_bytes
4693 = is_scalar_access ? tree_to_shwi (len) : -1;
4694
4695 gimple_stmt_iterator gsi = *iter;
4696
4697 if (!is_non_zero_len)
4698 {
4699 /* So, the length of the memory area to hwasan-protect is
4700 non-constant. Let's guard the generated instrumentation code
4701 like:
4702
4703 if (len != 0)
4704 {
4705 // hwasan instrumentation code goes here.
4706 }
4707 // falltrough instructions, starting with *ITER. */
4708
4709 g = gimple_build_cond (NE_EXPR,
4710 len,
4711 build_int_cst (TREE_TYPE (len), 0),
4712 NULL_TREE, NULL_TREE);
4713 gimple_set_location (g, loc);
4714
4715 basic_block then_bb, fallthrough_bb;
4716 insert_if_then_before_iter (as_a <gcond *> (g), iter,
4717 /*then_more_likely_p=*/true,
4718 &then_bb, &fallthrough_bb);
4719 /* Note that fallthrough_bb starts with the statement that was
4720 pointed to by ITER. */
4721
4722 /* The 'then block' of the 'if (len != 0) condition is where
4723 we'll generate the hwasan instrumentation code now. */
4724 gsi = gsi_last_bb (then_bb);
4725 }
4726
4727 gimple_seq stmts = NULL;
4728 tree base_addr = gimple_build (&stmts, loc, NOP_EXPR,
4729 pointer_sized_int_node, base);
4730
4731 int nargs = 0;
4732 combined_fn fn
4733 = hwasan_check_func (is_store, recover_p, size_in_bytes, &nargs);
4734 if (nargs == 1)
4735 gimple_build (&stmts, loc, fn, void_type_node, base_addr);
4736 else
4737 {
4738 gcc_assert (nargs == 2);
4739 tree sz_arg = gimple_build (&stmts, loc, NOP_EXPR,
4740 pointer_sized_int_node, len);
4741 gimple_build (&stmts, loc, fn, void_type_node, base_addr, sz_arg);
4742 }
4743
4744 gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT);
4745 gsi_remove (iter, true);
4746 *iter = gsi;
4747 return false;
4748 }
4749
4750 /* For stack tagging:
4751
4752 Dummy: the HWASAN_MARK internal function should only ever be in the code
4753 after the sanopt pass. */
4754 bool
4755 hwasan_expand_mark_ifn (gimple_stmt_iterator *)
4756 {
4757 gcc_unreachable ();
4758 }
4759
4760 bool
4761 gate_hwasan ()
4762 {
4763 return hwasan_sanitize_p ();
4764 }
4765
4766 #include "gt-asan.h"