Age | Commit message (Collapse) | Author |
|
The BEAM instructions for calling a function don't save the
continuation pointer (return address) on the stack, but to a special
BEAM register called CP. It is the responsibility of the called
function to save CP to the stack frame before calling other functions.
In the earlier implementations of BEAM on Sparc, CP was located in a
CPU register. That meant that the continuation pointer was never
written to memory when calling simple functions that didn't call
other functions at all or ended in a tail-call to another function.
The modern BEAM no longer keeps CP in CPU register. Instead, it is
kept in the `process` struct (in `p->cp`). That means the continuation
pointer must be written to the memory on every call, and if the called
function will call other functions, it will must read the continuation
pointer from `p->cp` and store it on the stack.
This commit eliminates the concept of the CP register and modifies
the call instructions to directly store the continuation pointer on
the stack. That makes allocation and trimming of stack frames slightly
faster. A more important benefit is simplification of code that handles
continuation pointers. Because all continuation pointers are now stored
on the stack, the special case of handling `p->cp` disappears.
Co-authored-by: John Högberg <[email protected]>
|
|
* maint:
erts: Fix crash in instrument:allocations/0-1
|
|
* john/erts/fix-instrument-allocations-race/OTP-15983:
erts: Fix crash in instrument:allocations/0-1
|
|
* maint:
erts: Create heap binaries in binary:split/2-3
erts: Create heap binaries in binary_part/2-3
erts: Create heap binaries in split_binary/2
erts: Create heap binaries in bs_get_binary2
erts: Remove size check in bs_start_match
erts: Disallow binaries whose size in bits exceeds UWORD_MAX
|
|
* john/erts/bs_get_binary2-heap-binaries/OTP-15977:
erts: Create heap binaries in binary:split/2-3
erts: Create heap binaries in binary_part/2-3
erts: Create heap binaries in split_binary/2
erts: Create heap binaries in bs_get_binary2
erts: Remove size check in bs_start_match
erts: Disallow binaries whose size in bits exceeds UWORD_MAX
|
|
* maint:
Fix documentation for erlang:is_map_key/2
|
|
The current carrier list was read when the allocator wasn't locked,
crashing the emulator if a block scan raced with a carrier
allocation.
|
|
Fix documentation for erlang:is_map_key/2
|
|
|
|
|
|
|
|
ErlSubBin is a large struct that often dwarfs the region of memory
it points at, and it's common for them to refer to a ProcBin which
must be kept around as long as the SubBin lives, using up even more
heap space and keeping the referenced binary alive regardless of
how small the sub-binary is.
|
|
The size check is redundant now that all binaries are guaranteed
to be small enough that their size in bits fits into a word.
|
|
These have never worked in binary matching (including sub-binaries
extracted from them) so it's hard to justify their existence. They
also make a future migration of binary sizes from bytes to bits
problematic, so we may as well change it ahead of time.
This is potentially incompatible on 32-bit platforms where a NIF
or driver could allocate 512MB+ binaries, but allocations that
large should be expected to fail anyway.
|
|
* maint:
erts: Escape atoms in erlang:fun_to_list/1
|
|
* john/erts/fun_to_list-escaping/OTP-15975/ERL-1009:
erts: Escape atoms in erlang:fun_to_list/1
|
|
|
|
* john/compiler/explicit-call-exceptions:
compiler: Simplify set_tuple_element optimization
compiler: Make 'succeeded' optimization more general
compiler: Simplify call type optimization
compiler: All calls may throw, so they all need success checks
erts_debug: Turn off unsafe optimizations in test case
|
|
The test case alters the return value of a function that the
compiler expects will never return, resulting in undefined
behavior.
Note that the debugger (which may change variables/return values)
is unaffected since the affected module is purged and "replaced"
with an interpreted variant.
|
|
|
|
erts: Do not use named no_cpuid label in asm
|
|
|
|
|
|
* maint:
The linger option is not transferred on *BSD
|
|
* raimo/inherit-listen-options/OTP-15824:
The linger option is not transferred on *BSD
|
|
|
|
|
|
|
|
|
|
|
|
maint
|
|
|
|
|
|
|
|
|
|
|
|
This function is allowed to be used in guards.
|
|
|
|
Add a sleep to reduce the chance that process exit
has not been "processed" by the nif code.
Also increased the test case timetrap for the
sc_ctrl_proc_exit group of test cases.
OTP-15904
|
|
Ask compiler to generate unique label name. Using named label has implications
on optimizer, that may lead to the compilation errors as the following:
pthread/ethread.c: Assembler messages:
pthread/ethread.c:213: Error: symbol `no_cpuid' is already defined
pthread/ethread.c:213: Error: symbol `no_cpuid' is already defined
pthread/ethread.c:213: Error: symbol `no_cpuid' is already defined
|
|
Rename some of the structures and callback functions
(socket -> esock).
OTP-15955
|
|
Renamed constants (defines): SOCKET_ -> ESOCK_
OTP-15955
|
|
The naming "convention" for "top" functions of the esock
nif module was: The API functions where called nif_<foo>
This function did basic checks and arg extraction and then
called the a function called n<foo>, which was the one doing
the actual work.
Unfortunately, och some platforms (AIX) these second names,
n<foo>, clashed with system functions.
So, in order to avoid this, the naming of second function
has been changed to esock_<foo>.
OTP-15955
|
|
Removed unnecessary spec's causing dialyzer warnings.
|
|
Invalid guard tests for function sendto. It handled the,
invalid, socket address 'null'. Presumably, this was
intended for connected UDP sockets. Though, for a
connected (UDP) socket, the send function shall be used.
|
|
OTP-15904
|
|
OTP-15904
|
|
|
|
|
|
If we are not allowe to change ('eopnotsupp') the socket
option 'dontroute' then we skip the test case.
OTP-15904
|