]> gcc.gnu.org Git - gcc.git/blame - gcc/asan.c
Remove a layer of indirection from hash_table
[gcc.git] / gcc / asan.c
CommitLineData
37d6f666 1/* AddressSanitizer, a fast memory error detector.
23a5b65a 2 Copyright (C) 2012-2014 Free Software Foundation, Inc.
37d6f666
WM
3 Contributed by Kostya Serebryany <kcc@google.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
4d648807 25#include "tree.h"
2fb9a547
AM
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"
18f429e2 32#include "gimple.h"
45b0be94 33#include "gimplify.h"
5be5c238 34#include "gimple-iterator.h"
d8a2d370
DN
35#include "calls.h"
36#include "varasm.h"
37#include "stor-layout.h"
37d6f666 38#include "tree-iterator.h"
442b4905 39#include "cgraph.h"
d8a2d370 40#include "stringpool.h"
442b4905 41#include "tree-ssanames.h"
37d6f666 42#include "tree-pass.h"
37d6f666
WM
43#include "asan.h"
44#include "gimple-pretty-print.h"
dfe06d3e 45#include "target.h"
f3ddd692
JJ
46#include "expr.h"
47#include "optabs.h"
8240018b 48#include "output.h"
7f71fad9 49#include "tm_p.h"
0e668eaf 50#include "langhooks.h"
bdcbe80c 51#include "alloc-pool.h"
a9e0d843 52#include "cfgloop.h"
ff2a63a7 53#include "gimple-builder.h"
b9a55b13 54#include "ubsan.h"
31e071ae 55#include "predict.h"
b5ebc991 56#include "params.h"
9b2b7279 57#include "builtins.h"
37d6f666 58
497a1c66
JJ
59/* AddressSanitizer finds out-of-bounds and use-after-free bugs
60 with <2x slowdown on average.
61
62 The tool consists of two parts:
63 instrumentation module (this file) and a run-time library.
64 The instrumentation module adds a run-time check before every memory insn.
65 For a 8- or 16- byte load accessing address X:
66 ShadowAddr = (X >> 3) + Offset
67 ShadowValue = *(char*)ShadowAddr; // *(short*) for 16-byte access.
68 if (ShadowValue)
69 __asan_report_load8(X);
70 For a load of N bytes (N=1, 2 or 4) from address X:
71 ShadowAddr = (X >> 3) + Offset
72 ShadowValue = *(char*)ShadowAddr;
73 if (ShadowValue)
74 if ((X & 7) + N - 1 > ShadowValue)
75 __asan_report_loadN(X);
76 Stores are instrumented similarly, but using __asan_report_storeN functions.
ef1b3fda
KS
77 A call too __asan_init_vN() is inserted to the list of module CTORs.
78 N is the version number of the AddressSanitizer API. The changes between the
79 API versions are listed in libsanitizer/asan/asan_interface_internal.h.
497a1c66
JJ
80
81 The run-time library redefines malloc (so that redzone are inserted around
82 the allocated memory) and free (so that reuse of free-ed memory is delayed),
ef1b3fda 83 provides __asan_report* and __asan_init_vN functions.
497a1c66
JJ
84
85 Read more:
86 http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
87
88 The current implementation supports detection of out-of-bounds and
89 use-after-free in the heap, on the stack and for global variables.
90
91 [Protection of stack variables]
92
93 To understand how detection of out-of-bounds and use-after-free works
94 for stack variables, lets look at this example on x86_64 where the
95 stack grows downward:
f3ddd692
JJ
96
97 int
98 foo ()
99 {
100 char a[23] = {0};
101 int b[2] = {0};
102
103 a[5] = 1;
104 b[1] = 2;
105
106 return a[5] + b[1];
107 }
108
497a1c66
JJ
109 For this function, the stack protected by asan will be organized as
110 follows, from the top of the stack to the bottom:
f3ddd692 111
497a1c66 112 Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
f3ddd692 113
497a1c66
JJ
114 Slot 2/ [8 bytes of red zone, that adds up to the space of 'a' to make
115 the next slot be 32 bytes aligned; this one is called Partial
116 Redzone; this 32 bytes alignment is an asan constraint]
f3ddd692 117
497a1c66 118 Slot 3/ [24 bytes for variable 'a']
f3ddd692 119
497a1c66 120 Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
f3ddd692 121
497a1c66 122 Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
f3ddd692 123
497a1c66 124 Slot 6/ [8 bytes for variable 'b']
f3ddd692 125
497a1c66
JJ
126 Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
127 'LEFT RedZone']
f3ddd692 128
497a1c66
JJ
129 The 32 bytes of LEFT red zone at the bottom of the stack can be
130 decomposed as such:
f3ddd692
JJ
131
132 1/ The first 8 bytes contain a magical asan number that is always
133 0x41B58AB3.
134
135 2/ The following 8 bytes contains a pointer to a string (to be
136 parsed at runtime by the runtime asan library), which format is
137 the following:
138
139 "<function-name> <space> <num-of-variables-on-the-stack>
140 (<32-bytes-aligned-offset-in-bytes-of-variable> <space>
141 <length-of-var-in-bytes> ){n} "
142
143 where '(...){n}' means the content inside the parenthesis occurs 'n'
144 times, with 'n' being the number of variables on the stack.
ef1b3fda
KS
145
146 3/ The following 8 bytes contain the PC of the current function which
147 will be used by the run-time library to print an error message.
f3ddd692 148
ef1b3fda 149 4/ The following 8 bytes are reserved for internal use by the run-time.
f3ddd692 150
497a1c66 151 The shadow memory for that stack layout is going to look like this:
f3ddd692
JJ
152
153 - content of shadow memory 8 bytes for slot 7: 0xF1F1F1F1.
154 The F1 byte pattern is a magic number called
155 ASAN_STACK_MAGIC_LEFT and is a way for the runtime to know that
156 the memory for that shadow byte is part of a the LEFT red zone
157 intended to seat at the bottom of the variables on the stack.
158
159 - content of shadow memory 8 bytes for slots 6 and 5:
160 0xF4F4F400. The F4 byte pattern is a magic number
161 called ASAN_STACK_MAGIC_PARTIAL. It flags the fact that the
162 memory region for this shadow byte is a PARTIAL red zone
163 intended to pad a variable A, so that the slot following
164 {A,padding} is 32 bytes aligned.
165
166 Note that the fact that the least significant byte of this
167 shadow memory content is 00 means that 8 bytes of its
168 corresponding memory (which corresponds to the memory of
169 variable 'b') is addressable.
170
171 - content of shadow memory 8 bytes for slot 4: 0xF2F2F2F2.
172 The F2 byte pattern is a magic number called
173 ASAN_STACK_MAGIC_MIDDLE. It flags the fact that the memory
174 region for this shadow byte is a MIDDLE red zone intended to
175 seat between two 32 aligned slots of {variable,padding}.
176
177 - content of shadow memory 8 bytes for slot 3 and 2:
497a1c66 178 0xF4000000. This represents is the concatenation of
f3ddd692
JJ
179 variable 'a' and the partial red zone following it, like what we
180 had for variable 'b'. The least significant 3 bytes being 00
181 means that the 3 bytes of variable 'a' are addressable.
182
497a1c66 183 - content of shadow memory 8 bytes for slot 1: 0xF3F3F3F3.
f3ddd692
JJ
184 The F3 byte pattern is a magic number called
185 ASAN_STACK_MAGIC_RIGHT. It flags the fact that the memory
186 region for this shadow byte is a RIGHT red zone intended to seat
187 at the top of the variables of the stack.
188
497a1c66
JJ
189 Note that the real variable layout is done in expand_used_vars in
190 cfgexpand.c. As far as Address Sanitizer is concerned, it lays out
191 stack variables as well as the different red zones, emits some
192 prologue code to populate the shadow memory as to poison (mark as
193 non-accessible) the regions of the red zones and mark the regions of
194 stack variables as accessible, and emit some epilogue code to
195 un-poison (mark as accessible) the regions of red zones right before
196 the function exits.
8240018b 197
497a1c66 198 [Protection of global variables]
8240018b 199
497a1c66
JJ
200 The basic idea is to insert a red zone between two global variables
201 and install a constructor function that calls the asan runtime to do
202 the populating of the relevant shadow memory regions at load time.
8240018b 203
497a1c66
JJ
204 So the global variables are laid out as to insert a red zone between
205 them. The size of the red zones is so that each variable starts on a
206 32 bytes boundary.
8240018b 207
497a1c66
JJ
208 Then a constructor function is installed so that, for each global
209 variable, it calls the runtime asan library function
210 __asan_register_globals_with an instance of this type:
8240018b
JJ
211
212 struct __asan_global
213 {
214 // Address of the beginning of the global variable.
215 const void *__beg;
216
217 // Initial size of the global variable.
218 uptr __size;
219
220 // Size of the global variable + size of the red zone. This
221 // size is 32 bytes aligned.
222 uptr __size_with_redzone;
223
224 // Name of the global variable.
225 const void *__name;
226
ef1b3fda
KS
227 // Name of the module where the global variable is declared.
228 const void *__module_name;
229
59b36ecf 230 // 1 if it has dynamic initialization, 0 otherwise.
8240018b
JJ
231 uptr __has_dynamic_init;
232 }
233
497a1c66
JJ
234 A destructor function that calls the runtime asan library function
235 _asan_unregister_globals is also installed. */
f3ddd692
JJ
236
237alias_set_type asan_shadow_set = -1;
37d6f666 238
f6d98484
JJ
239/* Pointer types to 1 resp. 2 byte integers in shadow memory. A separate
240 alias set is used for all shadow memory accesses. */
241static GTY(()) tree shadow_ptr_types[2];
242
e361382f
JJ
243/* Decl for __asan_option_detect_stack_use_after_return. */
244static GTY(()) tree asan_detect_stack_use_after_return;
245
8946c29e
YG
246/* Number of instrumentations in current function so far. */
247
248static int asan_num_accesses;
249
250/* Check whether we should replace inline instrumentation with calls. */
251
252static inline bool
253use_calls_p ()
254{
255 return ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD < INT_MAX
256 && asan_num_accesses >= ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD;
257}
258
bdcbe80c
DS
259/* Hashtable support for memory references used by gimple
260 statements. */
261
262/* This type represents a reference to a memory region. */
263struct asan_mem_ref
264{
688010ba 265 /* The expression of the beginning of the memory region. */
bdcbe80c
DS
266 tree start;
267
40f9f6bb
JJ
268 /* The size of the access. */
269 HOST_WIDE_INT access_size;
bdcbe80c
DS
270};
271
272static alloc_pool asan_mem_ref_alloc_pool;
273
274/* This creates the alloc pool used to store the instances of
275 asan_mem_ref that are stored in the hash table asan_mem_ref_ht. */
276
277static alloc_pool
278asan_mem_ref_get_alloc_pool ()
279{
280 if (asan_mem_ref_alloc_pool == NULL)
281 asan_mem_ref_alloc_pool = create_alloc_pool ("asan_mem_ref",
282 sizeof (asan_mem_ref),
283 10);
284 return asan_mem_ref_alloc_pool;
285
286}
287
288/* Initializes an instance of asan_mem_ref. */
289
290static void
40f9f6bb 291asan_mem_ref_init (asan_mem_ref *ref, tree start, HOST_WIDE_INT access_size)
bdcbe80c
DS
292{
293 ref->start = start;
294 ref->access_size = access_size;
295}
296
297/* Allocates memory for an instance of asan_mem_ref into the memory
298 pool returned by asan_mem_ref_get_alloc_pool and initialize it.
299 START is the address of (or the expression pointing to) the
300 beginning of memory reference. ACCESS_SIZE is the size of the
301 access to the referenced memory. */
302
303static asan_mem_ref*
40f9f6bb 304asan_mem_ref_new (tree start, HOST_WIDE_INT access_size)
bdcbe80c
DS
305{
306 asan_mem_ref *ref =
307 (asan_mem_ref *) pool_alloc (asan_mem_ref_get_alloc_pool ());
308
309 asan_mem_ref_init (ref, start, access_size);
310 return ref;
311}
312
313/* This builds and returns a pointer to the end of the memory region
314 that starts at START and of length LEN. */
315
316tree
317asan_mem_ref_get_end (tree start, tree len)
318{
319 if (len == NULL_TREE || integer_zerop (len))
320 return start;
321
322 return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
323}
324
325/* Return a tree expression that represents the end of the referenced
326 memory region. Beware that this function can actually build a new
327 tree expression. */
328
329tree
330asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
331{
332 return asan_mem_ref_get_end (ref->start, len);
333}
334
335struct asan_mem_ref_hasher
336 : typed_noop_remove <asan_mem_ref>
337{
338 typedef asan_mem_ref value_type;
339 typedef asan_mem_ref compare_type;
340
341 static inline hashval_t hash (const value_type *);
342 static inline bool equal (const value_type *, const compare_type *);
343};
344
345/* Hash a memory reference. */
346
347inline hashval_t
348asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
349{
350 hashval_t h = iterative_hash_expr (mem_ref->start, 0);
40f9f6bb 351 h = iterative_hash_host_wide_int (mem_ref->access_size, h);
bdcbe80c
DS
352 return h;
353}
354
355/* Compare two memory references. We accept the length of either
356 memory references to be NULL_TREE. */
357
358inline bool
359asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
360 const asan_mem_ref *m2)
361{
362 return (m1->access_size == m2->access_size
363 && operand_equal_p (m1->start, m2->start, 0));
364}
365
c203e8a7 366static hash_table<asan_mem_ref_hasher> *asan_mem_ref_ht;
bdcbe80c
DS
367
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. */
372
c203e8a7 373static hash_table<asan_mem_ref_hasher> *
bdcbe80c
DS
374get_mem_ref_hash_table ()
375{
c203e8a7
TS
376 if (!asan_mem_ref_ht)
377 asan_mem_ref_ht = new hash_table<asan_mem_ref_hasher> (10);
bdcbe80c
DS
378
379 return asan_mem_ref_ht;
380}
381
382/* Clear all entries from the memory references hash table. */
383
384static void
385empty_mem_ref_hash_table ()
386{
c203e8a7
TS
387 if (asan_mem_ref_ht)
388 asan_mem_ref_ht->empty ();
bdcbe80c
DS
389}
390
391/* Free the memory references hash table. */
392
393static void
394free_mem_ref_resources ()
395{
c203e8a7
TS
396 delete asan_mem_ref_ht;
397 asan_mem_ref_ht = NULL;
bdcbe80c
DS
398
399 if (asan_mem_ref_alloc_pool)
400 {
401 free_alloc_pool (asan_mem_ref_alloc_pool);
402 asan_mem_ref_alloc_pool = NULL;
403 }
404}
405
406/* Return true iff the memory reference REF has been instrumented. */
407
408static bool
40f9f6bb 409has_mem_ref_been_instrumented (tree ref, HOST_WIDE_INT access_size)
bdcbe80c
DS
410{
411 asan_mem_ref r;
412 asan_mem_ref_init (&r, ref, access_size);
413
c203e8a7 414 return (get_mem_ref_hash_table ()->find (&r) != NULL);
bdcbe80c
DS
415}
416
417/* Return true iff the memory reference REF has been instrumented. */
418
419static bool
420has_mem_ref_been_instrumented (const asan_mem_ref *ref)
421{
422 return has_mem_ref_been_instrumented (ref->start, ref->access_size);
423}
424
425/* Return true iff access to memory region starting at REF and of
426 length LEN has been instrumented. */
427
428static bool
429has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
430{
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;
435
436 if (len != 0)
437 {
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;
442 }
443 return true;
444}
445
446/* Set REF to the memory reference present in a gimple assignment
447 ASSIGNMENT. Return true upon successful completion, false
448 otherwise. */
449
450static bool
451get_mem_ref_of_assignment (const gimple assignment,
452 asan_mem_ref *ref,
453 bool *ref_is_store)
454{
455 gcc_assert (gimple_assign_single_p (assignment));
456
5d751b0c
JJ
457 if (gimple_store_p (assignment)
458 && !gimple_clobber_p (assignment))
bdcbe80c
DS
459 {
460 ref->start = gimple_assign_lhs (assignment);
461 *ref_is_store = true;
462 }
463 else if (gimple_assign_load_p (assignment))
464 {
465 ref->start = gimple_assign_rhs1 (assignment);
466 *ref_is_store = false;
467 }
468 else
469 return false;
470
471 ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
472 return true;
473}
474
475/* Return the memory references contained in a gimple statement
476 representing a builtin call that has to do with memory access. */
477
478static bool
479get_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)
490{
491 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
492
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;
40f9f6bb 497 HOST_WIDE_INT access_size = 1;
bdcbe80c
DS
498
499 switch (DECL_FUNCTION_CODE (callee))
500 {
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;
508
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;
515
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;
527
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;
533
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;
540
541 case BUILT_IN_STRLEN:
542 source0 = gimple_call_arg (call, 0);
543 len = gimple_call_lhs (call);
544 break ;
545
546 /* And now the __atomic* and __sync builtins.
547 These are handled differently from the classical memory memory
548 access builtins above. */
549
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. */
557
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:
563
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:
569
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:
575
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:
581
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:
587
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:
592
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:
598
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:
604
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:
610
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:
616
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:
622
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:
627
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:
633
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:
639
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:
645
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:
651
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:
657
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:
663
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:
669
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:
675
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:
681
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:
687
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:
693
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:
699
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:
705
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:
711
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:
717
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:
723
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:
729
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:
735
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:
741 {
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);
77e83307 749 else if (TREE_CODE (dest) == SSA_NAME || TREE_CODE (dest) == INTEGER_CST)
bdcbe80c
DS
750 dest = build2 (MEM_REF, TREE_TYPE (TREE_TYPE (dest)),
751 dest, build_int_cst (TREE_TYPE (dest), 0));
752 else
753 gcc_unreachable ();
754
755 access_size = int_size_in_bytes (TREE_TYPE (dest));
756 }
757
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;
763 }
764
765 if (len != NULL_TREE)
766 {
767 if (source0 != NULL_TREE)
768 {
769 src0->start = source0;
770 src0->access_size = access_size;
771 *src0_len = len;
772 *src0_is_store = false;
773 }
774
775 if (source1 != NULL_TREE)
776 {
777 src1->start = source1;
778 src1->access_size = access_size;
779 *src1_len = len;
780 *src1_is_store = false;
781 }
782
783 if (dest != NULL_TREE)
784 {
785 dst->start = dest;
786 dst->access_size = access_size;
787 *dst_len = len;
788 *dst_is_store = true;
789 }
790
791 got_reference_p = true;
792 }
b41288b3
JJ
793 else if (dest)
794 {
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;
801 }
bdcbe80c 802
b41288b3 803 return got_reference_p;
bdcbe80c
DS
804}
805
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. */
809
810static bool
811has_stmt_been_instrumented_p (gimple stmt)
812{
813 if (gimple_assign_single_p (stmt))
814 {
815 bool r_is_store;
816 asan_mem_ref r;
817 asan_mem_ref_init (&r, NULL, 1);
818
819 if (get_mem_ref_of_assignment (stmt, &r, &r_is_store))
820 return has_mem_ref_been_instrumented (&r);
821 }
822 else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
823 {
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);
828
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))
837 {
838 if (src0.start != NULL_TREE
839 && !has_mem_ref_been_instrumented (&src0, src0_len))
840 return false;
841
842 if (src1.start != NULL_TREE
843 && !has_mem_ref_been_instrumented (&src1, src1_len))
844 return false;
845
846 if (dest.start != NULL_TREE
847 && !has_mem_ref_been_instrumented (&dest, dest_len))
848 return false;
849
850 return true;
851 }
852 }
853 return false;
854}
855
856/* Insert a memory reference into the hash table. */
857
858static void
40f9f6bb 859update_mem_ref_hash_table (tree ref, HOST_WIDE_INT access_size)
bdcbe80c 860{
c203e8a7 861 hash_table<asan_mem_ref_hasher> *ht = get_mem_ref_hash_table ();
bdcbe80c
DS
862
863 asan_mem_ref r;
864 asan_mem_ref_init (&r, ref, access_size);
865
c203e8a7 866 asan_mem_ref **slot = ht->find_slot (&r, INSERT);
bdcbe80c
DS
867 if (*slot == NULL)
868 *slot = asan_mem_ref_new (ref, access_size);
869}
870
94fce891
JJ
871/* Initialize shadow_ptr_types array. */
872
873static void
874asan_init_shadow_ptr_types (void)
875{
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 ();
884}
885
11a877b3 886/* Create ADDR_EXPR of STRING_CST with the PP pretty printer text. */
8240018b
JJ
887
888static tree
11a877b3 889asan_pp_string (pretty_printer *pp)
8240018b 890{
11a877b3 891 const char *buf = pp_formatted_text (pp);
8240018b
JJ
892 size_t len = strlen (buf);
893 tree ret = build_string (len + 1, buf);
894 TREE_TYPE (ret)
94fce891
JJ
895 = build_array_type (TREE_TYPE (shadow_ptr_types[0]),
896 build_index_type (size_int (len)));
8240018b
JJ
897 TREE_READONLY (ret) = 1;
898 TREE_STATIC (ret) = 1;
94fce891 899 return build1 (ADDR_EXPR, shadow_ptr_types[0], ret);
8240018b
JJ
900}
901
f3ddd692
JJ
902/* Return a CONST_INT representing 4 subsequent shadow memory bytes. */
903
904static rtx
905asan_shadow_cst (unsigned char shadow_bytes[4])
906{
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);
dcad1dd3 913 return gen_int_mode (val, SImode);
f3ddd692
JJ
914}
915
aeb7e7c1
JJ
916/* Clear shadow memory at SHADOW_MEM, LEN bytes. Can't call a library call here
917 though. */
918
919static void
920asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
921{
922 rtx insn, insns, top_label, end, addr, tmp, jump;
923
924 start_sequence ();
925 clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
926 insns = get_insns ();
927 end_sequence ();
928 for (insn = insns; insn; insn = NEXT_INSN (insn))
929 if (CALL_P (insn))
930 break;
931 if (insn == NULL_RTX)
932 {
933 emit_insn (insns);
934 return;
935 }
936
937 gcc_assert ((len & 3) == 0);
938 top_label = gen_label_rtx ();
57d4d653 939 addr = copy_to_mode_reg (Pmode, XEXP (shadow_mem, 0));
aeb7e7c1
JJ
940 shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
941 end = force_reg (Pmode, plus_constant (Pmode, addr, len));
942 emit_label (top_label);
943
944 emit_move_insn (shadow_mem, const0_rtx);
2f1cd2eb 945 tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), addr,
aeb7e7c1
JJ
946 true, OPTAB_LIB_WIDEN);
947 if (tmp != addr)
948 emit_move_insn (addr, tmp);
949 emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
950 jump = get_last_insn ();
951 gcc_assert (JUMP_P (jump));
e5af9ddd 952 add_int_reg_note (jump, REG_BR_PROB, REG_BR_PROB_BASE * 80 / 100);
aeb7e7c1
JJ
953}
954
ef1b3fda
KS
955void
956asan_function_start (void)
957{
958 section *fnsec = function_section (current_function_decl);
959 switch_to_section (fnsec);
960 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC",
961 current_function_funcdef_no);
962}
963
f3ddd692
JJ
964/* Insert code to protect stack vars. The prologue sequence should be emitted
965 directly, epilogue sequence returned. BASE is the register holding the
966 stack base, against which OFFSETS array offsets are relative to, OFFSETS
967 array contains pairs of offsets in reverse order, always the end offset
968 of some gap that needs protection followed by starting offset,
969 and DECLS is an array of representative decls for each var partition.
970 LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
971 elements long (OFFSETS include gap before the first variable as well
e361382f
JJ
972 as gaps after each stack variable). PBASE is, if non-NULL, some pseudo
973 register which stack vars DECL_RTLs are based on. Either BASE should be
974 assigned to PBASE, when not doing use after return protection, or
975 corresponding address based on __asan_stack_malloc* return value. */
f3ddd692
JJ
976
977rtx
e361382f
JJ
978asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
979 HOST_WIDE_INT *offsets, tree *decls, int length)
f3ddd692 980{
e361382f 981 rtx shadow_base, shadow_mem, ret, mem, orig_base, lab;
ef1b3fda 982 char buf[30];
f3ddd692 983 unsigned char shadow_bytes[4];
e361382f
JJ
984 HOST_WIDE_INT base_offset = offsets[length - 1];
985 HOST_WIDE_INT base_align_bias = 0, offset, prev_offset;
986 HOST_WIDE_INT asan_frame_size = offsets[0] - base_offset;
f3ddd692
JJ
987 HOST_WIDE_INT last_offset, last_size;
988 int l;
989 unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT;
ef1b3fda 990 tree str_cst, decl, id;
e361382f 991 int use_after_return_class = -1;
f3ddd692 992
94fce891
JJ
993 if (shadow_ptr_types[0] == NULL_TREE)
994 asan_init_shadow_ptr_types ();
995
f3ddd692 996 /* First of all, prepare the description string. */
11a877b3 997 pretty_printer asan_pp;
da6ca2b5 998
8240018b
JJ
999 pp_decimal_int (&asan_pp, length / 2 - 1);
1000 pp_space (&asan_pp);
f3ddd692
JJ
1001 for (l = length - 2; l; l -= 2)
1002 {
1003 tree decl = decls[l / 2 - 1];
8240018b
JJ
1004 pp_wide_integer (&asan_pp, offsets[l] - base_offset);
1005 pp_space (&asan_pp);
1006 pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
1007 pp_space (&asan_pp);
f3ddd692
JJ
1008 if (DECL_P (decl) && DECL_NAME (decl))
1009 {
8240018b
JJ
1010 pp_decimal_int (&asan_pp, IDENTIFIER_LENGTH (DECL_NAME (decl)));
1011 pp_space (&asan_pp);
b066401f 1012 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
f3ddd692
JJ
1013 }
1014 else
8240018b
JJ
1015 pp_string (&asan_pp, "9 <unknown>");
1016 pp_space (&asan_pp);
f3ddd692 1017 }
11a877b3 1018 str_cst = asan_pp_string (&asan_pp);
f3ddd692
JJ
1019
1020 /* Emit the prologue sequence. */
b5ebc991
MO
1021 if (asan_frame_size > 32 && asan_frame_size <= 65536 && pbase
1022 && ASAN_USE_AFTER_RETURN)
e361382f
JJ
1023 {
1024 use_after_return_class = floor_log2 (asan_frame_size - 1) - 5;
1025 /* __asan_stack_malloc_N guarantees alignment
1026 N < 6 ? (64 << N) : 4096 bytes. */
1027 if (alignb > (use_after_return_class < 6
1028 ? (64U << use_after_return_class) : 4096U))
1029 use_after_return_class = -1;
1030 else if (alignb > ASAN_RED_ZONE_SIZE && (asan_frame_size & (alignb - 1)))
1031 base_align_bias = ((asan_frame_size + alignb - 1)
1032 & ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size;
1033 }
e5dcd695
LZ
1034 /* Align base if target is STRICT_ALIGNMENT. */
1035 if (STRICT_ALIGNMENT)
1036 base = expand_binop (Pmode, and_optab, base,
1037 gen_int_mode (-((GET_MODE_ALIGNMENT (SImode)
1038 << ASAN_SHADOW_SHIFT)
1039 / BITS_PER_UNIT), Pmode), NULL_RTX,
1040 1, OPTAB_DIRECT);
1041
e361382f
JJ
1042 if (use_after_return_class == -1 && pbase)
1043 emit_move_insn (pbase, base);
e5dcd695 1044
2f1cd2eb 1045 base = expand_binop (Pmode, add_optab, base,
e361382f 1046 gen_int_mode (base_offset - base_align_bias, Pmode),
f3ddd692 1047 NULL_RTX, 1, OPTAB_DIRECT);
e361382f
JJ
1048 orig_base = NULL_RTX;
1049 if (use_after_return_class != -1)
1050 {
1051 if (asan_detect_stack_use_after_return == NULL_TREE)
1052 {
1053 id = get_identifier ("__asan_option_detect_stack_use_after_return");
1054 decl = build_decl (BUILTINS_LOCATION, VAR_DECL, id,
1055 integer_type_node);
1056 SET_DECL_ASSEMBLER_NAME (decl, id);
1057 TREE_ADDRESSABLE (decl) = 1;
1058 DECL_ARTIFICIAL (decl) = 1;
1059 DECL_IGNORED_P (decl) = 1;
1060 DECL_EXTERNAL (decl) = 1;
1061 TREE_STATIC (decl) = 1;
1062 TREE_PUBLIC (decl) = 1;
1063 TREE_USED (decl) = 1;
1064 asan_detect_stack_use_after_return = decl;
1065 }
1066 orig_base = gen_reg_rtx (Pmode);
1067 emit_move_insn (orig_base, base);
1068 ret = expand_normal (asan_detect_stack_use_after_return);
1069 lab = gen_label_rtx ();
1070 int very_likely = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1);
1071 emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1072 VOIDmode, 0, lab, very_likely);
1073 snprintf (buf, sizeof buf, "__asan_stack_malloc_%d",
1074 use_after_return_class);
1075 ret = init_one_libfunc (buf);
1076 rtx addr = convert_memory_address (ptr_mode, base);
1077 ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode, 2,
1078 GEN_INT (asan_frame_size
1079 + base_align_bias),
1080 TYPE_MODE (pointer_sized_int_node),
1081 addr, ptr_mode);
1082 ret = convert_memory_address (Pmode, ret);
1083 emit_move_insn (base, ret);
1084 emit_label (lab);
1085 emit_move_insn (pbase, expand_binop (Pmode, add_optab, base,
1086 gen_int_mode (base_align_bias
1087 - base_offset, Pmode),
1088 NULL_RTX, 1, OPTAB_DIRECT));
1089 }
f3ddd692 1090 mem = gen_rtx_MEM (ptr_mode, base);
e361382f 1091 mem = adjust_address (mem, VOIDmode, base_align_bias);
69db2d57 1092 emit_move_insn (mem, gen_int_mode (ASAN_STACK_FRAME_MAGIC, ptr_mode));
f3ddd692
JJ
1093 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1094 emit_move_insn (mem, expand_normal (str_cst));
ef1b3fda
KS
1095 mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1096 ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", current_function_funcdef_no);
1097 id = get_identifier (buf);
1098 decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1099 VAR_DECL, id, char_type_node);
1100 SET_DECL_ASSEMBLER_NAME (decl, id);
1101 TREE_ADDRESSABLE (decl) = 1;
1102 TREE_READONLY (decl) = 1;
1103 DECL_ARTIFICIAL (decl) = 1;
1104 DECL_IGNORED_P (decl) = 1;
1105 TREE_STATIC (decl) = 1;
1106 TREE_PUBLIC (decl) = 0;
1107 TREE_USED (decl) = 1;
8c8b21e4
JJ
1108 DECL_INITIAL (decl) = decl;
1109 TREE_ASM_WRITTEN (decl) = 1;
1110 TREE_ASM_WRITTEN (id) = 1;
ef1b3fda 1111 emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl)));
f3ddd692
JJ
1112 shadow_base = expand_binop (Pmode, lshr_optab, base,
1113 GEN_INT (ASAN_SHADOW_SHIFT),
1114 NULL_RTX, 1, OPTAB_DIRECT);
e361382f
JJ
1115 shadow_base
1116 = plus_constant (Pmode, shadow_base,
1117 targetm.asan_shadow_offset ()
1118 + (base_align_bias >> ASAN_SHADOW_SHIFT));
f3ddd692
JJ
1119 gcc_assert (asan_shadow_set != -1
1120 && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
1121 shadow_mem = gen_rtx_MEM (SImode, shadow_base);
1122 set_mem_alias_set (shadow_mem, asan_shadow_set);
e5dcd695
LZ
1123 if (STRICT_ALIGNMENT)
1124 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
f3ddd692
JJ
1125 prev_offset = base_offset;
1126 for (l = length; l; l -= 2)
1127 {
1128 if (l == 2)
1129 cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
1130 offset = offsets[l - 1];
1131 if ((offset - base_offset) & (ASAN_RED_ZONE_SIZE - 1))
1132 {
1133 int i;
1134 HOST_WIDE_INT aoff
1135 = base_offset + ((offset - base_offset)
1136 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1137 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1138 (aoff - prev_offset)
1139 >> ASAN_SHADOW_SHIFT);
1140 prev_offset = aoff;
1141 for (i = 0; i < 4; i++, aoff += (1 << ASAN_SHADOW_SHIFT))
1142 if (aoff < offset)
1143 {
1144 if (aoff < offset - (1 << ASAN_SHADOW_SHIFT) + 1)
1145 shadow_bytes[i] = 0;
1146 else
1147 shadow_bytes[i] = offset - aoff;
1148 }
1149 else
1150 shadow_bytes[i] = ASAN_STACK_MAGIC_PARTIAL;
1151 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1152 offset = aoff;
1153 }
1154 while (offset <= offsets[l - 2] - ASAN_RED_ZONE_SIZE)
1155 {
1156 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1157 (offset - prev_offset)
1158 >> ASAN_SHADOW_SHIFT);
1159 prev_offset = offset;
1160 memset (shadow_bytes, cur_shadow_byte, 4);
1161 emit_move_insn (shadow_mem, asan_shadow_cst (shadow_bytes));
1162 offset += ASAN_RED_ZONE_SIZE;
1163 }
1164 cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
1165 }
1166 do_pending_stack_adjust ();
1167
1168 /* Construct epilogue sequence. */
1169 start_sequence ();
1170
e361382f
JJ
1171 lab = NULL_RTX;
1172 if (use_after_return_class != -1)
1173 {
1174 rtx lab2 = gen_label_rtx ();
1175 char c = (char) ASAN_STACK_MAGIC_USE_AFTER_RET;
1176 int very_likely = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1);
1177 emit_cmp_and_jump_insns (orig_base, base, EQ, NULL_RTX,
1178 VOIDmode, 0, lab2, very_likely);
1179 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
1180 set_mem_alias_set (shadow_mem, asan_shadow_set);
1181 mem = gen_rtx_MEM (ptr_mode, base);
1182 mem = adjust_address (mem, VOIDmode, base_align_bias);
1183 emit_move_insn (mem, gen_int_mode (ASAN_STACK_RETIRED_MAGIC, ptr_mode));
1184 unsigned HOST_WIDE_INT sz = asan_frame_size >> ASAN_SHADOW_SHIFT;
1185 if (use_after_return_class < 5
1186 && can_store_by_pieces (sz, builtin_memset_read_str, &c,
1187 BITS_PER_UNIT, true))
1188 store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c,
1189 BITS_PER_UNIT, true, 0);
1190 else if (use_after_return_class >= 5
1191 || !set_storage_via_setmem (shadow_mem,
1192 GEN_INT (sz),
1193 gen_int_mode (c, QImode),
1194 BITS_PER_UNIT, BITS_PER_UNIT,
1195 -1, sz, sz, sz))
1196 {
1197 snprintf (buf, sizeof buf, "__asan_stack_free_%d",
1198 use_after_return_class);
1199 ret = init_one_libfunc (buf);
1200 rtx addr = convert_memory_address (ptr_mode, base);
1201 rtx orig_addr = convert_memory_address (ptr_mode, orig_base);
1202 emit_library_call (ret, LCT_NORMAL, ptr_mode, 3, addr, ptr_mode,
1203 GEN_INT (asan_frame_size + base_align_bias),
1204 TYPE_MODE (pointer_sized_int_node),
1205 orig_addr, ptr_mode);
1206 }
1207 lab = gen_label_rtx ();
1208 emit_jump (lab);
1209 emit_label (lab2);
1210 }
1211
f3ddd692
JJ
1212 shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
1213 set_mem_alias_set (shadow_mem, asan_shadow_set);
e5dcd695
LZ
1214
1215 if (STRICT_ALIGNMENT)
1216 set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
1217
f3ddd692
JJ
1218 prev_offset = base_offset;
1219 last_offset = base_offset;
1220 last_size = 0;
1221 for (l = length; l; l -= 2)
1222 {
1223 offset = base_offset + ((offsets[l - 1] - base_offset)
1224 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
1225 if (last_offset + last_size != offset)
1226 {
1227 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1228 (last_offset - prev_offset)
1229 >> ASAN_SHADOW_SHIFT);
1230 prev_offset = last_offset;
aeb7e7c1 1231 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
f3ddd692
JJ
1232 last_offset = offset;
1233 last_size = 0;
1234 }
1235 last_size += base_offset + ((offsets[l - 2] - base_offset)
1236 & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
1237 - offset;
1238 }
1239 if (last_size)
1240 {
1241 shadow_mem = adjust_address (shadow_mem, VOIDmode,
1242 (last_offset - prev_offset)
1243 >> ASAN_SHADOW_SHIFT);
aeb7e7c1 1244 asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT);
f3ddd692
JJ
1245 }
1246
1247 do_pending_stack_adjust ();
e361382f
JJ
1248 if (lab)
1249 emit_label (lab);
f3ddd692
JJ
1250
1251 ret = get_insns ();
1252 end_sequence ();
1253 return ret;
1254}
1255
8240018b
JJ
1256/* Return true if DECL, a global var, might be overridden and needs
1257 therefore a local alias. */
1258
1259static bool
1260asan_needs_local_alias (tree decl)
1261{
1262 return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
1263}
1264
1265/* Return true if DECL is a VAR_DECL that should be protected
1266 by Address Sanitizer, by appending a red zone with protected
1267 shadow memory after it and aligning it to at least
1268 ASAN_RED_ZONE_SIZE bytes. */
1269
1270bool
1271asan_protect_global (tree decl)
1272{
b5ebc991
MO
1273 if (!ASAN_GLOBALS)
1274 return false;
1275
8240018b 1276 rtx rtl, symbol;
8240018b 1277
94fce891
JJ
1278 if (TREE_CODE (decl) == STRING_CST)
1279 {
1280 /* Instrument all STRING_CSTs except those created
1281 by asan_pp_string here. */
1282 if (shadow_ptr_types[0] != NULL_TREE
1283 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
1284 && TREE_TYPE (TREE_TYPE (decl)) == TREE_TYPE (shadow_ptr_types[0]))
1285 return false;
1286 return true;
1287 }
8240018b
JJ
1288 if (TREE_CODE (decl) != VAR_DECL
1289 /* TLS vars aren't statically protectable. */
1290 || DECL_THREAD_LOCAL_P (decl)
1291 /* Externs will be protected elsewhere. */
1292 || DECL_EXTERNAL (decl)
8240018b
JJ
1293 || !DECL_RTL_SET_P (decl)
1294 /* Comdat vars pose an ABI problem, we can't know if
1295 the var that is selected by the linker will have
1296 padding or not. */
1297 || DECL_ONE_ONLY (decl)
1298 /* Similarly for common vars. People can use -fno-common. */
a8a6fd74 1299 || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
8240018b
JJ
1300 /* Don't protect if using user section, often vars placed
1301 into user section from multiple TUs are then assumed
1302 to be an array of such vars, putting padding in there
1303 breaks this assumption. */
f961457f 1304 || (DECL_SECTION_NAME (decl) != NULL
e257a17c 1305 && !symtab_get_node (decl)->implicit_section)
8240018b
JJ
1306 || DECL_SIZE (decl) == 0
1307 || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
1308 || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
1309 || DECL_ALIGN_UNIT (decl) > 2 * ASAN_RED_ZONE_SIZE)
1310 return false;
1311
1312 rtl = DECL_RTL (decl);
1313 if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF)
1314 return false;
1315 symbol = XEXP (rtl, 0);
1316
1317 if (CONSTANT_POOL_ADDRESS_P (symbol)
1318 || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
1319 return false;
1320
8240018b
JJ
1321 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
1322 return false;
1323
1324#ifndef ASM_OUTPUT_DEF
1325 if (asan_needs_local_alias (decl))
1326 return false;
1327#endif
1328
497a1c66 1329 return true;
8240018b
JJ
1330}
1331
40f9f6bb
JJ
1332/* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16,_n}.
1333 IS_STORE is either 1 (for a store) or 0 (for a load). */
37d6f666
WM
1334
1335static tree
8946c29e 1336report_error_func (bool is_store, HOST_WIDE_INT size_in_bytes, int *nargs)
37d6f666 1337{
40f9f6bb 1338 static enum built_in_function report[2][6]
0e668eaf
JJ
1339 = { { BUILT_IN_ASAN_REPORT_LOAD1, BUILT_IN_ASAN_REPORT_LOAD2,
1340 BUILT_IN_ASAN_REPORT_LOAD4, BUILT_IN_ASAN_REPORT_LOAD8,
40f9f6bb 1341 BUILT_IN_ASAN_REPORT_LOAD16, BUILT_IN_ASAN_REPORT_LOAD_N },
0e668eaf
JJ
1342 { BUILT_IN_ASAN_REPORT_STORE1, BUILT_IN_ASAN_REPORT_STORE2,
1343 BUILT_IN_ASAN_REPORT_STORE4, BUILT_IN_ASAN_REPORT_STORE8,
40f9f6bb 1344 BUILT_IN_ASAN_REPORT_STORE16, BUILT_IN_ASAN_REPORT_STORE_N } };
8946c29e
YG
1345 if (size_in_bytes == -1)
1346 {
1347 *nargs = 2;
1348 return builtin_decl_implicit (report[is_store][5]);
1349 }
1350 *nargs = 1;
0e668eaf 1351 return builtin_decl_implicit (report[is_store][exact_log2 (size_in_bytes)]);
37d6f666
WM
1352}
1353
8946c29e
YG
1354/* Construct a function tree for __asan_{load,store}{1,2,4,8,16,_n}.
1355 IS_STORE is either 1 (for a store) or 0 (for a load). */
1356
1357static tree
1358check_func (bool is_store, int size_in_bytes, int *nargs)
1359{
1360 static enum built_in_function check[2][6]
1361 = { { BUILT_IN_ASAN_LOAD1, BUILT_IN_ASAN_LOAD2,
1362 BUILT_IN_ASAN_LOAD4, BUILT_IN_ASAN_LOAD8,
1363 BUILT_IN_ASAN_LOAD16, BUILT_IN_ASAN_LOADN },
1364 { BUILT_IN_ASAN_STORE1, BUILT_IN_ASAN_STORE2,
1365 BUILT_IN_ASAN_STORE4, BUILT_IN_ASAN_STORE8,
1366 BUILT_IN_ASAN_STORE16, BUILT_IN_ASAN_STOREN } };
1367 if (size_in_bytes == -1)
1368 {
1369 *nargs = 2;
1370 return builtin_decl_implicit (check[is_store][5]);
1371 }
1372 *nargs = 1;
1373 return builtin_decl_implicit (check[is_store][exact_log2 (size_in_bytes)]);
1374}
1375
01452015 1376/* Split the current basic block and create a condition statement
25ae5027
DS
1377 insertion point right before or after the statement pointed to by
1378 ITER. Return an iterator to the point at which the caller might
1379 safely insert the condition statement.
01452015
DS
1380
1381 THEN_BLOCK must be set to the address of an uninitialized instance
1382 of basic_block. The function will then set *THEN_BLOCK to the
1383 'then block' of the condition statement to be inserted by the
1384 caller.
1385
c4bfe8bf
JJ
1386 If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
1387 *THEN_BLOCK to *FALLTHROUGH_BLOCK.
1388
01452015
DS
1389 Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
1390 block' of the condition statement to be inserted by the caller.
1391
1392 Note that *FALLTHROUGH_BLOCK is a new block that contains the
1393 statements starting from *ITER, and *THEN_BLOCK is a new empty
1394 block.
1395
25ae5027
DS
1396 *ITER is adjusted to point to always point to the first statement
1397 of the basic block * FALLTHROUGH_BLOCK. That statement is the
1398 same as what ITER was pointing to prior to calling this function,
1399 if BEFORE_P is true; otherwise, it is its following statement. */
01452015 1400
ac0ff9f2 1401gimple_stmt_iterator
25ae5027
DS
1402create_cond_insert_point (gimple_stmt_iterator *iter,
1403 bool before_p,
1404 bool then_more_likely_p,
c4bfe8bf 1405 bool create_then_fallthru_edge,
25ae5027
DS
1406 basic_block *then_block,
1407 basic_block *fallthrough_block)
01452015
DS
1408{
1409 gimple_stmt_iterator gsi = *iter;
1410
25ae5027 1411 if (!gsi_end_p (gsi) && before_p)
01452015
DS
1412 gsi_prev (&gsi);
1413
1414 basic_block cur_bb = gsi_bb (*iter);
1415
1416 edge e = split_block (cur_bb, gsi_stmt (gsi));
1417
1418 /* Get a hold on the 'condition block', the 'then block' and the
1419 'else block'. */
1420 basic_block cond_bb = e->src;
1421 basic_block fallthru_bb = e->dest;
1422 basic_block then_bb = create_empty_bb (cond_bb);
a9e0d843
RB
1423 if (current_loops)
1424 {
1425 add_bb_to_loop (then_bb, cond_bb->loop_father);
1426 loops_state_set (LOOPS_NEED_FIXUP);
1427 }
01452015
DS
1428
1429 /* Set up the newly created 'then block'. */
1430 e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
1431 int fallthrough_probability
1432 = then_more_likely_p
1433 ? PROB_VERY_UNLIKELY
1434 : PROB_ALWAYS - PROB_VERY_UNLIKELY;
1435 e->probability = PROB_ALWAYS - fallthrough_probability;
c4bfe8bf
JJ
1436 if (create_then_fallthru_edge)
1437 make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU);
01452015
DS
1438
1439 /* Set up the fallthrough basic block. */
1440 e = find_edge (cond_bb, fallthru_bb);
1441 e->flags = EDGE_FALSE_VALUE;
1442 e->count = cond_bb->count;
1443 e->probability = fallthrough_probability;
1444
1445 /* Update dominance info for the newly created then_bb; note that
1446 fallthru_bb's dominance info has already been updated by
1447 split_bock. */
1448 if (dom_info_available_p (CDI_DOMINATORS))
1449 set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
1450
1451 *then_block = then_bb;
1452 *fallthrough_block = fallthru_bb;
1453 *iter = gsi_start_bb (fallthru_bb);
1454
1455 return gsi_last_bb (cond_bb);
1456}
1457
25ae5027
DS
1458/* Insert an if condition followed by a 'then block' right before the
1459 statement pointed to by ITER. The fallthrough block -- which is the
1460 else block of the condition as well as the destination of the
1461 outcoming edge of the 'then block' -- starts with the statement
1462 pointed to by ITER.
1463
497a1c66 1464 COND is the condition of the if.
25ae5027
DS
1465
1466 If THEN_MORE_LIKELY_P is true, the probability of the edge to the
1467 'then block' is higher than the probability of the edge to the
1468 fallthrough block.
1469
1470 Upon completion of the function, *THEN_BB is set to the newly
1471 inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
1472 fallthrough block.
1473
1474 *ITER is adjusted to still point to the same statement it was
1475 pointing to initially. */
1476
1477static void
1478insert_if_then_before_iter (gimple cond,
1479 gimple_stmt_iterator *iter,
1480 bool then_more_likely_p,
1481 basic_block *then_bb,
1482 basic_block *fallthrough_bb)
1483{
1484 gimple_stmt_iterator cond_insert_point =
1485 create_cond_insert_point (iter,
1486 /*before_p=*/true,
1487 then_more_likely_p,
c4bfe8bf 1488 /*create_then_fallthru_edge=*/true,
25ae5027
DS
1489 then_bb,
1490 fallthrough_bb);
1491 gsi_insert_after (&cond_insert_point, cond, GSI_NEW_STMT);
1492}
1493
40f9f6bb
JJ
1494/* Build
1495 (base_addr >> ASAN_SHADOW_SHIFT) + targetm.asan_shadow_offset (). */
1496
1497static tree
1498build_shadow_mem_access (gimple_stmt_iterator *gsi, location_t location,
1499 tree base_addr, tree shadow_ptr_type)
1500{
1501 tree t, uintptr_type = TREE_TYPE (base_addr);
1502 tree shadow_type = TREE_TYPE (shadow_ptr_type);
1503 gimple g;
1504
1505 t = build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT);
1506 g = gimple_build_assign_with_ops (RSHIFT_EXPR,
1507 make_ssa_name (uintptr_type, NULL),
1508 base_addr, t);
1509 gimple_set_location (g, location);
1510 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1511
1512 t = build_int_cst (uintptr_type, targetm.asan_shadow_offset ());
1513 g = gimple_build_assign_with_ops (PLUS_EXPR,
1514 make_ssa_name (uintptr_type, NULL),
1515 gimple_assign_lhs (g), t);
1516 gimple_set_location (g, location);
1517 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1518
1519 g = gimple_build_assign_with_ops (NOP_EXPR,
1520 make_ssa_name (shadow_ptr_type, NULL),
1521 gimple_assign_lhs (g), NULL_TREE);
1522 gimple_set_location (g, location);
1523 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1524
1525 t = build2 (MEM_REF, shadow_type, gimple_assign_lhs (g),
1526 build_int_cst (shadow_ptr_type, 0));
1527 g = gimple_build_assign_with_ops (MEM_REF,
1528 make_ssa_name (shadow_type, NULL),
1529 t, NULL_TREE);
1530 gimple_set_location (g, location);
1531 gsi_insert_after (gsi, g, GSI_NEW_STMT);
1532 return gimple_assign_lhs (g);
1533}
1534
8946c29e
YG
1535/* BASE can already be an SSA_NAME; in that case, do not create a
1536 new SSA_NAME for it. */
1537
1538static tree
1539maybe_create_ssa_name (location_t loc, tree base, gimple_stmt_iterator *iter,
1540 bool before_p)
1541{
1542 if (TREE_CODE (base) == SSA_NAME)
1543 return base;
1544 gimple g
1545 = gimple_build_assign_with_ops (TREE_CODE (base),
1546 make_ssa_name (TREE_TYPE (base), NULL),
1547 base, NULL_TREE);
1548 gimple_set_location (g, loc);
1549 if (before_p)
1550 gsi_insert_before (iter, g, GSI_SAME_STMT);
1551 else
1552 gsi_insert_after (iter, g, GSI_NEW_STMT);
1553 return gimple_assign_lhs (g);
1554}
1555
1556/* Instrument the memory access instruction using callbacks.
1557 Parameters are similar to BUILD_CHECK_STMT. */
1558
1559static void
1560build_check_stmt_with_calls (location_t loc, tree base, tree len,
1561 HOST_WIDE_INT size_in_bytes, gimple_stmt_iterator *iter,
1562 bool before_p, bool is_store, bool is_scalar_access)
1563{
1564 gimple_stmt_iterator gsi = *iter;
1565 tree base_ssa = maybe_create_ssa_name (loc, base, &gsi, before_p);
1566
1567 gimple g
1568 = gimple_build_assign_with_ops (NOP_EXPR,
1569 make_ssa_name (pointer_sized_int_node, NULL),
1570 base_ssa, NULL_TREE);
1571 gimple_set_location (g, loc);
1572 if (before_p)
1573 gsi_insert_before (&gsi, g, GSI_NEW_STMT);
1574 else
1575 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1576 tree base_addr = gimple_assign_lhs (g);
1577
1578 int nargs;
1579 tree fun
1580 = check_func (is_store, is_scalar_access ? size_in_bytes : -1, &nargs);
1581 if (nargs == 1)
1582 g = gimple_build_call (fun, 1, base_addr);
1583 else
1584 {
1585 gcc_assert (nargs == 2);
1586 g = gimple_build_assign_with_ops (NOP_EXPR,
1587 make_ssa_name (pointer_sized_int_node,
1588 NULL),
1589 len, NULL_TREE);
1590 gimple_set_location (g, loc);
1591 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1592 tree sz_arg = gimple_assign_lhs (g);
1593 g = gimple_build_call (fun, nargs, base_addr, sz_arg);
1594 }
1595 gimple_set_location (g, loc);
1596 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1597
1598 if (!before_p)
1599 {
1600 gsi_next (&gsi);
1601 *iter = gsi;
1602 }
1603}
1604
dc29bf1e 1605/* Instrument the memory access instruction BASE. Insert new
25ae5027 1606 statements before or after ITER.
dc29bf1e
DS
1607
1608 Note that the memory access represented by BASE can be either an
1609 SSA_NAME, or a non-SSA expression. LOCATION is the source code
1610 location. IS_STORE is TRUE for a store, FALSE for a load.
25ae5027 1611 BEFORE_P is TRUE for inserting the instrumentation code before
8946c29e
YG
1612 ITER, FALSE for inserting it after ITER. IS_SCALAR_ACCESS is TRUE
1613 for a scalar memory access and FALSE for memory region access.
1614 NON_ZERO_P is TRUE if memory region is guaranteed to have non-zero
1615 length. ALIGN tells alignment of accessed memory object.
1616
1617 START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
1618 memory region have already been instrumented.
25ae5027
DS
1619
1620 If BEFORE_P is TRUE, *ITER is arranged to still point to the
1621 statement it was pointing to prior to calling this function,
1622 otherwise, it points to the statement logically following it. */
37d6f666
WM
1623
1624static void
8946c29e
YG
1625build_check_stmt (location_t location, tree base, tree len,
1626 HOST_WIDE_INT size_in_bytes, gimple_stmt_iterator *iter,
1627 bool non_zero_len_p, bool before_p, bool is_store,
1628 bool is_scalar_access, unsigned int align = 0,
1629 bool start_instrumented = false,
1630 bool end_instrumented = false)
37d6f666 1631{
8946c29e 1632 gimple_stmt_iterator gsi = *iter;
37d6f666 1633 gimple g;
f6d98484
JJ
1634 tree uintptr_type
1635 = build_nonstandard_integer_type (TYPE_PRECISION (TREE_TYPE (base)), 1);
8946c29e
YG
1636
1637 gcc_assert (!(size_in_bytes > 0 && !non_zero_len_p));
1638
241e298a
YG
1639 if (start_instrumented && end_instrumented)
1640 {
1641 if (!before_p)
1642 gsi_next (iter);
1643 return;
1644 }
1645
8946c29e
YG
1646 if (len)
1647 len = unshare_expr (len);
1648 else
1649 {
1650 gcc_assert (size_in_bytes != -1);
1651 len = build_int_cst (pointer_sized_int_node, size_in_bytes);
1652 }
1653
1654 if (size_in_bytes > 1)
b3f1051b 1655 {
8946c29e 1656 if ((size_in_bytes & (size_in_bytes - 1)) != 0
bf613c02 1657 || !is_scalar_access
8946c29e
YG
1658 || size_in_bytes > 16)
1659 size_in_bytes = -1;
1660 else if (align && align < size_in_bytes * BITS_PER_UNIT)
1661 {
1662 /* On non-strict alignment targets, if
1663 16-byte access is just 8-byte aligned,
1664 this will result in misaligned shadow
1665 memory 2 byte load, but otherwise can
1666 be handled using one read. */
1667 if (size_in_bytes != 16
1668 || STRICT_ALIGNMENT
1669 || align < 8 * BITS_PER_UNIT)
1670 size_in_bytes = -1;
1671 }
1672 }
1673
1674 HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
1675
1676 tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
1677 tree shadow_type = TREE_TYPE (shadow_ptr_type);
1678
1679 base = unshare_expr (base);
1680
1681 if (use_calls_p ())
1682 {
1683 gsi = *iter;
1684 build_check_stmt_with_calls (location, base, len, size_in_bytes, iter,
1685 before_p, is_store, is_scalar_access);
1686 return;
1687 }
1688
1689 ++asan_num_accesses;
1690
1691 if (!non_zero_len_p)
1692 {
1693 gcc_assert (before_p);
1694
1695 /* So, the length of the memory area to asan-protect is
1696 non-constant. Let's guard the generated instrumentation code
1697 like:
1698
1699 if (len != 0)
1700 {
1701 //asan instrumentation code goes here.
1702 }
1703 // falltrough instructions, starting with *ITER. */
1704
1705 g = gimple_build_cond (NE_EXPR,
1706 len,
1707 build_int_cst (TREE_TYPE (len), 0),
1708 NULL_TREE, NULL_TREE);
1709 gimple_set_location (g, location);
1710
1711 basic_block then_bb, fallthrough_bb;
1712 insert_if_then_before_iter (g, iter, /*then_more_likely_p=*/true,
1713 &then_bb, &fallthrough_bb);
1714 /* Note that fallthrough_bb starts with the statement that was
1715 pointed to by ITER. */
1716
1717 /* The 'then block' of the 'if (len != 0) condition is where
1718 we'll generate the asan instrumentation code now. */
1719 gsi = gsi_last_bb (then_bb);
1720 build_check_stmt (location, base, len, size_in_bytes, &gsi,
1721 /*non_zero_len_p*/true, /*before_p*/true, is_store,
1722 is_scalar_access, align,
1723 start_instrumented, end_instrumented);
1724 return;
b3f1051b 1725 }
37d6f666 1726
01452015
DS
1727 /* Get an iterator on the point where we can add the condition
1728 statement for the instrumentation. */
8946c29e
YG
1729 basic_block then_bb, else_bb;
1730 gsi = create_cond_insert_point (&gsi, before_p,
25ae5027 1731 /*then_more_likely_p=*/false,
c4bfe8bf 1732 /*create_then_fallthru_edge=*/false,
25ae5027
DS
1733 &then_bb,
1734 &else_bb);
37d6f666 1735
8946c29e
YG
1736 tree base_ssa = maybe_create_ssa_name (location, base, &gsi,
1737 /*before_p*/false);
37d6f666 1738
f6d98484
JJ
1739 g = gimple_build_assign_with_ops (NOP_EXPR,
1740 make_ssa_name (uintptr_type, NULL),
dc29bf1e 1741 base_ssa, NULL_TREE);
37d6f666 1742 gimple_set_location (g, location);
f6d98484 1743 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
8946c29e 1744 tree base_addr = gimple_assign_lhs (g);
37d6f666 1745
241e298a 1746 tree t = NULL_TREE;
8946c29e
YG
1747 if (real_size_in_bytes >= 8)
1748 {
1749 tree shadow = build_shadow_mem_access (&gsi, location, base_addr,
1750 shadow_ptr_type);
1751 t = shadow;
1752 }
1753 else
f6d98484 1754 {
8946c29e
YG
1755 /* Slow path for 1, 2 and 4 byte accesses. */
1756
1757 if (!start_instrumented)
40f9f6bb 1758 {
8946c29e
YG
1759 /* Test (shadow != 0)
1760 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow). */
1761 tree shadow = build_shadow_mem_access (&gsi, location, base_addr,
1762 shadow_ptr_type);
1763 gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
1764 gimple_seq seq = NULL;
1765 gimple_seq_add_stmt (&seq, shadow_test);
1766 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, base_addr, 7));
1767 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
1768 gimple_seq_last (seq)));
1769 if (real_size_in_bytes > 1)
1770 gimple_seq_add_stmt (&seq,
1771 build_assign (PLUS_EXPR, gimple_seq_last (seq),
1772 real_size_in_bytes - 1));
1773 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
1774 gimple_seq_last (seq),
1775 shadow));
1776 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
1777 gimple_seq_last (seq)));
1778 t = gimple_assign_lhs (gimple_seq_last (seq));
1779 gimple_seq_set_location (seq, location);
1780 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
1781 }
1782
1783 /* For non-constant, misaligned or otherwise weird access sizes,
1784 check first and last byte. */
1785 if (size_in_bytes == -1 && !end_instrumented)
1786 {
1787 g = gimple_build_assign_with_ops (MINUS_EXPR,
1788 make_ssa_name (uintptr_type, NULL),
1789 len,
1790 build_int_cst (uintptr_type, 1));
1791 gimple_set_location (g, location);
1792 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1793 tree last = gimple_assign_lhs (g);
40f9f6bb
JJ
1794 g = gimple_build_assign_with_ops (PLUS_EXPR,
1795 make_ssa_name (uintptr_type, NULL),
1796 base_addr,
8946c29e 1797 last);
40f9f6bb
JJ
1798 gimple_set_location (g, location);
1799 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1800 tree base_end_addr = gimple_assign_lhs (g);
1801
8946c29e
YG
1802 tree shadow = build_shadow_mem_access (&gsi, location, base_end_addr,
1803 shadow_ptr_type);
1804 gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
1805 gimple_seq seq = NULL;
40f9f6bb
JJ
1806 gimple_seq_add_stmt (&seq, shadow_test);
1807 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
1808 base_end_addr, 7));
1809 gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
1810 gimple_seq_last (seq)));
1811 gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
1812 gimple_seq_last (seq),
1813 shadow));
1814 gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
1815 gimple_seq_last (seq)));
8946c29e
YG
1816 if (!start_instrumented)
1817 gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
1818 gimple_seq_last (seq)));
40f9f6bb
JJ
1819 t = gimple_assign_lhs (gimple_seq_last (seq));
1820 gimple_seq_set_location (seq, location);
1821 gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
40f9f6bb 1822 }
f6d98484 1823 }
37d6f666 1824
f6d98484
JJ
1825 g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
1826 NULL_TREE, NULL_TREE);
1827 gimple_set_location (g, location);
1828 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
37d6f666 1829
f6d98484 1830 /* Generate call to the run-time library (e.g. __asan_report_load8). */
37d6f666 1831 gsi = gsi_start_bb (then_bb);
8946c29e
YG
1832 int nargs;
1833 tree fun = report_error_func (is_store, is_scalar_access ? size_in_bytes : -1,
1834 &nargs);
1835 if (nargs == 1)
1836 g = gimple_build_call (fun, 1, base_addr);
1837 else
1838 {
1839 gcc_assert (nargs == 2);
1840 g = gimple_build_assign_with_ops (NOP_EXPR,
1841 make_ssa_name (pointer_sized_int_node,
1842 NULL),
1843 len, NULL_TREE);
1844 gimple_set_location (g, location);
1845 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1846 tree sz_arg = gimple_assign_lhs (g);
1847 g = gimple_build_call (fun, nargs, base_addr, sz_arg);
1848 }
f6d98484
JJ
1849 gimple_set_location (g, location);
1850 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
37d6f666 1851
dfb9e332 1852 *iter = gsi_start_bb (else_bb);
37d6f666
WM
1853}
1854
1855/* If T represents a memory access, add instrumentation code before ITER.
1856 LOCATION is source code location.
25ae5027 1857 IS_STORE is either TRUE (for a store) or FALSE (for a load). */
37d6f666
WM
1858
1859static void
1860instrument_derefs (gimple_stmt_iterator *iter, tree t,
bdcbe80c 1861 location_t location, bool is_store)
37d6f666 1862{
b5ebc991
MO
1863 if (is_store && !ASAN_INSTRUMENT_WRITES)
1864 return;
1865 if (!is_store && !ASAN_INSTRUMENT_READS)
1866 return;
1867
37d6f666 1868 tree type, base;
f6d98484 1869 HOST_WIDE_INT size_in_bytes;
37d6f666
WM
1870
1871 type = TREE_TYPE (t);
37d6f666
WM
1872 switch (TREE_CODE (t))
1873 {
1874 case ARRAY_REF:
1875 case COMPONENT_REF:
1876 case INDIRECT_REF:
1877 case MEM_REF:
59b36ecf 1878 case VAR_DECL:
37d6f666 1879 break;
59b36ecf 1880 /* FALLTHRU */
37d6f666
WM
1881 default:
1882 return;
1883 }
f6d98484
JJ
1884
1885 size_in_bytes = int_size_in_bytes (type);
40f9f6bb 1886 if (size_in_bytes <= 0)
f6d98484
JJ
1887 return;
1888
f6d98484
JJ
1889 HOST_WIDE_INT bitsize, bitpos;
1890 tree offset;
1891 enum machine_mode mode;
1892 int volatilep = 0, unsignedp = 0;
59b36ecf 1893 tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset,
b3ecff82 1894 &mode, &unsignedp, &volatilep, false);
40f9f6bb
JJ
1895 if (((size_in_bytes & (size_in_bytes - 1)) == 0
1896 && (bitpos % (size_in_bytes * BITS_PER_UNIT)))
25ae5027 1897 || bitsize != size_in_bytes * BITS_PER_UNIT)
1fe04fdc
JJ
1898 {
1899 if (TREE_CODE (t) == COMPONENT_REF
1900 && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
1901 {
1902 tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
1903 instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
1904 TREE_OPERAND (t, 0), repr,
1905 NULL_TREE), location, is_store);
1906 }
1907 return;
1908 }
40f9f6bb
JJ
1909 if (bitpos % BITS_PER_UNIT)
1910 return;
f6d98484 1911
59b36ecf
JJ
1912 if (TREE_CODE (inner) == VAR_DECL
1913 && offset == NULL_TREE
1914 && bitpos >= 0
1915 && DECL_SIZE (inner)
1916 && tree_fits_shwi_p (DECL_SIZE (inner))
1917 && bitpos + bitsize <= tree_to_shwi (DECL_SIZE (inner)))
1918 {
1919 if (DECL_THREAD_LOCAL_P (inner))
1920 return;
1921 if (!TREE_STATIC (inner))
1922 {
1923 /* Automatic vars in the current function will be always
1924 accessible. */
1925 if (decl_function_context (inner) == current_function_decl)
1926 return;
1927 }
1928 /* Always instrument external vars, they might be dynamically
1929 initialized. */
1930 else if (!DECL_EXTERNAL (inner))
1931 {
1932 /* For static vars if they are known not to be dynamically
1933 initialized, they will be always accessible. */
2c8326a5 1934 varpool_node *vnode = varpool_get_node (inner);
59b36ecf
JJ
1935 if (vnode && !vnode->dynamically_initialized)
1936 return;
1937 }
1938 }
1939
f6d98484 1940 base = build_fold_addr_expr (t);
bdcbe80c
DS
1941 if (!has_mem_ref_been_instrumented (base, size_in_bytes))
1942 {
8946c29e
YG
1943 unsigned int align = get_object_alignment (t);
1944 build_check_stmt (location, base, NULL_TREE, size_in_bytes, iter,
1945 /*non_zero_len_p*/size_in_bytes > 0, /*before_p=*/true,
1946 is_store, /*is_scalar_access*/true, align);
bdcbe80c
DS
1947 update_mem_ref_hash_table (base, size_in_bytes);
1948 update_mem_ref_hash_table (t, size_in_bytes);
1949 }
1950
25ae5027
DS
1951}
1952
1953/* Instrument an access to a contiguous memory region that starts at
1954 the address pointed to by BASE, over a length of LEN (expressed in
1955 the sizeof (*BASE) bytes). ITER points to the instruction before
1956 which the instrumentation instructions must be inserted. LOCATION
1957 is the source location that the instrumentation instructions must
1958 have. If IS_STORE is true, then the memory access is a store;
1959 otherwise, it's a load. */
1960
1961static void
1962instrument_mem_region_access (tree base, tree len,
1963 gimple_stmt_iterator *iter,
1964 location_t location, bool is_store)
1965{
c63d3b96
JJ
1966 if (!POINTER_TYPE_P (TREE_TYPE (base))
1967 || !INTEGRAL_TYPE_P (TREE_TYPE (len))
1968 || integer_zerop (len))
25ae5027
DS
1969 return;
1970
bdcbe80c
DS
1971 /* If the beginning of the memory region has already been
1972 instrumented, do not instrument it. */
b41288b3
JJ
1973 bool start_instrumented = has_mem_ref_been_instrumented (base, 1);
1974
1975 /* If the end of the memory region has already been instrumented, do
8946c29e 1976 not instrument it. */
b41288b3
JJ
1977 tree end = asan_mem_ref_get_end (base, len);
1978 bool end_instrumented = has_mem_ref_been_instrumented (end, 1);
1979
8946c29e 1980 HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
bdcbe80c 1981
8946c29e
YG
1982 build_check_stmt (location, base, len, size_in_bytes, iter,
1983 /*non_zero_len_p*/size_in_bytes > 0, /*before_p*/true,
1984 is_store, /*is_scalar_access*/false, /*align*/0,
1985 start_instrumented, end_instrumented);
25ae5027 1986
8946c29e
YG
1987 update_mem_ref_hash_table (base, 1);
1988 if (size_in_bytes != -1)
b41288b3
JJ
1989 update_mem_ref_hash_table (end, 1);
1990
1991 *iter = gsi_for_stmt (gsi_stmt (*iter));
bdcbe80c 1992}
25ae5027 1993
bdcbe80c
DS
1994/* Instrument the call (to the builtin strlen function) pointed to by
1995 ITER.
25ae5027 1996
bdcbe80c
DS
1997 This function instruments the access to the first byte of the
1998 argument, right before the call. After the call it instruments the
1999 access to the last byte of the argument; it uses the result of the
2000 call to deduce the offset of that last byte.
25ae5027 2001
99c2bd54 2002 Upon completion, iff the call has actually been instrumented, this
bdcbe80c
DS
2003 function returns TRUE and *ITER points to the statement logically
2004 following the built-in strlen function call *ITER was initially
2005 pointing to. Otherwise, the function returns FALSE and *ITER
2006 remains unchanged. */
25ae5027 2007
bdcbe80c
DS
2008static bool
2009instrument_strlen_call (gimple_stmt_iterator *iter)
2010{
2011 gimple call = gsi_stmt (*iter);
2012 gcc_assert (is_gimple_call (call));
25ae5027 2013
bdcbe80c
DS
2014 tree callee = gimple_call_fndecl (call);
2015 gcc_assert (is_builtin_fn (callee)
2016 && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
2017 && DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN);
25ae5027 2018
bdcbe80c
DS
2019 tree len = gimple_call_lhs (call);
2020 if (len == NULL)
2021 /* Some passes might clear the return value of the strlen call;
2022 bail out in that case. Return FALSE as we are not advancing
2023 *ITER. */
2024 return false;
2025 gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (len)));
25ae5027 2026
bdcbe80c
DS
2027 location_t loc = gimple_location (call);
2028 tree str_arg = gimple_call_arg (call, 0);
25ae5027 2029
99c2bd54 2030 tree cptr_type = build_pointer_type (char_type_node);
bdcbe80c
DS
2031 gimple str_arg_ssa =
2032 gimple_build_assign_with_ops (NOP_EXPR,
99c2bd54 2033 make_ssa_name (cptr_type, NULL),
bdcbe80c
DS
2034 str_arg, NULL);
2035 gimple_set_location (str_arg_ssa, loc);
8946c29e 2036 gsi_insert_before (iter, str_arg_ssa, GSI_SAME_STMT);
25ae5027 2037
8946c29e
YG
2038 build_check_stmt (loc, gimple_assign_lhs (str_arg_ssa), NULL_TREE, 1, iter,
2039 /*non_zero_len_p*/true, /*before_p=*/true,
0cbf438b 2040 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0);
25ae5027 2041
0cbf438b
YG
2042 gimple g =
2043 gimple_build_assign_with_ops (POINTER_PLUS_EXPR,
2044 make_ssa_name (cptr_type, NULL),
2045 gimple_assign_lhs (str_arg_ssa),
2046 len);
2047 gimple_set_location (g, loc);
2048 gsi_insert_after (iter, g, GSI_NEW_STMT);
8946c29e 2049
0cbf438b 2050 build_check_stmt (loc, gimple_assign_lhs (g), NULL_TREE, 1, iter,
8946c29e 2051 /*non_zero_len_p*/true, /*before_p=*/false,
0cbf438b 2052 /*is_store=*/false, /*is_scalar_access*/true, /*align*/0);
8946c29e 2053
bdcbe80c
DS
2054 return true;
2055}
25ae5027 2056
bdcbe80c
DS
2057/* Instrument the call to a built-in memory access function that is
2058 pointed to by the iterator ITER.
25ae5027 2059
bdcbe80c
DS
2060 Upon completion, return TRUE iff *ITER has been advanced to the
2061 statement following the one it was originally pointing to. */
25ae5027 2062
bdcbe80c
DS
2063static bool
2064instrument_builtin_call (gimple_stmt_iterator *iter)
2065{
b5ebc991
MO
2066 if (!ASAN_MEMINTRIN)
2067 return false;
2068
bdcbe80c
DS
2069 bool iter_advanced_p = false;
2070 gimple call = gsi_stmt (*iter);
25ae5027 2071
bdcbe80c 2072 gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
25ae5027 2073
bdcbe80c
DS
2074 tree callee = gimple_call_fndecl (call);
2075 location_t loc = gimple_location (call);
25ae5027 2076
bdcbe80c
DS
2077 if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STRLEN)
2078 iter_advanced_p = instrument_strlen_call (iter);
2079 else
25ae5027 2080 {
bdcbe80c
DS
2081 asan_mem_ref src0, src1, dest;
2082 asan_mem_ref_init (&src0, NULL, 1);
2083 asan_mem_ref_init (&src1, NULL, 1);
2084 asan_mem_ref_init (&dest, NULL, 1);
2085
2086 tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
2087 bool src0_is_store = false, src1_is_store = false,
2088 dest_is_store = false, dest_is_deref = false;
2089
2090 if (get_mem_refs_of_builtin_call (call,
2091 &src0, &src0_len, &src0_is_store,
8fb06726 2092 &src1, &src1_len, &src1_is_store,
bdcbe80c
DS
2093 &dest, &dest_len, &dest_is_store,
2094 &dest_is_deref))
2095 {
2096 if (dest_is_deref)
2097 {
2098 instrument_derefs (iter, dest.start, loc, dest_is_store);
2099 gsi_next (iter);
2100 iter_advanced_p = true;
2101 }
2102 else if (src0_len || src1_len || dest_len)
2103 {
b41288b3 2104 if (src0.start != NULL_TREE)
bdcbe80c
DS
2105 instrument_mem_region_access (src0.start, src0_len,
2106 iter, loc, /*is_store=*/false);
2107 if (src1.start != NULL_TREE)
2108 instrument_mem_region_access (src1.start, src1_len,
2109 iter, loc, /*is_store=*/false);
2110 if (dest.start != NULL_TREE)
2111 instrument_mem_region_access (dest.start, dest_len,
2112 iter, loc, /*is_store=*/true);
2113 *iter = gsi_for_stmt (call);
2114 gsi_next (iter);
2115 iter_advanced_p = true;
2116 }
2117 }
25ae5027 2118 }
bdcbe80c 2119 return iter_advanced_p;
25ae5027
DS
2120}
2121
2122/* Instrument the assignment statement ITER if it is subject to
bdcbe80c
DS
2123 instrumentation. Return TRUE iff instrumentation actually
2124 happened. In that case, the iterator ITER is advanced to the next
2125 logical expression following the one initially pointed to by ITER,
2126 and the relevant memory reference that which access has been
2127 instrumented is added to the memory references hash table. */
25ae5027 2128
bdcbe80c
DS
2129static bool
2130maybe_instrument_assignment (gimple_stmt_iterator *iter)
25ae5027
DS
2131{
2132 gimple s = gsi_stmt (*iter);
2133
2134 gcc_assert (gimple_assign_single_p (s));
2135
bdcbe80c
DS
2136 tree ref_expr = NULL_TREE;
2137 bool is_store, is_instrumented = false;
2138
52f2e7e1 2139 if (gimple_store_p (s))
bdcbe80c
DS
2140 {
2141 ref_expr = gimple_assign_lhs (s);
2142 is_store = true;
2143 instrument_derefs (iter, ref_expr,
2144 gimple_location (s),
2145 is_store);
2146 is_instrumented = true;
2147 }
2148
52f2e7e1 2149 if (gimple_assign_load_p (s))
bdcbe80c
DS
2150 {
2151 ref_expr = gimple_assign_rhs1 (s);
2152 is_store = false;
2153 instrument_derefs (iter, ref_expr,
2154 gimple_location (s),
2155 is_store);
2156 is_instrumented = true;
2157 }
2158
2159 if (is_instrumented)
2160 gsi_next (iter);
2161
2162 return is_instrumented;
25ae5027
DS
2163}
2164
2165/* Instrument the function call pointed to by the iterator ITER, if it
2166 is subject to instrumentation. At the moment, the only function
2167 calls that are instrumented are some built-in functions that access
2168 memory. Look at instrument_builtin_call to learn more.
2169
2170 Upon completion return TRUE iff *ITER was advanced to the statement
2171 following the one it was originally pointing to. */
2172
2173static bool
2174maybe_instrument_call (gimple_stmt_iterator *iter)
2175{
2b2571c9 2176 gimple stmt = gsi_stmt (*iter);
bdcbe80c
DS
2177 bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
2178
2179 if (is_builtin && instrument_builtin_call (iter))
2b2571c9 2180 return true;
bdcbe80c 2181
2b2571c9
JJ
2182 if (gimple_call_noreturn_p (stmt))
2183 {
2184 if (is_builtin)
2185 {
2186 tree callee = gimple_call_fndecl (stmt);
2187 switch (DECL_FUNCTION_CODE (callee))
2188 {
2189 case BUILT_IN_UNREACHABLE:
2190 case BUILT_IN_TRAP:
2191 /* Don't instrument these. */
2192 return false;
2193 }
2194 }
2195 tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN);
2196 gimple g = gimple_build_call (decl, 0);
2197 gimple_set_location (g, gimple_location (stmt));
2198 gsi_insert_before (iter, g, GSI_SAME_STMT);
2199 }
25ae5027 2200 return false;
37d6f666
WM
2201}
2202
bdcbe80c
DS
2203/* Walk each instruction of all basic block and instrument those that
2204 represent memory references: loads, stores, or function calls.
2205 In a given basic block, this function avoids instrumenting memory
2206 references that have already been instrumented. */
37d6f666
WM
2207
2208static void
2209transform_statements (void)
2210{
c4bfe8bf 2211 basic_block bb, last_bb = NULL;
37d6f666 2212 gimple_stmt_iterator i;
8b1c6fd7 2213 int saved_last_basic_block = last_basic_block_for_fn (cfun);
37d6f666 2214
11cd3bed 2215 FOR_EACH_BB_FN (bb, cfun)
37d6f666 2216 {
c4bfe8bf 2217 basic_block prev_bb = bb;
bdcbe80c 2218
37d6f666 2219 if (bb->index >= saved_last_basic_block) continue;
c4bfe8bf
JJ
2220
2221 /* Flush the mem ref hash table, if current bb doesn't have
2222 exactly one predecessor, or if that predecessor (skipping
2223 over asan created basic blocks) isn't the last processed
2224 basic block. Thus we effectively flush on extended basic
2225 block boundaries. */
2226 while (single_pred_p (prev_bb))
2227 {
2228 prev_bb = single_pred (prev_bb);
2229 if (prev_bb->index < saved_last_basic_block)
2230 break;
2231 }
2232 if (prev_bb != last_bb)
2233 empty_mem_ref_hash_table ();
2234 last_bb = bb;
2235
25ae5027 2236 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
497a1c66 2237 {
25ae5027
DS
2238 gimple s = gsi_stmt (i);
2239
bdcbe80c
DS
2240 if (has_stmt_been_instrumented_p (s))
2241 gsi_next (&i);
2242 else if (gimple_assign_single_p (s)
2243 && maybe_instrument_assignment (&i))
2244 /* Nothing to do as maybe_instrument_assignment advanced
2245 the iterator I. */;
2246 else if (is_gimple_call (s) && maybe_instrument_call (&i))
2247 /* Nothing to do as maybe_instrument_call
2248 advanced the iterator I. */;
2249 else
25ae5027 2250 {
bdcbe80c
DS
2251 /* No instrumentation happened.
2252
c4bfe8bf
JJ
2253 If the current instruction is a function call that
2254 might free something, let's forget about the memory
2255 references that got instrumented. Otherwise we might
2256 miss some instrumentation opportunities. */
2257 if (is_gimple_call (s) && !nonfreeing_call_p (s))
bdcbe80c
DS
2258 empty_mem_ref_hash_table ();
2259
2260 gsi_next (&i);
25ae5027 2261 }
497a1c66 2262 }
37d6f666 2263 }
bdcbe80c 2264 free_mem_ref_resources ();
37d6f666
WM
2265}
2266
59b36ecf
JJ
2267/* Build
2268 __asan_before_dynamic_init (module_name)
2269 or
2270 __asan_after_dynamic_init ()
2271 call. */
2272
2273tree
2274asan_dynamic_init_call (bool after_p)
2275{
2276 tree fn = builtin_decl_implicit (after_p
2277 ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
2278 : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT);
2279 tree module_name_cst = NULL_TREE;
2280 if (!after_p)
2281 {
2282 pretty_printer module_name_pp;
2283 pp_string (&module_name_pp, main_input_filename);
2284
2285 if (shadow_ptr_types[0] == NULL_TREE)
2286 asan_init_shadow_ptr_types ();
2287 module_name_cst = asan_pp_string (&module_name_pp);
2288 module_name_cst = fold_convert (const_ptr_type_node,
2289 module_name_cst);
2290 }
2291
2292 return build_call_expr (fn, after_p ? 0 : 1, module_name_cst);
2293}
2294
8240018b
JJ
2295/* Build
2296 struct __asan_global
2297 {
2298 const void *__beg;
2299 uptr __size;
2300 uptr __size_with_redzone;
2301 const void *__name;
ef1b3fda 2302 const void *__module_name;
8240018b
JJ
2303 uptr __has_dynamic_init;
2304 } type. */
2305
2306static tree
2307asan_global_struct (void)
2308{
ef1b3fda 2309 static const char *field_names[6]
8240018b 2310 = { "__beg", "__size", "__size_with_redzone",
ef1b3fda
KS
2311 "__name", "__module_name", "__has_dynamic_init" };
2312 tree fields[6], ret;
8240018b
JJ
2313 int i;
2314
2315 ret = make_node (RECORD_TYPE);
ef1b3fda 2316 for (i = 0; i < 6; i++)
8240018b
JJ
2317 {
2318 fields[i]
2319 = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
2320 get_identifier (field_names[i]),
2321 (i == 0 || i == 3) ? const_ptr_type_node
de5a5fa1 2322 : pointer_sized_int_node);
8240018b
JJ
2323 DECL_CONTEXT (fields[i]) = ret;
2324 if (i)
2325 DECL_CHAIN (fields[i - 1]) = fields[i];
2326 }
2327 TYPE_FIELDS (ret) = fields[0];
2328 TYPE_NAME (ret) = get_identifier ("__asan_global");
2329 layout_type (ret);
2330 return ret;
2331}
2332
2333/* Append description of a single global DECL into vector V.
2334 TYPE is __asan_global struct type as returned by asan_global_struct. */
2335
2336static void
9771b263 2337asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
8240018b
JJ
2338{
2339 tree init, uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
2340 unsigned HOST_WIDE_INT size;
ef1b3fda 2341 tree str_cst, module_name_cst, refdecl = decl;
9771b263 2342 vec<constructor_elt, va_gc> *vinner = NULL;
8240018b 2343
ef1b3fda 2344 pretty_printer asan_pp, module_name_pp;
8240018b 2345
8240018b 2346 if (DECL_NAME (decl))
b066401f 2347 pp_tree_identifier (&asan_pp, DECL_NAME (decl));
8240018b
JJ
2348 else
2349 pp_string (&asan_pp, "<unknown>");
11a877b3 2350 str_cst = asan_pp_string (&asan_pp);
8240018b 2351
ef1b3fda
KS
2352 pp_string (&module_name_pp, main_input_filename);
2353 module_name_cst = asan_pp_string (&module_name_pp);
2354
8240018b
JJ
2355 if (asan_needs_local_alias (decl))
2356 {
2357 char buf[20];
9771b263 2358 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
8240018b
JJ
2359 refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
2360 VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
2361 TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
2362 TREE_READONLY (refdecl) = TREE_READONLY (decl);
2363 TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
2364 DECL_GIMPLE_REG_P (refdecl) = DECL_GIMPLE_REG_P (decl);
2365 DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
2366 DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
2367 TREE_STATIC (refdecl) = 1;
2368 TREE_PUBLIC (refdecl) = 0;
2369 TREE_USED (refdecl) = 1;
2370 assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
2371 }
2372
2373 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2374 fold_convert (const_ptr_type_node,
2375 build_fold_addr_expr (refdecl)));
ae7e9ddd 2376 size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
8240018b
JJ
2377 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2378 size += asan_red_zone_size (size);
2379 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
2380 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2381 fold_convert (const_ptr_type_node, str_cst));
ef1b3fda
KS
2382 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2383 fold_convert (const_ptr_type_node, module_name_cst));
2c8326a5 2384 varpool_node *vnode = varpool_get_node (decl);
59b36ecf
JJ
2385 int has_dynamic_init = vnode ? vnode->dynamically_initialized : 0;
2386 CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
2387 build_int_cst (uptr, has_dynamic_init));
8240018b
JJ
2388 init = build_constructor (type, vinner);
2389 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
2390}
2391
0e668eaf
JJ
2392/* Initialize sanitizer.def builtins if the FE hasn't initialized them. */
2393void
2394initialize_sanitizer_builtins (void)
2395{
2396 tree decl;
2397
2398 if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
2399 return;
2400
2401 tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
2402 tree BT_FN_VOID_PTR
2403 = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
59b36ecf
JJ
2404 tree BT_FN_VOID_CONST_PTR
2405 = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
b906f4ca
MP
2406 tree BT_FN_VOID_PTR_PTR
2407 = build_function_type_list (void_type_node, ptr_type_node,
2408 ptr_type_node, NULL_TREE);
de5a5fa1
MP
2409 tree BT_FN_VOID_PTR_PTR_PTR
2410 = build_function_type_list (void_type_node, ptr_type_node,
2411 ptr_type_node, ptr_type_node, NULL_TREE);
0e668eaf
JJ
2412 tree BT_FN_VOID_PTR_PTRMODE
2413 = build_function_type_list (void_type_node, ptr_type_node,
de5a5fa1 2414 pointer_sized_int_node, NULL_TREE);
c954bddd
JJ
2415 tree BT_FN_VOID_INT
2416 = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
2417 tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
2418 tree BT_FN_IX_CONST_VPTR_INT[5];
2419 tree BT_FN_IX_VPTR_IX_INT[5];
2420 tree BT_FN_VOID_VPTR_IX_INT[5];
2421 tree vptr
2422 = build_pointer_type (build_qualified_type (void_type_node,
2423 TYPE_QUAL_VOLATILE));
2424 tree cvptr
2425 = build_pointer_type (build_qualified_type (void_type_node,
2426 TYPE_QUAL_VOLATILE
2427 |TYPE_QUAL_CONST));
2428 tree boolt
2429 = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
2430 int i;
2431 for (i = 0; i < 5; i++)
2432 {
2433 tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
2434 BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
2435 = build_function_type_list (boolt, vptr, ptr_type_node, ix,
2436 integer_type_node, integer_type_node,
2437 NULL_TREE);
2438 BT_FN_IX_CONST_VPTR_INT[i]
2439 = build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
2440 BT_FN_IX_VPTR_IX_INT[i]
2441 = build_function_type_list (ix, vptr, ix, integer_type_node,
2442 NULL_TREE);
2443 BT_FN_VOID_VPTR_IX_INT[i]
2444 = build_function_type_list (void_type_node, vptr, ix,
2445 integer_type_node, NULL_TREE);
2446 }
2447#define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
2448#define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
2449#define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
2450#define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
2451#define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
2452#define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
2453#define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
2454#define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
2455#define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
2456#define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
2457#define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
2458#define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
2459#define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
2460#define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
2461#define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
2462#define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
2463#define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
2464#define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
2465#define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
2466#define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
0e668eaf
JJ
2467#undef ATTR_NOTHROW_LEAF_LIST
2468#define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
bc77608b
JJ
2469#undef ATTR_TMPURE_NOTHROW_LEAF_LIST
2470#define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
0e668eaf
JJ
2471#undef ATTR_NORETURN_NOTHROW_LEAF_LIST
2472#define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
bc77608b
JJ
2473#undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
2474#define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
2475 ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
de5a5fa1
MP
2476#undef ATTR_COLD_NOTHROW_LEAF_LIST
2477#define ATTR_COLD_NOTHROW_LEAF_LIST \
2478 /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
2479#undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
2480#define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
2481 /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
0e668eaf
JJ
2482#undef DEF_SANITIZER_BUILTIN
2483#define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
2484 decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM, \
2485 BUILT_IN_NORMAL, NAME, NULL_TREE); \
2486 set_call_expr_flags (decl, ATTRS); \
2487 set_builtin_decl (ENUM, decl, true);
2488
2489#include "sanitizer.def"
2490
2491#undef DEF_SANITIZER_BUILTIN
2492}
2493
94fce891
JJ
2494/* Called via htab_traverse. Count number of emitted
2495 STRING_CSTs in the constant hash table. */
2496
2497static int
2498count_string_csts (void **slot, void *data)
2499{
2500 struct constant_descriptor_tree *desc
2501 = (struct constant_descriptor_tree *) *slot;
2502 if (TREE_CODE (desc->value) == STRING_CST
2503 && TREE_ASM_WRITTEN (desc->value)
2504 && asan_protect_global (desc->value))
2505 ++*((unsigned HOST_WIDE_INT *) data);
2506 return 1;
2507}
2508
2509/* Helper structure to pass two parameters to
2510 add_string_csts. */
2511
2512struct asan_add_string_csts_data
2513{
2514 tree type;
2515 vec<constructor_elt, va_gc> *v;
2516};
2517
2518/* Called via htab_traverse. Call asan_add_global
2519 on emitted STRING_CSTs from the constant hash table. */
2520
2521static int
2522add_string_csts (void **slot, void *data)
2523{
2524 struct constant_descriptor_tree *desc
2525 = (struct constant_descriptor_tree *) *slot;
2526 if (TREE_CODE (desc->value) == STRING_CST
2527 && TREE_ASM_WRITTEN (desc->value)
2528 && asan_protect_global (desc->value))
2529 {
2530 struct asan_add_string_csts_data *aascd
2531 = (struct asan_add_string_csts_data *) data;
2532 asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
2533 aascd->type, aascd->v);
2534 }
2535 return 1;
2536}
2537
8240018b
JJ
2538/* Needs to be GTY(()), because cgraph_build_static_cdtor may
2539 invoke ggc_collect. */
2540static GTY(()) tree asan_ctor_statements;
2541
37d6f666 2542/* Module-level instrumentation.
ef1b3fda 2543 - Insert __asan_init_vN() into the list of CTORs.
37d6f666
WM
2544 - TODO: insert redzones around globals.
2545 */
2546
2547void
2548asan_finish_file (void)
2549{
2c8326a5 2550 varpool_node *vnode;
8240018b
JJ
2551 unsigned HOST_WIDE_INT gcount = 0;
2552
94fce891
JJ
2553 if (shadow_ptr_types[0] == NULL_TREE)
2554 asan_init_shadow_ptr_types ();
2555 /* Avoid instrumenting code in the asan ctors/dtors.
2556 We don't need to insert padding after the description strings,
2557 nor after .LASAN* array. */
de5a5fa1 2558 flag_sanitize &= ~SANITIZE_ADDRESS;
0e668eaf
JJ
2559
2560 tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
2561 append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
8240018b 2562 FOR_EACH_DEFINED_VARIABLE (vnode)
67348ccc
DM
2563 if (TREE_ASM_WRITTEN (vnode->decl)
2564 && asan_protect_global (vnode->decl))
8240018b 2565 ++gcount;
94fce891
JJ
2566 htab_t const_desc_htab = constant_pool_htab ();
2567 htab_traverse (const_desc_htab, count_string_csts, &gcount);
8240018b
JJ
2568 if (gcount)
2569 {
0e668eaf 2570 tree type = asan_global_struct (), var, ctor;
8240018b 2571 tree dtor_statements = NULL_TREE;
9771b263 2572 vec<constructor_elt, va_gc> *v;
8240018b
JJ
2573 char buf[20];
2574
2575 type = build_array_type_nelts (type, gcount);
2576 ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
2577 var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
2578 type);
2579 TREE_STATIC (var) = 1;
2580 TREE_PUBLIC (var) = 0;
2581 DECL_ARTIFICIAL (var) = 1;
2582 DECL_IGNORED_P (var) = 1;
9771b263 2583 vec_alloc (v, gcount);
8240018b 2584 FOR_EACH_DEFINED_VARIABLE (vnode)
67348ccc
DM
2585 if (TREE_ASM_WRITTEN (vnode->decl)
2586 && asan_protect_global (vnode->decl))
2587 asan_add_global (vnode->decl, TREE_TYPE (type), v);
94fce891
JJ
2588 struct asan_add_string_csts_data aascd;
2589 aascd.type = TREE_TYPE (type);
2590 aascd.v = v;
2591 htab_traverse (const_desc_htab, add_string_csts, &aascd);
8240018b
JJ
2592 ctor = build_constructor (type, v);
2593 TREE_CONSTANT (ctor) = 1;
2594 TREE_STATIC (ctor) = 1;
2595 DECL_INITIAL (var) = ctor;
2596 varpool_assemble_decl (varpool_node_for_decl (var));
2597
0e668eaf 2598 fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
de5a5fa1 2599 tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
0e668eaf 2600 append_to_statement_list (build_call_expr (fn, 2,
8240018b 2601 build_fold_addr_expr (var),
de5a5fa1 2602 gcount_tree),
8240018b
JJ
2603 &asan_ctor_statements);
2604
0e668eaf
JJ
2605 fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
2606 append_to_statement_list (build_call_expr (fn, 2,
8240018b 2607 build_fold_addr_expr (var),
de5a5fa1 2608 gcount_tree),
8240018b
JJ
2609 &dtor_statements);
2610 cgraph_build_static_cdtor ('D', dtor_statements,
2611 MAX_RESERVED_INIT_PRIORITY - 1);
2612 }
2613 cgraph_build_static_cdtor ('I', asan_ctor_statements,
2614 MAX_RESERVED_INIT_PRIORITY - 1);
de5a5fa1 2615 flag_sanitize |= SANITIZE_ADDRESS;
f6d98484
JJ
2616}
2617
37d6f666
WM
2618/* Instrument the current function. */
2619
2620static unsigned int
2621asan_instrument (void)
2622{
f6d98484 2623 if (shadow_ptr_types[0] == NULL_TREE)
94fce891 2624 asan_init_shadow_ptr_types ();
8946c29e 2625 asan_num_accesses = 0;
37d6f666 2626 transform_statements ();
37d6f666
WM
2627 return 0;
2628}
2629
2630static bool
2631gate_asan (void)
2632{
de5a5fa1 2633 return (flag_sanitize & SANITIZE_ADDRESS) != 0
e664c61c 2634 && !lookup_attribute ("no_sanitize_address",
77bc5132 2635 DECL_ATTRIBUTES (current_function_decl));
37d6f666
WM
2636}
2637
27a4cd48
DM
2638namespace {
2639
2640const pass_data pass_data_asan =
37d6f666 2641{
27a4cd48
DM
2642 GIMPLE_PASS, /* type */
2643 "asan", /* name */
2644 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2645 true, /* has_execute */
2646 TV_NONE, /* tv_id */
2647 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2648 0, /* properties_provided */
2649 0, /* properties_destroyed */
2650 0, /* todo_flags_start */
3bea341f 2651 TODO_update_ssa, /* todo_flags_finish */
37d6f666 2652};
f6d98484 2653
27a4cd48
DM
2654class pass_asan : public gimple_opt_pass
2655{
2656public:
c3284718
RS
2657 pass_asan (gcc::context *ctxt)
2658 : gimple_opt_pass (pass_data_asan, ctxt)
27a4cd48
DM
2659 {}
2660
2661 /* opt_pass methods: */
65d3284b 2662 opt_pass * clone () { return new pass_asan (m_ctxt); }
1a3d085c 2663 virtual bool gate (function *) { return gate_asan (); }
be55bfe6 2664 virtual unsigned int execute (function *) { return asan_instrument (); }
27a4cd48
DM
2665
2666}; // class pass_asan
2667
2668} // anon namespace
2669
2670gimple_opt_pass *
2671make_pass_asan (gcc::context *ctxt)
2672{
2673 return new pass_asan (ctxt);
2674}
2675
27a4cd48
DM
2676namespace {
2677
2678const pass_data pass_data_asan_O0 =
dfb9e332 2679{
27a4cd48
DM
2680 GIMPLE_PASS, /* type */
2681 "asan0", /* name */
2682 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
2683 true, /* has_execute */
2684 TV_NONE, /* tv_id */
2685 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2686 0, /* properties_provided */
2687 0, /* properties_destroyed */
2688 0, /* todo_flags_start */
3bea341f 2689 TODO_update_ssa, /* todo_flags_finish */
dfb9e332
JJ
2690};
2691
27a4cd48
DM
2692class pass_asan_O0 : public gimple_opt_pass
2693{
2694public:
c3284718
RS
2695 pass_asan_O0 (gcc::context *ctxt)
2696 : gimple_opt_pass (pass_data_asan_O0, ctxt)
27a4cd48
DM
2697 {}
2698
2699 /* opt_pass methods: */
1a3d085c 2700 virtual bool gate (function *) { return !optimize && gate_asan (); }
be55bfe6 2701 virtual unsigned int execute (function *) { return asan_instrument (); }
27a4cd48
DM
2702
2703}; // class pass_asan_O0
2704
2705} // anon namespace
2706
2707gimple_opt_pass *
2708make_pass_asan_O0 (gcc::context *ctxt)
2709{
2710 return new pass_asan_O0 (ctxt);
2711}
2712
b9a55b13
MP
2713/* Perform optimization of sanitize functions. */
2714
be55bfe6
TS
2715namespace {
2716
2717const pass_data pass_data_sanopt =
2718{
2719 GIMPLE_PASS, /* type */
2720 "sanopt", /* name */
2721 OPTGROUP_NONE, /* optinfo_flags */
2722 true, /* has_execute */
2723 TV_NONE, /* tv_id */
2724 ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
2725 0, /* properties_provided */
2726 0, /* properties_destroyed */
2727 0, /* todo_flags_start */
3bea341f 2728 TODO_update_ssa, /* todo_flags_finish */
be55bfe6
TS
2729};
2730
2731class pass_sanopt : public gimple_opt_pass
2732{
2733public:
2734 pass_sanopt (gcc::context *ctxt)
2735 : gimple_opt_pass (pass_data_sanopt, ctxt)
2736 {}
2737
2738 /* opt_pass methods: */
2739 virtual bool gate (function *) { return flag_sanitize; }
2740 virtual unsigned int execute (function *);
2741
2742}; // class pass_sanopt
2743
2744unsigned int
2745pass_sanopt::execute (function *fun)
b9a55b13
MP
2746{
2747 basic_block bb;
2748
be55bfe6 2749 FOR_EACH_BB_FN (bb, fun)
b9a55b13
MP
2750 {
2751 gimple_stmt_iterator gsi;
2752 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2753 {
2754 gimple stmt = gsi_stmt (gsi);
2755
2756 if (!is_gimple_call (stmt))
2757 continue;
2758
2759 if (gimple_call_internal_p (stmt))
2760 switch (gimple_call_internal_fn (stmt))
2761 {
2762 case IFN_UBSAN_NULL:
2763 ubsan_expand_null_ifn (gsi);
2764 break;
0e37a2f3
MP
2765 case IFN_UBSAN_BOUNDS:
2766 ubsan_expand_bounds_ifn (&gsi);
2767 break;
b9a55b13
MP
2768 default:
2769 break;
2770 }
2771
2772 if (dump_file && (dump_flags & TDF_DETAILS))
2773 {
2774 fprintf (dump_file, "Optimized\n ");
2775 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
2776 fprintf (dump_file, "\n");
2777 }
0e37a2f3
MP
2778
2779 /* ubsan_expand_bounds_ifn might move us to the end of the BB. */
2780 if (gsi_end_p (gsi))
2781 break;
b9a55b13
MP
2782 }
2783 }
2784 return 0;
2785}
2786
b9a55b13
MP
2787} // anon namespace
2788
2789gimple_opt_pass *
2790make_pass_sanopt (gcc::context *ctxt)
2791{
2792 return new pass_sanopt (ctxt);
2793}
2794
f6d98484 2795#include "gt-asan.h"
This page took 0.676344 seconds and 5 git commands to generate.