Commit graph

9049 commits

Author SHA1 Message Date
Marius Gerbershagen
887115fe95 cmp: implement cross compilation from host compiler with different word size 2025-07-19 16:31:55 +02:00
Marius Gerbershagen
a1b1eee8b5 cmp: allow for storing type definitions in the compiler environment
Currently unused; will be used in the implementation of
cross-compilation.
2025-07-19 16:31:55 +02:00
Daniel Kochmański
c7b5b9f70e ecl_init_module: rebind *readtable* and *package* to protect the env
Fixes #785.
2025-07-17 16:02:18 +02:00
Marius Gerbershagen
af89c4a972 don't forget to initialize C stack limits if threads are disabled
This was broken after the recent refactor of the initialization code.
2025-07-06 14:40:21 +02:00
Marius Gerbershagen
9457813343 fix initialization of the main thread environment
The default sigmask was NULL previously (bug introduced in the
refactor in commit 0f4e9b1e1).
2025-07-05 22:07:28 +02:00
Marius Gerbershagen
a213b4eaa1 fix typo preventing non-threaded builds from working
Introduced in the refactor in commit
ecaa73155b
2025-06-28 20:08:16 +02:00
Marius Gerbershagen
b0f7711bd1 tests: fix process-environ
We were trying to check if the output of the program is empty but we
were passing `:output nil` to ext:run-program. Thus, the stream from
which we trying to read was nil which is the stream designator for the
standard input. The empty read succeeded only by chance if the
standard input had no available characters to read.
2025-06-28 19:45:50 +02:00
Daniel Kochmański
7f18d20ad3 Merge branch 'fix-78x' into develop 2025-06-26 14:31:37 +02:00
Daniel Kochmański
0857a438f6 logical pathnames: add a regression test and update the changelog
I've tested it against ansi-test and our own test suite and there are no
regressions.

Related to #784.
2025-06-26 14:31:07 +02:00
Daniel Kochmański
5818808f7c logical pathnames: fix logical pathname translation for multiple *
After this commit

    (setf (logical-pathname-translations "x")
          (list ("X:a;*;b;*;*.*" "/hello/*/hi/*/what/*.*")))
    (translate-logical-pathname #p"x:a;bonjour;b;barev;greetings.me")

will return a correct result

    #P"/hello/bonjour/hi/barev/what/greetings.me"

Related to #784.
2025-06-26 14:06:17 +02:00
Daniel Kochmański
03e61206ba logical pathnames: fix find_list_wilds to not produce self-refs
The function find_list_wilds incorrectly collected results from calling
find_wilds, and the latter returned incorrect results when the component fully
matched. It seems that this was a single function that was later split with
errors.

This change saves us from a segfault when we try to match multiple wild
components. Previously find_list_wilds for

(setf (logical-pathname-translations "x")
      `(("X:a;*;b;*;*.*" "/hello/*/hi/*/what/*.*")))
;; ((#P"X:A;*;B;*;*.*" #P"/hello/*/hi/*/what/*.*"))
(translate-logical-pathname #p"x:a;bonjour;b;barev;greetings.me")

returned #1=((BONJUR) #1# BAREV).

Moreover fix an issue where we've compared incorrect character in find_wilds to
determine the end of the glob (we've compared the source character with #\*
instead of the character after).

Fixes #784.
2025-06-26 13:28:42 +02:00
Marius Gerbershagen
ea5a10cbc1 copy-symbol: work around a bug in gcc
On x86_64, gcc 12.2.0 from debian 12 miscompiles the code we had
previously. It generates code that copies symbol.macfun and
symbol.sfdef using an aligned move SSE instruction which requires 16
byte alignment of its operand. This alignment is not present in
general, leading to a segfault for instance when calling (copy-symbol
t t). By reordering the assignments, we avoid triggering the bug.
2025-06-22 10:45:53 +02:00
Daniel Kochmański
d880e6f276 stacks: fix issues with ecl_make_stack
these functions are not used by us yet, so these issues were not noticed. Most
notably we did not assign the vector type and did not release the object.
2025-06-06 15:19:06 +02:00
Daniel Kochmański
9a894b7dab stacks: fix a type in an error message 2025-06-03 21:16:33 +02:00
Daniel Kochmański
0f24472237 bytevm: allow for bytecodes data segment to be NIL
We don't eagerly dereference bytecodes.data->vector.self in case when data is
assigned ECL_NIL. IN that case the *data vector is NULL. That saves us from the
necessity to allocate a vector when we don't use the data segment at all.
2025-06-02 12:05:50 +02:00
Marius Gerbershagen
a158731cc9 Merge branch 'bytecmp-fix-eval-with-env' into 'develop'
Fix a recent regression in bytecodes compiler

See merge request embeddable-common-lisp/ecl!350
2025-05-31 14:54:49 +00:00
Marius Gerbershagen
cb9b63a9a7 Merge branch 'refactor-stacks' into 'develop'
refactor stacks to reduce dependencies

See merge request embeddable-common-lisp/ecl!348
2025-05-31 14:39:34 +00:00
Daniel Kochmański
c00b13f47d stacks: when the stack frame is aligned with the stack, update both
This is to ensure that the topmost frame manipulations update also a data stack.
2025-05-29 14:55:46 +02:00
Daniel Kochmański
e9e97815bc stacks: make stack frame state consistent based on its operators
Previously we did not perform necessary checks for whether we should update the
frame size and stack pointer or whether we should resize the stack. This commit
fixes these functions and adds a missing function to API ecl_stack_frame_pop.
2025-05-29 14:05:17 +02:00
Daniel Kochmański
8fcac4bd9f ecl-inl: add looping over stack frames 2025-05-29 11:29:21 +02:00
Daniel Kochmański
c40a3011b6 bytecmp: import_cmpenv registers a function boundary in the end
This is to avoid a situation where the form evaluated by CMP-EVAL treats the
compiler environment as its own local environment. That caused recently a
regression, because we count indexes in FIFO order for sake of dlat closures

Before local closures:

                     v first from top (correct)
[compiler-env-record form-record]

After local closures

 v first from bottom (incorrect)
[compiler-env-record form-record]

After this commit:

                       v first from bottom after the boundary
[compiler-env-record | form-record]
2025-05-27 14:02:32 +02:00
Daniel Kochmański
ba891a5094 bytecmp: lazily allocate a vector for captured env objects
This way we don't need to separately keep track for whether the function
boundary was crossed for the env, and we don't need to /think hard/ when
captured vector should be allocated.

Moreover the test for whether the parent crosses the function boundary is
precise now, and we save memory when we don't need to allocat a vector.
2025-05-27 14:02:32 +02:00
Daniel Kochmański
3ba6b6dbb6 bytecmp: import_cmpenv: fix reversed test for lexical_level
Commit f36f53a933 accidently(?) reversed the test
by adding the else clause without switghing != to ==.

SYMBOL-MACROLET does not change top-levelness of its children (unlike other
bindings), so we should set lexical_level=1 when we encounter /other/ binding
than SYMBOL-MACRO.

Moreover we add :DECLARE to the mix. The macro LOCALLY does not change
top-levelness either.
2025-05-27 14:02:32 +02:00
Daniel Kochmański
9995ba6188 bytecmp: import compiler environment in a function import_cmpenv
This step simplifies logic where we import either from lexenv or from cmpenv.
The next step is to add a correction to locations in cmpenv to address the most
recent regression in passing env from the c compiler to the bytecodes compiler.
2025-05-27 14:02:32 +02:00
Daniel Kochmański
92978b6cae tests: add a test for the recent regression in bytecmp
The regression happens when we pass compiler env from ccmp to bcmp.
2025-05-27 14:02:28 +02:00
Daniel Kochmański
71763174ef doc: clarify wording for :INITIAL-BINDINGS in MAKE-PROCESS 2025-05-26 09:28:10 +02:00
Daniel Kochmański
b1605eaeae update the changelog 2025-05-26 09:28:10 +02:00
Daniel Kochmański
5233c2104a stacks: move ECL_STACK_RESIZE_DISABLE_INTERRUPTS before realloc 2025-05-26 09:28:10 +02:00
Daniel Kochmański
ecaa73155b cleanup: reorganize cl_env_struct 2025-05-26 09:28:10 +02:00
Daniel Kochmański
7dfc7ac5e9 stacks: add a general purpose stack implementation based on vector 2025-05-26 09:28:10 +02:00
Daniel Kochmański
03e9f9296c stacks: refactor file to separate low level and high level operators
With this it will possible to move low level primitives earlier in the bootstrap
process.
2025-05-26 09:28:08 +02:00
Daniel Kochmański
fd2fae1a39 stacks: merge stack overflow errors into a single handler
Replace calls to cl_error and cl_cerror with CEstack_overflow.
2025-05-26 09:21:50 +02:00
Daniel Kochmański
21c23973ae stacks: refactor the code in stacks.d
- {run,bds,frs}_set_size functions were very similar; I've updated them to
  follow the same naming convention and execution order to indicate that.
- these functions are now renamed to xxx_set_limit -that simplifies some code
- there were inconsistencies in how we've treated boot sizes (limit vs size)
2025-05-26 09:21:32 +02:00
Daniel Kochmański
72fb1c583a stacks: remove serror, stack-error-handler and reset-margin
All these operations were propagated up to the condition system in order to
reset the stack margin in the case of a non-local exit. We can do that easily
with open-coded unwind protect within stacks.
2025-05-26 08:44:18 +02:00
Daniel Kochmański
6463cae89c stacks: rename bindings and runtime stack pointers stored in frs
They are named to follow the same convention hinting that it is an index, not a
pointer.
2025-05-26 08:43:59 +02:00
Daniel Kochmański
7db0a89f42 stacks: use a manual allocator for stacks
Objects have a well defind extent so there is no need to rely on GC for
them. This change allows us to move stack initialization before garbage
collector is introduced into the system (or even without any GC).
2025-05-26 08:37:06 +02:00
Daniel Kochmański
1b058f0e3a stacks: manually allocate bindings table
This commit removes initial bindings array from the process and allocates it
only in the bds stack. To make fields in the structure less confusing we rename
initial_bindings slot to inherit_bindings_p.

On observable behavior change is that bindings are inherited when the process is
enabled, not when it is created. That was not specified in documentation so it
should be fine to change this behavior. Moreover it makes more sense from the
programmer perspective -- we want to inherit bindings of the process that starts
our thread, not the one that creates it.
2025-05-26 08:36:03 +02:00
Daniel Kochmański
0a8de3f234 stacks: make runtime stack accessors inline functions
Also remove an unused operator FEstack_advance. Macro definition names do not
change and they expand (when appropriate) to the inline function.

New function names refer to data_stack, while upcased macro names mentions only
the STACK. This is in line with how forth refers to the data stack when it is
not ambiguous.
2025-05-26 08:34:06 +02:00
Daniel Kochmański
51157bbf9d stacks: move runtime stack to a separate structure 2025-05-26 07:43:41 +02:00
Daniel Kochmański
45f3be3aa1 stacks: move C shadow stack to a separate structure 2025-05-26 07:43:41 +02:00
Daniel Kochmański
593d9d2190 stacks: move invocation history stack to a separate structure 2025-05-26 07:43:41 +02:00
Daniel Kochmański
9687a1d33a stacks: move frames stack to a separate structure 2025-05-26 07:43:41 +02:00
Daniel Kochmański
326a914fff stacks: clean up inlined versions for bds operators
We remove defines in favor of 'static inline' that is available in all c99
compilers. Previously it was specialcased only for GNUC.
2025-05-26 07:43:41 +02:00
Daniel Kochmański
8f00f3494a stacks: rename thread_local_bindings{,_size} to tl_bindings{,_size}
This is strictly cosmetic change.
2025-05-26 07:43:41 +02:00
Daniel Kochmański
f365ebe079 stacks: move the binding stack to a separate structure 2025-05-26 07:43:41 +02:00
Marius Gerbershagen
0f6116081c ecl_to_int64_t: fix typo
Introduced by the refactor in commit 1102e58e0e
2025-05-25 17:13:57 +02:00
Daniel Kochmański
c0720610dd tests: add missing imports and tweak mix.0010.file-stream-fd
We didn't export *TEST-NAME*, FAILED and TEST-FAILURE from 2am-ecl, so the macro
FAIL did not work correctly.

The test mix.0010.file-stream-fd contained a safeguard for a bug from 2016, no
need to guard against that today.
2025-05-23 08:15:00 +02:00
Daniel Kochmański
09622435bc core: fix a race condition between core symbols and the gc
The GC is enabled when we create initial symbols. The function make_this_symbol
initializes symbols from a static table as follows:

1. initialize symbol structure fields
2. associate the symbol with its package
3. associate the symbol with its function
4. increment cl_num_symbols_in_core

Most notably in point 2:
s->symbol.name = ecl_make_constant_base_string(name,-1);

GC's stacks_scanner marks

  [cl_symbols; cl_symbols+cl_num_symbols_in_core]

in other words, if the GC kicks in between 1. and 4., the symbol name may be
garbage collected, messing the symbol name and package exports.

To mitigate that, we assign intermediate values on the stack and increment
the number of symbols in core after the symbol is initialized:

1. store initialization values on stack -- cl_object foo = alloc();
2. initialize symbol structure fields
3. increment cl_num_symbols_in_core
4. associate the symbol with its package and function
2025-05-20 13:57:21 +02:00
Daniel Kochmański
9d8394f0cd bytevm: when unbinding locals don't keep the unbound reference
Since the stack frame is always marked fully, decrementing the pointer keeps a
reference to the unbound object effectively preventing its garbage collection
until it is overwritten by another binding or the stack is closed.
2025-05-14 10:52:45 +02:00
Daniel Kochmański
62c8f3f714 threads: get rid of an annoying warning stemming from xopen
We've defined _XOPEN_SOURCE 600 but glibc defines it as 700 or more.
2025-05-13 14:18:10 +02:00