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