LCOV - code coverage report
Current view: top level - src - ircode.c (source / functions) Hit Total Coverage
Test: [build process] commit ef510b1f346f4c9f9d86eaceace5ca54961a1dbc Lines: 599 684 87.6 %
Date: 2022-07-17 01:01:28 Functions: 21 23 91.3 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 343 445 77.1 %

           Branch data     Line data    Source code
       1                 :            : // This file is a part of Julia. License is MIT: https://julialang.org/license
       2                 :            : 
       3                 :            : /*
       4                 :            :   encoding IR to/from compact representation
       5                 :            : */
       6                 :            : #include <stdlib.h>
       7                 :            : #include <string.h>
       8                 :            : 
       9                 :            : #include "julia.h"
      10                 :            : #include "julia_internal.h"
      11                 :            : #include "serialize.h"
      12                 :            : 
      13                 :            : #ifndef _OS_WINDOWS_
      14                 :            : #include <dlfcn.h>
      15                 :            : #endif
      16                 :            : 
      17                 :            : #include "valgrind.h"
      18                 :            : #include "julia_assert.h"
      19                 :            : 
      20                 :            : #ifdef __cplusplus
      21                 :            : extern "C" {
      22                 :            : #endif
      23                 :            : 
      24                 :            : typedef struct {
      25                 :            :     ios_t *s;
      26                 :            :     // method we're compressing for
      27                 :            :     jl_method_t *method;
      28                 :            :     jl_ptls_t ptls;
      29                 :            :     uint8_t relocatability;
      30                 :            : } jl_ircode_state;
      31                 :            : 
      32                 :            : // --- encoding ---
      33                 :            : 
      34                 :            : #define jl_encode_value(s, v) jl_encode_value_((s), (jl_value_t*)(v), 0)
      35                 :            : 
      36                 :    7295860 : static void tagged_root(rle_reference *rr, jl_ircode_state *s, int i)
      37                 :            : {
      38         [ +  + ]:    7295860 :     if (!get_root_reference(rr, s->method, i))
      39                 :    3310940 :         s->relocatability = 0;
      40                 :    7295860 : }
      41                 :            : 
      42                 :    7295860 : static void literal_val_id(rle_reference *rr, jl_ircode_state *s, jl_value_t *v) JL_GC_DISABLED
      43                 :            : {
      44                 :    7295860 :     jl_array_t *rs = s->method->roots;
      45                 :    7295860 :     int i, l = jl_array_len(rs);
      46   [ +  +  +  + ]:    7295860 :     if (jl_is_symbol(v) || jl_is_concrete_type(v)) {
      47         [ +  + ]:  250807000 :         for (i = 0; i < l; i++) {
      48         [ +  + ]:  250368000 :             if (jl_array_ptr_ref(rs, i) == v)
      49                 :    4622760 :                 return tagged_root(rr, s, i);
      50                 :            :         }
      51                 :            :     }
      52                 :            :     else {
      53         [ +  + ]:   91961100 :         for (i = 0; i < l; i++) {
      54         [ +  + ]:   91652000 :             if (jl_egal(jl_array_ptr_ref(rs, i), v))
      55                 :    1925330 :                 return tagged_root(rr, s, i);
      56                 :            :         }
      57                 :            :     }
      58                 :     747774 :     jl_add_method_root(s->method, jl_precompile_toplevel_module, v);
      59                 :     747774 :     return tagged_root(rr, s, jl_array_len(rs) - 1);
      60                 :            : }
      61                 :            : 
      62                 :   18685500 : static void jl_encode_int32(jl_ircode_state *s, int32_t x)
      63                 :            : {
      64   [ +  +  +  + ]:   18685500 :     if (x >= INT16_MIN && x <= INT16_MAX) {
      65                 :   18685300 :         write_uint8(s->s, TAG_SHORT_INT32);
      66                 :   18685300 :         write_uint16(s->s, (uint16_t)x);
      67                 :            :     }
      68                 :            :     else {
      69                 :        128 :         write_uint8(s->s, TAG_INT32);
      70                 :        128 :         write_int32(s->s, x);
      71                 :            :     }
      72                 :   18685500 : }
      73                 :            : 
      74                 :  116260000 : static void jl_encode_value_(jl_ircode_state *s, jl_value_t *v, int as_literal) JL_GC_DISABLED
      75                 :            : {
      76                 :            :     size_t i;
      77                 :            :     rle_reference rr;
      78                 :            : 
      79         [ +  + ]:  116260000 :     if (v == NULL) {
      80                 :     154596 :         write_uint8(s->s, TAG_NULL);
      81                 :   10947800 :         return;
      82                 :            :     }
      83                 :            : 
      84                 :  116105000 :     void *tag = jl_lookup_ser_tag(v);
      85         [ +  + ]:  116105000 :     if (tag != HT_NOTFOUND) {
      86                 :   37617100 :         uint8_t t8 = (intptr_t)tag;
      87         [ +  + ]:   37617100 :         if (t8 <= LAST_TAG)
      88                 :    2183670 :             write_uint8(s->s, 0);
      89                 :   37617100 :         write_uint8(s->s, t8);
      90                 :            :     }
      91   [ +  +  +  + ]:   78487800 :     else if (jl_is_symbol(v) && (tag = jl_lookup_common_symbol(v)) != HT_NOTFOUND) {
      92                 :    4354110 :         write_uint8(s->s, TAG_COMMONSYM);
      93                 :    4354110 :         write_uint8(s->s, (uint8_t)(size_t)tag);
      94                 :            :     }
      95         [ +  + ]:   74133700 :     else if (v == (jl_value_t*)jl_core_module) {
      96                 :    1636540 :         write_uint8(s->s, TAG_CORE);
      97                 :            :     }
      98         [ +  + ]:   72497200 :     else if (v == (jl_value_t*)jl_base_module) {
      99                 :    9009350 :         write_uint8(s->s, TAG_BASE);
     100                 :            :     }
     101   [ +  +  -  + ]:   63487800 :     else if (jl_typeis(v, jl_string_type) && jl_string_len(v) == 0) {
     102                 :          0 :         jl_encode_value(s, jl_an_empty_string);
     103                 :            :     }
     104         [ +  + ]:   63487800 :     else if (v == (jl_value_t*)s->method->module) {
     105                 :    1930230 :         write_uint8(s->s, TAG_NEARBYMODULE);
     106                 :            :     }
     107   [ +  +  +  + ]:   61557600 :     else if (jl_is_datatype(v) && ((jl_datatype_t*)v)->name == jl_array_typename &&
     108   [ +  +  +  + ]:     384623 :              jl_is_long(jl_tparam1(v)) && jl_unbox_long(jl_tparam1(v)) == 1 &&
     109         [ +  + ]:     383841 :              !((jl_datatype_t*)v)->hasfreetypevars) {
     110                 :     383076 :         write_uint8(s->s, TAG_VECTORTY);
     111                 :     383076 :         jl_encode_value(s, jl_tparam0(v));
     112                 :            :     }
     113   [ +  +  +  + ]:   61174500 :     else if (jl_is_datatype(v) && ((jl_datatype_t*)v)->name == jl_pointer_typename &&
     114         [ +  + ]:     167848 :              !((jl_datatype_t*)v)->hasfreetypevars) {
     115                 :     167563 :         write_uint8(s->s, TAG_PTRTY);
     116                 :     167563 :         jl_encode_value(s, jl_tparam0(v));
     117                 :            :     }
     118         [ +  + ]:   61007000 :     else if (jl_is_svec(v)) {
     119                 :     161297 :         size_t l = jl_svec_len(v);
     120         [ +  - ]:     161297 :         if (l <= 255) {
     121                 :     161297 :             write_uint8(s->s, TAG_SVEC);
     122                 :     161297 :             write_uint8(s->s, (uint8_t)l);
     123                 :            :         }
     124                 :            :         else {
     125                 :          0 :             write_uint8(s->s, TAG_LONG_SVEC);
     126                 :          0 :             write_int32(s->s, l);
     127                 :            :         }
     128         [ +  + ]:     442913 :         for (i = 0; i < l; i++) {
     129                 :     281616 :             jl_encode_value(s, jl_svecref(v, i));
     130                 :            :         }
     131                 :            :     }
     132         [ +  + ]:   60845700 :     else if (jl_is_globalref(v)) {
     133         [ +  + ]:    4771670 :         if (jl_globalref_mod(v) == s->method->module) {
     134                 :    2684260 :             write_uint8(s->s, TAG_NEARBYGLOBAL);
     135                 :    2684260 :             jl_encode_value(s, jl_globalref_name(v));
     136                 :            :         }
     137                 :            :         else {
     138                 :    2087410 :             write_uint8(s->s, TAG_GLOBALREF);
     139                 :    2087410 :             jl_encode_value(s, jl_globalref_mod(v));
     140                 :    2087410 :             jl_encode_value(s, jl_globalref_name(v));
     141                 :            :         }
     142                 :            :     }
     143   [ +  +  +  +  :   56074000 :     else if (jl_is_ssavalue(v) && ((jl_ssavalue_t*)v)->id < 256 && ((jl_ssavalue_t*)v)->id >= 0) {
                   +  - ]
     144                 :    5561420 :         write_uint8(s->s, TAG_SSAVALUE);
     145                 :    5561420 :         write_uint8(s->s, ((jl_ssavalue_t*)v)->id);
     146                 :            :     }
     147   [ +  +  +  -  :   50512600 :     else if (jl_is_ssavalue(v) && ((jl_ssavalue_t*)v)->id <= UINT16_MAX && ((jl_ssavalue_t*)v)->id >= 0) {
                   +  - ]
     148                 :    1647740 :         write_uint8(s->s, TAG_LONG_SSAVALUE);
     149                 :    1647740 :         write_uint16(s->s, ((jl_ssavalue_t*)v)->id);
     150                 :            :     }
     151   [ +  +  +  -  :   48864800 :     else if (jl_typeis(v, jl_slotnumber_type) && jl_slot_number(v) <= UINT16_MAX && jl_slot_number(v) >= 0) {
                   +  - ]
     152                 :     539577 :         write_uint8(s->s, TAG_SLOTNUMBER);
     153                 :     539577 :         write_uint16(s->s, jl_slot_number(v));
     154                 :            :     }
     155         [ +  + ]:   48325300 :     else if (jl_is_expr(v)) {
     156                 :    4819310 :         jl_expr_t *e = (jl_expr_t*)v;
     157                 :    4819310 :         size_t l = jl_array_len(e->args);
     158         [ +  + ]:    4819310 :         if (e->head == jl_call_sym) {
     159         [ +  + ]:    3998720 :             if (l == 2) {
     160                 :     596178 :                 write_uint8(s->s, TAG_CALL1);
     161                 :     596178 :                 jl_encode_value(s, jl_exprarg(e, 0));
     162                 :     596178 :                 jl_encode_value(s, jl_exprarg(e, 1));
     163                 :     596178 :                 return;
     164                 :            :             }
     165         [ +  + ]:    3402540 :             else if (l == 3) {
     166                 :    2901140 :                 write_uint8(s->s, TAG_CALL2);
     167                 :    2901140 :                 jl_encode_value(s, jl_exprarg(e, 0));
     168                 :    2901140 :                 jl_encode_value(s, jl_exprarg(e, 1));
     169                 :    2901140 :                 jl_encode_value(s, jl_exprarg(e, 2));
     170                 :    2901140 :                 return;
     171                 :            :             }
     172                 :            :         }
     173         [ +  - ]:    1321990 :         if (l <= 255) {
     174                 :    1321990 :             write_uint8(s->s, TAG_EXPR);
     175                 :    1321990 :             write_uint8(s->s, (uint8_t)l);
     176                 :            :         }
     177                 :            :         else {
     178                 :          0 :             write_uint8(s->s, TAG_LONG_EXPR);
     179                 :          0 :             write_int32(s->s, l);
     180                 :            :         }
     181                 :    1321990 :         jl_encode_value(s, e->head);
     182         [ +  + ]:    6759990 :         for (i = 0; i < l; i++) {
     183                 :    5438010 :             jl_encode_value(s, jl_exprarg(e, i));
     184                 :            :         }
     185                 :            :     }
     186         [ +  + ]:   43505900 :     else if (jl_is_phinode(v)) {
     187                 :     746371 :         jl_array_t *edges = (jl_array_t*)jl_fieldref_noalloc(v, 0);
     188                 :     746371 :         jl_array_t *values = (jl_array_t*)jl_fieldref_noalloc(v, 1);
     189                 :     746371 :         size_t l = jl_array_len(edges);
     190   [ +  -  +  - ]:     746371 :         if (l <= 255 && jl_array_len(values) == l) {
     191                 :     746371 :             write_uint8(s->s, TAG_PHINODE);
     192                 :     746371 :             write_uint8(s->s, (uint8_t)l);
     193                 :            :         }
     194                 :            :         else {
     195                 :          0 :             write_uint8(s->s, TAG_LONG_PHINODE);
     196                 :          0 :             write_int32(s->s, l);
     197                 :          0 :             write_int32(s->s, jl_array_len(values));
     198                 :            :         }
     199         [ +  + ]:    2137350 :         for (i = 0; i < l; i++) {
     200                 :    1390980 :             int32_t e = ((int32_t*)jl_array_data(edges))[i];
     201         [ +  + ]:    1390980 :             if (e <= 20)
     202                 :     187023 :                 jl_encode_value(s, jl_box_int32(e));
     203                 :            :             else
     204                 :    1203950 :                 jl_encode_int32(s, e);
     205                 :            :         }
     206                 :     746371 :         l = jl_array_len(values);
     207         [ +  + ]:    2137350 :         for (i = 0; i < l; i++) {
     208                 :    1390980 :             jl_encode_value(s, jl_array_ptr_ref(values, i));
     209                 :            :         }
     210                 :            :     }
     211         [ +  + ]:   42759600 :     else if (jl_is_phicnode(v)) {
     212                 :      23002 :         jl_array_t *values = (jl_array_t*)jl_fieldref_noalloc(v, 0);
     213                 :      23002 :         size_t l = jl_array_len(values);
     214         [ +  - ]:      23002 :         if (l <= 255) {
     215                 :      23002 :             write_uint8(s->s, TAG_PHICNODE);
     216                 :      23002 :             write_uint8(s->s, (uint8_t)l);
     217                 :            :         }
     218                 :            :         else {
     219                 :          0 :             write_uint8(s->s, TAG_LONG_PHICNODE);
     220                 :          0 :             write_int32(s->s, l);
     221                 :            :         }
     222         [ +  + ]:      52638 :         for (i = 0; i < l; i++) {
     223                 :      29636 :             jl_encode_value(s, jl_array_ptr_ref(values, i));
     224                 :            :         }
     225                 :            :     }
     226         [ +  + ]:   42736600 :     else if (jl_is_gotonode(v)) {
     227                 :    1216430 :         write_uint8(s->s, TAG_GOTONODE);
     228                 :    1216430 :         jl_encode_value(s, jl_get_nth_field(v, 0));
     229                 :            :     }
     230         [ +  + ]:   41520100 :     else if (jl_is_gotoifnot(v)) {
     231                 :     906759 :         write_uint8(s->s, TAG_GOTOIFNOT);
     232                 :     906759 :         jl_encode_value(s, jl_get_nth_field(v, 0));
     233                 :     906759 :         jl_encode_value(s, jl_get_nth_field(v, 1));
     234                 :            :     }
     235         [ +  + ]:   40613400 :     else if (jl_is_argument(v)) {
     236                 :     924318 :         write_uint8(s->s, TAG_ARGUMENT);
     237                 :     924318 :         jl_encode_value(s, jl_get_nth_field(v, 0));
     238                 :            :     }
     239         [ +  + ]:   39689100 :     else if (jl_is_returnnode(v)) {
     240                 :     463744 :         write_uint8(s->s, TAG_RETURNNODE);
     241                 :     463744 :         jl_encode_value(s, jl_get_nth_field(v, 0));
     242                 :            :     }
     243         [ +  + ]:   39225300 :     else if (jl_typeis(v, jl_int64_type)) {
     244                 :    2181000 :         void *data = jl_data_ptr(v);
     245   [ +  +  +  + ]:    2181000 :         if (*(int64_t*)data >= INT16_MIN && *(int64_t*)data <= INT16_MAX) {
     246                 :    2163880 :             write_uint8(s->s, TAG_SHORTER_INT64);
     247                 :    2163880 :             write_uint16(s->s, (uint16_t)*(int64_t*)data);
     248                 :            :         }
     249   [ +  +  +  + ]:      17112 :         else if (*(int64_t*)data >= S32_MIN && *(int64_t*)data <= S32_MAX) {
     250                 :       3753 :             write_uint8(s->s, TAG_SHORT_INT64);
     251                 :       3753 :             write_int32(s->s, (int32_t)*(int64_t*)data);
     252                 :            :         }
     253                 :            :         else {
     254                 :      13359 :             write_uint8(s->s, TAG_INT64);
     255                 :      13359 :             write_int64(s->s, *(int64_t*)data);
     256                 :            :         }
     257                 :            :     }
     258         [ +  + ]:   37044300 :     else if (jl_typeis(v, jl_int32_type)) {
     259                 :   17481500 :         jl_encode_int32(s, *(int32_t*)jl_data_ptr(v));
     260                 :            :     }
     261         [ +  + ]:   19562800 :     else if (jl_typeis(v, jl_uint8_type)) {
     262                 :      80602 :         write_uint8(s->s, TAG_UINT8);
     263                 :      80602 :         write_int8(s->s, *(int8_t*)jl_data_ptr(v));
     264                 :            :     }
     265         [ +  + ]:   19482200 :     else if (jl_typeis(v, jl_lineinfonode_type)) {
     266                 :   10831700 :         write_uint8(s->s, TAG_LINEINFO);
     267         [ +  + ]:   64990200 :         for (i = 0; i < jl_datatype_nfields(jl_lineinfonode_type); i++)
     268                 :   54158500 :             jl_encode_value(s, jl_get_nth_field(v, i));
     269                 :            :     }
     270         [ +  + ]:    8650530 :     else if (((jl_datatype_t*)jl_typeof(v))->instance == v) {
     271                 :      86809 :         write_uint8(s->s, TAG_SINGLETON);
     272                 :      86809 :         jl_encode_value(s, jl_typeof(v));
     273                 :            :     }
     274   [ +  +  +  + ]:    8563720 :     else if (as_literal && jl_typeis(v, jl_string_type)) {
     275                 :        190 :         write_uint8(s->s, TAG_STRING);
     276                 :        190 :         write_int32(s->s, jl_string_len(v));
     277                 :        190 :         ios_write(s->s, jl_string_data(v), jl_string_len(v));
     278                 :            :     }
     279   [ +  +  +  - ]:    9508440 :     else if (as_literal && jl_is_array(v)) {
     280                 :     944911 :         jl_array_t *ar = (jl_array_t*)v;
     281                 :     944911 :         jl_value_t *et = jl_tparam0(jl_typeof(ar));
     282                 :     944911 :         int isunion = jl_is_uniontype(et);
     283   [ +  -  +  - ]:     944911 :         if (ar->flags.ndims == 1 && ar->elsize <= 0x1f) {
     284                 :     944911 :             write_uint8(s->s, TAG_ARRAY1D);
     285                 :     944911 :             write_uint8(s->s, (ar->flags.ptrarray << 7) | (ar->flags.hasptr << 6) | (isunion << 5) | (ar->elsize & 0x1f));
     286                 :            :         }
     287                 :            :         else {
     288                 :          0 :             write_uint8(s->s, TAG_ARRAY);
     289                 :          0 :             write_uint16(s->s, ar->flags.ndims);
     290                 :          0 :             write_uint16(s->s, (ar->flags.ptrarray << 15) | (ar->flags.hasptr << 14) | (isunion << 13) | (ar->elsize & 0x1fff));
     291                 :            :         }
     292         [ +  + ]:    1889820 :         for (i = 0; i < ar->flags.ndims; i++)
     293                 :     944911 :             jl_encode_value(s, jl_box_long(jl_array_dim(ar,i)));
     294                 :     944911 :         jl_encode_value(s, jl_typeof(ar));
     295                 :     944911 :         size_t l = jl_array_len(ar);
     296         [ +  + ]:     944911 :         if (ar->flags.ptrarray) {
     297         [ +  + ]:   28085100 :             for (i = 0; i < l; i++) {
     298                 :   27390400 :                 jl_value_t *e = jl_array_ptr_ref(v, i);
     299                 :   27390400 :                 jl_encode_value(s, e);
     300                 :            :             }
     301                 :            :         }
     302         [ -  + ]:     250271 :         else if (ar->flags.hasptr) {
     303                 :          0 :             const char *data = (const char*)jl_array_data(ar);
     304                 :          0 :             uint16_t elsz = ar->elsize;
     305                 :          0 :             size_t j, np = ((jl_datatype_t*)et)->layout->npointers;
     306         [ #  # ]:          0 :             for (i = 0; i < l; i++) {
     307                 :          0 :                 const char *start = data;
     308         [ #  # ]:          0 :                 for (j = 0; j < np; j++) {
     309                 :          0 :                     uint32_t ptr = jl_ptr_offset((jl_datatype_t*)et, j);
     310                 :          0 :                     const jl_value_t *const *fld = &((const jl_value_t *const *)data)[ptr];
     311         [ #  # ]:          0 :                     if ((const char*)fld != start)
     312                 :          0 :                         ios_write(s->s, start, (const char*)fld - start);
     313                 :            :                     JL_GC_PROMISE_ROOTED(*fld);
     314                 :          0 :                     jl_encode_value(s, *fld);
     315                 :          0 :                     start = (const char*)&fld[1];
     316                 :            :                 }
     317                 :          0 :                 data += elsz;
     318         [ #  # ]:          0 :                 if (data != start)
     319                 :          0 :                     ios_write(s->s, start, data - start);
     320                 :            :             }
     321                 :            :         }
     322                 :            :         else {
     323                 :     250271 :             ios_write(s->s, (char*)jl_array_data(ar), l * ar->elsize);
     324   [ +  -  -  + ]:     250271 :             if (jl_array_isbitsunion(ar))
     325                 :          0 :                 ios_write(s->s, jl_array_typetagdata(ar), l);
     326                 :            :         }
     327                 :            :     }
     328                 :            :     else {
     329   [ +  -  +  +  :    7618620 :         if (!as_literal && !(jl_is_uniontype(v) || jl_is_newvarnode(v) || jl_is_tuple(v) ||
             +  +  +  + ]
     330   [ +  -  +  +  :    7463040 :                              jl_is_linenode(v) || jl_is_upsilonnode(v) || jl_is_pinode(v) ||
                   +  + ]
     331   [ +  -  +  -  :    7295860 :                              jl_is_slot(v) || jl_is_ssavalue(v))) {
                   +  - ]
     332                 :    7295860 :             literal_val_id(&rr, s, v);
     333                 :    7295860 :             int id = rr.index;
     334         [ -  + ]:    7295860 :             assert(id >= 0);
     335         [ +  + ]:    7295860 :             if (rr.key) {
     336                 :       3582 :                 write_uint8(s->s, TAG_RELOC_METHODROOT);
     337                 :       3582 :                 write_int64(s->s, rr.key);
     338                 :            :             }
     339         [ +  + ]:    7295860 :             if (id < 256) {
     340                 :    7124850 :                 write_uint8(s->s, TAG_METHODROOT);
     341                 :    7124850 :                 write_uint8(s->s, id);
     342                 :            :             }
     343                 :            :             else {
     344         [ -  + ]:     171014 :                 assert(id <= UINT16_MAX);
     345                 :     171014 :                 write_uint8(s->s, TAG_LONG_METHODROOT);
     346                 :     171014 :                 write_uint16(s->s, id);
     347                 :            :             }
     348                 :    7295860 :             return;
     349                 :            :         }
     350                 :     322754 :         jl_datatype_t *t = (jl_datatype_t*)jl_typeof(v);
     351         [ +  - ]:     322754 :         if (t->size <= 255) {
     352                 :     322754 :             write_uint8(s->s, TAG_SHORT_GENERAL);
     353                 :     322754 :             write_uint8(s->s, t->size);
     354                 :            :         }
     355                 :            :         else {
     356                 :          0 :             write_uint8(s->s, TAG_GENERAL);
     357                 :          0 :             write_int32(s->s, t->size);
     358                 :            :         }
     359                 :     322754 :         jl_encode_value(s, t);
     360                 :            : 
     361                 :     322754 :         char *data = (char*)jl_data_ptr(v);
     362                 :     322754 :         size_t i, j, np = t->layout->npointers;
     363                 :     322754 :         uint32_t nf = t->layout->nfields;
     364                 :     322754 :         char *last = data;
     365         [ +  - ]:     904081 :         for (i = 0, j = 0; i < nf+1; i++) {
     366         [ +  + ]:     904081 :             char *ptr = data + (i < nf ? jl_field_offset(t, i) : jl_datatype_size(t));
     367         [ +  + ]:     904081 :             if (j < np) {
     368                 :     819259 :                 char *prevptr = (char*)&((jl_value_t**)data)[jl_ptr_offset(t, j)];
     369         [ +  + ]:    1073750 :                 while (ptr > prevptr) {
     370                 :            :                     // previous field contained pointers; write them and their interleaved data
     371         [ +  + ]:     536879 :                     if (prevptr > last)
     372                 :         18 :                         ios_write(s->s, last, prevptr - last);
     373                 :     536879 :                     jl_value_t *e = *(jl_value_t**)prevptr;
     374                 :            :                     JL_GC_PROMISE_ROOTED(e);
     375                 :     536879 :                     jl_encode_value(s, e);
     376                 :     536879 :                     last = prevptr + sizeof(jl_value_t*);
     377                 :     536879 :                     j++;
     378         [ +  + ]:     536879 :                     if (j < np)
     379                 :     254491 :                         prevptr = (char*)&((jl_value_t**)data)[jl_ptr_offset(t, j)];
     380                 :            :                     else
     381                 :     282388 :                         break;
     382                 :            :                 }
     383                 :            :             }
     384         [ +  + ]:     904081 :             if (i == nf)
     385                 :     322754 :                 break;
     386                 :            :         }
     387                 :     322754 :         char *ptr = data + jl_datatype_size(t);
     388         [ +  + ]:     322754 :         if (ptr > last)
     389                 :      40480 :             ios_write(s->s, last, ptr - last);
     390                 :            :     }
     391                 :            : }
     392                 :            : 
     393                 :     250271 : static jl_code_info_flags_t code_info_flags(uint8_t pure, uint8_t propagate_inbounds, uint8_t inlineable, uint8_t inferred, uint8_t constprop)
     394                 :            : {
     395                 :            :     jl_code_info_flags_t flags;
     396                 :     250271 :     flags.bits.pure = pure;
     397                 :     250271 :     flags.bits.propagate_inbounds = propagate_inbounds;
     398                 :     250271 :     flags.bits.inlineable = inlineable;
     399                 :     250271 :     flags.bits.inferred = inferred;
     400                 :     250271 :     flags.bits.constprop = constprop;
     401                 :     250271 :     return flags;
     402                 :            : }
     403                 :            : 
     404                 :            : // --- decoding ---
     405                 :            : 
     406                 :            : static jl_value_t *jl_decode_value(jl_ircode_state *s) JL_GC_DISABLED;
     407                 :            : 
     408                 :     292894 : static jl_value_t *jl_decode_value_svec(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     409                 :            : {
     410                 :            :     size_t i, len;
     411         [ +  - ]:     292894 :     if (tag == TAG_SVEC)
     412                 :     292894 :         len = read_uint8(s->s);
     413                 :            :     else
     414                 :          0 :         len = read_int32(s->s);
     415                 :     292894 :     jl_svec_t *sv = jl_alloc_svec_uninit(len);
     416                 :     292894 :     jl_value_t **data = jl_svec_data(sv);
     417         [ +  + ]:     783497 :     for (i = 0; i < len; i++) {
     418                 :     490603 :         data[i] = jl_decode_value(s);
     419                 :            :     }
     420                 :     292894 :     return (jl_value_t*)sv;
     421                 :            : }
     422                 :            : 
     423                 :    4458170 : static jl_value_t *jl_decode_value_array(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     424                 :            : {
     425                 :            :     int16_t i, ndims;
     426                 :            :     int isptr, isunion, hasptr, elsize;
     427         [ +  - ]:    4458170 :     if (tag == TAG_ARRAY1D) {
     428                 :    4458170 :         ndims = 1;
     429                 :    4458170 :         elsize = read_uint8(s->s);
     430                 :    4458170 :         isptr = (elsize >> 7) & 1;
     431                 :    4458170 :         hasptr = (elsize >> 6) & 1;
     432                 :    4458170 :         isunion = (elsize >> 5) & 1;
     433                 :    4458170 :         elsize = elsize & 0x1f;
     434                 :            :     }
     435                 :            :     else {
     436                 :          0 :         ndims = read_uint16(s->s);
     437                 :          0 :         elsize = read_uint16(s->s);
     438                 :          0 :         isptr = (elsize >> 15) & 1;
     439                 :          0 :         hasptr = (elsize >> 14) & 1;
     440                 :          0 :         isunion = (elsize >> 13) & 1;
     441                 :          0 :         elsize = elsize & 0x1fff;
     442                 :            :     }
     443                 :    4458170 :     size_t *dims = (size_t*)alloca(ndims * sizeof(size_t));
     444         [ +  + ]:    8916330 :     for (i = 0; i < ndims; i++) {
     445                 :    4458170 :         dims[i] = jl_unbox_long(jl_decode_value(s));
     446                 :            :     }
     447                 :    4458170 :     jl_array_t *a = jl_new_array_for_deserialization(
     448                 :            :             (jl_value_t*)NULL, ndims, dims, !isptr, hasptr, isunion, elsize);
     449                 :    4458170 :     jl_value_t *aty = jl_decode_value(s);
     450                 :    4458170 :     jl_set_typeof(a, aty);
     451         [ +  + ]:    4458170 :     if (a->flags.ptrarray) {
     452                 :    3230770 :         jl_value_t **data = (jl_value_t**)jl_array_data(a);
     453                 :    3230770 :         size_t i, numel = jl_array_len(a);
     454         [ +  + ]:   50656600 :         for (i = 0; i < numel; i++) {
     455                 :   47425900 :             data[i] = jl_decode_value(s);
     456                 :            :         }
     457         [ -  + ]:    3230770 :         assert(jl_astaggedvalue(a)->bits.gc == GC_CLEAN); // gc is disabled
     458                 :            :     }
     459         [ -  + ]:    1227390 :     else if (a->flags.hasptr) {
     460                 :          0 :         size_t i, numel = jl_array_len(a);
     461                 :          0 :         char *data = (char*)jl_array_data(a);
     462                 :          0 :         uint16_t elsz = a->elsize;
     463                 :          0 :         jl_datatype_t *et = (jl_datatype_t*)jl_tparam0(jl_typeof(a));
     464                 :          0 :         size_t j, np = et->layout->npointers;
     465         [ #  # ]:          0 :         for (i = 0; i < numel; i++) {
     466                 :          0 :             char *start = data;
     467         [ #  # ]:          0 :             for (j = 0; j < np; j++) {
     468                 :          0 :                 uint32_t ptr = jl_ptr_offset(et, j);
     469                 :          0 :                 jl_value_t **fld = &((jl_value_t**)data)[ptr];
     470         [ #  # ]:          0 :                 if ((char*)fld != start)
     471                 :          0 :                     ios_readall(s->s, start, (const char*)fld - start);
     472                 :          0 :                 *fld = jl_decode_value(s);
     473                 :          0 :                 start = (char*)&fld[1];
     474                 :            :             }
     475                 :          0 :             data += elsz;
     476         [ #  # ]:          0 :             if (data != start)
     477                 :          0 :                 ios_readall(s->s, start, data - start);
     478                 :            :         }
     479         [ #  # ]:          0 :         assert(jl_astaggedvalue(a)->bits.gc == GC_CLEAN); // gc is disabled
     480                 :            :     }
     481                 :            :     else {
     482   [ +  -  -  + ]:    1227390 :         size_t extra = jl_array_isbitsunion(a) ? jl_array_len(a) : 0;
     483                 :    1227390 :         size_t tot = jl_array_len(a) * a->elsize + extra;
     484                 :    1227390 :         ios_readall(s->s, (char*)jl_array_data(a), tot);
     485                 :            :     }
     486                 :    4458170 :     return (jl_value_t*)a;
     487                 :            : }
     488                 :            : 
     489                 :   10376400 : static jl_value_t *jl_decode_value_expr(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     490                 :            : {
     491                 :            :     size_t i, len;
     492                 :   10376400 :     jl_sym_t *head = NULL;
     493         [ +  + ]:   10376400 :     if (tag == TAG_EXPR) {
     494                 :    3039070 :         len = read_uint8(s->s);
     495                 :            :     }
     496         [ +  + ]:    7337340 :     else if (tag == TAG_CALL1) {
     497                 :    1348000 :         len = 2;
     498                 :    1348000 :         head = jl_call_sym;
     499                 :            :     }
     500         [ +  - ]:    5989340 :     else if (tag == TAG_CALL2) {
     501                 :    5989340 :         len = 3;
     502                 :    5989340 :         head = jl_call_sym;
     503                 :            :     }
     504                 :            :     else {
     505                 :          0 :         len = read_int32(s->s);
     506                 :            :     }
     507         [ +  + ]:   10376400 :     if (head == NULL)
     508                 :    3039070 :         head = (jl_sym_t*)jl_decode_value(s);
     509                 :   10376400 :     jl_expr_t *e = jl_exprn(head, len);
     510                 :   10376400 :     jl_value_t **data = (jl_value_t**)(e->args->data);
     511         [ +  + ]:   41985300 :     for (i = 0; i < len; i++) {
     512                 :   31608900 :         data[i] = jl_decode_value(s);
     513                 :            :     }
     514                 :   10376400 :     return (jl_value_t*)e;
     515                 :            : }
     516                 :            : 
     517                 :     992872 : static jl_value_t *jl_decode_value_phi(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     518                 :            : {
     519                 :            :     size_t i, len_e, len_v;
     520         [ +  - ]:     992872 :     if (tag == TAG_PHINODE) {
     521                 :     992872 :         len_e = len_v = read_uint8(s->s);
     522                 :            :     }
     523                 :            :     else {
     524                 :          0 :         len_e = read_int32(s->s);
     525                 :          0 :         len_v = read_int32(s->s);
     526                 :            :     }
     527                 :     992872 :     jl_array_t *e = jl_alloc_array_1d(jl_array_int32_type, len_e);
     528                 :     992872 :     jl_array_t *v = jl_alloc_vec_any(len_v);
     529                 :     992872 :     jl_value_t *phi = jl_new_struct(jl_phinode_type, e, v);
     530                 :     992872 :     int32_t *data_e = (int32_t*)(e->data);
     531         [ +  + ]:    2861410 :     for (i = 0; i < len_e; i++) {
     532                 :    1868540 :         data_e[i] = jl_unbox_int32(jl_decode_value(s));
     533                 :            :     }
     534                 :     992872 :     jl_value_t **data_v = (jl_value_t**)(v->data);
     535         [ +  + ]:    2861410 :     for (i = 0; i < len_v; i++) {
     536                 :    1868540 :         data_v[i] = jl_decode_value(s);
     537                 :            :     }
     538                 :     992872 :     return phi;
     539                 :            : }
     540                 :            : 
     541                 :      20647 : static jl_value_t *jl_decode_value_phic(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     542                 :            : {
     543                 :            :     size_t i, len;
     544         [ +  - ]:      20647 :     if (tag == TAG_PHICNODE)
     545                 :      20647 :         len = read_uint8(s->s);
     546                 :            :     else
     547                 :          0 :         len = read_int32(s->s);
     548                 :      20647 :     jl_array_t *v = jl_alloc_vec_any(len);
     549                 :      20647 :     jl_value_t *phic = jl_new_struct(jl_phicnode_type, v);
     550                 :      20647 :     jl_value_t **data = (jl_value_t**)(v->data);
     551         [ +  + ]:      47304 :     for (i = 0; i < len; i++) {
     552                 :      26657 :         data[i] = jl_decode_value(s);
     553                 :            :     }
     554                 :      20647 :     return phic;
     555                 :            : }
     556                 :            : 
     557                 :    3328240 : static jl_value_t *jl_decode_value_globalref(jl_ircode_state *s) JL_GC_DISABLED
     558                 :            : {
     559                 :    3328240 :     jl_value_t *mod = jl_decode_value(s);
     560                 :    3328240 :     jl_value_t *var = jl_decode_value(s);
     561                 :    3328240 :     return jl_module_globalref((jl_module_t*)mod, (jl_sym_t*)var);
     562                 :            : }
     563                 :            : 
     564                 :     624244 : static jl_value_t *jl_decode_value_any(jl_ircode_state *s, uint8_t tag) JL_GC_DISABLED
     565                 :            : {
     566         [ +  - ]:     624244 :     int32_t sz = (tag == TAG_SHORT_GENERAL ? read_uint8(s->s) : read_int32(s->s));
     567                 :     624244 :     jl_value_t *v = jl_gc_alloc(s->ptls, sz, NULL);
     568                 :     624244 :     jl_set_typeof(v, (void*)(intptr_t)0x50);
     569                 :     624244 :     jl_datatype_t *dt = (jl_datatype_t*)jl_decode_value(s);
     570                 :     624244 :     jl_set_typeof(v, dt);
     571                 :     624244 :     char *data = (char*)jl_data_ptr(v);
     572                 :     624244 :     size_t i, np = dt->layout->npointers;
     573                 :     624244 :     char *start = data;
     574         [ +  + ]:    1429750 :     for (i = 0; i < np; i++) {
     575                 :     805510 :         uint32_t ptr = jl_ptr_offset(dt, i);
     576                 :     805510 :         jl_value_t **fld = &((jl_value_t**)data)[ptr];
     577         [ +  + ]:     805510 :         if ((char*)fld != start)
     578                 :         16 :             ios_readall(s->s, start, (const char*)fld - start);
     579                 :     805510 :         *fld = jl_decode_value(s);
     580                 :     805510 :         start = (char*)&fld[1];
     581                 :            :     }
     582                 :     624244 :     data += jl_datatype_size(dt);
     583         [ +  + ]:     624244 :     if (data != start)
     584                 :     214613 :         ios_readall(s->s, start, data - start);
     585                 :     624244 :     return v;
     586                 :            : }
     587                 :            : 
     588                 :  214852000 : static jl_value_t *jl_decode_value(jl_ircode_state *s) JL_GC_DISABLED
     589                 :            : {
     590         [ -  + ]:  214852000 :     assert(!ios_eof(s->s));
     591                 :            :     jl_value_t *v;
     592                 :            :     size_t i, n;
     593                 :            :     uint64_t key;
     594                 :  214852000 :     uint8_t tag = read_uint8(s->s);
     595         [ +  + ]:  214852000 :     if (tag > LAST_TAG)
     596                 :   71113200 :         return jl_deser_tag(tag);
     597   [ +  +  +  +  :  143739000 :     switch (tag) {
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
                      + ]
     598                 :     222891 :     case TAG_NULL: return NULL;
     599                 :    3954950 :     case 0:
     600                 :    3954950 :         tag = read_uint8(s->s);
     601                 :    3954950 :         return jl_deser_tag(tag);
     602                 :       1892 :     case TAG_RELOC_METHODROOT:
     603                 :       1892 :         key = read_uint64(s->s);
     604                 :       1892 :         tag = read_uint8(s->s);
     605   [ -  +  -  - ]:       1892 :         assert(tag == TAG_METHODROOT || tag == TAG_LONG_METHODROOT);
     606         [ +  - ]:       1892 :         return lookup_root(s->method, key, tag == TAG_METHODROOT ? read_uint8(s->s) : read_uint16(s->s));
     607                 :   11488400 :     case TAG_METHODROOT:
     608                 :   11488400 :         return lookup_root(s->method, 0, read_uint8(s->s));
     609                 :     169080 :     case TAG_LONG_METHODROOT:
     610                 :     169080 :         return lookup_root(s->method, 0, read_uint16(s->s));
     611                 :     292894 :     case TAG_SVEC: JL_FALLTHROUGH; case TAG_LONG_SVEC:
     612                 :     292894 :         return jl_decode_value_svec(s, tag);
     613                 :    7441660 :     case TAG_COMMONSYM:
     614                 :    7441660 :         return jl_deser_symbol(read_uint8(s->s));
     615                 :   10663300 :     case TAG_SSAVALUE:
     616                 :   10663300 :         v = jl_box_ssavalue(read_uint8(s->s));
     617                 :   10663300 :         return v;
     618                 :    2165740 :     case TAG_LONG_SSAVALUE:
     619                 :    2165740 :         v = jl_box_ssavalue(read_uint16(s->s));
     620                 :    2165740 :         return v;
     621                 :    3481990 :     case TAG_SLOTNUMBER:
     622                 :    3481990 :         v = jl_box_slotnumber(read_uint16(s->s));
     623                 :    3481990 :         return v;
     624                 :    4458170 :     case TAG_ARRAY: JL_FALLTHROUGH; case TAG_ARRAY1D:
     625                 :    4458170 :         return jl_decode_value_array(s, tag);
     626                 :   10376400 :     case TAG_EXPR:      JL_FALLTHROUGH;
     627                 :            :     case TAG_LONG_EXPR: JL_FALLTHROUGH;
     628                 :            :     case TAG_CALL1:     JL_FALLTHROUGH;
     629                 :            :     case TAG_CALL2:
     630                 :   10376400 :         return jl_decode_value_expr(s, tag);
     631                 :     992872 :     case TAG_PHINODE: JL_FALLTHROUGH; case TAG_LONG_PHINODE:
     632                 :     992872 :         return jl_decode_value_phi(s, tag);
     633                 :      20647 :     case TAG_PHICNODE: JL_FALLTHROUGH; case TAG_LONG_PHICNODE:
     634                 :      20647 :         return jl_decode_value_phic(s, tag);
     635                 :    1932380 :     case TAG_GOTONODE: JL_FALLTHROUGH; case TAG_QUOTENODE:
     636         [ +  - ]:    1932380 :         v = jl_new_struct_uninit(tag == TAG_GOTONODE ? jl_gotonode_type : jl_quotenode_type);
     637         [ +  - ]:    1932380 :         set_nth_field(tag == TAG_GOTONODE ? jl_gotonode_type : jl_quotenode_type, v, 0, jl_decode_value(s), 0);
     638                 :    1932380 :         return v;
     639                 :    1667180 :     case TAG_GOTOIFNOT:
     640                 :    1667180 :         v = jl_new_struct_uninit(jl_gotoifnot_type);
     641                 :    1667180 :         set_nth_field(jl_gotoifnot_type, v, 0, jl_decode_value(s), 0);
     642                 :    1667180 :         set_nth_field(jl_gotoifnot_type, v, 1, jl_decode_value(s), 0);
     643                 :    1667180 :         return v;
     644                 :    2259560 :     case TAG_ARGUMENT:
     645                 :    2259560 :         v = jl_new_struct_uninit(jl_argument_type);
     646                 :    2259560 :         set_nth_field(jl_argument_type, v, 0, jl_decode_value(s), 0);
     647                 :    2259560 :         return v;
     648                 :    1678610 :     case TAG_RETURNNODE:
     649                 :    1678610 :         v = jl_new_struct_uninit(jl_returnnode_type);
     650                 :    1678610 :         set_nth_field(jl_returnnode_type, v, 0, jl_decode_value(s), 0);
     651                 :    1678610 :         return v;
     652                 :    3502330 :     case TAG_SHORTER_INT64:
     653                 :    3502330 :         v = jl_box_int64((int16_t)read_uint16(s->s));
     654                 :    3502330 :         return v;
     655                 :       5688 :     case TAG_SHORT_INT64:
     656                 :       5688 :         v = jl_box_int64(read_int32(s->s));
     657                 :       5688 :         return v;
     658                 :      20697 :     case TAG_INT64:
     659                 :      20697 :         v = jl_box_int64((int64_t)read_uint64(s->s));
     660                 :      20697 :         return v;
     661                 :   27186200 :     case TAG_SHORT_INT32:
     662                 :   27186200 :         v = jl_box_int32((int16_t)read_uint16(s->s));
     663                 :   27186200 :         return v;
     664                 :        176 :     case TAG_INT32:
     665                 :        176 :         v = jl_box_int32(read_int32(s->s));
     666                 :        176 :         return v;
     667                 :     141403 :     case TAG_UINT8:
     668                 :     141403 :         return jl_box_uint8(read_uint8(s->s));
     669                 :    6597150 :     case TAG_NEARBYGLOBAL:
     670         [ -  + ]:    6597150 :         assert(s->method != NULL);
     671                 :    6597150 :         v = jl_decode_value(s);
     672                 :    6597150 :         return jl_module_globalref(s->method->module, (jl_sym_t*)v);
     673                 :    3864630 :     case TAG_NEARBYMODULE:
     674         [ -  + ]:    3864630 :         assert(s->method != NULL);
     675                 :    3864630 :         return (jl_value_t*)s->method->module;
     676                 :    3328240 :     case TAG_GLOBALREF:
     677                 :    3328240 :         return jl_decode_value_globalref(s);
     678                 :     101989 :     case TAG_SINGLETON:
     679                 :     101989 :         return ((jl_datatype_t*)jl_decode_value(s))->instance;
     680                 :    3198080 :     case TAG_CORE:
     681                 :    3198080 :         return (jl_value_t*)jl_core_module;
     682                 :   13194300 :     case TAG_BASE:
     683                 :   13194300 :         return (jl_value_t*)jl_base_module;
     684                 :    1046380 :     case TAG_VECTORTY:
     685                 :    1046380 :         v = jl_decode_value(s);
     686                 :    1046380 :         return jl_apply_type2((jl_value_t*)jl_array_type, v, jl_box_long(1));
     687                 :     271107 :     case TAG_PTRTY:
     688                 :     271107 :         v = jl_decode_value(s);
     689                 :     271107 :         return jl_apply_type1((jl_value_t*)jl_pointer_type, v);
     690                 :        485 :     case TAG_STRING:
     691                 :        485 :         n = read_int32(s->s);
     692                 :        485 :         v = jl_alloc_string(n);
     693                 :        485 :         ios_readall(s->s, jl_string_data(v), n);
     694                 :        485 :         return v;
     695                 :   17387100 :     case TAG_LINEINFO:
     696                 :   17387100 :         v = jl_new_struct_uninit(jl_lineinfonode_type);
     697         [ +  + ]:  104322000 :         for (i = 0; i < jl_datatype_nfields(jl_lineinfonode_type); i++) {
     698                 :            :             //size_t offs = jl_field_offset(jl_lineinfonode_type, i);
     699                 :   86935400 :             set_nth_field(jl_lineinfonode_type, v, i, jl_decode_value(s), 0);
     700                 :            :         }
     701                 :   17387100 :         return v;
     702                 :     624244 :     default:
     703   [ +  -  -  + ]:     624244 :         assert(tag == TAG_GENERAL || tag == TAG_SHORT_GENERAL);
     704                 :     624244 :         return jl_decode_value_any(s, tag);
     705                 :            :     }
     706                 :            : }
     707                 :            : 
     708                 :            : // --- entry points ---
     709                 :            : 
     710                 :     250271 : JL_DLLEXPORT jl_array_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
     711                 :            : {
     712                 :            :     JL_TIMING(AST_COMPRESS);
     713                 :     250271 :     JL_LOCK(&m->writelock); // protect the roots array (Might GC)
     714         [ -  + ]:     250271 :     assert(jl_is_method(m));
     715         [ -  + ]:     250271 :     assert(jl_is_code_info(code));
     716                 :            :     ios_t dest;
     717                 :     250271 :     ios_mem(&dest, 0);
     718                 :     250271 :     int en = jl_gc_enable(0); // Might GC
     719                 :            :     size_t i;
     720                 :            : 
     721         [ +  + ]:     250271 :     if (m->roots == NULL) {
     722                 :      69548 :         m->roots = jl_alloc_vec_any(0);
     723                 :      69548 :         jl_gc_wb(m, m->roots);
     724                 :            :     }
     725                 :     250271 :     jl_ircode_state s = {
     726                 :            :         &dest,
     727                 :            :         m,
     728                 :     250271 :         jl_current_task->ptls,
     729                 :            :         1
     730                 :            :     };
     731                 :            : 
     732                 :     250271 :     jl_code_info_flags_t flags = code_info_flags(code->pure, code->propagate_inbounds, code->inlineable, code->inferred, code->constprop);
     733                 :     250271 :     write_uint8(s.s, flags.packed);
     734                 :     250271 :     write_uint8(s.s, code->purity.bits);
     735                 :            : 
     736                 :     250271 :     size_t nslots = jl_array_len(code->slotflags);
     737   [ +  -  +  - ]:     250271 :     assert(nslots >= m->nargs && nslots < INT32_MAX); // required by generated functions
     738                 :     250271 :     write_int32(s.s, nslots);
     739                 :     250271 :     ios_write(s.s, (char*)jl_array_data(code->slotflags), nslots);
     740                 :            : 
     741                 :            :     // N.B.: The layout of everything before this point is explicitly referenced
     742                 :            :     // by the various jl_ir_ accessors. Make sure to adjust those if you change
     743                 :            :     // the data layout.
     744                 :            : 
     745         [ +  + ]:    1751900 :     for (i = 0; i < 6; i++) {
     746                 :    1501630 :         int copy = 1;
     747         [ +  + ]:    1501630 :         if (i == 1) { // skip codelocs
     748         [ -  + ]:     250271 :             assert(jl_field_offset(jl_code_info_type, i) == offsetof(jl_code_info_t, codelocs));
     749                 :     250271 :             continue;
     750                 :            :         }
     751         [ +  + ]:    1251360 :         if (i == 4) { // don't copy contents of method_for_inference_limit_heuristics field
     752         [ -  + ]:     250271 :             assert(jl_field_offset(jl_code_info_type, i) == offsetof(jl_code_info_t, method_for_inference_limit_heuristics));
     753                 :     250271 :             copy = 0;
     754                 :            :         }
     755                 :    1251360 :         jl_encode_value_(&s, jl_get_nth_field((jl_value_t*)code, i), copy);
     756                 :            :     }
     757                 :            : 
     758                 :            :     // For opaque closure, also save the slottypes. We technically only need the first slot type,
     759                 :            :     // but this is simpler for now. We may want to refactor where this gets stored in the future.
     760         [ -  + ]:     250271 :     if (m->is_for_opaque_closure)
     761                 :          0 :         jl_encode_value_(&s, code->slottypes, 1);
     762                 :            : 
     763         [ +  + ]:     250271 :     if (m->generator)
     764                 :            :         // can't optimize generated functions
     765                 :        190 :         jl_encode_value_(&s, (jl_value_t*)jl_compress_argnames(code->slotnames), 1);
     766                 :            :     else
     767                 :     250081 :         jl_encode_value(&s, jl_nothing);
     768                 :            : 
     769                 :     250271 :     size_t nstmt = jl_array_len(code->code);
     770         [ -  + ]:     250271 :     assert(nstmt == jl_array_len(code->codelocs));
     771         [ +  + ]:     250271 :     if (jl_array_len(code->linetable) < 256) {
     772         [ +  + ]:    5208210 :         for (i = 0; i < nstmt; i++) {
     773                 :    4966290 :             write_uint8(s.s, ((int32_t*)jl_array_data(code->codelocs))[i]);
     774                 :            :         }
     775                 :            :     }
     776         [ +  - ]:       8348 :     else if (jl_array_len(code->linetable) < 65536) {
     777         [ +  + ]:    3770800 :         for (i = 0; i < nstmt; i++) {
     778                 :    3762460 :             write_uint16(s.s, ((int32_t*)jl_array_data(code->codelocs))[i]);
     779                 :            :         }
     780                 :            :     }
     781                 :            :     else {
     782                 :          0 :         ios_write(s.s, (char*)jl_array_data(code->codelocs), nstmt * sizeof(int32_t));
     783                 :            :     }
     784                 :            : 
     785                 :     250271 :     write_uint8(s.s, s.relocatability);
     786                 :            : 
     787                 :     250271 :     ios_flush(s.s);
     788                 :     250271 :     jl_array_t *v = jl_take_buffer(&dest);
     789                 :     250271 :     ios_close(s.s);
     790         [ +  + ]:     250271 :     if (jl_array_len(m->roots) == 0) {
     791                 :      15132 :         m->roots = NULL;
     792                 :            :     }
     793                 :     250271 :     JL_GC_PUSH1(&v);
     794                 :     250271 :     jl_gc_enable(en);
     795                 :     250271 :     JL_UNLOCK(&m->writelock); // Might GC
     796                 :     250271 :     JL_GC_POP();
     797                 :     250271 :     return v;
     798                 :            : }
     799                 :            : 
     800                 :    1227470 : JL_DLLEXPORT jl_code_info_t *jl_uncompress_ir(jl_method_t *m, jl_code_instance_t *metadata, jl_array_t *data)
     801                 :            : {
     802         [ +  + ]:    1227470 :     if (jl_is_code_info(data))
     803                 :         80 :         return (jl_code_info_t*)data;
     804                 :            :     JL_TIMING(AST_UNCOMPRESS);
     805                 :    1227390 :     JL_LOCK(&m->writelock); // protect the roots array (Might GC)
     806         [ -  + ]:    1227390 :     assert(jl_is_method(m));
     807         [ -  + ]:    1227390 :     assert(jl_typeis(data, jl_array_uint8_type));
     808                 :            :     size_t i;
     809                 :            :     ios_t src;
     810                 :    1227390 :     ios_mem(&src, 0);
     811                 :    1227390 :     ios_setbuf(&src, (char*)data->data, jl_array_len(data), 0);
     812                 :    1227390 :     src.size = jl_array_len(data);
     813                 :    1227390 :     int en = jl_gc_enable(0); // Might GC
     814                 :    1227390 :     jl_ircode_state s = {
     815                 :            :         &src,
     816                 :            :         m,
     817                 :    1227390 :         jl_current_task->ptls,
     818                 :            :         1
     819                 :            :     };
     820                 :            : 
     821                 :    1227390 :     jl_code_info_t *code = jl_new_code_info_uninit();
     822                 :            :     jl_code_info_flags_t flags;
     823                 :    1227390 :     flags.packed = read_uint8(s.s);
     824                 :    1227390 :     code->constprop = flags.bits.constprop;
     825                 :    1227390 :     code->inferred = flags.bits.inferred;
     826                 :    1227390 :     code->inlineable = flags.bits.inlineable;
     827                 :    1227390 :     code->propagate_inbounds = flags.bits.propagate_inbounds;
     828                 :    1227390 :     code->pure = flags.bits.pure;
     829                 :    1227390 :     code->purity.bits = read_uint8(s.s);
     830                 :            : 
     831                 :    1227390 :     size_t nslots = read_int32(&src);
     832                 :    1227390 :     code->slotflags = jl_alloc_array_1d(jl_array_uint8_type, nslots);
     833                 :    1227390 :     ios_readall(s.s, (char*)jl_array_data(code->slotflags), nslots);
     834                 :            : 
     835         [ +  + ]:    8591760 :     for (i = 0; i < 6; i++) {
     836         [ +  + ]:    7364360 :         if (i == 1)  // skip codelocs
     837                 :    1227390 :             continue;
     838         [ -  + ]:    6136970 :         assert(jl_field_isptr(jl_code_info_type, i));
     839                 :    6136970 :         jl_value_t **fld = (jl_value_t**)((char*)jl_data_ptr(code) + jl_field_offset(jl_code_info_type, i));
     840                 :    6136970 :         *fld = jl_decode_value(&s);
     841                 :            :     }
     842         [ -  + ]:    1227390 :     if (m->is_for_opaque_closure)
     843                 :          0 :         code->slottypes = jl_decode_value(&s);
     844                 :            : 
     845                 :    1227390 :     jl_value_t *slotnames = jl_decode_value(&s);
     846         [ +  + ]:    1227390 :     if (!jl_is_string(slotnames))
     847                 :    1226910 :         slotnames = m->slot_syms;
     848                 :    1227390 :     code->slotnames = jl_uncompress_argnames(slotnames);
     849                 :            : 
     850                 :    1227390 :     size_t nstmt = jl_array_len(code->code);
     851                 :    1227390 :     code->codelocs = (jl_value_t*)jl_alloc_array_1d(jl_array_int32_type, nstmt);
     852         [ +  + ]:    1227390 :     if (jl_array_len(code->linetable) < 256) {
     853         [ +  + ]:   14169000 :         for (i = 0; i < nstmt; i++) {
     854                 :   12951500 :             ((int32_t*)jl_array_data(code->codelocs))[i] = read_uint8(s.s);
     855                 :            :         }
     856                 :            :     }
     857         [ +  - ]:       9828 :     else if (jl_array_len(code->linetable) < 65536) {
     858         [ +  + ]:    4682740 :         for (i = 0; i < nstmt; i++) {
     859                 :    4672910 :             ((int32_t*)jl_array_data(code->codelocs))[i] = read_uint16(s.s);
     860                 :            :         }
     861                 :            :     }
     862                 :            :     else {
     863                 :          0 :         ios_readall(s.s, (char*)jl_array_data(code->codelocs), nstmt * sizeof(int32_t));
     864                 :            :     }
     865                 :            : 
     866                 :    1227390 :     (void) read_uint8(s.s);   // relocatability
     867                 :            : 
     868         [ -  + ]:    1227390 :     assert(ios_getc(s.s) == -1);
     869                 :    1227390 :     ios_close(s.s);
     870                 :    1227390 :     JL_GC_PUSH1(&code);
     871                 :    1227390 :     jl_gc_enable(en);
     872                 :    1227390 :     JL_UNLOCK(&m->writelock); // Might GC
     873                 :    1227390 :     JL_GC_POP();
     874         [ +  + ]:    1227390 :     if (metadata) {
     875                 :      99877 :         code->min_world = metadata->min_world;
     876                 :      99877 :         code->max_world = metadata->max_world;
     877                 :      99877 :         code->rettype = metadata->rettype;
     878                 :      99877 :         code->parent = metadata->def;
     879                 :            :     }
     880                 :    1227390 :     return code;
     881                 :            : }
     882                 :            : 
     883                 :    4323440 : JL_DLLEXPORT uint8_t jl_ir_flag_inferred(jl_array_t *data)
     884                 :            : {
     885         [ +  + ]:    4323440 :     if (jl_is_code_info(data))
     886                 :     406053 :         return ((jl_code_info_t*)data)->inferred;
     887         [ -  + ]:    3917390 :     assert(jl_typeis(data, jl_array_uint8_type));
     888                 :            :     jl_code_info_flags_t flags;
     889                 :    3917390 :     flags.packed = ((uint8_t*)data->data)[0];
     890                 :    3917390 :     return flags.bits.inferred;
     891                 :            : }
     892                 :            : 
     893                 :    1781700 : JL_DLLEXPORT uint8_t jl_ir_flag_inlineable(jl_array_t *data)
     894                 :            : {
     895         [ +  + ]:    1781700 :     if (jl_is_code_info(data))
     896                 :     405993 :         return ((jl_code_info_t*)data)->inlineable;
     897         [ -  + ]:    1375700 :     assert(jl_typeis(data, jl_array_uint8_type));
     898                 :            :     jl_code_info_flags_t flags;
     899                 :    1375700 :     flags.packed = ((uint8_t*)data->data)[0];
     900                 :    1375700 :     return flags.bits.inlineable;
     901                 :            : }
     902                 :            : 
     903                 :          0 : JL_DLLEXPORT uint8_t jl_ir_flag_pure(jl_array_t *data)
     904                 :            : {
     905         [ #  # ]:          0 :     if (jl_is_code_info(data))
     906                 :          0 :         return ((jl_code_info_t*)data)->pure;
     907         [ #  # ]:          0 :     assert(jl_typeis(data, jl_array_uint8_type));
     908                 :            :     jl_code_info_flags_t flags;
     909                 :          0 :     flags.packed = ((uint8_t*)data->data)[0];
     910                 :          0 :     return flags.bits.pure;
     911                 :            : }
     912                 :            : 
     913                 :      56399 : JL_DLLEXPORT jl_value_t *jl_compress_argnames(jl_array_t *syms)
     914                 :            : {
     915                 :      56399 :     size_t nsyms = jl_array_len(syms);
     916                 :      56399 :     size_t i, len = 0;
     917         [ +  + ]:     318075 :     for (i = 0; i < nsyms; i++) {
     918                 :     261676 :         jl_sym_t *name = (jl_sym_t*)jl_array_ptr_ref(syms, i);
     919         [ -  + ]:     261676 :         assert(jl_is_symbol(name));
     920                 :     261676 :         char *namestr = jl_symbol_name(name);
     921                 :     261676 :         size_t namelen = strlen(namestr) + 1;
     922                 :     261676 :         len += namelen;
     923                 :            :     }
     924                 :      56399 :     jl_value_t *str = jl_alloc_string(len);
     925                 :      56399 :     len = 0;
     926         [ +  + ]:     318075 :     for (i = 0; i < nsyms; i++) {
     927                 :     261676 :         jl_sym_t *name = (jl_sym_t*)jl_array_ptr_ref(syms, i);
     928         [ -  + ]:     261676 :         assert(jl_is_symbol(name));
     929                 :     261676 :         char *namestr = jl_symbol_name(name);
     930                 :     261676 :         size_t namelen = strlen(namestr) + 1; // include nul-byte
     931         [ -  + ]:     261676 :         assert(len + namelen <= jl_string_len(str));
     932                 :     261676 :         memcpy(jl_string_data(str) + len, namestr, namelen);
     933                 :     261676 :         len += namelen;
     934                 :            :     }
     935         [ -  + ]:      56399 :     assert(len == jl_string_len(str));
     936                 :      56399 :     return str;
     937                 :            : }
     938                 :            : 
     939                 :        838 : JL_DLLEXPORT ssize_t jl_ir_nslots(jl_array_t *data)
     940                 :            : {
     941         [ -  + ]:        838 :     if (jl_is_code_info(data)) {
     942                 :          0 :         jl_code_info_t *func = (jl_code_info_t*)data;
     943                 :          0 :         return jl_array_len(func->slotnames);
     944                 :            :     }
     945                 :            :     else {
     946         [ -  + ]:        838 :         assert(jl_typeis(data, jl_array_uint8_type));
     947                 :        838 :         int nslots = jl_load_unaligned_i32((char*)data->data + 2);
     948                 :        838 :         return nslots;
     949                 :            :     }
     950                 :            : }
     951                 :            : 
     952                 :        434 : JL_DLLEXPORT uint8_t jl_ir_slotflag(jl_array_t *data, size_t i)
     953                 :            : {
     954         [ -  + ]:        434 :     assert(i < jl_ir_nslots(data));
     955         [ -  + ]:        434 :     if (jl_is_code_info(data))
     956                 :          0 :         return ((uint8_t*)((jl_code_info_t*)data)->slotflags->data)[i];
     957         [ -  + ]:        434 :     assert(jl_typeis(data, jl_array_uint8_type));
     958                 :        434 :     return ((uint8_t*)data->data)[2 + sizeof(int32_t) + i];
     959                 :            : }
     960                 :            : 
     961                 :    1229600 : JL_DLLEXPORT jl_array_t *jl_uncompress_argnames(jl_value_t *syms)
     962                 :            : {
     963         [ -  + ]:    1229600 :     assert(jl_is_string(syms));
     964                 :            :     char *namestr;
     965                 :    1229600 :     namestr = jl_string_data(syms);
     966                 :    1229600 :     size_t remaining = jl_string_len(syms);
     967                 :    1229600 :     size_t i, len = 0;
     968         [ +  + ]:    5901410 :     while (remaining) {
     969                 :    4671810 :         size_t namelen = strlen(namestr);
     970                 :    4671810 :         len += 1;
     971                 :    4671810 :         namestr += namelen + 1;
     972                 :    4671810 :         remaining -= namelen + 1;
     973                 :            :     }
     974                 :    1229600 :     namestr = jl_string_data(syms);
     975                 :    1229600 :     jl_array_t *names = jl_alloc_array_1d(jl_array_symbol_type, len);
     976                 :    1229600 :     JL_GC_PUSH1(&names);
     977         [ +  + ]:    5901410 :     for (i = 0; i < len; i++) {
     978                 :    4671810 :         size_t namelen = strlen(namestr);
     979                 :    4671810 :         jl_sym_t *name = _jl_symbol(namestr, namelen);
     980                 :    4671810 :         jl_array_ptr_set(names, i, name);
     981                 :    4671810 :         namestr += namelen + 1;
     982                 :            :     }
     983                 :    1229600 :     JL_GC_POP();
     984                 :    1229600 :     return names;
     985                 :            : }
     986                 :            : 
     987                 :          0 : JL_DLLEXPORT jl_value_t *jl_uncompress_argname_n(jl_value_t *syms, size_t i)
     988                 :            : {
     989         [ #  # ]:          0 :     assert(jl_is_string(syms));
     990                 :          0 :     char *namestr = jl_string_data(syms);
     991                 :          0 :     size_t remaining = jl_string_len(syms);
     992         [ #  # ]:          0 :     while (remaining) {
     993                 :          0 :         size_t namelen = strlen(namestr);
     994         [ #  # ]:          0 :         if (i-- == 0) {
     995                 :          0 :             jl_sym_t *name = _jl_symbol(namestr, namelen);
     996                 :          0 :             return (jl_value_t*)name;
     997                 :            :         }
     998                 :          0 :         namestr += namelen + 1;
     999                 :          0 :         remaining -= namelen + 1;
    1000                 :            :     }
    1001                 :          0 :     return jl_nothing;
    1002                 :            : }
    1003                 :            : 
    1004                 :            : #ifdef __cplusplus
    1005                 :            : }
    1006                 :            : #endif

Generated by: LCOV version 1.14