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
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 "hash-table.h"
27 #include "basic-block.h"
28 #include "tree-ssa-alias.h"
29 #include "internal-fn.h"
30 #include "gimple-expr.h"
35 #include "gimple-iterator.h"
38 #include "stor-layout.h"
39 #include "tree-iterator.h"
41 #include "stringpool.h"
42 #include "tree-ssanames.h"
43 #include "tree-pass.h"
45 #include "gimple-pretty-print.h"
51 #include "langhooks.h"
52 #include "alloc-pool.h"
54 #include "gimple-builder.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.
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;
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.
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
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
130 The 32 bytes of LEFT red zone at the bottom of the stack can be
133 1/ The first 8 bytes contain a magical asan number that is always
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
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
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
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:
215 // Address of the beginning of the global variable.
218 // Initial size of the global variable.
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.
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;
234 // A pointer to struct that contains source location, could be NULL.
235 __asan_global_source_location *__location;
238 A destructor function that calls the runtime asan library function
239 _asan_unregister_globals is also installed. */
241 alias_set_type asan_shadow_set
= -1;
243 /* Pointer types to 1 resp. 2 byte integers in shadow memory. A separate
244 alias set is used for all shadow memory accesses. */
245 static GTY(()) tree shadow_ptr_types
[2];
247 /* Decl for __asan_option_detect_stack_use_after_return. */
248 static GTY(()) tree asan_detect_stack_use_after_return
;
250 /* Various flags for Asan builtins. */
251 enum asan_check_flags
253 ASAN_CHECK_STORE
= 1 << 0,
254 ASAN_CHECK_SCALAR_ACCESS
= 1 << 1,
255 ASAN_CHECK_NON_ZERO_LEN
= 1 << 2,
256 ASAN_CHECK_START_INSTRUMENTED
= 1 << 3,
257 ASAN_CHECK_END_INSTRUMENTED
= 1 << 4,
261 /* Hashtable support for memory references used by gimple
264 /* This type represents a reference to a memory region. */
267 /* The expression of the beginning of the memory region. */
270 /* The size of the access. */
271 HOST_WIDE_INT access_size
;
274 static alloc_pool asan_mem_ref_alloc_pool
;
276 /* This creates the alloc pool used to store the instances of
277 asan_mem_ref that are stored in the hash table asan_mem_ref_ht. */
280 asan_mem_ref_get_alloc_pool ()
282 if (asan_mem_ref_alloc_pool
== NULL
)
283 asan_mem_ref_alloc_pool
= create_alloc_pool ("asan_mem_ref",
284 sizeof (asan_mem_ref
),
286 return asan_mem_ref_alloc_pool
;
290 /* Initializes an instance of asan_mem_ref. */
293 asan_mem_ref_init (asan_mem_ref
*ref
, tree start
, HOST_WIDE_INT access_size
)
296 ref
->access_size
= access_size
;
299 /* Allocates memory for an instance of asan_mem_ref into the memory
300 pool returned by asan_mem_ref_get_alloc_pool and initialize it.
301 START is the address of (or the expression pointing to) the
302 beginning of memory reference. ACCESS_SIZE is the size of the
303 access to the referenced memory. */
306 asan_mem_ref_new (tree start
, HOST_WIDE_INT access_size
)
309 (asan_mem_ref
*) pool_alloc (asan_mem_ref_get_alloc_pool ());
311 asan_mem_ref_init (ref
, start
, access_size
);
315 /* This builds and returns a pointer to the end of the memory region
316 that starts at START and of length LEN. */
319 asan_mem_ref_get_end (tree start
, tree len
)
321 if (len
== NULL_TREE
|| integer_zerop (len
))
324 if (!ptrofftype_p (len
))
325 len
= convert_to_ptrofftype (len
);
327 return fold_build2 (POINTER_PLUS_EXPR
, TREE_TYPE (start
), start
, len
);
330 /* Return a tree expression that represents the end of the referenced
331 memory region. Beware that this function can actually build a new
335 asan_mem_ref_get_end (const asan_mem_ref
*ref
, tree len
)
337 return asan_mem_ref_get_end (ref
->start
, len
);
340 struct asan_mem_ref_hasher
341 : typed_noop_remove
<asan_mem_ref
>
343 typedef asan_mem_ref value_type
;
344 typedef asan_mem_ref compare_type
;
346 static inline hashval_t
hash (const value_type
*);
347 static inline bool equal (const value_type
*, const compare_type
*);
350 /* Hash a memory reference. */
353 asan_mem_ref_hasher::hash (const asan_mem_ref
*mem_ref
)
355 inchash::hash hstate
;
356 inchash::add_expr (mem_ref
->start
, hstate
);
357 hstate
.add_wide_int (mem_ref
->access_size
);
358 return hstate
.end ();
361 /* Compare two memory references. We accept the length of either
362 memory references to be NULL_TREE. */
365 asan_mem_ref_hasher::equal (const asan_mem_ref
*m1
,
366 const asan_mem_ref
*m2
)
368 return (m1
->access_size
== m2
->access_size
369 && operand_equal_p (m1
->start
, m2
->start
, 0));
372 static hash_table
<asan_mem_ref_hasher
> *asan_mem_ref_ht
;
374 /* Returns a reference to the hash table containing memory references.
375 This function ensures that the hash table is created. Note that
376 this hash table is updated by the function
377 update_mem_ref_hash_table. */
379 static hash_table
<asan_mem_ref_hasher
> *
380 get_mem_ref_hash_table ()
382 if (!asan_mem_ref_ht
)
383 asan_mem_ref_ht
= new hash_table
<asan_mem_ref_hasher
> (10);
385 return asan_mem_ref_ht
;
388 /* Clear all entries from the memory references hash table. */
391 empty_mem_ref_hash_table ()
394 asan_mem_ref_ht
->empty ();
397 /* Free the memory references hash table. */
400 free_mem_ref_resources ()
402 delete asan_mem_ref_ht
;
403 asan_mem_ref_ht
= NULL
;
405 if (asan_mem_ref_alloc_pool
)
407 free_alloc_pool (asan_mem_ref_alloc_pool
);
408 asan_mem_ref_alloc_pool
= NULL
;
412 /* Return true iff the memory reference REF has been instrumented. */
415 has_mem_ref_been_instrumented (tree ref
, HOST_WIDE_INT access_size
)
418 asan_mem_ref_init (&r
, ref
, access_size
);
420 return (get_mem_ref_hash_table ()->find (&r
) != NULL
);
423 /* Return true iff the memory reference REF has been instrumented. */
426 has_mem_ref_been_instrumented (const asan_mem_ref
*ref
)
428 return has_mem_ref_been_instrumented (ref
->start
, ref
->access_size
);
431 /* Return true iff access to memory region starting at REF and of
432 length LEN has been instrumented. */
435 has_mem_ref_been_instrumented (const asan_mem_ref
*ref
, tree len
)
437 /* First let's see if the address of the beginning of REF has been
439 if (!has_mem_ref_been_instrumented (ref
))
444 /* Let's see if the end of the region has been instrumented. */
445 if (!has_mem_ref_been_instrumented (asan_mem_ref_get_end (ref
, len
),
452 /* Set REF to the memory reference present in a gimple assignment
453 ASSIGNMENT. Return true upon successful completion, false
457 get_mem_ref_of_assignment (const_gimple_assign assignment
,
461 gcc_assert (gimple_assign_single_p (assignment
));
463 if (gimple_store_p (assignment
)
464 && !gimple_clobber_p (assignment
))
466 ref
->start
= gimple_assign_lhs (assignment
);
467 *ref_is_store
= true;
469 else if (gimple_assign_load_p (assignment
))
471 ref
->start
= gimple_assign_rhs1 (assignment
);
472 *ref_is_store
= false;
477 ref
->access_size
= int_size_in_bytes (TREE_TYPE (ref
->start
));
481 /* Return the memory references contained in a gimple statement
482 representing a builtin call that has to do with memory access. */
485 get_mem_refs_of_builtin_call (const gimple call
,
497 gcc_checking_assert (gimple_call_builtin_p (call
, BUILT_IN_NORMAL
));
499 tree callee
= gimple_call_fndecl (call
);
500 tree source0
= NULL_TREE
, source1
= NULL_TREE
,
501 dest
= NULL_TREE
, len
= NULL_TREE
;
502 bool is_store
= true, got_reference_p
= false;
503 HOST_WIDE_INT access_size
= 1;
505 switch (DECL_FUNCTION_CODE (callee
))
507 /* (s, s, n) style memops. */
509 case BUILT_IN_MEMCMP
:
510 source0
= gimple_call_arg (call
, 0);
511 source1
= gimple_call_arg (call
, 1);
512 len
= gimple_call_arg (call
, 2);
515 /* (src, dest, n) style memops. */
517 source0
= gimple_call_arg (call
, 0);
518 dest
= gimple_call_arg (call
, 1);
519 len
= gimple_call_arg (call
, 2);
522 /* (dest, src, n) style memops. */
523 case BUILT_IN_MEMCPY
:
524 case BUILT_IN_MEMCPY_CHK
:
525 case BUILT_IN_MEMMOVE
:
526 case BUILT_IN_MEMMOVE_CHK
:
527 case BUILT_IN_MEMPCPY
:
528 case BUILT_IN_MEMPCPY_CHK
:
529 dest
= gimple_call_arg (call
, 0);
530 source0
= gimple_call_arg (call
, 1);
531 len
= gimple_call_arg (call
, 2);
534 /* (dest, n) style memops. */
536 dest
= gimple_call_arg (call
, 0);
537 len
= gimple_call_arg (call
, 1);
540 /* (dest, x, n) style memops*/
541 case BUILT_IN_MEMSET
:
542 case BUILT_IN_MEMSET_CHK
:
543 dest
= gimple_call_arg (call
, 0);
544 len
= gimple_call_arg (call
, 2);
547 case BUILT_IN_STRLEN
:
548 source0
= gimple_call_arg (call
, 0);
549 len
= gimple_call_lhs (call
);
552 /* And now the __atomic* and __sync builtins.
553 These are handled differently from the classical memory memory
554 access builtins above. */
556 case BUILT_IN_ATOMIC_LOAD_1
:
557 case BUILT_IN_ATOMIC_LOAD_2
:
558 case BUILT_IN_ATOMIC_LOAD_4
:
559 case BUILT_IN_ATOMIC_LOAD_8
:
560 case BUILT_IN_ATOMIC_LOAD_16
:
564 case BUILT_IN_SYNC_FETCH_AND_ADD_1
:
565 case BUILT_IN_SYNC_FETCH_AND_ADD_2
:
566 case BUILT_IN_SYNC_FETCH_AND_ADD_4
:
567 case BUILT_IN_SYNC_FETCH_AND_ADD_8
:
568 case BUILT_IN_SYNC_FETCH_AND_ADD_16
:
570 case BUILT_IN_SYNC_FETCH_AND_SUB_1
:
571 case BUILT_IN_SYNC_FETCH_AND_SUB_2
:
572 case BUILT_IN_SYNC_FETCH_AND_SUB_4
:
573 case BUILT_IN_SYNC_FETCH_AND_SUB_8
:
574 case BUILT_IN_SYNC_FETCH_AND_SUB_16
:
576 case BUILT_IN_SYNC_FETCH_AND_OR_1
:
577 case BUILT_IN_SYNC_FETCH_AND_OR_2
:
578 case BUILT_IN_SYNC_FETCH_AND_OR_4
:
579 case BUILT_IN_SYNC_FETCH_AND_OR_8
:
580 case BUILT_IN_SYNC_FETCH_AND_OR_16
:
582 case BUILT_IN_SYNC_FETCH_AND_AND_1
:
583 case BUILT_IN_SYNC_FETCH_AND_AND_2
:
584 case BUILT_IN_SYNC_FETCH_AND_AND_4
:
585 case BUILT_IN_SYNC_FETCH_AND_AND_8
:
586 case BUILT_IN_SYNC_FETCH_AND_AND_16
:
588 case BUILT_IN_SYNC_FETCH_AND_XOR_1
:
589 case BUILT_IN_SYNC_FETCH_AND_XOR_2
:
590 case BUILT_IN_SYNC_FETCH_AND_XOR_4
:
591 case BUILT_IN_SYNC_FETCH_AND_XOR_8
:
592 case BUILT_IN_SYNC_FETCH_AND_XOR_16
:
594 case BUILT_IN_SYNC_FETCH_AND_NAND_1
:
595 case BUILT_IN_SYNC_FETCH_AND_NAND_2
:
596 case BUILT_IN_SYNC_FETCH_AND_NAND_4
:
597 case BUILT_IN_SYNC_FETCH_AND_NAND_8
:
599 case BUILT_IN_SYNC_ADD_AND_FETCH_1
:
600 case BUILT_IN_SYNC_ADD_AND_FETCH_2
:
601 case BUILT_IN_SYNC_ADD_AND_FETCH_4
:
602 case BUILT_IN_SYNC_ADD_AND_FETCH_8
:
603 case BUILT_IN_SYNC_ADD_AND_FETCH_16
:
605 case BUILT_IN_SYNC_SUB_AND_FETCH_1
:
606 case BUILT_IN_SYNC_SUB_AND_FETCH_2
:
607 case BUILT_IN_SYNC_SUB_AND_FETCH_4
:
608 case BUILT_IN_SYNC_SUB_AND_FETCH_8
:
609 case BUILT_IN_SYNC_SUB_AND_FETCH_16
:
611 case BUILT_IN_SYNC_OR_AND_FETCH_1
:
612 case BUILT_IN_SYNC_OR_AND_FETCH_2
:
613 case BUILT_IN_SYNC_OR_AND_FETCH_4
:
614 case BUILT_IN_SYNC_OR_AND_FETCH_8
:
615 case BUILT_IN_SYNC_OR_AND_FETCH_16
:
617 case BUILT_IN_SYNC_AND_AND_FETCH_1
:
618 case BUILT_IN_SYNC_AND_AND_FETCH_2
:
619 case BUILT_IN_SYNC_AND_AND_FETCH_4
:
620 case BUILT_IN_SYNC_AND_AND_FETCH_8
:
621 case BUILT_IN_SYNC_AND_AND_FETCH_16
:
623 case BUILT_IN_SYNC_XOR_AND_FETCH_1
:
624 case BUILT_IN_SYNC_XOR_AND_FETCH_2
:
625 case BUILT_IN_SYNC_XOR_AND_FETCH_4
:
626 case BUILT_IN_SYNC_XOR_AND_FETCH_8
:
627 case BUILT_IN_SYNC_XOR_AND_FETCH_16
:
629 case BUILT_IN_SYNC_NAND_AND_FETCH_1
:
630 case BUILT_IN_SYNC_NAND_AND_FETCH_2
:
631 case BUILT_IN_SYNC_NAND_AND_FETCH_4
:
632 case BUILT_IN_SYNC_NAND_AND_FETCH_8
:
634 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1
:
635 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2
:
636 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4
:
637 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8
:
638 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16
:
640 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1
:
641 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2
:
642 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4
:
643 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8
:
644 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16
:
646 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1
:
647 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2
:
648 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4
:
649 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8
:
650 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16
:
652 case BUILT_IN_SYNC_LOCK_RELEASE_1
:
653 case BUILT_IN_SYNC_LOCK_RELEASE_2
:
654 case BUILT_IN_SYNC_LOCK_RELEASE_4
:
655 case BUILT_IN_SYNC_LOCK_RELEASE_8
:
656 case BUILT_IN_SYNC_LOCK_RELEASE_16
:
658 case BUILT_IN_ATOMIC_EXCHANGE_1
:
659 case BUILT_IN_ATOMIC_EXCHANGE_2
:
660 case BUILT_IN_ATOMIC_EXCHANGE_4
:
661 case BUILT_IN_ATOMIC_EXCHANGE_8
:
662 case BUILT_IN_ATOMIC_EXCHANGE_16
:
664 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
:
665 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2
:
666 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4
:
667 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8
:
668 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16
:
670 case BUILT_IN_ATOMIC_STORE_1
:
671 case BUILT_IN_ATOMIC_STORE_2
:
672 case BUILT_IN_ATOMIC_STORE_4
:
673 case BUILT_IN_ATOMIC_STORE_8
:
674 case BUILT_IN_ATOMIC_STORE_16
:
676 case BUILT_IN_ATOMIC_ADD_FETCH_1
:
677 case BUILT_IN_ATOMIC_ADD_FETCH_2
:
678 case BUILT_IN_ATOMIC_ADD_FETCH_4
:
679 case BUILT_IN_ATOMIC_ADD_FETCH_8
:
680 case BUILT_IN_ATOMIC_ADD_FETCH_16
:
682 case BUILT_IN_ATOMIC_SUB_FETCH_1
:
683 case BUILT_IN_ATOMIC_SUB_FETCH_2
:
684 case BUILT_IN_ATOMIC_SUB_FETCH_4
:
685 case BUILT_IN_ATOMIC_SUB_FETCH_8
:
686 case BUILT_IN_ATOMIC_SUB_FETCH_16
:
688 case BUILT_IN_ATOMIC_AND_FETCH_1
:
689 case BUILT_IN_ATOMIC_AND_FETCH_2
:
690 case BUILT_IN_ATOMIC_AND_FETCH_4
:
691 case BUILT_IN_ATOMIC_AND_FETCH_8
:
692 case BUILT_IN_ATOMIC_AND_FETCH_16
:
694 case BUILT_IN_ATOMIC_NAND_FETCH_1
:
695 case BUILT_IN_ATOMIC_NAND_FETCH_2
:
696 case BUILT_IN_ATOMIC_NAND_FETCH_4
:
697 case BUILT_IN_ATOMIC_NAND_FETCH_8
:
698 case BUILT_IN_ATOMIC_NAND_FETCH_16
:
700 case BUILT_IN_ATOMIC_XOR_FETCH_1
:
701 case BUILT_IN_ATOMIC_XOR_FETCH_2
:
702 case BUILT_IN_ATOMIC_XOR_FETCH_4
:
703 case BUILT_IN_ATOMIC_XOR_FETCH_8
:
704 case BUILT_IN_ATOMIC_XOR_FETCH_16
:
706 case BUILT_IN_ATOMIC_OR_FETCH_1
:
707 case BUILT_IN_ATOMIC_OR_FETCH_2
:
708 case BUILT_IN_ATOMIC_OR_FETCH_4
:
709 case BUILT_IN_ATOMIC_OR_FETCH_8
:
710 case BUILT_IN_ATOMIC_OR_FETCH_16
:
712 case BUILT_IN_ATOMIC_FETCH_ADD_1
:
713 case BUILT_IN_ATOMIC_FETCH_ADD_2
:
714 case BUILT_IN_ATOMIC_FETCH_ADD_4
:
715 case BUILT_IN_ATOMIC_FETCH_ADD_8
:
716 case BUILT_IN_ATOMIC_FETCH_ADD_16
:
718 case BUILT_IN_ATOMIC_FETCH_SUB_1
:
719 case BUILT_IN_ATOMIC_FETCH_SUB_2
:
720 case BUILT_IN_ATOMIC_FETCH_SUB_4
:
721 case BUILT_IN_ATOMIC_FETCH_SUB_8
:
722 case BUILT_IN_ATOMIC_FETCH_SUB_16
:
724 case BUILT_IN_ATOMIC_FETCH_AND_1
:
725 case BUILT_IN_ATOMIC_FETCH_AND_2
:
726 case BUILT_IN_ATOMIC_FETCH_AND_4
:
727 case BUILT_IN_ATOMIC_FETCH_AND_8
:
728 case BUILT_IN_ATOMIC_FETCH_AND_16
:
730 case BUILT_IN_ATOMIC_FETCH_NAND_1
:
731 case BUILT_IN_ATOMIC_FETCH_NAND_2
:
732 case BUILT_IN_ATOMIC_FETCH_NAND_4
:
733 case BUILT_IN_ATOMIC_FETCH_NAND_8
:
734 case BUILT_IN_ATOMIC_FETCH_NAND_16
:
736 case BUILT_IN_ATOMIC_FETCH_XOR_1
:
737 case BUILT_IN_ATOMIC_FETCH_XOR_2
:
738 case BUILT_IN_ATOMIC_FETCH_XOR_4
:
739 case BUILT_IN_ATOMIC_FETCH_XOR_8
:
740 case BUILT_IN_ATOMIC_FETCH_XOR_16
:
742 case BUILT_IN_ATOMIC_FETCH_OR_1
:
743 case BUILT_IN_ATOMIC_FETCH_OR_2
:
744 case BUILT_IN_ATOMIC_FETCH_OR_4
:
745 case BUILT_IN_ATOMIC_FETCH_OR_8
:
746 case BUILT_IN_ATOMIC_FETCH_OR_16
:
748 dest
= gimple_call_arg (call
, 0);
749 /* DEST represents the address of a memory location.
750 instrument_derefs wants the memory location, so lets
751 dereference the address DEST before handing it to
752 instrument_derefs. */
753 if (TREE_CODE (dest
) == ADDR_EXPR
)
754 dest
= TREE_OPERAND (dest
, 0);
755 else if (TREE_CODE (dest
) == SSA_NAME
|| TREE_CODE (dest
) == INTEGER_CST
)
756 dest
= build2 (MEM_REF
, TREE_TYPE (TREE_TYPE (dest
)),
757 dest
, build_int_cst (TREE_TYPE (dest
), 0));
761 access_size
= int_size_in_bytes (TREE_TYPE (dest
));
765 /* The other builtins memory access are not instrumented in this
766 function because they either don't have any length parameter,
767 or their length parameter is just a limit. */
771 if (len
!= NULL_TREE
)
773 if (source0
!= NULL_TREE
)
775 src0
->start
= source0
;
776 src0
->access_size
= access_size
;
778 *src0_is_store
= false;
781 if (source1
!= NULL_TREE
)
783 src1
->start
= source1
;
784 src1
->access_size
= access_size
;
786 *src1_is_store
= false;
789 if (dest
!= NULL_TREE
)
792 dst
->access_size
= access_size
;
794 *dst_is_store
= true;
797 got_reference_p
= true;
802 dst
->access_size
= access_size
;
803 *dst_len
= NULL_TREE
;
804 *dst_is_store
= is_store
;
805 *dest_is_deref
= true;
806 got_reference_p
= true;
809 return got_reference_p
;
812 /* Return true iff a given gimple statement has been instrumented.
813 Note that the statement is "defined" by the memory references it
817 has_stmt_been_instrumented_p (gimple stmt
)
819 if (gimple_assign_single_p (stmt
))
823 asan_mem_ref_init (&r
, NULL
, 1);
825 if (get_mem_ref_of_assignment (as_a
<gimple_assign
> (stmt
), &r
,
827 return has_mem_ref_been_instrumented (&r
);
829 else if (gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
))
831 asan_mem_ref src0
, src1
, dest
;
832 asan_mem_ref_init (&src0
, NULL
, 1);
833 asan_mem_ref_init (&src1
, NULL
, 1);
834 asan_mem_ref_init (&dest
, NULL
, 1);
836 tree src0_len
= NULL_TREE
, src1_len
= NULL_TREE
, dest_len
= NULL_TREE
;
837 bool src0_is_store
= false, src1_is_store
= false,
838 dest_is_store
= false, dest_is_deref
= false;
839 if (get_mem_refs_of_builtin_call (stmt
,
840 &src0
, &src0_len
, &src0_is_store
,
841 &src1
, &src1_len
, &src1_is_store
,
842 &dest
, &dest_len
, &dest_is_store
,
845 if (src0
.start
!= NULL_TREE
846 && !has_mem_ref_been_instrumented (&src0
, src0_len
))
849 if (src1
.start
!= NULL_TREE
850 && !has_mem_ref_been_instrumented (&src1
, src1_len
))
853 if (dest
.start
!= NULL_TREE
854 && !has_mem_ref_been_instrumented (&dest
, dest_len
))
863 /* Insert a memory reference into the hash table. */
866 update_mem_ref_hash_table (tree ref
, HOST_WIDE_INT access_size
)
868 hash_table
<asan_mem_ref_hasher
> *ht
= get_mem_ref_hash_table ();
871 asan_mem_ref_init (&r
, ref
, access_size
);
873 asan_mem_ref
**slot
= ht
->find_slot (&r
, INSERT
);
875 *slot
= asan_mem_ref_new (ref
, access_size
);
878 /* Initialize shadow_ptr_types array. */
881 asan_init_shadow_ptr_types (void)
883 asan_shadow_set
= new_alias_set ();
884 shadow_ptr_types
[0] = build_distinct_type_copy (signed_char_type_node
);
885 TYPE_ALIAS_SET (shadow_ptr_types
[0]) = asan_shadow_set
;
886 shadow_ptr_types
[0] = build_pointer_type (shadow_ptr_types
[0]);
887 shadow_ptr_types
[1] = build_distinct_type_copy (short_integer_type_node
);
888 TYPE_ALIAS_SET (shadow_ptr_types
[1]) = asan_shadow_set
;
889 shadow_ptr_types
[1] = build_pointer_type (shadow_ptr_types
[1]);
890 initialize_sanitizer_builtins ();
893 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
896 asan_pp_string (pretty_printer
*pp
)
898 const char *buf
= pp_formatted_text (pp
);
899 size_t len
= strlen (buf
);
900 tree ret
= build_string (len
+ 1, buf
);
902 = build_array_type (TREE_TYPE (shadow_ptr_types
[0]),
903 build_index_type (size_int (len
)));
904 TREE_READONLY (ret
) = 1;
905 TREE_STATIC (ret
) = 1;
906 return build1 (ADDR_EXPR
, shadow_ptr_types
[0], ret
);
909 /* Return a CONST_INT representing 4 subsequent shadow memory bytes. */
912 asan_shadow_cst (unsigned char shadow_bytes
[4])
915 unsigned HOST_WIDE_INT val
= 0;
916 gcc_assert (WORDS_BIG_ENDIAN
== BYTES_BIG_ENDIAN
);
917 for (i
= 0; i
< 4; i
++)
918 val
|= (unsigned HOST_WIDE_INT
) shadow_bytes
[BYTES_BIG_ENDIAN
? 3 - i
: i
]
919 << (BITS_PER_UNIT
* i
);
920 return gen_int_mode (val
, SImode
);
923 /* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
927 asan_clear_shadow (rtx shadow_mem
, HOST_WIDE_INT len
)
929 rtx_insn
*insn
, *insns
, *jump
;
930 rtx_code_label
*top_label
;
934 clear_storage (shadow_mem
, GEN_INT (len
), BLOCK_OP_NORMAL
);
935 insns
= get_insns ();
937 for (insn
= insns
; insn
; insn
= NEXT_INSN (insn
))
940 if (insn
== NULL_RTX
)
946 gcc_assert ((len
& 3) == 0);
947 top_label
= gen_label_rtx ();
948 addr
= copy_to_mode_reg (Pmode
, XEXP (shadow_mem
, 0));
949 shadow_mem
= adjust_automodify_address (shadow_mem
, SImode
, addr
, 0);
950 end
= force_reg (Pmode
, plus_constant (Pmode
, addr
, len
));
951 emit_label (top_label
);
953 emit_move_insn (shadow_mem
, const0_rtx
);
954 tmp
= expand_simple_binop (Pmode
, PLUS
, addr
, gen_int_mode (4, Pmode
), addr
,
955 true, OPTAB_LIB_WIDEN
);
957 emit_move_insn (addr
, tmp
);
958 emit_cmp_and_jump_insns (addr
, end
, LT
, NULL_RTX
, Pmode
, true, top_label
);
959 jump
= get_last_insn ();
960 gcc_assert (JUMP_P (jump
));
961 add_int_reg_note (jump
, REG_BR_PROB
, REG_BR_PROB_BASE
* 80 / 100);
965 asan_function_start (void)
967 section
*fnsec
= function_section (current_function_decl
);
968 switch_to_section (fnsec
);
969 ASM_OUTPUT_DEBUG_LABEL (asm_out_file
, "LASANPC",
970 current_function_funcdef_no
);
973 /* Insert code to protect stack vars. The prologue sequence should be emitted
974 directly, epilogue sequence returned. BASE is the register holding the
975 stack base, against which OFFSETS array offsets are relative to, OFFSETS
976 array contains pairs of offsets in reverse order, always the end offset
977 of some gap that needs protection followed by starting offset,
978 and DECLS is an array of representative decls for each var partition.
979 LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
980 elements long (OFFSETS include gap before the first variable as well
981 as gaps after each stack variable). PBASE is, if non-NULL, some pseudo
982 register which stack vars DECL_RTLs are based on. Either BASE should be
983 assigned to PBASE, when not doing use after return protection, or
984 corresponding address based on __asan_stack_malloc* return value. */
987 asan_emit_stack_protection (rtx base
, rtx pbase
, unsigned int alignb
,
988 HOST_WIDE_INT
*offsets
, tree
*decls
, int length
)
990 rtx shadow_base
, shadow_mem
, ret
, mem
, orig_base
;
994 unsigned char shadow_bytes
[4];
995 HOST_WIDE_INT base_offset
= offsets
[length
- 1];
996 HOST_WIDE_INT base_align_bias
= 0, offset
, prev_offset
;
997 HOST_WIDE_INT asan_frame_size
= offsets
[0] - base_offset
;
998 HOST_WIDE_INT last_offset
, last_size
;
1000 unsigned char cur_shadow_byte
= ASAN_STACK_MAGIC_LEFT
;
1001 tree str_cst
, decl
, id
;
1002 int use_after_return_class
= -1;
1004 if (shadow_ptr_types
[0] == NULL_TREE
)
1005 asan_init_shadow_ptr_types ();
1007 /* First of all, prepare the description string. */
1008 pretty_printer asan_pp
;
1010 pp_decimal_int (&asan_pp
, length
/ 2 - 1);
1011 pp_space (&asan_pp
);
1012 for (l
= length
- 2; l
; l
-= 2)
1014 tree decl
= decls
[l
/ 2 - 1];
1015 pp_wide_integer (&asan_pp
, offsets
[l
] - base_offset
);
1016 pp_space (&asan_pp
);
1017 pp_wide_integer (&asan_pp
, offsets
[l
- 1] - offsets
[l
]);
1018 pp_space (&asan_pp
);
1019 if (DECL_P (decl
) && DECL_NAME (decl
))
1021 pp_decimal_int (&asan_pp
, IDENTIFIER_LENGTH (DECL_NAME (decl
)));
1022 pp_space (&asan_pp
);
1023 pp_tree_identifier (&asan_pp
, DECL_NAME (decl
));
1026 pp_string (&asan_pp
, "9 <unknown>");
1027 pp_space (&asan_pp
);
1029 str_cst
= asan_pp_string (&asan_pp
);
1031 /* Emit the prologue sequence. */
1032 if (asan_frame_size
> 32 && asan_frame_size
<= 65536 && pbase
1033 && ASAN_USE_AFTER_RETURN
)
1035 use_after_return_class
= floor_log2 (asan_frame_size
- 1) - 5;
1036 /* __asan_stack_malloc_N guarantees alignment
1037 N < 6 ? (64 << N) : 4096 bytes. */
1038 if (alignb
> (use_after_return_class
< 6
1039 ? (64U << use_after_return_class
) : 4096U))
1040 use_after_return_class
= -1;
1041 else if (alignb
> ASAN_RED_ZONE_SIZE
&& (asan_frame_size
& (alignb
- 1)))
1042 base_align_bias
= ((asan_frame_size
+ alignb
- 1)
1043 & ~(alignb
- HOST_WIDE_INT_1
)) - asan_frame_size
;
1045 /* Align base if target is STRICT_ALIGNMENT. */
1046 if (STRICT_ALIGNMENT
)
1047 base
= expand_binop (Pmode
, and_optab
, base
,
1048 gen_int_mode (-((GET_MODE_ALIGNMENT (SImode
)
1049 << ASAN_SHADOW_SHIFT
)
1050 / BITS_PER_UNIT
), Pmode
), NULL_RTX
,
1053 if (use_after_return_class
== -1 && pbase
)
1054 emit_move_insn (pbase
, base
);
1056 base
= expand_binop (Pmode
, add_optab
, base
,
1057 gen_int_mode (base_offset
- base_align_bias
, Pmode
),
1058 NULL_RTX
, 1, OPTAB_DIRECT
);
1059 orig_base
= NULL_RTX
;
1060 if (use_after_return_class
!= -1)
1062 if (asan_detect_stack_use_after_return
== NULL_TREE
)
1064 id
= get_identifier ("__asan_option_detect_stack_use_after_return");
1065 decl
= build_decl (BUILTINS_LOCATION
, VAR_DECL
, id
,
1067 SET_DECL_ASSEMBLER_NAME (decl
, id
);
1068 TREE_ADDRESSABLE (decl
) = 1;
1069 DECL_ARTIFICIAL (decl
) = 1;
1070 DECL_IGNORED_P (decl
) = 1;
1071 DECL_EXTERNAL (decl
) = 1;
1072 TREE_STATIC (decl
) = 1;
1073 TREE_PUBLIC (decl
) = 1;
1074 TREE_USED (decl
) = 1;
1075 asan_detect_stack_use_after_return
= decl
;
1077 orig_base
= gen_reg_rtx (Pmode
);
1078 emit_move_insn (orig_base
, base
);
1079 ret
= expand_normal (asan_detect_stack_use_after_return
);
1080 lab
= gen_label_rtx ();
1081 int very_likely
= REG_BR_PROB_BASE
- (REG_BR_PROB_BASE
/ 2000 - 1);
1082 emit_cmp_and_jump_insns (ret
, const0_rtx
, EQ
, NULL_RTX
,
1083 VOIDmode
, 0, lab
, very_likely
);
1084 snprintf (buf
, sizeof buf
, "__asan_stack_malloc_%d",
1085 use_after_return_class
);
1086 ret
= init_one_libfunc (buf
);
1087 rtx addr
= convert_memory_address (ptr_mode
, base
);
1088 ret
= emit_library_call_value (ret
, NULL_RTX
, LCT_NORMAL
, ptr_mode
, 2,
1089 GEN_INT (asan_frame_size
1091 TYPE_MODE (pointer_sized_int_node
),
1093 ret
= convert_memory_address (Pmode
, ret
);
1094 emit_move_insn (base
, ret
);
1096 emit_move_insn (pbase
, expand_binop (Pmode
, add_optab
, base
,
1097 gen_int_mode (base_align_bias
1098 - base_offset
, Pmode
),
1099 NULL_RTX
, 1, OPTAB_DIRECT
));
1101 mem
= gen_rtx_MEM (ptr_mode
, base
);
1102 mem
= adjust_address (mem
, VOIDmode
, base_align_bias
);
1103 emit_move_insn (mem
, gen_int_mode (ASAN_STACK_FRAME_MAGIC
, ptr_mode
));
1104 mem
= adjust_address (mem
, VOIDmode
, GET_MODE_SIZE (ptr_mode
));
1105 emit_move_insn (mem
, expand_normal (str_cst
));
1106 mem
= adjust_address (mem
, VOIDmode
, GET_MODE_SIZE (ptr_mode
));
1107 ASM_GENERATE_INTERNAL_LABEL (buf
, "LASANPC", current_function_funcdef_no
);
1108 id
= get_identifier (buf
);
1109 decl
= build_decl (DECL_SOURCE_LOCATION (current_function_decl
),
1110 VAR_DECL
, id
, char_type_node
);
1111 SET_DECL_ASSEMBLER_NAME (decl
, id
);
1112 TREE_ADDRESSABLE (decl
) = 1;
1113 TREE_READONLY (decl
) = 1;
1114 DECL_ARTIFICIAL (decl
) = 1;
1115 DECL_IGNORED_P (decl
) = 1;
1116 TREE_STATIC (decl
) = 1;
1117 TREE_PUBLIC (decl
) = 0;
1118 TREE_USED (decl
) = 1;
1119 DECL_INITIAL (decl
) = decl
;
1120 TREE_ASM_WRITTEN (decl
) = 1;
1121 TREE_ASM_WRITTEN (id
) = 1;
1122 emit_move_insn (mem
, expand_normal (build_fold_addr_expr (decl
)));
1123 shadow_base
= expand_binop (Pmode
, lshr_optab
, base
,
1124 GEN_INT (ASAN_SHADOW_SHIFT
),
1125 NULL_RTX
, 1, OPTAB_DIRECT
);
1127 = plus_constant (Pmode
, shadow_base
,
1128 targetm
.asan_shadow_offset ()
1129 + (base_align_bias
>> ASAN_SHADOW_SHIFT
));
1130 gcc_assert (asan_shadow_set
!= -1
1131 && (ASAN_RED_ZONE_SIZE
>> ASAN_SHADOW_SHIFT
) == 4);
1132 shadow_mem
= gen_rtx_MEM (SImode
, shadow_base
);
1133 set_mem_alias_set (shadow_mem
, asan_shadow_set
);
1134 if (STRICT_ALIGNMENT
)
1135 set_mem_align (shadow_mem
, (GET_MODE_ALIGNMENT (SImode
)));
1136 prev_offset
= base_offset
;
1137 for (l
= length
; l
; l
-= 2)
1140 cur_shadow_byte
= ASAN_STACK_MAGIC_RIGHT
;
1141 offset
= offsets
[l
- 1];
1142 if ((offset
- base_offset
) & (ASAN_RED_ZONE_SIZE
- 1))
1146 = base_offset
+ ((offset
- base_offset
)
1147 & ~(ASAN_RED_ZONE_SIZE
- HOST_WIDE_INT_1
));
1148 shadow_mem
= adjust_address (shadow_mem
, VOIDmode
,
1149 (aoff
- prev_offset
)
1150 >> ASAN_SHADOW_SHIFT
);
1152 for (i
= 0; i
< 4; i
++, aoff
+= (1 << ASAN_SHADOW_SHIFT
))
1155 if (aoff
< offset
- (1 << ASAN_SHADOW_SHIFT
) + 1)
1156 shadow_bytes
[i
] = 0;
1158 shadow_bytes
[i
] = offset
- aoff
;
1161 shadow_bytes
[i
] = ASAN_STACK_MAGIC_PARTIAL
;
1162 emit_move_insn (shadow_mem
, asan_shadow_cst (shadow_bytes
));
1165 while (offset
<= offsets
[l
- 2] - ASAN_RED_ZONE_SIZE
)
1167 shadow_mem
= adjust_address (shadow_mem
, VOIDmode
,
1168 (offset
- prev_offset
)
1169 >> ASAN_SHADOW_SHIFT
);
1170 prev_offset
= offset
;
1171 memset (shadow_bytes
, cur_shadow_byte
, 4);
1172 emit_move_insn (shadow_mem
, asan_shadow_cst (shadow_bytes
));
1173 offset
+= ASAN_RED_ZONE_SIZE
;
1175 cur_shadow_byte
= ASAN_STACK_MAGIC_MIDDLE
;
1177 do_pending_stack_adjust ();
1179 /* Construct epilogue sequence. */
1183 if (use_after_return_class
!= -1)
1185 rtx_code_label
*lab2
= gen_label_rtx ();
1186 char c
= (char) ASAN_STACK_MAGIC_USE_AFTER_RET
;
1187 int very_likely
= REG_BR_PROB_BASE
- (REG_BR_PROB_BASE
/ 2000 - 1);
1188 emit_cmp_and_jump_insns (orig_base
, base
, EQ
, NULL_RTX
,
1189 VOIDmode
, 0, lab2
, very_likely
);
1190 shadow_mem
= gen_rtx_MEM (BLKmode
, shadow_base
);
1191 set_mem_alias_set (shadow_mem
, asan_shadow_set
);
1192 mem
= gen_rtx_MEM (ptr_mode
, base
);
1193 mem
= adjust_address (mem
, VOIDmode
, base_align_bias
);
1194 emit_move_insn (mem
, gen_int_mode (ASAN_STACK_RETIRED_MAGIC
, ptr_mode
));
1195 unsigned HOST_WIDE_INT sz
= asan_frame_size
>> ASAN_SHADOW_SHIFT
;
1196 if (use_after_return_class
< 5
1197 && can_store_by_pieces (sz
, builtin_memset_read_str
, &c
,
1198 BITS_PER_UNIT
, true))
1199 store_by_pieces (shadow_mem
, sz
, builtin_memset_read_str
, &c
,
1200 BITS_PER_UNIT
, true, 0);
1201 else if (use_after_return_class
>= 5
1202 || !set_storage_via_setmem (shadow_mem
,
1204 gen_int_mode (c
, QImode
),
1205 BITS_PER_UNIT
, BITS_PER_UNIT
,
1208 snprintf (buf
, sizeof buf
, "__asan_stack_free_%d",
1209 use_after_return_class
);
1210 ret
= init_one_libfunc (buf
);
1211 rtx addr
= convert_memory_address (ptr_mode
, base
);
1212 rtx orig_addr
= convert_memory_address (ptr_mode
, orig_base
);
1213 emit_library_call (ret
, LCT_NORMAL
, ptr_mode
, 3, addr
, ptr_mode
,
1214 GEN_INT (asan_frame_size
+ base_align_bias
),
1215 TYPE_MODE (pointer_sized_int_node
),
1216 orig_addr
, ptr_mode
);
1218 lab
= gen_label_rtx ();
1223 shadow_mem
= gen_rtx_MEM (BLKmode
, shadow_base
);
1224 set_mem_alias_set (shadow_mem
, asan_shadow_set
);
1226 if (STRICT_ALIGNMENT
)
1227 set_mem_align (shadow_mem
, (GET_MODE_ALIGNMENT (SImode
)));
1229 prev_offset
= base_offset
;
1230 last_offset
= base_offset
;
1232 for (l
= length
; l
; l
-= 2)
1234 offset
= base_offset
+ ((offsets
[l
- 1] - base_offset
)
1235 & ~(ASAN_RED_ZONE_SIZE
- HOST_WIDE_INT_1
));
1236 if (last_offset
+ last_size
!= offset
)
1238 shadow_mem
= adjust_address (shadow_mem
, VOIDmode
,
1239 (last_offset
- prev_offset
)
1240 >> ASAN_SHADOW_SHIFT
);
1241 prev_offset
= last_offset
;
1242 asan_clear_shadow (shadow_mem
, last_size
>> ASAN_SHADOW_SHIFT
);
1243 last_offset
= offset
;
1246 last_size
+= base_offset
+ ((offsets
[l
- 2] - base_offset
)
1247 & ~(ASAN_RED_ZONE_SIZE
- HOST_WIDE_INT_1
))
1252 shadow_mem
= adjust_address (shadow_mem
, VOIDmode
,
1253 (last_offset
- prev_offset
)
1254 >> ASAN_SHADOW_SHIFT
);
1255 asan_clear_shadow (shadow_mem
, last_size
>> ASAN_SHADOW_SHIFT
);
1258 do_pending_stack_adjust ();
1262 insns
= get_insns ();
1267 /* Return true if DECL, a global var, might be overridden and needs
1268 therefore a local alias. */
1271 asan_needs_local_alias (tree decl
)
1273 return DECL_WEAK (decl
) || !targetm
.binds_local_p (decl
);
1276 /* Return true if DECL is a VAR_DECL that should be protected
1277 by Address Sanitizer, by appending a red zone with protected
1278 shadow memory after it and aligning it to at least
1279 ASAN_RED_ZONE_SIZE bytes. */
1282 asan_protect_global (tree decl
)
1289 if (TREE_CODE (decl
) == STRING_CST
)
1291 /* Instrument all STRING_CSTs except those created
1292 by asan_pp_string here. */
1293 if (shadow_ptr_types
[0] != NULL_TREE
1294 && TREE_CODE (TREE_TYPE (decl
)) == ARRAY_TYPE
1295 && TREE_TYPE (TREE_TYPE (decl
)) == TREE_TYPE (shadow_ptr_types
[0]))
1299 if (TREE_CODE (decl
) != VAR_DECL
1300 /* TLS vars aren't statically protectable. */
1301 || DECL_THREAD_LOCAL_P (decl
)
1302 /* Externs will be protected elsewhere. */
1303 || DECL_EXTERNAL (decl
)
1304 || !DECL_RTL_SET_P (decl
)
1305 /* Comdat vars pose an ABI problem, we can't know if
1306 the var that is selected by the linker will have
1308 || DECL_ONE_ONLY (decl
)
1309 /* Similarly for common vars. People can use -fno-common. */
1310 || (DECL_COMMON (decl
) && TREE_PUBLIC (decl
))
1311 /* Don't protect if using user section, often vars placed
1312 into user section from multiple TUs are then assumed
1313 to be an array of such vars, putting padding in there
1314 breaks this assumption. */
1315 || (DECL_SECTION_NAME (decl
) != NULL
1316 && !symtab_node::get (decl
)->implicit_section
)
1317 || DECL_SIZE (decl
) == 0
1318 || ASAN_RED_ZONE_SIZE
* BITS_PER_UNIT
> MAX_OFILE_ALIGNMENT
1319 || !valid_constant_size_p (DECL_SIZE_UNIT (decl
))
1320 || DECL_ALIGN_UNIT (decl
) > 2 * ASAN_RED_ZONE_SIZE
1321 || TREE_TYPE (decl
) == ubsan_get_source_location_type ())
1324 rtl
= DECL_RTL (decl
);
1325 if (!MEM_P (rtl
) || GET_CODE (XEXP (rtl
, 0)) != SYMBOL_REF
)
1327 symbol
= XEXP (rtl
, 0);
1329 if (CONSTANT_POOL_ADDRESS_P (symbol
)
1330 || TREE_CONSTANT_POOL_ADDRESS_P (symbol
))
1333 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl
)))
1336 #ifndef ASM_OUTPUT_DEF
1337 if (asan_needs_local_alias (decl
))
1344 /* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16,_n}.
1345 IS_STORE is either 1 (for a store) or 0 (for a load). */
1348 report_error_func (bool is_store
, HOST_WIDE_INT size_in_bytes
, int *nargs
)
1350 static enum built_in_function report
[2][6]
1351 = { { BUILT_IN_ASAN_REPORT_LOAD1
, BUILT_IN_ASAN_REPORT_LOAD2
,
1352 BUILT_IN_ASAN_REPORT_LOAD4
, BUILT_IN_ASAN_REPORT_LOAD8
,
1353 BUILT_IN_ASAN_REPORT_LOAD16
, BUILT_IN_ASAN_REPORT_LOAD_N
},
1354 { BUILT_IN_ASAN_REPORT_STORE1
, BUILT_IN_ASAN_REPORT_STORE2
,
1355 BUILT_IN_ASAN_REPORT_STORE4
, BUILT_IN_ASAN_REPORT_STORE8
,
1356 BUILT_IN_ASAN_REPORT_STORE16
, BUILT_IN_ASAN_REPORT_STORE_N
} };
1357 if (size_in_bytes
== -1)
1360 return builtin_decl_implicit (report
[is_store
][5]);
1363 return builtin_decl_implicit (report
[is_store
][exact_log2 (size_in_bytes
)]);
1366 /* Construct a function tree for __asan_{load,store}{1,2,4,8,16,_n}.
1367 IS_STORE is either 1 (for a store) or 0 (for a load). */
1370 check_func (bool is_store
, int size_in_bytes
, int *nargs
)
1372 static enum built_in_function check
[2][6]
1373 = { { BUILT_IN_ASAN_LOAD1
, BUILT_IN_ASAN_LOAD2
,
1374 BUILT_IN_ASAN_LOAD4
, BUILT_IN_ASAN_LOAD8
,
1375 BUILT_IN_ASAN_LOAD16
, BUILT_IN_ASAN_LOADN
},
1376 { BUILT_IN_ASAN_STORE1
, BUILT_IN_ASAN_STORE2
,
1377 BUILT_IN_ASAN_STORE4
, BUILT_IN_ASAN_STORE8
,
1378 BUILT_IN_ASAN_STORE16
, BUILT_IN_ASAN_STOREN
} };
1379 if (size_in_bytes
== -1)
1382 return builtin_decl_implicit (check
[is_store
][5]);
1385 return builtin_decl_implicit (check
[is_store
][exact_log2 (size_in_bytes
)]);
1388 /* Split the current basic block and create a condition statement
1389 insertion point right before or after the statement pointed to by
1390 ITER. Return an iterator to the point at which the caller might
1391 safely insert the condition statement.
1393 THEN_BLOCK must be set to the address of an uninitialized instance
1394 of basic_block. The function will then set *THEN_BLOCK to the
1395 'then block' of the condition statement to be inserted by the
1398 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
1399 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
1401 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
1402 block' of the condition statement to be inserted by the caller.
1404 Note that *FALLTHROUGH_BLOCK is a new block that contains the
1405 statements starting from *ITER, and *THEN_BLOCK is a new empty
1408 *ITER is adjusted to point to always point to the first statement
1409 of the basic block * FALLTHROUGH_BLOCK. That statement is the
1410 same as what ITER was pointing to prior to calling this function,
1411 if BEFORE_P is true; otherwise, it is its following statement. */
1413 gimple_stmt_iterator
1414 create_cond_insert_point (gimple_stmt_iterator
*iter
,
1416 bool then_more_likely_p
,
1417 bool create_then_fallthru_edge
,
1418 basic_block
*then_block
,
1419 basic_block
*fallthrough_block
)
1421 gimple_stmt_iterator gsi
= *iter
;
1423 if (!gsi_end_p (gsi
) && before_p
)
1426 basic_block cur_bb
= gsi_bb (*iter
);
1428 edge e
= split_block (cur_bb
, gsi_stmt (gsi
));
1430 /* Get a hold on the 'condition block', the 'then block' and the
1432 basic_block cond_bb
= e
->src
;
1433 basic_block fallthru_bb
= e
->dest
;
1434 basic_block then_bb
= create_empty_bb (cond_bb
);
1437 add_bb_to_loop (then_bb
, cond_bb
->loop_father
);
1438 loops_state_set (LOOPS_NEED_FIXUP
);
1441 /* Set up the newly created 'then block'. */
1442 e
= make_edge (cond_bb
, then_bb
, EDGE_TRUE_VALUE
);
1443 int fallthrough_probability
1444 = then_more_likely_p
1445 ? PROB_VERY_UNLIKELY
1446 : PROB_ALWAYS
- PROB_VERY_UNLIKELY
;
1447 e
->probability
= PROB_ALWAYS
- fallthrough_probability
;
1448 if (create_then_fallthru_edge
)
1449 make_single_succ_edge (then_bb
, fallthru_bb
, EDGE_FALLTHRU
);
1451 /* Set up the fallthrough basic block. */
1452 e
= find_edge (cond_bb
, fallthru_bb
);
1453 e
->flags
= EDGE_FALSE_VALUE
;
1454 e
->count
= cond_bb
->count
;
1455 e
->probability
= fallthrough_probability
;
1457 /* Update dominance info for the newly created then_bb; note that
1458 fallthru_bb's dominance info has already been updated by
1460 if (dom_info_available_p (CDI_DOMINATORS
))
1461 set_immediate_dominator (CDI_DOMINATORS
, then_bb
, cond_bb
);
1463 *then_block
= then_bb
;
1464 *fallthrough_block
= fallthru_bb
;
1465 *iter
= gsi_start_bb (fallthru_bb
);
1467 return gsi_last_bb (cond_bb
);
1470 /* Insert an if condition followed by a 'then block' right before the
1471 statement pointed to by ITER. The fallthrough block -- which is the
1472 else block of the condition as well as the destination of the
1473 outcoming edge of the 'then block' -- starts with the statement
1476 COND is the condition of the if.
1478 If THEN_MORE_LIKELY_P is true, the probability of the edge to the
1479 'then block' is higher than the probability of the edge to the
1482 Upon completion of the function, *THEN_BB is set to the newly
1483 inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
1486 *ITER is adjusted to still point to the same statement it was
1487 pointing to initially. */
1490 insert_if_then_before_iter (gimple cond
,
1491 gimple_stmt_iterator
*iter
,
1492 bool then_more_likely_p
,
1493 basic_block
*then_bb
,
1494 basic_block
*fallthrough_bb
)
1496 gimple_stmt_iterator cond_insert_point
=
1497 create_cond_insert_point (iter
,
1500 /*create_then_fallthru_edge=*/true,
1503 gsi_insert_after (&cond_insert_point
, cond
, GSI_NEW_STMT
);
1507 (base_addr >> ASAN_SHADOW_SHIFT) + targetm.asan_shadow_offset (). */
1510 build_shadow_mem_access (gimple_stmt_iterator
*gsi
, location_t location
,
1511 tree base_addr
, tree shadow_ptr_type
)
1513 tree t
, uintptr_type
= TREE_TYPE (base_addr
);
1514 tree shadow_type
= TREE_TYPE (shadow_ptr_type
);
1517 t
= build_int_cst (uintptr_type
, ASAN_SHADOW_SHIFT
);
1518 g
= gimple_build_assign_with_ops (RSHIFT_EXPR
,
1519 make_ssa_name (uintptr_type
, NULL
),
1521 gimple_set_location (g
, location
);
1522 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
1524 t
= build_int_cst (uintptr_type
, targetm
.asan_shadow_offset ());
1525 g
= gimple_build_assign_with_ops (PLUS_EXPR
,
1526 make_ssa_name (uintptr_type
, NULL
),
1527 gimple_assign_lhs (g
), t
);
1528 gimple_set_location (g
, location
);
1529 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
1531 g
= gimple_build_assign_with_ops (NOP_EXPR
,
1532 make_ssa_name (shadow_ptr_type
, NULL
),
1533 gimple_assign_lhs (g
), NULL_TREE
);
1534 gimple_set_location (g
, location
);
1535 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
1537 t
= build2 (MEM_REF
, shadow_type
, gimple_assign_lhs (g
),
1538 build_int_cst (shadow_ptr_type
, 0));
1539 g
= gimple_build_assign_with_ops (MEM_REF
,
1540 make_ssa_name (shadow_type
, NULL
),
1542 gimple_set_location (g
, location
);
1543 gsi_insert_after (gsi
, g
, GSI_NEW_STMT
);
1544 return gimple_assign_lhs (g
);
1547 /* BASE can already be an SSA_NAME; in that case, do not create a
1548 new SSA_NAME for it. */
1551 maybe_create_ssa_name (location_t loc
, tree base
, gimple_stmt_iterator
*iter
,
1554 if (TREE_CODE (base
) == SSA_NAME
)
1557 = gimple_build_assign_with_ops (TREE_CODE (base
),
1558 make_ssa_name (TREE_TYPE (base
), NULL
),
1560 gimple_set_location (g
, loc
);
1562 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
1564 gsi_insert_after (iter
, g
, GSI_NEW_STMT
);
1565 return gimple_assign_lhs (g
);
1568 /* LEN can already have necessary size and precision;
1569 in that case, do not create a new variable. */
1572 maybe_cast_to_ptrmode (location_t loc
, tree len
, gimple_stmt_iterator
*iter
,
1575 if (ptrofftype_p (len
))
1578 = gimple_build_assign_with_ops (NOP_EXPR
,
1579 make_ssa_name (pointer_sized_int_node
, NULL
),
1581 gimple_set_location (g
, loc
);
1583 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
1585 gsi_insert_after (iter
, g
, GSI_NEW_STMT
);
1586 return gimple_assign_lhs (g
);
1589 /* Instrument the memory access instruction BASE. Insert new
1590 statements before or after ITER.
1592 Note that the memory access represented by BASE can be either an
1593 SSA_NAME, or a non-SSA expression. LOCATION is the source code
1594 location. IS_STORE is TRUE for a store, FALSE for a load.
1595 BEFORE_P is TRUE for inserting the instrumentation code before
1596 ITER, FALSE for inserting it after ITER. IS_SCALAR_ACCESS is TRUE
1597 for a scalar memory access and FALSE for memory region access.
1598 NON_ZERO_P is TRUE if memory region is guaranteed to have non-zero
1599 length. ALIGN tells alignment of accessed memory object.
1601 START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
1602 memory region have already been instrumented.
1604 If BEFORE_P is TRUE, *ITER is arranged to still point to the
1605 statement it was pointing to prior to calling this function,
1606 otherwise, it points to the statement logically following it. */
1609 build_check_stmt (location_t loc
, tree base
, tree len
,
1610 HOST_WIDE_INT size_in_bytes
, gimple_stmt_iterator
*iter
,
1611 bool is_non_zero_len
, bool before_p
, bool is_store
,
1612 bool is_scalar_access
, unsigned int align
= 0,
1613 bool start_instrumented
= false,
1614 bool end_instrumented
= false)
1616 gimple_stmt_iterator gsi
= *iter
;
1619 gcc_assert (!(size_in_bytes
> 0 && !is_non_zero_len
));
1621 if (start_instrumented
&& end_instrumented
)
1630 base
= unshare_expr (base
);
1631 base
= maybe_create_ssa_name (loc
, base
, &gsi
, before_p
);
1635 len
= unshare_expr (len
);
1636 len
= maybe_cast_to_ptrmode (loc
, len
, iter
, before_p
);
1640 gcc_assert (size_in_bytes
!= -1);
1641 len
= build_int_cst (pointer_sized_int_node
, size_in_bytes
);
1644 if (size_in_bytes
> 1)
1646 if ((size_in_bytes
& (size_in_bytes
- 1)) != 0
1647 || size_in_bytes
> 16)
1648 is_scalar_access
= false;
1649 else if (align
&& align
< size_in_bytes
* BITS_PER_UNIT
)
1651 /* On non-strict alignment targets, if
1652 16-byte access is just 8-byte aligned,
1653 this will result in misaligned shadow
1654 memory 2 byte load, but otherwise can
1655 be handled using one read. */
1656 if (size_in_bytes
!= 16
1658 || align
< 8 * BITS_PER_UNIT
)
1659 is_scalar_access
= false;
1663 HOST_WIDE_INT flags
= 0;
1665 flags
|= ASAN_CHECK_STORE
;
1666 if (is_non_zero_len
)
1667 flags
|= ASAN_CHECK_NON_ZERO_LEN
;
1668 if (is_scalar_access
)
1669 flags
|= ASAN_CHECK_SCALAR_ACCESS
;
1670 if (start_instrumented
)
1671 flags
|= ASAN_CHECK_START_INSTRUMENTED
;
1672 if (end_instrumented
)
1673 flags
|= ASAN_CHECK_END_INSTRUMENTED
;
1675 g
= gimple_build_call_internal (IFN_ASAN_CHECK
, 4,
1676 build_int_cst (integer_type_node
, flags
),
1678 build_int_cst (integer_type_node
,
1679 align
/ BITS_PER_UNIT
));
1680 gimple_set_location (g
, loc
);
1682 gsi_insert_before (&gsi
, g
, GSI_SAME_STMT
);
1685 gsi_insert_after (&gsi
, g
, GSI_NEW_STMT
);
1691 /* If T represents a memory access, add instrumentation code before ITER.
1692 LOCATION is source code location.
1693 IS_STORE is either TRUE (for a store) or FALSE (for a load). */
1696 instrument_derefs (gimple_stmt_iterator
*iter
, tree t
,
1697 location_t location
, bool is_store
)
1699 if (is_store
&& !ASAN_INSTRUMENT_WRITES
)
1701 if (!is_store
&& !ASAN_INSTRUMENT_READS
)
1705 HOST_WIDE_INT size_in_bytes
;
1707 type
= TREE_TYPE (t
);
1708 switch (TREE_CODE (t
))
1722 size_in_bytes
= int_size_in_bytes (type
);
1723 if (size_in_bytes
<= 0)
1726 HOST_WIDE_INT bitsize
, bitpos
;
1728 enum machine_mode mode
;
1729 int volatilep
= 0, unsignedp
= 0;
1730 tree inner
= get_inner_reference (t
, &bitsize
, &bitpos
, &offset
,
1731 &mode
, &unsignedp
, &volatilep
, false);
1733 if (TREE_CODE (t
) == COMPONENT_REF
1734 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t
, 1)) != NULL_TREE
)
1736 tree repr
= DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t
, 1));
1737 instrument_derefs (iter
, build3 (COMPONENT_REF
, TREE_TYPE (repr
),
1738 TREE_OPERAND (t
, 0), repr
,
1739 NULL_TREE
), location
, is_store
);
1743 if (bitpos
% BITS_PER_UNIT
1744 || bitsize
!= size_in_bytes
* BITS_PER_UNIT
)
1747 if (TREE_CODE (inner
) == VAR_DECL
1748 && offset
== NULL_TREE
1750 && DECL_SIZE (inner
)
1751 && tree_fits_shwi_p (DECL_SIZE (inner
))
1752 && bitpos
+ bitsize
<= tree_to_shwi (DECL_SIZE (inner
)))
1754 if (DECL_THREAD_LOCAL_P (inner
))
1756 if (!TREE_STATIC (inner
))
1758 /* Automatic vars in the current function will be always
1760 if (decl_function_context (inner
) == current_function_decl
)
1763 /* Always instrument external vars, they might be dynamically
1765 else if (!DECL_EXTERNAL (inner
))
1767 /* For static vars if they are known not to be dynamically
1768 initialized, they will be always accessible. */
1769 varpool_node
*vnode
= varpool_node::get (inner
);
1770 if (vnode
&& !vnode
->dynamically_initialized
)
1775 base
= build_fold_addr_expr (t
);
1776 if (!has_mem_ref_been_instrumented (base
, size_in_bytes
))
1778 unsigned int align
= get_object_alignment (t
);
1779 build_check_stmt (location
, base
, NULL_TREE
, size_in_bytes
, iter
,
1780 /*is_non_zero_len*/size_in_bytes
> 0, /*before_p=*/true,
1781 is_store
, /*is_scalar_access*/true, align
);
1782 update_mem_ref_hash_table (base
, size_in_bytes
);
1783 update_mem_ref_hash_table (t
, size_in_bytes
);
1788 /* Instrument an access to a contiguous memory region that starts at
1789 the address pointed to by BASE, over a length of LEN (expressed in
1790 the sizeof (*BASE) bytes). ITER points to the instruction before
1791 which the instrumentation instructions must be inserted. LOCATION
1792 is the source location that the instrumentation instructions must
1793 have. If IS_STORE is true, then the memory access is a store;
1794 otherwise, it's a load. */
1797 instrument_mem_region_access (tree base
, tree len
,
1798 gimple_stmt_iterator
*iter
,
1799 location_t location
, bool is_store
)
1801 if (!POINTER_TYPE_P (TREE_TYPE (base
))
1802 || !INTEGRAL_TYPE_P (TREE_TYPE (len
))
1803 || integer_zerop (len
))
1806 /* If the beginning of the memory region has already been
1807 instrumented, do not instrument it. */
1808 bool start_instrumented
= has_mem_ref_been_instrumented (base
, 1);
1810 /* If the end of the memory region has already been instrumented, do
1811 not instrument it. */
1812 tree end
= asan_mem_ref_get_end (base
, len
);
1813 bool end_instrumented
= has_mem_ref_been_instrumented (end
, 1);
1815 HOST_WIDE_INT size_in_bytes
= tree_fits_shwi_p (len
) ? tree_to_shwi (len
) : -1;
1817 build_check_stmt (location
, base
, len
, size_in_bytes
, iter
,
1818 /*is_non_zero_len*/size_in_bytes
> 0, /*before_p*/true,
1819 is_store
, /*is_scalar_access*/false, /*align*/0,
1820 start_instrumented
, end_instrumented
);
1822 update_mem_ref_hash_table (base
, 1);
1823 if (size_in_bytes
!= -1)
1824 update_mem_ref_hash_table (end
, 1);
1826 *iter
= gsi_for_stmt (gsi_stmt (*iter
));
1829 /* Instrument the call (to the builtin strlen function) pointed to by
1832 This function instruments the access to the first byte of the
1833 argument, right before the call. After the call it instruments the
1834 access to the last byte of the argument; it uses the result of the
1835 call to deduce the offset of that last byte.
1837 Upon completion, iff the call has actually been instrumented, this
1838 function returns TRUE and *ITER points to the statement logically
1839 following the built-in strlen function call *ITER was initially
1840 pointing to. Otherwise, the function returns FALSE and *ITER
1841 remains unchanged. */
1844 instrument_strlen_call (gimple_stmt_iterator
*iter
)
1847 gimple call
= gsi_stmt (*iter
);
1848 gcc_assert (is_gimple_call (call
));
1850 tree callee
= gimple_call_fndecl (call
);
1851 gcc_assert (is_builtin_fn (callee
)
1852 && DECL_BUILT_IN_CLASS (callee
) == BUILT_IN_NORMAL
1853 && DECL_FUNCTION_CODE (callee
) == BUILT_IN_STRLEN
);
1855 location_t loc
= gimple_location (call
);
1857 tree len
= gimple_call_lhs (call
);
1859 /* Some passes might clear the return value of the strlen call;
1860 bail out in that case. Return FALSE as we are not advancing
1863 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (len
)));
1865 len
= maybe_cast_to_ptrmode (loc
, len
, iter
, /*before_p*/false);
1867 tree str_arg
= gimple_call_arg (call
, 0);
1868 bool start_instrumented
= has_mem_ref_been_instrumented (str_arg
, 1);
1870 tree cptr_type
= build_pointer_type (char_type_node
);
1871 g
= gimple_build_assign_with_ops (NOP_EXPR
,
1872 make_ssa_name (cptr_type
, NULL
),
1874 gimple_set_location (g
, loc
);
1875 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
1876 str_arg
= gimple_assign_lhs (g
);
1878 build_check_stmt (loc
, str_arg
, NULL_TREE
, 1, iter
,
1879 /*is_non_zero_len*/true, /*before_p=*/true,
1880 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0,
1881 start_instrumented
, start_instrumented
);
1883 g
= gimple_build_assign_with_ops (POINTER_PLUS_EXPR
,
1884 make_ssa_name (cptr_type
, NULL
),
1887 gimple_set_location (g
, loc
);
1888 gsi_insert_after (iter
, g
, GSI_NEW_STMT
);
1890 build_check_stmt (loc
, gimple_assign_lhs (g
), NULL_TREE
, 1, iter
,
1891 /*is_non_zero_len*/true, /*before_p=*/false,
1892 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0);
1897 /* Instrument the call to a built-in memory access function that is
1898 pointed to by the iterator ITER.
1900 Upon completion, return TRUE iff *ITER has been advanced to the
1901 statement following the one it was originally pointing to. */
1904 instrument_builtin_call (gimple_stmt_iterator
*iter
)
1906 if (!ASAN_MEMINTRIN
)
1909 bool iter_advanced_p
= false;
1910 gimple call
= gsi_stmt (*iter
);
1912 gcc_checking_assert (gimple_call_builtin_p (call
, BUILT_IN_NORMAL
));
1914 tree callee
= gimple_call_fndecl (call
);
1915 location_t loc
= gimple_location (call
);
1917 if (DECL_FUNCTION_CODE (callee
) == BUILT_IN_STRLEN
)
1918 iter_advanced_p
= instrument_strlen_call (iter
);
1921 asan_mem_ref src0
, src1
, dest
;
1922 asan_mem_ref_init (&src0
, NULL
, 1);
1923 asan_mem_ref_init (&src1
, NULL
, 1);
1924 asan_mem_ref_init (&dest
, NULL
, 1);
1926 tree src0_len
= NULL_TREE
, src1_len
= NULL_TREE
, dest_len
= NULL_TREE
;
1927 bool src0_is_store
= false, src1_is_store
= false,
1928 dest_is_store
= false, dest_is_deref
= false;
1930 if (get_mem_refs_of_builtin_call (call
,
1931 &src0
, &src0_len
, &src0_is_store
,
1932 &src1
, &src1_len
, &src1_is_store
,
1933 &dest
, &dest_len
, &dest_is_store
,
1938 instrument_derefs (iter
, dest
.start
, loc
, dest_is_store
);
1940 iter_advanced_p
= true;
1942 else if (src0_len
|| src1_len
|| dest_len
)
1944 if (src0
.start
!= NULL_TREE
)
1945 instrument_mem_region_access (src0
.start
, src0_len
,
1946 iter
, loc
, /*is_store=*/false);
1947 if (src1
.start
!= NULL_TREE
)
1948 instrument_mem_region_access (src1
.start
, src1_len
,
1949 iter
, loc
, /*is_store=*/false);
1950 if (dest
.start
!= NULL_TREE
)
1951 instrument_mem_region_access (dest
.start
, dest_len
,
1952 iter
, loc
, /*is_store=*/true);
1953 *iter
= gsi_for_stmt (call
);
1955 iter_advanced_p
= true;
1959 return iter_advanced_p
;
1962 /* Instrument the assignment statement ITER if it is subject to
1963 instrumentation. Return TRUE iff instrumentation actually
1964 happened. In that case, the iterator ITER is advanced to the next
1965 logical expression following the one initially pointed to by ITER,
1966 and the relevant memory reference that which access has been
1967 instrumented is added to the memory references hash table. */
1970 maybe_instrument_assignment (gimple_stmt_iterator
*iter
)
1972 gimple s
= gsi_stmt (*iter
);
1974 gcc_assert (gimple_assign_single_p (s
));
1976 tree ref_expr
= NULL_TREE
;
1977 bool is_store
, is_instrumented
= false;
1979 if (gimple_store_p (s
))
1981 ref_expr
= gimple_assign_lhs (s
);
1983 instrument_derefs (iter
, ref_expr
,
1984 gimple_location (s
),
1986 is_instrumented
= true;
1989 if (gimple_assign_load_p (s
))
1991 ref_expr
= gimple_assign_rhs1 (s
);
1993 instrument_derefs (iter
, ref_expr
,
1994 gimple_location (s
),
1996 is_instrumented
= true;
1999 if (is_instrumented
)
2002 return is_instrumented
;
2005 /* Instrument the function call pointed to by the iterator ITER, if it
2006 is subject to instrumentation. At the moment, the only function
2007 calls that are instrumented are some built-in functions that access
2008 memory. Look at instrument_builtin_call to learn more.
2010 Upon completion return TRUE iff *ITER was advanced to the statement
2011 following the one it was originally pointing to. */
2014 maybe_instrument_call (gimple_stmt_iterator
*iter
)
2016 gimple stmt
= gsi_stmt (*iter
);
2017 bool is_builtin
= gimple_call_builtin_p (stmt
, BUILT_IN_NORMAL
);
2019 if (is_builtin
&& instrument_builtin_call (iter
))
2022 if (gimple_call_noreturn_p (stmt
))
2026 tree callee
= gimple_call_fndecl (stmt
);
2027 switch (DECL_FUNCTION_CODE (callee
))
2029 case BUILT_IN_UNREACHABLE
:
2031 /* Don't instrument these. */
2037 tree decl
= builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN
);
2038 gimple g
= gimple_build_call (decl
, 0);
2039 gimple_set_location (g
, gimple_location (stmt
));
2040 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
2045 /* Walk each instruction of all basic block and instrument those that
2046 represent memory references: loads, stores, or function calls.
2047 In a given basic block, this function avoids instrumenting memory
2048 references that have already been instrumented. */
2051 transform_statements (void)
2053 basic_block bb
, last_bb
= NULL
;
2054 gimple_stmt_iterator i
;
2055 int saved_last_basic_block
= last_basic_block_for_fn (cfun
);
2057 FOR_EACH_BB_FN (bb
, cfun
)
2059 basic_block prev_bb
= bb
;
2061 if (bb
->index
>= saved_last_basic_block
) continue;
2063 /* Flush the mem ref hash table, if current bb doesn't have
2064 exactly one predecessor, or if that predecessor (skipping
2065 over asan created basic blocks) isn't the last processed
2066 basic block. Thus we effectively flush on extended basic
2067 block boundaries. */
2068 while (single_pred_p (prev_bb
))
2070 prev_bb
= single_pred (prev_bb
);
2071 if (prev_bb
->index
< saved_last_basic_block
)
2074 if (prev_bb
!= last_bb
)
2075 empty_mem_ref_hash_table ();
2078 for (i
= gsi_start_bb (bb
); !gsi_end_p (i
);)
2080 gimple s
= gsi_stmt (i
);
2082 if (has_stmt_been_instrumented_p (s
))
2084 else if (gimple_assign_single_p (s
)
2085 && !gimple_clobber_p (s
)
2086 && maybe_instrument_assignment (&i
))
2087 /* Nothing to do as maybe_instrument_assignment advanced
2089 else if (is_gimple_call (s
) && maybe_instrument_call (&i
))
2090 /* Nothing to do as maybe_instrument_call
2091 advanced the iterator I. */;
2094 /* No instrumentation happened.
2096 If the current instruction is a function call that
2097 might free something, let's forget about the memory
2098 references that got instrumented. Otherwise we might
2099 miss some instrumentation opportunities. */
2100 if (is_gimple_call (s
) && !nonfreeing_call_p (s
))
2101 empty_mem_ref_hash_table ();
2107 free_mem_ref_resources ();
2111 __asan_before_dynamic_init (module_name)
2113 __asan_after_dynamic_init ()
2117 asan_dynamic_init_call (bool after_p
)
2119 tree fn
= builtin_decl_implicit (after_p
2120 ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
2121 : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT
);
2122 tree module_name_cst
= NULL_TREE
;
2125 pretty_printer module_name_pp
;
2126 pp_string (&module_name_pp
, main_input_filename
);
2128 if (shadow_ptr_types
[0] == NULL_TREE
)
2129 asan_init_shadow_ptr_types ();
2130 module_name_cst
= asan_pp_string (&module_name_pp
);
2131 module_name_cst
= fold_convert (const_ptr_type_node
,
2135 return build_call_expr (fn
, after_p
? 0 : 1, module_name_cst
);
2139 struct __asan_global
2143 uptr __size_with_redzone;
2145 const void *__module_name;
2146 uptr __has_dynamic_init;
2147 __asan_global_source_location *__location;
2151 asan_global_struct (void)
2153 static const char *field_names
[7]
2154 = { "__beg", "__size", "__size_with_redzone",
2155 "__name", "__module_name", "__has_dynamic_init", "__location"};
2156 tree fields
[7], ret
;
2159 ret
= make_node (RECORD_TYPE
);
2160 for (i
= 0; i
< 7; i
++)
2163 = build_decl (UNKNOWN_LOCATION
, FIELD_DECL
,
2164 get_identifier (field_names
[i
]),
2165 (i
== 0 || i
== 3) ? const_ptr_type_node
2166 : pointer_sized_int_node
);
2167 DECL_CONTEXT (fields
[i
]) = ret
;
2169 DECL_CHAIN (fields
[i
- 1]) = fields
[i
];
2171 TYPE_FIELDS (ret
) = fields
[0];
2172 TYPE_NAME (ret
) = get_identifier ("__asan_global");
2177 /* Append description of a single global DECL into vector V.
2178 TYPE is __asan_global struct type as returned by asan_global_struct. */
2181 asan_add_global (tree decl
, tree type
, vec
<constructor_elt
, va_gc
> *v
)
2183 tree init
, uptr
= TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type
)));
2184 unsigned HOST_WIDE_INT size
;
2185 tree str_cst
, module_name_cst
, refdecl
= decl
;
2186 vec
<constructor_elt
, va_gc
> *vinner
= NULL
;
2188 pretty_printer asan_pp
, module_name_pp
;
2190 if (DECL_NAME (decl
))
2191 pp_tree_identifier (&asan_pp
, DECL_NAME (decl
));
2193 pp_string (&asan_pp
, "<unknown>");
2194 str_cst
= asan_pp_string (&asan_pp
);
2196 pp_string (&module_name_pp
, main_input_filename
);
2197 module_name_cst
= asan_pp_string (&module_name_pp
);
2199 if (asan_needs_local_alias (decl
))
2202 ASM_GENERATE_INTERNAL_LABEL (buf
, "LASAN", vec_safe_length (v
) + 1);
2203 refdecl
= build_decl (DECL_SOURCE_LOCATION (decl
),
2204 VAR_DECL
, get_identifier (buf
), TREE_TYPE (decl
));
2205 TREE_ADDRESSABLE (refdecl
) = TREE_ADDRESSABLE (decl
);
2206 TREE_READONLY (refdecl
) = TREE_READONLY (decl
);
2207 TREE_THIS_VOLATILE (refdecl
) = TREE_THIS_VOLATILE (decl
);
2208 DECL_GIMPLE_REG_P (refdecl
) = DECL_GIMPLE_REG_P (decl
);
2209 DECL_ARTIFICIAL (refdecl
) = DECL_ARTIFICIAL (decl
);
2210 DECL_IGNORED_P (refdecl
) = DECL_IGNORED_P (decl
);
2211 TREE_STATIC (refdecl
) = 1;
2212 TREE_PUBLIC (refdecl
) = 0;
2213 TREE_USED (refdecl
) = 1;
2214 assemble_alias (refdecl
, DECL_ASSEMBLER_NAME (decl
));
2217 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
,
2218 fold_convert (const_ptr_type_node
,
2219 build_fold_addr_expr (refdecl
)));
2220 size
= tree_to_uhwi (DECL_SIZE_UNIT (decl
));
2221 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
, build_int_cst (uptr
, size
));
2222 size
+= asan_red_zone_size (size
);
2223 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
, build_int_cst (uptr
, size
));
2224 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
,
2225 fold_convert (const_ptr_type_node
, str_cst
));
2226 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
,
2227 fold_convert (const_ptr_type_node
, module_name_cst
));
2228 varpool_node
*vnode
= varpool_node::get (decl
);
2229 int has_dynamic_init
= vnode
? vnode
->dynamically_initialized
: 0;
2230 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
,
2231 build_int_cst (uptr
, has_dynamic_init
));
2232 tree locptr
= NULL_TREE
;
2233 location_t loc
= DECL_SOURCE_LOCATION (decl
);
2234 expanded_location xloc
= expand_location (loc
);
2235 if (xloc
.file
!= NULL
)
2237 static int lasanloccnt
= 0;
2239 ASM_GENERATE_INTERNAL_LABEL (buf
, "LASANLOC", ++lasanloccnt
);
2240 tree var
= build_decl (UNKNOWN_LOCATION
, VAR_DECL
, get_identifier (buf
),
2241 ubsan_get_source_location_type ());
2242 TREE_STATIC (var
) = 1;
2243 TREE_PUBLIC (var
) = 0;
2244 DECL_ARTIFICIAL (var
) = 1;
2245 DECL_IGNORED_P (var
) = 1;
2246 pretty_printer filename_pp
;
2247 pp_string (&filename_pp
, xloc
.file
);
2248 tree str
= asan_pp_string (&filename_pp
);
2249 tree ctor
= build_constructor_va (TREE_TYPE (var
), 3,
2250 NULL_TREE
, str
, NULL_TREE
,
2251 build_int_cst (unsigned_type_node
,
2252 xloc
.line
), NULL_TREE
,
2253 build_int_cst (unsigned_type_node
,
2255 TREE_CONSTANT (ctor
) = 1;
2256 TREE_STATIC (ctor
) = 1;
2257 DECL_INITIAL (var
) = ctor
;
2258 varpool_node::finalize_decl (var
);
2259 locptr
= fold_convert (uptr
, build_fold_addr_expr (var
));
2262 locptr
= build_int_cst (uptr
, 0);
2263 CONSTRUCTOR_APPEND_ELT (vinner
, NULL_TREE
, locptr
);
2264 init
= build_constructor (type
, vinner
);
2265 CONSTRUCTOR_APPEND_ELT (v
, NULL_TREE
, init
);
2268 /* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
2270 initialize_sanitizer_builtins (void)
2274 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT
))
2277 tree BT_FN_VOID
= build_function_type_list (void_type_node
, NULL_TREE
);
2279 = build_function_type_list (void_type_node
, ptr_type_node
, NULL_TREE
);
2280 tree BT_FN_VOID_CONST_PTR
2281 = build_function_type_list (void_type_node
, const_ptr_type_node
, NULL_TREE
);
2282 tree BT_FN_VOID_PTR_PTR
2283 = build_function_type_list (void_type_node
, ptr_type_node
,
2284 ptr_type_node
, NULL_TREE
);
2285 tree BT_FN_VOID_PTR_PTR_PTR
2286 = build_function_type_list (void_type_node
, ptr_type_node
,
2287 ptr_type_node
, ptr_type_node
, NULL_TREE
);
2288 tree BT_FN_VOID_PTR_PTRMODE
2289 = build_function_type_list (void_type_node
, ptr_type_node
,
2290 pointer_sized_int_node
, NULL_TREE
);
2292 = build_function_type_list (void_type_node
, integer_type_node
, NULL_TREE
);
2293 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT
[5];
2294 tree BT_FN_IX_CONST_VPTR_INT
[5];
2295 tree BT_FN_IX_VPTR_IX_INT
[5];
2296 tree BT_FN_VOID_VPTR_IX_INT
[5];
2298 = build_pointer_type (build_qualified_type (void_type_node
,
2299 TYPE_QUAL_VOLATILE
));
2301 = build_pointer_type (build_qualified_type (void_type_node
,
2305 = lang_hooks
.types
.type_for_size (BOOL_TYPE_SIZE
, 1);
2307 for (i
= 0; i
< 5; i
++)
2309 tree ix
= build_nonstandard_integer_type (BITS_PER_UNIT
* (1 << i
), 1);
2310 BT_FN_BOOL_VPTR_PTR_IX_INT_INT
[i
]
2311 = build_function_type_list (boolt
, vptr
, ptr_type_node
, ix
,
2312 integer_type_node
, integer_type_node
,
2314 BT_FN_IX_CONST_VPTR_INT
[i
]
2315 = build_function_type_list (ix
, cvptr
, integer_type_node
, NULL_TREE
);
2316 BT_FN_IX_VPTR_IX_INT
[i
]
2317 = build_function_type_list (ix
, vptr
, ix
, integer_type_node
,
2319 BT_FN_VOID_VPTR_IX_INT
[i
]
2320 = build_function_type_list (void_type_node
, vptr
, ix
,
2321 integer_type_node
, NULL_TREE
);
2323 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
2324 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
2325 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
2326 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
2327 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
2328 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
2329 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
2330 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
2331 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
2332 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
2333 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
2334 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
2335 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
2336 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
2337 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
2338 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
2339 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
2340 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
2341 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
2342 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
2343 #undef ATTR_NOTHROW_LEAF_LIST
2344 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
2345 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
2346 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
2347 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
2348 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
2349 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
2350 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
2351 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
2352 #undef ATTR_COLD_NOTHROW_LEAF_LIST
2353 #define ATTR_COLD_NOTHROW_LEAF_LIST \
2354 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
2355 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
2356 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
2357 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
2358 #undef DEF_SANITIZER_BUILTIN
2359 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
2360 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
2361 BUILT_IN_NORMAL, NAME, NULL_TREE); \
2362 set_call_expr_flags (decl, ATTRS); \
2363 set_builtin_decl (ENUM, decl, true);
2365 #include "sanitizer.def"
2367 #undef DEF_SANITIZER_BUILTIN
2370 /* Called via htab_traverse. Count number of emitted
2371 STRING_CSTs in the constant hash table. */
2374 count_string_csts (constant_descriptor_tree
**slot
,
2375 unsigned HOST_WIDE_INT
*data
)
2377 struct constant_descriptor_tree
*desc
= *slot
;
2378 if (TREE_CODE (desc
->value
) == STRING_CST
2379 && TREE_ASM_WRITTEN (desc
->value
)
2380 && asan_protect_global (desc
->value
))
2385 /* Helper structure to pass two parameters to
2388 struct asan_add_string_csts_data
2391 vec
<constructor_elt
, va_gc
> *v
;
2394 /* Called via hash_table::traverse. Call asan_add_global
2395 on emitted STRING_CSTs from the constant hash table. */
2398 add_string_csts (constant_descriptor_tree
**slot
,
2399 asan_add_string_csts_data
*aascd
)
2401 struct constant_descriptor_tree
*desc
= *slot
;
2402 if (TREE_CODE (desc
->value
) == STRING_CST
2403 && TREE_ASM_WRITTEN (desc
->value
)
2404 && asan_protect_global (desc
->value
))
2406 asan_add_global (SYMBOL_REF_DECL (XEXP (desc
->rtl
, 0)),
2407 aascd
->type
, aascd
->v
);
2412 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
2413 invoke ggc_collect. */
2414 static GTY(()) tree asan_ctor_statements
;
2416 /* Module-level instrumentation.
2417 - Insert __asan_init_vN() into the list of CTORs.
2418 - TODO: insert redzones around globals.
2422 asan_finish_file (void)
2424 varpool_node
*vnode
;
2425 unsigned HOST_WIDE_INT gcount
= 0;
2427 if (shadow_ptr_types
[0] == NULL_TREE
)
2428 asan_init_shadow_ptr_types ();
2429 /* Avoid instrumenting code in the asan ctors/dtors.
2430 We don't need to insert padding after the description strings,
2431 nor after .LASAN* array. */
2432 flag_sanitize
&= ~SANITIZE_ADDRESS
;
2434 if (flag_sanitize
& SANITIZE_USER_ADDRESS
)
2436 tree fn
= builtin_decl_implicit (BUILT_IN_ASAN_INIT
);
2437 append_to_statement_list (build_call_expr (fn
, 0), &asan_ctor_statements
);
2439 FOR_EACH_DEFINED_VARIABLE (vnode
)
2440 if (TREE_ASM_WRITTEN (vnode
->decl
)
2441 && asan_protect_global (vnode
->decl
))
2443 hash_table
<tree_descriptor_hasher
> *const_desc_htab
= constant_pool_htab ();
2444 const_desc_htab
->traverse
<unsigned HOST_WIDE_INT
*, count_string_csts
>
2448 tree type
= asan_global_struct (), var
, ctor
;
2449 tree dtor_statements
= NULL_TREE
;
2450 vec
<constructor_elt
, va_gc
> *v
;
2453 type
= build_array_type_nelts (type
, gcount
);
2454 ASM_GENERATE_INTERNAL_LABEL (buf
, "LASAN", 0);
2455 var
= build_decl (UNKNOWN_LOCATION
, VAR_DECL
, get_identifier (buf
),
2457 TREE_STATIC (var
) = 1;
2458 TREE_PUBLIC (var
) = 0;
2459 DECL_ARTIFICIAL (var
) = 1;
2460 DECL_IGNORED_P (var
) = 1;
2461 vec_alloc (v
, gcount
);
2462 FOR_EACH_DEFINED_VARIABLE (vnode
)
2463 if (TREE_ASM_WRITTEN (vnode
->decl
)
2464 && asan_protect_global (vnode
->decl
))
2465 asan_add_global (vnode
->decl
, TREE_TYPE (type
), v
);
2466 struct asan_add_string_csts_data aascd
;
2467 aascd
.type
= TREE_TYPE (type
);
2469 const_desc_htab
->traverse
<asan_add_string_csts_data
*, add_string_csts
>
2471 ctor
= build_constructor (type
, v
);
2472 TREE_CONSTANT (ctor
) = 1;
2473 TREE_STATIC (ctor
) = 1;
2474 DECL_INITIAL (var
) = ctor
;
2475 varpool_node::finalize_decl (var
);
2477 tree fn
= builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS
);
2478 tree gcount_tree
= build_int_cst (pointer_sized_int_node
, gcount
);
2479 append_to_statement_list (build_call_expr (fn
, 2,
2480 build_fold_addr_expr (var
),
2482 &asan_ctor_statements
);
2484 fn
= builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS
);
2485 append_to_statement_list (build_call_expr (fn
, 2,
2486 build_fold_addr_expr (var
),
2489 cgraph_build_static_cdtor ('D', dtor_statements
,
2490 MAX_RESERVED_INIT_PRIORITY
- 1);
2492 if (asan_ctor_statements
)
2493 cgraph_build_static_cdtor ('I', asan_ctor_statements
,
2494 MAX_RESERVED_INIT_PRIORITY
- 1);
2495 flag_sanitize
|= SANITIZE_ADDRESS
;
2498 /* Expand the ASAN_{LOAD,STORE} builtins. */
2501 asan_expand_check_ifn (gimple_stmt_iterator
*iter
, bool use_calls
)
2503 gimple g
= gsi_stmt (*iter
);
2504 location_t loc
= gimple_location (g
);
2506 HOST_WIDE_INT flags
= tree_to_shwi (gimple_call_arg (g
, 0));
2507 gcc_assert (flags
< ASAN_CHECK_LAST
);
2508 bool is_scalar_access
= (flags
& ASAN_CHECK_SCALAR_ACCESS
) != 0;
2509 bool is_store
= (flags
& ASAN_CHECK_STORE
) != 0;
2510 bool is_non_zero_len
= (flags
& ASAN_CHECK_NON_ZERO_LEN
) != 0;
2511 bool start_instrumented
= (flags
& ASAN_CHECK_START_INSTRUMENTED
) != 0;
2512 bool end_instrumented
= (flags
& ASAN_CHECK_END_INSTRUMENTED
) != 0;
2514 tree base
= gimple_call_arg (g
, 1);
2515 tree len
= gimple_call_arg (g
, 2);
2516 HOST_WIDE_INT align
= tree_to_shwi (gimple_call_arg (g
, 3));
2518 HOST_WIDE_INT size_in_bytes
2519 = is_scalar_access
&& tree_fits_shwi_p (len
) ? tree_to_shwi (len
) : -1;
2523 /* Instrument using callbacks. */
2525 = gimple_build_assign_with_ops (NOP_EXPR
,
2526 make_ssa_name (pointer_sized_int_node
,
2529 gimple_set_location (g
, loc
);
2530 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
2531 tree base_addr
= gimple_assign_lhs (g
);
2534 tree fun
= check_func (is_store
, size_in_bytes
, &nargs
);
2536 g
= gimple_build_call (fun
, 1, base_addr
);
2539 gcc_assert (nargs
== 2);
2540 g
= gimple_build_assign_with_ops (NOP_EXPR
,
2541 make_ssa_name (pointer_sized_int_node
,
2544 gimple_set_location (g
, loc
);
2545 gsi_insert_before (iter
, g
, GSI_SAME_STMT
);
2546 tree sz_arg
= gimple_assign_lhs (g
);
2547 g
= gimple_build_call (fun
, nargs
, base_addr
, sz_arg
);
2549 gimple_set_location (g
, loc
);
2550 gsi_replace (iter
, g
, false);
2554 HOST_WIDE_INT real_size_in_bytes
= size_in_bytes
== -1 ? 1 : size_in_bytes
;
2556 tree shadow_ptr_type
= shadow_ptr_types
[real_size_in_bytes
== 16 ? 1 : 0];
2557 tree shadow_type
= TREE_TYPE (shadow_ptr_type
);
2559 gimple_stmt_iterator gsi
= *iter
;
2561 if (!is_non_zero_len
)
2563 /* So, the length of the memory area to asan-protect is
2564 non-constant. Let's guard the generated instrumentation code
2569 //asan instrumentation code goes here.
2571 // falltrough instructions, starting with *ITER. */
2573 g
= gimple_build_cond (NE_EXPR
,
2575 build_int_cst (TREE_TYPE (len
), 0),
2576 NULL_TREE
, NULL_TREE
);
2577 gimple_set_location (g
, loc
);
2579 basic_block then_bb
, fallthrough_bb
;
2580 insert_if_then_before_iter (g
, iter
, /*then_more_likely_p=*/true,
2581 &then_bb
, &fallthrough_bb
);
2582 /* Note that fallthrough_bb starts with the statement that was
2583 pointed to by ITER. */
2585 /* The 'then block' of the 'if (len != 0) condition is where
2586 we'll generate the asan instrumentation code now. */
2587 gsi
= gsi_last_bb (then_bb
);
2590 /* Get an iterator on the point where we can add the condition
2591 statement for the instrumentation. */
2592 basic_block then_bb
, else_bb
;
2593 gsi
= create_cond_insert_point (&gsi
, /*before_p*/false,
2594 /*then_more_likely_p=*/false,
2595 /*create_then_fallthru_edge=*/false,
2599 g
= gimple_build_assign_with_ops (NOP_EXPR
,
2600 make_ssa_name (pointer_sized_int_node
,
2603 gimple_set_location (g
, loc
);
2604 gsi_insert_before (&gsi
, g
, GSI_NEW_STMT
);
2605 tree base_addr
= gimple_assign_lhs (g
);
2608 if (real_size_in_bytes
>= 8)
2610 tree shadow
= build_shadow_mem_access (&gsi
, loc
, base_addr
,
2616 /* Slow path for 1, 2 and 4 byte accesses. */
2618 if (!start_instrumented
)
2620 /* Test (shadow != 0)
2621 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow). */
2622 tree shadow
= build_shadow_mem_access (&gsi
, loc
, base_addr
,
2624 gimple shadow_test
= build_assign (NE_EXPR
, shadow
, 0);
2625 gimple_seq seq
= NULL
;
2626 gimple_seq_add_stmt (&seq
, shadow_test
);
2627 /* Aligned (>= 8 bytes) can test just
2628 (real_size_in_bytes - 1 >= shadow), as base_addr & 7 is known
2632 gimple_seq_add_stmt (&seq
, build_assign (BIT_AND_EXPR
,
2634 gimple_seq_add_stmt (&seq
,
2635 build_type_cast (shadow_type
,
2636 gimple_seq_last (seq
)));
2637 if (real_size_in_bytes
> 1)
2638 gimple_seq_add_stmt (&seq
,
2639 build_assign (PLUS_EXPR
,
2640 gimple_seq_last (seq
),
2641 real_size_in_bytes
- 1));
2642 t
= gimple_assign_lhs (gimple_seq_last_stmt (seq
));
2645 t
= build_int_cst (shadow_type
, real_size_in_bytes
- 1);
2646 gimple_seq_add_stmt (&seq
, build_assign (GE_EXPR
, t
, shadow
));
2647 gimple_seq_add_stmt (&seq
, build_assign (BIT_AND_EXPR
, shadow_test
,
2648 gimple_seq_last (seq
)));
2649 t
= gimple_assign_lhs (gimple_seq_last (seq
));
2650 gimple_seq_set_location (seq
, loc
);
2651 gsi_insert_seq_after (&gsi
, seq
, GSI_CONTINUE_LINKING
);
2654 /* For non-constant, misaligned or otherwise weird access sizes,
2655 check first and last byte. */
2656 if (size_in_bytes
== -1 && !end_instrumented
)
2658 g
= gimple_build_assign_with_ops (MINUS_EXPR
,
2659 make_ssa_name (pointer_sized_int_node
, NULL
),
2661 build_int_cst (pointer_sized_int_node
, 1));
2662 gimple_set_location (g
, loc
);
2663 gsi_insert_after (&gsi
, g
, GSI_NEW_STMT
);
2664 tree last
= gimple_assign_lhs (g
);
2665 g
= gimple_build_assign_with_ops (PLUS_EXPR
,
2666 make_ssa_name (pointer_sized_int_node
, NULL
),
2669 gimple_set_location (g
, loc
);
2670 gsi_insert_after (&gsi
, g
, GSI_NEW_STMT
);
2671 tree base_end_addr
= gimple_assign_lhs (g
);
2673 tree shadow
= build_shadow_mem_access (&gsi
, loc
, base_end_addr
,
2675 gimple shadow_test
= build_assign (NE_EXPR
, shadow
, 0);
2676 gimple_seq seq
= NULL
;
2677 gimple_seq_add_stmt (&seq
, shadow_test
);
2678 gimple_seq_add_stmt (&seq
, build_assign (BIT_AND_EXPR
,
2680 gimple_seq_add_stmt (&seq
, build_type_cast (shadow_type
,
2681 gimple_seq_last (seq
)));
2682 gimple_seq_add_stmt (&seq
, build_assign (GE_EXPR
,
2683 gimple_seq_last (seq
),
2685 gimple_seq_add_stmt (&seq
, build_assign (BIT_AND_EXPR
, shadow_test
,
2686 gimple_seq_last (seq
)));
2687 if (!start_instrumented
)
2688 gimple_seq_add_stmt (&seq
, build_assign (BIT_IOR_EXPR
, t
,
2689 gimple_seq_last (seq
)));
2690 t
= gimple_assign_lhs (gimple_seq_last (seq
));
2691 gimple_seq_set_location (seq
, loc
);
2692 gsi_insert_seq_after (&gsi
, seq
, GSI_CONTINUE_LINKING
);
2696 g
= gimple_build_cond (NE_EXPR
, t
, build_int_cst (TREE_TYPE (t
), 0),
2697 NULL_TREE
, NULL_TREE
);
2698 gimple_set_location (g
, loc
);
2699 gsi_insert_after (&gsi
, g
, GSI_NEW_STMT
);
2701 /* Generate call to the run-time library (e.g. __asan_report_load8). */
2702 gsi
= gsi_start_bb (then_bb
);
2704 tree fun
= report_error_func (is_store
, size_in_bytes
, &nargs
);
2705 g
= gimple_build_call (fun
, nargs
, base_addr
, len
);
2706 gimple_set_location (g
, loc
);
2707 gsi_insert_after (&gsi
, g
, GSI_NEW_STMT
);
2709 gsi_remove (iter
, true);
2710 *iter
= gsi_start_bb (else_bb
);
2715 /* Instrument the current function. */
2718 asan_instrument (void)
2720 if (shadow_ptr_types
[0] == NULL_TREE
)
2721 asan_init_shadow_ptr_types ();
2722 transform_statements ();
2729 return (flag_sanitize
& SANITIZE_ADDRESS
) != 0
2730 && !lookup_attribute ("no_sanitize_address",
2731 DECL_ATTRIBUTES (current_function_decl
));
2736 const pass_data pass_data_asan
=
2738 GIMPLE_PASS
, /* type */
2740 OPTGROUP_NONE
, /* optinfo_flags */
2741 TV_NONE
, /* tv_id */
2742 ( PROP_ssa
| PROP_cfg
| PROP_gimple_leh
), /* properties_required */
2743 0, /* properties_provided */
2744 0, /* properties_destroyed */
2745 0, /* todo_flags_start */
2746 TODO_update_ssa
, /* todo_flags_finish */
2749 class pass_asan
: public gimple_opt_pass
2752 pass_asan (gcc::context
*ctxt
)
2753 : gimple_opt_pass (pass_data_asan
, ctxt
)
2756 /* opt_pass methods: */
2757 opt_pass
* clone () { return new pass_asan (m_ctxt
); }
2758 virtual bool gate (function
*) { return gate_asan (); }
2759 virtual unsigned int execute (function
*) { return asan_instrument (); }
2761 }; // class pass_asan
2766 make_pass_asan (gcc::context
*ctxt
)
2768 return new pass_asan (ctxt
);
2773 const pass_data pass_data_asan_O0
=
2775 GIMPLE_PASS
, /* type */
2777 OPTGROUP_NONE
, /* optinfo_flags */
2778 TV_NONE
, /* tv_id */
2779 ( PROP_ssa
| PROP_cfg
| PROP_gimple_leh
), /* properties_required */
2780 0, /* properties_provided */
2781 0, /* properties_destroyed */
2782 0, /* todo_flags_start */
2783 TODO_update_ssa
, /* todo_flags_finish */
2786 class pass_asan_O0
: public gimple_opt_pass
2789 pass_asan_O0 (gcc::context
*ctxt
)
2790 : gimple_opt_pass (pass_data_asan_O0
, ctxt
)
2793 /* opt_pass methods: */
2794 virtual bool gate (function
*) { return !optimize
&& gate_asan (); }
2795 virtual unsigned int execute (function
*) { return asan_instrument (); }
2797 }; // class pass_asan_O0
2802 make_pass_asan_O0 (gcc::context
*ctxt
)
2804 return new pass_asan_O0 (ctxt
);
2807 /* Perform optimization of sanitize functions. */
2811 const pass_data pass_data_sanopt
=
2813 GIMPLE_PASS
, /* type */
2814 "sanopt", /* name */
2815 OPTGROUP_NONE
, /* optinfo_flags */
2816 TV_NONE
, /* tv_id */
2817 ( PROP_ssa
| PROP_cfg
| PROP_gimple_leh
), /* properties_required */
2818 0, /* properties_provided */
2819 0, /* properties_destroyed */
2820 0, /* todo_flags_start */
2821 TODO_update_ssa
, /* todo_flags_finish */
2824 class pass_sanopt
: public gimple_opt_pass
2827 pass_sanopt (gcc::context
*ctxt
)
2828 : gimple_opt_pass (pass_data_sanopt
, ctxt
)
2831 /* opt_pass methods: */
2832 virtual bool gate (function
*) { return flag_sanitize
; }
2833 virtual unsigned int execute (function
*);
2835 }; // class pass_sanopt
2838 pass_sanopt::execute (function
*fun
)
2842 int asan_num_accesses
= 0;
2843 if (flag_sanitize
& SANITIZE_ADDRESS
)
2845 gimple_stmt_iterator gsi
;
2846 FOR_EACH_BB_FN (bb
, fun
)
2847 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2849 gimple stmt
= gsi_stmt (gsi
);
2850 if (is_gimple_call (stmt
) && gimple_call_internal_p (stmt
)
2851 && gimple_call_internal_fn (stmt
) == IFN_ASAN_CHECK
)
2852 ++asan_num_accesses
;
2856 bool use_calls
= ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD
< INT_MAX
2857 && asan_num_accesses
>= ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD
;
2859 FOR_EACH_BB_FN (bb
, fun
)
2861 gimple_stmt_iterator gsi
;
2862 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); )
2864 gimple stmt
= gsi_stmt (gsi
);
2865 bool no_next
= false;
2867 if (!is_gimple_call (stmt
))
2873 if (gimple_call_internal_p (stmt
))
2875 enum internal_fn ifn
= gimple_call_internal_fn (stmt
);
2878 case IFN_UBSAN_NULL
:
2879 no_next
= ubsan_expand_null_ifn (&gsi
);
2881 case IFN_UBSAN_BOUNDS
:
2882 no_next
= ubsan_expand_bounds_ifn (&gsi
);
2884 case IFN_UBSAN_OBJECT_SIZE
:
2885 no_next
= ubsan_expand_objsize_ifn (&gsi
);
2887 case IFN_ASAN_CHECK
:
2889 no_next
= asan_expand_check_ifn (&gsi
, use_calls
);
2897 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2899 fprintf (dump_file
, "Optimized\n ");
2900 print_gimple_stmt (dump_file
, stmt
, 0, dump_flags
);
2901 fprintf (dump_file
, "\n");
2914 make_pass_sanopt (gcc::context
*ctxt
)
2916 return new pass_sanopt (ctxt
);
2919 #include "gt-asan.h"