xref: /netbsd-src/external/gpl3/gcc/dist/gcc/asan.cc (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /* AddressSanitizer, a fast memory error detector.
2    Copyright (C) 2012-2022 Free Software Foundation, Inc.
3    Contributed by Kostya Serebryany <kcc@google.com>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "target.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "gimple.h"
30 #include "cfghooks.h"
31 #include "alloc-pool.h"
32 #include "tree-pass.h"
33 #include "memmodel.h"
34 #include "tm_p.h"
35 #include "ssa.h"
36 #include "stringpool.h"
37 #include "tree-ssanames.h"
38 #include "optabs.h"
39 #include "emit-rtl.h"
40 #include "cgraph.h"
41 #include "gimple-pretty-print.h"
42 #include "alias.h"
43 #include "fold-const.h"
44 #include "cfganal.h"
45 #include "gimplify.h"
46 #include "gimple-iterator.h"
47 #include "varasm.h"
48 #include "stor-layout.h"
49 #include "tree-iterator.h"
50 #include "stringpool.h"
51 #include "attribs.h"
52 #include "asan.h"
53 #include "dojump.h"
54 #include "explow.h"
55 #include "expr.h"
56 #include "output.h"
57 #include "langhooks.h"
58 #include "cfgloop.h"
59 #include "gimple-builder.h"
60 #include "gimple-fold.h"
61 #include "ubsan.h"
62 #include "builtins.h"
63 #include "fnmatch.h"
64 #include "tree-inline.h"
65 #include "tree-ssa.h"
66 #include "tree-eh.h"
67 #include "diagnostic-core.h"
68 
69 /* AddressSanitizer finds out-of-bounds and use-after-free bugs
70    with <2x slowdown on average.
71 
72    The tool consists of two parts:
73    instrumentation module (this file) and a run-time library.
74    The instrumentation module adds a run-time check before every memory insn.
75      For a 8- or 16- byte load accessing address X:
76        ShadowAddr = (X >> 3) + Offset
77        ShadowValue = *(char*)ShadowAddr;  // *(short*) for 16-byte access.
78        if (ShadowValue)
79 	 __asan_report_load8(X);
80      For a load of N bytes (N=1, 2 or 4) from address X:
81        ShadowAddr = (X >> 3) + Offset
82        ShadowValue = *(char*)ShadowAddr;
83        if (ShadowValue)
84 	 if ((X & 7) + N - 1 > ShadowValue)
85 	   __asan_report_loadN(X);
86    Stores are instrumented similarly, but using __asan_report_storeN functions.
87    A call too __asan_init_vN() is inserted to the list of module CTORs.
88    N is the version number of the AddressSanitizer API. The changes between the
89    API versions are listed in libsanitizer/asan/asan_interface_internal.h.
90 
91    The run-time library redefines malloc (so that redzone are inserted around
92    the allocated memory) and free (so that reuse of free-ed memory is delayed),
93    provides __asan_report* and __asan_init_vN functions.
94 
95    Read more:
96    http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm
97 
98    The current implementation supports detection of out-of-bounds and
99    use-after-free in the heap, on the stack and for global variables.
100 
101    [Protection of stack variables]
102 
103    To understand how detection of out-of-bounds and use-after-free works
104    for stack variables, lets look at this example on x86_64 where the
105    stack grows downward:
106 
107      int
108      foo ()
109      {
110        char a[24] = {0};
111        int b[2] = {0};
112 
113        a[5] = 1;
114        b[1] = 2;
115 
116        return a[5] + b[1];
117      }
118 
119    For this function, the stack protected by asan will be organized as
120    follows, from the top of the stack to the bottom:
121 
122    Slot 1/ [red zone of 32 bytes called 'RIGHT RedZone']
123 
124    Slot 2/ [8 bytes of red zone, that adds up to the space of 'a' to make
125 	   the next slot be 32 bytes aligned; this one is called Partial
126 	   Redzone; this 32 bytes alignment is an asan constraint]
127 
128    Slot 3/ [24 bytes for variable 'a']
129 
130    Slot 4/ [red zone of 32 bytes called 'Middle RedZone']
131 
132    Slot 5/ [24 bytes of Partial Red Zone (similar to slot 2]
133 
134    Slot 6/ [8 bytes for variable 'b']
135 
136    Slot 7/ [32 bytes of Red Zone at the bottom of the stack, called
137 	    'LEFT RedZone']
138 
139    The 32 bytes of LEFT red zone at the bottom of the stack can be
140    decomposed as such:
141 
142      1/ The first 8 bytes contain a magical asan number that is always
143      0x41B58AB3.
144 
145      2/ The following 8 bytes contains a pointer to a string (to be
146      parsed at runtime by the runtime asan library), which format is
147      the following:
148 
149       "<function-name> <space> <num-of-variables-on-the-stack>
150       (<32-bytes-aligned-offset-in-bytes-of-variable> <space>
151       <length-of-var-in-bytes> ){n} "
152 
153 	where '(...){n}' means the content inside the parenthesis occurs 'n'
154 	times, with 'n' being the number of variables on the stack.
155 
156      3/ The following 8 bytes contain the PC of the current function which
157      will be used by the run-time library to print an error message.
158 
159      4/ The following 8 bytes are reserved for internal use by the run-time.
160 
161    The shadow memory for that stack layout is going to look like this:
162 
163      - content of shadow memory 8 bytes for slot 7: 0xF1F1F1F1.
164        The F1 byte pattern is a magic number called
165        ASAN_STACK_MAGIC_LEFT and is a way for the runtime to know that
166        the memory for that shadow byte is part of a the LEFT red zone
167        intended to seat at the bottom of the variables on the stack.
168 
169      - content of shadow memory 8 bytes for slots 6 and 5:
170        0xF4F4F400.  The F4 byte pattern is a magic number
171        called ASAN_STACK_MAGIC_PARTIAL.  It flags the fact that the
172        memory region for this shadow byte is a PARTIAL red zone
173        intended to pad a variable A, so that the slot following
174        {A,padding} is 32 bytes aligned.
175 
176        Note that the fact that the least significant byte of this
177        shadow memory content is 00 means that 8 bytes of its
178        corresponding memory (which corresponds to the memory of
179        variable 'b') is addressable.
180 
181      - content of shadow memory 8 bytes for slot 4: 0xF2F2F2F2.
182        The F2 byte pattern is a magic number called
183        ASAN_STACK_MAGIC_MIDDLE.  It flags the fact that the memory
184        region for this shadow byte is a MIDDLE red zone intended to
185        seat between two 32 aligned slots of {variable,padding}.
186 
187      - content of shadow memory 8 bytes for slot 3 and 2:
188        0xF4000000.  This represents is the concatenation of
189        variable 'a' and the partial red zone following it, like what we
190        had for variable 'b'.  The least significant 3 bytes being 00
191        means that the 3 bytes of variable 'a' are addressable.
192 
193      - content of shadow memory 8 bytes for slot 1: 0xF3F3F3F3.
194        The F3 byte pattern is a magic number called
195        ASAN_STACK_MAGIC_RIGHT.  It flags the fact that the memory
196        region for this shadow byte is a RIGHT red zone intended to seat
197        at the top of the variables of the stack.
198 
199    Note that the real variable layout is done in expand_used_vars in
200    cfgexpand.cc.  As far as Address Sanitizer is concerned, it lays out
201    stack variables as well as the different red zones, emits some
202    prologue code to populate the shadow memory as to poison (mark as
203    non-accessible) the regions of the red zones and mark the regions of
204    stack variables as accessible, and emit some epilogue code to
205    un-poison (mark as accessible) the regions of red zones right before
206    the function exits.
207 
208    [Protection of global variables]
209 
210    The basic idea is to insert a red zone between two global variables
211    and install a constructor function that calls the asan runtime to do
212    the populating of the relevant shadow memory regions at load time.
213 
214    So the global variables are laid out as to insert a red zone between
215    them. The size of the red zones is so that each variable starts on a
216    32 bytes boundary.
217 
218    Then a constructor function is installed so that, for each global
219    variable, it calls the runtime asan library function
220    __asan_register_globals_with an instance of this type:
221 
222      struct __asan_global
223      {
224        // Address of the beginning of the global variable.
225        const void *__beg;
226 
227        // Initial size of the global variable.
228        uptr __size;
229 
230        // Size of the global variable + size of the red zone.  This
231        //   size is 32 bytes aligned.
232        uptr __size_with_redzone;
233 
234        // Name of the global variable.
235        const void *__name;
236 
237        // Name of the module where the global variable is declared.
238        const void *__module_name;
239 
240        // 1 if it has dynamic initialization, 0 otherwise.
241        uptr __has_dynamic_init;
242 
243        // A pointer to struct that contains source location, could be NULL.
244        __asan_global_source_location *__location;
245      }
246 
247    A destructor function that calls the runtime asan library function
248    _asan_unregister_globals is also installed.  */
249 
250 static unsigned HOST_WIDE_INT asan_shadow_offset_value;
251 static bool asan_shadow_offset_computed;
252 static vec<char *> sanitized_sections;
253 static tree last_alloca_addr;
254 
255 /* Set of variable declarations that are going to be guarded by
256    use-after-scope sanitizer.  */
257 
258 hash_set<tree> *asan_handled_variables = NULL;
259 
260 hash_set <tree> *asan_used_labels = NULL;
261 
262 /* Global variables for HWASAN stack tagging.  */
263 /* hwasan_frame_tag_offset records the offset from the frame base tag that the
264    next object should have.  */
265 static uint8_t hwasan_frame_tag_offset = 0;
266 /* hwasan_frame_base_ptr is a pointer with the same address as
267    `virtual_stack_vars_rtx` for the current frame, and with the frame base tag
268    stored in it.  N.b. this global RTX does not need to be marked GTY, but is
269    done so anyway.  The need is not there since all uses are in just one pass
270    (cfgexpand) and there are no calls to ggc_collect between the uses.  We mark
271    it GTY(()) anyway to allow the use of the variable later on if needed by
272    future features.  */
273 static GTY(()) rtx hwasan_frame_base_ptr = NULL_RTX;
274 /* hwasan_frame_base_init_seq is the sequence of RTL insns that will initialize
275    the hwasan_frame_base_ptr.  When the hwasan_frame_base_ptr is requested, we
276    generate this sequence but do not emit it.  If the sequence was created it
277    is emitted once the function body has been expanded.
278 
279    This delay is because the frame base pointer may be needed anywhere in the
280    function body, or needed by the expand_used_vars function.  Emitting once in
281    a known place is simpler than requiring the emission of the instructions to
282    be know where it should go depending on the first place the hwasan frame
283    base is needed.  */
284 static GTY(()) rtx_insn *hwasan_frame_base_init_seq = NULL;
285 
286 /* Structure defining the extent of one object on the stack that HWASAN needs
287    to tag in the corresponding shadow stack space.
288 
289    The range this object spans on the stack is between `untagged_base +
290    nearest_offset` and `untagged_base + farthest_offset`.
291    `tagged_base` is an rtx containing the same value as `untagged_base` but
292    with a random tag stored in the top byte.  We record both `untagged_base`
293    and `tagged_base` so that `hwasan_emit_prologue` can use both without having
294    to emit RTL into the instruction stream to re-calculate one from the other.
295    (`hwasan_emit_prologue` needs to use both bases since the
296    __hwasan_tag_memory call it emits uses an untagged value, and it calculates
297    the tag to store in shadow memory based on the tag_offset plus the tag in
298    tagged_base).  */
299 struct hwasan_stack_var
300 {
301   rtx untagged_base;
302   rtx tagged_base;
303   poly_int64 nearest_offset;
304   poly_int64 farthest_offset;
305   uint8_t tag_offset;
306 };
307 
308 /* Variable recording all stack variables that HWASAN needs to tag.
309    Does not need to be marked as GTY(()) since every use is in the cfgexpand
310    pass and gcc_collect is not called in the middle of that pass.  */
311 static vec<hwasan_stack_var> hwasan_tagged_stack_vars;
312 
313 
314 /* Sets shadow offset to value in string VAL.  */
315 
316 bool
set_asan_shadow_offset(const char * val)317 set_asan_shadow_offset (const char *val)
318 {
319   char *endp;
320 
321   errno = 0;
322 #ifdef HAVE_LONG_LONG
323   asan_shadow_offset_value = strtoull (val, &endp, 0);
324 #else
325   asan_shadow_offset_value = strtoul (val, &endp, 0);
326 #endif
327   if (!(*val != '\0' && *endp == '\0' && errno == 0))
328     return false;
329 
330   asan_shadow_offset_computed = true;
331 
332   return true;
333 }
334 
335 /* Set list of user-defined sections that need to be sanitized.  */
336 
337 void
set_sanitized_sections(const char * sections)338 set_sanitized_sections (const char *sections)
339 {
340   char *pat;
341   unsigned i;
342   FOR_EACH_VEC_ELT (sanitized_sections, i, pat)
343     free (pat);
344   sanitized_sections.truncate (0);
345 
346   for (const char *s = sections; *s; )
347     {
348       const char *end;
349       for (end = s; *end && *end != ','; ++end);
350       size_t len = end - s;
351       sanitized_sections.safe_push (xstrndup (s, len));
352       s = *end ? end + 1 : end;
353     }
354 }
355 
356 bool
asan_mark_p(gimple * stmt,enum asan_mark_flags flag)357 asan_mark_p (gimple *stmt, enum asan_mark_flags flag)
358 {
359   return (gimple_call_internal_p (stmt, IFN_ASAN_MARK)
360 	  && tree_to_uhwi (gimple_call_arg (stmt, 0)) == flag);
361 }
362 
363 bool
asan_sanitize_stack_p(void)364 asan_sanitize_stack_p (void)
365 {
366   return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_stack);
367 }
368 
369 bool
asan_sanitize_allocas_p(void)370 asan_sanitize_allocas_p (void)
371 {
372   return (asan_sanitize_stack_p () && param_asan_protect_allocas);
373 }
374 
375 bool
asan_instrument_reads(void)376 asan_instrument_reads (void)
377 {
378   return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_reads);
379 }
380 
381 bool
asan_instrument_writes(void)382 asan_instrument_writes (void)
383 {
384   return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_instrument_writes);
385 }
386 
387 bool
asan_memintrin(void)388 asan_memintrin (void)
389 {
390   return (sanitize_flags_p (SANITIZE_ADDRESS) && param_asan_memintrin);
391 }
392 
393 
394 /* Checks whether section SEC should be sanitized.  */
395 
396 static bool
section_sanitized_p(const char * sec)397 section_sanitized_p (const char *sec)
398 {
399   char *pat;
400   unsigned i;
401   FOR_EACH_VEC_ELT (sanitized_sections, i, pat)
402     if (fnmatch (pat, sec, FNM_PERIOD) == 0)
403       return true;
404   return false;
405 }
406 
407 /* Returns Asan shadow offset.  */
408 
409 static unsigned HOST_WIDE_INT
asan_shadow_offset()410 asan_shadow_offset ()
411 {
412   if (!asan_shadow_offset_computed)
413     {
414       asan_shadow_offset_computed = true;
415       asan_shadow_offset_value = targetm.asan_shadow_offset ();
416     }
417   return asan_shadow_offset_value;
418 }
419 
420 /* Returns Asan shadow offset has been set.  */
421 bool
asan_shadow_offset_set_p()422 asan_shadow_offset_set_p ()
423 {
424   return asan_shadow_offset_computed;
425 }
426 
427 alias_set_type asan_shadow_set = -1;
428 
429 /* Pointer types to 1, 2 or 4 byte integers in shadow memory.  A separate
430    alias set is used for all shadow memory accesses.  */
431 static GTY(()) tree shadow_ptr_types[3];
432 
433 /* Decl for __asan_option_detect_stack_use_after_return.  */
434 static GTY(()) tree asan_detect_stack_use_after_return;
435 
436 /* Hashtable support for memory references used by gimple
437    statements.  */
438 
439 /* This type represents a reference to a memory region.  */
440 struct asan_mem_ref
441 {
442   /* The expression of the beginning of the memory region.  */
443   tree start;
444 
445   /* The size of the access.  */
446   HOST_WIDE_INT access_size;
447 };
448 
449 object_allocator <asan_mem_ref> asan_mem_ref_pool ("asan_mem_ref");
450 
451 /* Initializes an instance of asan_mem_ref.  */
452 
453 static void
asan_mem_ref_init(asan_mem_ref * ref,tree start,HOST_WIDE_INT access_size)454 asan_mem_ref_init (asan_mem_ref *ref, tree start, HOST_WIDE_INT access_size)
455 {
456   ref->start = start;
457   ref->access_size = access_size;
458 }
459 
460 /* Allocates memory for an instance of asan_mem_ref into the memory
461    pool returned by asan_mem_ref_get_alloc_pool and initialize it.
462    START is the address of (or the expression pointing to) the
463    beginning of memory reference.  ACCESS_SIZE is the size of the
464    access to the referenced memory.  */
465 
466 static asan_mem_ref*
asan_mem_ref_new(tree start,HOST_WIDE_INT access_size)467 asan_mem_ref_new (tree start, HOST_WIDE_INT access_size)
468 {
469   asan_mem_ref *ref = asan_mem_ref_pool.allocate ();
470 
471   asan_mem_ref_init (ref, start, access_size);
472   return ref;
473 }
474 
475 /* This builds and returns a pointer to the end of the memory region
476    that starts at START and of length LEN.  */
477 
478 tree
asan_mem_ref_get_end(tree start,tree len)479 asan_mem_ref_get_end (tree start, tree len)
480 {
481   if (len == NULL_TREE || integer_zerop (len))
482     return start;
483 
484   if (!ptrofftype_p (len))
485     len = convert_to_ptrofftype (len);
486 
487   return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (start), start, len);
488 }
489 
490 /*  Return a tree expression that represents the end of the referenced
491     memory region.  Beware that this function can actually build a new
492     tree expression.  */
493 
494 tree
asan_mem_ref_get_end(const asan_mem_ref * ref,tree len)495 asan_mem_ref_get_end (const asan_mem_ref *ref, tree len)
496 {
497   return asan_mem_ref_get_end (ref->start, len);
498 }
499 
500 struct asan_mem_ref_hasher : nofree_ptr_hash <asan_mem_ref>
501 {
502   static inline hashval_t hash (const asan_mem_ref *);
503   static inline bool equal (const asan_mem_ref *, const asan_mem_ref *);
504 };
505 
506 /* Hash a memory reference.  */
507 
508 inline hashval_t
hash(const asan_mem_ref * mem_ref)509 asan_mem_ref_hasher::hash (const asan_mem_ref *mem_ref)
510 {
511   return iterative_hash_expr (mem_ref->start, 0);
512 }
513 
514 /* Compare two memory references.  We accept the length of either
515    memory references to be NULL_TREE.  */
516 
517 inline bool
equal(const asan_mem_ref * m1,const asan_mem_ref * m2)518 asan_mem_ref_hasher::equal (const asan_mem_ref *m1,
519 			    const asan_mem_ref *m2)
520 {
521   return operand_equal_p (m1->start, m2->start, 0);
522 }
523 
524 static hash_table<asan_mem_ref_hasher> *asan_mem_ref_ht;
525 
526 /* Returns a reference to the hash table containing memory references.
527    This function ensures that the hash table is created.  Note that
528    this hash table is updated by the function
529    update_mem_ref_hash_table.  */
530 
531 static hash_table<asan_mem_ref_hasher> *
get_mem_ref_hash_table()532 get_mem_ref_hash_table ()
533 {
534   if (!asan_mem_ref_ht)
535     asan_mem_ref_ht = new hash_table<asan_mem_ref_hasher> (10);
536 
537   return asan_mem_ref_ht;
538 }
539 
540 /* Clear all entries from the memory references hash table.  */
541 
542 static void
empty_mem_ref_hash_table()543 empty_mem_ref_hash_table ()
544 {
545   if (asan_mem_ref_ht)
546     asan_mem_ref_ht->empty ();
547 }
548 
549 /* Free the memory references hash table.  */
550 
551 static void
free_mem_ref_resources()552 free_mem_ref_resources ()
553 {
554   delete asan_mem_ref_ht;
555   asan_mem_ref_ht = NULL;
556 
557   asan_mem_ref_pool.release ();
558 }
559 
560 /* Return true iff the memory reference REF has been instrumented.  */
561 
562 static bool
has_mem_ref_been_instrumented(tree ref,HOST_WIDE_INT access_size)563 has_mem_ref_been_instrumented (tree ref, HOST_WIDE_INT access_size)
564 {
565   asan_mem_ref r;
566   asan_mem_ref_init (&r, ref, access_size);
567 
568   asan_mem_ref *saved_ref = get_mem_ref_hash_table ()->find (&r);
569   return saved_ref && saved_ref->access_size >= access_size;
570 }
571 
572 /* Return true iff the memory reference REF has been instrumented.  */
573 
574 static bool
has_mem_ref_been_instrumented(const asan_mem_ref * ref)575 has_mem_ref_been_instrumented (const asan_mem_ref *ref)
576 {
577   return has_mem_ref_been_instrumented (ref->start, ref->access_size);
578 }
579 
580 /* Return true iff access to memory region starting at REF and of
581    length LEN has been instrumented.  */
582 
583 static bool
has_mem_ref_been_instrumented(const asan_mem_ref * ref,tree len)584 has_mem_ref_been_instrumented (const asan_mem_ref *ref, tree len)
585 {
586   HOST_WIDE_INT size_in_bytes
587     = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
588 
589   return size_in_bytes != -1
590     && has_mem_ref_been_instrumented (ref->start, size_in_bytes);
591 }
592 
593 /* Set REF to the memory reference present in a gimple assignment
594    ASSIGNMENT.  Return true upon successful completion, false
595    otherwise.  */
596 
597 static bool
get_mem_ref_of_assignment(const gassign * assignment,asan_mem_ref * ref,bool * ref_is_store)598 get_mem_ref_of_assignment (const gassign *assignment,
599 			   asan_mem_ref *ref,
600 			   bool *ref_is_store)
601 {
602   gcc_assert (gimple_assign_single_p (assignment));
603 
604   if (gimple_store_p (assignment)
605       && !gimple_clobber_p (assignment))
606     {
607       ref->start = gimple_assign_lhs (assignment);
608       *ref_is_store = true;
609     }
610   else if (gimple_assign_load_p (assignment))
611     {
612       ref->start = gimple_assign_rhs1 (assignment);
613       *ref_is_store = false;
614     }
615   else
616     return false;
617 
618   ref->access_size = int_size_in_bytes (TREE_TYPE (ref->start));
619   return true;
620 }
621 
622 /* Return address of last allocated dynamic alloca.  */
623 
624 static tree
get_last_alloca_addr()625 get_last_alloca_addr ()
626 {
627   if (last_alloca_addr)
628     return last_alloca_addr;
629 
630   last_alloca_addr = create_tmp_reg (ptr_type_node, "last_alloca_addr");
631   gassign *g = gimple_build_assign (last_alloca_addr, null_pointer_node);
632   edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
633   gsi_insert_on_edge_immediate (e, g);
634   return last_alloca_addr;
635 }
636 
637 /* Insert __asan_allocas_unpoison (top, bottom) call before
638    __builtin_stack_restore (new_sp) call.
639    The pseudocode of this routine should look like this:
640      top = last_alloca_addr;
641      bot = new_sp;
642      __asan_allocas_unpoison (top, bot);
643      last_alloca_addr = new_sp;
644      __builtin_stack_restore (new_sp);
645    In general, we can't use new_sp as bot parameter because on some
646    architectures SP has non zero offset from dynamic stack area.  Moreover, on
647    some architectures this offset (STACK_DYNAMIC_OFFSET) becomes known for each
648    particular function only after all callees were expanded to rtl.
649    The most noticeable example is PowerPC{,64}, see
650    http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#DYNAM-STACK.
651    To overcome the issue we use following trick: pass new_sp as a second
652    parameter to __asan_allocas_unpoison and rewrite it during expansion with
653    new_sp + (virtual_dynamic_stack_rtx - sp) later in
654    expand_asan_emit_allocas_unpoison function.
655 
656    HWASAN needs to do very similar, the eventual pseudocode should be:
657       __hwasan_tag_memory (virtual_stack_dynamic_rtx,
658 			   0,
659 			   new_sp - sp);
660       __builtin_stack_restore (new_sp)
661 
662    Need to use the same trick to handle STACK_DYNAMIC_OFFSET as described
663    above.  */
664 
665 static void
handle_builtin_stack_restore(gcall * call,gimple_stmt_iterator * iter)666 handle_builtin_stack_restore (gcall *call, gimple_stmt_iterator *iter)
667 {
668   if (!iter
669       || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
670     return;
671 
672   tree restored_stack = gimple_call_arg (call, 0);
673 
674   gimple *g;
675 
676   if (hwasan_sanitize_allocas_p ())
677     {
678       enum internal_fn fn = IFN_HWASAN_ALLOCA_UNPOISON;
679       /* There is only one piece of information `expand_HWASAN_ALLOCA_UNPOISON`
680 	 needs to work.  This is the length of the area that we're
681 	 deallocating.  Since the stack pointer is known at expand time, the
682 	 position of the new stack pointer after deallocation is enough
683 	 information to calculate this length.  */
684       g = gimple_build_call_internal (fn, 1, restored_stack);
685     }
686   else
687     {
688       tree last_alloca = get_last_alloca_addr ();
689       tree fn = builtin_decl_implicit (BUILT_IN_ASAN_ALLOCAS_UNPOISON);
690       g = gimple_build_call (fn, 2, last_alloca, restored_stack);
691       gsi_insert_before (iter, g, GSI_SAME_STMT);
692       g = gimple_build_assign (last_alloca, restored_stack);
693     }
694 
695   gsi_insert_before (iter, g, GSI_SAME_STMT);
696 }
697 
698 /* Deploy and poison redzones around __builtin_alloca call.  To do this, we
699    should replace this call with another one with changed parameters and
700    replace all its uses with new address, so
701        addr = __builtin_alloca (old_size, align);
702    is replaced by
703        left_redzone_size = max (align, ASAN_RED_ZONE_SIZE);
704    Following two statements are optimized out if we know that
705    old_size & (ASAN_RED_ZONE_SIZE - 1) == 0, i.e. alloca doesn't need partial
706    redzone.
707        misalign = old_size & (ASAN_RED_ZONE_SIZE - 1);
708        partial_redzone_size = ASAN_RED_ZONE_SIZE - misalign;
709        right_redzone_size = ASAN_RED_ZONE_SIZE;
710        additional_size = left_redzone_size + partial_redzone_size +
711                          right_redzone_size;
712        new_size = old_size + additional_size;
713        new_alloca = __builtin_alloca (new_size, max (align, 32))
714        __asan_alloca_poison (new_alloca, old_size)
715        addr = new_alloca + max (align, ASAN_RED_ZONE_SIZE);
716        last_alloca_addr = new_alloca;
717    ADDITIONAL_SIZE is added to make new memory allocation contain not only
718    requested memory, but also left, partial and right redzones as well as some
719    additional space, required by alignment.  */
720 
721 static void
handle_builtin_alloca(gcall * call,gimple_stmt_iterator * iter)722 handle_builtin_alloca (gcall *call, gimple_stmt_iterator *iter)
723 {
724   if (!iter
725       || !(asan_sanitize_allocas_p () || hwasan_sanitize_allocas_p ()))
726     return;
727 
728   gassign *g;
729   gcall *gg;
730   tree callee = gimple_call_fndecl (call);
731   tree lhs = gimple_call_lhs (call);
732   tree old_size = gimple_call_arg (call, 0);
733   tree ptr_type = lhs ? TREE_TYPE (lhs) : ptr_type_node;
734   tree partial_size = NULL_TREE;
735   unsigned int align
736     = DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
737       ? 0 : tree_to_uhwi (gimple_call_arg (call, 1));
738 
739   bool throws = false;
740   edge e = NULL;
741   if (stmt_can_throw_internal (cfun, call))
742     {
743       if (!lhs)
744 	return;
745       throws = true;
746       e = find_fallthru_edge (gsi_bb (*iter)->succs);
747     }
748 
749   if (hwasan_sanitize_allocas_p ())
750     {
751       gimple_seq stmts = NULL;
752       location_t loc = gimple_location (gsi_stmt (*iter));
753       /*
754 	 HWASAN needs a different expansion.
755 
756 	 addr = __builtin_alloca (size, align);
757 
758 	 should be replaced by
759 
760 	 new_size = size rounded up to HWASAN_TAG_GRANULE_SIZE byte alignment;
761 	 untagged_addr = __builtin_alloca (new_size, align);
762 	 tag = __hwasan_choose_alloca_tag ();
763 	 addr = ifn_HWASAN_SET_TAG (untagged_addr, tag);
764 	 __hwasan_tag_memory (untagged_addr, tag, new_size);
765 	*/
766       /* Ensure alignment at least HWASAN_TAG_GRANULE_SIZE bytes so we start on
767 	 a tag granule.  */
768       align = align > HWASAN_TAG_GRANULE_SIZE ? align : HWASAN_TAG_GRANULE_SIZE;
769 
770       tree old_size = gimple_call_arg (call, 0);
771       tree new_size = gimple_build_round_up (&stmts, loc, size_type_node,
772 					     old_size,
773 					     HWASAN_TAG_GRANULE_SIZE);
774 
775       /* Make the alloca call */
776       tree untagged_addr
777 	= gimple_build (&stmts, loc,
778 			as_combined_fn (BUILT_IN_ALLOCA_WITH_ALIGN), ptr_type,
779 			new_size, build_int_cst (size_type_node, align));
780 
781       /* Choose the tag.
782 	 Here we use an internal function so we can choose the tag at expand
783 	 time.  We need the decision to be made after stack variables have been
784 	 assigned their tag (i.e. once the hwasan_frame_tag_offset variable has
785 	 been set to one after the last stack variables tag).  */
786       tree tag = gimple_build (&stmts, loc, CFN_HWASAN_CHOOSE_TAG,
787 			       unsigned_char_type_node);
788 
789       /* Add tag to pointer.  */
790       tree addr
791 	= gimple_build (&stmts, loc, CFN_HWASAN_SET_TAG, ptr_type,
792 			untagged_addr, tag);
793 
794       /* Tag shadow memory.
795 	 NOTE: require using `untagged_addr` here for libhwasan API.  */
796       gimple_build (&stmts, loc, as_combined_fn (BUILT_IN_HWASAN_TAG_MEM),
797 		    void_type_node, untagged_addr, tag, new_size);
798 
799       /* Insert the built up code sequence into the original instruction stream
800 	 the iterator points to.  */
801       gsi_insert_seq_before (iter, stmts, GSI_SAME_STMT);
802 
803       /* Finally, replace old alloca ptr with NEW_ALLOCA.  */
804       replace_call_with_value (iter, addr);
805       return;
806     }
807 
808   tree last_alloca = get_last_alloca_addr ();
809   const HOST_WIDE_INT redzone_mask = ASAN_RED_ZONE_SIZE - 1;
810 
811   /* If ALIGN > ASAN_RED_ZONE_SIZE, we embed left redzone into first ALIGN
812      bytes of allocated space.  Otherwise, align alloca to ASAN_RED_ZONE_SIZE
813      manually.  */
814   align = MAX (align, ASAN_RED_ZONE_SIZE * BITS_PER_UNIT);
815 
816   tree alloca_rz_mask = build_int_cst (size_type_node, redzone_mask);
817   tree redzone_size = build_int_cst (size_type_node, ASAN_RED_ZONE_SIZE);
818 
819   /* Extract lower bits from old_size.  */
820   wide_int size_nonzero_bits = get_nonzero_bits (old_size);
821   wide_int rz_mask
822     = wi::uhwi (redzone_mask, wi::get_precision (size_nonzero_bits));
823   wide_int old_size_lower_bits = wi::bit_and (size_nonzero_bits, rz_mask);
824 
825   /* If alloca size is aligned to ASAN_RED_ZONE_SIZE, we don't need partial
826      redzone.  Otherwise, compute its size here.  */
827   if (wi::ne_p (old_size_lower_bits, 0))
828     {
829       /* misalign = size & (ASAN_RED_ZONE_SIZE - 1)
830          partial_size = ASAN_RED_ZONE_SIZE - misalign.  */
831       g = gimple_build_assign (make_ssa_name (size_type_node, NULL),
832 			       BIT_AND_EXPR, old_size, alloca_rz_mask);
833       gsi_insert_before (iter, g, GSI_SAME_STMT);
834       tree misalign = gimple_assign_lhs (g);
835       g = gimple_build_assign (make_ssa_name (size_type_node, NULL), MINUS_EXPR,
836 			       redzone_size, misalign);
837       gsi_insert_before (iter, g, GSI_SAME_STMT);
838       partial_size = gimple_assign_lhs (g);
839     }
840 
841   /* additional_size = align + ASAN_RED_ZONE_SIZE.  */
842   tree additional_size = build_int_cst (size_type_node, align / BITS_PER_UNIT
843 							+ ASAN_RED_ZONE_SIZE);
844   /* If alloca has partial redzone, include it to additional_size too.  */
845   if (partial_size)
846     {
847       /* additional_size += partial_size.  */
848       g = gimple_build_assign (make_ssa_name (size_type_node), PLUS_EXPR,
849 			       partial_size, additional_size);
850       gsi_insert_before (iter, g, GSI_SAME_STMT);
851       additional_size = gimple_assign_lhs (g);
852     }
853 
854   /* new_size = old_size + additional_size.  */
855   g = gimple_build_assign (make_ssa_name (size_type_node), PLUS_EXPR, old_size,
856 			   additional_size);
857   gsi_insert_before (iter, g, GSI_SAME_STMT);
858   tree new_size = gimple_assign_lhs (g);
859 
860   /* Build new __builtin_alloca call:
861        new_alloca_with_rz = __builtin_alloca (new_size, align).  */
862   tree fn = builtin_decl_implicit (BUILT_IN_ALLOCA_WITH_ALIGN);
863   gg = gimple_build_call (fn, 2, new_size,
864 			  build_int_cst (size_type_node, align));
865   tree new_alloca_with_rz = make_ssa_name (ptr_type, gg);
866   gimple_call_set_lhs (gg, new_alloca_with_rz);
867   if (throws)
868     {
869       gimple_call_set_lhs (call, NULL);
870       gsi_replace (iter, gg, true);
871     }
872   else
873     gsi_insert_before (iter, gg, GSI_SAME_STMT);
874 
875   /* new_alloca = new_alloca_with_rz + align.  */
876   g = gimple_build_assign (make_ssa_name (ptr_type), POINTER_PLUS_EXPR,
877 			   new_alloca_with_rz,
878 			   build_int_cst (size_type_node,
879 					  align / BITS_PER_UNIT));
880   gimple_stmt_iterator gsi = gsi_none ();
881   if (throws)
882     {
883       gsi_insert_on_edge_immediate (e, g);
884       gsi = gsi_for_stmt (g);
885     }
886   else
887     gsi_insert_before (iter, g, GSI_SAME_STMT);
888   tree new_alloca = gimple_assign_lhs (g);
889 
890   /* Poison newly created alloca redzones:
891       __asan_alloca_poison (new_alloca, old_size).  */
892   fn = builtin_decl_implicit (BUILT_IN_ASAN_ALLOCA_POISON);
893   gg = gimple_build_call (fn, 2, new_alloca, old_size);
894   if (throws)
895     gsi_insert_after (&gsi, gg, GSI_NEW_STMT);
896   else
897     gsi_insert_before (iter, gg, GSI_SAME_STMT);
898 
899   /* Save new_alloca_with_rz value into last_alloca to use it during
900      allocas unpoisoning.  */
901   g = gimple_build_assign (last_alloca, new_alloca_with_rz);
902   if (throws)
903     gsi_insert_after (&gsi, g, GSI_NEW_STMT);
904   else
905     gsi_insert_before (iter, g, GSI_SAME_STMT);
906 
907   /* Finally, replace old alloca ptr with NEW_ALLOCA.  */
908   if (throws)
909     {
910       g = gimple_build_assign (lhs, new_alloca);
911       gsi_insert_after (&gsi, g, GSI_NEW_STMT);
912     }
913   else
914     replace_call_with_value (iter, new_alloca);
915 }
916 
917 /* Return the memory references contained in a gimple statement
918    representing a builtin call that has to do with memory access.  */
919 
920 static bool
get_mem_refs_of_builtin_call(gcall * call,asan_mem_ref * src0,tree * src0_len,bool * src0_is_store,asan_mem_ref * src1,tree * src1_len,bool * src1_is_store,asan_mem_ref * dst,tree * dst_len,bool * dst_is_store,bool * dest_is_deref,bool * intercepted_p,gimple_stmt_iterator * iter=NULL)921 get_mem_refs_of_builtin_call (gcall *call,
922 			      asan_mem_ref *src0,
923 			      tree *src0_len,
924 			      bool *src0_is_store,
925 			      asan_mem_ref *src1,
926 			      tree *src1_len,
927 			      bool *src1_is_store,
928 			      asan_mem_ref *dst,
929 			      tree *dst_len,
930 			      bool *dst_is_store,
931 			      bool *dest_is_deref,
932 			      bool *intercepted_p,
933 			      gimple_stmt_iterator *iter = NULL)
934 {
935   gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
936 
937   tree callee = gimple_call_fndecl (call);
938   tree source0 = NULL_TREE, source1 = NULL_TREE,
939     dest = NULL_TREE, len = NULL_TREE;
940   bool is_store = true, got_reference_p = false;
941   HOST_WIDE_INT access_size = 1;
942 
943   *intercepted_p = asan_intercepted_p ((DECL_FUNCTION_CODE (callee)));
944 
945   switch (DECL_FUNCTION_CODE (callee))
946     {
947       /* (s, s, n) style memops.  */
948     case BUILT_IN_BCMP:
949     case BUILT_IN_MEMCMP:
950       source0 = gimple_call_arg (call, 0);
951       source1 = gimple_call_arg (call, 1);
952       len = gimple_call_arg (call, 2);
953       break;
954 
955       /* (src, dest, n) style memops.  */
956     case BUILT_IN_BCOPY:
957       source0 = gimple_call_arg (call, 0);
958       dest = gimple_call_arg (call, 1);
959       len = gimple_call_arg (call, 2);
960       break;
961 
962       /* (dest, src, n) style memops.  */
963     case BUILT_IN_MEMCPY:
964     case BUILT_IN_MEMCPY_CHK:
965     case BUILT_IN_MEMMOVE:
966     case BUILT_IN_MEMMOVE_CHK:
967     case BUILT_IN_MEMPCPY:
968     case BUILT_IN_MEMPCPY_CHK:
969       dest = gimple_call_arg (call, 0);
970       source0 = gimple_call_arg (call, 1);
971       len = gimple_call_arg (call, 2);
972       break;
973 
974       /* (dest, n) style memops.  */
975     case BUILT_IN_BZERO:
976       dest = gimple_call_arg (call, 0);
977       len = gimple_call_arg (call, 1);
978       break;
979 
980       /* (dest, x, n) style memops*/
981     case BUILT_IN_MEMSET:
982     case BUILT_IN_MEMSET_CHK:
983       dest = gimple_call_arg (call, 0);
984       len = gimple_call_arg (call, 2);
985       break;
986 
987     case BUILT_IN_STRLEN:
988       /* Special case strlen here since its length is taken from its return
989 	 value.
990 
991 	 The approach taken by the sanitizers is to check a memory access
992 	 before it's taken.  For ASAN strlen is intercepted by libasan, so no
993 	 check is inserted by the compiler.
994 
995 	 This function still returns `true` and provides a length to the rest
996 	 of the ASAN pass in order to record what areas have been checked,
997 	 avoiding superfluous checks later on.
998 
999 	 HWASAN does not intercept any of these internal functions.
1000 	 This means that checks for memory accesses must be inserted by the
1001 	 compiler.
1002 	 strlen is a special case, because we can tell the length from the
1003 	 return of the function, but that is not known until after the function
1004 	 has returned.
1005 
1006 	 Hence we can't check the memory access before it happens.
1007 	 We could check the memory access after it has already happened, but
1008 	 for now we choose to just ignore `strlen` calls.
1009 	 This decision was simply made because that means the special case is
1010 	 limited to this one case of this one function.  */
1011       if (hwasan_sanitize_p ())
1012 	return false;
1013       source0 = gimple_call_arg (call, 0);
1014       len = gimple_call_lhs (call);
1015       break;
1016 
1017     case BUILT_IN_STACK_RESTORE:
1018       handle_builtin_stack_restore (call, iter);
1019       break;
1020 
1021     CASE_BUILT_IN_ALLOCA:
1022       handle_builtin_alloca (call, iter);
1023       break;
1024     /* And now the __atomic* and __sync builtins.
1025        These are handled differently from the classical memory
1026        access builtins above.  */
1027 
1028     case BUILT_IN_ATOMIC_LOAD_1:
1029       is_store = false;
1030       /* FALLTHRU */
1031     case BUILT_IN_SYNC_FETCH_AND_ADD_1:
1032     case BUILT_IN_SYNC_FETCH_AND_SUB_1:
1033     case BUILT_IN_SYNC_FETCH_AND_OR_1:
1034     case BUILT_IN_SYNC_FETCH_AND_AND_1:
1035     case BUILT_IN_SYNC_FETCH_AND_XOR_1:
1036     case BUILT_IN_SYNC_FETCH_AND_NAND_1:
1037     case BUILT_IN_SYNC_ADD_AND_FETCH_1:
1038     case BUILT_IN_SYNC_SUB_AND_FETCH_1:
1039     case BUILT_IN_SYNC_OR_AND_FETCH_1:
1040     case BUILT_IN_SYNC_AND_AND_FETCH_1:
1041     case BUILT_IN_SYNC_XOR_AND_FETCH_1:
1042     case BUILT_IN_SYNC_NAND_AND_FETCH_1:
1043     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1:
1044     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1:
1045     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1:
1046     case BUILT_IN_SYNC_LOCK_RELEASE_1:
1047     case BUILT_IN_ATOMIC_EXCHANGE_1:
1048     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1:
1049     case BUILT_IN_ATOMIC_STORE_1:
1050     case BUILT_IN_ATOMIC_ADD_FETCH_1:
1051     case BUILT_IN_ATOMIC_SUB_FETCH_1:
1052     case BUILT_IN_ATOMIC_AND_FETCH_1:
1053     case BUILT_IN_ATOMIC_NAND_FETCH_1:
1054     case BUILT_IN_ATOMIC_XOR_FETCH_1:
1055     case BUILT_IN_ATOMIC_OR_FETCH_1:
1056     case BUILT_IN_ATOMIC_FETCH_ADD_1:
1057     case BUILT_IN_ATOMIC_FETCH_SUB_1:
1058     case BUILT_IN_ATOMIC_FETCH_AND_1:
1059     case BUILT_IN_ATOMIC_FETCH_NAND_1:
1060     case BUILT_IN_ATOMIC_FETCH_XOR_1:
1061     case BUILT_IN_ATOMIC_FETCH_OR_1:
1062       access_size = 1;
1063       goto do_atomic;
1064 
1065     case BUILT_IN_ATOMIC_LOAD_2:
1066       is_store = false;
1067       /* FALLTHRU */
1068     case BUILT_IN_SYNC_FETCH_AND_ADD_2:
1069     case BUILT_IN_SYNC_FETCH_AND_SUB_2:
1070     case BUILT_IN_SYNC_FETCH_AND_OR_2:
1071     case BUILT_IN_SYNC_FETCH_AND_AND_2:
1072     case BUILT_IN_SYNC_FETCH_AND_XOR_2:
1073     case BUILT_IN_SYNC_FETCH_AND_NAND_2:
1074     case BUILT_IN_SYNC_ADD_AND_FETCH_2:
1075     case BUILT_IN_SYNC_SUB_AND_FETCH_2:
1076     case BUILT_IN_SYNC_OR_AND_FETCH_2:
1077     case BUILT_IN_SYNC_AND_AND_FETCH_2:
1078     case BUILT_IN_SYNC_XOR_AND_FETCH_2:
1079     case BUILT_IN_SYNC_NAND_AND_FETCH_2:
1080     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2:
1081     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2:
1082     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2:
1083     case BUILT_IN_SYNC_LOCK_RELEASE_2:
1084     case BUILT_IN_ATOMIC_EXCHANGE_2:
1085     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2:
1086     case BUILT_IN_ATOMIC_STORE_2:
1087     case BUILT_IN_ATOMIC_ADD_FETCH_2:
1088     case BUILT_IN_ATOMIC_SUB_FETCH_2:
1089     case BUILT_IN_ATOMIC_AND_FETCH_2:
1090     case BUILT_IN_ATOMIC_NAND_FETCH_2:
1091     case BUILT_IN_ATOMIC_XOR_FETCH_2:
1092     case BUILT_IN_ATOMIC_OR_FETCH_2:
1093     case BUILT_IN_ATOMIC_FETCH_ADD_2:
1094     case BUILT_IN_ATOMIC_FETCH_SUB_2:
1095     case BUILT_IN_ATOMIC_FETCH_AND_2:
1096     case BUILT_IN_ATOMIC_FETCH_NAND_2:
1097     case BUILT_IN_ATOMIC_FETCH_XOR_2:
1098     case BUILT_IN_ATOMIC_FETCH_OR_2:
1099       access_size = 2;
1100       goto do_atomic;
1101 
1102     case BUILT_IN_ATOMIC_LOAD_4:
1103       is_store = false;
1104       /* FALLTHRU */
1105     case BUILT_IN_SYNC_FETCH_AND_ADD_4:
1106     case BUILT_IN_SYNC_FETCH_AND_SUB_4:
1107     case BUILT_IN_SYNC_FETCH_AND_OR_4:
1108     case BUILT_IN_SYNC_FETCH_AND_AND_4:
1109     case BUILT_IN_SYNC_FETCH_AND_XOR_4:
1110     case BUILT_IN_SYNC_FETCH_AND_NAND_4:
1111     case BUILT_IN_SYNC_ADD_AND_FETCH_4:
1112     case BUILT_IN_SYNC_SUB_AND_FETCH_4:
1113     case BUILT_IN_SYNC_OR_AND_FETCH_4:
1114     case BUILT_IN_SYNC_AND_AND_FETCH_4:
1115     case BUILT_IN_SYNC_XOR_AND_FETCH_4:
1116     case BUILT_IN_SYNC_NAND_AND_FETCH_4:
1117     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4:
1118     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4:
1119     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4:
1120     case BUILT_IN_SYNC_LOCK_RELEASE_4:
1121     case BUILT_IN_ATOMIC_EXCHANGE_4:
1122     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4:
1123     case BUILT_IN_ATOMIC_STORE_4:
1124     case BUILT_IN_ATOMIC_ADD_FETCH_4:
1125     case BUILT_IN_ATOMIC_SUB_FETCH_4:
1126     case BUILT_IN_ATOMIC_AND_FETCH_4:
1127     case BUILT_IN_ATOMIC_NAND_FETCH_4:
1128     case BUILT_IN_ATOMIC_XOR_FETCH_4:
1129     case BUILT_IN_ATOMIC_OR_FETCH_4:
1130     case BUILT_IN_ATOMIC_FETCH_ADD_4:
1131     case BUILT_IN_ATOMIC_FETCH_SUB_4:
1132     case BUILT_IN_ATOMIC_FETCH_AND_4:
1133     case BUILT_IN_ATOMIC_FETCH_NAND_4:
1134     case BUILT_IN_ATOMIC_FETCH_XOR_4:
1135     case BUILT_IN_ATOMIC_FETCH_OR_4:
1136       access_size = 4;
1137       goto do_atomic;
1138 
1139     case BUILT_IN_ATOMIC_LOAD_8:
1140       is_store = false;
1141       /* FALLTHRU */
1142     case BUILT_IN_SYNC_FETCH_AND_ADD_8:
1143     case BUILT_IN_SYNC_FETCH_AND_SUB_8:
1144     case BUILT_IN_SYNC_FETCH_AND_OR_8:
1145     case BUILT_IN_SYNC_FETCH_AND_AND_8:
1146     case BUILT_IN_SYNC_FETCH_AND_XOR_8:
1147     case BUILT_IN_SYNC_FETCH_AND_NAND_8:
1148     case BUILT_IN_SYNC_ADD_AND_FETCH_8:
1149     case BUILT_IN_SYNC_SUB_AND_FETCH_8:
1150     case BUILT_IN_SYNC_OR_AND_FETCH_8:
1151     case BUILT_IN_SYNC_AND_AND_FETCH_8:
1152     case BUILT_IN_SYNC_XOR_AND_FETCH_8:
1153     case BUILT_IN_SYNC_NAND_AND_FETCH_8:
1154     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8:
1155     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8:
1156     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8:
1157     case BUILT_IN_SYNC_LOCK_RELEASE_8:
1158     case BUILT_IN_ATOMIC_EXCHANGE_8:
1159     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8:
1160     case BUILT_IN_ATOMIC_STORE_8:
1161     case BUILT_IN_ATOMIC_ADD_FETCH_8:
1162     case BUILT_IN_ATOMIC_SUB_FETCH_8:
1163     case BUILT_IN_ATOMIC_AND_FETCH_8:
1164     case BUILT_IN_ATOMIC_NAND_FETCH_8:
1165     case BUILT_IN_ATOMIC_XOR_FETCH_8:
1166     case BUILT_IN_ATOMIC_OR_FETCH_8:
1167     case BUILT_IN_ATOMIC_FETCH_ADD_8:
1168     case BUILT_IN_ATOMIC_FETCH_SUB_8:
1169     case BUILT_IN_ATOMIC_FETCH_AND_8:
1170     case BUILT_IN_ATOMIC_FETCH_NAND_8:
1171     case BUILT_IN_ATOMIC_FETCH_XOR_8:
1172     case BUILT_IN_ATOMIC_FETCH_OR_8:
1173       access_size = 8;
1174       goto do_atomic;
1175 
1176     case BUILT_IN_ATOMIC_LOAD_16:
1177       is_store = false;
1178       /* FALLTHRU */
1179     case BUILT_IN_SYNC_FETCH_AND_ADD_16:
1180     case BUILT_IN_SYNC_FETCH_AND_SUB_16:
1181     case BUILT_IN_SYNC_FETCH_AND_OR_16:
1182     case BUILT_IN_SYNC_FETCH_AND_AND_16:
1183     case BUILT_IN_SYNC_FETCH_AND_XOR_16:
1184     case BUILT_IN_SYNC_FETCH_AND_NAND_16:
1185     case BUILT_IN_SYNC_ADD_AND_FETCH_16:
1186     case BUILT_IN_SYNC_SUB_AND_FETCH_16:
1187     case BUILT_IN_SYNC_OR_AND_FETCH_16:
1188     case BUILT_IN_SYNC_AND_AND_FETCH_16:
1189     case BUILT_IN_SYNC_XOR_AND_FETCH_16:
1190     case BUILT_IN_SYNC_NAND_AND_FETCH_16:
1191     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16:
1192     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16:
1193     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16:
1194     case BUILT_IN_SYNC_LOCK_RELEASE_16:
1195     case BUILT_IN_ATOMIC_EXCHANGE_16:
1196     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16:
1197     case BUILT_IN_ATOMIC_STORE_16:
1198     case BUILT_IN_ATOMIC_ADD_FETCH_16:
1199     case BUILT_IN_ATOMIC_SUB_FETCH_16:
1200     case BUILT_IN_ATOMIC_AND_FETCH_16:
1201     case BUILT_IN_ATOMIC_NAND_FETCH_16:
1202     case BUILT_IN_ATOMIC_XOR_FETCH_16:
1203     case BUILT_IN_ATOMIC_OR_FETCH_16:
1204     case BUILT_IN_ATOMIC_FETCH_ADD_16:
1205     case BUILT_IN_ATOMIC_FETCH_SUB_16:
1206     case BUILT_IN_ATOMIC_FETCH_AND_16:
1207     case BUILT_IN_ATOMIC_FETCH_NAND_16:
1208     case BUILT_IN_ATOMIC_FETCH_XOR_16:
1209     case BUILT_IN_ATOMIC_FETCH_OR_16:
1210       access_size = 16;
1211       /* FALLTHRU */
1212     do_atomic:
1213       {
1214 	dest = gimple_call_arg (call, 0);
1215 	/* DEST represents the address of a memory location.
1216 	   instrument_derefs wants the memory location, so lets
1217 	   dereference the address DEST before handing it to
1218 	   instrument_derefs.  */
1219 	tree type = build_nonstandard_integer_type (access_size
1220 						    * BITS_PER_UNIT, 1);
1221 	dest = build2 (MEM_REF, type, dest,
1222 		       build_int_cst (build_pointer_type (char_type_node), 0));
1223 	break;
1224       }
1225 
1226     default:
1227       /* The other builtins memory access are not instrumented in this
1228 	 function because they either don't have any length parameter,
1229 	 or their length parameter is just a limit.  */
1230       break;
1231     }
1232 
1233   if (len != NULL_TREE)
1234     {
1235       if (source0 != NULL_TREE)
1236 	{
1237 	  src0->start = source0;
1238 	  src0->access_size = access_size;
1239 	  *src0_len = len;
1240 	  *src0_is_store = false;
1241 	}
1242 
1243       if (source1 != NULL_TREE)
1244 	{
1245 	  src1->start = source1;
1246 	  src1->access_size = access_size;
1247 	  *src1_len = len;
1248 	  *src1_is_store = false;
1249 	}
1250 
1251       if (dest != NULL_TREE)
1252 	{
1253 	  dst->start = dest;
1254 	  dst->access_size = access_size;
1255 	  *dst_len = len;
1256 	  *dst_is_store = true;
1257 	}
1258 
1259       got_reference_p = true;
1260     }
1261   else if (dest)
1262     {
1263       dst->start = dest;
1264       dst->access_size = access_size;
1265       *dst_len = NULL_TREE;
1266       *dst_is_store = is_store;
1267       *dest_is_deref = true;
1268       got_reference_p = true;
1269     }
1270 
1271   return got_reference_p;
1272 }
1273 
1274 /* Return true iff a given gimple statement has been instrumented.
1275    Note that the statement is "defined" by the memory references it
1276    contains.  */
1277 
1278 static bool
has_stmt_been_instrumented_p(gimple * stmt)1279 has_stmt_been_instrumented_p (gimple *stmt)
1280 {
1281   if (gimple_assign_single_p (stmt))
1282     {
1283       bool r_is_store;
1284       asan_mem_ref r;
1285       asan_mem_ref_init (&r, NULL, 1);
1286 
1287       if (get_mem_ref_of_assignment (as_a <gassign *> (stmt), &r,
1288 				     &r_is_store))
1289 	{
1290 	  if (!has_mem_ref_been_instrumented (&r))
1291 	    return false;
1292 	  if (r_is_store && gimple_assign_load_p (stmt))
1293 	    {
1294 	      asan_mem_ref src;
1295 	      asan_mem_ref_init (&src, NULL, 1);
1296 	      src.start = gimple_assign_rhs1 (stmt);
1297 	      src.access_size = int_size_in_bytes (TREE_TYPE (src.start));
1298 	      if (!has_mem_ref_been_instrumented (&src))
1299 		return false;
1300 	    }
1301 	  return true;
1302 	}
1303     }
1304   else if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
1305     {
1306       asan_mem_ref src0, src1, dest;
1307       asan_mem_ref_init (&src0, NULL, 1);
1308       asan_mem_ref_init (&src1, NULL, 1);
1309       asan_mem_ref_init (&dest, NULL, 1);
1310 
1311       tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
1312       bool src0_is_store = false, src1_is_store = false,
1313 	dest_is_store = false, dest_is_deref = false, intercepted_p = true;
1314       if (get_mem_refs_of_builtin_call (as_a <gcall *> (stmt),
1315 					&src0, &src0_len, &src0_is_store,
1316 					&src1, &src1_len, &src1_is_store,
1317 					&dest, &dest_len, &dest_is_store,
1318 					&dest_is_deref, &intercepted_p))
1319 	{
1320 	  if (src0.start != NULL_TREE
1321 	      && !has_mem_ref_been_instrumented (&src0, src0_len))
1322 	    return false;
1323 
1324 	  if (src1.start != NULL_TREE
1325 	      && !has_mem_ref_been_instrumented (&src1, src1_len))
1326 	    return false;
1327 
1328 	  if (dest.start != NULL_TREE
1329 	      && !has_mem_ref_been_instrumented (&dest, dest_len))
1330 	    return false;
1331 
1332 	  return true;
1333 	}
1334     }
1335   else if (is_gimple_call (stmt) && gimple_store_p (stmt))
1336     {
1337       asan_mem_ref r;
1338       asan_mem_ref_init (&r, NULL, 1);
1339 
1340       r.start = gimple_call_lhs (stmt);
1341       r.access_size = int_size_in_bytes (TREE_TYPE (r.start));
1342       return has_mem_ref_been_instrumented (&r);
1343     }
1344 
1345   return false;
1346 }
1347 
1348 /*  Insert a memory reference into the hash table.  */
1349 
1350 static void
update_mem_ref_hash_table(tree ref,HOST_WIDE_INT access_size)1351 update_mem_ref_hash_table (tree ref, HOST_WIDE_INT access_size)
1352 {
1353   hash_table<asan_mem_ref_hasher> *ht = get_mem_ref_hash_table ();
1354 
1355   asan_mem_ref r;
1356   asan_mem_ref_init (&r, ref, access_size);
1357 
1358   asan_mem_ref **slot = ht->find_slot (&r, INSERT);
1359   if (*slot == NULL || (*slot)->access_size < access_size)
1360     *slot = asan_mem_ref_new (ref, access_size);
1361 }
1362 
1363 /* Initialize shadow_ptr_types array.  */
1364 
1365 static void
asan_init_shadow_ptr_types(void)1366 asan_init_shadow_ptr_types (void)
1367 {
1368   asan_shadow_set = new_alias_set ();
1369   tree types[3] = { signed_char_type_node, short_integer_type_node,
1370 		    integer_type_node };
1371 
1372   for (unsigned i = 0; i < 3; i++)
1373     {
1374       shadow_ptr_types[i] = build_distinct_type_copy (types[i]);
1375       TYPE_ALIAS_SET (shadow_ptr_types[i]) = asan_shadow_set;
1376       shadow_ptr_types[i] = build_pointer_type (shadow_ptr_types[i]);
1377     }
1378 
1379   initialize_sanitizer_builtins ();
1380 }
1381 
1382 /* Create ADDR_EXPR of STRING_CST with the PP pretty printer text.  */
1383 
1384 static tree
asan_pp_string(pretty_printer * pp)1385 asan_pp_string (pretty_printer *pp)
1386 {
1387   const char *buf = pp_formatted_text (pp);
1388   size_t len = strlen (buf);
1389   tree ret = build_string (len + 1, buf);
1390   TREE_TYPE (ret)
1391     = build_array_type (TREE_TYPE (shadow_ptr_types[0]),
1392 			build_index_type (size_int (len)));
1393   TREE_READONLY (ret) = 1;
1394   TREE_STATIC (ret) = 1;
1395   return build1 (ADDR_EXPR, shadow_ptr_types[0], ret);
1396 }
1397 
1398 /* Clear shadow memory at SHADOW_MEM, LEN bytes.  Can't call a library call here
1399    though.  */
1400 
1401 static void
asan_clear_shadow(rtx shadow_mem,HOST_WIDE_INT len)1402 asan_clear_shadow (rtx shadow_mem, HOST_WIDE_INT len)
1403 {
1404   rtx_insn *insn, *insns, *jump;
1405   rtx_code_label *top_label;
1406   rtx end, addr, tmp;
1407 
1408   gcc_assert ((len & 3) == 0);
1409   start_sequence ();
1410   clear_storage (shadow_mem, GEN_INT (len), BLOCK_OP_NORMAL);
1411   insns = get_insns ();
1412   end_sequence ();
1413   for (insn = insns; insn; insn = NEXT_INSN (insn))
1414     if (CALL_P (insn))
1415       break;
1416   if (insn == NULL_RTX)
1417     {
1418       emit_insn (insns);
1419       return;
1420     }
1421 
1422   top_label = gen_label_rtx ();
1423   addr = copy_to_mode_reg (Pmode, XEXP (shadow_mem, 0));
1424   shadow_mem = adjust_automodify_address (shadow_mem, SImode, addr, 0);
1425   end = force_reg (Pmode, plus_constant (Pmode, addr, len));
1426   emit_label (top_label);
1427 
1428   emit_move_insn (shadow_mem, const0_rtx);
1429   tmp = expand_simple_binop (Pmode, PLUS, addr, gen_int_mode (4, Pmode), addr,
1430 			     true, OPTAB_LIB_WIDEN);
1431   if (tmp != addr)
1432     emit_move_insn (addr, tmp);
1433   emit_cmp_and_jump_insns (addr, end, LT, NULL_RTX, Pmode, true, top_label);
1434   jump = get_last_insn ();
1435   gcc_assert (JUMP_P (jump));
1436   add_reg_br_prob_note (jump,
1437 			profile_probability::guessed_always ()
1438 			   .apply_scale (80, 100));
1439 }
1440 
1441 void
asan_function_start(void)1442 asan_function_start (void)
1443 {
1444   section *fnsec = function_section (current_function_decl);
1445   switch_to_section (fnsec);
1446   ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LASANPC",
1447 			 current_function_funcdef_no);
1448 }
1449 
1450 /* Return number of shadow bytes that are occupied by a local variable
1451    of SIZE bytes.  */
1452 
1453 static unsigned HOST_WIDE_INT
shadow_mem_size(unsigned HOST_WIDE_INT size)1454 shadow_mem_size (unsigned HOST_WIDE_INT size)
1455 {
1456   /* It must be possible to align stack variables to granularity
1457      of shadow memory.  */
1458   gcc_assert (BITS_PER_UNIT
1459 	      * ASAN_SHADOW_GRANULARITY <= MAX_SUPPORTED_STACK_ALIGNMENT);
1460 
1461   return ROUND_UP (size, ASAN_SHADOW_GRANULARITY) / ASAN_SHADOW_GRANULARITY;
1462 }
1463 
1464 /* Always emit 4 bytes at a time.  */
1465 #define RZ_BUFFER_SIZE 4
1466 
1467 /* ASAN redzone buffer container that handles emission of shadow bytes.  */
1468 class asan_redzone_buffer
1469 {
1470 public:
1471   /* Constructor.  */
asan_redzone_buffer(rtx shadow_mem,HOST_WIDE_INT prev_offset)1472   asan_redzone_buffer (rtx shadow_mem, HOST_WIDE_INT prev_offset):
1473     m_shadow_mem (shadow_mem), m_prev_offset (prev_offset),
1474     m_original_offset (prev_offset), m_shadow_bytes (RZ_BUFFER_SIZE)
1475   {}
1476 
1477   /* Emit VALUE shadow byte at a given OFFSET.  */
1478   void emit_redzone_byte (HOST_WIDE_INT offset, unsigned char value);
1479 
1480   /* Emit RTX emission of the content of the buffer.  */
1481   void flush_redzone_payload (void);
1482 
1483 private:
1484   /* Flush if the content of the buffer is full
1485      (equal to RZ_BUFFER_SIZE).  */
1486   void flush_if_full (void);
1487 
1488   /* Memory where we last emitted a redzone payload.  */
1489   rtx m_shadow_mem;
1490 
1491   /* Relative offset where we last emitted a redzone payload.  */
1492   HOST_WIDE_INT m_prev_offset;
1493 
1494   /* Relative original offset.  Used for checking only.  */
1495   HOST_WIDE_INT m_original_offset;
1496 
1497 public:
1498   /* Buffer with redzone payload.  */
1499   auto_vec<unsigned char> m_shadow_bytes;
1500 };
1501 
1502 /* Emit VALUE shadow byte at a given OFFSET.  */
1503 
1504 void
emit_redzone_byte(HOST_WIDE_INT offset,unsigned char value)1505 asan_redzone_buffer::emit_redzone_byte (HOST_WIDE_INT offset,
1506 					unsigned char value)
1507 {
1508   gcc_assert ((offset & (ASAN_SHADOW_GRANULARITY - 1)) == 0);
1509   gcc_assert (offset >= m_prev_offset);
1510 
1511   HOST_WIDE_INT off
1512     = m_prev_offset + ASAN_SHADOW_GRANULARITY * m_shadow_bytes.length ();
1513   if (off == offset)
1514     /* Consecutive shadow memory byte.  */;
1515   else if (offset < m_prev_offset + (HOST_WIDE_INT) (ASAN_SHADOW_GRANULARITY
1516 						     * RZ_BUFFER_SIZE)
1517 	   && !m_shadow_bytes.is_empty ())
1518     {
1519       /* Shadow memory byte with a small gap.  */
1520       for (; off < offset; off += ASAN_SHADOW_GRANULARITY)
1521 	m_shadow_bytes.safe_push (0);
1522     }
1523   else
1524     {
1525       if (!m_shadow_bytes.is_empty ())
1526 	flush_redzone_payload ();
1527 
1528       /* Maybe start earlier in order to use aligned store.  */
1529       HOST_WIDE_INT align = (offset - m_prev_offset) % ASAN_RED_ZONE_SIZE;
1530       if (align)
1531 	{
1532 	  offset -= align;
1533 	  for (unsigned i = 0; i < align / BITS_PER_UNIT; i++)
1534 	    m_shadow_bytes.safe_push (0);
1535 	}
1536 
1537       /* Adjust m_prev_offset and m_shadow_mem.  */
1538       HOST_WIDE_INT diff = offset - m_prev_offset;
1539       m_shadow_mem = adjust_address (m_shadow_mem, VOIDmode,
1540 				     diff >> ASAN_SHADOW_SHIFT);
1541       m_prev_offset = offset;
1542     }
1543   m_shadow_bytes.safe_push (value);
1544   flush_if_full ();
1545 }
1546 
1547 /* Emit RTX emission of the content of the buffer.  */
1548 
1549 void
flush_redzone_payload(void)1550 asan_redzone_buffer::flush_redzone_payload (void)
1551 {
1552   gcc_assert (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN);
1553 
1554   if (m_shadow_bytes.is_empty ())
1555     return;
1556 
1557   /* Be sure we always emit to an aligned address.  */
1558   gcc_assert (((m_prev_offset - m_original_offset)
1559 	      & (ASAN_RED_ZONE_SIZE - 1)) == 0);
1560 
1561   /* Fill it to RZ_BUFFER_SIZE bytes with zeros if needed.  */
1562   unsigned l = m_shadow_bytes.length ();
1563   for (unsigned i = 0; i <= RZ_BUFFER_SIZE - l; i++)
1564     m_shadow_bytes.safe_push (0);
1565 
1566   if (dump_file && (dump_flags & TDF_DETAILS))
1567     fprintf (dump_file,
1568 	     "Flushing rzbuffer at offset %" PRId64 " with: ", m_prev_offset);
1569 
1570   unsigned HOST_WIDE_INT val = 0;
1571   for (unsigned i = 0; i < RZ_BUFFER_SIZE; i++)
1572     {
1573       unsigned char v
1574 	= m_shadow_bytes[BYTES_BIG_ENDIAN ? RZ_BUFFER_SIZE - i - 1 : i];
1575       val |= (unsigned HOST_WIDE_INT)v << (BITS_PER_UNIT * i);
1576       if (dump_file && (dump_flags & TDF_DETAILS))
1577 	fprintf (dump_file, "%02x ", v);
1578     }
1579 
1580   if (dump_file && (dump_flags & TDF_DETAILS))
1581     fprintf (dump_file, "\n");
1582 
1583   rtx c = gen_int_mode (val, SImode);
1584   m_shadow_mem = adjust_address (m_shadow_mem, SImode, 0);
1585   emit_move_insn (m_shadow_mem, c);
1586   m_shadow_bytes.truncate (0);
1587 }
1588 
1589 /* Flush if the content of the buffer is full
1590    (equal to RZ_BUFFER_SIZE).  */
1591 
1592 void
flush_if_full(void)1593 asan_redzone_buffer::flush_if_full (void)
1594 {
1595   if (m_shadow_bytes.length () == RZ_BUFFER_SIZE)
1596     flush_redzone_payload ();
1597 }
1598 
1599 
1600 /* HWAddressSanitizer (hwasan) is a probabilistic method for detecting
1601    out-of-bounds and use-after-free bugs.
1602    Read more:
1603    http://code.google.com/p/address-sanitizer/
1604 
1605    Similar to AddressSanitizer (asan) it consists of two parts: the
1606    instrumentation module in this file, and a run-time library.
1607 
1608    The instrumentation module adds a run-time check before every memory insn in
1609    the same manner as asan (see the block comment for AddressSanitizer above).
1610    Currently, hwasan only adds out-of-line instrumentation, where each check is
1611    implemented as a function call to the run-time library.  Hence a check for a
1612    load of N bytes from address X would be implemented with a function call to
1613    __hwasan_loadN(X), and checking a store of N bytes from address X would be
1614    implemented with a function call to __hwasan_storeN(X).
1615 
1616    The main difference between hwasan and asan is in the information stored to
1617    help this checking.  Both sanitizers use a shadow memory area which stores
1618    data recording the state of main memory at a corresponding address.
1619 
1620    For hwasan, each 16 byte granule in main memory has a corresponding 1 byte
1621    in shadow memory.  This shadow address can be calculated with equation:
1622      (addr >> log_2(HWASAN_TAG_GRANULE_SIZE))
1623 	  + __hwasan_shadow_memory_dynamic_address;
1624    The conversion between real and shadow memory for asan is given in the block
1625    comment at the top of this file.
1626    The description of how this shadow memory is laid out for asan is in the
1627    block comment at the top of this file, here we describe how this shadow
1628    memory is used for hwasan.
1629 
1630    For hwasan, each variable is assigned a byte-sized 'tag'.  The extent of
1631    the shadow memory for that variable is filled with the assigned tag, and
1632    every pointer referencing that variable has its top byte set to the same
1633    tag.  The run-time library redefines malloc so that every allocation returns
1634    a tagged pointer and tags the corresponding shadow memory with the same tag.
1635 
1636    On each pointer dereference the tag found in the pointer is compared to the
1637    tag found in the shadow memory corresponding to the accessed memory address.
1638    If these tags are found to differ then this memory access is judged to be
1639    invalid and a report is generated.
1640 
1641    This method of bug detection is not perfect -- it can not catch every bad
1642    access -- but catches them probabilistically instead.  There is always the
1643    possibility that an invalid memory access will happen to access memory
1644    tagged with the same tag as the pointer that this access used.
1645    The chances of this are approx. 0.4% for any two uncorrelated objects.
1646 
1647    Random tag generation can mitigate this problem by decreasing the
1648    probability that an invalid access will be missed in the same manner over
1649    multiple runs.  i.e. if two objects are tagged the same in one run of the
1650    binary they are unlikely to be tagged the same in the next run.
1651    Both heap and stack allocated objects have random tags by default.
1652 
1653    [16 byte granule implications]
1654     Since the shadow memory only has a resolution on real memory of 16 bytes,
1655     invalid accesses that are within the same 16 byte granule as a valid
1656     address will not be caught.
1657 
1658     There is a "short-granule" feature in the runtime library which does catch
1659     such accesses, but this feature is not implemented for stack objects (since
1660     stack objects are allocated and tagged by compiler instrumentation, and
1661     this feature has not yet been implemented in GCC instrumentation).
1662 
1663     Another outcome of this 16 byte resolution is that each tagged object must
1664     be 16 byte aligned.  If two objects were to share any 16 byte granule in
1665     memory, then they both would have to be given the same tag, and invalid
1666     accesses to one using a pointer to the other would be undetectable.
1667 
1668    [Compiler instrumentation]
1669     Compiler instrumentation ensures that two adjacent buffers on the stack are
1670     given different tags, this means an access to one buffer using a pointer
1671     generated from the other (e.g. through buffer overrun) will have mismatched
1672     tags and be caught by hwasan.
1673 
1674     We don't randomly tag every object on the stack, since that would require
1675     keeping many registers to record each tag.  Instead we randomly generate a
1676     tag for each function frame, and each new stack object uses a tag offset
1677     from that frame tag.
1678     i.e. each object is tagged as RFT + offset, where RFT is the "random frame
1679     tag" generated for this frame.
1680     This means that randomisation does not peturb the difference between tags
1681     on tagged stack objects within a frame, but this is mitigated by the fact
1682     that objects with the same tag within a frame are very far apart
1683     (approx. 2^HWASAN_TAG_SIZE objects apart).
1684 
1685     As a demonstration, using the same example program as in the asan block
1686     comment above:
1687 
1688      int
1689      foo ()
1690      {
1691        char a[24] = {0};
1692        int b[2] = {0};
1693 
1694        a[5] = 1;
1695        b[1] = 2;
1696 
1697        return a[5] + b[1];
1698      }
1699 
1700     On AArch64 the stack will be ordered as follows for the above function:
1701 
1702     Slot 1/ [24 bytes for variable 'a']
1703     Slot 2/ [8 bytes padding for alignment]
1704     Slot 3/ [8 bytes for variable 'b']
1705     Slot 4/ [8 bytes padding for alignment]
1706 
1707     (The padding is there to ensure 16 byte alignment as described in the 16
1708      byte granule implications).
1709 
1710     While the shadow memory will be ordered as follows:
1711 
1712     - 2 bytes (representing 32 bytes in real memory) tagged with RFT + 1.
1713     - 1 byte (representing 16 bytes in real memory) tagged with RFT + 2.
1714 
1715     And any pointer to "a" will have the tag RFT + 1, and any pointer to "b"
1716     will have the tag RFT + 2.
1717 
1718    [Top Byte Ignore requirements]
1719     Hwasan requires the ability to store an 8 bit tag in every pointer.  There
1720     is no instrumentation done to remove this tag from pointers before
1721     dereferencing, which means the hardware must ignore this tag during memory
1722     accesses.
1723 
1724     Architectures where this feature is available should indicate this using
1725     the TARGET_MEMTAG_CAN_TAG_ADDRESSES hook.
1726 
1727    [Stack requires cleanup on unwinding]
1728     During normal operation of a hwasan sanitized program more space in the
1729     shadow memory becomes tagged as the stack grows.  As the stack shrinks this
1730     shadow memory space must become untagged.  If it is not untagged then when
1731     the stack grows again (during other function calls later on in the program)
1732     objects on the stack that are usually not tagged (e.g. parameters passed on
1733     the stack) can be placed in memory whose shadow space is tagged with
1734     something else, and accesses can cause false positive reports.
1735 
1736     Hence we place untagging code on every epilogue of functions which tag some
1737     stack objects.
1738 
1739     Moreover, the run-time library intercepts longjmp & setjmp to untag when
1740     the stack is unwound this way.
1741 
1742     C++ exceptions are not yet handled, which means this sanitizer can not
1743     handle C++ code that throws exceptions -- it will give false positives
1744     after an exception has been thrown.  The implementation that the hwasan
1745     library has for handling these relies on the frame pointer being after any
1746     local variables.  This is not generally the case for GCC.  */
1747 
1748 
1749 /* Returns whether we are tagging pointers and checking those tags on memory
1750    access.  */
1751 bool
hwasan_sanitize_p()1752 hwasan_sanitize_p ()
1753 {
1754   return sanitize_flags_p (SANITIZE_HWADDRESS);
1755 }
1756 
1757 /* Are we tagging the stack?  */
1758 bool
hwasan_sanitize_stack_p()1759 hwasan_sanitize_stack_p ()
1760 {
1761   return (hwasan_sanitize_p () && param_hwasan_instrument_stack);
1762 }
1763 
1764 /* Are we tagging alloca objects?  */
1765 bool
hwasan_sanitize_allocas_p(void)1766 hwasan_sanitize_allocas_p (void)
1767 {
1768   return (hwasan_sanitize_stack_p () && param_hwasan_instrument_allocas);
1769 }
1770 
1771 /* Should we instrument reads?  */
1772 bool
hwasan_instrument_reads(void)1773 hwasan_instrument_reads (void)
1774 {
1775   return (hwasan_sanitize_p () && param_hwasan_instrument_reads);
1776 }
1777 
1778 /* Should we instrument writes?  */
1779 bool
hwasan_instrument_writes(void)1780 hwasan_instrument_writes (void)
1781 {
1782   return (hwasan_sanitize_p () && param_hwasan_instrument_writes);
1783 }
1784 
1785 /* Should we instrument builtin calls?  */
1786 bool
hwasan_memintrin(void)1787 hwasan_memintrin (void)
1788 {
1789   return (hwasan_sanitize_p () && param_hwasan_instrument_mem_intrinsics);
1790 }
1791 
1792 /* Insert code to protect stack vars.  The prologue sequence should be emitted
1793    directly, epilogue sequence returned.  BASE is the register holding the
1794    stack base, against which OFFSETS array offsets are relative to, OFFSETS
1795    array contains pairs of offsets in reverse order, always the end offset
1796    of some gap that needs protection followed by starting offset,
1797    and DECLS is an array of representative decls for each var partition.
1798    LENGTH is the length of the OFFSETS array, DECLS array is LENGTH / 2 - 1
1799    elements long (OFFSETS include gap before the first variable as well
1800    as gaps after each stack variable).  PBASE is, if non-NULL, some pseudo
1801    register which stack vars DECL_RTLs are based on.  Either BASE should be
1802    assigned to PBASE, when not doing use after return protection, or
1803    corresponding address based on __asan_stack_malloc* return value.  */
1804 
1805 rtx_insn *
asan_emit_stack_protection(rtx base,rtx pbase,unsigned int alignb,HOST_WIDE_INT * offsets,tree * decls,int length)1806 asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb,
1807 			    HOST_WIDE_INT *offsets, tree *decls, int length)
1808 {
1809   rtx shadow_base, shadow_mem, ret, mem, orig_base;
1810   rtx_code_label *lab;
1811   rtx_insn *insns;
1812   char buf[32];
1813   HOST_WIDE_INT base_offset = offsets[length - 1];
1814   HOST_WIDE_INT base_align_bias = 0, offset, prev_offset;
1815   HOST_WIDE_INT asan_frame_size = offsets[0] - base_offset;
1816   HOST_WIDE_INT last_offset, last_size, last_size_aligned;
1817   int l;
1818   unsigned char cur_shadow_byte = ASAN_STACK_MAGIC_LEFT;
1819   tree str_cst, decl, id;
1820   int use_after_return_class = -1;
1821 
1822   /* Don't emit anything when doing error recovery, the assertions
1823      might fail e.g. if a function had a frame offset overflow.  */
1824   if (seen_error ())
1825     return NULL;
1826 
1827   if (shadow_ptr_types[0] == NULL_TREE)
1828     asan_init_shadow_ptr_types ();
1829 
1830   expanded_location cfun_xloc
1831     = expand_location (DECL_SOURCE_LOCATION (current_function_decl));
1832 
1833   /* First of all, prepare the description string.  */
1834   pretty_printer asan_pp;
1835 
1836   pp_decimal_int (&asan_pp, length / 2 - 1);
1837   pp_space (&asan_pp);
1838   for (l = length - 2; l; l -= 2)
1839     {
1840       tree decl = decls[l / 2 - 1];
1841       pp_wide_integer (&asan_pp, offsets[l] - base_offset);
1842       pp_space (&asan_pp);
1843       pp_wide_integer (&asan_pp, offsets[l - 1] - offsets[l]);
1844       pp_space (&asan_pp);
1845 
1846       expanded_location xloc
1847 	= expand_location (DECL_SOURCE_LOCATION (decl));
1848       char location[32];
1849 
1850       if (xloc.file == cfun_xloc.file)
1851 	sprintf (location, ":%d", xloc.line);
1852       else
1853 	location[0] = '\0';
1854 
1855       if (DECL_P (decl) && DECL_NAME (decl))
1856 	{
1857 	  unsigned idlen
1858 	    = IDENTIFIER_LENGTH (DECL_NAME (decl)) + strlen (location);
1859 	  pp_decimal_int (&asan_pp, idlen);
1860 	  pp_space (&asan_pp);
1861 	  pp_tree_identifier (&asan_pp, DECL_NAME (decl));
1862 	  pp_string (&asan_pp, location);
1863 	}
1864       else
1865 	pp_string (&asan_pp, "9 <unknown>");
1866 
1867       if (l > 2)
1868 	pp_space (&asan_pp);
1869     }
1870   str_cst = asan_pp_string (&asan_pp);
1871 
1872   gcc_checking_assert (offsets[0] == (crtl->stack_protect_guard
1873 				      ? -ASAN_RED_ZONE_SIZE : 0));
1874   /* Emit the prologue sequence.  */
1875   if (asan_frame_size > 32 && asan_frame_size <= 65536 && pbase
1876       && param_asan_use_after_return)
1877     {
1878       HOST_WIDE_INT adjusted_frame_size = asan_frame_size;
1879       /* The stack protector guard is allocated at the top of the frame
1880 	 and cfgexpand.cc then uses align_frame_offset (ASAN_RED_ZONE_SIZE);
1881 	 while in that case we can still use asan_frame_size, we need to take
1882 	 that into account when computing base_align_bias.  */
1883       if (alignb > ASAN_RED_ZONE_SIZE && crtl->stack_protect_guard)
1884 	adjusted_frame_size += ASAN_RED_ZONE_SIZE;
1885       use_after_return_class = floor_log2 (asan_frame_size - 1) - 5;
1886       /* __asan_stack_malloc_N guarantees alignment
1887 	 N < 6 ? (64 << N) : 4096 bytes.  */
1888       if (alignb > (use_after_return_class < 6
1889 		    ? (64U << use_after_return_class) : 4096U))
1890 	use_after_return_class = -1;
1891       else if (alignb > ASAN_RED_ZONE_SIZE
1892 	       && (adjusted_frame_size & (alignb - 1)))
1893 	{
1894 	  base_align_bias
1895 	    = ((adjusted_frame_size + alignb - 1)
1896 	       & ~(alignb - HOST_WIDE_INT_1)) - adjusted_frame_size;
1897 	  use_after_return_class
1898 	    = floor_log2 (asan_frame_size + base_align_bias - 1) - 5;
1899 	  if (use_after_return_class > 10)
1900 	    {
1901 	      base_align_bias = 0;
1902 	      use_after_return_class = -1;
1903 	    }
1904 	}
1905     }
1906 
1907   /* Align base if target is STRICT_ALIGNMENT.  */
1908   if (STRICT_ALIGNMENT)
1909     {
1910       const HOST_WIDE_INT align
1911 	= (GET_MODE_ALIGNMENT (SImode) / BITS_PER_UNIT) << ASAN_SHADOW_SHIFT;
1912       base = expand_binop (Pmode, and_optab, base, gen_int_mode (-align, Pmode),
1913 			   NULL_RTX, 1, OPTAB_DIRECT);
1914     }
1915 
1916   if (use_after_return_class == -1 && pbase)
1917     emit_move_insn (pbase, base);
1918 
1919   base = expand_binop (Pmode, add_optab, base,
1920 		       gen_int_mode (base_offset - base_align_bias, Pmode),
1921 		       NULL_RTX, 1, OPTAB_DIRECT);
1922   orig_base = NULL_RTX;
1923   if (use_after_return_class != -1)
1924     {
1925       if (asan_detect_stack_use_after_return == NULL_TREE)
1926 	{
1927 	  id = get_identifier ("__asan_option_detect_stack_use_after_return");
1928 	  decl = build_decl (BUILTINS_LOCATION, VAR_DECL, id,
1929 			     integer_type_node);
1930 	  SET_DECL_ASSEMBLER_NAME (decl, id);
1931 	  TREE_ADDRESSABLE (decl) = 1;
1932 	  DECL_ARTIFICIAL (decl) = 1;
1933 	  DECL_IGNORED_P (decl) = 1;
1934 	  DECL_EXTERNAL (decl) = 1;
1935 	  TREE_STATIC (decl) = 1;
1936 	  TREE_PUBLIC (decl) = 1;
1937 	  TREE_USED (decl) = 1;
1938 	  asan_detect_stack_use_after_return = decl;
1939 	}
1940       orig_base = gen_reg_rtx (Pmode);
1941       emit_move_insn (orig_base, base);
1942       ret = expand_normal (asan_detect_stack_use_after_return);
1943       lab = gen_label_rtx ();
1944       emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1945 			       VOIDmode, 0, lab,
1946 			       profile_probability::very_likely ());
1947       snprintf (buf, sizeof buf, "__asan_stack_malloc_%d",
1948 		use_after_return_class);
1949       ret = init_one_libfunc (buf);
1950       ret = emit_library_call_value (ret, NULL_RTX, LCT_NORMAL, ptr_mode,
1951 				     GEN_INT (asan_frame_size
1952 					      + base_align_bias),
1953 				     TYPE_MODE (pointer_sized_int_node));
1954       /* __asan_stack_malloc_[n] returns a pointer to fake stack if succeeded
1955 	 and NULL otherwise.  Check RET value is NULL here and jump over the
1956 	 BASE reassignment in this case.  Otherwise, reassign BASE to RET.  */
1957       emit_cmp_and_jump_insns (ret, const0_rtx, EQ, NULL_RTX,
1958 			       VOIDmode, 0, lab,
1959 			       profile_probability:: very_unlikely ());
1960       ret = convert_memory_address (Pmode, ret);
1961       emit_move_insn (base, ret);
1962       emit_label (lab);
1963       emit_move_insn (pbase, expand_binop (Pmode, add_optab, base,
1964 					   gen_int_mode (base_align_bias
1965 							 - base_offset, Pmode),
1966 					   NULL_RTX, 1, OPTAB_DIRECT));
1967     }
1968   mem = gen_rtx_MEM (ptr_mode, base);
1969   mem = adjust_address (mem, VOIDmode, base_align_bias);
1970   emit_move_insn (mem, gen_int_mode (ASAN_STACK_FRAME_MAGIC, ptr_mode));
1971   mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1972   emit_move_insn (mem, expand_normal (str_cst));
1973   mem = adjust_address (mem, VOIDmode, GET_MODE_SIZE (ptr_mode));
1974   ASM_GENERATE_INTERNAL_LABEL (buf, "LASANPC", current_function_funcdef_no);
1975   id = get_identifier (buf);
1976   decl = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1977 		    VAR_DECL, id, char_type_node);
1978   SET_DECL_ASSEMBLER_NAME (decl, id);
1979   TREE_ADDRESSABLE (decl) = 1;
1980   TREE_READONLY (decl) = 1;
1981   DECL_ARTIFICIAL (decl) = 1;
1982   DECL_IGNORED_P (decl) = 1;
1983   TREE_STATIC (decl) = 1;
1984   TREE_PUBLIC (decl) = 0;
1985   TREE_USED (decl) = 1;
1986   DECL_INITIAL (decl) = decl;
1987   TREE_ASM_WRITTEN (decl) = 1;
1988   TREE_ASM_WRITTEN (id) = 1;
1989   emit_move_insn (mem, expand_normal (build_fold_addr_expr (decl)));
1990   shadow_base = expand_binop (Pmode, lshr_optab, base,
1991 			      gen_int_shift_amount (Pmode, ASAN_SHADOW_SHIFT),
1992 			      NULL_RTX, 1, OPTAB_DIRECT);
1993   shadow_base
1994     = plus_constant (Pmode, shadow_base,
1995 		     asan_shadow_offset ()
1996 		     + (base_align_bias >> ASAN_SHADOW_SHIFT));
1997   gcc_assert (asan_shadow_set != -1
1998 	      && (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
1999   shadow_mem = gen_rtx_MEM (SImode, shadow_base);
2000   set_mem_alias_set (shadow_mem, asan_shadow_set);
2001   if (STRICT_ALIGNMENT)
2002     set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
2003   prev_offset = base_offset;
2004 
2005   asan_redzone_buffer rz_buffer (shadow_mem, prev_offset);
2006   for (l = length; l; l -= 2)
2007     {
2008       if (l == 2)
2009 	cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT;
2010       offset = offsets[l - 1];
2011 
2012       bool extra_byte = (offset - base_offset) & (ASAN_SHADOW_GRANULARITY - 1);
2013       /* If a red-zone is not aligned to ASAN_SHADOW_GRANULARITY then
2014 	 the previous stack variable has size % ASAN_SHADOW_GRANULARITY != 0.
2015 	 In that case we have to emit one extra byte that will describe
2016 	 how many bytes (our of ASAN_SHADOW_GRANULARITY) can be accessed.  */
2017       if (extra_byte)
2018 	{
2019 	  HOST_WIDE_INT aoff
2020 	    = base_offset + ((offset - base_offset)
2021 			     & ~(ASAN_SHADOW_GRANULARITY - HOST_WIDE_INT_1));
2022 	  rz_buffer.emit_redzone_byte (aoff, offset - aoff);
2023 	  offset = aoff + ASAN_SHADOW_GRANULARITY;
2024 	}
2025 
2026       /* Calculate size of red zone payload.  */
2027       while (offset < offsets[l - 2])
2028 	{
2029 	  rz_buffer.emit_redzone_byte (offset, cur_shadow_byte);
2030 	  offset += ASAN_SHADOW_GRANULARITY;
2031 	}
2032 
2033       cur_shadow_byte = ASAN_STACK_MAGIC_MIDDLE;
2034     }
2035 
2036   /* As the automatic variables are aligned to
2037      ASAN_RED_ZONE_SIZE / ASAN_SHADOW_GRANULARITY, the buffer should be
2038      flushed here.  */
2039   gcc_assert (rz_buffer.m_shadow_bytes.is_empty ());
2040 
2041   do_pending_stack_adjust ();
2042 
2043   /* Construct epilogue sequence.  */
2044   start_sequence ();
2045 
2046   lab = NULL;
2047   if (use_after_return_class != -1)
2048     {
2049       rtx_code_label *lab2 = gen_label_rtx ();
2050       char c = (char) ASAN_STACK_MAGIC_USE_AFTER_RET;
2051       emit_cmp_and_jump_insns (orig_base, base, EQ, NULL_RTX,
2052 			       VOIDmode, 0, lab2,
2053 			       profile_probability::very_likely ());
2054       shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
2055       set_mem_alias_set (shadow_mem, asan_shadow_set);
2056       mem = gen_rtx_MEM (ptr_mode, base);
2057       mem = adjust_address (mem, VOIDmode, base_align_bias);
2058       emit_move_insn (mem, gen_int_mode (ASAN_STACK_RETIRED_MAGIC, ptr_mode));
2059       unsigned HOST_WIDE_INT sz = asan_frame_size >> ASAN_SHADOW_SHIFT;
2060       if (use_after_return_class < 5
2061 	  && can_store_by_pieces (sz, builtin_memset_read_str, &c,
2062 				  BITS_PER_UNIT, true))
2063 	{
2064 	  /* Emit:
2065 	       memset(ShadowBase, kAsanStackAfterReturnMagic, ShadowSize);
2066 	       **SavedFlagPtr(FakeStack, class_id) = 0
2067 	  */
2068 	  store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c,
2069 			   BITS_PER_UNIT, true, RETURN_BEGIN);
2070 
2071 	  unsigned HOST_WIDE_INT offset
2072 	    = (1 << (use_after_return_class + 6));
2073 	  offset -= GET_MODE_SIZE (ptr_mode);
2074 	  mem = gen_rtx_MEM (ptr_mode, base);
2075 	  mem = adjust_address (mem, ptr_mode, offset);
2076 	  rtx addr = gen_reg_rtx (ptr_mode);
2077 	  emit_move_insn (addr, mem);
2078 	  addr = convert_memory_address (Pmode, addr);
2079 	  mem = gen_rtx_MEM (QImode, addr);
2080 	  emit_move_insn (mem, const0_rtx);
2081 	}
2082       else if (use_after_return_class >= 5
2083 	       || !set_storage_via_setmem (shadow_mem,
2084 					   GEN_INT (sz),
2085 					   gen_int_mode (c, QImode),
2086 					   BITS_PER_UNIT, BITS_PER_UNIT,
2087 					   -1, sz, sz, sz))
2088 	{
2089 	  snprintf (buf, sizeof buf, "__asan_stack_free_%d",
2090 		    use_after_return_class);
2091 	  ret = init_one_libfunc (buf);
2092 	  rtx addr = convert_memory_address (ptr_mode, base);
2093 	  rtx orig_addr = convert_memory_address (ptr_mode, orig_base);
2094 	  emit_library_call (ret, LCT_NORMAL, ptr_mode, addr, ptr_mode,
2095 			     GEN_INT (asan_frame_size + base_align_bias),
2096 			     TYPE_MODE (pointer_sized_int_node),
2097 			     orig_addr, ptr_mode);
2098 	}
2099       lab = gen_label_rtx ();
2100       emit_jump (lab);
2101       emit_label (lab2);
2102     }
2103 
2104   shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
2105   set_mem_alias_set (shadow_mem, asan_shadow_set);
2106 
2107   if (STRICT_ALIGNMENT)
2108     set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
2109 
2110   prev_offset = base_offset;
2111   last_offset = base_offset;
2112   last_size = 0;
2113   last_size_aligned = 0;
2114   for (l = length; l; l -= 2)
2115     {
2116       offset = base_offset + ((offsets[l - 1] - base_offset)
2117 			      & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
2118       if (last_offset + last_size_aligned < offset)
2119 	{
2120 	  shadow_mem = adjust_address (shadow_mem, VOIDmode,
2121 				       (last_offset - prev_offset)
2122 				       >> ASAN_SHADOW_SHIFT);
2123 	  prev_offset = last_offset;
2124 	  asan_clear_shadow (shadow_mem, last_size_aligned >> ASAN_SHADOW_SHIFT);
2125 	  last_offset = offset;
2126 	  last_size = 0;
2127 	}
2128       else
2129 	last_size = offset - last_offset;
2130       last_size += base_offset + ((offsets[l - 2] - base_offset)
2131 				  & ~(ASAN_MIN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
2132 		   - offset;
2133 
2134       /* Unpoison shadow memory that corresponds to a variable that is
2135 	 is subject of use-after-return sanitization.  */
2136       if (l > 2)
2137 	{
2138 	  decl = decls[l / 2 - 2];
2139 	  if (asan_handled_variables != NULL
2140 	      && asan_handled_variables->contains (decl))
2141 	    {
2142 	      HOST_WIDE_INT size = offsets[l - 3] - offsets[l - 2];
2143 	      if (dump_file && (dump_flags & TDF_DETAILS))
2144 		{
2145 		  const char *n = (DECL_NAME (decl)
2146 				   ? IDENTIFIER_POINTER (DECL_NAME (decl))
2147 				   : "<unknown>");
2148 		  fprintf (dump_file, "Unpoisoning shadow stack for variable: "
2149 			   "%s (%" PRId64 " B)\n", n, size);
2150 		}
2151 
2152 		last_size += size & ~(ASAN_MIN_RED_ZONE_SIZE - HOST_WIDE_INT_1);
2153 	    }
2154 	}
2155       last_size_aligned
2156 	= ((last_size + (ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1))
2157 	   & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1));
2158     }
2159   if (last_size_aligned)
2160     {
2161       shadow_mem = adjust_address (shadow_mem, VOIDmode,
2162 				   (last_offset - prev_offset)
2163 				   >> ASAN_SHADOW_SHIFT);
2164       asan_clear_shadow (shadow_mem, last_size_aligned >> ASAN_SHADOW_SHIFT);
2165     }
2166 
2167   /* Clean-up set with instrumented stack variables.  */
2168   delete asan_handled_variables;
2169   asan_handled_variables = NULL;
2170   delete asan_used_labels;
2171   asan_used_labels = NULL;
2172 
2173   do_pending_stack_adjust ();
2174   if (lab)
2175     emit_label (lab);
2176 
2177   insns = get_insns ();
2178   end_sequence ();
2179   return insns;
2180 }
2181 
2182 /* Emit __asan_allocas_unpoison (top, bot) call.  The BASE parameter corresponds
2183    to BOT argument, for TOP virtual_stack_dynamic_rtx is used.  NEW_SEQUENCE
2184    indicates whether we're emitting new instructions sequence or not.  */
2185 
2186 rtx_insn *
asan_emit_allocas_unpoison(rtx top,rtx bot,rtx_insn * before)2187 asan_emit_allocas_unpoison (rtx top, rtx bot, rtx_insn *before)
2188 {
2189   if (before)
2190     push_to_sequence (before);
2191   else
2192     start_sequence ();
2193   rtx ret = init_one_libfunc ("__asan_allocas_unpoison");
2194   top = convert_memory_address (ptr_mode, top);
2195   bot = convert_memory_address (ptr_mode, bot);
2196   emit_library_call (ret, LCT_NORMAL, ptr_mode,
2197 		     top, ptr_mode, bot, ptr_mode);
2198 
2199   do_pending_stack_adjust ();
2200   rtx_insn *insns = get_insns ();
2201   end_sequence ();
2202   return insns;
2203 }
2204 
2205 /* Return true if DECL, a global var, might be overridden and needs
2206    therefore a local alias.  */
2207 
2208 static bool
asan_needs_local_alias(tree decl)2209 asan_needs_local_alias (tree decl)
2210 {
2211   return DECL_WEAK (decl) || !targetm.binds_local_p (decl);
2212 }
2213 
2214 /* Return true if DECL, a global var, is an artificial ODR indicator symbol
2215    therefore doesn't need protection.  */
2216 
2217 static bool
is_odr_indicator(tree decl)2218 is_odr_indicator (tree decl)
2219 {
2220   return (DECL_ARTIFICIAL (decl)
2221 	  && lookup_attribute ("asan odr indicator", DECL_ATTRIBUTES (decl)));
2222 }
2223 
2224 /* Return true if DECL is a VAR_DECL that should be protected
2225    by Address Sanitizer, by appending a red zone with protected
2226    shadow memory after it and aligning it to at least
2227    ASAN_RED_ZONE_SIZE bytes.  */
2228 
2229 bool
asan_protect_global(tree decl,bool ignore_decl_rtl_set_p)2230 asan_protect_global (tree decl, bool ignore_decl_rtl_set_p)
2231 {
2232   if (!param_asan_globals)
2233     return false;
2234 
2235   rtx rtl, symbol;
2236 
2237   if (TREE_CODE (decl) == STRING_CST)
2238     {
2239       /* Instrument all STRING_CSTs except those created
2240 	 by asan_pp_string here.  */
2241       if (shadow_ptr_types[0] != NULL_TREE
2242 	  && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
2243 	  && TREE_TYPE (TREE_TYPE (decl)) == TREE_TYPE (shadow_ptr_types[0]))
2244 	return false;
2245       return true;
2246     }
2247   if (!VAR_P (decl)
2248       /* TLS vars aren't statically protectable.  */
2249       || DECL_THREAD_LOCAL_P (decl)
2250       /* Externs will be protected elsewhere.  */
2251       || DECL_EXTERNAL (decl)
2252       /* PR sanitizer/81697: For architectures that use section anchors first
2253 	 call to asan_protect_global may occur before DECL_RTL (decl) is set.
2254 	 We should ignore DECL_RTL_SET_P then, because otherwise the first call
2255 	 to asan_protect_global will return FALSE and the following calls on the
2256 	 same decl after setting DECL_RTL (decl) will return TRUE and we'll end
2257 	 up with inconsistency at runtime.  */
2258       || (!DECL_RTL_SET_P (decl) && !ignore_decl_rtl_set_p)
2259       /* Comdat vars pose an ABI problem, we can't know if
2260 	 the var that is selected by the linker will have
2261 	 padding or not.  */
2262       || DECL_ONE_ONLY (decl)
2263       /* Similarly for common vars.  People can use -fno-common.
2264 	 Note: Linux kernel is built with -fno-common, so we do instrument
2265 	 globals there even if it is C.  */
2266       || (DECL_COMMON (decl) && TREE_PUBLIC (decl))
2267       /* Don't protect if using user section, often vars placed
2268 	 into user section from multiple TUs are then assumed
2269 	 to be an array of such vars, putting padding in there
2270 	 breaks this assumption.  */
2271       || (DECL_SECTION_NAME (decl) != NULL
2272 	  && !symtab_node::get (decl)->implicit_section
2273 	  && !section_sanitized_p (DECL_SECTION_NAME (decl)))
2274       /* Don't protect variables in non-generic address-space.  */
2275       || !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (TREE_TYPE (decl)))
2276       || DECL_SIZE (decl) == 0
2277       || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT
2278       || TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST
2279       || !valid_constant_size_p (DECL_SIZE_UNIT (decl))
2280       || DECL_ALIGN_UNIT (decl) > 2 * ASAN_RED_ZONE_SIZE
2281       || TREE_TYPE (decl) == ubsan_get_source_location_type ()
2282       || is_odr_indicator (decl))
2283     return false;
2284 
2285   if (!ignore_decl_rtl_set_p || DECL_RTL_SET_P (decl))
2286     {
2287 
2288       rtl = DECL_RTL (decl);
2289       if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF)
2290 	return false;
2291       symbol = XEXP (rtl, 0);
2292 
2293       if (CONSTANT_POOL_ADDRESS_P (symbol)
2294 	  || TREE_CONSTANT_POOL_ADDRESS_P (symbol))
2295 	return false;
2296     }
2297 
2298   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
2299     return false;
2300 
2301   if (!TARGET_SUPPORTS_ALIASES && asan_needs_local_alias (decl))
2302     return false;
2303 
2304   return true;
2305 }
2306 
2307 /* Construct a function tree for __asan_report_{load,store}{1,2,4,8,16,_n}.
2308    IS_STORE is either 1 (for a store) or 0 (for a load).  */
2309 
2310 static tree
report_error_func(bool is_store,bool recover_p,HOST_WIDE_INT size_in_bytes,int * nargs)2311 report_error_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2312 		   int *nargs)
2313 {
2314   gcc_assert (!hwasan_sanitize_p ());
2315 
2316   static enum built_in_function report[2][2][6]
2317     = { { { BUILT_IN_ASAN_REPORT_LOAD1, BUILT_IN_ASAN_REPORT_LOAD2,
2318 	    BUILT_IN_ASAN_REPORT_LOAD4, BUILT_IN_ASAN_REPORT_LOAD8,
2319 	    BUILT_IN_ASAN_REPORT_LOAD16, BUILT_IN_ASAN_REPORT_LOAD_N },
2320 	  { BUILT_IN_ASAN_REPORT_STORE1, BUILT_IN_ASAN_REPORT_STORE2,
2321 	    BUILT_IN_ASAN_REPORT_STORE4, BUILT_IN_ASAN_REPORT_STORE8,
2322 	    BUILT_IN_ASAN_REPORT_STORE16, BUILT_IN_ASAN_REPORT_STORE_N } },
2323 	{ { BUILT_IN_ASAN_REPORT_LOAD1_NOABORT,
2324 	    BUILT_IN_ASAN_REPORT_LOAD2_NOABORT,
2325 	    BUILT_IN_ASAN_REPORT_LOAD4_NOABORT,
2326 	    BUILT_IN_ASAN_REPORT_LOAD8_NOABORT,
2327 	    BUILT_IN_ASAN_REPORT_LOAD16_NOABORT,
2328 	    BUILT_IN_ASAN_REPORT_LOAD_N_NOABORT },
2329 	  { BUILT_IN_ASAN_REPORT_STORE1_NOABORT,
2330 	    BUILT_IN_ASAN_REPORT_STORE2_NOABORT,
2331 	    BUILT_IN_ASAN_REPORT_STORE4_NOABORT,
2332 	    BUILT_IN_ASAN_REPORT_STORE8_NOABORT,
2333 	    BUILT_IN_ASAN_REPORT_STORE16_NOABORT,
2334 	    BUILT_IN_ASAN_REPORT_STORE_N_NOABORT } } };
2335   if (size_in_bytes == -1)
2336     {
2337       *nargs = 2;
2338       return builtin_decl_implicit (report[recover_p][is_store][5]);
2339     }
2340   *nargs = 1;
2341   int size_log2 = exact_log2 (size_in_bytes);
2342   return builtin_decl_implicit (report[recover_p][is_store][size_log2]);
2343 }
2344 
2345 /* Construct a function tree for __asan_{load,store}{1,2,4,8,16,_n}.
2346    IS_STORE is either 1 (for a store) or 0 (for a load).  */
2347 
2348 static tree
check_func(bool is_store,bool recover_p,HOST_WIDE_INT size_in_bytes,int * nargs)2349 check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
2350 	    int *nargs)
2351 {
2352   static enum built_in_function check[2][2][6]
2353     = { { { BUILT_IN_ASAN_LOAD1, BUILT_IN_ASAN_LOAD2,
2354 	    BUILT_IN_ASAN_LOAD4, BUILT_IN_ASAN_LOAD8,
2355 	    BUILT_IN_ASAN_LOAD16, BUILT_IN_ASAN_LOADN },
2356 	  { BUILT_IN_ASAN_STORE1, BUILT_IN_ASAN_STORE2,
2357 	    BUILT_IN_ASAN_STORE4, BUILT_IN_ASAN_STORE8,
2358 	    BUILT_IN_ASAN_STORE16, BUILT_IN_ASAN_STOREN } },
2359 	{ { BUILT_IN_ASAN_LOAD1_NOABORT,
2360 	    BUILT_IN_ASAN_LOAD2_NOABORT,
2361 	    BUILT_IN_ASAN_LOAD4_NOABORT,
2362 	    BUILT_IN_ASAN_LOAD8_NOABORT,
2363 	    BUILT_IN_ASAN_LOAD16_NOABORT,
2364 	    BUILT_IN_ASAN_LOADN_NOABORT },
2365 	  { BUILT_IN_ASAN_STORE1_NOABORT,
2366 	    BUILT_IN_ASAN_STORE2_NOABORT,
2367 	    BUILT_IN_ASAN_STORE4_NOABORT,
2368 	    BUILT_IN_ASAN_STORE8_NOABORT,
2369 	    BUILT_IN_ASAN_STORE16_NOABORT,
2370 	    BUILT_IN_ASAN_STOREN_NOABORT } } };
2371   if (size_in_bytes == -1)
2372     {
2373       *nargs = 2;
2374       return builtin_decl_implicit (check[recover_p][is_store][5]);
2375     }
2376   *nargs = 1;
2377   int size_log2 = exact_log2 (size_in_bytes);
2378   return builtin_decl_implicit (check[recover_p][is_store][size_log2]);
2379 }
2380 
2381 /* Split the current basic block and create a condition statement
2382    insertion point right before or after the statement pointed to by
2383    ITER.  Return an iterator to the point at which the caller might
2384    safely insert the condition statement.
2385 
2386    THEN_BLOCK must be set to the address of an uninitialized instance
2387    of basic_block.  The function will then set *THEN_BLOCK to the
2388    'then block' of the condition statement to be inserted by the
2389    caller.
2390 
2391    If CREATE_THEN_FALLTHRU_EDGE is false, no edge will be created from
2392    *THEN_BLOCK to *FALLTHROUGH_BLOCK.
2393 
2394    Similarly, the function will set *FALLTRHOUGH_BLOCK to the 'else
2395    block' of the condition statement to be inserted by the caller.
2396 
2397    Note that *FALLTHROUGH_BLOCK is a new block that contains the
2398    statements starting from *ITER, and *THEN_BLOCK is a new empty
2399    block.
2400 
2401    *ITER is adjusted to point to always point to the first statement
2402     of the basic block * FALLTHROUGH_BLOCK.  That statement is the
2403     same as what ITER was pointing to prior to calling this function,
2404     if BEFORE_P is true; otherwise, it is its following statement.  */
2405 
2406 gimple_stmt_iterator
create_cond_insert_point(gimple_stmt_iterator * iter,bool before_p,bool then_more_likely_p,bool create_then_fallthru_edge,basic_block * then_block,basic_block * fallthrough_block)2407 create_cond_insert_point (gimple_stmt_iterator *iter,
2408 			  bool before_p,
2409 			  bool then_more_likely_p,
2410 			  bool create_then_fallthru_edge,
2411 			  basic_block *then_block,
2412 			  basic_block *fallthrough_block)
2413 {
2414   gimple_stmt_iterator gsi = *iter;
2415 
2416   if (!gsi_end_p (gsi) && before_p)
2417     gsi_prev (&gsi);
2418 
2419   basic_block cur_bb = gsi_bb (*iter);
2420 
2421   edge e = split_block (cur_bb, gsi_stmt (gsi));
2422 
2423   /* Get a hold on the 'condition block', the 'then block' and the
2424      'else block'.  */
2425   basic_block cond_bb = e->src;
2426   basic_block fallthru_bb = e->dest;
2427   basic_block then_bb = create_empty_bb (cond_bb);
2428   if (current_loops)
2429     {
2430       add_bb_to_loop (then_bb, cond_bb->loop_father);
2431       loops_state_set (LOOPS_NEED_FIXUP);
2432     }
2433 
2434   /* Set up the newly created 'then block'.  */
2435   e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
2436   profile_probability fallthrough_probability
2437     = then_more_likely_p
2438     ? profile_probability::very_unlikely ()
2439     : profile_probability::very_likely ();
2440   e->probability = fallthrough_probability.invert ();
2441   then_bb->count = e->count ();
2442   if (create_then_fallthru_edge)
2443     make_single_succ_edge (then_bb, fallthru_bb, EDGE_FALLTHRU);
2444 
2445   /* Set up the fallthrough basic block.  */
2446   e = find_edge (cond_bb, fallthru_bb);
2447   e->flags = EDGE_FALSE_VALUE;
2448   e->probability = fallthrough_probability;
2449 
2450   /* Update dominance info for the newly created then_bb; note that
2451      fallthru_bb's dominance info has already been updated by
2452      split_bock.  */
2453   if (dom_info_available_p (CDI_DOMINATORS))
2454     set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
2455 
2456   *then_block = then_bb;
2457   *fallthrough_block = fallthru_bb;
2458   *iter = gsi_start_bb (fallthru_bb);
2459 
2460   return gsi_last_bb (cond_bb);
2461 }
2462 
2463 /* Insert an if condition followed by a 'then block' right before the
2464    statement pointed to by ITER.  The fallthrough block -- which is the
2465    else block of the condition as well as the destination of the
2466    outcoming edge of the 'then block' -- starts with the statement
2467    pointed to by ITER.
2468 
2469    COND is the condition of the if.
2470 
2471    If THEN_MORE_LIKELY_P is true, the probability of the edge to the
2472    'then block' is higher than the probability of the edge to the
2473    fallthrough block.
2474 
2475    Upon completion of the function, *THEN_BB is set to the newly
2476    inserted 'then block' and similarly, *FALLTHROUGH_BB is set to the
2477    fallthrough block.
2478 
2479    *ITER is adjusted to still point to the same statement it was
2480    pointing to initially.  */
2481 
2482 static void
insert_if_then_before_iter(gcond * cond,gimple_stmt_iterator * iter,bool then_more_likely_p,basic_block * then_bb,basic_block * fallthrough_bb)2483 insert_if_then_before_iter (gcond *cond,
2484 			    gimple_stmt_iterator *iter,
2485 			    bool then_more_likely_p,
2486 			    basic_block *then_bb,
2487 			    basic_block *fallthrough_bb)
2488 {
2489   gimple_stmt_iterator cond_insert_point =
2490     create_cond_insert_point (iter,
2491 			      /*before_p=*/true,
2492 			      then_more_likely_p,
2493 			      /*create_then_fallthru_edge=*/true,
2494 			      then_bb,
2495 			      fallthrough_bb);
2496   gsi_insert_after (&cond_insert_point, cond, GSI_NEW_STMT);
2497 }
2498 
2499 /* Build (base_addr >> ASAN_SHADOW_SHIFT) + asan_shadow_offset ().
2500    If RETURN_ADDRESS is set to true, return memory location instread
2501    of a value in the shadow memory.  */
2502 
2503 static tree
build_shadow_mem_access(gimple_stmt_iterator * gsi,location_t location,tree base_addr,tree shadow_ptr_type,bool return_address=false)2504 build_shadow_mem_access (gimple_stmt_iterator *gsi, location_t location,
2505 			 tree base_addr, tree shadow_ptr_type,
2506 			 bool return_address = false)
2507 {
2508   tree t, uintptr_type = TREE_TYPE (base_addr);
2509   tree shadow_type = TREE_TYPE (shadow_ptr_type);
2510   gimple *g;
2511 
2512   t = build_int_cst (uintptr_type, ASAN_SHADOW_SHIFT);
2513   g = gimple_build_assign (make_ssa_name (uintptr_type), RSHIFT_EXPR,
2514 			   base_addr, t);
2515   gimple_set_location (g, location);
2516   gsi_insert_after (gsi, g, GSI_NEW_STMT);
2517 
2518   t = build_int_cst (uintptr_type, asan_shadow_offset ());
2519   g = gimple_build_assign (make_ssa_name (uintptr_type), PLUS_EXPR,
2520 			   gimple_assign_lhs (g), t);
2521   gimple_set_location (g, location);
2522   gsi_insert_after (gsi, g, GSI_NEW_STMT);
2523 
2524   g = gimple_build_assign (make_ssa_name (shadow_ptr_type), NOP_EXPR,
2525 			   gimple_assign_lhs (g));
2526   gimple_set_location (g, location);
2527   gsi_insert_after (gsi, g, GSI_NEW_STMT);
2528 
2529   if (!return_address)
2530     {
2531       t = build2 (MEM_REF, shadow_type, gimple_assign_lhs (g),
2532 		  build_int_cst (shadow_ptr_type, 0));
2533       g = gimple_build_assign (make_ssa_name (shadow_type), MEM_REF, t);
2534       gimple_set_location (g, location);
2535       gsi_insert_after (gsi, g, GSI_NEW_STMT);
2536     }
2537 
2538   return gimple_assign_lhs (g);
2539 }
2540 
2541 /* BASE can already be an SSA_NAME; in that case, do not create a
2542    new SSA_NAME for it.  */
2543 
2544 static tree
maybe_create_ssa_name(location_t loc,tree base,gimple_stmt_iterator * iter,bool before_p)2545 maybe_create_ssa_name (location_t loc, tree base, gimple_stmt_iterator *iter,
2546 		       bool before_p)
2547 {
2548   STRIP_USELESS_TYPE_CONVERSION (base);
2549   if (TREE_CODE (base) == SSA_NAME)
2550     return base;
2551   gimple *g = gimple_build_assign (make_ssa_name (TREE_TYPE (base)), base);
2552   gimple_set_location (g, loc);
2553   if (before_p)
2554     gsi_insert_before (iter, g, GSI_SAME_STMT);
2555   else
2556     gsi_insert_after (iter, g, GSI_NEW_STMT);
2557   return gimple_assign_lhs (g);
2558 }
2559 
2560 /* LEN can already have necessary size and precision;
2561    in that case, do not create a new variable.  */
2562 
2563 tree
maybe_cast_to_ptrmode(location_t loc,tree len,gimple_stmt_iterator * iter,bool before_p)2564 maybe_cast_to_ptrmode (location_t loc, tree len, gimple_stmt_iterator *iter,
2565 		       bool before_p)
2566 {
2567   if (ptrofftype_p (len))
2568     return len;
2569   gimple *g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
2570 				  NOP_EXPR, len);
2571   gimple_set_location (g, loc);
2572   if (before_p)
2573     gsi_insert_before (iter, g, GSI_SAME_STMT);
2574   else
2575     gsi_insert_after (iter, g, GSI_NEW_STMT);
2576   return gimple_assign_lhs (g);
2577 }
2578 
2579 /* Instrument the memory access instruction BASE.  Insert new
2580    statements before or after ITER.
2581 
2582    Note that the memory access represented by BASE can be either an
2583    SSA_NAME, or a non-SSA expression.  LOCATION is the source code
2584    location.  IS_STORE is TRUE for a store, FALSE for a load.
2585    BEFORE_P is TRUE for inserting the instrumentation code before
2586    ITER, FALSE for inserting it after ITER.  IS_SCALAR_ACCESS is TRUE
2587    for a scalar memory access and FALSE for memory region access.
2588    NON_ZERO_P is TRUE if memory region is guaranteed to have non-zero
2589    length.  ALIGN tells alignment of accessed memory object.
2590 
2591    START_INSTRUMENTED and END_INSTRUMENTED are TRUE if start/end of
2592    memory region have already been instrumented.
2593 
2594    If BEFORE_P is TRUE, *ITER is arranged to still point to the
2595    statement it was pointing to prior to calling this function,
2596    otherwise, it points to the statement logically following it.  */
2597 
2598 static void
build_check_stmt(location_t loc,tree base,tree len,HOST_WIDE_INT size_in_bytes,gimple_stmt_iterator * iter,bool is_non_zero_len,bool before_p,bool is_store,bool is_scalar_access,unsigned int align=0)2599 build_check_stmt (location_t loc, tree base, tree len,
2600 		  HOST_WIDE_INT size_in_bytes, gimple_stmt_iterator *iter,
2601 		  bool is_non_zero_len, bool before_p, bool is_store,
2602 		  bool is_scalar_access, unsigned int align = 0)
2603 {
2604   gimple_stmt_iterator gsi = *iter;
2605   gimple *g;
2606 
2607   gcc_assert (!(size_in_bytes > 0 && !is_non_zero_len));
2608   gcc_assert (size_in_bytes == -1 || size_in_bytes >= 1);
2609 
2610   gsi = *iter;
2611 
2612   base = unshare_expr (base);
2613   base = maybe_create_ssa_name (loc, base, &gsi, before_p);
2614 
2615   if (len)
2616     {
2617       len = unshare_expr (len);
2618       len = maybe_cast_to_ptrmode (loc, len, iter, before_p);
2619     }
2620   else
2621     {
2622       gcc_assert (size_in_bytes != -1);
2623       len = build_int_cst (pointer_sized_int_node, size_in_bytes);
2624     }
2625 
2626   if (size_in_bytes > 1)
2627     {
2628       if ((size_in_bytes & (size_in_bytes - 1)) != 0
2629 	  || size_in_bytes > 16)
2630 	is_scalar_access = false;
2631       else if (align && align < size_in_bytes * BITS_PER_UNIT)
2632 	{
2633 	  /* On non-strict alignment targets, if
2634 	     16-byte access is just 8-byte aligned,
2635 	     this will result in misaligned shadow
2636 	     memory 2 byte load, but otherwise can
2637 	     be handled using one read.  */
2638 	  if (size_in_bytes != 16
2639 	      || STRICT_ALIGNMENT
2640 	      || align < 8 * BITS_PER_UNIT)
2641 	    is_scalar_access = false;
2642 	}
2643     }
2644 
2645   HOST_WIDE_INT flags = 0;
2646   if (is_store)
2647     flags |= ASAN_CHECK_STORE;
2648   if (is_non_zero_len)
2649     flags |= ASAN_CHECK_NON_ZERO_LEN;
2650   if (is_scalar_access)
2651     flags |= ASAN_CHECK_SCALAR_ACCESS;
2652 
2653   enum internal_fn fn = hwasan_sanitize_p ()
2654     ? IFN_HWASAN_CHECK
2655     : IFN_ASAN_CHECK;
2656 
2657   g = gimple_build_call_internal (fn, 4,
2658 				  build_int_cst (integer_type_node, flags),
2659 				  base, len,
2660 				  build_int_cst (integer_type_node,
2661 						 align / BITS_PER_UNIT));
2662   gimple_set_location (g, loc);
2663   if (before_p)
2664     gsi_insert_before (&gsi, g, GSI_SAME_STMT);
2665   else
2666     {
2667       gsi_insert_after (&gsi, g, GSI_NEW_STMT);
2668       gsi_next (&gsi);
2669       *iter = gsi;
2670     }
2671 }
2672 
2673 /* If T represents a memory access, add instrumentation code before ITER.
2674    LOCATION is source code location.
2675    IS_STORE is either TRUE (for a store) or FALSE (for a load).  */
2676 
2677 static void
instrument_derefs(gimple_stmt_iterator * iter,tree t,location_t location,bool is_store)2678 instrument_derefs (gimple_stmt_iterator *iter, tree t,
2679 		   location_t location, bool is_store)
2680 {
2681   if (is_store && !(asan_instrument_writes () || hwasan_instrument_writes ()))
2682     return;
2683   if (!is_store && !(asan_instrument_reads () || hwasan_instrument_reads ()))
2684     return;
2685 
2686   tree type, base;
2687   HOST_WIDE_INT size_in_bytes;
2688   if (location == UNKNOWN_LOCATION)
2689     location = EXPR_LOCATION (t);
2690 
2691   type = TREE_TYPE (t);
2692   switch (TREE_CODE (t))
2693     {
2694     case ARRAY_REF:
2695     case COMPONENT_REF:
2696     case INDIRECT_REF:
2697     case MEM_REF:
2698     case VAR_DECL:
2699     case BIT_FIELD_REF:
2700       break;
2701       /* FALLTHRU */
2702     default:
2703       return;
2704     }
2705 
2706   size_in_bytes = int_size_in_bytes (type);
2707   if (size_in_bytes <= 0)
2708     return;
2709 
2710   poly_int64 bitsize, bitpos;
2711   tree offset;
2712   machine_mode mode;
2713   int unsignedp, reversep, volatilep = 0;
2714   tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset, &mode,
2715 				    &unsignedp, &reversep, &volatilep);
2716 
2717   if (TREE_CODE (t) == COMPONENT_REF
2718       && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
2719     {
2720       tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
2721       instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
2722 				       TREE_OPERAND (t, 0), repr,
2723 				       TREE_OPERAND (t, 2)),
2724 			 location, is_store);
2725       return;
2726     }
2727 
2728   if (!multiple_p (bitpos, BITS_PER_UNIT)
2729       || maybe_ne (bitsize, size_in_bytes * BITS_PER_UNIT))
2730     return;
2731 
2732   if (VAR_P (inner) && DECL_HARD_REGISTER (inner))
2733     return;
2734 
2735   /* Accesses to non-generic address-spaces should not be instrumented.  */
2736   if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (TREE_TYPE (inner))))
2737     return;
2738 
2739   poly_int64 decl_size;
2740   if ((VAR_P (inner) || TREE_CODE (inner) == RESULT_DECL)
2741       && offset == NULL_TREE
2742       && DECL_SIZE (inner)
2743       && poly_int_tree_p (DECL_SIZE (inner), &decl_size)
2744       && known_subrange_p (bitpos, bitsize, 0, decl_size))
2745     {
2746       if (VAR_P (inner) && DECL_THREAD_LOCAL_P (inner))
2747 	return;
2748       /* If we're not sanitizing globals and we can tell statically that this
2749 	 access is inside a global variable, then there's no point adding
2750 	 instrumentation to check the access.  N.b. hwasan currently never
2751 	 sanitizes globals.  */
2752       if ((hwasan_sanitize_p () || !param_asan_globals)
2753 	  && is_global_var (inner))
2754         return;
2755       if (!TREE_STATIC (inner))
2756 	{
2757 	  /* Automatic vars in the current function will be always
2758 	     accessible.  */
2759 	  if (decl_function_context (inner) == current_function_decl
2760 	      && (!asan_sanitize_use_after_scope ()
2761 		  || !TREE_ADDRESSABLE (inner)))
2762 	    return;
2763 	}
2764       /* Always instrument external vars, they might be dynamically
2765 	 initialized.  */
2766       else if (!DECL_EXTERNAL (inner))
2767 	{
2768 	  /* For static vars if they are known not to be dynamically
2769 	     initialized, they will be always accessible.  */
2770 	  varpool_node *vnode = varpool_node::get (inner);
2771 	  if (vnode && !vnode->dynamically_initialized)
2772 	    return;
2773 	}
2774     }
2775 
2776   if (DECL_P (inner)
2777       && decl_function_context (inner) == current_function_decl
2778       && !TREE_ADDRESSABLE (inner))
2779     mark_addressable (inner);
2780 
2781   base = build_fold_addr_expr (t);
2782   if (!has_mem_ref_been_instrumented (base, size_in_bytes))
2783     {
2784       unsigned int align = get_object_alignment (t);
2785       build_check_stmt (location, base, NULL_TREE, size_in_bytes, iter,
2786 			/*is_non_zero_len*/size_in_bytes > 0, /*before_p=*/true,
2787 			is_store, /*is_scalar_access*/true, align);
2788       update_mem_ref_hash_table (base, size_in_bytes);
2789       update_mem_ref_hash_table (t, size_in_bytes);
2790     }
2791 
2792 }
2793 
2794 /*  Insert a memory reference into the hash table if access length
2795     can be determined in compile time.  */
2796 
2797 static void
maybe_update_mem_ref_hash_table(tree base,tree len)2798 maybe_update_mem_ref_hash_table (tree base, tree len)
2799 {
2800   if (!POINTER_TYPE_P (TREE_TYPE (base))
2801       || !INTEGRAL_TYPE_P (TREE_TYPE (len)))
2802     return;
2803 
2804   HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2805 
2806   if (size_in_bytes != -1)
2807     update_mem_ref_hash_table (base, size_in_bytes);
2808 }
2809 
2810 /* Instrument an access to a contiguous memory region that starts at
2811    the address pointed to by BASE, over a length of LEN (expressed in
2812    the sizeof (*BASE) bytes).  ITER points to the instruction before
2813    which the instrumentation instructions must be inserted.  LOCATION
2814    is the source location that the instrumentation instructions must
2815    have.  If IS_STORE is true, then the memory access is a store;
2816    otherwise, it's a load.  */
2817 
2818 static void
instrument_mem_region_access(tree base,tree len,gimple_stmt_iterator * iter,location_t location,bool is_store)2819 instrument_mem_region_access (tree base, tree len,
2820 			      gimple_stmt_iterator *iter,
2821 			      location_t location, bool is_store)
2822 {
2823   if (!POINTER_TYPE_P (TREE_TYPE (base))
2824       || !INTEGRAL_TYPE_P (TREE_TYPE (len))
2825       || integer_zerop (len))
2826     return;
2827 
2828   HOST_WIDE_INT size_in_bytes = tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
2829 
2830   if ((size_in_bytes == -1)
2831       || !has_mem_ref_been_instrumented (base, size_in_bytes))
2832     {
2833       build_check_stmt (location, base, len, size_in_bytes, iter,
2834 			/*is_non_zero_len*/size_in_bytes > 0, /*before_p*/true,
2835 			is_store, /*is_scalar_access*/false, /*align*/0);
2836     }
2837 
2838   maybe_update_mem_ref_hash_table (base, len);
2839   *iter = gsi_for_stmt (gsi_stmt (*iter));
2840 }
2841 
2842 /* Instrument the call to a built-in memory access function that is
2843    pointed to by the iterator ITER.
2844 
2845    Upon completion, return TRUE iff *ITER has been advanced to the
2846    statement following the one it was originally pointing to.  */
2847 
2848 static bool
instrument_builtin_call(gimple_stmt_iterator * iter)2849 instrument_builtin_call (gimple_stmt_iterator *iter)
2850 {
2851   if (!(asan_memintrin () || hwasan_memintrin ()))
2852     return false;
2853 
2854   bool iter_advanced_p = false;
2855   gcall *call = as_a <gcall *> (gsi_stmt (*iter));
2856 
2857   gcc_checking_assert (gimple_call_builtin_p (call, BUILT_IN_NORMAL));
2858 
2859   location_t loc = gimple_location (call);
2860 
2861   asan_mem_ref src0, src1, dest;
2862   asan_mem_ref_init (&src0, NULL, 1);
2863   asan_mem_ref_init (&src1, NULL, 1);
2864   asan_mem_ref_init (&dest, NULL, 1);
2865 
2866   tree src0_len = NULL_TREE, src1_len = NULL_TREE, dest_len = NULL_TREE;
2867   bool src0_is_store = false, src1_is_store = false, dest_is_store = false,
2868     dest_is_deref = false, intercepted_p = true;
2869 
2870   if (get_mem_refs_of_builtin_call (call,
2871 				    &src0, &src0_len, &src0_is_store,
2872 				    &src1, &src1_len, &src1_is_store,
2873 				    &dest, &dest_len, &dest_is_store,
2874 				    &dest_is_deref, &intercepted_p, iter))
2875     {
2876       if (dest_is_deref)
2877 	{
2878 	  instrument_derefs (iter, dest.start, loc, dest_is_store);
2879 	  gsi_next (iter);
2880 	  iter_advanced_p = true;
2881 	}
2882       else if (!intercepted_p
2883 	       && (src0_len || src1_len || dest_len))
2884 	{
2885 	  if (src0.start != NULL_TREE)
2886 	    instrument_mem_region_access (src0.start, src0_len,
2887 					  iter, loc, /*is_store=*/false);
2888 	  if (src1.start != NULL_TREE)
2889 	    instrument_mem_region_access (src1.start, src1_len,
2890 					  iter, loc, /*is_store=*/false);
2891 	  if (dest.start != NULL_TREE)
2892 	    instrument_mem_region_access (dest.start, dest_len,
2893 					  iter, loc, /*is_store=*/true);
2894 
2895 	  *iter = gsi_for_stmt (call);
2896 	  gsi_next (iter);
2897 	  iter_advanced_p = true;
2898 	}
2899       else
2900 	{
2901 	  if (src0.start != NULL_TREE)
2902 	    maybe_update_mem_ref_hash_table (src0.start, src0_len);
2903 	  if (src1.start != NULL_TREE)
2904 	    maybe_update_mem_ref_hash_table (src1.start, src1_len);
2905 	  if (dest.start != NULL_TREE)
2906 	    maybe_update_mem_ref_hash_table (dest.start, dest_len);
2907 	}
2908     }
2909   return iter_advanced_p;
2910 }
2911 
2912 /*  Instrument the assignment statement ITER if it is subject to
2913     instrumentation.  Return TRUE iff instrumentation actually
2914     happened.  In that case, the iterator ITER is advanced to the next
2915     logical expression following the one initially pointed to by ITER,
2916     and the relevant memory reference that which access has been
2917     instrumented is added to the memory references hash table.  */
2918 
2919 static bool
maybe_instrument_assignment(gimple_stmt_iterator * iter)2920 maybe_instrument_assignment (gimple_stmt_iterator *iter)
2921 {
2922   gimple *s = gsi_stmt (*iter);
2923 
2924   gcc_assert (gimple_assign_single_p (s));
2925 
2926   tree ref_expr = NULL_TREE;
2927   bool is_store, is_instrumented = false;
2928 
2929   if (gimple_store_p (s))
2930     {
2931       ref_expr = gimple_assign_lhs (s);
2932       is_store = true;
2933       instrument_derefs (iter, ref_expr,
2934 			 gimple_location (s),
2935 			 is_store);
2936       is_instrumented = true;
2937     }
2938 
2939   if (gimple_assign_load_p (s))
2940     {
2941       ref_expr = gimple_assign_rhs1 (s);
2942       is_store = false;
2943       instrument_derefs (iter, ref_expr,
2944 			 gimple_location (s),
2945 			 is_store);
2946       is_instrumented = true;
2947     }
2948 
2949   if (is_instrumented)
2950     gsi_next (iter);
2951 
2952   return is_instrumented;
2953 }
2954 
2955 /* Instrument the function call pointed to by the iterator ITER, if it
2956    is subject to instrumentation.  At the moment, the only function
2957    calls that are instrumented are some built-in functions that access
2958    memory.  Look at instrument_builtin_call to learn more.
2959 
2960    Upon completion return TRUE iff *ITER was advanced to the statement
2961    following the one it was originally pointing to.  */
2962 
2963 static bool
maybe_instrument_call(gimple_stmt_iterator * iter)2964 maybe_instrument_call (gimple_stmt_iterator *iter)
2965 {
2966   gimple *stmt = gsi_stmt (*iter);
2967   bool is_builtin = gimple_call_builtin_p (stmt, BUILT_IN_NORMAL);
2968 
2969   if (is_builtin && instrument_builtin_call (iter))
2970     return true;
2971 
2972   if (gimple_call_noreturn_p (stmt))
2973     {
2974       if (is_builtin)
2975 	{
2976 	  tree callee = gimple_call_fndecl (stmt);
2977 	  switch (DECL_FUNCTION_CODE (callee))
2978 	    {
2979 	    case BUILT_IN_UNREACHABLE:
2980 	    case BUILT_IN_TRAP:
2981 	      /* Don't instrument these.  */
2982 	      return false;
2983 	    default:
2984 	      break;
2985 	    }
2986 	}
2987       /* If a function does not return, then we must handle clearing up the
2988 	 shadow stack accordingly.  For ASAN we can simply set the entire stack
2989 	 to "valid" for accesses by setting the shadow space to 0 and all
2990 	 accesses will pass checks.  That means that some bad accesses may be
2991 	 missed, but we will not report any false positives.
2992 
2993 	 This is not possible for HWASAN.  Since there is no "always valid" tag
2994 	 we can not set any space to "always valid".  If we were to clear the
2995 	 entire shadow stack then code resuming from `longjmp` or a caught
2996 	 exception would trigger false positives when correctly accessing
2997 	 variables on the stack.  Hence we need to handle things like
2998 	 `longjmp`, thread exit, and exceptions in a different way.  These
2999 	 problems must be handled externally to the compiler, e.g. in the
3000 	 language runtime.  */
3001       if (! hwasan_sanitize_p ())
3002 	{
3003 	  tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN);
3004 	  gimple *g = gimple_build_call (decl, 0);
3005 	  gimple_set_location (g, gimple_location (stmt));
3006 	  gsi_insert_before (iter, g, GSI_SAME_STMT);
3007 	}
3008     }
3009 
3010   bool instrumented = false;
3011   if (gimple_store_p (stmt))
3012     {
3013       tree ref_expr = gimple_call_lhs (stmt);
3014       instrument_derefs (iter, ref_expr,
3015 			 gimple_location (stmt),
3016 			 /*is_store=*/true);
3017 
3018       instrumented = true;
3019     }
3020 
3021   /* Walk through gimple_call arguments and check them id needed.  */
3022   unsigned args_num = gimple_call_num_args (stmt);
3023   for (unsigned i = 0; i < args_num; ++i)
3024     {
3025       tree arg = gimple_call_arg (stmt, i);
3026       /* If ARG is not a non-aggregate register variable, compiler in general
3027 	 creates temporary for it and pass it as argument to gimple call.
3028 	 But in some cases, e.g. when we pass by value a small structure that
3029 	 fits to register, compiler can avoid extra overhead by pulling out
3030 	 these temporaries.  In this case, we should check the argument.  */
3031       if (!is_gimple_reg (arg) && !is_gimple_min_invariant (arg))
3032 	{
3033 	  instrument_derefs (iter, arg,
3034 			     gimple_location (stmt),
3035 			     /*is_store=*/false);
3036 	  instrumented = true;
3037 	}
3038     }
3039   if (instrumented)
3040     gsi_next (iter);
3041   return instrumented;
3042 }
3043 
3044 /* Walk each instruction of all basic block and instrument those that
3045    represent memory references: loads, stores, or function calls.
3046    In a given basic block, this function avoids instrumenting memory
3047    references that have already been instrumented.  */
3048 
3049 static void
transform_statements(void)3050 transform_statements (void)
3051 {
3052   basic_block bb, last_bb = NULL;
3053   gimple_stmt_iterator i;
3054   int saved_last_basic_block = last_basic_block_for_fn (cfun);
3055 
3056   FOR_EACH_BB_FN (bb, cfun)
3057     {
3058       basic_block prev_bb = bb;
3059 
3060       if (bb->index >= saved_last_basic_block) continue;
3061 
3062       /* Flush the mem ref hash table, if current bb doesn't have
3063 	 exactly one predecessor, or if that predecessor (skipping
3064 	 over asan created basic blocks) isn't the last processed
3065 	 basic block.  Thus we effectively flush on extended basic
3066 	 block boundaries.  */
3067       while (single_pred_p (prev_bb))
3068 	{
3069 	  prev_bb = single_pred (prev_bb);
3070 	  if (prev_bb->index < saved_last_basic_block)
3071 	    break;
3072 	}
3073       if (prev_bb != last_bb)
3074 	empty_mem_ref_hash_table ();
3075       last_bb = bb;
3076 
3077       for (i = gsi_start_bb (bb); !gsi_end_p (i);)
3078 	{
3079 	  gimple *s = gsi_stmt (i);
3080 
3081 	  if (has_stmt_been_instrumented_p (s))
3082 	    gsi_next (&i);
3083 	  else if (gimple_assign_single_p (s)
3084 		   && !gimple_clobber_p (s)
3085 		   && maybe_instrument_assignment (&i))
3086 	    /*  Nothing to do as maybe_instrument_assignment advanced
3087 		the iterator I.  */;
3088 	  else if (is_gimple_call (s) && maybe_instrument_call (&i))
3089 	    /*  Nothing to do as maybe_instrument_call
3090 		advanced the iterator I.  */;
3091 	  else
3092 	    {
3093 	      /* No instrumentation happened.
3094 
3095 		 If the current instruction is a function call that
3096 		 might free something, let's forget about the memory
3097 		 references that got instrumented.  Otherwise we might
3098 		 miss some instrumentation opportunities.  Do the same
3099 		 for a ASAN_MARK poisoning internal function.  */
3100 	      if (is_gimple_call (s)
3101 		  && (!nonfreeing_call_p (s)
3102 		      || asan_mark_p (s, ASAN_MARK_POISON)))
3103 		empty_mem_ref_hash_table ();
3104 
3105 	      gsi_next (&i);
3106 	    }
3107 	}
3108     }
3109   free_mem_ref_resources ();
3110 }
3111 
3112 /* Build
3113    __asan_before_dynamic_init (module_name)
3114    or
3115    __asan_after_dynamic_init ()
3116    call.  */
3117 
3118 tree
asan_dynamic_init_call(bool after_p)3119 asan_dynamic_init_call (bool after_p)
3120 {
3121   if (shadow_ptr_types[0] == NULL_TREE)
3122     asan_init_shadow_ptr_types ();
3123 
3124   tree fn = builtin_decl_implicit (after_p
3125 				   ? BUILT_IN_ASAN_AFTER_DYNAMIC_INIT
3126 				   : BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT);
3127   tree module_name_cst = NULL_TREE;
3128   if (!after_p)
3129     {
3130       pretty_printer module_name_pp;
3131       pp_string (&module_name_pp, main_input_filename);
3132 
3133       module_name_cst = asan_pp_string (&module_name_pp);
3134       module_name_cst = fold_convert (const_ptr_type_node,
3135 				      module_name_cst);
3136     }
3137 
3138   return build_call_expr (fn, after_p ? 0 : 1, module_name_cst);
3139 }
3140 
3141 /* Build
3142    struct __asan_global
3143    {
3144      const void *__beg;
3145      uptr __size;
3146      uptr __size_with_redzone;
3147      const void *__name;
3148      const void *__module_name;
3149      uptr __has_dynamic_init;
3150      __asan_global_source_location *__location;
3151      char *__odr_indicator;
3152    } type.  */
3153 
3154 static tree
asan_global_struct(void)3155 asan_global_struct (void)
3156 {
3157   static const char *field_names[]
3158     = { "__beg", "__size", "__size_with_redzone",
3159 	"__name", "__module_name", "__has_dynamic_init", "__location",
3160 	"__odr_indicator" };
3161   tree fields[ARRAY_SIZE (field_names)], ret;
3162   unsigned i;
3163 
3164   ret = make_node (RECORD_TYPE);
3165   for (i = 0; i < ARRAY_SIZE (field_names); i++)
3166     {
3167       fields[i]
3168 	= build_decl (UNKNOWN_LOCATION, FIELD_DECL,
3169 		      get_identifier (field_names[i]),
3170 		      (i == 0 || i == 3) ? const_ptr_type_node
3171 		      : pointer_sized_int_node);
3172       DECL_CONTEXT (fields[i]) = ret;
3173       if (i)
3174 	DECL_CHAIN (fields[i - 1]) = fields[i];
3175     }
3176   tree type_decl = build_decl (input_location, TYPE_DECL,
3177 			       get_identifier ("__asan_global"), ret);
3178   DECL_IGNORED_P (type_decl) = 1;
3179   DECL_ARTIFICIAL (type_decl) = 1;
3180   TYPE_FIELDS (ret) = fields[0];
3181   TYPE_NAME (ret) = type_decl;
3182   TYPE_STUB_DECL (ret) = type_decl;
3183   TYPE_ARTIFICIAL (ret) = 1;
3184   layout_type (ret);
3185   return ret;
3186 }
3187 
3188 /* Create and return odr indicator symbol for DECL.
3189    TYPE is __asan_global struct type as returned by asan_global_struct.  */
3190 
3191 static tree
create_odr_indicator(tree decl,tree type)3192 create_odr_indicator (tree decl, tree type)
3193 {
3194   char *name;
3195   tree uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
3196   tree decl_name
3197     = (HAS_DECL_ASSEMBLER_NAME_P (decl) ? DECL_ASSEMBLER_NAME (decl)
3198 					: DECL_NAME (decl));
3199   /* DECL_NAME theoretically might be NULL.  Bail out with 0 in this case.  */
3200   if (decl_name == NULL_TREE)
3201     return build_int_cst (uptr, 0);
3202   const char *dname = IDENTIFIER_POINTER (decl_name);
3203   if (HAS_DECL_ASSEMBLER_NAME_P (decl))
3204     dname = targetm.strip_name_encoding (dname);
3205   size_t len = strlen (dname) + sizeof ("__odr_asan_");
3206   name = XALLOCAVEC (char, len);
3207   snprintf (name, len, "__odr_asan_%s", dname);
3208 #ifndef NO_DOT_IN_LABEL
3209   name[sizeof ("__odr_asan") - 1] = '.';
3210 #elif !defined(NO_DOLLAR_IN_LABEL)
3211   name[sizeof ("__odr_asan") - 1] = '$';
3212 #endif
3213   tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (name),
3214 			 char_type_node);
3215   TREE_ADDRESSABLE (var) = 1;
3216   TREE_READONLY (var) = 0;
3217   TREE_THIS_VOLATILE (var) = 1;
3218   DECL_ARTIFICIAL (var) = 1;
3219   DECL_IGNORED_P (var) = 1;
3220   TREE_STATIC (var) = 1;
3221   TREE_PUBLIC (var) = 1;
3222   DECL_VISIBILITY (var) = DECL_VISIBILITY (decl);
3223   DECL_VISIBILITY_SPECIFIED (var) = DECL_VISIBILITY_SPECIFIED (decl);
3224 
3225   TREE_USED (var) = 1;
3226   tree ctor = build_constructor_va (TREE_TYPE (var), 1, NULL_TREE,
3227 				    build_int_cst (unsigned_type_node, 0));
3228   TREE_CONSTANT (ctor) = 1;
3229   TREE_STATIC (ctor) = 1;
3230   DECL_INITIAL (var) = ctor;
3231   DECL_ATTRIBUTES (var) = tree_cons (get_identifier ("asan odr indicator"),
3232 				     NULL, DECL_ATTRIBUTES (var));
3233   make_decl_rtl (var);
3234   varpool_node::finalize_decl (var);
3235   return fold_convert (uptr, build_fold_addr_expr (var));
3236 }
3237 
3238 /* Return true if DECL, a global var, might be overridden and needs
3239    an additional odr indicator symbol.  */
3240 
3241 static bool
asan_needs_odr_indicator_p(tree decl)3242 asan_needs_odr_indicator_p (tree decl)
3243 {
3244   /* Don't emit ODR indicators for kernel because:
3245      a) Kernel is written in C thus doesn't need ODR indicators.
3246      b) Some kernel code may have assumptions about symbols containing specific
3247         patterns in their names.  Since ODR indicators contain original names
3248         of symbols they are emitted for, these assumptions would be broken for
3249         ODR indicator symbols.  */
3250   return (!(flag_sanitize & SANITIZE_KERNEL_ADDRESS)
3251 	  && !DECL_ARTIFICIAL (decl)
3252 	  && !DECL_WEAK (decl)
3253 	  && TREE_PUBLIC (decl));
3254 }
3255 
3256 /* Append description of a single global DECL into vector V.
3257    TYPE is __asan_global struct type as returned by asan_global_struct.  */
3258 
3259 static void
asan_add_global(tree decl,tree type,vec<constructor_elt,va_gc> * v)3260 asan_add_global (tree decl, tree type, vec<constructor_elt, va_gc> *v)
3261 {
3262   tree init, uptr = TREE_TYPE (DECL_CHAIN (TYPE_FIELDS (type)));
3263   unsigned HOST_WIDE_INT size;
3264   tree str_cst, module_name_cst, refdecl = decl;
3265   vec<constructor_elt, va_gc> *vinner = NULL;
3266 
3267   pretty_printer asan_pp, module_name_pp;
3268 
3269   if (DECL_NAME (decl))
3270     pp_tree_identifier (&asan_pp, DECL_NAME (decl));
3271   else
3272     pp_string (&asan_pp, "<unknown>");
3273   str_cst = asan_pp_string (&asan_pp);
3274 
3275   if (!in_lto_p)
3276     pp_string (&module_name_pp, main_input_filename);
3277   else
3278     {
3279       const_tree tu = get_ultimate_context ((const_tree)decl);
3280       if (tu != NULL_TREE)
3281 	pp_string (&module_name_pp, IDENTIFIER_POINTER (DECL_NAME (tu)));
3282       else
3283 	pp_string (&module_name_pp, aux_base_name);
3284     }
3285 
3286   module_name_cst = asan_pp_string (&module_name_pp);
3287 
3288   if (asan_needs_local_alias (decl))
3289     {
3290       char buf[20];
3291       ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", vec_safe_length (v) + 1);
3292       refdecl = build_decl (DECL_SOURCE_LOCATION (decl),
3293 			    VAR_DECL, get_identifier (buf), TREE_TYPE (decl));
3294       TREE_ADDRESSABLE (refdecl) = TREE_ADDRESSABLE (decl);
3295       TREE_READONLY (refdecl) = TREE_READONLY (decl);
3296       TREE_THIS_VOLATILE (refdecl) = TREE_THIS_VOLATILE (decl);
3297       DECL_NOT_GIMPLE_REG_P (refdecl) = DECL_NOT_GIMPLE_REG_P (decl);
3298       DECL_ARTIFICIAL (refdecl) = DECL_ARTIFICIAL (decl);
3299       DECL_IGNORED_P (refdecl) = DECL_IGNORED_P (decl);
3300       TREE_STATIC (refdecl) = 1;
3301       TREE_PUBLIC (refdecl) = 0;
3302       TREE_USED (refdecl) = 1;
3303       assemble_alias (refdecl, DECL_ASSEMBLER_NAME (decl));
3304     }
3305 
3306   tree odr_indicator_ptr
3307     = (asan_needs_odr_indicator_p (decl) ? create_odr_indicator (decl, type)
3308 					 : build_int_cst (uptr, 0));
3309   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3310 			  fold_convert (const_ptr_type_node,
3311 					build_fold_addr_expr (refdecl)));
3312   size = tree_to_uhwi (DECL_SIZE_UNIT (decl));
3313   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3314   size += asan_red_zone_size (size);
3315   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, build_int_cst (uptr, size));
3316   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3317 			  fold_convert (const_ptr_type_node, str_cst));
3318   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3319 			  fold_convert (const_ptr_type_node, module_name_cst));
3320   varpool_node *vnode = varpool_node::get (decl);
3321   int has_dynamic_init = 0;
3322   /* FIXME: Enable initialization order fiasco detection in LTO mode once
3323      proper fix for PR 79061 will be applied.  */
3324   if (!in_lto_p)
3325     has_dynamic_init = vnode ? vnode->dynamically_initialized : 0;
3326   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE,
3327 			  build_int_cst (uptr, has_dynamic_init));
3328   tree locptr = NULL_TREE;
3329   location_t loc = DECL_SOURCE_LOCATION (decl);
3330   expanded_location xloc = expand_location (loc);
3331   if (xloc.file != NULL)
3332     {
3333       static int lasanloccnt = 0;
3334       char buf[25];
3335       ASM_GENERATE_INTERNAL_LABEL (buf, "LASANLOC", ++lasanloccnt);
3336       tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3337 			     ubsan_get_source_location_type ());
3338       TREE_STATIC (var) = 1;
3339       TREE_PUBLIC (var) = 0;
3340       DECL_ARTIFICIAL (var) = 1;
3341       DECL_IGNORED_P (var) = 1;
3342       pretty_printer filename_pp;
3343       pp_string (&filename_pp, xloc.file);
3344       tree str = asan_pp_string (&filename_pp);
3345       tree ctor = build_constructor_va (TREE_TYPE (var), 3,
3346 					NULL_TREE, str, NULL_TREE,
3347 					build_int_cst (unsigned_type_node,
3348 						       xloc.line), NULL_TREE,
3349 					build_int_cst (unsigned_type_node,
3350 						       xloc.column));
3351       TREE_CONSTANT (ctor) = 1;
3352       TREE_STATIC (ctor) = 1;
3353       DECL_INITIAL (var) = ctor;
3354       varpool_node::finalize_decl (var);
3355       locptr = fold_convert (uptr, build_fold_addr_expr (var));
3356     }
3357   else
3358     locptr = build_int_cst (uptr, 0);
3359   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, locptr);
3360   CONSTRUCTOR_APPEND_ELT (vinner, NULL_TREE, odr_indicator_ptr);
3361   init = build_constructor (type, vinner);
3362   CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
3363 }
3364 
3365 /* Initialize sanitizer.def builtins if the FE hasn't initialized them.  */
3366 void
initialize_sanitizer_builtins(void)3367 initialize_sanitizer_builtins (void)
3368 {
3369   tree decl;
3370 
3371   if (builtin_decl_implicit_p (BUILT_IN_ASAN_INIT))
3372     return;
3373 
3374   tree BT_FN_VOID = build_function_type_list (void_type_node, NULL_TREE);
3375   tree BT_FN_VOID_PTR
3376     = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
3377   tree BT_FN_VOID_CONST_PTR
3378     = build_function_type_list (void_type_node, const_ptr_type_node, NULL_TREE);
3379   tree BT_FN_VOID_PTR_PTR
3380     = build_function_type_list (void_type_node, ptr_type_node,
3381 				ptr_type_node, NULL_TREE);
3382   tree BT_FN_VOID_PTR_PTR_PTR
3383     = build_function_type_list (void_type_node, ptr_type_node,
3384 				ptr_type_node, ptr_type_node, NULL_TREE);
3385   tree BT_FN_VOID_PTR_PTRMODE
3386     = build_function_type_list (void_type_node, ptr_type_node,
3387 				pointer_sized_int_node, NULL_TREE);
3388   tree BT_FN_VOID_INT
3389     = build_function_type_list (void_type_node, integer_type_node, NULL_TREE);
3390   tree BT_FN_SIZE_CONST_PTR_INT
3391     = build_function_type_list (size_type_node, const_ptr_type_node,
3392 				integer_type_node, NULL_TREE);
3393 
3394   tree BT_FN_VOID_UINT8_UINT8
3395     = build_function_type_list (void_type_node, unsigned_char_type_node,
3396 				unsigned_char_type_node, NULL_TREE);
3397   tree BT_FN_VOID_UINT16_UINT16
3398     = build_function_type_list (void_type_node, uint16_type_node,
3399 				uint16_type_node, NULL_TREE);
3400   tree BT_FN_VOID_UINT32_UINT32
3401     = build_function_type_list (void_type_node, uint32_type_node,
3402 				uint32_type_node, NULL_TREE);
3403   tree BT_FN_VOID_UINT64_UINT64
3404     = build_function_type_list (void_type_node, uint64_type_node,
3405 				uint64_type_node, NULL_TREE);
3406   tree BT_FN_VOID_FLOAT_FLOAT
3407     = build_function_type_list (void_type_node, float_type_node,
3408 				float_type_node, NULL_TREE);
3409   tree BT_FN_VOID_DOUBLE_DOUBLE
3410     = build_function_type_list (void_type_node, double_type_node,
3411 				double_type_node, NULL_TREE);
3412   tree BT_FN_VOID_UINT64_PTR
3413     = build_function_type_list (void_type_node, uint64_type_node,
3414 				ptr_type_node, NULL_TREE);
3415 
3416   tree BT_FN_PTR_CONST_PTR_UINT8
3417     = build_function_type_list (ptr_type_node, const_ptr_type_node,
3418 				unsigned_char_type_node, NULL_TREE);
3419   tree BT_FN_VOID_PTR_UINT8_PTRMODE
3420     = build_function_type_list (void_type_node, ptr_type_node,
3421 				unsigned_char_type_node,
3422 				pointer_sized_int_node, NULL_TREE);
3423 
3424   tree BT_FN_BOOL_VPTR_PTR_IX_INT_INT[5];
3425   tree BT_FN_IX_CONST_VPTR_INT[5];
3426   tree BT_FN_IX_VPTR_IX_INT[5];
3427   tree BT_FN_VOID_VPTR_IX_INT[5];
3428   tree vptr
3429     = build_pointer_type (build_qualified_type (void_type_node,
3430 						TYPE_QUAL_VOLATILE));
3431   tree cvptr
3432     = build_pointer_type (build_qualified_type (void_type_node,
3433 						TYPE_QUAL_VOLATILE
3434 						|TYPE_QUAL_CONST));
3435   tree boolt
3436     = lang_hooks.types.type_for_size (BOOL_TYPE_SIZE, 1);
3437   int i;
3438   for (i = 0; i < 5; i++)
3439     {
3440       tree ix = build_nonstandard_integer_type (BITS_PER_UNIT * (1 << i), 1);
3441       BT_FN_BOOL_VPTR_PTR_IX_INT_INT[i]
3442 	= build_function_type_list (boolt, vptr, ptr_type_node, ix,
3443 				    integer_type_node, integer_type_node,
3444 				    NULL_TREE);
3445       BT_FN_IX_CONST_VPTR_INT[i]
3446 	= build_function_type_list (ix, cvptr, integer_type_node, NULL_TREE);
3447       BT_FN_IX_VPTR_IX_INT[i]
3448 	= build_function_type_list (ix, vptr, ix, integer_type_node,
3449 				    NULL_TREE);
3450       BT_FN_VOID_VPTR_IX_INT[i]
3451 	= build_function_type_list (void_type_node, vptr, ix,
3452 				    integer_type_node, NULL_TREE);
3453     }
3454 #define BT_FN_BOOL_VPTR_PTR_I1_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[0]
3455 #define BT_FN_I1_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[0]
3456 #define BT_FN_I1_VPTR_I1_INT BT_FN_IX_VPTR_IX_INT[0]
3457 #define BT_FN_VOID_VPTR_I1_INT BT_FN_VOID_VPTR_IX_INT[0]
3458 #define BT_FN_BOOL_VPTR_PTR_I2_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[1]
3459 #define BT_FN_I2_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[1]
3460 #define BT_FN_I2_VPTR_I2_INT BT_FN_IX_VPTR_IX_INT[1]
3461 #define BT_FN_VOID_VPTR_I2_INT BT_FN_VOID_VPTR_IX_INT[1]
3462 #define BT_FN_BOOL_VPTR_PTR_I4_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[2]
3463 #define BT_FN_I4_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[2]
3464 #define BT_FN_I4_VPTR_I4_INT BT_FN_IX_VPTR_IX_INT[2]
3465 #define BT_FN_VOID_VPTR_I4_INT BT_FN_VOID_VPTR_IX_INT[2]
3466 #define BT_FN_BOOL_VPTR_PTR_I8_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[3]
3467 #define BT_FN_I8_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[3]
3468 #define BT_FN_I8_VPTR_I8_INT BT_FN_IX_VPTR_IX_INT[3]
3469 #define BT_FN_VOID_VPTR_I8_INT BT_FN_VOID_VPTR_IX_INT[3]
3470 #define BT_FN_BOOL_VPTR_PTR_I16_INT_INT BT_FN_BOOL_VPTR_PTR_IX_INT_INT[4]
3471 #define BT_FN_I16_CONST_VPTR_INT BT_FN_IX_CONST_VPTR_INT[4]
3472 #define BT_FN_I16_VPTR_I16_INT BT_FN_IX_VPTR_IX_INT[4]
3473 #define BT_FN_VOID_VPTR_I16_INT BT_FN_VOID_VPTR_IX_INT[4]
3474 #undef ATTR_NOTHROW_LIST
3475 #define ATTR_NOTHROW_LIST ECF_NOTHROW
3476 #undef ATTR_NOTHROW_LEAF_LIST
3477 #define ATTR_NOTHROW_LEAF_LIST ECF_NOTHROW | ECF_LEAF
3478 #undef ATTR_TMPURE_NOTHROW_LEAF_LIST
3479 #define ATTR_TMPURE_NOTHROW_LEAF_LIST ECF_TM_PURE | ATTR_NOTHROW_LEAF_LIST
3480 #undef ATTR_NORETURN_NOTHROW_LEAF_LIST
3481 #define ATTR_NORETURN_NOTHROW_LEAF_LIST ECF_NORETURN | ATTR_NOTHROW_LEAF_LIST
3482 #undef ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3483 #define ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST \
3484   ECF_CONST | ATTR_NORETURN_NOTHROW_LEAF_LIST
3485 #undef ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST
3486 #define ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST \
3487   ECF_TM_PURE | ATTR_NORETURN_NOTHROW_LEAF_LIST
3488 #undef ATTR_COLD_NOTHROW_LEAF_LIST
3489 #define ATTR_COLD_NOTHROW_LEAF_LIST \
3490   /* ECF_COLD missing */ ATTR_NOTHROW_LEAF_LIST
3491 #undef ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST
3492 #define ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST \
3493   /* ECF_COLD missing */ ATTR_NORETURN_NOTHROW_LEAF_LIST
3494 #undef ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST
3495 #define ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST \
3496   /* ECF_COLD missing */ ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST
3497 #undef ATTR_PURE_NOTHROW_LEAF_LIST
3498 #define ATTR_PURE_NOTHROW_LEAF_LIST ECF_PURE | ATTR_NOTHROW_LEAF_LIST
3499 #undef DEF_BUILTIN_STUB
3500 #define DEF_BUILTIN_STUB(ENUM, NAME)
3501 #undef DEF_SANITIZER_BUILTIN_1
3502 #define DEF_SANITIZER_BUILTIN_1(ENUM, NAME, TYPE, ATTRS)		\
3503   do {									\
3504     decl = add_builtin_function ("__builtin_" NAME, TYPE, ENUM,		\
3505 				 BUILT_IN_NORMAL, NAME, NULL_TREE);	\
3506     set_call_expr_flags (decl, ATTRS);					\
3507     set_builtin_decl (ENUM, decl, true);				\
3508   } while (0)
3509 #undef DEF_SANITIZER_BUILTIN
3510 #define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
3511   DEF_SANITIZER_BUILTIN_1 (ENUM, NAME, TYPE, ATTRS);
3512 
3513 #include "sanitizer.def"
3514 
3515   /* -fsanitize=object-size uses __builtin_object_size, but that might
3516      not be available for e.g. Fortran at this point.  We use
3517      DEF_SANITIZER_BUILTIN here only as a convenience macro.  */
3518   if ((flag_sanitize & SANITIZE_OBJECT_SIZE)
3519       && !builtin_decl_implicit_p (BUILT_IN_OBJECT_SIZE))
3520     DEF_SANITIZER_BUILTIN_1 (BUILT_IN_OBJECT_SIZE, "object_size",
3521 			     BT_FN_SIZE_CONST_PTR_INT,
3522 			     ATTR_PURE_NOTHROW_LEAF_LIST);
3523 
3524 #undef DEF_SANITIZER_BUILTIN_1
3525 #undef DEF_SANITIZER_BUILTIN
3526 #undef DEF_BUILTIN_STUB
3527 }
3528 
3529 /* Called via htab_traverse.  Count number of emitted
3530    STRING_CSTs in the constant hash table.  */
3531 
3532 int
count_string_csts(constant_descriptor_tree ** slot,unsigned HOST_WIDE_INT * data)3533 count_string_csts (constant_descriptor_tree **slot,
3534 		   unsigned HOST_WIDE_INT *data)
3535 {
3536   struct constant_descriptor_tree *desc = *slot;
3537   if (TREE_CODE (desc->value) == STRING_CST
3538       && TREE_ASM_WRITTEN (desc->value)
3539       && asan_protect_global (desc->value))
3540     ++*data;
3541   return 1;
3542 }
3543 
3544 /* Helper structure to pass two parameters to
3545    add_string_csts.  */
3546 
3547 struct asan_add_string_csts_data
3548 {
3549   tree type;
3550   vec<constructor_elt, va_gc> *v;
3551 };
3552 
3553 /* Called via hash_table::traverse.  Call asan_add_global
3554    on emitted STRING_CSTs from the constant hash table.  */
3555 
3556 int
add_string_csts(constant_descriptor_tree ** slot,asan_add_string_csts_data * aascd)3557 add_string_csts (constant_descriptor_tree **slot,
3558 		 asan_add_string_csts_data *aascd)
3559 {
3560   struct constant_descriptor_tree *desc = *slot;
3561   if (TREE_CODE (desc->value) == STRING_CST
3562       && TREE_ASM_WRITTEN (desc->value)
3563       && asan_protect_global (desc->value))
3564     {
3565       asan_add_global (SYMBOL_REF_DECL (XEXP (desc->rtl, 0)),
3566 		       aascd->type, aascd->v);
3567     }
3568   return 1;
3569 }
3570 
3571 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
3572    invoke ggc_collect.  */
3573 static GTY(()) tree asan_ctor_statements;
3574 
3575 /* Module-level instrumentation.
3576    - Insert __asan_init_vN() into the list of CTORs.
3577    - TODO: insert redzones around globals.
3578  */
3579 
3580 void
asan_finish_file(void)3581 asan_finish_file (void)
3582 {
3583   varpool_node *vnode;
3584   unsigned HOST_WIDE_INT gcount = 0;
3585 
3586   if (shadow_ptr_types[0] == NULL_TREE)
3587     asan_init_shadow_ptr_types ();
3588   /* Avoid instrumenting code in the asan ctors/dtors.
3589      We don't need to insert padding after the description strings,
3590      nor after .LASAN* array.  */
3591   flag_sanitize &= ~SANITIZE_ADDRESS;
3592 
3593   /* For user-space we want asan constructors to run first.
3594      Linux kernel does not support priorities other than default, and the only
3595      other user of constructors is coverage. So we run with the default
3596      priority.  */
3597   int priority = flag_sanitize & SANITIZE_USER_ADDRESS
3598                  ? MAX_RESERVED_INIT_PRIORITY - 1 : DEFAULT_INIT_PRIORITY;
3599 
3600   if (flag_sanitize & SANITIZE_USER_ADDRESS)
3601     {
3602       tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
3603       append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3604       fn = builtin_decl_implicit (BUILT_IN_ASAN_VERSION_MISMATCH_CHECK);
3605       append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
3606     }
3607   FOR_EACH_DEFINED_VARIABLE (vnode)
3608     if (TREE_ASM_WRITTEN (vnode->decl)
3609 	&& asan_protect_global (vnode->decl))
3610       ++gcount;
3611   hash_table<tree_descriptor_hasher> *const_desc_htab = constant_pool_htab ();
3612   const_desc_htab->traverse<unsigned HOST_WIDE_INT *, count_string_csts>
3613     (&gcount);
3614   if (gcount)
3615     {
3616       tree type = asan_global_struct (), var, ctor;
3617       tree dtor_statements = NULL_TREE;
3618       vec<constructor_elt, va_gc> *v;
3619       char buf[20];
3620 
3621       type = build_array_type_nelts (type, gcount);
3622       ASM_GENERATE_INTERNAL_LABEL (buf, "LASAN", 0);
3623       var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (buf),
3624 			type);
3625       TREE_STATIC (var) = 1;
3626       TREE_PUBLIC (var) = 0;
3627       DECL_ARTIFICIAL (var) = 1;
3628       DECL_IGNORED_P (var) = 1;
3629       vec_alloc (v, gcount);
3630       FOR_EACH_DEFINED_VARIABLE (vnode)
3631 	if (TREE_ASM_WRITTEN (vnode->decl)
3632 	    && asan_protect_global (vnode->decl))
3633 	  asan_add_global (vnode->decl, TREE_TYPE (type), v);
3634       struct asan_add_string_csts_data aascd;
3635       aascd.type = TREE_TYPE (type);
3636       aascd.v = v;
3637       const_desc_htab->traverse<asan_add_string_csts_data *, add_string_csts>
3638        	(&aascd);
3639       ctor = build_constructor (type, v);
3640       TREE_CONSTANT (ctor) = 1;
3641       TREE_STATIC (ctor) = 1;
3642       DECL_INITIAL (var) = ctor;
3643       SET_DECL_ALIGN (var, MAX (DECL_ALIGN (var),
3644 				ASAN_SHADOW_GRANULARITY * BITS_PER_UNIT));
3645 
3646       varpool_node::finalize_decl (var);
3647 
3648       tree fn = builtin_decl_implicit (BUILT_IN_ASAN_REGISTER_GLOBALS);
3649       tree gcount_tree = build_int_cst (pointer_sized_int_node, gcount);
3650       append_to_statement_list (build_call_expr (fn, 2,
3651 						 build_fold_addr_expr (var),
3652 						 gcount_tree),
3653 				&asan_ctor_statements);
3654 
3655       fn = builtin_decl_implicit (BUILT_IN_ASAN_UNREGISTER_GLOBALS);
3656       append_to_statement_list (build_call_expr (fn, 2,
3657 						 build_fold_addr_expr (var),
3658 						 gcount_tree),
3659 				&dtor_statements);
3660       cgraph_build_static_cdtor ('D', dtor_statements, priority);
3661     }
3662   if (asan_ctor_statements)
3663     cgraph_build_static_cdtor ('I', asan_ctor_statements, priority);
3664   flag_sanitize |= SANITIZE_ADDRESS;
3665 }
3666 
3667 /* Poison or unpoison (depending on IS_CLOBBER variable) shadow memory based
3668    on SHADOW address.  Newly added statements will be added to ITER with
3669    given location LOC.  We mark SIZE bytes in shadow memory, where
3670    LAST_CHUNK_SIZE is greater than zero in situation where we are at the
3671    end of a variable.  */
3672 
3673 static void
asan_store_shadow_bytes(gimple_stmt_iterator * iter,location_t loc,tree shadow,unsigned HOST_WIDE_INT base_addr_offset,bool is_clobber,unsigned size,unsigned last_chunk_size)3674 asan_store_shadow_bytes (gimple_stmt_iterator *iter, location_t loc,
3675 			 tree shadow,
3676 			 unsigned HOST_WIDE_INT base_addr_offset,
3677 			 bool is_clobber, unsigned size,
3678 			 unsigned last_chunk_size)
3679 {
3680   tree shadow_ptr_type;
3681 
3682   switch (size)
3683     {
3684     case 1:
3685       shadow_ptr_type = shadow_ptr_types[0];
3686       break;
3687     case 2:
3688       shadow_ptr_type = shadow_ptr_types[1];
3689       break;
3690     case 4:
3691       shadow_ptr_type = shadow_ptr_types[2];
3692       break;
3693     default:
3694       gcc_unreachable ();
3695     }
3696 
3697   unsigned char c = (char) is_clobber ? ASAN_STACK_MAGIC_USE_AFTER_SCOPE : 0;
3698   unsigned HOST_WIDE_INT val = 0;
3699   unsigned last_pos = size;
3700   if (last_chunk_size && !is_clobber)
3701     last_pos = BYTES_BIG_ENDIAN ? 0 : size - 1;
3702   for (unsigned i = 0; i < size; ++i)
3703     {
3704       unsigned char shadow_c = c;
3705       if (i == last_pos)
3706 	shadow_c = last_chunk_size;
3707       val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
3708     }
3709 
3710   /* Handle last chunk in unpoisoning.  */
3711   tree magic = build_int_cst (TREE_TYPE (shadow_ptr_type), val);
3712 
3713   tree dest = build2 (MEM_REF, TREE_TYPE (shadow_ptr_type), shadow,
3714 		      build_int_cst (shadow_ptr_type, base_addr_offset));
3715 
3716   gimple *g = gimple_build_assign (dest, magic);
3717   gimple_set_location (g, loc);
3718   gsi_insert_after (iter, g, GSI_NEW_STMT);
3719 }
3720 
3721 /* Expand the ASAN_MARK builtins.  */
3722 
3723 bool
asan_expand_mark_ifn(gimple_stmt_iterator * iter)3724 asan_expand_mark_ifn (gimple_stmt_iterator *iter)
3725 {
3726   gimple *g = gsi_stmt (*iter);
3727   location_t loc = gimple_location (g);
3728   HOST_WIDE_INT flag = tree_to_shwi (gimple_call_arg (g, 0));
3729   bool is_poison = ((asan_mark_flags)flag) == ASAN_MARK_POISON;
3730 
3731   tree base = gimple_call_arg (g, 1);
3732   gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR);
3733   tree decl = TREE_OPERAND (base, 0);
3734 
3735   /* For a nested function, we can have: ASAN_MARK (2, &FRAME.2.fp_input, 4) */
3736   if (TREE_CODE (decl) == COMPONENT_REF
3737       && DECL_NONLOCAL_FRAME (TREE_OPERAND (decl, 0)))
3738     decl = TREE_OPERAND (decl, 0);
3739 
3740   gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
3741 
3742   if (hwasan_sanitize_p ())
3743     {
3744       gcc_assert (param_hwasan_instrument_stack);
3745       gimple_seq stmts = NULL;
3746       /* Here we swap ASAN_MARK calls for HWASAN_MARK.
3747 	 This is because we are using the approach of using ASAN_MARK as a
3748 	 synonym until here.
3749 	 That approach means we don't yet have to duplicate all the special
3750 	 cases for ASAN_MARK and ASAN_POISON with the exact same handling but
3751 	 called HWASAN_MARK etc.
3752 
3753 	 N.b. __asan_poison_stack_memory (which implements ASAN_MARK for ASAN)
3754 	 rounds the size up to its shadow memory granularity, while
3755 	 __hwasan_tag_memory (which implements the same for HWASAN) does not.
3756 	 Hence we emit HWASAN_MARK with an aligned size unlike ASAN_MARK.  */
3757       tree len = gimple_call_arg (g, 2);
3758       tree new_len = gimple_build_round_up (&stmts, loc, size_type_node, len,
3759 					    HWASAN_TAG_GRANULE_SIZE);
3760       gimple_build (&stmts, loc, CFN_HWASAN_MARK,
3761 		    void_type_node, gimple_call_arg (g, 0),
3762 		    base, new_len);
3763       gsi_replace_with_seq (iter, stmts, true);
3764       return false;
3765     }
3766 
3767   if (is_poison)
3768     {
3769       if (asan_handled_variables == NULL)
3770 	asan_handled_variables = new hash_set<tree> (16);
3771       asan_handled_variables->add (decl);
3772     }
3773   tree len = gimple_call_arg (g, 2);
3774 
3775   gcc_assert (poly_int_tree_p (len));
3776 
3777   g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3778 			   NOP_EXPR, base);
3779   gimple_set_location (g, loc);
3780   gsi_replace (iter, g, false);
3781   tree base_addr = gimple_assign_lhs (g);
3782 
3783   /* Generate direct emission if size_in_bytes is small.  */
3784   unsigned threshold = param_use_after_scope_direct_emission_threshold;
3785   if (tree_fits_uhwi_p (len) && tree_to_uhwi (len) <= threshold)
3786     {
3787       unsigned HOST_WIDE_INT size_in_bytes = tree_to_uhwi (len);
3788       const unsigned HOST_WIDE_INT shadow_size
3789 	= shadow_mem_size (size_in_bytes);
3790       const unsigned int shadow_align
3791 	= (get_pointer_alignment (base) / BITS_PER_UNIT) >> ASAN_SHADOW_SHIFT;
3792 
3793       tree shadow = build_shadow_mem_access (iter, loc, base_addr,
3794 					     shadow_ptr_types[0], true);
3795 
3796       for (unsigned HOST_WIDE_INT offset = 0; offset < shadow_size;)
3797 	{
3798 	  unsigned size = 1;
3799 	  if (shadow_size - offset >= 4
3800 	      && (!STRICT_ALIGNMENT || shadow_align >= 4))
3801 	    size = 4;
3802 	  else if (shadow_size - offset >= 2
3803 		   && (!STRICT_ALIGNMENT || shadow_align >= 2))
3804 	    size = 2;
3805 
3806 	  unsigned HOST_WIDE_INT last_chunk_size = 0;
3807 	  unsigned HOST_WIDE_INT s = (offset + size) * ASAN_SHADOW_GRANULARITY;
3808 	  if (s > size_in_bytes)
3809 	    last_chunk_size = ASAN_SHADOW_GRANULARITY - (s - size_in_bytes);
3810 
3811 	  asan_store_shadow_bytes (iter, loc, shadow, offset, is_poison,
3812 				   size, last_chunk_size);
3813 	  offset += size;
3814 	}
3815     }
3816   else
3817     {
3818       g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3819 			       NOP_EXPR, len);
3820       gimple_set_location (g, loc);
3821       gsi_insert_before (iter, g, GSI_SAME_STMT);
3822       tree sz_arg = gimple_assign_lhs (g);
3823 
3824       tree fun
3825 	= builtin_decl_implicit (is_poison ? BUILT_IN_ASAN_POISON_STACK_MEMORY
3826 				 : BUILT_IN_ASAN_UNPOISON_STACK_MEMORY);
3827       g = gimple_build_call (fun, 2, base_addr, sz_arg);
3828       gimple_set_location (g, loc);
3829       gsi_insert_after (iter, g, GSI_NEW_STMT);
3830     }
3831 
3832   return false;
3833 }
3834 
3835 /* Expand the ASAN_{LOAD,STORE} builtins.  */
3836 
3837 bool
asan_expand_check_ifn(gimple_stmt_iterator * iter,bool use_calls)3838 asan_expand_check_ifn (gimple_stmt_iterator *iter, bool use_calls)
3839 {
3840   gcc_assert (!hwasan_sanitize_p ());
3841   gimple *g = gsi_stmt (*iter);
3842   location_t loc = gimple_location (g);
3843   bool recover_p;
3844   if (flag_sanitize & SANITIZE_USER_ADDRESS)
3845     recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
3846   else
3847     recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
3848 
3849   HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
3850   gcc_assert (flags < ASAN_CHECK_LAST);
3851   bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
3852   bool is_store = (flags & ASAN_CHECK_STORE) != 0;
3853   bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
3854 
3855   tree base = gimple_call_arg (g, 1);
3856   tree len = gimple_call_arg (g, 2);
3857   HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3));
3858 
3859   HOST_WIDE_INT size_in_bytes
3860     = is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : -1;
3861 
3862   if (use_calls)
3863     {
3864       /* Instrument using callbacks.  */
3865       gimple *g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3866 				      NOP_EXPR, base);
3867       gimple_set_location (g, loc);
3868       gsi_insert_before (iter, g, GSI_SAME_STMT);
3869       tree base_addr = gimple_assign_lhs (g);
3870 
3871       int nargs;
3872       tree fun = check_func (is_store, recover_p, size_in_bytes, &nargs);
3873       if (nargs == 1)
3874 	g = gimple_build_call (fun, 1, base_addr);
3875       else
3876 	{
3877 	  gcc_assert (nargs == 2);
3878 	  g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3879 				   NOP_EXPR, len);
3880 	  gimple_set_location (g, loc);
3881 	  gsi_insert_before (iter, g, GSI_SAME_STMT);
3882 	  tree sz_arg = gimple_assign_lhs (g);
3883 	  g = gimple_build_call (fun, nargs, base_addr, sz_arg);
3884 	}
3885       gimple_set_location (g, loc);
3886       gsi_replace (iter, g, false);
3887       return false;
3888     }
3889 
3890   HOST_WIDE_INT real_size_in_bytes = size_in_bytes == -1 ? 1 : size_in_bytes;
3891 
3892   tree shadow_ptr_type = shadow_ptr_types[real_size_in_bytes == 16 ? 1 : 0];
3893   tree shadow_type = TREE_TYPE (shadow_ptr_type);
3894 
3895   gimple_stmt_iterator gsi = *iter;
3896 
3897   if (!is_non_zero_len)
3898     {
3899       /* So, the length of the memory area to asan-protect is
3900 	 non-constant.  Let's guard the generated instrumentation code
3901 	 like:
3902 
3903 	 if (len != 0)
3904 	   {
3905 	     //asan instrumentation code goes here.
3906 	   }
3907 	 // falltrough instructions, starting with *ITER.  */
3908 
3909       g = gimple_build_cond (NE_EXPR,
3910 			    len,
3911 			    build_int_cst (TREE_TYPE (len), 0),
3912 			    NULL_TREE, NULL_TREE);
3913       gimple_set_location (g, loc);
3914 
3915       basic_block then_bb, fallthrough_bb;
3916       insert_if_then_before_iter (as_a <gcond *> (g), iter,
3917 				  /*then_more_likely_p=*/true,
3918 				  &then_bb, &fallthrough_bb);
3919       /* Note that fallthrough_bb starts with the statement that was
3920 	pointed to by ITER.  */
3921 
3922       /* The 'then block' of the 'if (len != 0) condition is where
3923 	we'll generate the asan instrumentation code now.  */
3924       gsi = gsi_last_bb (then_bb);
3925     }
3926 
3927   /* Get an iterator on the point where we can add the condition
3928      statement for the instrumentation.  */
3929   basic_block then_bb, else_bb;
3930   gsi = create_cond_insert_point (&gsi, /*before_p*/false,
3931 				  /*then_more_likely_p=*/false,
3932 				  /*create_then_fallthru_edge*/recover_p,
3933 				  &then_bb,
3934 				  &else_bb);
3935 
3936   g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3937 			   NOP_EXPR, base);
3938   gimple_set_location (g, loc);
3939   gsi_insert_before (&gsi, g, GSI_NEW_STMT);
3940   tree base_addr = gimple_assign_lhs (g);
3941 
3942   tree t = NULL_TREE;
3943   if (real_size_in_bytes >= 8)
3944     {
3945       tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3946 					     shadow_ptr_type);
3947       t = shadow;
3948     }
3949   else
3950     {
3951       /* Slow path for 1, 2 and 4 byte accesses.  */
3952       /* Test (shadow != 0)
3953 	 & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow).  */
3954       tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
3955 					     shadow_ptr_type);
3956       gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
3957       gimple_seq seq = NULL;
3958       gimple_seq_add_stmt (&seq, shadow_test);
3959       /* Aligned (>= 8 bytes) can test just
3960 	 (real_size_in_bytes - 1 >= shadow), as base_addr & 7 is known
3961 	 to be 0.  */
3962       if (align < 8)
3963 	{
3964 	  gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
3965 						   base_addr, 7));
3966 	  gimple_seq_add_stmt (&seq,
3967 			       build_type_cast (shadow_type,
3968 						gimple_seq_last (seq)));
3969 	  if (real_size_in_bytes > 1)
3970 	    gimple_seq_add_stmt (&seq,
3971 				 build_assign (PLUS_EXPR,
3972 					       gimple_seq_last (seq),
3973 					       real_size_in_bytes - 1));
3974 	  t = gimple_assign_lhs (gimple_seq_last_stmt (seq));
3975 	}
3976       else
3977 	t = build_int_cst (shadow_type, real_size_in_bytes - 1);
3978       gimple_seq_add_stmt (&seq, build_assign (GE_EXPR, t, shadow));
3979       gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
3980 					       gimple_seq_last (seq)));
3981       t = gimple_assign_lhs (gimple_seq_last (seq));
3982       gimple_seq_set_location (seq, loc);
3983       gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
3984 
3985       /* For non-constant, misaligned or otherwise weird access sizes,
3986        check first and last byte.  */
3987       if (size_in_bytes == -1)
3988 	{
3989 	  g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3990 				   MINUS_EXPR, len,
3991 				   build_int_cst (pointer_sized_int_node, 1));
3992 	  gimple_set_location (g, loc);
3993 	  gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3994 	  tree last = gimple_assign_lhs (g);
3995 	  g = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
3996 				   PLUS_EXPR, base_addr, last);
3997 	  gimple_set_location (g, loc);
3998 	  gsi_insert_after (&gsi, g, GSI_NEW_STMT);
3999 	  tree base_end_addr = gimple_assign_lhs (g);
4000 
4001 	  tree shadow = build_shadow_mem_access (&gsi, loc, base_end_addr,
4002 						 shadow_ptr_type);
4003 	  gimple *shadow_test = build_assign (NE_EXPR, shadow, 0);
4004 	  gimple_seq seq = NULL;
4005 	  gimple_seq_add_stmt (&seq, shadow_test);
4006 	  gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
4007 						   base_end_addr, 7));
4008 	  gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
4009 						      gimple_seq_last (seq)));
4010 	  gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
4011 						   gimple_seq_last (seq),
4012 						   shadow));
4013 	  gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
4014 						   gimple_seq_last (seq)));
4015 	  gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
4016 						   gimple_seq_last (seq)));
4017 	  t = gimple_assign_lhs (gimple_seq_last (seq));
4018 	  gimple_seq_set_location (seq, loc);
4019 	  gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
4020 	}
4021     }
4022 
4023   g = gimple_build_cond (NE_EXPR, t, build_int_cst (TREE_TYPE (t), 0),
4024 			 NULL_TREE, NULL_TREE);
4025   gimple_set_location (g, loc);
4026   gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4027 
4028   /* Generate call to the run-time library (e.g. __asan_report_load8).  */
4029   gsi = gsi_start_bb (then_bb);
4030   int nargs;
4031   tree fun = report_error_func (is_store, recover_p, size_in_bytes, &nargs);
4032   g = gimple_build_call (fun, nargs, base_addr, len);
4033   gimple_set_location (g, loc);
4034   gsi_insert_after (&gsi, g, GSI_NEW_STMT);
4035 
4036   gsi_remove (iter, true);
4037   *iter = gsi_start_bb (else_bb);
4038 
4039   return true;
4040 }
4041 
4042 /* Create ASAN shadow variable for a VAR_DECL which has been rewritten
4043    into SSA.  Already seen VAR_DECLs are stored in SHADOW_VARS_MAPPING.  */
4044 
4045 static tree
create_asan_shadow_var(tree var_decl,hash_map<tree,tree> & shadow_vars_mapping)4046 create_asan_shadow_var (tree var_decl,
4047 			hash_map<tree, tree> &shadow_vars_mapping)
4048 {
4049   tree *slot = shadow_vars_mapping.get (var_decl);
4050   if (slot == NULL)
4051     {
4052       tree shadow_var = copy_node (var_decl);
4053 
4054       copy_body_data id;
4055       memset (&id, 0, sizeof (copy_body_data));
4056       id.src_fn = id.dst_fn = current_function_decl;
4057       copy_decl_for_dup_finish (&id, var_decl, shadow_var);
4058 
4059       DECL_ARTIFICIAL (shadow_var) = 1;
4060       DECL_IGNORED_P (shadow_var) = 1;
4061       DECL_SEEN_IN_BIND_EXPR_P (shadow_var) = 0;
4062       gimple_add_tmp_var (shadow_var);
4063 
4064       shadow_vars_mapping.put (var_decl, shadow_var);
4065       return shadow_var;
4066     }
4067   else
4068     return *slot;
4069 }
4070 
4071 /* Expand ASAN_POISON ifn.  */
4072 
4073 bool
asan_expand_poison_ifn(gimple_stmt_iterator * iter,bool * need_commit_edge_insert,hash_map<tree,tree> & shadow_vars_mapping)4074 asan_expand_poison_ifn (gimple_stmt_iterator *iter,
4075 			bool *need_commit_edge_insert,
4076 			hash_map<tree, tree> &shadow_vars_mapping)
4077 {
4078   gimple *g = gsi_stmt (*iter);
4079   tree poisoned_var = gimple_call_lhs (g);
4080   if (!poisoned_var || has_zero_uses (poisoned_var))
4081     {
4082       gsi_remove (iter, true);
4083       return true;
4084     }
4085 
4086   if (SSA_NAME_VAR (poisoned_var) == NULL_TREE)
4087     SET_SSA_NAME_VAR_OR_IDENTIFIER (poisoned_var,
4088 				    create_tmp_var (TREE_TYPE (poisoned_var)));
4089 
4090   tree shadow_var = create_asan_shadow_var (SSA_NAME_VAR (poisoned_var),
4091 					    shadow_vars_mapping);
4092 
4093   bool recover_p;
4094   if (flag_sanitize & SANITIZE_USER_ADDRESS)
4095     recover_p = (flag_sanitize_recover & SANITIZE_USER_ADDRESS) != 0;
4096   else
4097     recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_ADDRESS) != 0;
4098   tree size = DECL_SIZE_UNIT (shadow_var);
4099   gimple *poison_call
4100     = gimple_build_call_internal (IFN_ASAN_MARK, 3,
4101 				  build_int_cst (integer_type_node,
4102 						 ASAN_MARK_POISON),
4103 				  build_fold_addr_expr (shadow_var), size);
4104 
4105   gimple *use;
4106   imm_use_iterator imm_iter;
4107   FOR_EACH_IMM_USE_STMT (use, imm_iter, poisoned_var)
4108     {
4109       if (is_gimple_debug (use))
4110 	continue;
4111 
4112       int nargs;
4113       bool store_p = gimple_call_internal_p (use, IFN_ASAN_POISON_USE);
4114       gcall *call;
4115       if (hwasan_sanitize_p ())
4116 	{
4117 	  tree fun = builtin_decl_implicit (BUILT_IN_HWASAN_TAG_MISMATCH4);
4118 	  /* NOTE: hwasan has no __hwasan_report_* functions like asan does.
4119 		We use __hwasan_tag_mismatch4 with arguments that tell it the
4120 		size of access and load to report all tag mismatches.
4121 
4122 		The arguments to this function are:
4123 		  Address of invalid access.
4124 		  Bitfield containing information about the access
4125 		    (access_info)
4126 		  Pointer to a frame of registers
4127 		    (for use in printing the contents of registers in a dump)
4128 		    Not used yet -- to be used by inline instrumentation.
4129 		  Size of access.
4130 
4131 		The access_info bitfield encodes the following pieces of
4132 		information:
4133 		  - Is this a store or load?
4134 		    access_info & 0x10  =>  store
4135 		  - Should the program continue after reporting the error?
4136 		    access_info & 0x20  =>  recover
4137 		  - What size access is this (not used here since we can always
4138 		    pass the size in the last argument)
4139 
4140 		    if (access_info & 0xf == 0xf)
4141 		      size is taken from last argument.
4142 		    else
4143 		      size == 1 << (access_info & 0xf)
4144 
4145 		The last argument contains the size of the access iff the
4146 		access_info size indicator is 0xf (we always use this argument
4147 		rather than storing the size in the access_info bitfield).
4148 
4149 		See the function definition `__hwasan_tag_mismatch4` in
4150 		libsanitizer/hwasan for the full definition.
4151 		*/
4152 	  unsigned access_info = (0x20 * recover_p)
4153 	    + (0x10 * store_p)
4154 	    + (0xf);
4155 	  call = gimple_build_call (fun, 4,
4156 				    build_fold_addr_expr (shadow_var),
4157 				    build_int_cst (pointer_sized_int_node,
4158 						   access_info),
4159 				    build_int_cst (pointer_sized_int_node, 0),
4160 				    size);
4161 	}
4162       else
4163 	{
4164 	  tree fun = report_error_func (store_p, recover_p, tree_to_uhwi (size),
4165 					&nargs);
4166 	  call = gimple_build_call (fun, 1,
4167 				    build_fold_addr_expr (shadow_var));
4168 	}
4169       gimple_set_location (call, gimple_location (use));
4170       gimple *call_to_insert = call;
4171 
4172       /* The USE can be a gimple PHI node.  If so, insert the call on
4173 	 all edges leading to the PHI node.  */
4174       if (is_a <gphi *> (use))
4175 	{
4176 	  gphi *phi = dyn_cast<gphi *> (use);
4177 	  for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
4178 	    if (gimple_phi_arg_def (phi, i) == poisoned_var)
4179 	      {
4180 		edge e = gimple_phi_arg_edge (phi, i);
4181 
4182 		/* Do not insert on an edge we can't split.  */
4183 		if (e->flags & EDGE_ABNORMAL)
4184 		  continue;
4185 
4186 		if (call_to_insert == NULL)
4187 		  call_to_insert = gimple_copy (call);
4188 
4189 		gsi_insert_seq_on_edge (e, call_to_insert);
4190 		*need_commit_edge_insert = true;
4191 		call_to_insert = NULL;
4192 	      }
4193 	}
4194       else
4195 	{
4196 	  gimple_stmt_iterator gsi = gsi_for_stmt (use);
4197 	  if (store_p)
4198 	    gsi_replace (&gsi, call, true);
4199 	  else
4200 	    gsi_insert_before (&gsi, call, GSI_NEW_STMT);
4201 	}
4202     }
4203 
4204   SSA_NAME_IS_DEFAULT_DEF (poisoned_var) = true;
4205   SSA_NAME_DEF_STMT (poisoned_var) = gimple_build_nop ();
4206   gsi_replace (iter, poison_call, false);
4207 
4208   return true;
4209 }
4210 
4211 /* Instrument the current function.  */
4212 
4213 static unsigned int
asan_instrument(void)4214 asan_instrument (void)
4215 {
4216   if (hwasan_sanitize_p ())
4217     {
4218       transform_statements ();
4219       return 0;
4220     }
4221 
4222   if (shadow_ptr_types[0] == NULL_TREE)
4223     asan_init_shadow_ptr_types ();
4224   transform_statements ();
4225   last_alloca_addr = NULL_TREE;
4226   return 0;
4227 }
4228 
4229 static bool
gate_asan(void)4230 gate_asan (void)
4231 {
4232   return sanitize_flags_p (SANITIZE_ADDRESS);
4233 }
4234 
4235 namespace {
4236 
4237 const pass_data pass_data_asan =
4238 {
4239   GIMPLE_PASS, /* type */
4240   "asan", /* name */
4241   OPTGROUP_NONE, /* optinfo_flags */
4242   TV_NONE, /* tv_id */
4243   ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4244   0, /* properties_provided */
4245   0, /* properties_destroyed */
4246   0, /* todo_flags_start */
4247   TODO_update_ssa, /* todo_flags_finish */
4248 };
4249 
4250 class pass_asan : public gimple_opt_pass
4251 {
4252 public:
pass_asan(gcc::context * ctxt)4253   pass_asan (gcc::context *ctxt)
4254     : gimple_opt_pass (pass_data_asan, ctxt)
4255   {}
4256 
4257   /* opt_pass methods: */
clone()4258   opt_pass * clone () { return new pass_asan (m_ctxt); }
gate(function *)4259   virtual bool gate (function *) { return gate_asan () || gate_hwasan (); }
execute(function *)4260   virtual unsigned int execute (function *) { return asan_instrument (); }
4261 
4262 }; // class pass_asan
4263 
4264 } // anon namespace
4265 
4266 gimple_opt_pass *
make_pass_asan(gcc::context * ctxt)4267 make_pass_asan (gcc::context *ctxt)
4268 {
4269   return new pass_asan (ctxt);
4270 }
4271 
4272 namespace {
4273 
4274 const pass_data pass_data_asan_O0 =
4275 {
4276   GIMPLE_PASS, /* type */
4277   "asan0", /* name */
4278   OPTGROUP_NONE, /* optinfo_flags */
4279   TV_NONE, /* tv_id */
4280   ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */
4281   0, /* properties_provided */
4282   0, /* properties_destroyed */
4283   0, /* todo_flags_start */
4284   TODO_update_ssa, /* todo_flags_finish */
4285 };
4286 
4287 class pass_asan_O0 : public gimple_opt_pass
4288 {
4289 public:
pass_asan_O0(gcc::context * ctxt)4290   pass_asan_O0 (gcc::context *ctxt)
4291     : gimple_opt_pass (pass_data_asan_O0, ctxt)
4292   {}
4293 
4294   /* opt_pass methods: */
gate(function *)4295   virtual bool gate (function *)
4296     {
4297       return !optimize && (gate_asan () || gate_hwasan ());
4298     }
execute(function *)4299   virtual unsigned int execute (function *) { return asan_instrument (); }
4300 
4301 }; // class pass_asan_O0
4302 
4303 } // anon namespace
4304 
4305 gimple_opt_pass *
make_pass_asan_O0(gcc::context * ctxt)4306 make_pass_asan_O0 (gcc::context *ctxt)
4307 {
4308   return new pass_asan_O0 (ctxt);
4309 }
4310 
4311 /*  HWASAN  */
4312 
4313 /* For stack tagging:
4314 
4315    Return the offset from the frame base tag that the "next" expanded object
4316    should have.  */
4317 uint8_t
hwasan_current_frame_tag()4318 hwasan_current_frame_tag ()
4319 {
4320   return hwasan_frame_tag_offset;
4321 }
4322 
4323 /* For stack tagging:
4324 
4325    Return the 'base pointer' for this function.  If that base pointer has not
4326    yet been created then we create a register to hold it and record the insns
4327    to initialize the register in `hwasan_frame_base_init_seq` for later
4328    emission.  */
4329 rtx
hwasan_frame_base()4330 hwasan_frame_base ()
4331 {
4332   if (! hwasan_frame_base_ptr)
4333     {
4334       start_sequence ();
4335       hwasan_frame_base_ptr
4336 	= force_reg (Pmode,
4337 		     targetm.memtag.insert_random_tag (virtual_stack_vars_rtx,
4338 						       NULL_RTX));
4339       hwasan_frame_base_init_seq = get_insns ();
4340       end_sequence ();
4341     }
4342 
4343   return hwasan_frame_base_ptr;
4344 }
4345 
4346 /* For stack tagging:
4347 
4348    Check whether this RTX is a standard pointer addressing the base of the
4349    stack variables for this frame.  Returns true if the RTX is either
4350    virtual_stack_vars_rtx or hwasan_frame_base_ptr.  */
4351 bool
stack_vars_base_reg_p(rtx base)4352 stack_vars_base_reg_p (rtx base)
4353 {
4354   return base == virtual_stack_vars_rtx || base == hwasan_frame_base_ptr;
4355 }
4356 
4357 /* For stack tagging:
4358 
4359    Emit frame base initialisation.
4360    If hwasan_frame_base has been used before here then
4361    hwasan_frame_base_init_seq contains the sequence of instructions to
4362    initialize it.  This must be put just before the hwasan prologue, so we emit
4363    the insns before parm_birth_insn (which will point to the first instruction
4364    of the hwasan prologue if it exists).
4365 
4366    We update `parm_birth_insn` to point to the start of this initialisation
4367    since that represents the end of the initialisation done by
4368    expand_function_{start,end} functions and we want to maintain that.  */
4369 void
hwasan_maybe_emit_frame_base_init()4370 hwasan_maybe_emit_frame_base_init ()
4371 {
4372   if (! hwasan_frame_base_init_seq)
4373     return;
4374   emit_insn_before (hwasan_frame_base_init_seq, parm_birth_insn);
4375   parm_birth_insn = hwasan_frame_base_init_seq;
4376 }
4377 
4378 /* Record a compile-time constant size stack variable that HWASAN will need to
4379    tag.  This record of the range of a stack variable will be used by
4380    `hwasan_emit_prologue` to emit the RTL at the start of each frame which will
4381    set tags in the shadow memory according to the assigned tag for each object.
4382 
4383    The range that the object spans in stack space should be described by the
4384    bounds `untagged_base + nearest_offset` and
4385    `untagged_base + farthest_offset`.
4386    `tagged_base` is the base address which contains the "base frame tag" for
4387    this frame, and from which the value to address this object with will be
4388    calculated.
4389 
4390    We record the `untagged_base` since the functions in the hwasan library we
4391    use to tag memory take pointers without a tag.  */
4392 void
hwasan_record_stack_var(rtx untagged_base,rtx tagged_base,poly_int64 nearest_offset,poly_int64 farthest_offset)4393 hwasan_record_stack_var (rtx untagged_base, rtx tagged_base,
4394 			 poly_int64 nearest_offset, poly_int64 farthest_offset)
4395 {
4396   hwasan_stack_var cur_var;
4397   cur_var.untagged_base = untagged_base;
4398   cur_var.tagged_base = tagged_base;
4399   cur_var.nearest_offset = nearest_offset;
4400   cur_var.farthest_offset = farthest_offset;
4401   cur_var.tag_offset = hwasan_current_frame_tag ();
4402 
4403   hwasan_tagged_stack_vars.safe_push (cur_var);
4404 }
4405 
4406 /* Return the RTX representing the farthest extent of the statically allocated
4407    stack objects for this frame.  If hwasan_frame_base_ptr has not been
4408    initialized then we are not storing any static variables on the stack in
4409    this frame.  In this case we return NULL_RTX to represent that.
4410 
4411    Otherwise simply return virtual_stack_vars_rtx + frame_offset.  */
4412 rtx
hwasan_get_frame_extent()4413 hwasan_get_frame_extent ()
4414 {
4415   return (hwasan_frame_base_ptr
4416 	  ? plus_constant (Pmode, virtual_stack_vars_rtx, frame_offset)
4417 	  : NULL_RTX);
4418 }
4419 
4420 /* For stack tagging:
4421 
4422    Increment the frame tag offset modulo the size a tag can represent.  */
4423 void
hwasan_increment_frame_tag()4424 hwasan_increment_frame_tag ()
4425 {
4426   uint8_t tag_bits = HWASAN_TAG_SIZE;
4427   gcc_assert (HWASAN_TAG_SIZE
4428 	      <= sizeof (hwasan_frame_tag_offset) * CHAR_BIT);
4429   hwasan_frame_tag_offset = (hwasan_frame_tag_offset + 1) % (1 << tag_bits);
4430   /* The "background tag" of the stack is zero by definition.
4431      This is the tag that objects like parameters passed on the stack and
4432      spilled registers are given.  It is handy to avoid this tag for objects
4433      whose tags we decide ourselves, partly to ensure that buffer overruns
4434      can't affect these important variables (e.g. saved link register, saved
4435      stack pointer etc) and partly to make debugging easier (everything with a
4436      tag of zero is space allocated automatically by the compiler).
4437 
4438      This is not feasible when using random frame tags (the default
4439      configuration for hwasan) since the tag for the given frame is randomly
4440      chosen at runtime.  In order to avoid any tags matching the stack
4441      background we would need to decide tag offsets at runtime instead of
4442      compile time (and pay the resulting performance cost).
4443 
4444      When not using random base tags for each frame (i.e. when compiled with
4445      `--param hwasan-random-frame-tag=0`) the base tag for each frame is zero.
4446      This means the tag that each object gets is equal to the
4447      hwasan_frame_tag_offset used in determining it.
4448      When this is the case we *can* ensure no object gets the tag of zero by
4449      simply ensuring no object has the hwasan_frame_tag_offset of zero.
4450 
4451      There is the extra complication that we only record the
4452      hwasan_frame_tag_offset here (which is the offset from the tag stored in
4453      the stack pointer).  In the kernel, the tag in the stack pointer is 0xff
4454      rather than zero.  This does not cause problems since tags of 0xff are
4455      never checked in the kernel.  As mentioned at the beginning of this
4456      comment the background tag of the stack is zero by definition, which means
4457      that for the kernel we should skip offsets of both 0 and 1 from the stack
4458      pointer.  Avoiding the offset of 0 ensures we use a tag which will be
4459      checked, avoiding the offset of 1 ensures we use a tag that is not the
4460      same as the background.  */
4461   if (hwasan_frame_tag_offset == 0 && ! param_hwasan_random_frame_tag)
4462     hwasan_frame_tag_offset += 1;
4463   if (hwasan_frame_tag_offset == 1 && ! param_hwasan_random_frame_tag
4464       && sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS))
4465     hwasan_frame_tag_offset += 1;
4466 }
4467 
4468 /* Clear internal state for the next function.
4469    This function is called before variables on the stack get expanded, in
4470    `init_vars_expansion`.  */
4471 void
hwasan_record_frame_init()4472 hwasan_record_frame_init ()
4473 {
4474   delete asan_used_labels;
4475   asan_used_labels = NULL;
4476 
4477   /* If this isn't the case then some stack variable was recorded *before*
4478      hwasan_record_frame_init is called, yet *after* the hwasan prologue for
4479      the previous frame was emitted.  Such stack variables would not have
4480      their shadow stack filled in.  */
4481   gcc_assert (hwasan_tagged_stack_vars.is_empty ());
4482   hwasan_frame_base_ptr = NULL_RTX;
4483   hwasan_frame_base_init_seq = NULL;
4484 
4485   /* When not using a random frame tag we can avoid the background stack
4486      color which gives the user a little better debug output upon a crash.
4487      Meanwhile, when using a random frame tag it will be nice to avoid adding
4488      tags for the first object since that is unnecessary extra work.
4489      Hence set the initial hwasan_frame_tag_offset to be 0 if using a random
4490      frame tag and 1 otherwise.
4491 
4492      As described in hwasan_increment_frame_tag, in the kernel the stack
4493      pointer has the tag 0xff.  That means that to avoid 0xff and 0 (the tag
4494      which the kernel does not check and the background tag respectively) we
4495      start with a tag offset of 2.  */
4496   hwasan_frame_tag_offset = param_hwasan_random_frame_tag
4497     ? 0
4498     : sanitize_flags_p (SANITIZE_KERNEL_HWADDRESS) ? 2 : 1;
4499 }
4500 
4501 /* For stack tagging:
4502    (Emits HWASAN equivalent of what is emitted by
4503    `asan_emit_stack_protection`).
4504 
4505    Emits the extra prologue code to set the shadow stack as required for HWASAN
4506    stack instrumentation.
4507 
4508    Uses the vector of recorded stack variables hwasan_tagged_stack_vars.  When
4509    this function has completed hwasan_tagged_stack_vars is empty and all
4510    objects it had pointed to are deallocated.  */
4511 void
hwasan_emit_prologue()4512 hwasan_emit_prologue ()
4513 {
4514   /* We need untagged base pointers since libhwasan only accepts untagged
4515     pointers in __hwasan_tag_memory.  We need the tagged base pointer to obtain
4516     the base tag for an offset.  */
4517 
4518   if (hwasan_tagged_stack_vars.is_empty ())
4519     return;
4520 
4521   poly_int64 bot = 0, top = 0;
4522   for (hwasan_stack_var &cur : hwasan_tagged_stack_vars)
4523     {
4524       poly_int64 nearest = cur.nearest_offset;
4525       poly_int64 farthest = cur.farthest_offset;
4526 
4527       if (known_ge (nearest, farthest))
4528 	{
4529 	  top = nearest;
4530 	  bot = farthest;
4531 	}
4532       else
4533 	{
4534 	  /* Given how these values are calculated, one must be known greater
4535 	     than the other.  */
4536 	  gcc_assert (known_le (nearest, farthest));
4537 	  top = farthest;
4538 	  bot = nearest;
4539 	}
4540       poly_int64 size = (top - bot);
4541 
4542       /* Assert the edge of each variable is aligned to the HWASAN tag granule
4543 	 size.  */
4544       gcc_assert (multiple_p (top, HWASAN_TAG_GRANULE_SIZE));
4545       gcc_assert (multiple_p (bot, HWASAN_TAG_GRANULE_SIZE));
4546       gcc_assert (multiple_p (size, HWASAN_TAG_GRANULE_SIZE));
4547 
4548       rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4549       rtx base_tag = targetm.memtag.extract_tag (cur.tagged_base, NULL_RTX);
4550       rtx tag = plus_constant (QImode, base_tag, cur.tag_offset);
4551       tag = hwasan_truncate_to_tag_size (tag, NULL_RTX);
4552 
4553       rtx bottom = convert_memory_address (ptr_mode,
4554 					   plus_constant (Pmode,
4555 							  cur.untagged_base,
4556 							  bot));
4557       emit_library_call (fn, LCT_NORMAL, VOIDmode,
4558 			 bottom, ptr_mode,
4559 			 tag, QImode,
4560 			 gen_int_mode (size, ptr_mode), ptr_mode);
4561     }
4562   /* Clear the stack vars, we've emitted the prologue for them all now.  */
4563   hwasan_tagged_stack_vars.truncate (0);
4564 }
4565 
4566 /* For stack tagging:
4567 
4568    Return RTL insns to clear the tags between DYNAMIC and VARS pointers
4569    into the stack.  These instructions should be emitted at the end of
4570    every function.
4571 
4572    If `dynamic` is NULL_RTX then no insns are returned.  */
4573 rtx_insn *
hwasan_emit_untag_frame(rtx dynamic,rtx vars)4574 hwasan_emit_untag_frame (rtx dynamic, rtx vars)
4575 {
4576   if (! dynamic)
4577     return NULL;
4578 
4579   start_sequence ();
4580 
4581   dynamic = convert_memory_address (ptr_mode, dynamic);
4582   vars = convert_memory_address (ptr_mode, vars);
4583 
4584   rtx top_rtx;
4585   rtx bot_rtx;
4586   if (FRAME_GROWS_DOWNWARD)
4587     {
4588       top_rtx = vars;
4589       bot_rtx = dynamic;
4590     }
4591   else
4592     {
4593       top_rtx = dynamic;
4594       bot_rtx = vars;
4595     }
4596 
4597   rtx size_rtx = expand_simple_binop (ptr_mode, MINUS, top_rtx, bot_rtx,
4598 				      NULL_RTX, /* unsignedp = */0,
4599 				      OPTAB_DIRECT);
4600 
4601   rtx fn = init_one_libfunc ("__hwasan_tag_memory");
4602   emit_library_call (fn, LCT_NORMAL, VOIDmode,
4603 		     bot_rtx, ptr_mode,
4604 		     HWASAN_STACK_BACKGROUND, QImode,
4605 		     size_rtx, ptr_mode);
4606 
4607   do_pending_stack_adjust ();
4608   rtx_insn *insns = get_insns ();
4609   end_sequence ();
4610   return insns;
4611 }
4612 
4613 /* Needs to be GTY(()), because cgraph_build_static_cdtor may
4614    invoke ggc_collect.  */
4615 static GTY(()) tree hwasan_ctor_statements;
4616 
4617 /* Insert module initialization into this TU.  This initialization calls the
4618    initialization code for libhwasan.  */
4619 void
hwasan_finish_file(void)4620 hwasan_finish_file (void)
4621 {
4622   /* Do not emit constructor initialization for the kernel.
4623      (the kernel has its own initialization already).  */
4624   if (flag_sanitize & SANITIZE_KERNEL_HWADDRESS)
4625     return;
4626 
4627   /* Avoid instrumenting code in the hwasan constructors/destructors.  */
4628   flag_sanitize &= ~SANITIZE_HWADDRESS;
4629   int priority = MAX_RESERVED_INIT_PRIORITY - 1;
4630   tree fn = builtin_decl_implicit (BUILT_IN_HWASAN_INIT);
4631   append_to_statement_list (build_call_expr (fn, 0), &hwasan_ctor_statements);
4632   cgraph_build_static_cdtor ('I', hwasan_ctor_statements, priority);
4633   flag_sanitize |= SANITIZE_HWADDRESS;
4634 }
4635 
4636 /* For stack tagging:
4637 
4638    Truncate `tag` to the number of bits that a tag uses (i.e. to
4639    HWASAN_TAG_SIZE).  Store the result in `target` if it's convenient.  */
4640 rtx
hwasan_truncate_to_tag_size(rtx tag,rtx target)4641 hwasan_truncate_to_tag_size (rtx tag, rtx target)
4642 {
4643   gcc_assert (GET_MODE (tag) == QImode);
4644   if (HWASAN_TAG_SIZE != GET_MODE_PRECISION (QImode))
4645     {
4646       gcc_assert (GET_MODE_PRECISION (QImode) > HWASAN_TAG_SIZE);
4647       rtx mask = gen_int_mode ((HOST_WIDE_INT_1U << HWASAN_TAG_SIZE) - 1,
4648 			       QImode);
4649       tag = expand_simple_binop (QImode, AND, tag, mask, target,
4650 				 /* unsignedp = */1, OPTAB_WIDEN);
4651       gcc_assert (tag);
4652     }
4653   return tag;
4654 }
4655 
4656 /* Construct a function tree for __hwasan_{load,store}{1,2,4,8,16,_n}.
4657    IS_STORE is either 1 (for a store) or 0 (for a load).  */
4658 static combined_fn
hwasan_check_func(bool is_store,bool recover_p,HOST_WIDE_INT size_in_bytes,int * nargs)4659 hwasan_check_func (bool is_store, bool recover_p, HOST_WIDE_INT size_in_bytes,
4660 		   int *nargs)
4661 {
4662   static enum built_in_function check[2][2][6]
4663     = { { { BUILT_IN_HWASAN_LOAD1, BUILT_IN_HWASAN_LOAD2,
4664 	    BUILT_IN_HWASAN_LOAD4, BUILT_IN_HWASAN_LOAD8,
4665 	    BUILT_IN_HWASAN_LOAD16, BUILT_IN_HWASAN_LOADN },
4666 	  { BUILT_IN_HWASAN_STORE1, BUILT_IN_HWASAN_STORE2,
4667 	    BUILT_IN_HWASAN_STORE4, BUILT_IN_HWASAN_STORE8,
4668 	    BUILT_IN_HWASAN_STORE16, BUILT_IN_HWASAN_STOREN } },
4669 	{ { BUILT_IN_HWASAN_LOAD1_NOABORT,
4670 	    BUILT_IN_HWASAN_LOAD2_NOABORT,
4671 	    BUILT_IN_HWASAN_LOAD4_NOABORT,
4672 	    BUILT_IN_HWASAN_LOAD8_NOABORT,
4673 	    BUILT_IN_HWASAN_LOAD16_NOABORT,
4674 	    BUILT_IN_HWASAN_LOADN_NOABORT },
4675 	  { BUILT_IN_HWASAN_STORE1_NOABORT,
4676 	    BUILT_IN_HWASAN_STORE2_NOABORT,
4677 	    BUILT_IN_HWASAN_STORE4_NOABORT,
4678 	    BUILT_IN_HWASAN_STORE8_NOABORT,
4679 	    BUILT_IN_HWASAN_STORE16_NOABORT,
4680 	    BUILT_IN_HWASAN_STOREN_NOABORT } } };
4681   if (size_in_bytes == -1)
4682     {
4683       *nargs = 2;
4684       return as_combined_fn (check[recover_p][is_store][5]);
4685     }
4686   *nargs = 1;
4687   int size_log2 = exact_log2 (size_in_bytes);
4688   gcc_assert (size_log2 >= 0 && size_log2 <= 5);
4689   return as_combined_fn (check[recover_p][is_store][size_log2]);
4690 }
4691 
4692 /* Expand the HWASAN_{LOAD,STORE} builtins.  */
4693 bool
hwasan_expand_check_ifn(gimple_stmt_iterator * iter,bool)4694 hwasan_expand_check_ifn (gimple_stmt_iterator *iter, bool)
4695 {
4696   gimple *g = gsi_stmt (*iter);
4697   location_t loc = gimple_location (g);
4698   bool recover_p;
4699   if (flag_sanitize & SANITIZE_USER_HWADDRESS)
4700     recover_p = (flag_sanitize_recover & SANITIZE_USER_HWADDRESS) != 0;
4701   else
4702     recover_p = (flag_sanitize_recover & SANITIZE_KERNEL_HWADDRESS) != 0;
4703 
4704   HOST_WIDE_INT flags = tree_to_shwi (gimple_call_arg (g, 0));
4705   gcc_assert (flags < ASAN_CHECK_LAST);
4706   bool is_scalar_access = (flags & ASAN_CHECK_SCALAR_ACCESS) != 0;
4707   bool is_store = (flags & ASAN_CHECK_STORE) != 0;
4708   bool is_non_zero_len = (flags & ASAN_CHECK_NON_ZERO_LEN) != 0;
4709 
4710   tree base = gimple_call_arg (g, 1);
4711   tree len = gimple_call_arg (g, 2);
4712 
4713   /* `align` is unused for HWASAN_CHECK, but we pass the argument anyway
4714      since that way the arguments match ASAN_CHECK.  */
4715   /* HOST_WIDE_INT align = tree_to_shwi (gimple_call_arg (g, 3));  */
4716 
4717   unsigned HOST_WIDE_INT size_in_bytes
4718     = is_scalar_access ? tree_to_shwi (len) : -1;
4719 
4720   gimple_stmt_iterator gsi = *iter;
4721 
4722   if (!is_non_zero_len)
4723     {
4724       /* So, the length of the memory area to hwasan-protect is
4725 	 non-constant.  Let's guard the generated instrumentation code
4726 	 like:
4727 
4728 	 if (len != 0)
4729 	   {
4730 	     // hwasan instrumentation code goes here.
4731 	   }
4732 	 // falltrough instructions, starting with *ITER.  */
4733 
4734       g = gimple_build_cond (NE_EXPR,
4735 			    len,
4736 			    build_int_cst (TREE_TYPE (len), 0),
4737 			    NULL_TREE, NULL_TREE);
4738       gimple_set_location (g, loc);
4739 
4740       basic_block then_bb, fallthrough_bb;
4741       insert_if_then_before_iter (as_a <gcond *> (g), iter,
4742 				  /*then_more_likely_p=*/true,
4743 				  &then_bb, &fallthrough_bb);
4744       /* Note that fallthrough_bb starts with the statement that was
4745 	pointed to by ITER.  */
4746 
4747       /* The 'then block' of the 'if (len != 0) condition is where
4748 	we'll generate the hwasan instrumentation code now.  */
4749       gsi = gsi_last_bb (then_bb);
4750     }
4751 
4752   gimple_seq stmts = NULL;
4753   tree base_addr = gimple_build (&stmts, loc, NOP_EXPR,
4754 				 pointer_sized_int_node, base);
4755 
4756   int nargs = 0;
4757   combined_fn fn
4758     = hwasan_check_func (is_store, recover_p, size_in_bytes, &nargs);
4759   if (nargs == 1)
4760     gimple_build (&stmts, loc, fn, void_type_node, base_addr);
4761   else
4762     {
4763       gcc_assert (nargs == 2);
4764       tree sz_arg = gimple_build (&stmts, loc, NOP_EXPR,
4765 				  pointer_sized_int_node, len);
4766       gimple_build (&stmts, loc, fn, void_type_node, base_addr, sz_arg);
4767     }
4768 
4769   gsi_insert_seq_after (&gsi, stmts, GSI_NEW_STMT);
4770   gsi_remove (iter, true);
4771   *iter = gsi;
4772   return false;
4773 }
4774 
4775 /* For stack tagging:
4776 
4777    Dummy: the HWASAN_MARK internal function should only ever be in the code
4778    after the sanopt pass.  */
4779 bool
hwasan_expand_mark_ifn(gimple_stmt_iterator *)4780 hwasan_expand_mark_ifn (gimple_stmt_iterator *)
4781 {
4782   gcc_unreachable ();
4783 }
4784 
4785 bool
gate_hwasan()4786 gate_hwasan ()
4787 {
4788   return hwasan_sanitize_p ();
4789 }
4790 
4791 #include "gt-asan.h"
4792