crypto: Add IGE mode for AES
Execution of system tasks in context of another process

A process requesting a system task to be executed in the context of
another process will be notified by a message when the task has
executed. This message will be on the form:
  {RequestType, RequestId, Pid, Result}.

A process requesting a system task to be executed can set priority
on the system task. The requester typically set the same priority
on the task as its own process priority, and by this avoiding
priority inversion. A request for execution of a system task is
made by calling the statically linked in NIF
erts_internal:request_system_task(Pid, Prio, Request). This is an
undocumented ERTS internal function that should remain so. It
should *only* be called from BIF implementations.

Currently defined system tasks are:
* garbage_collect
* check_process_code

Further system tasks can and will be implemented in the future.

The erlang:garbage_collect/[1,2] and erlang:check_process_code/[2,3]
BIFs are now implemented using system tasks. Both the
'garbage_collect' and the 'check_process_code' operations perform
or may perform garbage_collections. By doing these via the
system task functionality all garbage collect operations in the
system will be performed solely in the context of the process
being garbage collected. This makes it possible to later implement
functionality for disabling garbage collection of a process over
context switches.

Newly introduced BIFs:

* erlang:garbage_collect/2 - The new second argument is an option
  list. Introduced option:
  * {async, RequestId} - making it possible for users to issue
    asynchronous garbage collect requests.

* erlang:check_process_code/3 -  The new third argument is an
  option list. Introduced options:
  * {async, RequestId} - making it possible for users to issue
    asynchronous check process code requests.
  * {allow_gc, boolean()} - making it possible to issue requests
    that aren't allowed to garbage collect (operation will abort
    if gc should be needed).
  These options have been introduced as a preparation for
  parallelization of check_process_code operations when the
  code_server is about to purge a module.
Use asynchronous check_process_code in code_parallel_SUITE
Functionality for disabling garbage collection

Being able to disable garbage collection over context
switches vastly simplifies implementation of yielding
native code that builds large or complex data structures
on the heap. This since the heap can be left in an
inconsistent state over the context switch.
Parallel check_process_code when code_server purge a module

When the code_server is about to purge a module it will now issue
asynchronous check_process_code requests to all processes at once
instead of one at a time. These check_process_code operation can
execute in parallel.
Fix some uninitialized pointers in crypto

crypto.c:2748:9: warning: variable 'bn_prime' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
    if (!get_bn_from_bin(env, argv[0], &bn_verifier)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
crypto.c:2758:6: note: uninitialized use occurs here
        if (bn_prime) BN_free(bn_prime);
            ^~~~~~~~
crypto.c:2748:9: note: remove the '||' if its condition is always false
    if (!get_bn_from_bin(env, argv[0], &bn_verifier)
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
erts: Let cc determine default wordsize for darwin build
crypto: Throw notsup for AES IGE if openssl older than 0.9.8c
crypto: Update supports/0 for des3_cbf and aes_ige256
PER/UPER: Handle a range in the extension part of the constraint

Constraints such as:

   INTEGER (1..10, ..., 11..20)

would fail to compile. Make sure it is properly ignored.
Fix CT hook pre_end_per_group causing crash when returning {skip,Reason}

OTP-11409
Merge branch 'bjorn/asn1/fix-integer-constraint/OTP-11504' into maint

* bjorn/asn1/fix-integer-constraint/OTP-11504:
  PER/UPER: Handle a range in the extension part of the constraint
Merge branch 'maint'

* maint:
  PER/UPER: Handle a range in the extension part of the constraint
Remove uninitialized use of new_crr in erl_alloc_util

When the offending code is reached, new_crr is either uninitalized or
have been set to NULL. This patch removes the following warning:

beam/erl_alloc_util.c:3510:6: warning: variable 'new_crr' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
        if (!(flags & CFLG_FORCE_MSEG)) {
            ^~~~~~~~~~~~~~~~~~~~~~~~~~
beam/erl_alloc_util.c:3567:23: note: uninitialized use occurs here
        DEBUG_SAVE_ALIGNMENT(new_crr);
                             ^~~~~~~
beam/erl_alloc_util.c:674:51: note: expanded from macro 'DEBUG_SAVE_ALIGNMENT'
    UWord algnmnt__ = sizeof(Unit_t) - (((UWord) (C)) % sizeof(Unit_t));\
                                                  ^
beam/erl_alloc_util.c:3510:2: note: remove the 'if' if its condition is always true
        if (!(flags & CFLG_FORCE_MSEG)) {
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
beam/erl_alloc_util.c:3438:23: note: initialize the variable 'new_crr' to silence this warning
    Carrier_t *new_crr, *old_crr;
                      ^
                       = NULL
Properly mark erl_assert_error as non-returning
Fix erts_check_off_heap2 assertion

The test needs to be false to fail, not true. This was noticed with the
following warning, where marking erl_assert_error as non-returning didn't
help:

beam/erl_gc.c:2772:2: warning: variable 'refc' is used uninitialized whenever switch default is taken [-Wsometimes-uninitialized]
        default:
        ^~~~~~~
beam/erl_gc.c:2775:26: note: uninitialized use occurs here
        ERTS_CHK_OFFHEAP_ASSERT(refc >= 1);
                                ^~~~
beam/erl_gc.c:2738:11: note: expanded from macro 'ERTS_CHK_OFFHEAP_ASSERT'
    if (!(EXP))                                         \
          ^
beam/erl_gc.c:2759:18: note: initialize the variable 'refc' to silence this warning
        erts_aint_t refc;
                        ^
                         = 0
Silence a warning in erl_poll about an empty loop body

The warning is:

sys/common/erl_poll.c:2513:72: warning: for loop has empty body [-Wempty-body]
        for (prev_ps = pollsets; ps != prev_ps->next; prev_ps = prev_ps->next);
Silence warnings about unused return values in ic

The warnings are:

oe_ei_encode_string.c:26:3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_string(0,&size,p);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~

oe_ei_encode_port.c:26:3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_port(NULL, &size, p);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

oe_ei_encode_atom.c:26:3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_atom(0,&size,p);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~

oe_ei_encode_pid.c:26::3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_pid(NULL, &size, p);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

oe_ei_encode_ref.c:26:3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_ref(NULL, &size, p);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

oe_ei_encode_term.c:26:3: warning: expression result unused [-Wunused-value]
  (int) ei_encode_term(NULL, &size, t);
  ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
erts: Remove unused file winsock_func.h
Silence warnings about different buffer types in erl_memory

erl_memory.c:861:19: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->size);
                  ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:863:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p,
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:869:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->no);
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:871:20: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
            *p += sprintf(*p,
                          ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:878:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p,
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:900:19: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_size);
                  ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:902:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:904:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_no);
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:906:20: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
            *p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
                          ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:909:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        *p += sprintf(*p, "%*s %*s %*s ", fw, "", fw, "", fw, "");
                      ^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:986:25: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    area.size = sprintf(area.ptr, format, carg);
                        ^~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1103:25: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    area.size = sprintf(area.ptr,
                        ^~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1109:23: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        area.size += sprintf(area.ptr + area.size,
                             ^~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1120:26: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    area.size += sprintf(area.ptr + area.size,
                         ^~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1190:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    p += sprintf(p, "> %-*s", EM_TIME_FIELD_WIDTH - 2, "Maximum:");
                 ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1223:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    p += sprintf(p, "\n");
                 ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1227:15: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        p += sprintf(p, "%s", stop_str);
                     ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1230:15: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
        p += sprintf(p, exit_str, state->info.exit_status);
                     ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1236:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    p += sprintf(p, format, tsz, bw);
                 ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1286:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    p += sprintf(p, "%*" USGND_INT_32_FSTR " ", EM_TIME_FIELD_WIDTH - 1, secs);
                 ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:1311:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
    p += sprintf(p, "\n");
                 ^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
  __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
                           ^
erl_memory.c:2231:32: warning: passing 'char *' to parameter of type 'usgnd_int_8 *' (aka 'unsigned char *') converts between pointers to integer types with different sign [-Wpointer-sign]
    size = write_header(state, state->output.header, 1);
                               ^~~~~~~~~~~~~~~~~~~~
erl_memory.c:736:44: note: passing argument to parameter 'ptr' here
write_header(em_state *state, usgnd_int_8 *ptr, int trunc)
                                           ^