1 /* AddressSanitizer, a fast memory error detector.
2 Copyright (C) 2012-2013 Free Software Foundation, Inc.
3 Contributed by Kostya Serebryany <kcc@google.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
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
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/>. */
24 #include "coretypes.h"
26 #include "tree-iterator.h"
28 #include "tree-pass.h"
30 #include "gimple-pretty-print.h"
36 #include "langhooks.h"
37 #include "hash-table.h"
38 #include "alloc-pool.h"
40 #include "gimple-builder.h"
42 /* AddressSanitizer finds out-of-bounds and use-after-free bugs
43 with <2x slowdown on average.
45 The tool consists of two parts:
46 instrumentation module (this file) and a run-time library.
47 The instrumentation module adds a run-time check before every memory insn.
48 For a 8- or 16- byte load accessing address X:
49 ShadowAddr = (X >> 3) + Offset
50 ShadowValue = *(char*)ShadowAddr; // *(short*) for 16-byte access.
52 __asan_report_load8(X);
53 For a load of N bytes (N=1, 2 or 4) from address X:
54 ShadowAddr = (X >> 3) + Offset
55 ShadowValue = *(char*)ShadowAddr;
57 if ((X & 7) + N - 1 > ShadowValue)
58 __asan_report_loadN(X);
59 Stores are instrumented similarly, but using __asan_report_storeN functions.
60 A call too __asan_init() is inserted to the list of module CTORs.
62 The run-time library redefines malloc (so that redzone are inserted around
63 the allocated memory) and free (so that reuse of free-ed memory is delayed),
64 provides __asan_report* and __asan_init functions.
67 http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
69 The current implementation supports detection of out-of-bounds and
70 use-after-free in the heap, on the stack and for global variables.
72 [Protection of stack variables]
74 To understand how detection of out-of-bounds and use-after-free works
75 for stack variables, lets look at this example on x86_64 where the
90 For this function, the stack protected by asan will be organized as
91 follows, from the top of the stack to the bottom:
93 Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
95 Slot 2/ [8 bytes of red zone, that adds up to the space of 'a' to make
96 the next slot be 32 bytes aligned; this one is called Partial
97 Redzone; this 32 bytes alignment is an asan constraint]
99 Slot 3/ [24 bytes for variable 'a']
101 Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
103 Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
105 Slot 6/ [8 bytes for variable 'b']
107 Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
110 The 32 bytes of LEFT red zone at the bottom of the stack can be
113 1/ The first 8 bytes contain a magical asan number that is always
116 2/ The following 8 bytes contains a pointer to a string (to be
117 parsed at runtime by the runtime asan library), which format is
120 "<function-name> <space> <num-of-variables-on-the-stack>
121 (<32-bytes-aligned-offset-in-bytes-of-variable> <space>
122 <length-of-var-in-bytes> ){n} "
124 where '(...){n}' means the content inside the parenthesis occurs 'n'
125 times, with 'n' being the number of variables on the stack.
127 3/ The following 16 bytes of the red zone have no particular
130 The shadow memory for that stack layout is going to look like this:
132 - content of shadow memory 8 bytes for slot 7: 0xF1F1F1F1.
133 The F1 byte pattern is a magic number called
134 ASAN_STACK_MAGIC_LEFT and is a way for the runtime to know that
135 the memory for that shadow byte is part of a the LEFT red zone
136 intended to seat at the bottom of the variables on the stack.
138 - content of shadow memory 8 bytes for slots 6 and 5:
139 0xF4F4F400. The F4 byte pattern is a magic number
140 called ASAN_STACK_MAGIC_PARTIAL. It flags the fact that the
141 memory region for this shadow byte is a PARTIAL red zone
142 intended to pad a variable A, so that the slot following
143 {A,padding} is 32 bytes aligned.
145 Note that the fact that the least significant byte of this
146 shadow memory content is 00 means that 8 bytes of its
147 corresponding memory (which corresponds to the memory of
148 variable 'b') is addressable.
150 - content of shadow memory 8 bytes for slot 4: 0xF2F2F2F2.
151 The F2 byte pattern is a magic number called
152 ASAN_STACK_MAGIC_MIDDLE. It flags the fact that the memory
153 region for this shadow byte is a MIDDLE red zone intended to
154 seat between two 32 aligned slots of {variable,padding}.
156 - content of shadow memory 8 bytes for slot 3 and 2:
157 0xF4000000. This represents is the concatenation of
158 variable 'a' and the partial red zone following it, like what we
159 had for variable 'b'. The least significant 3 bytes being 00
160 means that the 3 bytes of variable 'a' are addressable.
162 - content of shadow memory 8 bytes for slot 1: 0xF3F3F3F3.
163 The F3 byte pattern is a magic number called
164 ASAN_STACK_MAGIC_RIGHT. It flags the fact that the memory
165 region for this shadow byte is a RIGHT red zone intended to seat
166 at the top of the variables of the stack.
168 Note that the real variable layout is done in expand_used_vars in
169 cfgexpand.c. As far as Address Sanitizer is concerned, it lays out
170 stack variables as well as the different red zones, emits some
171 prologue code to populate the shadow memory as to poison (mark as
172 non-accessible) the regions of the red zones and mark the regions of
173 stack variables as accessible, and emit some epilogue code to
174 un-poison (mark as accessible) the regions of red zones right before
177 [Protection of global variables]
179 The basic idea is to insert a red zone between two global variables
180 and install a constructor function that calls the asan runtime to do
181 the populating of the relevant shadow memory regions at load time.
183 So the global variables are laid out as to insert a red zone between
184 them. The size of the red zones is so that each variable starts on a
187 Then a constructor function is installed so that, for each global
188 variable, it calls the runtime asan library function
189 __asan_register_globals_with an instance of this type:
193 // Address of the beginning of the global variable.
196 // Initial size of the global variable.
199 // Size of the global variable + size of the red zone. This
200 // size is 32 bytes aligned.
201 uptr __size_with_redzone;
203 // Name of the global variable.
206 // This is always set to NULL for now.
207 uptr __has_dynamic_init;
210 A destructor function that calls the runtime asan library function
211 _asan_unregister_globals is also installed. */
213 alias_set_type asan_shadow_set = -1;
215 /* Pointer types to 1 resp. 2 byte integers in shadow memory. A separate
216 alias set is used for all shadow memory accesses. */
217 static GTY(()) tree shadow_ptr_types[2];
219 /* Hashtable support for memory references used by gimple
222 /* This type represents a reference to a memory region. */
225 /* The expression of the beginning of the memory region. */
228 /* The size of the access (can be 1, 2, 4, 8, 16 for now). */
232 static alloc_pool asan_mem_ref_alloc_pool;
234 /* This creates the alloc pool used to store the instances of
235 asan_mem_ref that are stored in the hash table asan_mem_ref_ht. */
238 asan_mem_ref_get_alloc_pool ()
240 if (asan_mem_ref_alloc_pool == NULL)
241 asan_mem_ref_alloc_pool = create_alloc_pool ("asan_mem_ref",
242 sizeof (asan_mem_ref),
244 return asan_mem_ref_alloc_pool;
248 /* Initializes an instance of asan_mem_ref. */
251 asan_mem_ref_init (asan_mem_ref *ref, tree start, char access_size)
254 ref->access_size = access_size;
257 /* Allocates memory for an instance of asan_mem_ref into the memory
258 pool returned by asan_mem_ref_get_alloc_pool and initialize it.
259 START is the address of (or the expression pointing to) the
260 beginning of memory reference. ACCESS_SIZE is the size of the
261 access to the referenced memory. */
264 asan_mem_ref_new (tree start, char access_size)
267 (asan_mem_ref *) pool_alloc (asan_mem_ref_get_alloc_pool ());
269 asan_mem_ref_init (ref, start, access_size);
273 /* This builds and returns a pointer to the end of the memory region
274 that starts at START and of length LEN. */
277 asan_mem_ref_get_end (tree start, tree len)
279 if (len == NULL_TREE || integer_zerop (len))
282 return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
285 /* Return a tree expression that represents the end of the referenced
286 memory region. Beware that this function can actually build a new
290 asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
292 return asan_mem_ref_get_end (ref->start, len);
295 struct asan_mem_ref_hasher
296 : typed_noop_remove <asan_mem_ref>
298 typedef asan_mem_ref value_type;
299 typedef asan_mem_ref compare_type;
301 static inline hashval_t hash (const value_type *);
302 static inline bool equal (const value_type *, const compare_type *);
305 /* Hash a memory reference. */
308 asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
310 hashval_t h = iterative_hash_expr (mem_ref->start, 0);
311 h = iterative_hash_hashval_t (h, mem_ref->access_size);
315 /* Compare two memory references. We accept the length of either
316 memory references to be NULL_TREE. */
319 asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
320 const asan_mem_ref *m2)
322 return (m1->access_size == m2->access_size
323 && operand_equal_p (m1->start, m2->start, 0));
326 static hash_table <asan_mem_ref_hasher> asan_mem_ref_ht;
328 /* Returns a reference to the hash table containing memory references.
329 This function ensures that the hash table is created. Note that
330 this hash table is updated by the function
331 update_mem_ref_hash_table. */
333 static hash_table <asan_mem_ref_hasher> &
334 get_mem_ref_hash_table ()
336 if (!asan_mem_ref_ht.is_created ())
337 asan_mem_ref_ht.create (10);
339 return asan_mem_ref_ht;
342 /* Clear all entries from the memory references hash table. */
345 empty_mem_ref_hash_table ()
347 if (asan_mem_ref_ht.is_created ())
348 asan_mem_ref_ht.empty ();
351 /* Free the memory references hash table. */
354 free_mem_ref_resources ()
356 if (asan_mem_ref_ht.is_created ())
357 asan_mem_ref_ht.dispose ();
359 if (asan_mem_ref_alloc_pool)
361 free_alloc_pool (asan_mem_ref_alloc_pool);
362 asan_mem_ref_alloc_pool = NULL;
366 /* Return true iff the memory reference REF has been instrumented. */
369 has_mem_ref_been_instrumented (tree ref, char access_size)
372 asan_mem_ref_init (&r, ref, access_size);
374 return (get_mem_ref_hash_table ().find (&r) != NULL);
377 /* Return true iff the memory reference REF has been instrumented. */
380 has_mem_ref_been_instrumented (const asan_mem_ref *ref)
382 return has_mem_ref_been_instrumented (ref->start, ref->access_size);
385 /* Return true iff access to memory region starting at REF and of
386 length LEN has been instrumented. */
389 has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
391 /* First let's see if the address of the beginning of REF has been
393 if (!has_mem_ref_been_instrumented (ref))
398 /* Let's see if the end of the region has been instrumented. */
399 if (!has_mem_ref_been_instrumented (asan_mem_ref_get_end (ref, len),
406 /* Set REF to the memory reference present in a gimple assignment
407 ASSIGNMENT. Return true upon successful completion, false
411 get_mem_ref_of_assignment (const gimple assignment,
415 gcc_assert (gimple_assign_single_p (assignment));
417 if (gimple_store_p (assignment)
418 && !gimple_clobber_p (assignment))
420 ref->start = gimple_assign_lhs (assignment);
421 *ref_is_store = true;
423 else if (gimple_assign_load_p (assignment))
425 ref->start = gimple_assign_rhs1 (assignment);
426 *ref_is_store = false;
431 ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
435 /* Return the memory references contained in a gimple statement
436 representing a builtin call that has to do with memory access. */
439 get_mem_refs_of_builtin_call (const gimple call,
451 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
453 tree callee = gimple_call_fndecl (call);
454 tree source0 = NULL_TREE, source1 = NULL_TREE,
455 dest = NULL_TREE, len = NULL_TREE;
456 bool is_store = true, got_reference_p = false;
457 char access_size = 1;
459 switch (DECL_FUNCTION_CODE (callee))
461 /* (s, s, n) style memops. */
463 case BUILT_IN_MEMCMP:
464 source0 = gimple_call_arg (call, 0);
465 source1 = gimple_call_arg (call, 1);
466 len = gimple_call_arg (call, 2);
469 /* (src, dest, n) style memops. */
471 source0 = gimple_call_arg (call, 0);
472 dest = gimple_call_arg (call, 1);
473 len = gimple_call_arg (call, 2);
476 /* (dest, src, n) style memops. */
477 case BUILT_IN_MEMCPY:
478 case BUILT_IN_MEMCPY_CHK:
479 case BUILT_IN_MEMMOVE:
480 case BUILT_IN_MEMMOVE_CHK:
481 case BUILT_IN_MEMPCPY:
482 case BUILT_IN_MEMPCPY_CHK:
483 dest = gimple_call_arg (call, 0);
484 source0 = gimple_call_arg (call, 1);
485 len = gimple_call_arg (call, 2);
488 /* (dest, n) style memops. */
490 dest = gimple_call_arg (call, 0);
491 len = gimple_call_arg (call, 1);
494 /* (dest, x, n) style memops*/
495 case BUILT_IN_MEMSET:
496 case BUILT_IN_MEMSET_CHK:
497 dest = gimple_call_arg (call, 0);
498 len = gimple_call_arg (call, 2);
501 case BUILT_IN_STRLEN:
502 source0 = gimple_call_arg (call, 0);
503 len = gimple_call_lhs (call);
506 /* And now the __atomic* and __sync builtins.
507 These are handled differently from the classical memory memory
508 access builtins above. */
510 case BUILT_IN_ATOMIC_LOAD_1:
511 case BUILT_IN_ATOMIC_LOAD_2:
512 case BUILT_IN_ATOMIC_LOAD_4:
513 case BUILT_IN_ATOMIC_LOAD_8:
514 case BUILT_IN_ATOMIC_LOAD_16:
518 case BUILT_IN_SYNC_FETCH_AND_ADD_1:
519 case BUILT_IN_SYNC_FETCH_AND_ADD_2:
520 case BUILT_IN_SYNC_FETCH_AND_ADD_4:
521 case BUILT_IN_SYNC_FETCH_AND_ADD_8:
522 case BUILT_IN_SYNC_FETCH_AND_ADD_16:
524 case BUILT_IN_SYNC_FETCH_AND_SUB_1:
525 case BUILT_IN_SYNC_FETCH_AND_SUB_2:
526 case BUILT_IN_SYNC_FETCH_AND_SUB_4:
527 case BUILT_IN_SYNC_FETCH_AND_SUB_8:
528 case BUILT_IN_SYNC_FETCH_AND_SUB_16:
530 case BUILT_IN_SYNC_FETCH_AND_OR_1:
531 case BUILT_IN_SYNC_FETCH_AND_OR_2:
532 case BUILT_IN_SYNC_FETCH_AND_OR_4:
533 case BUILT_IN_SYNC_FETCH_AND_OR_8:
534 case BUILT_IN_SYNC_FETCH_AND_OR_16:
536 case BUILT_IN_SYNC_FETCH_AND_AND_1:
537 case BUILT_IN_SYNC_FETCH_AND_AND_2:
538 case BUILT_IN_SYNC_FETCH_AND_AND_4:
539 case BUILT_IN_SYNC_FETCH_AND_AND_8:
540 case BUILT_IN_SYNC_FETCH_AND_AND_16:
542 case BUILT_IN_SYNC_FETCH_AND_XOR_1:
543 case BUILT_IN_SYNC_FETCH_AND_XOR_2:
544 case BUILT_IN_SYNC_FETCH_AND_XOR_4:
545 case BUILT_IN_SYNC_FETCH_AND_XOR_8:
546 case BUILT_IN_SYNC_FETCH_AND_XOR_16:
548 case BUILT_IN_SYNC_FETCH_AND_NAND_1:
549 case BUILT_IN_SYNC_FETCH_AND_NAND_2:
550 case BUILT_IN_SYNC_FETCH_AND_NAND_4:
551 case BUILT_IN_SYNC_FETCH_AND_NAND_8:
553 case BUILT_IN_SYNC_ADD_AND_FETCH_1:
554 case BUILT_IN_SYNC_ADD_AND_FETCH_2:
555 case BUILT_IN_SYNC_ADD_AND_FETCH_4:
556 case BUILT_IN_SYNC_ADD_AND_FETCH_8:
557 case BUILT_IN_SYNC_ADD_AND_FETCH_16:
559 case BUILT_IN_SYNC_SUB_AND_FETCH_1:
560 case BUILT_IN_SYNC_SUB_AND_FETCH_2:
561 case BUILT_IN_SYNC_SUB_AND_FETCH_4:
562 case BUILT_IN_SYNC_SUB_AND_FETCH_8:
563 case BUILT_IN_SYNC_SUB_AND_FETCH_16:
565 case BUILT_IN_SYNC_OR_AND_FETCH_1:
566 case BUILT_IN_SYNC_OR_AND_FETCH_2:
567 case BUILT_IN_SYNC_OR_AND_FETCH_4:
568 case BUILT_IN_SYNC_OR_AND_FETCH_8:
569 case BUILT_IN_SYNC_OR_AND_FETCH_16:
571 case BUILT_IN_SYNC_AND_AND_FETCH_1:
572 case BUILT_IN_SYNC_AND_AND_FETCH_2:
573 case BUILT_IN_SYNC_AND_AND_FETCH_4:
574 case BUILT_IN_SYNC_AND_AND_FETCH_8:
575 case BUILT_IN_SYNC_AND_AND_FETCH_16:
577 case BUILT_IN_SYNC_XOR_AND_FETCH_1:
578 case BUILT_IN_SYNC_XOR_AND_FETCH_2:
579 case BUILT_IN_SYNC_XOR_AND_FETCH_4:
580 case BUILT_IN_SYNC_XOR_AND_FETCH_8:
581 case BUILT_IN_SYNC_XOR_AND_FETCH_16:
583 case BUILT_IN_SYNC_NAND_AND_FETCH_1:
584 case BUILT_IN_SYNC_NAND_AND_FETCH_2:
585 case BUILT_IN_SYNC_NAND_AND_FETCH_4:
586 case BUILT_IN_SYNC_NAND_AND_FETCH_8:
588 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1:
589 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2:
590 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4:
591 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8:
592 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16:
594 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1:
595 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2:
596 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4:
597 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8:
598 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16:
600 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1:
601 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2:
602 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4:
603 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8:
604 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16:
606 case BUILT_IN_SYNC_LOCK_RELEASE_1:
607 case BUILT_IN_SYNC_LOCK_RELEASE_2:
608 case BUILT_IN_SYNC_LOCK_RELEASE_4:
609 case BUILT_IN_SYNC_LOCK_RELEASE_8:
610 case BUILT_IN_SYNC_LOCK_RELEASE_16:
612 case BUILT_IN_ATOMIC_EXCHANGE_1:
613 case BUILT_IN_ATOMIC_EXCHANGE_2:
614 case BUILT_IN_ATOMIC_EXCHANGE_4:
615 case BUILT_IN_ATOMIC_EXCHANGE_8:
616 case BUILT_IN_ATOMIC_EXCHANGE_16:
618 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
619 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
620 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
621 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
622 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
624 case BUILT_IN_ATOMIC_STORE_1:
625 case BUILT_IN_ATOMIC_STORE_2:
626 case BUILT_IN_ATOMIC_STORE_4:
627 case BUILT_IN_ATOMIC_STORE_8:
628 case BUILT_IN_ATOMIC_STORE_16:
630 case BUILT_IN_ATOMIC_ADD_FETCH_1:
631 case BUILT_IN_ATOMIC_ADD_FETCH_2:
632 case BUILT_IN_ATOMIC_ADD_FETCH_4:
633 case BUILT_IN_ATOMIC_ADD_FETCH_8:
634 case BUILT_IN_ATOMIC_ADD_FETCH_16:
636 case BUILT_IN_ATOMIC_SUB_FETCH_1:
637 case BUILT_IN_ATOMIC_SUB_FETCH_2:
638 case BUILT_IN_ATOMIC_SUB_FETCH_4:
639 case BUILT_IN_ATOMIC_SUB_FETCH_8:
640 case BUILT_IN_ATOMIC_SUB_FETCH_16:
642 case BUILT_IN_ATOMIC_AND_FETCH_1:
643 case BUILT_IN_ATOMIC_AND_FETCH_2:
644 case BUILT_IN_ATOMIC_AND_FETCH_4:
645 case BUILT_IN_ATOMIC_AND_FETCH_8:
646 case BUILT_IN_ATOMIC_AND_FETCH_16:
648 case BUILT_IN_ATOMIC_NAND_FETCH_1:
649 case BUILT_IN_ATOMIC_NAND_FETCH_2:
650 case BUILT_IN_ATOMIC_NAND_FETCH_4:
651 case BUILT_IN_ATOMIC_NAND_FETCH_8:
652 case BUILT_IN_ATOMIC_NAND_FETCH_16:
654 case BUILT_IN_ATOMIC_XOR_FETCH_1:
655 case BUILT_IN_ATOMIC_XOR_FETCH_2:
656 case BUILT_IN_ATOMIC_XOR_FETCH_4:
657 case BUILT_IN_ATOMIC_XOR_FETCH_8:
658 case BUILT_IN_ATOMIC_XOR_FETCH_16:
660 case BUILT_IN_ATOMIC_OR_FETCH_1:
661 case BUILT_IN_ATOMIC_OR_FETCH_2:
662 case BUILT_IN_ATOMIC_OR_FETCH_4:
663 case BUILT_IN_ATOMIC_OR_FETCH_8:
664 case BUILT_IN_ATOMIC_OR_FETCH_16:
666 case BUILT_IN_ATOMIC_FETCH_ADD_1:
667 case BUILT_IN_ATOMIC_FETCH_ADD_2:
668 case BUILT_IN_ATOMIC_FETCH_ADD_4:
669 case BUILT_IN_ATOMIC_FETCH_ADD_8:
670 case BUILT_IN_ATOMIC_FETCH_ADD_16:
672 case BUILT_IN_ATOMIC_FETCH_SUB_1:
673 case BUILT_IN_ATOMIC_FETCH_SUB_2:
674 case BUILT_IN_ATOMIC_FETCH_SUB_4:
675 case BUILT_IN_ATOMIC_FETCH_SUB_8:
676 case BUILT_IN_ATOMIC_FETCH_SUB_16:
678 case BUILT_IN_ATOMIC_FETCH_AND_1:
679 case BUILT_IN_ATOMIC_FETCH_AND_2:
680 case BUILT_IN_ATOMIC_FETCH_AND_4:
681 case BUILT_IN_ATOMIC_FETCH_AND_8:
682 case BUILT_IN_ATOMIC_FETCH_AND_16:
684 case BUILT_IN_ATOMIC_FETCH_NAND_1:
685 case BUILT_IN_ATOMIC_FETCH_NAND_2:
686 case BUILT_IN_ATOMIC_FETCH_NAND_4:
687 case BUILT_IN_ATOMIC_FETCH_NAND_8:
688 case BUILT_IN_ATOMIC_FETCH_NAND_16:
690 case BUILT_IN_ATOMIC_FETCH_XOR_1:
691 case BUILT_IN_ATOMIC_FETCH_XOR_2:
692 case BUILT_IN_ATOMIC_FETCH_XOR_4:
693 case BUILT_IN_ATOMIC_FETCH_XOR_8:
694 case BUILT_IN_ATOMIC_FETCH_XOR_16:
696 case BUILT_IN_ATOMIC_FETCH_OR_1:
697 case BUILT_IN_ATOMIC_FETCH_OR_2:
698 case BUILT_IN_ATOMIC_FETCH_OR_4:
699 case BUILT_IN_ATOMIC_FETCH_OR_8:
700 case BUILT_IN_ATOMIC_FETCH_OR_16:
702 dest = gimple_call_arg (call, 0);
703 /* DEST represents the address of a memory location.
704 instrument_derefs wants the memory location, so lets
705 dereference the address DEST before handing it to
706 instrument_derefs. */
707 if (TREE_CODE (dest) == ADDR_EXPR)
708 dest = TREE_OPERAND (dest, 0);
709 else if (TREE_CODE (dest) == SSA_NAME)
710 dest = build2 (MEM_REF, TREE_TYPE (TREE_TYPE (dest)),
711 dest, build_int_cst (TREE_TYPE (dest), 0));
715 access_size = int_size_in_bytes (TREE_TYPE (dest));
719 /* The other builtins memory access are not instrumented in this
720 function because they either don't have any length parameter,
721 or their length parameter is just a limit. */
725 if (len != NULL_TREE)
727 if (source0 != NULL_TREE)
729 src0->start = source0;
730 src0->access_size = access_size;
732 *src0_is_store = false;
735 if (source1 != NULL_TREE)
737 src1->start = source1;
738 src1->access_size = access_size;
740 *src1_is_store = false;
743 if (dest != NULL_TREE)
746 dst->access_size = access_size;
748 *dst_is_store = true;
751 got_reference_p = true;
756 dst->access_size = access_size;
757 *dst_len = NULL_TREE;
758 *dst_is_store = is_store;
759 *dest_is_deref = true;
760 got_reference_p = true;
763 return got_reference_p;
766 /* Return true iff a given gimple statement has been instrumented.
767 Note that the statement is "defined" by the memory references it
771 has_stmt_been_instrumented_p (gimple stmt)
773 if (gimple_assign_single_p (stmt))
777 asan_mem_ref_init (&r, NULL, 1);
779 if (get_mem_ref_of_assignment (stmt, &r, &r_is_store))
780 return has_mem_ref_been_instrumented (&r);
782 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
784 asan_mem_ref src0, src1, dest;
785 asan_mem_ref_init (&src0, NULL, 1);
786 asan_mem_ref_init (&src1, NULL, 1);
787 asan_mem_ref_init (&dest, NULL, 1);
789 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
790 bool src0_is_store = false, src1_is_store = false,
791 dest_is_store = false, dest_is_deref = false;
792 if (get_mem_refs_of_builtin_call (stmt,
793 &src0, &src0_len, &src0_is_store,
794 &src1, &src1_len, &src1_is_store,
795 &dest, &dest_len, &dest_is_store,
798 if (src0.start != NULL_TREE
799 && !has_mem_ref_been_instrumented (&src0, src0_len))
802 if (src1.start != NULL_TREE
803 && !has_mem_ref_been_instrumented (&src1, src1_len))
806 if (dest.start != NULL_TREE
807 && !has_mem_ref_been_instrumented (&dest, dest_len))
816 /* Insert a memory reference into the hash table. */
819 update_mem_ref_hash_table (tree ref, char access_size)
821 hash_table <asan_mem_ref_hasher> ht = get_mem_ref_hash_table ();
824 asan_mem_ref_init (&r, ref, access_size);
826 asan_mem_ref **slot = ht.find_slot (&r, INSERT);
828 *slot = asan_mem_ref_new (ref, access_size);
831 /* Initialize shadow_ptr_types array. */
834 asan_init_shadow_ptr_types (void)
836 asan_shadow_set = new_alias_set ();
837 shadow_ptr_types[0] = build_distinct_type_copy (signed_char_type_node);
838 TYPE_ALIAS_SET (shadow_ptr_types[0]) = asan_shadow_set;
839 shadow_ptr_types[0] = build_pointer_type (shadow_ptr_types[0]);
840 shadow_ptr_types[1] = build_distinct_type_copy (short_integer_type_node);
841 TYPE_ALIAS_SET (shadow_ptr_types[1]) = asan_shadow_set;
842 shadow_ptr_types[1] = build_pointer_type (shadow_ptr_types[1]);
843 initialize_sanitizer_builtins ();
846 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
849 asan_pp_string (pretty_printer *pp)
851 const char *buf = pp_formatted_text (pp);
852 size_t len = strlen (buf);
853 tree ret = build_string (len + 1, buf);
855 = build_array_type (TREE_TYPE (shadow_ptr_types[0]),
856 build_index_type (size_int (len)));
857 TREE_READONLY (ret) = 1;
858 TREE_STATIC (ret) = 1;
859 return build1 (ADDR_EXPR, shadow_ptr_types[0], ret);
862 /* Return a CONST_INT representing 4 subsequent shadow memory bytes. */
865 asan_shadow_cst (unsigned char shadow_bytes[4])
868 unsigned HOST_WIDE_INT val = 0;
869 gcc_assert (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN);
870 for (i = 0; i < 4; i++)
871 val |= (unsigned HOST_WIDE_INT) shadow_bytes[BYTES_BIG_ENDIAN ? 3 - i : i]
872 << (BITS_PER_UNIT * i);
873 return gen_int_mode (val, SImode);
876 /* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
880 asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
882 rtx insn, insns, top_label, end, addr, tmp, jump;
885 clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
886 insns = get_insns ();
888 for (insn = insns; insn; insn = NEXT_INSN (insn))
891 if (insn == NULL_RTX)
897 gcc_assert ((len & 3) == 0);
898 top_label = gen_label_rtx ();
899 addr = force_reg (Pmode, XEXP (shadow_mem, 0));
900 shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
901 end = force_reg (Pmode, plus_constant (Pmode, addr, len));
902 emit_label (top_label);
904 emit_move_insn (shadow_mem, const0_rtx);
905 tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), addr,
906 true, OPTAB_LIB_WIDEN);
908 emit_move_insn (addr, tmp);
909 emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
910 jump = get_last_insn ();
911 gcc_assert (JUMP_P (jump));
912 add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100);
915 /* Insert code to protect stack vars. The prologue sequence should be emitted
916 directly, epilogue sequence returned. BASE is the register holding the
917 stack base, against which OFFSETS array offsets are relative to, OFFSETS
918 array contains pairs of offsets in reverse order, always the end offset
919 of some gap that needs protection followed by starting offset,
920 and DECLS is an array of representative decls for each var partition.
921 LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
922 elements long (OFFSETS include gap before the first variable as well
923 as gaps after each stack variable). */
926 asan_emit_stack_protection (rtx base, HOST_WIDE_INT *offsets, tree *decls,
929 rtx shadow_base, shadow_mem, ret, mem;
930 unsigned char shadow_bytes[4];
931 HOST_WIDE_INT base_offset = offsets[length - 1], offset, prev_offset;
932 HOST_WIDE_INT last_offset, last_size;
934 unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT;
937 if (shadow_ptr_types[0] == NULL_TREE)
938 asan_init_shadow_ptr_types ();
940 /* First of all, prepare the description string. */
941 pretty_printer asan_pp;
943 if (DECL_NAME (current_function_decl))
944 pp_tree_identifier (&asan_pp, DECL_NAME (current_function_decl));
946 pp_string (&asan_pp, "<unknown>");
948 pp_decimal_int (&asan_pp, length / 2 - 1);
950 for (l = length - 2; l; l -= 2)
952 tree decl = decls[l / 2 - 1];
953 pp_wide_integer (&asan_pp, offsets[l] - base_offset);
955 pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
957 if (DECL_P (decl) && DECL_NAME (decl))
959 pp_decimal_int (&asan_pp, IDENTIFIER_LENGTH (DECL_NAME (decl)));
961 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
964 pp_string (&asan_pp, "9 <unknown>");
967 str_cst = asan_pp_string (&asan_pp);
969 /* Emit the prologue sequence. */
970 base = expand_binop (Pmode, add_optab, base,
971 gen_int_mode (base_offset, Pmode),
972 NULL_RTX, 1, OPTAB_DIRECT);
973 mem = gen_rtx_MEM (ptr_mode, base);
974 emit_move_insn (mem, gen_int_mode (ASAN_STACK_FRAME_MAGIC, ptr_mode));
975 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
976 emit_move_insn (mem, expand_normal (str_cst));
977 shadow_base = expand_binop (Pmode, lshr_optab, base,
978 GEN_INT (ASAN_SHADOW_SHIFT),
979 NULL_RTX, 1, OPTAB_DIRECT);
980 shadow_base = expand_binop (Pmode, add_optab, shadow_base,
981 gen_int_mode (targetm.asan_shadow_offset (),
983 NULL_RTX, 1, OPTAB_DIRECT);
984 gcc_assert (asan_shadow_set != -1
985 && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
986 shadow_mem = gen_rtx_MEM (SImode, shadow_base);
987 set_mem_alias_set (shadow_mem, asan_shadow_set);
988 prev_offset = base_offset;
989 for (l = length; l; l -= 2)
992 cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
993 offset = offsets[l - 1];
994 if ((offset - base_offset) & (ASAN_RED_ZONE_SIZE - 1))
998 = base_offset + ((offset - base_offset)
999 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1000 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1001 (aoff - prev_offset)
1002 >> ASAN_SHADOW_SHIFT);
1004 for (i = 0; i < 4; i++, aoff += (1 << ASAN_SHADOW_SHIFT))
1007 if (aoff < offset - (1 << ASAN_SHADOW_SHIFT) + 1)
1008 shadow_bytes[i] = 0;
1010 shadow_bytes[i] = offset - aoff;
1013 shadow_bytes[i] = ASAN_STACK_MAGIC_PARTIAL;
1014 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1017 while (offset <= offsets[l - 2] - ASAN_RED_ZONE_SIZE)
1019 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1020 (offset - prev_offset)
1021 >> ASAN_SHADOW_SHIFT);
1022 prev_offset = offset;
1023 memset (shadow_bytes, cur_shadow_byte, 4);
1024 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1025 offset += ASAN_RED_ZONE_SIZE;
1027 cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
1029 do_pending_stack_adjust ();
1031 /* Construct epilogue sequence. */
1034 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
1035 set_mem_alias_set (shadow_mem, asan_shadow_set);
1036 prev_offset = base_offset;
1037 last_offset = base_offset;
1039 for (l = length; l; l -= 2)
1041 offset = base_offset + ((offsets[l - 1] - base_offset)
1042 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1043 if (last_offset + last_size != offset)
1045 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1046 (last_offset - prev_offset)
1047 >> ASAN_SHADOW_SHIFT);
1048 prev_offset = last_offset;
1049 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
1050 last_offset = offset;
1053 last_size += base_offset + ((offsets[l - 2] - base_offset)
1054 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
1059 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1060 (last_offset - prev_offset)
1061 >> ASAN_SHADOW_SHIFT);
1062 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
1065 do_pending_stack_adjust ();
1072 /* Return true if DECL, a global var, might be overridden and needs
1073 therefore a local alias. */
1076 asan_needs_local_alias (tree decl)
1078 return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
1081 /* Return true if DECL is a VAR_DECL that should be protected
1082 by Address Sanitizer, by appending a red zone with protected
1083 shadow memory after it and aligning it to at least
1084 ASAN_RED_ZONE_SIZE bytes. */
1087 asan_protect_global (tree decl)
1091 if (TREE_CODE (decl) == STRING_CST)
1093 /* Instrument all STRING_CSTs except those created
1094 by asan_pp_string here. */
1095 if (shadow_ptr_types[0] != NULL_TREE
1096 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
1097 && TREE_TYPE (TREE_TYPE (decl)) == TREE_TYPE (shadow_ptr_types[0]))
1101 if (TREE_CODE (decl) != VAR_DECL
1102 /* TLS vars aren't statically protectable. */
1103 || DECL_THREAD_LOCAL_P (decl)
1104 /* Externs will be protected elsewhere. */
1105 || DECL_EXTERNAL (decl)
1106 || !DECL_RTL_SET_P (decl)
1107 /* Comdat vars pose an ABI problem, we can't know if
1108 the var that is selected by the linker will have
1110 || DECL_ONE_ONLY (decl)
1111 /* Similarly for common vars. People can use -fno-common. */
1112 || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
1113 /* Don't protect if using user section, often vars placed
1114 into user section from multiple TUs are then assumed
1115 to be an array of such vars, putting padding in there
1116 breaks this assumption. */
1117 || (DECL_SECTION_NAME (decl) != NULL_TREE
1118 && !DECL_HAS_IMPLICIT_SECTION_NAME_P (decl))
1119 || DECL_SIZE (decl) == 0
1120 || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
1121 || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
1122 || DECL_ALIGN_UNIT (decl) > 2 * ASAN_RED_ZONE_SIZE)
1125 rtl = DECL_RTL (decl);
1126 if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF)
1128 symbol = XEXP (rtl, 0);
1130 if (CONSTANT_POOL_ADDRESS_P (symbol)
1131 || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
1134 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
1137 #ifndef ASM_OUTPUT_DEF
1138 if (asan_needs_local_alias (decl))
1145 /* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16}.
1146 IS_STORE is either 1 (for a store) or 0 (for a load).
1147 SIZE_IN_BYTES is one of 1, 2, 4, 8, 16. */
1150 report_error_func (bool is_store, int size_in_bytes)
1152 static enum built_in_function report[2][5]
1153 = { { BUILT_IN_ASAN_REPORT_LOAD1, BUILT_IN_ASAN_REPORT_LOAD2,
1154 BUILT_IN_ASAN_REPORT_LOAD4, BUILT_IN_ASAN_REPORT_LOAD8,
1155 BUILT_IN_ASAN_REPORT_LOAD16 },
1156 { BUILT_IN_ASAN_REPORT_STORE1, BUILT_IN_ASAN_REPORT_STORE2,
1157 BUILT_IN_ASAN_REPORT_STORE4, BUILT_IN_ASAN_REPORT_STORE8,
1158 BUILT_IN_ASAN_REPORT_STORE16 } };
1159 return builtin_decl_implicit (report[is_store][exact_log2 (size_in_bytes)]);
1162 #define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 2000 - 1)
1163 #define PROB_ALWAYS (REG_BR_PROB_BASE)
1165 /* Split the current basic block and create a condition statement
1166 insertion point right before or after the statement pointed to by
1167 ITER. Return an iterator to the point at which the caller might
1168 safely insert the condition statement.
1170 THEN_BLOCK must be set to the address of an uninitialized instance
1171 of basic_block. The function will then set *THEN_BLOCK to the
1172 'then block' of the condition statement to be inserted by the
1175 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
1176 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
1178 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
1179 block' of the condition statement to be inserted by the caller.
1181 Note that *FALLTHROUGH_BLOCK is a new block that contains the
1182 statements starting from *ITER, and *THEN_BLOCK is a new empty
1185 *ITER is adjusted to point to always point to the first statement
1186 of the basic block * FALLTHROUGH_BLOCK. That statement is the
1187 same as what ITER was pointing to prior to calling this function,
1188 if BEFORE_P is true; otherwise, it is its following statement. */
1190 static gimple_stmt_iterator
1191 create_cond_insert_point (gimple_stmt_iterator *iter,
1193 bool then_more_likely_p,
1194 bool create_then_fallthru_edge,
1195 basic_block *then_block,
1196 basic_block *fallthrough_block)
1198 gimple_stmt_iterator gsi = *iter;
1200 if (!gsi_end_p (gsi) && before_p)
1203 basic_block cur_bb = gsi_bb (*iter);
1205 edge e = split_block (cur_bb, gsi_stmt (gsi));
1207 /* Get a hold on the 'condition block', the 'then block' and the
1209 basic_block cond_bb = e->src;
1210 basic_block fallthru_bb = e->dest;
1211 basic_block then_bb = create_empty_bb (cond_bb);
1214 add_bb_to_loop (then_bb, cond_bb->loop_father);
1215 loops_state_set (LOOPS_NEED_FIXUP);
1218 /* Set up the newly created 'then block'. */
1219 e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
1220 int fallthrough_probability
1221 = then_more_likely_p
1222 ? PROB_VERY_UNLIKELY
1223 : PROB_ALWAYS - PROB_VERY_UNLIKELY;
1224 e->probability = PROB_ALWAYS - fallthrough_probability;
1225 if (create_then_fallthru_edge)
1226 make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU);
1228 /* Set up the fallthrough basic block. */
1229 e = find_edge (cond_bb, fallthru_bb);
1230 e->flags = EDGE_FALSE_VALUE;
1231 e->count = cond_bb->count;
1232 e->probability = fallthrough_probability;
1234 /* Update dominance info for the newly created then_bb; note that
1235 fallthru_bb's dominance info has already been updated by
1237 if (dom_info_available_p (CDI_DOMINATORS))
1238 set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
1240 *then_block = then_bb;
1241 *fallthrough_block = fallthru_bb;
1242 *iter = gsi_start_bb (fallthru_bb);
1244 return gsi_last_bb (cond_bb);
1247 /* Insert an if condition followed by a 'then block' right before the
1248 statement pointed to by ITER. The fallthrough block -- which is the
1249 else block of the condition as well as the destination of the
1250 outcoming edge of the 'then block' -- starts with the statement
1253 COND is the condition of the if.
1255 If THEN_MORE_LIKELY_P is true, the probability of the edge to the
1256 'then block' is higher than the probability of the edge to the
1259 Upon completion of the function, *THEN_BB is set to the newly
1260 inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
1263 *ITER is adjusted to still point to the same statement it was
1264 pointing to initially. */
1267 insert_if_then_before_iter (gimple cond,
1268 gimple_stmt_iterator *iter,
1269 bool then_more_likely_p,
1270 basic_block *then_bb,
1271 basic_block *fallthrough_bb)
1273 gimple_stmt_iterator cond_insert_point =
1274 create_cond_insert_point (iter,
1277 /*create_then_fallthru_edge=*/true,
1280 gsi_insert_after (&cond_insert_point, cond, GSI_NEW_STMT);
1283 /* Instrument the memory access instruction BASE. Insert new
1284 statements before or after ITER.
1286 Note that the memory access represented by BASE can be either an
1287 SSA_NAME, or a non-SSA expression. LOCATION is the source code
1288 location. IS_STORE is TRUE for a store, FALSE for a load.
1289 BEFORE_P is TRUE for inserting the instrumentation code before
1290 ITER, FALSE for inserting it after ITER. SIZE_IN_BYTES is one of
1293 If BEFORE_P is TRUE, *ITER is arranged to still point to the
1294 statement it was pointing to prior to calling this function,
1295 otherwise, it points to the statement logically following it. */
1298 build_check_stmt (location_t location, tree base, gimple_stmt_iterator *iter,
1299 bool before_p, bool is_store, int size_in_bytes)
1301 gimple_stmt_iterator gsi;
1302 basic_block then_bb, else_bb;
1303 tree t, base_addr, shadow;
1305 tree shadow_ptr_type = shadow_ptr_types[size_in_bytes == 16 ? 1 : 0];
1306 tree shadow_type = TREE_TYPE (shadow_ptr_type);
1308 = build_nonstandard_integer_type (TYPE_PRECISION (TREE_TYPE (base)), 1);
1309 tree base_ssa = base;
1311 /* Get an iterator on the point where we can add the condition
1312 statement for the instrumentation. */
1313 gsi = create_cond_insert_point (iter, before_p,
1314 /*then_more_likely_p=*/false,
1315 /*create_then_fallthru_edge=*/false,
1319 base = unshare_expr (base);
1321 /* BASE can already be an SSA_NAME; in that case, do not create a
1322 new SSA_NAME for it. */
1323 if (TREE_CODE (base) != SSA_NAME)
1325 g = gimple_build_assign_with_ops (TREE_CODE (base),
1326 make_ssa_name (TREE_TYPE (base), NULL),
1328 gimple_set_location (g, location);
1329 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1330 base_ssa = gimple_assign_lhs (g);
1333 g = gimple_build_assign_with_ops (NOP_EXPR,
1334 make_ssa_name (uintptr_type, NULL),
1335 base_ssa, NULL_TREE);
1336 gimple_set_location (g, location);
1337 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1338 base_addr = gimple_assign_lhs (g);
1341 (base_addr >> ASAN_SHADOW_SHIFT) + targetm.asan_shadow_offset (). */
1343 t = build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT);
1344 g = gimple_build_assign_with_ops (RSHIFT_EXPR,
1345 make_ssa_name (uintptr_type, NULL),
1347 gimple_set_location (g, location);
1348 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1350 t = build_int_cst (uintptr_type, targetm.asan_shadow_offset ());
1351 g = gimple_build_assign_with_ops (PLUS_EXPR,
1352 make_ssa_name (uintptr_type, NULL),
1353 gimple_assign_lhs (g), t);
1354 gimple_set_location (g, location);
1355 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1357 g = gimple_build_assign_with_ops (NOP_EXPR,
1358 make_ssa_name (shadow_ptr_type, NULL),
1359 gimple_assign_lhs (g), NULL_TREE);
1360 gimple_set_location (g, location);
1361 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1363 t = build2 (MEM_REF, shadow_type, gimple_assign_lhs (g),
1364 build_int_cst (shadow_ptr_type, 0));
1365 g = gimple_build_assign_with_ops (MEM_REF,
1366 make_ssa_name (shadow_type, NULL),
1368 gimple_set_location (g, location);
1369 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1370 shadow = gimple_assign_lhs (g);
1372 if (size_in_bytes < 8)
1374 /* Slow path for 1, 2 and 4 byte accesses.
1376 & ((base_addr & 7) + (size_in_bytes - 1)) >= shadow). */
1377 gimple_seq seq = NULL;
1378 gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
1379 gimple_seq_add_stmt (&seq, shadow_test);
1380 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, base_addr, 7));
1381 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
1382 gimple_seq_last (seq)));
1383 if (size_in_bytes > 1)
1384 gimple_seq_add_stmt (&seq,
1385 build_assign (PLUS_EXPR, gimple_seq_last (seq),
1386 size_in_bytes - 1));
1387 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR, gimple_seq_last (seq),
1389 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
1390 gimple_seq_last (seq)));
1391 t = gimple_assign_lhs (gimple_seq_last (seq));
1392 gimple_seq_set_location (seq, location);
1393 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
1398 g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
1399 NULL_TREE, NULL_TREE);
1400 gimple_set_location (g, location);
1401 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1403 /* Generate call to the run-time library (e.g. __asan_report_load8). */
1404 gsi = gsi_start_bb (then_bb);
1405 g = gimple_build_call (report_error_func (is_store, size_in_bytes),
1407 gimple_set_location (g, location);
1408 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1410 *iter = gsi_start_bb (else_bb);
1413 /* If T represents a memory access, add instrumentation code before ITER.
1414 LOCATION is source code location.
1415 IS_STORE is either TRUE (for a store) or FALSE (for a load). */
1418 instrument_derefs (gimple_stmt_iterator *iter, tree t,
1419 location_t location, bool is_store)
1422 HOST_WIDE_INT size_in_bytes;
1424 type = TREE_TYPE (t);
1425 switch (TREE_CODE (t))
1436 size_in_bytes = int_size_in_bytes (type);
1437 if ((size_in_bytes & (size_in_bytes - 1)) != 0
1438 || (unsigned HOST_WIDE_INT) size_in_bytes - 1 >= 16)
1441 HOST_WIDE_INT bitsize, bitpos;
1443 enum machine_mode mode;
1444 int volatilep = 0, unsignedp = 0;
1445 get_inner_reference (t, &bitsize, &bitpos, &offset,
1446 &mode, &unsignedp, &volatilep, false);
1447 if (bitpos % (size_in_bytes * BITS_PER_UNIT)
1448 || bitsize != size_in_bytes * BITS_PER_UNIT)
1450 if (TREE_CODE (t) == COMPONENT_REF
1451 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
1453 tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
1454 instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
1455 TREE_OPERAND (t, 0), repr,
1456 NULL_TREE), location, is_store);
1461 base = build_fold_addr_expr (t);
1462 if (!has_mem_ref_been_instrumented (base, size_in_bytes))
1464 build_check_stmt (location, base, iter, /*before_p=*/true,
1465 is_store, size_in_bytes);
1466 update_mem_ref_hash_table (base, size_in_bytes);
1467 update_mem_ref_hash_table (t, size_in_bytes);
1472 /* Instrument an access to a contiguous memory region that starts at
1473 the address pointed to by BASE, over a length of LEN (expressed in
1474 the sizeof (*BASE) bytes). ITER points to the instruction before
1475 which the instrumentation instructions must be inserted. LOCATION
1476 is the source location that the instrumentation instructions must
1477 have. If IS_STORE is true, then the memory access is a store;
1478 otherwise, it's a load. */
1481 instrument_mem_region_access (tree base, tree len,
1482 gimple_stmt_iterator *iter,
1483 location_t location, bool is_store)
1485 if (!POINTER_TYPE_P (TREE_TYPE (base))
1486 || !INTEGRAL_TYPE_P (TREE_TYPE (len))
1487 || integer_zerop (len))
1490 gimple_stmt_iterator gsi = *iter;
1492 basic_block fallthrough_bb = NULL, then_bb = NULL;
1494 /* If the beginning of the memory region has already been
1495 instrumented, do not instrument it. */
1496 bool start_instrumented = has_mem_ref_been_instrumented (base, 1);
1498 /* If the end of the memory region has already been instrumented, do
1499 not instrument it. */
1500 tree end = asan_mem_ref_get_end (base, len);
1501 bool end_instrumented = has_mem_ref_been_instrumented (end, 1);
1503 if (start_instrumented && end_instrumented)
1506 if (!is_gimple_constant (len))
1508 /* So, the length of the memory area to asan-protect is
1509 non-constant. Let's guard the generated instrumentation code
1514 //asan instrumentation code goes here.
1516 // falltrough instructions, starting with *ITER. */
1518 gimple g = gimple_build_cond (NE_EXPR,
1520 build_int_cst (TREE_TYPE (len), 0),
1521 NULL_TREE, NULL_TREE);
1522 gimple_set_location (g, location);
1523 insert_if_then_before_iter (g, iter, /*then_more_likely_p=*/true,
1524 &then_bb, &fallthrough_bb);
1525 /* Note that fallthrough_bb starts with the statement that was
1526 pointed to by ITER. */
1528 /* The 'then block' of the 'if (len != 0) condition is where
1529 we'll generate the asan instrumentation code now. */
1530 gsi = gsi_last_bb (then_bb);
1533 if (!start_instrumented)
1535 /* Instrument the beginning of the memory region to be accessed,
1536 and arrange for the rest of the intrumentation code to be
1537 inserted in the then block *after* the current gsi. */
1538 build_check_stmt (location, base, &gsi, /*before_p=*/true, is_store, 1);
1541 /* We are in the case where the length of the region is not
1542 constant; so instrumentation code is being generated in the
1543 'then block' of the 'if (len != 0) condition. Let's arrange
1544 for the subsequent instrumentation statements to go in the
1546 gsi = gsi_last_bb (then_bb);
1550 /* Don't remember this access as instrumented, if length
1551 is unknown. It might be zero and not being actually
1552 instrumented, so we can't rely on it being instrumented. */
1553 update_mem_ref_hash_table (base, 1);
1557 if (end_instrumented)
1560 /* We want to instrument the access at the end of the memory region,
1561 which is at (base + len - 1). */
1563 /* offset = len - 1; */
1564 len = unshare_expr (len);
1566 gimple_seq seq = NULL;
1567 if (TREE_CODE (len) == INTEGER_CST)
1568 offset = fold_build2 (MINUS_EXPR, size_type_node,
1569 fold_convert (size_type_node, len),
1570 build_int_cst (size_type_node, 1));
1576 if (TREE_CODE (len) != SSA_NAME)
1578 t = make_ssa_name (TREE_TYPE (len), NULL);
1579 g = gimple_build_assign_with_ops (TREE_CODE (len), t, len, NULL);
1580 gimple_set_location (g, location);
1581 gimple_seq_add_stmt_without_update (&seq, g);
1584 if (!useless_type_conversion_p (size_type_node, TREE_TYPE (len)))
1586 t = make_ssa_name (size_type_node, NULL);
1587 g = gimple_build_assign_with_ops (NOP_EXPR, t, len, NULL);
1588 gimple_set_location (g, location);
1589 gimple_seq_add_stmt_without_update (&seq, g);
1593 t = make_ssa_name (size_type_node, NULL);
1594 g = gimple_build_assign_with_ops (MINUS_EXPR, t, len,
1595 build_int_cst (size_type_node, 1));
1596 gimple_set_location (g, location);
1597 gimple_seq_add_stmt_without_update (&seq, g);
1598 offset = gimple_assign_lhs (g);
1602 base = unshare_expr (base);
1604 gimple_build_assign_with_ops (TREE_CODE (base),
1605 make_ssa_name (TREE_TYPE (base), NULL),
1607 gimple_set_location (region_end, location);
1608 gimple_seq_add_stmt_without_update (&seq, region_end);
1610 /* _2 = _1 + offset; */
1612 gimple_build_assign_with_ops (POINTER_PLUS_EXPR,
1613 make_ssa_name (TREE_TYPE (base), NULL),
1614 gimple_assign_lhs (region_end),
1616 gimple_set_location (region_end, location);
1617 gimple_seq_add_stmt_without_update (&seq, region_end);
1618 gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
1620 /* instrument access at _2; */
1621 gsi = gsi_for_stmt (region_end);
1622 build_check_stmt (location, gimple_assign_lhs (region_end),
1623 &gsi, /*before_p=*/false, is_store, 1);
1625 if (then_bb == NULL)
1626 update_mem_ref_hash_table (end, 1);
1628 *iter = gsi_for_stmt (gsi_stmt (*iter));
1631 /* Instrument the call (to the builtin strlen function) pointed to by
1634 This function instruments the access to the first byte of the
1635 argument, right before the call. After the call it instruments the
1636 access to the last byte of the argument; it uses the result of the
1637 call to deduce the offset of that last byte.
1639 Upon completion, iff the call has actually been instrumented, this
1640 function returns TRUE and *ITER points to the statement logically
1641 following the built-in strlen function call *ITER was initially
1642 pointing to. Otherwise, the function returns FALSE and *ITER
1643 remains unchanged. */
1646 instrument_strlen_call (gimple_stmt_iterator *iter)
1648 gimple call = gsi_stmt (*iter);
1649 gcc_assert (is_gimple_call (call));
1651 tree callee = gimple_call_fndecl (call);
1652 gcc_assert (is_builtin_fn (callee)
1653 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
1654 && DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN);
1656 tree len = gimple_call_lhs (call);
1658 /* Some passes might clear the return value of the strlen call;
1659 bail out in that case. Return FALSE as we are not advancing
1662 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (len)));
1664 location_t loc = gimple_location (call);
1665 tree str_arg = gimple_call_arg (call, 0);
1667 /* Instrument the access to the first byte of str_arg. i.e:
1669 _1 = str_arg; instrument (_1); */
1670 tree cptr_type = build_pointer_type (char_type_node);
1671 gimple str_arg_ssa =
1672 gimple_build_assign_with_ops (NOP_EXPR,
1673 make_ssa_name (cptr_type, NULL),
1675 gimple_set_location (str_arg_ssa, loc);
1676 gimple_stmt_iterator gsi = *iter;
1677 gsi_insert_before (&gsi, str_arg_ssa, GSI_NEW_STMT);
1678 build_check_stmt (loc, gimple_assign_lhs (str_arg_ssa), &gsi,
1679 /*before_p=*/false, /*is_store=*/false, 1);
1681 /* If we initially had an instruction like:
1683 int n = strlen (str)
1685 we now want to instrument the access to str[n], after the
1686 instruction above.*/
1688 /* So let's build the access to str[n] that is, access through the
1689 pointer_plus expr: (_1 + len). */
1691 gimple_build_assign_with_ops (POINTER_PLUS_EXPR,
1692 make_ssa_name (cptr_type, NULL),
1693 gimple_assign_lhs (str_arg_ssa),
1695 gimple_set_location (stmt, loc);
1696 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1698 build_check_stmt (loc, gimple_assign_lhs (stmt), &gsi,
1699 /*before_p=*/false, /*is_store=*/false, 1);
1701 /* Ensure that iter points to the statement logically following the
1702 one it was initially pointing to. */
1704 /* As *ITER has been advanced to point to the next statement, let's
1705 return true to inform transform_statements that it shouldn't
1706 advance *ITER anymore; otherwises it will skip that next
1707 statement, which wouldn't be instrumented. */
1711 /* Instrument the call to a built-in memory access function that is
1712 pointed to by the iterator ITER.
1714 Upon completion, return TRUE iff *ITER has been advanced to the
1715 statement following the one it was originally pointing to. */
1718 instrument_builtin_call (gimple_stmt_iterator *iter)
1720 bool iter_advanced_p = false;
1721 gimple call = gsi_stmt (*iter);
1723 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
1725 tree callee = gimple_call_fndecl (call);
1726 location_t loc = gimple_location (call);
1728 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN)
1729 iter_advanced_p = instrument_strlen_call (iter);
1732 asan_mem_ref src0, src1, dest;
1733 asan_mem_ref_init (&src0, NULL, 1);
1734 asan_mem_ref_init (&src1, NULL, 1);
1735 asan_mem_ref_init (&dest, NULL, 1);
1737 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
1738 bool src0_is_store = false, src1_is_store = false,
1739 dest_is_store = false, dest_is_deref = false;
1741 if (get_mem_refs_of_builtin_call (call,
1742 &src0, &src0_len, &src0_is_store,
1743 &src1, &src1_len, &src1_is_store,
1744 &dest, &dest_len, &dest_is_store,
1749 instrument_derefs (iter, dest.start, loc, dest_is_store);
1751 iter_advanced_p = true;
1753 else if (src0_len || src1_len || dest_len)
1755 if (src0.start != NULL_TREE)
1756 instrument_mem_region_access (src0.start, src0_len,
1757 iter, loc, /*is_store=*/false);
1758 if (src1.start != NULL_TREE)
1759 instrument_mem_region_access (src1.start, src1_len,
1760 iter, loc, /*is_store=*/false);
1761 if (dest.start != NULL_TREE)
1762 instrument_mem_region_access (dest.start, dest_len,
1763 iter, loc, /*is_store=*/true);
1764 *iter = gsi_for_stmt (call);
1766 iter_advanced_p = true;
1770 return iter_advanced_p;
1773 /* Instrument the assignment statement ITER if it is subject to
1774 instrumentation. Return TRUE iff instrumentation actually
1775 happened. In that case, the iterator ITER is advanced to the next
1776 logical expression following the one initially pointed to by ITER,
1777 and the relevant memory reference that which access has been
1778 instrumented is added to the memory references hash table. */
1781 maybe_instrument_assignment (gimple_stmt_iterator *iter)
1783 gimple s = gsi_stmt (*iter);
1785 gcc_assert (gimple_assign_single_p (s));
1787 tree ref_expr = NULL_TREE;
1788 bool is_store, is_instrumented = false;
1790 if (gimple_store_p (s))
1792 ref_expr = gimple_assign_lhs (s);
1794 instrument_derefs (iter, ref_expr,
1795 gimple_location (s),
1797 is_instrumented = true;
1800 if (gimple_assign_load_p (s))
1802 ref_expr = gimple_assign_rhs1 (s);
1804 instrument_derefs (iter, ref_expr,
1805 gimple_location (s),
1807 is_instrumented = true;
1810 if (is_instrumented)
1813 return is_instrumented;
1816 /* Instrument the function call pointed to by the iterator ITER, if it
1817 is subject to instrumentation. At the moment, the only function
1818 calls that are instrumented are some built-in functions that access
1819 memory. Look at instrument_builtin_call to learn more.
1821 Upon completion return TRUE iff *ITER was advanced to the statement
1822 following the one it was originally pointing to. */
1825 maybe_instrument_call (gimple_stmt_iterator *iter)
1827 gimple stmt = gsi_stmt (*iter);
1828 bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
1830 if (is_builtin && instrument_builtin_call (iter))
1833 if (gimple_call_noreturn_p (stmt))
1837 tree callee = gimple_call_fndecl (stmt);
1838 switch (DECL_FUNCTION_CODE (callee))
1840 case BUILT_IN_UNREACHABLE:
1842 /* Don't instrument these. */
1846 tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN);
1847 gimple g = gimple_build_call (decl, 0);
1848 gimple_set_location (g, gimple_location (stmt));
1849 gsi_insert_before (iter, g, GSI_SAME_STMT);
1854 /* Walk each instruction of all basic block and instrument those that
1855 represent memory references: loads, stores, or function calls.
1856 In a given basic block, this function avoids instrumenting memory
1857 references that have already been instrumented. */
1860 transform_statements (void)
1862 basic_block bb, last_bb = NULL;
1863 gimple_stmt_iterator i;
1864 int saved_last_basic_block = last_basic_block;
1868 basic_block prev_bb = bb;
1870 if (bb->index >= saved_last_basic_block) continue;
1872 /* Flush the mem ref hash table, if current bb doesn't have
1873 exactly one predecessor, or if that predecessor (skipping
1874 over asan created basic blocks) isn't the last processed
1875 basic block. Thus we effectively flush on extended basic
1876 block boundaries. */
1877 while (single_pred_p (prev_bb))
1879 prev_bb = single_pred (prev_bb);
1880 if (prev_bb->index < saved_last_basic_block)
1883 if (prev_bb != last_bb)
1884 empty_mem_ref_hash_table ();
1887 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
1889 gimple s = gsi_stmt (i);
1891 if (has_stmt_been_instrumented_p (s))
1893 else if (gimple_assign_single_p (s)
1894 && maybe_instrument_assignment (&i))
1895 /* Nothing to do as maybe_instrument_assignment advanced
1897 else if (is_gimple_call (s) && maybe_instrument_call (&i))
1898 /* Nothing to do as maybe_instrument_call
1899 advanced the iterator I. */;
1902 /* No instrumentation happened.
1904 If the current instruction is a function call that
1905 might free something, let's forget about the memory
1906 references that got instrumented. Otherwise we might
1907 miss some instrumentation opportunities. */
1908 if (is_gimple_call (s) && !nonfreeing_call_p (s))
1909 empty_mem_ref_hash_table ();
1915 free_mem_ref_resources ();
1919 struct __asan_global
1923 uptr __size_with_redzone;
1925 uptr __has_dynamic_init;
1929 asan_global_struct (void)
1931 static const char *field_names[5]
1932 = { "__beg", "__size", "__size_with_redzone",
1933 "__name", "__has_dynamic_init" };
1934 tree fields[5], ret;
1937 ret = make_node (RECORD_TYPE);
1938 for (i = 0; i < 5; i++)
1941 = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
1942 get_identifier (field_names[i]),
1943 (i == 0 || i == 3) ? const_ptr_type_node
1944 : pointer_sized_int_node);
1945 DECL_CONTEXT (fields[i]) = ret;
1947 DECL_CHAIN (fields[i - 1]) = fields[i];
1949 TYPE_FIELDS (ret) = fields[0];
1950 TYPE_NAME (ret) = get_identifier ("__asan_global");
1955 /* Append description of a single global DECL into vector V.
1956 TYPE is __asan_global struct type as returned by asan_global_struct. */
1959 asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
1961 tree init, uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
1962 unsigned HOST_WIDE_INT size;
1963 tree str_cst, refdecl = decl;
1964 vec<constructor_elt, va_gc> *vinner = NULL;
1966 pretty_printer asan_pp;
1968 if (DECL_NAME (decl))
1969 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
1971 pp_string (&asan_pp, "<unknown>");
1972 pp_space (&asan_pp);
1973 pp_left_paren (&asan_pp);
1974 pp_string (&asan_pp, main_input_filename);
1975 pp_right_paren (&asan_pp);
1976 str_cst = asan_pp_string (&asan_pp);
1978 if (asan_needs_local_alias (decl))
1981 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
1982 refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
1983 VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
1984 TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
1985 TREE_READONLY (refdecl) = TREE_READONLY (decl);
1986 TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
1987 DECL_GIMPLE_REG_P (refdecl) = DECL_GIMPLE_REG_P (decl);
1988 DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
1989 DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
1990 TREE_STATIC (refdecl) = 1;
1991 TREE_PUBLIC (refdecl) = 0;
1992 TREE_USED (refdecl) = 1;
1993 assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
1996 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
1997 fold_convert (const_ptr_type_node,
1998 build_fold_addr_expr (refdecl)));
1999 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
2000 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2001 size += asan_red_zone_size (size);
2002 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2003 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2004 fold_convert (const_ptr_type_node, str_cst));
2005 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, 0));
2006 init = build_constructor (type, vinner);
2007 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
2010 /* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
2012 initialize_sanitizer_builtins (void)
2016 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
2019 tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
2021 = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
2022 tree BT_FN_VOID_PTR_PTR_PTR
2023 = build_function_type_list (void_type_node, ptr_type_node,
2024 ptr_type_node, ptr_type_node, NULL_TREE);
2025 tree BT_FN_VOID_PTR_PTRMODE
2026 = build_function_type_list (void_type_node, ptr_type_node,
2027 pointer_sized_int_node, NULL_TREE);
2029 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
2030 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
2031 tree BT_FN_IX_CONST_VPTR_INT[5];
2032 tree BT_FN_IX_VPTR_IX_INT[5];
2033 tree BT_FN_VOID_VPTR_IX_INT[5];
2035 = build_pointer_type (build_qualified_type (void_type_node,
2036 TYPE_QUAL_VOLATILE));
2038 = build_pointer_type (build_qualified_type (void_type_node,
2042 = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
2044 for (i = 0; i < 5; i++)
2046 tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
2047 BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
2048 = build_function_type_list (boolt, vptr, ptr_type_node, ix,
2049 integer_type_node, integer_type_node,
2051 BT_FN_IX_CONST_VPTR_INT[i]
2052 = build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
2053 BT_FN_IX_VPTR_IX_INT[i]
2054 = build_function_type_list (ix, vptr, ix, integer_type_node,
2056 BT_FN_VOID_VPTR_IX_INT[i]
2057 = build_function_type_list (void_type_node, vptr, ix,
2058 integer_type_node, NULL_TREE);
2060 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
2061 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
2062 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
2063 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
2064 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
2065 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
2066 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
2067 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
2068 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
2069 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
2070 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
2071 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
2072 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
2073 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
2074 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
2075 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
2076 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
2077 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
2078 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
2079 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
2080 #undef ATTR_NOTHROW_LEAF_LIST
2081 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
2082 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
2083 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
2084 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
2085 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
2086 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
2087 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
2088 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
2089 #undef ATTR_COLD_NOTHROW_LEAF_LIST
2090 #define ATTR_COLD_NOTHROW_LEAF_LIST \
2091 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
2092 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
2093 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
2094 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
2095 #undef DEF_SANITIZER_BUILTIN
2096 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
2097 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
2098 BUILT_IN_NORMAL, NAME, NULL_TREE); \
2099 set_call_expr_flags (decl, ATTRS); \
2100 set_builtin_decl (ENUM, decl, true);
2102 #include "sanitizer.def"
2104 #undef DEF_SANITIZER_BUILTIN
2107 /* Called via htab_traverse. Count number of emitted
2108 STRING_CSTs in the constant hash table. */
2111 count_string_csts (void **slot, void *data)
2113 struct constant_descriptor_tree *desc
2114 = (struct constant_descriptor_tree *) *slot;
2115 if (TREE_CODE (desc->value) == STRING_CST
2116 && TREE_ASM_WRITTEN (desc->value)
2117 && asan_protect_global (desc->value))
2118 ++*((unsigned HOST_WIDE_INT *) data);
2122 /* Helper structure to pass two parameters to
2125 struct asan_add_string_csts_data
2128 vec<constructor_elt, va_gc> *v;
2131 /* Called via htab_traverse. Call asan_add_global
2132 on emitted STRING_CSTs from the constant hash table. */
2135 add_string_csts (void **slot, void *data)
2137 struct constant_descriptor_tree *desc
2138 = (struct constant_descriptor_tree *) *slot;
2139 if (TREE_CODE (desc->value) == STRING_CST
2140 && TREE_ASM_WRITTEN (desc->value)
2141 && asan_protect_global (desc->value))
2143 struct asan_add_string_csts_data *aascd
2144 = (struct asan_add_string_csts_data *) data;
2145 asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
2146 aascd->type, aascd->v);
2151 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
2152 invoke ggc_collect. */
2153 static GTY(()) tree asan_ctor_statements;
2155 /* Module-level instrumentation.
2156 - Insert __asan_init() into the list of CTORs.
2157 - TODO: insert redzones around globals.
2161 asan_finish_file (void)
2163 struct varpool_node *vnode;
2164 unsigned HOST_WIDE_INT gcount = 0;
2166 if (shadow_ptr_types[0] == NULL_TREE)
2167 asan_init_shadow_ptr_types ();
2168 /* Avoid instrumenting code in the asan ctors/dtors.
2169 We don't need to insert padding after the description strings,
2170 nor after .LASAN* array. */
2171 flag_sanitize &= ~SANITIZE_ADDRESS;
2173 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
2174 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
2175 FOR_EACH_DEFINED_VARIABLE (vnode)
2176 if (TREE_ASM_WRITTEN (vnode->symbol.decl)
2177 && asan_protect_global (vnode->symbol.decl))
2179 htab_t const_desc_htab = constant_pool_htab ();
2180 htab_traverse (const_desc_htab, count_string_csts, &gcount);
2183 tree type = asan_global_struct (), var, ctor;
2184 tree dtor_statements = NULL_TREE;
2185 vec<constructor_elt, va_gc> *v;
2188 type = build_array_type_nelts (type, gcount);
2189 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
2190 var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
2192 TREE_STATIC (var) = 1;
2193 TREE_PUBLIC (var) = 0;
2194 DECL_ARTIFICIAL (var) = 1;
2195 DECL_IGNORED_P (var) = 1;
2196 vec_alloc (v, gcount);
2197 FOR_EACH_DEFINED_VARIABLE (vnode)
2198 if (TREE_ASM_WRITTEN (vnode->symbol.decl)
2199 && asan_protect_global (vnode->symbol.decl))
2200 asan_add_global (vnode->symbol.decl, TREE_TYPE (type), v);
2201 struct asan_add_string_csts_data aascd;
2202 aascd.type = TREE_TYPE (type);
2204 htab_traverse (const_desc_htab, add_string_csts, &aascd);
2205 ctor = build_constructor (type, v);
2206 TREE_CONSTANT (ctor) = 1;
2207 TREE_STATIC (ctor) = 1;
2208 DECL_INITIAL (var) = ctor;
2209 varpool_assemble_decl (varpool_node_for_decl (var));
2211 fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
2212 tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
2213 append_to_statement_list (build_call_expr (fn, 2,
2214 build_fold_addr_expr (var),
2216 &asan_ctor_statements);
2218 fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
2219 append_to_statement_list (build_call_expr (fn, 2,
2220 build_fold_addr_expr (var),
2223 cgraph_build_static_cdtor ('D', dtor_statements,
2224 MAX_RESERVED_INIT_PRIORITY - 1);
2226 cgraph_build_static_cdtor ('I', asan_ctor_statements,
2227 MAX_RESERVED_INIT_PRIORITY - 1);
2228 flag_sanitize |= SANITIZE_ADDRESS;
2231 /* Instrument the current function. */
2234 asan_instrument (void)
2236 if (shadow_ptr_types[0] == NULL_TREE)
2237 asan_init_shadow_ptr_types ();
2238 transform_statements ();
2245 return (flag_sanitize & SANITIZE_ADDRESS) != 0
2246 && !lookup_attribute ("no_sanitize_address",
2247 DECL_ATTRIBUTES (current_function_decl));
2252 const pass_data pass_data_asan =
2254 GIMPLE_PASS, /* type */
2256 OPTGROUP_NONE, /* optinfo_flags */
2257 true, /* has_gate */
2258 true, /* has_execute */
2259 TV_NONE, /* tv_id */
2260 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2261 0, /* properties_provided */
2262 0, /* properties_destroyed */
2263 0, /* todo_flags_start */
2264 ( TODO_verify_flow | TODO_verify_stmts
2265 | TODO_update_ssa ), /* todo_flags_finish */
2268 class pass_asan : public gimple_opt_pass
2271 pass_asan(gcc::context *ctxt)
2272 : gimple_opt_pass(pass_data_asan, ctxt)
2275 /* opt_pass methods: */
2276 opt_pass * clone () { return new pass_asan (ctxt_); }
2277 bool gate () { return gate_asan (); }
2278 unsigned int execute () { return asan_instrument (); }
2280 }; // class pass_asan
2285 make_pass_asan (gcc::context *ctxt)
2287 return new pass_asan (ctxt);
2293 return !optimize && gate_asan ();
2298 const pass_data pass_data_asan_O0 =
2300 GIMPLE_PASS, /* type */
2302 OPTGROUP_NONE, /* optinfo_flags */
2303 true, /* has_gate */
2304 true, /* has_execute */
2305 TV_NONE, /* tv_id */
2306 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2307 0, /* properties_provided */
2308 0, /* properties_destroyed */
2309 0, /* todo_flags_start */
2310 ( TODO_verify_flow | TODO_verify_stmts
2311 | TODO_update_ssa ), /* todo_flags_finish */
2314 class pass_asan_O0 : public gimple_opt_pass
2317 pass_asan_O0(gcc::context *ctxt)
2318 : gimple_opt_pass(pass_data_asan_O0, ctxt)
2321 /* opt_pass methods: */
2322 bool gate () { return gate_asan_O0 (); }
2323 unsigned int execute () { return asan_instrument (); }
2325 }; // class pass_asan_O0
2330 make_pass_asan_O0 (gcc::context *ctxt)
2332 return new pass_asan_O0 (ctxt);
2335 #include "gt-asan.h"