Use rtx_insn for various target.def hooks
[official-gcc.git] / gcc / asan.c
blob58e77191d333b6c46a57117c97a6c0ac4d2a161e
1 /* AddressSanitizer, a fast memory error detector.
2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
3 Contributed by Kostya Serebryany <kcc@google.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tree.h"
26 #include "hash-table.h"
27 #include "basic-block.h"
28 #include "tree-ssa-alias.h"
29 #include "internal-fn.h"
30 #include "gimple-expr.h"
31 #include "is-a.h"
32 #include "inchash.h"
33 #include "gimple.h"
34 #include "gimplify.h"
35 #include "gimple-iterator.h"
36 #include "calls.h"
37 #include "varasm.h"
38 #include "stor-layout.h"
39 #include "tree-iterator.h"
40 #include "cgraph.h"
41 #include "stringpool.h"
42 #include "tree-ssanames.h"
43 #include "tree-pass.h"
44 #include "asan.h"
45 #include "gimple-pretty-print.h"
46 #include "target.h"
47 #include "expr.h"
48 #include "optabs.h"
49 #include "output.h"
50 #include "tm_p.h"
51 #include "langhooks.h"
52 #include "alloc-pool.h"
53 #include "cfgloop.h"
54 #include "gimple-builder.h"
55 #include "ubsan.h"
56 #include "predict.h"
57 #include "params.h"
58 #include "builtins.h"
60 /* AddressSanitizer finds out-of-bounds and use-after-free bugs
61 with <2x slowdown on average.
63 The tool consists of two parts:
64 instrumentation module (this file) and a run-time library.
65 The instrumentation module adds a run-time check before every memory insn.
66 For a 8- or 16- byte load accessing address X:
67 ShadowAddr = (X >> 3) + Offset
68 ShadowValue = *(char*)ShadowAddr; // *(short*) for 16-byte access.
69 if (ShadowValue)
70 __asan_report_load8(X);
71 For a load of N bytes (N=1, 2 or 4) from address X:
72 ShadowAddr = (X >> 3) + Offset
73 ShadowValue = *(char*)ShadowAddr;
74 if (ShadowValue)
75 if ((X & 7) + N - 1 > ShadowValue)
76 __asan_report_loadN(X);
77 Stores are instrumented similarly, but using __asan_report_storeN functions.
78 A call too __asan_init_vN() is inserted to the list of module CTORs.
79 N is the version number of the AddressSanitizer API. The changes between the
80 API versions are listed in libsanitizer/asan/asan_interface_internal.h.
82 The run-time library redefines malloc (so that redzone are inserted around
83 the allocated memory) and free (so that reuse of free-ed memory is delayed),
84 provides __asan_report* and __asan_init_vN functions.
86 Read more:
87 http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
89 The current implementation supports detection of out-of-bounds and
90 use-after-free in the heap, on the stack and for global variables.
92 [Protection of stack variables]
94 To understand how detection of out-of-bounds and use-after-free works
95 for stack variables, lets look at this example on x86_64 where the
96 stack grows downward:
98 int
99 foo ()
101 char a[23] = {0};
102 int b[2] = {0};
104 a[5] = 1;
105 b[1] = 2;
107 return a[5] + b[1];
110 For this function, the stack protected by asan will be organized as
111 follows, from the top of the stack to the bottom:
113 Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
115 Slot 2/ [8 bytes of red zone, that adds up to the space of 'a' to make
116 the next slot be 32 bytes aligned; this one is called Partial
117 Redzone; this 32 bytes alignment is an asan constraint]
119 Slot 3/ [24 bytes for variable 'a']
121 Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
123 Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
125 Slot 6/ [8 bytes for variable 'b']
127 Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
128 'LEFT RedZone']
130 The 32 bytes of LEFT red zone at the bottom of the stack can be
131 decomposed as such:
133 1/ The first 8 bytes contain a magical asan number that is always
134 0x41B58AB3.
136 2/ The following 8 bytes contains a pointer to a string (to be
137 parsed at runtime by the runtime asan library), which format is
138 the following:
140 "<function-name> <space> <num-of-variables-on-the-stack>
141 (<32-bytes-aligned-offset-in-bytes-of-variable> <space>
142 <length-of-var-in-bytes> ){n} "
144 where '(...){n}' means the content inside the parenthesis occurs 'n'
145 times, with 'n' being the number of variables on the stack.
147 3/ The following 8 bytes contain the PC of the current function which
148 will be used by the run-time library to print an error message.
150 4/ The following 8 bytes are reserved for internal use by the run-time.
152 The shadow memory for that stack layout is going to look like this:
154 - content of shadow memory 8 bytes for slot 7: 0xF1F1F1F1.
155 The F1 byte pattern is a magic number called
156 ASAN_STACK_MAGIC_LEFT and is a way for the runtime to know that
157 the memory for that shadow byte is part of a the LEFT red zone
158 intended to seat at the bottom of the variables on the stack.
160 - content of shadow memory 8 bytes for slots 6 and 5:
161 0xF4F4F400. The F4 byte pattern is a magic number
162 called ASAN_STACK_MAGIC_PARTIAL. It flags the fact that the
163 memory region for this shadow byte is a PARTIAL red zone
164 intended to pad a variable A, so that the slot following
165 {A,padding} is 32 bytes aligned.
167 Note that the fact that the least significant byte of this
168 shadow memory content is 00 means that 8 bytes of its
169 corresponding memory (which corresponds to the memory of
170 variable 'b') is addressable.
172 - content of shadow memory 8 bytes for slot 4: 0xF2F2F2F2.
173 The F2 byte pattern is a magic number called
174 ASAN_STACK_MAGIC_MIDDLE. It flags the fact that the memory
175 region for this shadow byte is a MIDDLE red zone intended to
176 seat between two 32 aligned slots of {variable,padding}.
178 - content of shadow memory 8 bytes for slot 3 and 2:
179 0xF4000000. This represents is the concatenation of
180 variable 'a' and the partial red zone following it, like what we
181 had for variable 'b'. The least significant 3 bytes being 00
182 means that the 3 bytes of variable 'a' are addressable.
184 - content of shadow memory 8 bytes for slot 1: 0xF3F3F3F3.
185 The F3 byte pattern is a magic number called
186 ASAN_STACK_MAGIC_RIGHT. It flags the fact that the memory
187 region for this shadow byte is a RIGHT red zone intended to seat
188 at the top of the variables of the stack.
190 Note that the real variable layout is done in expand_used_vars in
191 cfgexpand.c. As far as Address Sanitizer is concerned, it lays out
192 stack variables as well as the different red zones, emits some
193 prologue code to populate the shadow memory as to poison (mark as
194 non-accessible) the regions of the red zones and mark the regions of
195 stack variables as accessible, and emit some epilogue code to
196 un-poison (mark as accessible) the regions of red zones right before
197 the function exits.
199 [Protection of global variables]
201 The basic idea is to insert a red zone between two global variables
202 and install a constructor function that calls the asan runtime to do
203 the populating of the relevant shadow memory regions at load time.
205 So the global variables are laid out as to insert a red zone between
206 them. The size of the red zones is so that each variable starts on a
207 32 bytes boundary.
209 Then a constructor function is installed so that, for each global
210 variable, it calls the runtime asan library function
211 __asan_register_globals_with an instance of this type:
213 struct __asan_global
215 // Address of the beginning of the global variable.
216 const void *__beg;
218 // Initial size of the global variable.
219 uptr __size;
221 // Size of the global variable + size of the red zone. This
222 // size is 32 bytes aligned.
223 uptr __size_with_redzone;
225 // Name of the global variable.
226 const void *__name;
228 // Name of the module where the global variable is declared.
229 const void *__module_name;
231 // 1 if it has dynamic initialization, 0 otherwise.
232 uptr __has_dynamic_init;
235 A destructor function that calls the runtime asan library function
236 _asan_unregister_globals is also installed. */
238 alias_set_type asan_shadow_set = -1;
240 /* Pointer types to 1 resp. 2 byte integers in shadow memory. A separate
241 alias set is used for all shadow memory accesses. */
242 static GTY(()) tree shadow_ptr_types[2];
244 /* Decl for __asan_option_detect_stack_use_after_return. */
245 static GTY(()) tree asan_detect_stack_use_after_return;
247 /* Various flags for Asan builtins. */
248 enum asan_check_flags
250 ASAN_CHECK_STORE = 1 << 0,
251 ASAN_CHECK_SCALAR_ACCESS = 1 << 1,
252 ASAN_CHECK_NON_ZERO_LEN = 1 << 2,
253 ASAN_CHECK_START_INSTRUMENTED = 1 << 3,
254 ASAN_CHECK_END_INSTRUMENTED = 1 << 4,
255 ASAN_CHECK_LAST
258 /* Hashtable support for memory references used by gimple
259 statements. */
261 /* This type represents a reference to a memory region. */
262 struct asan_mem_ref
264 /* The expression of the beginning of the memory region. */
265 tree start;
267 /* The size of the access. */
268 HOST_WIDE_INT access_size;
271 static alloc_pool asan_mem_ref_alloc_pool;
273 /* This creates the alloc pool used to store the instances of
274 asan_mem_ref that are stored in the hash table asan_mem_ref_ht. */
276 static alloc_pool
277 asan_mem_ref_get_alloc_pool ()
279 if (asan_mem_ref_alloc_pool == NULL)
280 asan_mem_ref_alloc_pool = create_alloc_pool ("asan_mem_ref",
281 sizeof (asan_mem_ref),
282 10);
283 return asan_mem_ref_alloc_pool;
287 /* Initializes an instance of asan_mem_ref. */
289 static void
290 asan_mem_ref_init (asan_mem_ref *ref, tree start, HOST_WIDE_INT access_size)
292 ref->start = start;
293 ref->access_size = access_size;
296 /* Allocates memory for an instance of asan_mem_ref into the memory
297 pool returned by asan_mem_ref_get_alloc_pool and initialize it.
298 START is the address of (or the expression pointing to) the
299 beginning of memory reference. ACCESS_SIZE is the size of the
300 access to the referenced memory. */
302 static asan_mem_ref*
303 asan_mem_ref_new (tree start, HOST_WIDE_INT access_size)
305 asan_mem_ref *ref =
306 (asan_mem_ref *) pool_alloc (asan_mem_ref_get_alloc_pool ());
308 asan_mem_ref_init (ref, start, access_size);
309 return ref;
312 /* This builds and returns a pointer to the end of the memory region
313 that starts at START and of length LEN. */
315 tree
316 asan_mem_ref_get_end (tree start, tree len)
318 if (len == NULL_TREE || integer_zerop (len))
319 return start;
321 return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
324 /* Return a tree expression that represents the end of the referenced
325 memory region. Beware that this function can actually build a new
326 tree expression. */
328 tree
329 asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
331 return asan_mem_ref_get_end (ref->start, len);
334 struct asan_mem_ref_hasher
335 : typed_noop_remove <asan_mem_ref>
337 typedef asan_mem_ref value_type;
338 typedef asan_mem_ref compare_type;
340 static inline hashval_t hash (const value_type *);
341 static inline bool equal (const value_type *, const compare_type *);
344 /* Hash a memory reference. */
346 inline hashval_t
347 asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
349 inchash::hash hstate;
350 inchash::add_expr (mem_ref->start, hstate);
351 hstate.add_wide_int (mem_ref->access_size);
352 return hstate.end ();
355 /* Compare two memory references. We accept the length of either
356 memory references to be NULL_TREE. */
358 inline bool
359 asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
360 const asan_mem_ref *m2)
362 return (m1->access_size == m2->access_size
363 && operand_equal_p (m1->start, m2->start, 0));
366 static hash_table<asan_mem_ref_hasher> *asan_mem_ref_ht;
368 /* Returns a reference to the hash table containing memory references.
369 This function ensures that the hash table is created. Note that
370 this hash table is updated by the function
371 update_mem_ref_hash_table. */
373 static hash_table<asan_mem_ref_hasher> *
374 get_mem_ref_hash_table ()
376 if (!asan_mem_ref_ht)
377 asan_mem_ref_ht = new hash_table<asan_mem_ref_hasher> (10);
379 return asan_mem_ref_ht;
382 /* Clear all entries from the memory references hash table. */
384 static void
385 empty_mem_ref_hash_table ()
387 if (asan_mem_ref_ht)
388 asan_mem_ref_ht->empty ();
391 /* Free the memory references hash table. */
393 static void
394 free_mem_ref_resources ()
396 delete asan_mem_ref_ht;
397 asan_mem_ref_ht = NULL;
399 if (asan_mem_ref_alloc_pool)
401 free_alloc_pool (asan_mem_ref_alloc_pool);
402 asan_mem_ref_alloc_pool = NULL;
406 /* Return true iff the memory reference REF has been instrumented. */
408 static bool
409 has_mem_ref_been_instrumented (tree ref, HOST_WIDE_INT access_size)
411 asan_mem_ref r;
412 asan_mem_ref_init (&r, ref, access_size);
414 return (get_mem_ref_hash_table ()->find (&r) != NULL);
417 /* Return true iff the memory reference REF has been instrumented. */
419 static bool
420 has_mem_ref_been_instrumented (const asan_mem_ref *ref)
422 return has_mem_ref_been_instrumented (ref->start, ref->access_size);
425 /* Return true iff access to memory region starting at REF and of
426 length LEN has been instrumented. */
428 static bool
429 has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
431 /* First let's see if the address of the beginning of REF has been
432 instrumented. */
433 if (!has_mem_ref_been_instrumented (ref))
434 return false;
436 if (len != 0)
438 /* Let's see if the end of the region has been instrumented. */
439 if (!has_mem_ref_been_instrumented (asan_mem_ref_get_end (ref, len),
440 ref->access_size))
441 return false;
443 return true;
446 /* Set REF to the memory reference present in a gimple assignment
447 ASSIGNMENT. Return true upon successful completion, false
448 otherwise. */
450 static bool
451 get_mem_ref_of_assignment (const gimple assignment,
452 asan_mem_ref *ref,
453 bool *ref_is_store)
455 gcc_assert (gimple_assign_single_p (assignment));
457 if (gimple_store_p (assignment)
458 && !gimple_clobber_p (assignment))
460 ref->start = gimple_assign_lhs (assignment);
461 *ref_is_store = true;
463 else if (gimple_assign_load_p (assignment))
465 ref->start = gimple_assign_rhs1 (assignment);
466 *ref_is_store = false;
468 else
469 return false;
471 ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
472 return true;
475 /* Return the memory references contained in a gimple statement
476 representing a builtin call that has to do with memory access. */
478 static bool
479 get_mem_refs_of_builtin_call (const gimple call,
480 asan_mem_ref *src0,
481 tree *src0_len,
482 bool *src0_is_store,
483 asan_mem_ref *src1,
484 tree *src1_len,
485 bool *src1_is_store,
486 asan_mem_ref *dst,
487 tree *dst_len,
488 bool *dst_is_store,
489 bool *dest_is_deref)
491 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
493 tree callee = gimple_call_fndecl (call);
494 tree source0 = NULL_TREE, source1 = NULL_TREE,
495 dest = NULL_TREE, len = NULL_TREE;
496 bool is_store = true, got_reference_p = false;
497 HOST_WIDE_INT access_size = 1;
499 switch (DECL_FUNCTION_CODE (callee))
501 /* (s, s, n) style memops. */
502 case BUILT_IN_BCMP:
503 case BUILT_IN_MEMCMP:
504 source0 = gimple_call_arg (call, 0);
505 source1 = gimple_call_arg (call, 1);
506 len = gimple_call_arg (call, 2);
507 break;
509 /* (src, dest, n) style memops. */
510 case BUILT_IN_BCOPY:
511 source0 = gimple_call_arg (call, 0);
512 dest = gimple_call_arg (call, 1);
513 len = gimple_call_arg (call, 2);
514 break;
516 /* (dest, src, n) style memops. */
517 case BUILT_IN_MEMCPY:
518 case BUILT_IN_MEMCPY_CHK:
519 case BUILT_IN_MEMMOVE:
520 case BUILT_IN_MEMMOVE_CHK:
521 case BUILT_IN_MEMPCPY:
522 case BUILT_IN_MEMPCPY_CHK:
523 dest = gimple_call_arg (call, 0);
524 source0 = gimple_call_arg (call, 1);
525 len = gimple_call_arg (call, 2);
526 break;
528 /* (dest, n) style memops. */
529 case BUILT_IN_BZERO:
530 dest = gimple_call_arg (call, 0);
531 len = gimple_call_arg (call, 1);
532 break;
534 /* (dest, x, n) style memops*/
535 case BUILT_IN_MEMSET:
536 case BUILT_IN_MEMSET_CHK:
537 dest = gimple_call_arg (call, 0);
538 len = gimple_call_arg (call, 2);
539 break;
541 case BUILT_IN_STRLEN:
542 source0 = gimple_call_arg (call, 0);
543 len = gimple_call_lhs (call);
544 break ;
546 /* And now the __atomic* and __sync builtins.
547 These are handled differently from the classical memory memory
548 access builtins above. */
550 case BUILT_IN_ATOMIC_LOAD_1:
551 case BUILT_IN_ATOMIC_LOAD_2:
552 case BUILT_IN_ATOMIC_LOAD_4:
553 case BUILT_IN_ATOMIC_LOAD_8:
554 case BUILT_IN_ATOMIC_LOAD_16:
555 is_store = false;
556 /* fall through. */
558 case BUILT_IN_SYNC_FETCH_AND_ADD_1:
559 case BUILT_IN_SYNC_FETCH_AND_ADD_2:
560 case BUILT_IN_SYNC_FETCH_AND_ADD_4:
561 case BUILT_IN_SYNC_FETCH_AND_ADD_8:
562 case BUILT_IN_SYNC_FETCH_AND_ADD_16:
564 case BUILT_IN_SYNC_FETCH_AND_SUB_1:
565 case BUILT_IN_SYNC_FETCH_AND_SUB_2:
566 case BUILT_IN_SYNC_FETCH_AND_SUB_4:
567 case BUILT_IN_SYNC_FETCH_AND_SUB_8:
568 case BUILT_IN_SYNC_FETCH_AND_SUB_16:
570 case BUILT_IN_SYNC_FETCH_AND_OR_1:
571 case BUILT_IN_SYNC_FETCH_AND_OR_2:
572 case BUILT_IN_SYNC_FETCH_AND_OR_4:
573 case BUILT_IN_SYNC_FETCH_AND_OR_8:
574 case BUILT_IN_SYNC_FETCH_AND_OR_16:
576 case BUILT_IN_SYNC_FETCH_AND_AND_1:
577 case BUILT_IN_SYNC_FETCH_AND_AND_2:
578 case BUILT_IN_SYNC_FETCH_AND_AND_4:
579 case BUILT_IN_SYNC_FETCH_AND_AND_8:
580 case BUILT_IN_SYNC_FETCH_AND_AND_16:
582 case BUILT_IN_SYNC_FETCH_AND_XOR_1:
583 case BUILT_IN_SYNC_FETCH_AND_XOR_2:
584 case BUILT_IN_SYNC_FETCH_AND_XOR_4:
585 case BUILT_IN_SYNC_FETCH_AND_XOR_8:
586 case BUILT_IN_SYNC_FETCH_AND_XOR_16:
588 case BUILT_IN_SYNC_FETCH_AND_NAND_1:
589 case BUILT_IN_SYNC_FETCH_AND_NAND_2:
590 case BUILT_IN_SYNC_FETCH_AND_NAND_4:
591 case BUILT_IN_SYNC_FETCH_AND_NAND_8:
593 case BUILT_IN_SYNC_ADD_AND_FETCH_1:
594 case BUILT_IN_SYNC_ADD_AND_FETCH_2:
595 case BUILT_IN_SYNC_ADD_AND_FETCH_4:
596 case BUILT_IN_SYNC_ADD_AND_FETCH_8:
597 case BUILT_IN_SYNC_ADD_AND_FETCH_16:
599 case BUILT_IN_SYNC_SUB_AND_FETCH_1:
600 case BUILT_IN_SYNC_SUB_AND_FETCH_2:
601 case BUILT_IN_SYNC_SUB_AND_FETCH_4:
602 case BUILT_IN_SYNC_SUB_AND_FETCH_8:
603 case BUILT_IN_SYNC_SUB_AND_FETCH_16:
605 case BUILT_IN_SYNC_OR_AND_FETCH_1:
606 case BUILT_IN_SYNC_OR_AND_FETCH_2:
607 case BUILT_IN_SYNC_OR_AND_FETCH_4:
608 case BUILT_IN_SYNC_OR_AND_FETCH_8:
609 case BUILT_IN_SYNC_OR_AND_FETCH_16:
611 case BUILT_IN_SYNC_AND_AND_FETCH_1:
612 case BUILT_IN_SYNC_AND_AND_FETCH_2:
613 case BUILT_IN_SYNC_AND_AND_FETCH_4:
614 case BUILT_IN_SYNC_AND_AND_FETCH_8:
615 case BUILT_IN_SYNC_AND_AND_FETCH_16:
617 case BUILT_IN_SYNC_XOR_AND_FETCH_1:
618 case BUILT_IN_SYNC_XOR_AND_FETCH_2:
619 case BUILT_IN_SYNC_XOR_AND_FETCH_4:
620 case BUILT_IN_SYNC_XOR_AND_FETCH_8:
621 case BUILT_IN_SYNC_XOR_AND_FETCH_16:
623 case BUILT_IN_SYNC_NAND_AND_FETCH_1:
624 case BUILT_IN_SYNC_NAND_AND_FETCH_2:
625 case BUILT_IN_SYNC_NAND_AND_FETCH_4:
626 case BUILT_IN_SYNC_NAND_AND_FETCH_8:
628 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1:
629 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2:
630 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4:
631 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8:
632 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16:
634 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1:
635 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2:
636 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4:
637 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8:
638 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16:
640 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1:
641 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2:
642 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4:
643 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8:
644 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16:
646 case BUILT_IN_SYNC_LOCK_RELEASE_1:
647 case BUILT_IN_SYNC_LOCK_RELEASE_2:
648 case BUILT_IN_SYNC_LOCK_RELEASE_4:
649 case BUILT_IN_SYNC_LOCK_RELEASE_8:
650 case BUILT_IN_SYNC_LOCK_RELEASE_16:
652 case BUILT_IN_ATOMIC_EXCHANGE_1:
653 case BUILT_IN_ATOMIC_EXCHANGE_2:
654 case BUILT_IN_ATOMIC_EXCHANGE_4:
655 case BUILT_IN_ATOMIC_EXCHANGE_8:
656 case BUILT_IN_ATOMIC_EXCHANGE_16:
658 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
659 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
660 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
661 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
662 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
664 case BUILT_IN_ATOMIC_STORE_1:
665 case BUILT_IN_ATOMIC_STORE_2:
666 case BUILT_IN_ATOMIC_STORE_4:
667 case BUILT_IN_ATOMIC_STORE_8:
668 case BUILT_IN_ATOMIC_STORE_16:
670 case BUILT_IN_ATOMIC_ADD_FETCH_1:
671 case BUILT_IN_ATOMIC_ADD_FETCH_2:
672 case BUILT_IN_ATOMIC_ADD_FETCH_4:
673 case BUILT_IN_ATOMIC_ADD_FETCH_8:
674 case BUILT_IN_ATOMIC_ADD_FETCH_16:
676 case BUILT_IN_ATOMIC_SUB_FETCH_1:
677 case BUILT_IN_ATOMIC_SUB_FETCH_2:
678 case BUILT_IN_ATOMIC_SUB_FETCH_4:
679 case BUILT_IN_ATOMIC_SUB_FETCH_8:
680 case BUILT_IN_ATOMIC_SUB_FETCH_16:
682 case BUILT_IN_ATOMIC_AND_FETCH_1:
683 case BUILT_IN_ATOMIC_AND_FETCH_2:
684 case BUILT_IN_ATOMIC_AND_FETCH_4:
685 case BUILT_IN_ATOMIC_AND_FETCH_8:
686 case BUILT_IN_ATOMIC_AND_FETCH_16:
688 case BUILT_IN_ATOMIC_NAND_FETCH_1:
689 case BUILT_IN_ATOMIC_NAND_FETCH_2:
690 case BUILT_IN_ATOMIC_NAND_FETCH_4:
691 case BUILT_IN_ATOMIC_NAND_FETCH_8:
692 case BUILT_IN_ATOMIC_NAND_FETCH_16:
694 case BUILT_IN_ATOMIC_XOR_FETCH_1:
695 case BUILT_IN_ATOMIC_XOR_FETCH_2:
696 case BUILT_IN_ATOMIC_XOR_FETCH_4:
697 case BUILT_IN_ATOMIC_XOR_FETCH_8:
698 case BUILT_IN_ATOMIC_XOR_FETCH_16:
700 case BUILT_IN_ATOMIC_OR_FETCH_1:
701 case BUILT_IN_ATOMIC_OR_FETCH_2:
702 case BUILT_IN_ATOMIC_OR_FETCH_4:
703 case BUILT_IN_ATOMIC_OR_FETCH_8:
704 case BUILT_IN_ATOMIC_OR_FETCH_16:
706 case BUILT_IN_ATOMIC_FETCH_ADD_1:
707 case BUILT_IN_ATOMIC_FETCH_ADD_2:
708 case BUILT_IN_ATOMIC_FETCH_ADD_4:
709 case BUILT_IN_ATOMIC_FETCH_ADD_8:
710 case BUILT_IN_ATOMIC_FETCH_ADD_16:
712 case BUILT_IN_ATOMIC_FETCH_SUB_1:
713 case BUILT_IN_ATOMIC_FETCH_SUB_2:
714 case BUILT_IN_ATOMIC_FETCH_SUB_4:
715 case BUILT_IN_ATOMIC_FETCH_SUB_8:
716 case BUILT_IN_ATOMIC_FETCH_SUB_16:
718 case BUILT_IN_ATOMIC_FETCH_AND_1:
719 case BUILT_IN_ATOMIC_FETCH_AND_2:
720 case BUILT_IN_ATOMIC_FETCH_AND_4:
721 case BUILT_IN_ATOMIC_FETCH_AND_8:
722 case BUILT_IN_ATOMIC_FETCH_AND_16:
724 case BUILT_IN_ATOMIC_FETCH_NAND_1:
725 case BUILT_IN_ATOMIC_FETCH_NAND_2:
726 case BUILT_IN_ATOMIC_FETCH_NAND_4:
727 case BUILT_IN_ATOMIC_FETCH_NAND_8:
728 case BUILT_IN_ATOMIC_FETCH_NAND_16:
730 case BUILT_IN_ATOMIC_FETCH_XOR_1:
731 case BUILT_IN_ATOMIC_FETCH_XOR_2:
732 case BUILT_IN_ATOMIC_FETCH_XOR_4:
733 case BUILT_IN_ATOMIC_FETCH_XOR_8:
734 case BUILT_IN_ATOMIC_FETCH_XOR_16:
736 case BUILT_IN_ATOMIC_FETCH_OR_1:
737 case BUILT_IN_ATOMIC_FETCH_OR_2:
738 case BUILT_IN_ATOMIC_FETCH_OR_4:
739 case BUILT_IN_ATOMIC_FETCH_OR_8:
740 case BUILT_IN_ATOMIC_FETCH_OR_16:
742 dest = gimple_call_arg (call, 0);
743 /* DEST represents the address of a memory location.
744 instrument_derefs wants the memory location, so lets
745 dereference the address DEST before handing it to
746 instrument_derefs. */
747 if (TREE_CODE (dest) == ADDR_EXPR)
748 dest = TREE_OPERAND (dest, 0);
749 else if (TREE_CODE (dest) == SSA_NAME || TREE_CODE (dest) == INTEGER_CST)
750 dest = build2 (MEM_REF, TREE_TYPE (TREE_TYPE (dest)),
751 dest, build_int_cst (TREE_TYPE (dest), 0));
752 else
753 gcc_unreachable ();
755 access_size = int_size_in_bytes (TREE_TYPE (dest));
758 default:
759 /* The other builtins memory access are not instrumented in this
760 function because they either don't have any length parameter,
761 or their length parameter is just a limit. */
762 break;
765 if (len != NULL_TREE)
767 if (source0 != NULL_TREE)
769 src0->start = source0;
770 src0->access_size = access_size;
771 *src0_len = len;
772 *src0_is_store = false;
775 if (source1 != NULL_TREE)
777 src1->start = source1;
778 src1->access_size = access_size;
779 *src1_len = len;
780 *src1_is_store = false;
783 if (dest != NULL_TREE)
785 dst->start = dest;
786 dst->access_size = access_size;
787 *dst_len = len;
788 *dst_is_store = true;
791 got_reference_p = true;
793 else if (dest)
795 dst->start = dest;
796 dst->access_size = access_size;
797 *dst_len = NULL_TREE;
798 *dst_is_store = is_store;
799 *dest_is_deref = true;
800 got_reference_p = true;
803 return got_reference_p;
806 /* Return true iff a given gimple statement has been instrumented.
807 Note that the statement is "defined" by the memory references it
808 contains. */
810 static bool
811 has_stmt_been_instrumented_p (gimple stmt)
813 if (gimple_assign_single_p (stmt))
815 bool r_is_store;
816 asan_mem_ref r;
817 asan_mem_ref_init (&r, NULL, 1);
819 if (get_mem_ref_of_assignment (stmt, &r, &r_is_store))
820 return has_mem_ref_been_instrumented (&r);
822 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
824 asan_mem_ref src0, src1, dest;
825 asan_mem_ref_init (&src0, NULL, 1);
826 asan_mem_ref_init (&src1, NULL, 1);
827 asan_mem_ref_init (&dest, NULL, 1);
829 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
830 bool src0_is_store = false, src1_is_store = false,
831 dest_is_store = false, dest_is_deref = false;
832 if (get_mem_refs_of_builtin_call (stmt,
833 &src0, &src0_len, &src0_is_store,
834 &src1, &src1_len, &src1_is_store,
835 &dest, &dest_len, &dest_is_store,
836 &dest_is_deref))
838 if (src0.start != NULL_TREE
839 && !has_mem_ref_been_instrumented (&src0, src0_len))
840 return false;
842 if (src1.start != NULL_TREE
843 && !has_mem_ref_been_instrumented (&src1, src1_len))
844 return false;
846 if (dest.start != NULL_TREE
847 && !has_mem_ref_been_instrumented (&dest, dest_len))
848 return false;
850 return true;
853 return false;
856 /* Insert a memory reference into the hash table. */
858 static void
859 update_mem_ref_hash_table (tree ref, HOST_WIDE_INT access_size)
861 hash_table<asan_mem_ref_hasher> *ht = get_mem_ref_hash_table ();
863 asan_mem_ref r;
864 asan_mem_ref_init (&r, ref, access_size);
866 asan_mem_ref **slot = ht->find_slot (&r, INSERT);
867 if (*slot == NULL)
868 *slot = asan_mem_ref_new (ref, access_size);
871 /* Initialize shadow_ptr_types array. */
873 static void
874 asan_init_shadow_ptr_types (void)
876 asan_shadow_set = new_alias_set ();
877 shadow_ptr_types[0] = build_distinct_type_copy (signed_char_type_node);
878 TYPE_ALIAS_SET (shadow_ptr_types[0]) = asan_shadow_set;
879 shadow_ptr_types[0] = build_pointer_type (shadow_ptr_types[0]);
880 shadow_ptr_types[1] = build_distinct_type_copy (short_integer_type_node);
881 TYPE_ALIAS_SET (shadow_ptr_types[1]) = asan_shadow_set;
882 shadow_ptr_types[1] = build_pointer_type (shadow_ptr_types[1]);
883 initialize_sanitizer_builtins ();
886 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
888 static tree
889 asan_pp_string (pretty_printer *pp)
891 const char *buf = pp_formatted_text (pp);
892 size_t len = strlen (buf);
893 tree ret = build_string (len + 1, buf);
894 TREE_TYPE (ret)
895 = build_array_type (TREE_TYPE (shadow_ptr_types[0]),
896 build_index_type (size_int (len)));
897 TREE_READONLY (ret) = 1;
898 TREE_STATIC (ret) = 1;
899 return build1 (ADDR_EXPR, shadow_ptr_types[0], ret);
902 /* Return a CONST_INT representing 4 subsequent shadow memory bytes. */
904 static rtx
905 asan_shadow_cst (unsigned char shadow_bytes[4])
907 int i;
908 unsigned HOST_WIDE_INT val = 0;
909 gcc_assert (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN);
910 for (i = 0; i < 4; i++)
911 val |= (unsigned HOST_WIDE_INT) shadow_bytes[BYTES_BIG_ENDIAN ? 3 - i : i]
912 << (BITS_PER_UNIT * i);
913 return gen_int_mode (val, SImode);
916 /* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
917 though. */
919 static void
920 asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
922 rtx_insn *insn, *insns, *jump;
923 rtx_code_label *top_label;
924 rtx end, addr, tmp;
926 start_sequence ();
927 clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
928 insns = get_insns ();
929 end_sequence ();
930 for (insn = insns; insn; insn = NEXT_INSN (insn))
931 if (CALL_P (insn))
932 break;
933 if (insn == NULL_RTX)
935 emit_insn (insns);
936 return;
939 gcc_assert ((len & 3) == 0);
940 top_label = gen_label_rtx ();
941 addr = copy_to_mode_reg (Pmode, XEXP (shadow_mem, 0));
942 shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
943 end = force_reg (Pmode, plus_constant (Pmode, addr, len));
944 emit_label (top_label);
946 emit_move_insn (shadow_mem, const0_rtx);
947 tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), addr,
948 true, OPTAB_LIB_WIDEN);
949 if (tmp != addr)
950 emit_move_insn (addr, tmp);
951 emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
952 jump = get_last_insn ();
953 gcc_assert (JUMP_P (jump));
954 add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100);
957 void
958 asan_function_start (void)
960 section *fnsec = function_section (current_function_decl);
961 switch_to_section (fnsec);
962 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC",
963 current_function_funcdef_no);
966 /* Insert code to protect stack vars. The prologue sequence should be emitted
967 directly, epilogue sequence returned. BASE is the register holding the
968 stack base, against which OFFSETS array offsets are relative to, OFFSETS
969 array contains pairs of offsets in reverse order, always the end offset
970 of some gap that needs protection followed by starting offset,
971 and DECLS is an array of representative decls for each var partition.
972 LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
973 elements long (OFFSETS include gap before the first variable as well
974 as gaps after each stack variable). PBASE is, if non-NULL, some pseudo
975 register which stack vars DECL_RTLs are based on. Either BASE should be
976 assigned to PBASE, when not doing use after return protection, or
977 corresponding address based on __asan_stack_malloc* return value. */
979 rtx_insn *
980 asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
981 HOST_WIDE_INT *offsets, tree *decls, int length)
983 rtx shadow_base, shadow_mem, ret, mem, orig_base, lab;
984 rtx_insn *insns;
985 char buf[30];
986 unsigned char shadow_bytes[4];
987 HOST_WIDE_INT base_offset = offsets[length - 1];
988 HOST_WIDE_INT base_align_bias = 0, offset, prev_offset;
989 HOST_WIDE_INT asan_frame_size = offsets[0] - base_offset;
990 HOST_WIDE_INT last_offset, last_size;
991 int l;
992 unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT;
993 tree str_cst, decl, id;
994 int use_after_return_class = -1;
996 if (shadow_ptr_types[0] == NULL_TREE)
997 asan_init_shadow_ptr_types ();
999 /* First of all, prepare the description string. */
1000 pretty_printer asan_pp;
1002 pp_decimal_int (&asan_pp, length / 2 - 1);
1003 pp_space (&asan_pp);
1004 for (l = length - 2; l; l -= 2)
1006 tree decl = decls[l / 2 - 1];
1007 pp_wide_integer (&asan_pp, offsets[l] - base_offset);
1008 pp_space (&asan_pp);
1009 pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
1010 pp_space (&asan_pp);
1011 if (DECL_P (decl) && DECL_NAME (decl))
1013 pp_decimal_int (&asan_pp, IDENTIFIER_LENGTH (DECL_NAME (decl)));
1014 pp_space (&asan_pp);
1015 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
1017 else
1018 pp_string (&asan_pp, "9 <unknown>");
1019 pp_space (&asan_pp);
1021 str_cst = asan_pp_string (&asan_pp);
1023 /* Emit the prologue sequence. */
1024 if (asan_frame_size > 32 && asan_frame_size <= 65536 && pbase
1025 && ASAN_USE_AFTER_RETURN)
1027 use_after_return_class = floor_log2 (asan_frame_size - 1) - 5;
1028 /* __asan_stack_malloc_N guarantees alignment
1029 N < 6 ? (64 << N) : 4096 bytes. */
1030 if (alignb > (use_after_return_class < 6
1031 ? (64U << use_after_return_class) : 4096U))
1032 use_after_return_class = -1;
1033 else if (alignb > ASAN_RED_ZONE_SIZE && (asan_frame_size & (alignb - 1)))
1034 base_align_bias = ((asan_frame_size + alignb - 1)
1035 & ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size;
1037 /* Align base if target is STRICT_ALIGNMENT. */
1038 if (STRICT_ALIGNMENT)
1039 base = expand_binop (Pmode, and_optab, base,
1040 gen_int_mode (-((GET_MODE_ALIGNMENT (SImode)
1041 << ASAN_SHADOW_SHIFT)
1042 / BITS_PER_UNIT), Pmode), NULL_RTX,
1043 1, OPTAB_DIRECT);
1045 if (use_after_return_class == -1 && pbase)
1046 emit_move_insn (pbase, base);
1048 base = expand_binop (Pmode, add_optab, base,
1049 gen_int_mode (base_offset - base_align_bias, Pmode),
1050 NULL_RTX, 1, OPTAB_DIRECT);
1051 orig_base = NULL_RTX;
1052 if (use_after_return_class != -1)
1054 if (asan_detect_stack_use_after_return == NULL_TREE)
1056 id = get_identifier ("__asan_option_detect_stack_use_after_return");
1057 decl = build_decl (BUILTINS_LOCATION, VAR_DECL, id,
1058 integer_type_node);
1059 SET_DECL_ASSEMBLER_NAME (decl, id);
1060 TREE_ADDRESSABLE (decl) = 1;
1061 DECL_ARTIFICIAL (decl) = 1;
1062 DECL_IGNORED_P (decl) = 1;
1063 DECL_EXTERNAL (decl) = 1;
1064 TREE_STATIC (decl) = 1;
1065 TREE_PUBLIC (decl) = 1;
1066 TREE_USED (decl) = 1;
1067 asan_detect_stack_use_after_return = decl;
1069 orig_base = gen_reg_rtx (Pmode);
1070 emit_move_insn (orig_base, base);
1071 ret = expand_normal (asan_detect_stack_use_after_return);
1072 lab = gen_label_rtx ();
1073 int very_likely = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1);
1074 emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1075 VOIDmode, 0, lab, very_likely);
1076 snprintf (buf, sizeof buf, "__asan_stack_malloc_%d",
1077 use_after_return_class);
1078 ret = init_one_libfunc (buf);
1079 rtx addr = convert_memory_address (ptr_mode, base);
1080 ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode, 2,
1081 GEN_INT (asan_frame_size
1082 + base_align_bias),
1083 TYPE_MODE (pointer_sized_int_node),
1084 addr, ptr_mode);
1085 ret = convert_memory_address (Pmode, ret);
1086 emit_move_insn (base, ret);
1087 emit_label (lab);
1088 emit_move_insn (pbase, expand_binop (Pmode, add_optab, base,
1089 gen_int_mode (base_align_bias
1090 - base_offset, Pmode),
1091 NULL_RTX, 1, OPTAB_DIRECT));
1093 mem = gen_rtx_MEM (ptr_mode, base);
1094 mem = adjust_address (mem, VOIDmode, base_align_bias);
1095 emit_move_insn (mem, gen_int_mode (ASAN_STACK_FRAME_MAGIC, ptr_mode));
1096 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1097 emit_move_insn (mem, expand_normal (str_cst));
1098 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1099 ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", current_function_funcdef_no);
1100 id = get_identifier (buf);
1101 decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1102 VAR_DECL, id, char_type_node);
1103 SET_DECL_ASSEMBLER_NAME (decl, id);
1104 TREE_ADDRESSABLE (decl) = 1;
1105 TREE_READONLY (decl) = 1;
1106 DECL_ARTIFICIAL (decl) = 1;
1107 DECL_IGNORED_P (decl) = 1;
1108 TREE_STATIC (decl) = 1;
1109 TREE_PUBLIC (decl) = 0;
1110 TREE_USED (decl) = 1;
1111 DECL_INITIAL (decl) = decl;
1112 TREE_ASM_WRITTEN (decl) = 1;
1113 TREE_ASM_WRITTEN (id) = 1;
1114 emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl)));
1115 shadow_base = expand_binop (Pmode, lshr_optab, base,
1116 GEN_INT (ASAN_SHADOW_SHIFT),
1117 NULL_RTX, 1, OPTAB_DIRECT);
1118 shadow_base
1119 = plus_constant (Pmode, shadow_base,
1120 targetm.asan_shadow_offset ()
1121 + (base_align_bias >> ASAN_SHADOW_SHIFT));
1122 gcc_assert (asan_shadow_set != -1
1123 && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
1124 shadow_mem = gen_rtx_MEM (SImode, shadow_base);
1125 set_mem_alias_set (shadow_mem, asan_shadow_set);
1126 if (STRICT_ALIGNMENT)
1127 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
1128 prev_offset = base_offset;
1129 for (l = length; l; l -= 2)
1131 if (l == 2)
1132 cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
1133 offset = offsets[l - 1];
1134 if ((offset - base_offset) & (ASAN_RED_ZONE_SIZE - 1))
1136 int i;
1137 HOST_WIDE_INT aoff
1138 = base_offset + ((offset - base_offset)
1139 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1140 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1141 (aoff - prev_offset)
1142 >> ASAN_SHADOW_SHIFT);
1143 prev_offset = aoff;
1144 for (i = 0; i < 4; i++, aoff += (1 << ASAN_SHADOW_SHIFT))
1145 if (aoff < offset)
1147 if (aoff < offset - (1 << ASAN_SHADOW_SHIFT) + 1)
1148 shadow_bytes[i] = 0;
1149 else
1150 shadow_bytes[i] = offset - aoff;
1152 else
1153 shadow_bytes[i] = ASAN_STACK_MAGIC_PARTIAL;
1154 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1155 offset = aoff;
1157 while (offset <= offsets[l - 2] - ASAN_RED_ZONE_SIZE)
1159 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1160 (offset - prev_offset)
1161 >> ASAN_SHADOW_SHIFT);
1162 prev_offset = offset;
1163 memset (shadow_bytes, cur_shadow_byte, 4);
1164 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1165 offset += ASAN_RED_ZONE_SIZE;
1167 cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
1169 do_pending_stack_adjust ();
1171 /* Construct epilogue sequence. */
1172 start_sequence ();
1174 lab = NULL_RTX;
1175 if (use_after_return_class != -1)
1177 rtx lab2 = gen_label_rtx ();
1178 char c = (char) ASAN_STACK_MAGIC_USE_AFTER_RET;
1179 int very_likely = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1);
1180 emit_cmp_and_jump_insns (orig_base, base, EQ, NULL_RTX,
1181 VOIDmode, 0, lab2, very_likely);
1182 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
1183 set_mem_alias_set (shadow_mem, asan_shadow_set);
1184 mem = gen_rtx_MEM (ptr_mode, base);
1185 mem = adjust_address (mem, VOIDmode, base_align_bias);
1186 emit_move_insn (mem, gen_int_mode (ASAN_STACK_RETIRED_MAGIC, ptr_mode));
1187 unsigned HOST_WIDE_INT sz = asan_frame_size >> ASAN_SHADOW_SHIFT;
1188 if (use_after_return_class < 5
1189 && can_store_by_pieces (sz, builtin_memset_read_str, &c,
1190 BITS_PER_UNIT, true))
1191 store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c,
1192 BITS_PER_UNIT, true, 0);
1193 else if (use_after_return_class >= 5
1194 || !set_storage_via_setmem (shadow_mem,
1195 GEN_INT (sz),
1196 gen_int_mode (c, QImode),
1197 BITS_PER_UNIT, BITS_PER_UNIT,
1198 -1, sz, sz, sz))
1200 snprintf (buf, sizeof buf, "__asan_stack_free_%d",
1201 use_after_return_class);
1202 ret = init_one_libfunc (buf);
1203 rtx addr = convert_memory_address (ptr_mode, base);
1204 rtx orig_addr = convert_memory_address (ptr_mode, orig_base);
1205 emit_library_call (ret, LCT_NORMAL, ptr_mode, 3, addr, ptr_mode,
1206 GEN_INT (asan_frame_size + base_align_bias),
1207 TYPE_MODE (pointer_sized_int_node),
1208 orig_addr, ptr_mode);
1210 lab = gen_label_rtx ();
1211 emit_jump (lab);
1212 emit_label (lab2);
1215 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
1216 set_mem_alias_set (shadow_mem, asan_shadow_set);
1218 if (STRICT_ALIGNMENT)
1219 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
1221 prev_offset = base_offset;
1222 last_offset = base_offset;
1223 last_size = 0;
1224 for (l = length; l; l -= 2)
1226 offset = base_offset + ((offsets[l - 1] - base_offset)
1227 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1228 if (last_offset + last_size != offset)
1230 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1231 (last_offset - prev_offset)
1232 >> ASAN_SHADOW_SHIFT);
1233 prev_offset = last_offset;
1234 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
1235 last_offset = offset;
1236 last_size = 0;
1238 last_size += base_offset + ((offsets[l - 2] - base_offset)
1239 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
1240 - offset;
1242 if (last_size)
1244 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1245 (last_offset - prev_offset)
1246 >> ASAN_SHADOW_SHIFT);
1247 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
1250 do_pending_stack_adjust ();
1251 if (lab)
1252 emit_label (lab);
1254 insns = get_insns ();
1255 end_sequence ();
1256 return insns;
1259 /* Return true if DECL, a global var, might be overridden and needs
1260 therefore a local alias. */
1262 static bool
1263 asan_needs_local_alias (tree decl)
1265 return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
1268 /* Return true if DECL is a VAR_DECL that should be protected
1269 by Address Sanitizer, by appending a red zone with protected
1270 shadow memory after it and aligning it to at least
1271 ASAN_RED_ZONE_SIZE bytes. */
1273 bool
1274 asan_protect_global (tree decl)
1276 if (!ASAN_GLOBALS)
1277 return false;
1279 rtx rtl, symbol;
1281 if (TREE_CODE (decl) == STRING_CST)
1283 /* Instrument all STRING_CSTs except those created
1284 by asan_pp_string here. */
1285 if (shadow_ptr_types[0] != NULL_TREE
1286 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
1287 && TREE_TYPE (TREE_TYPE (decl)) == TREE_TYPE (shadow_ptr_types[0]))
1288 return false;
1289 return true;
1291 if (TREE_CODE (decl) != VAR_DECL
1292 /* TLS vars aren't statically protectable. */
1293 || DECL_THREAD_LOCAL_P (decl)
1294 /* Externs will be protected elsewhere. */
1295 || DECL_EXTERNAL (decl)
1296 || !DECL_RTL_SET_P (decl)
1297 /* Comdat vars pose an ABI problem, we can't know if
1298 the var that is selected by the linker will have
1299 padding or not. */
1300 || DECL_ONE_ONLY (decl)
1301 /* Similarly for common vars. People can use -fno-common. */
1302 || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
1303 /* Don't protect if using user section, often vars placed
1304 into user section from multiple TUs are then assumed
1305 to be an array of such vars, putting padding in there
1306 breaks this assumption. */
1307 || (DECL_SECTION_NAME (decl) != NULL
1308 && !symtab_node::get (decl)->implicit_section)
1309 || DECL_SIZE (decl) == 0
1310 || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
1311 || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
1312 || DECL_ALIGN_UNIT (decl) > 2 * ASAN_RED_ZONE_SIZE)
1313 return false;
1315 rtl = DECL_RTL (decl);
1316 if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF)
1317 return false;
1318 symbol = XEXP (rtl, 0);
1320 if (CONSTANT_POOL_ADDRESS_P (symbol)
1321 || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
1322 return false;
1324 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
1325 return false;
1327 #ifndef ASM_OUTPUT_DEF
1328 if (asan_needs_local_alias (decl))
1329 return false;
1330 #endif
1332 return true;
1335 /* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16,_n}.
1336 IS_STORE is either 1 (for a store) or 0 (for a load). */
1338 static tree
1339 report_error_func (bool is_store, HOST_WIDE_INT size_in_bytes, int *nargs)
1341 static enum built_in_function report[2][6]
1342 = { { BUILT_IN_ASAN_REPORT_LOAD1, BUILT_IN_ASAN_REPORT_LOAD2,
1343 BUILT_IN_ASAN_REPORT_LOAD4, BUILT_IN_ASAN_REPORT_LOAD8,
1344 BUILT_IN_ASAN_REPORT_LOAD16, BUILT_IN_ASAN_REPORT_LOAD_N },
1345 { BUILT_IN_ASAN_REPORT_STORE1, BUILT_IN_ASAN_REPORT_STORE2,
1346 BUILT_IN_ASAN_REPORT_STORE4, BUILT_IN_ASAN_REPORT_STORE8,
1347 BUILT_IN_ASAN_REPORT_STORE16, BUILT_IN_ASAN_REPORT_STORE_N } };
1348 if (size_in_bytes == -1)
1350 *nargs = 2;
1351 return builtin_decl_implicit (report[is_store][5]);
1353 *nargs = 1;
1354 return builtin_decl_implicit (report[is_store][exact_log2 (size_in_bytes)]);
1357 /* Construct a function tree for __asan_{load,store}{1,2,4,8,16,_n}.
1358 IS_STORE is either 1 (for a store) or 0 (for a load). */
1360 static tree
1361 check_func (bool is_store, int size_in_bytes, int *nargs)
1363 static enum built_in_function check[2][6]
1364 = { { BUILT_IN_ASAN_LOAD1, BUILT_IN_ASAN_LOAD2,
1365 BUILT_IN_ASAN_LOAD4, BUILT_IN_ASAN_LOAD8,
1366 BUILT_IN_ASAN_LOAD16, BUILT_IN_ASAN_LOADN },
1367 { BUILT_IN_ASAN_STORE1, BUILT_IN_ASAN_STORE2,
1368 BUILT_IN_ASAN_STORE4, BUILT_IN_ASAN_STORE8,
1369 BUILT_IN_ASAN_STORE16, BUILT_IN_ASAN_STOREN } };
1370 if (size_in_bytes == -1)
1372 *nargs = 2;
1373 return builtin_decl_implicit (check[is_store][5]);
1375 *nargs = 1;
1376 return builtin_decl_implicit (check[is_store][exact_log2 (size_in_bytes)]);
1379 /* Split the current basic block and create a condition statement
1380 insertion point right before or after the statement pointed to by
1381 ITER. Return an iterator to the point at which the caller might
1382 safely insert the condition statement.
1384 THEN_BLOCK must be set to the address of an uninitialized instance
1385 of basic_block. The function will then set *THEN_BLOCK to the
1386 'then block' of the condition statement to be inserted by the
1387 caller.
1389 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
1390 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
1392 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
1393 block' of the condition statement to be inserted by the caller.
1395 Note that *FALLTHROUGH_BLOCK is a new block that contains the
1396 statements starting from *ITER, and *THEN_BLOCK is a new empty
1397 block.
1399 *ITER is adjusted to point to always point to the first statement
1400 of the basic block * FALLTHROUGH_BLOCK. That statement is the
1401 same as what ITER was pointing to prior to calling this function,
1402 if BEFORE_P is true; otherwise, it is its following statement. */
1404 gimple_stmt_iterator
1405 create_cond_insert_point (gimple_stmt_iterator *iter,
1406 bool before_p,
1407 bool then_more_likely_p,
1408 bool create_then_fallthru_edge,
1409 basic_block *then_block,
1410 basic_block *fallthrough_block)
1412 gimple_stmt_iterator gsi = *iter;
1414 if (!gsi_end_p (gsi) && before_p)
1415 gsi_prev (&gsi);
1417 basic_block cur_bb = gsi_bb (*iter);
1419 edge e = split_block (cur_bb, gsi_stmt (gsi));
1421 /* Get a hold on the 'condition block', the 'then block' and the
1422 'else block'. */
1423 basic_block cond_bb = e->src;
1424 basic_block fallthru_bb = e->dest;
1425 basic_block then_bb = create_empty_bb (cond_bb);
1426 if (current_loops)
1428 add_bb_to_loop (then_bb, cond_bb->loop_father);
1429 loops_state_set (LOOPS_NEED_FIXUP);
1432 /* Set up the newly created 'then block'. */
1433 e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
1434 int fallthrough_probability
1435 = then_more_likely_p
1436 ? PROB_VERY_UNLIKELY
1437 : PROB_ALWAYS - PROB_VERY_UNLIKELY;
1438 e->probability = PROB_ALWAYS - fallthrough_probability;
1439 if (create_then_fallthru_edge)
1440 make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU);
1442 /* Set up the fallthrough basic block. */
1443 e = find_edge (cond_bb, fallthru_bb);
1444 e->flags = EDGE_FALSE_VALUE;
1445 e->count = cond_bb->count;
1446 e->probability = fallthrough_probability;
1448 /* Update dominance info for the newly created then_bb; note that
1449 fallthru_bb's dominance info has already been updated by
1450 split_bock. */
1451 if (dom_info_available_p (CDI_DOMINATORS))
1452 set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
1454 *then_block = then_bb;
1455 *fallthrough_block = fallthru_bb;
1456 *iter = gsi_start_bb (fallthru_bb);
1458 return gsi_last_bb (cond_bb);
1461 /* Insert an if condition followed by a 'then block' right before the
1462 statement pointed to by ITER. The fallthrough block -- which is the
1463 else block of the condition as well as the destination of the
1464 outcoming edge of the 'then block' -- starts with the statement
1465 pointed to by ITER.
1467 COND is the condition of the if.
1469 If THEN_MORE_LIKELY_P is true, the probability of the edge to the
1470 'then block' is higher than the probability of the edge to the
1471 fallthrough block.
1473 Upon completion of the function, *THEN_BB is set to the newly
1474 inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
1475 fallthrough block.
1477 *ITER is adjusted to still point to the same statement it was
1478 pointing to initially. */
1480 static void
1481 insert_if_then_before_iter (gimple cond,
1482 gimple_stmt_iterator *iter,
1483 bool then_more_likely_p,
1484 basic_block *then_bb,
1485 basic_block *fallthrough_bb)
1487 gimple_stmt_iterator cond_insert_point =
1488 create_cond_insert_point (iter,
1489 /*before_p=*/true,
1490 then_more_likely_p,
1491 /*create_then_fallthru_edge=*/true,
1492 then_bb,
1493 fallthrough_bb);
1494 gsi_insert_after (&cond_insert_point, cond, GSI_NEW_STMT);
1497 /* Build
1498 (base_addr >> ASAN_SHADOW_SHIFT) + targetm.asan_shadow_offset (). */
1500 static tree
1501 build_shadow_mem_access (gimple_stmt_iterator *gsi, location_t location,
1502 tree base_addr, tree shadow_ptr_type)
1504 tree t, uintptr_type = TREE_TYPE (base_addr);
1505 tree shadow_type = TREE_TYPE (shadow_ptr_type);
1506 gimple g;
1508 t = build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT);
1509 g = gimple_build_assign_with_ops (RSHIFT_EXPR,
1510 make_ssa_name (uintptr_type, NULL),
1511 base_addr, t);
1512 gimple_set_location (g, location);
1513 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1515 t = build_int_cst (uintptr_type, targetm.asan_shadow_offset ());
1516 g = gimple_build_assign_with_ops (PLUS_EXPR,
1517 make_ssa_name (uintptr_type, NULL),
1518 gimple_assign_lhs (g), t);
1519 gimple_set_location (g, location);
1520 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1522 g = gimple_build_assign_with_ops (NOP_EXPR,
1523 make_ssa_name (shadow_ptr_type, NULL),
1524 gimple_assign_lhs (g), NULL_TREE);
1525 gimple_set_location (g, location);
1526 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1528 t = build2 (MEM_REF, shadow_type, gimple_assign_lhs (g),
1529 build_int_cst (shadow_ptr_type, 0));
1530 g = gimple_build_assign_with_ops (MEM_REF,
1531 make_ssa_name (shadow_type, NULL),
1532 t, NULL_TREE);
1533 gimple_set_location (g, location);
1534 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1535 return gimple_assign_lhs (g);
1538 /* BASE can already be an SSA_NAME; in that case, do not create a
1539 new SSA_NAME for it. */
1541 static tree
1542 maybe_create_ssa_name (location_t loc, tree base, gimple_stmt_iterator *iter,
1543 bool before_p)
1545 if (TREE_CODE (base) == SSA_NAME)
1546 return base;
1547 gimple g
1548 = gimple_build_assign_with_ops (TREE_CODE (base),
1549 make_ssa_name (TREE_TYPE (base), NULL),
1550 base, NULL_TREE);
1551 gimple_set_location (g, loc);
1552 if (before_p)
1553 gsi_insert_before (iter, g, GSI_SAME_STMT);
1554 else
1555 gsi_insert_after (iter, g, GSI_NEW_STMT);
1556 return gimple_assign_lhs (g);
1559 /* Instrument the memory access instruction BASE. Insert new
1560 statements before or after ITER.
1562 Note that the memory access represented by BASE can be either an
1563 SSA_NAME, or a non-SSA expression. LOCATION is the source code
1564 location. IS_STORE is TRUE for a store, FALSE for a load.
1565 BEFORE_P is TRUE for inserting the instrumentation code before
1566 ITER, FALSE for inserting it after ITER. IS_SCALAR_ACCESS is TRUE
1567 for a scalar memory access and FALSE for memory region access.
1568 NON_ZERO_P is TRUE if memory region is guaranteed to have non-zero
1569 length. ALIGN tells alignment of accessed memory object.
1571 START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
1572 memory region have already been instrumented.
1574 If BEFORE_P is TRUE, *ITER is arranged to still point to the
1575 statement it was pointing to prior to calling this function,
1576 otherwise, it points to the statement logically following it. */
1578 static void
1579 build_check_stmt (location_t loc, tree base, tree len,
1580 HOST_WIDE_INT size_in_bytes, gimple_stmt_iterator *iter,
1581 bool is_non_zero_len, bool before_p, bool is_store,
1582 bool is_scalar_access, unsigned int align = 0,
1583 bool start_instrumented = false,
1584 bool end_instrumented = false)
1586 gimple_stmt_iterator gsi = *iter;
1587 gimple g;
1589 gcc_assert (!(size_in_bytes > 0 && !is_non_zero_len));
1591 if (start_instrumented && end_instrumented)
1593 if (!before_p)
1594 gsi_next (iter);
1595 return;
1598 gsi = *iter;
1600 base = unshare_expr (base);
1601 base = maybe_create_ssa_name (loc, base, &gsi, before_p);
1603 if (len)
1604 len = unshare_expr (len);
1605 else
1607 gcc_assert (size_in_bytes != -1);
1608 len = build_int_cst (pointer_sized_int_node, size_in_bytes);
1611 if (size_in_bytes > 1)
1613 if ((size_in_bytes & (size_in_bytes - 1)) != 0
1614 || size_in_bytes > 16)
1615 is_scalar_access = false;
1616 else if (align && align < size_in_bytes * BITS_PER_UNIT)
1618 /* On non-strict alignment targets, if
1619 16-byte access is just 8-byte aligned,
1620 this will result in misaligned shadow
1621 memory 2 byte load, but otherwise can
1622 be handled using one read. */
1623 if (size_in_bytes != 16
1624 || STRICT_ALIGNMENT
1625 || align < 8 * BITS_PER_UNIT)
1626 is_scalar_access = false;
1630 HOST_WIDE_INT flags = 0;
1631 if (is_store)
1632 flags |= ASAN_CHECK_STORE;
1633 if (is_non_zero_len)
1634 flags |= ASAN_CHECK_NON_ZERO_LEN;
1635 if (is_scalar_access)
1636 flags |= ASAN_CHECK_SCALAR_ACCESS;
1637 if (start_instrumented)
1638 flags |= ASAN_CHECK_START_INSTRUMENTED;
1639 if (end_instrumented)
1640 flags |= ASAN_CHECK_END_INSTRUMENTED;
1642 g = gimple_build_call_internal (IFN_ASAN_CHECK, 3,
1643 build_int_cst (integer_type_node, flags),
1644 base, len);
1645 gimple_set_location (g, loc);
1646 if (before_p)
1647 gsi_insert_before (&gsi, g, GSI_SAME_STMT);
1648 else
1650 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1651 gsi_next (&gsi);
1652 *iter = gsi;
1656 /* If T represents a memory access, add instrumentation code before ITER.
1657 LOCATION is source code location.
1658 IS_STORE is either TRUE (for a store) or FALSE (for a load). */
1660 static void
1661 instrument_derefs (gimple_stmt_iterator *iter, tree t,
1662 location_t location, bool is_store)
1664 if (is_store && !ASAN_INSTRUMENT_WRITES)
1665 return;
1666 if (!is_store && !ASAN_INSTRUMENT_READS)
1667 return;
1669 tree type, base;
1670 HOST_WIDE_INT size_in_bytes;
1672 type = TREE_TYPE (t);
1673 switch (TREE_CODE (t))
1675 case ARRAY_REF:
1676 case COMPONENT_REF:
1677 case INDIRECT_REF:
1678 case MEM_REF:
1679 case VAR_DECL:
1680 break;
1681 /* FALLTHRU */
1682 default:
1683 return;
1686 size_in_bytes = int_size_in_bytes (type);
1687 if (size_in_bytes <= 0)
1688 return;
1690 HOST_WIDE_INT bitsize, bitpos;
1691 tree offset;
1692 enum machine_mode mode;
1693 int volatilep = 0, unsignedp = 0;
1694 tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset,
1695 &mode, &unsignedp, &volatilep, false);
1697 if (TREE_CODE (t) == COMPONENT_REF
1698 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
1700 tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
1701 instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
1702 TREE_OPERAND (t, 0), repr,
1703 NULL_TREE), location, is_store);
1704 return;
1707 if (bitpos % BITS_PER_UNIT
1708 || bitsize != size_in_bytes * BITS_PER_UNIT)
1709 return;
1711 if (TREE_CODE (inner) == VAR_DECL
1712 && offset == NULL_TREE
1713 && bitpos >= 0
1714 && DECL_SIZE (inner)
1715 && tree_fits_shwi_p (DECL_SIZE (inner))
1716 && bitpos + bitsize <= tree_to_shwi (DECL_SIZE (inner)))
1718 if (DECL_THREAD_LOCAL_P (inner))
1719 return;
1720 if (!TREE_STATIC (inner))
1722 /* Automatic vars in the current function will be always
1723 accessible. */
1724 if (decl_function_context (inner) == current_function_decl)
1725 return;
1727 /* Always instrument external vars, they might be dynamically
1728 initialized. */
1729 else if (!DECL_EXTERNAL (inner))
1731 /* For static vars if they are known not to be dynamically
1732 initialized, they will be always accessible. */
1733 varpool_node *vnode = varpool_node::get (inner);
1734 if (vnode && !vnode->dynamically_initialized)
1735 return;
1739 base = build_fold_addr_expr (t);
1740 if (!has_mem_ref_been_instrumented (base, size_in_bytes))
1742 unsigned int align = get_object_alignment (t);
1743 build_check_stmt (location, base, NULL_TREE, size_in_bytes, iter,
1744 /*is_non_zero_len*/size_in_bytes > 0, /*before_p=*/true,
1745 is_store, /*is_scalar_access*/true, align);
1746 update_mem_ref_hash_table (base, size_in_bytes);
1747 update_mem_ref_hash_table (t, size_in_bytes);
1752 /* Instrument an access to a contiguous memory region that starts at
1753 the address pointed to by BASE, over a length of LEN (expressed in
1754 the sizeof (*BASE) bytes). ITER points to the instruction before
1755 which the instrumentation instructions must be inserted. LOCATION
1756 is the source location that the instrumentation instructions must
1757 have. If IS_STORE is true, then the memory access is a store;
1758 otherwise, it's a load. */
1760 static void
1761 instrument_mem_region_access (tree base, tree len,
1762 gimple_stmt_iterator *iter,
1763 location_t location, bool is_store)
1765 if (!POINTER_TYPE_P (TREE_TYPE (base))
1766 || !INTEGRAL_TYPE_P (TREE_TYPE (len))
1767 || integer_zerop (len))
1768 return;
1770 /* If the beginning of the memory region has already been
1771 instrumented, do not instrument it. */
1772 bool start_instrumented = has_mem_ref_been_instrumented (base, 1);
1774 /* If the end of the memory region has already been instrumented, do
1775 not instrument it. */
1776 tree end = asan_mem_ref_get_end (base, len);
1777 bool end_instrumented = has_mem_ref_been_instrumented (end, 1);
1779 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
1781 build_check_stmt (location, base, len, size_in_bytes, iter,
1782 /*is_non_zero_len*/size_in_bytes > 0, /*before_p*/true,
1783 is_store, /*is_scalar_access*/false, /*align*/0,
1784 start_instrumented, end_instrumented);
1786 update_mem_ref_hash_table (base, 1);
1787 if (size_in_bytes != -1)
1788 update_mem_ref_hash_table (end, 1);
1790 *iter = gsi_for_stmt (gsi_stmt (*iter));
1793 /* Instrument the call (to the builtin strlen function) pointed to by
1794 ITER.
1796 This function instruments the access to the first byte of the
1797 argument, right before the call. After the call it instruments the
1798 access to the last byte of the argument; it uses the result of the
1799 call to deduce the offset of that last byte.
1801 Upon completion, iff the call has actually been instrumented, this
1802 function returns TRUE and *ITER points to the statement logically
1803 following the built-in strlen function call *ITER was initially
1804 pointing to. Otherwise, the function returns FALSE and *ITER
1805 remains unchanged. */
1807 static bool
1808 instrument_strlen_call (gimple_stmt_iterator *iter)
1810 gimple call = gsi_stmt (*iter);
1811 gcc_assert (is_gimple_call (call));
1813 tree callee = gimple_call_fndecl (call);
1814 gcc_assert (is_builtin_fn (callee)
1815 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
1816 && DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN);
1818 tree len = gimple_call_lhs (call);
1819 if (len == NULL)
1820 /* Some passes might clear the return value of the strlen call;
1821 bail out in that case. Return FALSE as we are not advancing
1822 *ITER. */
1823 return false;
1824 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (len)));
1826 location_t loc = gimple_location (call);
1827 tree str_arg = gimple_call_arg (call, 0);
1828 bool start_instrumented = has_mem_ref_been_instrumented (str_arg, 1);
1830 tree cptr_type = build_pointer_type (char_type_node);
1831 gimple str_arg_ssa =
1832 gimple_build_assign_with_ops (NOP_EXPR,
1833 make_ssa_name (cptr_type, NULL),
1834 str_arg, NULL);
1835 gimple_set_location (str_arg_ssa, loc);
1836 gsi_insert_before (iter, str_arg_ssa, GSI_SAME_STMT);
1838 build_check_stmt (loc, gimple_assign_lhs (str_arg_ssa), NULL_TREE, 1, iter,
1839 /*is_non_zero_len*/true, /*before_p=*/true,
1840 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0,
1841 start_instrumented, start_instrumented);
1843 gimple g =
1844 gimple_build_assign_with_ops (POINTER_PLUS_EXPR,
1845 make_ssa_name (cptr_type, NULL),
1846 gimple_assign_lhs (str_arg_ssa),
1847 len);
1848 gimple_set_location (g, loc);
1849 gsi_insert_after (iter, g, GSI_NEW_STMT);
1851 build_check_stmt (loc, gimple_assign_lhs (g), NULL_TREE, 1, iter,
1852 /*is_non_zero_len*/true, /*before_p=*/false,
1853 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0);
1855 return true;
1858 /* Instrument the call to a built-in memory access function that is
1859 pointed to by the iterator ITER.
1861 Upon completion, return TRUE iff *ITER has been advanced to the
1862 statement following the one it was originally pointing to. */
1864 static bool
1865 instrument_builtin_call (gimple_stmt_iterator *iter)
1867 if (!ASAN_MEMINTRIN)
1868 return false;
1870 bool iter_advanced_p = false;
1871 gimple call = gsi_stmt (*iter);
1873 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
1875 tree callee = gimple_call_fndecl (call);
1876 location_t loc = gimple_location (call);
1878 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN)
1879 iter_advanced_p = instrument_strlen_call (iter);
1880 else
1882 asan_mem_ref src0, src1, dest;
1883 asan_mem_ref_init (&src0, NULL, 1);
1884 asan_mem_ref_init (&src1, NULL, 1);
1885 asan_mem_ref_init (&dest, NULL, 1);
1887 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
1888 bool src0_is_store = false, src1_is_store = false,
1889 dest_is_store = false, dest_is_deref = false;
1891 if (get_mem_refs_of_builtin_call (call,
1892 &src0, &src0_len, &src0_is_store,
1893 &src1, &src1_len, &src1_is_store,
1894 &dest, &dest_len, &dest_is_store,
1895 &dest_is_deref))
1897 if (dest_is_deref)
1899 instrument_derefs (iter, dest.start, loc, dest_is_store);
1900 gsi_next (iter);
1901 iter_advanced_p = true;
1903 else if (src0_len || src1_len || dest_len)
1905 if (src0.start != NULL_TREE)
1906 instrument_mem_region_access (src0.start, src0_len,
1907 iter, loc, /*is_store=*/false);
1908 if (src1.start != NULL_TREE)
1909 instrument_mem_region_access (src1.start, src1_len,
1910 iter, loc, /*is_store=*/false);
1911 if (dest.start != NULL_TREE)
1912 instrument_mem_region_access (dest.start, dest_len,
1913 iter, loc, /*is_store=*/true);
1914 *iter = gsi_for_stmt (call);
1915 gsi_next (iter);
1916 iter_advanced_p = true;
1920 return iter_advanced_p;
1923 /* Instrument the assignment statement ITER if it is subject to
1924 instrumentation. Return TRUE iff instrumentation actually
1925 happened. In that case, the iterator ITER is advanced to the next
1926 logical expression following the one initially pointed to by ITER,
1927 and the relevant memory reference that which access has been
1928 instrumented is added to the memory references hash table. */
1930 static bool
1931 maybe_instrument_assignment (gimple_stmt_iterator *iter)
1933 gimple s = gsi_stmt (*iter);
1935 gcc_assert (gimple_assign_single_p (s));
1937 tree ref_expr = NULL_TREE;
1938 bool is_store, is_instrumented = false;
1940 if (gimple_store_p (s))
1942 ref_expr = gimple_assign_lhs (s);
1943 is_store = true;
1944 instrument_derefs (iter, ref_expr,
1945 gimple_location (s),
1946 is_store);
1947 is_instrumented = true;
1950 if (gimple_assign_load_p (s))
1952 ref_expr = gimple_assign_rhs1 (s);
1953 is_store = false;
1954 instrument_derefs (iter, ref_expr,
1955 gimple_location (s),
1956 is_store);
1957 is_instrumented = true;
1960 if (is_instrumented)
1961 gsi_next (iter);
1963 return is_instrumented;
1966 /* Instrument the function call pointed to by the iterator ITER, if it
1967 is subject to instrumentation. At the moment, the only function
1968 calls that are instrumented are some built-in functions that access
1969 memory. Look at instrument_builtin_call to learn more.
1971 Upon completion return TRUE iff *ITER was advanced to the statement
1972 following the one it was originally pointing to. */
1974 static bool
1975 maybe_instrument_call (gimple_stmt_iterator *iter)
1977 gimple stmt = gsi_stmt (*iter);
1978 bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
1980 if (is_builtin && instrument_builtin_call (iter))
1981 return true;
1983 if (gimple_call_noreturn_p (stmt))
1985 if (is_builtin)
1987 tree callee = gimple_call_fndecl (stmt);
1988 switch (DECL_FUNCTION_CODE (callee))
1990 case BUILT_IN_UNREACHABLE:
1991 case BUILT_IN_TRAP:
1992 /* Don't instrument these. */
1993 return false;
1996 tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN);
1997 gimple g = gimple_build_call (decl, 0);
1998 gimple_set_location (g, gimple_location (stmt));
1999 gsi_insert_before (iter, g, GSI_SAME_STMT);
2001 return false;
2004 /* Walk each instruction of all basic block and instrument those that
2005 represent memory references: loads, stores, or function calls.
2006 In a given basic block, this function avoids instrumenting memory
2007 references that have already been instrumented. */
2009 static void
2010 transform_statements (void)
2012 basic_block bb, last_bb = NULL;
2013 gimple_stmt_iterator i;
2014 int saved_last_basic_block = last_basic_block_for_fn (cfun);
2016 FOR_EACH_BB_FN (bb, cfun)
2018 basic_block prev_bb = bb;
2020 if (bb->index >= saved_last_basic_block) continue;
2022 /* Flush the mem ref hash table, if current bb doesn't have
2023 exactly one predecessor, or if that predecessor (skipping
2024 over asan created basic blocks) isn't the last processed
2025 basic block. Thus we effectively flush on extended basic
2026 block boundaries. */
2027 while (single_pred_p (prev_bb))
2029 prev_bb = single_pred (prev_bb);
2030 if (prev_bb->index < saved_last_basic_block)
2031 break;
2033 if (prev_bb != last_bb)
2034 empty_mem_ref_hash_table ();
2035 last_bb = bb;
2037 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
2039 gimple s = gsi_stmt (i);
2041 if (has_stmt_been_instrumented_p (s))
2042 gsi_next (&i);
2043 else if (gimple_assign_single_p (s)
2044 && maybe_instrument_assignment (&i))
2045 /* Nothing to do as maybe_instrument_assignment advanced
2046 the iterator I. */;
2047 else if (is_gimple_call (s) && maybe_instrument_call (&i))
2048 /* Nothing to do as maybe_instrument_call
2049 advanced the iterator I. */;
2050 else
2052 /* No instrumentation happened.
2054 If the current instruction is a function call that
2055 might free something, let's forget about the memory
2056 references that got instrumented. Otherwise we might
2057 miss some instrumentation opportunities. */
2058 if (is_gimple_call (s) && !nonfreeing_call_p (s))
2059 empty_mem_ref_hash_table ();
2061 gsi_next (&i);
2065 free_mem_ref_resources ();
2068 /* Build
2069 __asan_before_dynamic_init (module_name)
2071 __asan_after_dynamic_init ()
2072 call. */
2074 tree
2075 asan_dynamic_init_call (bool after_p)
2077 tree fn = builtin_decl_implicit (after_p
2078 ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
2079 : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT);
2080 tree module_name_cst = NULL_TREE;
2081 if (!after_p)
2083 pretty_printer module_name_pp;
2084 pp_string (&module_name_pp, main_input_filename);
2086 if (shadow_ptr_types[0] == NULL_TREE)
2087 asan_init_shadow_ptr_types ();
2088 module_name_cst = asan_pp_string (&module_name_pp);
2089 module_name_cst = fold_convert (const_ptr_type_node,
2090 module_name_cst);
2093 return build_call_expr (fn, after_p ? 0 : 1, module_name_cst);
2096 /* Build
2097 struct __asan_global
2099 const void *__beg;
2100 uptr __size;
2101 uptr __size_with_redzone;
2102 const void *__name;
2103 const void *__module_name;
2104 uptr __has_dynamic_init;
2105 } type. */
2107 static tree
2108 asan_global_struct (void)
2110 static const char *field_names[6]
2111 = { "__beg", "__size", "__size_with_redzone",
2112 "__name", "__module_name", "__has_dynamic_init" };
2113 tree fields[6], ret;
2114 int i;
2116 ret = make_node (RECORD_TYPE);
2117 for (i = 0; i < 6; i++)
2119 fields[i]
2120 = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
2121 get_identifier (field_names[i]),
2122 (i == 0 || i == 3) ? const_ptr_type_node
2123 : pointer_sized_int_node);
2124 DECL_CONTEXT (fields[i]) = ret;
2125 if (i)
2126 DECL_CHAIN (fields[i - 1]) = fields[i];
2128 TYPE_FIELDS (ret) = fields[0];
2129 TYPE_NAME (ret) = get_identifier ("__asan_global");
2130 layout_type (ret);
2131 return ret;
2134 /* Append description of a single global DECL into vector V.
2135 TYPE is __asan_global struct type as returned by asan_global_struct. */
2137 static void
2138 asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
2140 tree init, uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
2141 unsigned HOST_WIDE_INT size;
2142 tree str_cst, module_name_cst, refdecl = decl;
2143 vec<constructor_elt, va_gc> *vinner = NULL;
2145 pretty_printer asan_pp, module_name_pp;
2147 if (DECL_NAME (decl))
2148 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
2149 else
2150 pp_string (&asan_pp, "<unknown>");
2151 str_cst = asan_pp_string (&asan_pp);
2153 pp_string (&module_name_pp, main_input_filename);
2154 module_name_cst = asan_pp_string (&module_name_pp);
2156 if (asan_needs_local_alias (decl))
2158 char buf[20];
2159 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
2160 refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
2161 VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
2162 TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
2163 TREE_READONLY (refdecl) = TREE_READONLY (decl);
2164 TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
2165 DECL_GIMPLE_REG_P (refdecl) = DECL_GIMPLE_REG_P (decl);
2166 DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
2167 DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
2168 TREE_STATIC (refdecl) = 1;
2169 TREE_PUBLIC (refdecl) = 0;
2170 TREE_USED (refdecl) = 1;
2171 assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
2174 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2175 fold_convert (const_ptr_type_node,
2176 build_fold_addr_expr (refdecl)));
2177 size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
2178 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2179 size += asan_red_zone_size (size);
2180 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2181 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2182 fold_convert (const_ptr_type_node, str_cst));
2183 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2184 fold_convert (const_ptr_type_node, module_name_cst));
2185 varpool_node *vnode = varpool_node::get (decl);
2186 int has_dynamic_init = vnode ? vnode->dynamically_initialized : 0;
2187 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2188 build_int_cst (uptr, has_dynamic_init));
2189 init = build_constructor (type, vinner);
2190 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
2193 /* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
2194 void
2195 initialize_sanitizer_builtins (void)
2197 tree decl;
2199 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
2200 return;
2202 tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
2203 tree BT_FN_VOID_PTR
2204 = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
2205 tree BT_FN_VOID_CONST_PTR
2206 = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
2207 tree BT_FN_VOID_PTR_PTR
2208 = build_function_type_list (void_type_node, ptr_type_node,
2209 ptr_type_node, NULL_TREE);
2210 tree BT_FN_VOID_PTR_PTR_PTR
2211 = build_function_type_list (void_type_node, ptr_type_node,
2212 ptr_type_node, ptr_type_node, NULL_TREE);
2213 tree BT_FN_VOID_PTR_PTRMODE
2214 = build_function_type_list (void_type_node, ptr_type_node,
2215 pointer_sized_int_node, NULL_TREE);
2216 tree BT_FN_VOID_INT
2217 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
2218 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
2219 tree BT_FN_IX_CONST_VPTR_INT[5];
2220 tree BT_FN_IX_VPTR_IX_INT[5];
2221 tree BT_FN_VOID_VPTR_IX_INT[5];
2222 tree vptr
2223 = build_pointer_type (build_qualified_type (void_type_node,
2224 TYPE_QUAL_VOLATILE));
2225 tree cvptr
2226 = build_pointer_type (build_qualified_type (void_type_node,
2227 TYPE_QUAL_VOLATILE
2228 |TYPE_QUAL_CONST));
2229 tree boolt
2230 = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
2231 int i;
2232 for (i = 0; i < 5; i++)
2234 tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
2235 BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
2236 = build_function_type_list (boolt, vptr, ptr_type_node, ix,
2237 integer_type_node, integer_type_node,
2238 NULL_TREE);
2239 BT_FN_IX_CONST_VPTR_INT[i]
2240 = build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
2241 BT_FN_IX_VPTR_IX_INT[i]
2242 = build_function_type_list (ix, vptr, ix, integer_type_node,
2243 NULL_TREE);
2244 BT_FN_VOID_VPTR_IX_INT[i]
2245 = build_function_type_list (void_type_node, vptr, ix,
2246 integer_type_node, NULL_TREE);
2248 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
2249 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
2250 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
2251 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
2252 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
2253 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
2254 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
2255 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
2256 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
2257 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
2258 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
2259 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
2260 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
2261 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
2262 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
2263 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
2264 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
2265 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
2266 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
2267 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
2268 #undef ATTR_NOTHROW_LEAF_LIST
2269 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
2270 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
2271 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
2272 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
2273 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
2274 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
2275 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
2276 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
2277 #undef ATTR_COLD_NOTHROW_LEAF_LIST
2278 #define ATTR_COLD_NOTHROW_LEAF_LIST \
2279 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
2280 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
2281 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
2282 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
2283 #undef DEF_SANITIZER_BUILTIN
2284 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
2285 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
2286 BUILT_IN_NORMAL, NAME, NULL_TREE); \
2287 set_call_expr_flags (decl, ATTRS); \
2288 set_builtin_decl (ENUM, decl, true);
2290 #include "sanitizer.def"
2292 #undef DEF_SANITIZER_BUILTIN
2295 /* Called via htab_traverse. Count number of emitted
2296 STRING_CSTs in the constant hash table. */
2298 static int
2299 count_string_csts (void **slot, void *data)
2301 struct constant_descriptor_tree *desc
2302 = (struct constant_descriptor_tree *) *slot;
2303 if (TREE_CODE (desc->value) == STRING_CST
2304 && TREE_ASM_WRITTEN (desc->value)
2305 && asan_protect_global (desc->value))
2306 ++*((unsigned HOST_WIDE_INT *) data);
2307 return 1;
2310 /* Helper structure to pass two parameters to
2311 add_string_csts. */
2313 struct asan_add_string_csts_data
2315 tree type;
2316 vec<constructor_elt, va_gc> *v;
2319 /* Called via htab_traverse. Call asan_add_global
2320 on emitted STRING_CSTs from the constant hash table. */
2322 static int
2323 add_string_csts (void **slot, void *data)
2325 struct constant_descriptor_tree *desc
2326 = (struct constant_descriptor_tree *) *slot;
2327 if (TREE_CODE (desc->value) == STRING_CST
2328 && TREE_ASM_WRITTEN (desc->value)
2329 && asan_protect_global (desc->value))
2331 struct asan_add_string_csts_data *aascd
2332 = (struct asan_add_string_csts_data *) data;
2333 asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
2334 aascd->type, aascd->v);
2336 return 1;
2339 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
2340 invoke ggc_collect. */
2341 static GTY(()) tree asan_ctor_statements;
2343 /* Module-level instrumentation.
2344 - Insert __asan_init_vN() into the list of CTORs.
2345 - TODO: insert redzones around globals.
2348 void
2349 asan_finish_file (void)
2351 varpool_node *vnode;
2352 unsigned HOST_WIDE_INT gcount = 0;
2354 if (shadow_ptr_types[0] == NULL_TREE)
2355 asan_init_shadow_ptr_types ();
2356 /* Avoid instrumenting code in the asan ctors/dtors.
2357 We don't need to insert padding after the description strings,
2358 nor after .LASAN* array. */
2359 flag_sanitize &= ~SANITIZE_ADDRESS;
2361 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
2362 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
2363 FOR_EACH_DEFINED_VARIABLE (vnode)
2364 if (TREE_ASM_WRITTEN (vnode->decl)
2365 && asan_protect_global (vnode->decl))
2366 ++gcount;
2367 htab_t const_desc_htab = constant_pool_htab ();
2368 htab_traverse (const_desc_htab, count_string_csts, &gcount);
2369 if (gcount)
2371 tree type = asan_global_struct (), var, ctor;
2372 tree dtor_statements = NULL_TREE;
2373 vec<constructor_elt, va_gc> *v;
2374 char buf[20];
2376 type = build_array_type_nelts (type, gcount);
2377 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
2378 var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
2379 type);
2380 TREE_STATIC (var) = 1;
2381 TREE_PUBLIC (var) = 0;
2382 DECL_ARTIFICIAL (var) = 1;
2383 DECL_IGNORED_P (var) = 1;
2384 vec_alloc (v, gcount);
2385 FOR_EACH_DEFINED_VARIABLE (vnode)
2386 if (TREE_ASM_WRITTEN (vnode->decl)
2387 && asan_protect_global (vnode->decl))
2388 asan_add_global (vnode->decl, TREE_TYPE (type), v);
2389 struct asan_add_string_csts_data aascd;
2390 aascd.type = TREE_TYPE (type);
2391 aascd.v = v;
2392 htab_traverse (const_desc_htab, add_string_csts, &aascd);
2393 ctor = build_constructor (type, v);
2394 TREE_CONSTANT (ctor) = 1;
2395 TREE_STATIC (ctor) = 1;
2396 DECL_INITIAL (var) = ctor;
2397 varpool_node::finalize_decl (var);
2399 fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
2400 tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
2401 append_to_statement_list (build_call_expr (fn, 2,
2402 build_fold_addr_expr (var),
2403 gcount_tree),
2404 &asan_ctor_statements);
2406 fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
2407 append_to_statement_list (build_call_expr (fn, 2,
2408 build_fold_addr_expr (var),
2409 gcount_tree),
2410 &dtor_statements);
2411 cgraph_build_static_cdtor ('D', dtor_statements,
2412 MAX_RESERVED_INIT_PRIORITY - 1);
2414 cgraph_build_static_cdtor ('I', asan_ctor_statements,
2415 MAX_RESERVED_INIT_PRIORITY - 1);
2416 flag_sanitize |= SANITIZE_ADDRESS;
2419 /* Expand the ASAN_{LOAD,STORE} builtins. */
2421 static bool
2422 asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
2424 gimple g = gsi_stmt (*iter);
2425 location_t loc = gimple_location (g);
2427 HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
2428 gcc_assert (flags < ASAN_CHECK_LAST);
2429 bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
2430 bool is_store = (flags & ASAN_CHECK_STORE) != 0;
2431 bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
2432 bool start_instrumented = (flags & ASAN_CHECK_START_INSTRUMENTED) != 0;
2433 bool end_instrumented = (flags & ASAN_CHECK_END_INSTRUMENTED) != 0;
2435 tree base = gimple_call_arg (g, 1);
2436 tree len = gimple_call_arg (g, 2);
2438 HOST_WIDE_INT size_in_bytes
2439 = is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2441 if (use_calls)
2443 /* Instrument using callbacks. */
2444 gimple g
2445 = gimple_build_assign_with_ops (NOP_EXPR,
2446 make_ssa_name (pointer_sized_int_node,
2447 NULL),
2448 base, NULL_TREE);
2449 gimple_set_location (g, loc);
2450 gsi_insert_before (iter, g, GSI_SAME_STMT);
2451 tree base_addr = gimple_assign_lhs (g);
2453 int nargs;
2454 tree fun = check_func (is_store, size_in_bytes, &nargs);
2455 if (nargs == 1)
2456 g = gimple_build_call (fun, 1, base_addr);
2457 else
2459 gcc_assert (nargs == 2);
2460 g = gimple_build_assign_with_ops (NOP_EXPR,
2461 make_ssa_name (pointer_sized_int_node,
2462 NULL),
2463 len, NULL_TREE);
2464 gimple_set_location (g, loc);
2465 gsi_insert_before (iter, g, GSI_SAME_STMT);
2466 tree sz_arg = gimple_assign_lhs (g);
2467 g = gimple_build_call (fun, nargs, base_addr, sz_arg);
2469 gimple_set_location (g, loc);
2470 gsi_replace (iter, g, false);
2471 return false;
2474 HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
2476 tree uintptr_type
2477 = build_nonstandard_integer_type (TYPE_PRECISION (TREE_TYPE (base)), 1);
2479 tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
2480 tree shadow_type = TREE_TYPE (shadow_ptr_type);
2482 gimple_stmt_iterator gsi = *iter;
2484 if (!is_non_zero_len)
2486 /* So, the length of the memory area to asan-protect is
2487 non-constant. Let's guard the generated instrumentation code
2488 like:
2490 if (len != 0)
2492 //asan instrumentation code goes here.
2494 // falltrough instructions, starting with *ITER. */
2496 g = gimple_build_cond (NE_EXPR,
2497 len,
2498 build_int_cst (TREE_TYPE (len), 0),
2499 NULL_TREE, NULL_TREE);
2500 gimple_set_location (g, loc);
2502 basic_block then_bb, fallthrough_bb;
2503 insert_if_then_before_iter (g, iter, /*then_more_likely_p=*/true,
2504 &then_bb, &fallthrough_bb);
2505 /* Note that fallthrough_bb starts with the statement that was
2506 pointed to by ITER. */
2508 /* The 'then block' of the 'if (len != 0) condition is where
2509 we'll generate the asan instrumentation code now. */
2510 gsi = gsi_last_bb (then_bb);
2513 /* Get an iterator on the point where we can add the condition
2514 statement for the instrumentation. */
2515 basic_block then_bb, else_bb;
2516 gsi = create_cond_insert_point (&gsi, /*before_p*/false,
2517 /*then_more_likely_p=*/false,
2518 /*create_then_fallthru_edge=*/false,
2519 &then_bb,
2520 &else_bb);
2522 g = gimple_build_assign_with_ops (NOP_EXPR,
2523 make_ssa_name (pointer_sized_int_node,
2524 NULL),
2525 base, NULL_TREE);
2526 gimple_set_location (g, loc);
2527 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
2528 tree base_addr = gimple_assign_lhs (g);
2530 tree t = NULL_TREE;
2531 if (real_size_in_bytes >= 8)
2533 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
2534 shadow_ptr_type);
2535 t = shadow;
2537 else
2539 /* Slow path for 1, 2 and 4 byte accesses. */
2541 if (!start_instrumented)
2543 /* Test (shadow != 0)
2544 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow). */
2545 tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
2546 shadow_ptr_type);
2547 gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
2548 gimple_seq seq = NULL;
2549 gimple_seq_add_stmt (&seq, shadow_test);
2550 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, base_addr, 7));
2551 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
2552 gimple_seq_last (seq)));
2553 if (real_size_in_bytes > 1)
2554 gimple_seq_add_stmt (&seq,
2555 build_assign (PLUS_EXPR, gimple_seq_last (seq),
2556 real_size_in_bytes - 1));
2557 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
2558 gimple_seq_last (seq),
2559 shadow));
2560 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
2561 gimple_seq_last (seq)));
2562 t = gimple_assign_lhs (gimple_seq_last (seq));
2563 gimple_seq_set_location (seq, loc);
2564 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
2567 /* For non-constant, misaligned or otherwise weird access sizes,
2568 check first and last byte. */
2569 if (size_in_bytes == -1 && !end_instrumented)
2571 g = gimple_build_assign_with_ops (MINUS_EXPR,
2572 make_ssa_name (uintptr_type, NULL),
2573 len,
2574 build_int_cst (uintptr_type, 1));
2575 gimple_set_location (g, loc);
2576 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2577 tree last = gimple_assign_lhs (g);
2578 g = gimple_build_assign_with_ops (PLUS_EXPR,
2579 make_ssa_name (uintptr_type, NULL),
2580 base_addr,
2581 last);
2582 gimple_set_location (g, loc);
2583 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2584 tree base_end_addr = gimple_assign_lhs (g);
2586 tree shadow = build_shadow_mem_access (&gsi, loc, base_end_addr,
2587 shadow_ptr_type);
2588 gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
2589 gimple_seq seq = NULL;
2590 gimple_seq_add_stmt (&seq, shadow_test);
2591 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
2592 base_end_addr, 7));
2593 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
2594 gimple_seq_last (seq)));
2595 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
2596 gimple_seq_last (seq),
2597 shadow));
2598 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
2599 gimple_seq_last (seq)));
2600 if (!start_instrumented)
2601 gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
2602 gimple_seq_last (seq)));
2603 t = gimple_assign_lhs (gimple_seq_last (seq));
2604 gimple_seq_set_location (seq, loc);
2605 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
2609 g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
2610 NULL_TREE, NULL_TREE);
2611 gimple_set_location (g, loc);
2612 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2614 /* Generate call to the run-time library (e.g. __asan_report_load8). */
2615 gsi = gsi_start_bb (then_bb);
2616 int nargs;
2617 tree fun = report_error_func (is_store, size_in_bytes, &nargs);
2618 g = gimple_build_call (fun, nargs, base_addr, len);
2619 gimple_set_location (g, loc);
2620 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2622 gsi_remove (iter, true);
2623 *iter = gsi_start_bb (else_bb);
2625 return true;
2628 /* Instrument the current function. */
2630 static unsigned int
2631 asan_instrument (void)
2633 if (shadow_ptr_types[0] == NULL_TREE)
2634 asan_init_shadow_ptr_types ();
2635 transform_statements ();
2636 return 0;
2639 static bool
2640 gate_asan (void)
2642 return (flag_sanitize & SANITIZE_ADDRESS) != 0
2643 && !lookup_attribute ("no_sanitize_address",
2644 DECL_ATTRIBUTES (current_function_decl));
2647 namespace {
2649 const pass_data pass_data_asan =
2651 GIMPLE_PASS, /* type */
2652 "asan", /* name */
2653 OPTGROUP_NONE, /* optinfo_flags */
2654 TV_NONE, /* tv_id */
2655 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2656 0, /* properties_provided */
2657 0, /* properties_destroyed */
2658 0, /* todo_flags_start */
2659 TODO_update_ssa, /* todo_flags_finish */
2662 class pass_asan : public gimple_opt_pass
2664 public:
2665 pass_asan (gcc::context *ctxt)
2666 : gimple_opt_pass (pass_data_asan, ctxt)
2669 /* opt_pass methods: */
2670 opt_pass * clone () { return new pass_asan (m_ctxt); }
2671 virtual bool gate (function *) { return gate_asan (); }
2672 virtual unsigned int execute (function *) { return asan_instrument (); }
2674 }; // class pass_asan
2676 } // anon namespace
2678 gimple_opt_pass *
2679 make_pass_asan (gcc::context *ctxt)
2681 return new pass_asan (ctxt);
2684 namespace {
2686 const pass_data pass_data_asan_O0 =
2688 GIMPLE_PASS, /* type */
2689 "asan0", /* name */
2690 OPTGROUP_NONE, /* optinfo_flags */
2691 TV_NONE, /* tv_id */
2692 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2693 0, /* properties_provided */
2694 0, /* properties_destroyed */
2695 0, /* todo_flags_start */
2696 TODO_update_ssa, /* todo_flags_finish */
2699 class pass_asan_O0 : public gimple_opt_pass
2701 public:
2702 pass_asan_O0 (gcc::context *ctxt)
2703 : gimple_opt_pass (pass_data_asan_O0, ctxt)
2706 /* opt_pass methods: */
2707 virtual bool gate (function *) { return !optimize && gate_asan (); }
2708 virtual unsigned int execute (function *) { return asan_instrument (); }
2710 }; // class pass_asan_O0
2712 } // anon namespace
2714 gimple_opt_pass *
2715 make_pass_asan_O0 (gcc::context *ctxt)
2717 return new pass_asan_O0 (ctxt);
2720 /* Perform optimization of sanitize functions. */
2722 namespace {
2724 const pass_data pass_data_sanopt =
2726 GIMPLE_PASS, /* type */
2727 "sanopt", /* name */
2728 OPTGROUP_NONE, /* optinfo_flags */
2729 TV_NONE, /* tv_id */
2730 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2731 0, /* properties_provided */
2732 0, /* properties_destroyed */
2733 0, /* todo_flags_start */
2734 TODO_update_ssa, /* todo_flags_finish */
2737 class pass_sanopt : public gimple_opt_pass
2739 public:
2740 pass_sanopt (gcc::context *ctxt)
2741 : gimple_opt_pass (pass_data_sanopt, ctxt)
2744 /* opt_pass methods: */
2745 virtual bool gate (function *) { return flag_sanitize; }
2746 virtual unsigned int execute (function *);
2748 }; // class pass_sanopt
2750 unsigned int
2751 pass_sanopt::execute (function *fun)
2753 basic_block bb;
2755 int asan_num_accesses = 0;
2756 if (flag_sanitize & SANITIZE_ADDRESS)
2758 gimple_stmt_iterator gsi;
2759 FOR_EACH_BB_FN (bb, fun)
2760 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2762 gimple stmt = gsi_stmt (gsi);
2763 if (is_gimple_call (stmt) && gimple_call_internal_p (stmt)
2764 && gimple_call_internal_fn (stmt) == IFN_ASAN_CHECK)
2765 ++asan_num_accesses;
2769 bool use_calls = ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD < INT_MAX
2770 && asan_num_accesses >= ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD;
2772 FOR_EACH_BB_FN (bb, fun)
2774 gimple_stmt_iterator gsi;
2775 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
2777 gimple stmt = gsi_stmt (gsi);
2778 bool no_next = false;
2780 if (!is_gimple_call (stmt))
2782 gsi_next (&gsi);
2783 continue;
2786 if (gimple_call_internal_p (stmt))
2788 enum internal_fn ifn = gimple_call_internal_fn (stmt);
2789 switch (ifn)
2791 case IFN_UBSAN_NULL:
2792 no_next = ubsan_expand_null_ifn (&gsi);
2793 break;
2794 case IFN_UBSAN_BOUNDS:
2795 no_next = ubsan_expand_bounds_ifn (&gsi);
2796 break;
2797 case IFN_ASAN_CHECK:
2799 no_next = asan_expand_check_ifn (&gsi, use_calls);
2800 break;
2802 default:
2803 break;
2807 if (dump_file && (dump_flags & TDF_DETAILS))
2809 fprintf (dump_file, "Optimized\n ");
2810 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2811 fprintf (dump_file, "\n");
2814 if (!no_next)
2815 gsi_next (&gsi);
2818 return 0;
2821 } // anon namespace
2823 gimple_opt_pass *
2824 make_pass_sanopt (gcc::context *ctxt)
2826 return new pass_sanopt (ctxt);
2829 #include "gt-asan.h"