1.17.0-dev.241 | 2026-08-19 16:58:55 +0200

  * GH-2447: Mark `public` unit alias parser struct with `&always-emit` (Benjamin Bannier, Corelight)

    The way we annotated `public` type aliases was inconsistent with how we
    treated `public` units, in particular `public` units are `&always-emit`
    while `public` type aliases were not. The absence of `&always-emit`
    allowed the dead code removal pass to remove the type alias, even though
    we'd still register a parser from the alias which would then fail to
    compile.

    With this patch we declare `public` aliases `&always-emit`, consistent
    with how we already treat `public` unit types.

    Closes #2447.

  * Make `checkStack()` counter thread-local and add branch hints (Benjamin Bannier, Corelight)

    The static counter was shared across threads, causing a data race on the
    non-atomic increment and false sharing in multi-threaded use. Make it
    thread-local and annotate branches for the common fast path (skip check)
    and the rare slow paths (stack exceeded, book-keeping).

  * Inline fast paths for `waitForInput` and `atEod` (Benjamin Bannier, Corelight)

    In the common case (frozen stream with sufficient data), these functions
    just check `cur.size()` and return. Move that check into inline wrappers
    so the compiler can avoid the function call overhead entirely, delegating
    to out-of-line slow paths only when input is actually insufficient.

  * Inline context `current()` to avoid extern function call overhead (Benjamin Bannier, Corelight)

    Expose the thread-local context pointer via an inline function returning
    a reference to an extern thread-local variable. This lets the compiler
    fold repeated `current()` calls within a function body and avoids the
    overhead of an extern function call on platforms with efficient TLS
    (single %fs-relative load on Linux).

  * Add branch hints to debug logging and location hot paths (Benjamin Bannier, Corelight)

    Mark `indent()`/`dedent()` debug logger checks as `[[unlikely]]` since
    debug logging is disabled in production. Use `unsafeGlobalState()` to
    avoid the redundant null check. Mark `setLocation()`'s context check as
    `[[likely]]` since a context is always present during parsing.

  * Add parsing benchmarks for switch, nesting, and bytes (Benjamin Bannier, Corelight)

    The existing benchmarks only covered vector-with-size,
    vector-with-lookahead, and regex parsing. Add benchmarks for TLV-style
    switch dispatch, deeply nested unit composition, and length-prefixed
    bytes to cover more of the critical parsing paths.

1.17.0-dev.234 | 2026-08-18 09:21:30 +0200

  * Format shell scripts with shfmt (Benjamin Bannier, Corelight)

  * Remove unused helper scripts (Benjamin Bannier, Corelight)

  * Switch from checkbashisms.pl to shellcheck (Benjamin Bannier, Corelight)

1.17.0-dev.230 | 2026-08-17 08:45:54 +0200

  * Fix toolchain headers under C++23 (Matthias Vallentin)

  * Bump 3rdparty/vcpkg from `b6b50b3` to `d92484e` (dependabot[bot])

  * Bump 3rdparty/json from `55f9368` to `9cca280` (dependabot[bot])

  * Switch benchmark job to `simulation` mode (Benjamin Bannier, Corelight)

    The `instrumentation` mode we were using previously has been deprecated
    for some time.

  * Bump CodSpeedHQ/action from 4.19.1 to 5.0.3 (dependabot[bot])

1.17.0-dev.222 | 2026-08-12 10:29:35 +0200

  * GH-13213: Remove workaround for readthedocs/readthedocs.org#13213 [skip ci] (Benjamin Bannier, Corelight)

    An upstream fix for the issue has landed and we can remove our
    workaround again.

1.17.0-dev.220 | 2026-08-12 10:16:49 +0200

  * GH-5771: Avoid mode 0200 file creation in `Library::save()` for virtiofs (Benjamin Bannier, Corelight)

    libstdc++'s `fs::copy` creates the destination with mode 0200 (write-only).
    Apple's virtiofs layer rejects file creation without the owner-read bit,
    causing `spicyz -o` to fail with "Permission denied" on host bind mounts
    in podman/Docker on macOS.

    We unconditionally attempt removal of any pre-existing destination to
    handle stale debris, then pre-create the file with a sane mode before
    letting `fs::copy` overwrite it.

    Closes zeek/zeek#5771.

1.17.0-dev.218 | 2026-08-12 09:51:51 +0200

  * Mention `&on-heap` in stack exhaustion error message (Benjamin Bannier, Corelight)

    When a user hits `StackSizeExceeded`, the error now suggests
    `&on-heap` as a remedy. This makes the attribute more discoverable
    without requiring users to find it in documentation first.

  * GH-1781: GH-2434: Support `&on-heap` on Spicy unit and struct type declarations (Benjamin Bannier, Corelight)

    This adds support for a `&on-heap` attribute to both unit and struct
    type declarations. This provides an escape hatch for the default
    behavior introduced in #1781 so that user can explicitly force huge
    types to be allocated on the heap instead of the stack.

    Since whether a type is huge is static information we could in principle
    implement heuristics to switch to heap allocations automatically, but
    I punted on that since actual cutoff values can be subtle. Users running
    into this typically see problems under most inputs, so they have a
    chance to address the issue before rolling out to production.
    Unfortunately the only symptom is that stack space is exhausted which
    makes it hard to point them to this attribute as a workaround.

    Closes #2434.

  * Fix duplicate key in `allowed_attributes` for `type::Unit` (Benjamin Bannier, Corelight)

    The map had two entries for `hilti::node::tag::type::Unit`, one for
    attributes on unit type declarations, and one intended for per-type
    field validation. Since `std::unordered_map` silently drops duplicate
    keys, the second entry containing `&parse-at` was being discarded, so we
    now merge what we had into a single entry.

  * Introduce proper version macros (Benjamin Bannier, Corelight)

    We previously only exported version macros with generic names which was
    not great, so this patch adds properly named macros as well. We keep the
    old macros for now for backwards compatibility.

1.17.0-dev.213 | 2026-08-11 19:16:18 +0200

  * Add optimizer logic promoting unmodified `copy`/`inout` parameters to `in`. (Robin Sommer, Corelight)

    We add this to the existing `OptimizeParameters` pass. The new logic
    uses CFG dataflow to detect when a `copy` or `inout` parameter is
    never written inside the function body, and promotes it to `in`.

  * Rename `RemoveUnusedParameters` optimizer pass to `OptimizeParameters.` (Robin Sommer, Corelight)

    This prepares for adding additional parameter optimizations.

  * Make a couple optimizer state management functions public. (Robin Sommer, Corelight)

  * GH-2322: Fix optimization of `extern` functions. (Robin Sommer, Corelight)

    We were inconsistent, and partially incorrect, in how we treated
    functions and methods declared as `extern` — I believe that worked
    only by chance (or by construction, if you want).

    As a reminder, `extern` is a *calling convention*, not a visibility
    attribute. It really means only one thing: the codegen will create a
    stub function that facilitates yield/resume functionality when called
    from external C++ code. It does not, by itself, mean we cannot remove
    the function if it's not needed.

    Now, in the existing code, we allowed removal of `extern` free
    standing functions, but not of `extern` methods. That doesn't make
    sense. So this change allows the optimizer to remove any `extern`
    functions/methods if unused by the AST, unless there's something else
    forcing them to stay around (like linkage).

    Unfortunately, our many notions of visibility are a bit of mess (also
    see #2322), and hence technically this needs some pieces. We split the
    optimizer's `mayModify()` method for functions into two separate ones:
    one remains about allowing changes (name stays `mayModify()`, and one
    that is about allowing removal (name `mayRemove()`):

    - `mayModify()` permits changes to function/methods like before with
      two tweaks: 1. any `extern` functions/methods can now be changed;
      and 2. if a function/method has a `&public` attribute, it must not
      be changed. That `&public` attribute is pre-existing, and badly
      named: we actually use it for callback methods that must not change
      their signature (Spicy uses that for its parse1/2/3 functions).

    - `mayRemove()` permits removal of functions in all the same cases as
      `mayModify()`, except that it ignores that `&public` attribute. It's
      fine to remove a `&public` function/method if it's not used
      anywhere.

    For consistency, the non-function versions of `mayModify()` get
    renamed to `mayModifyOrRemove()`.

    Two small additional changes:

    - We had lost marking `&cxxname` functions as "defined" for dead code
      analysis, so we bring this back.

    - The validator did not permit `&always-emit` for functions, which is
      useful for testing.

    This all makes the optimizer slightly more aggressive, which leads to
    a few baseline changes and tests that need to switch to
    ``--strict-public-api`` to remain useful.

  * When computing dataflow, apply same logic for member calls that we do already for function calls. (Robin Sommer, Corelight)

    Doesn't change any semantics right away, but will be used (and needed)
    by upcoming change.

1.17.0-dev.207 | 2026-08-10 18:48:43 +0200

  * Run BTest in windows CI job with default parallelism (Benjamin Bannier, Corelight)

    No idea why we picked five jobs here, but hardcoding any number is
    problematic since it can deviate wildly from what the actual runner has.
    Currently the GH action runner gets four cpus, so we slightly
    oversubscribed.

  * Reject `new T(args)` when T has no type parameters (Benjamin Bannier, Corelight)

    Previously, `new T(args)` would silently discard arguments when T
    declared no type parameters -- codegen produced a default-constructed
    object. Now the validator rejects such calls unless the single argument
    is copy construction (same type as T).

  * GH-2460: Support copy construction in `new T(x)` codegen (Benjamin Bannier, Corelight)

    When `new T(x)` is used with a single argument whose type matches
    `T` (directly or through any reference type), compile it as copy/move
    construction rather than routing through the type-parameter
    constructor path. Previously, if `T` had no type parameters,
    `compileCallArguments` would return an empty list and the argument
    was silently dropped, producing a default-constructed object.

    Closes #2460.

  * GH-2456: Fix dependency tracking for external `QualifiedType` nodes (Benjamin Bannier, Corelight)

    External `QualifiedType` nodes reference resolved types via a type index
    rather than as AST children. The dependency tracker's `follow()` only
    traverses child nodes, so these types were invisible to it. After AST
    transforms lower `&convert` attributes into implementation code, the
    original `expression::Name` references disappear and external
    `QualifiedType` nodes become the sole path to the type. Compilation
    units referencing such types then fail due to missing declarations.

    The self-reference guard prevents spurious self-dependencies that would
    otherwise arise from a unit's own parse methods referencing its type,
    which downstream causes incorrect `&on-heap` annotations.

  * Fix namespace for type code emission during C++ codegen (Benjamin Bannier, Corelight)

    We now enter the correct namespace before emitting a type declaration's
    implementation code during `Phase::Functions`. Previously the formatter
    stayed in whatever namespace the previous declaration left active,
    causing C++ compilation failures when declaration ordering placed a
    type's code after an unrelated namespace block.

    The sensitivity to module naming (e.g., "Consumer" failing while "foo"
    works) comes from declaration insertion order: the dependency graph
    traversal places different declarations between a type's struct code
    and its implementation depending on names, which changes whether an
    intervening declaration switches the formatter's active namespace away.

1.17.0-dev.201 | 2026-07-31 13:54:20 +0200

  * Correctly set up driver when invoked without path (Benjamin Bannier, Corelight)

    When a driver instance is invoked without path, e.g., via `PATH` lookup
    we previously would not set up infra correctly which for some cases
    would leave the configuration in broken state, e.g., this surfaced with
    zeek/zeek's `spicyz` when using during its test suite. Instead just use
    the correct setup.

  * Express dependency on 3rdparty headers in config, not via symlinks (Benjamin Bannier, Corelight)

    We previously used symlinks to contain how 3rdparty headers we ship are
    used throughout the runtime libraries. Since we could do without the
    symlinks for nlohmann/json in a previous commit (actually there we could
    not make the symlinks work at all), I believe there is no good reason to
    keep using them for other dependencies either, so this commit moves us
    over to explicitly expressing the dependencies in both the CMake setup
    as well as in the flags construction for code compilation after install.
    This does not seem much more complicated to me, but it removes one
    additional fragile component in the workflow we needed to worry about.

  * Remove dead ghc link in 3rdparty runtime include directory (Benjamin Bannier, Corelight)

    We dropped this dependency some time ago, but never cleared out the
    symlink.

  * Bump nlohmann/json to v3.12.0 (Benjamin Bannier, Corelight)

  * Use a directory symlink for nlohmann/json as well (Benjamin Bannier, Corelight)

    We usually pull 3rdparty modules into our runtime prefix directory with
    directory symlinks. For nlohmann/json we used a different approach since
    their headers are not self-contained, but they provided a subdirectory
    `single_include/` which was meant to provide self-contained headers; we
    symlinked individual source files there directly to make this work.

    With json-3.11.0 even the `single_include/` headers now require additional
    headers, so this approach no longer works. Instead we switch to a directory
    symlink like for other 3rdparty dependencies, and thread the include path
    for `3rdparty/json/include` through in a couple more places.

    On Windows, Git does not create correct symlinks pointing into submodule
    content during main-tree checkout: `3rdparty/json/include/nlohmann` does not
    exist yet when the `hilti/rt/3rdparty/nlohmann` symlink is created because
    the submodule is only an empty placeholder at that point. The other
    `3rdparty/` directory symlinks point directly at submodule roots, which Git
    creates as empty placeholder directories before populating them, so those
    symlinks worked. For that reason we include nlohmann headers via the bare
    `nlohmann/` path in `json-fwd.h` and `json.h` which resolves via
    `3rdparty/json/include` at build time and via the `hilti/rt/3rdparty`
    install-time include root post-install. This root is listed before the
    general include prefix so that our bundled headers take precedence over
    any system-installed copies.

  * Move from vendored nlohmann/json back to submodule (Benjamin Bannier, Corelight)

    We moved to vendored sources to work around an embarrassing, big blob in
    nlohmann/json's Git history, but since submodules can be shallow this
    isn't really needed. It also makes bumping this particular dependency
    much harder which is why it is much further behind compared to others.

    This patch moves nlohmann/json back to a Git submodule, this time
    shallow.

  * Switch to shallow submodules (Benjamin Bannier, Corelight)

    There is no good reason to pull the full Git history of submodules, so
    this switches all of them to use shallow clones to speed up recursive
    clones. I am not sure why this is not the default behavior of Git
    submodules.

  * Switch Docker layer cache from GHA to GHCR (Benjamin Bannier, Corelight)

    The GHA cache has a 10 GB limit shared across all workflows, causing
    frequent evictions and poor hit rates for our large CI matrix. GHCR
    container storage is currently free with no stated cap (GitHub commits
    to one month notice before changing this).

  * GH-13213: Fix RTD build broken by uv 0.12 relative path bug [skip ci] (Benjamin Bannier, Corelight)

    RTD's uv 0.12 integration passes `UV_PROJECT` as a relative path but
    runs commands from a different CWD, causing "Project directory does
    not exist" errors (readthedocs/readthedocs.org#13213).

    Work around by overriding `create_environment` and `build.html` with
    absolute paths.

1.17.0-dev.189 | 2026-07-30 08:50:23 +0200

  * GH-62: GH-1102: Do not include debug info in non-debug HLTO files (Benjamin Bannier, Corelight)

    Including debug information significantly increases the size of these
    artifacts, something users have often complained about. Additionally,
    compiling with both `-O3` and `-g` can make release builds even slower.

    Since no user-visible feature depends on this, codegen is mostly
    identical between between, and I do not recall ever being unable to
    debug an issue which required debug symbols in release HLTO files,
    simply drop the flag. If this is really needed, we could always patch it
    back in temporarily while debugging without affecting all users.

    Closes #62.
    Closes #1102.

  * Bump softprops/action-gh-release from 3.0.1 to 3.0.2 (dependabot[bot])
  * Bump actions/checkout from 7.0.0 to 7.0.1 (dependabot[bot])
  * Bump CodSpeedHQ/action from 4.18.1 to 4.19.1 (dependabot[bot])
  * Bump 3rdparty/vcpkg from `fab1c6d` to `b6b50b3` (dependabot[bot])

1.17.0-dev.183 | 2026-07-28 15:36:31 -0400

  * GH-1960: Implement optimizer pass to `move` last uses (Evan Typanski, Corelight)

    Closes #1960

    Adds an optimization pass that adds moves when it's the last use. This is
    relatively conservative; it doesn't try to understand expression ordering
    and won't move in many cases. But, in user-code (not generated parser
    code) this could give a bit of a speedup.

    The analysis is just a liveness analysis. If the name isn't live after a
    CFG node, we theoretically can move it.

  * Fix CFG for switch cases (Evan Typanski, Corelight)

    The CFG was making many parallel branches for a switch:

    This bug would make 's' appear dead after each case expression
    (comparison with "a", "b", and "c") when in reality it's only dead after
    the comparison with "c".

    This just updated the switch CFG baselines, since including the test for
    move last uses that caused it (basically a switch over multiple strings)
    would require baselining C++, which is a bit brittle.

  * Make hilti moves a RT function (Evan Typanski, Corelight)

    This avoids adding C++ semantics to the hilti codegen. Instead, it's just
    a runtime helper that moves-or-not.

    This also uncovered a "bug" in codegen: switch statements used auto&&,
    which could bind to an lvalue, but everything in hilti sees it as an
    rvalue. This was fixed in the commit before, but it arose because of
    this and the move last uses optimizer pass.

  * Make `switch` and `if` assignments into values (Evan Typanski, Corelight)

    When making optimizer passes, the values from initializers in switch and
    if statements look like values, not references. Using `&&` can make a
    reference, which would make the optimizer do the wrong thing if it messed
    with it.

    This forces them to just use `auto` so that future optimizer passes don't
    accidentally move from an aliased reference, for example.

1.17.0-dev.178 | 2026-07-28 20:53:34 +0200

  * Drop unnecessary CMake policy changes (Benjamin Bannier, Corelight)

    Since we require cmake-3.15 these did nothing and can be dropped without
    problem.

1.17.0-dev.176 | 2026-07-27 16:48:21 +0200

  * GH-2438: Fix parsing of regexps with capture groups in lookahead (Benjamin Bannier, Corelight)

    The lookahead fast path consumed the look-ahead token and skipped the
    regex loop, so capture groups were never populated. For regexp fields
    that have captures, we now skip the fast path and let the regex loop run
    instead so captures are filled normally.

    Fixes #2438.

  * Remove capture group in `spicy.types.unit.synchronize-on-gap` test (Benjamin Bannier, Corelight)

    The test was using a capture group when all it cared about was an
    alternation.

1.17.0-dev.173 | 2026-07-23 14:53:51 +0200

  * Fix warning about implicit integer conversion (Tim Wojtulewicz, Corelight)

  * Make if statement that is only typechecking as constexpr (Tim Wojtulewicz, Corelight)

  * Fix compiler warnings about missing virtual destructors for classes with virtual methods (Tim Wojtulewicz, Corelight)

  * Fix compiler warnings about unused arguments (Tim Wojtulewicz, Corelight)

  * Fix compiler warning about shadowed member variable (Tim Wojtulewicz, Corelight)

  * Use #ifdef instead of #if when checking for existence of definition (Tim Wojtulewicz, Corelight)

1.17.0-dev.166 | 2026-07-21 21:28:15 +0200

  * GH-2439: Add missing `operator<<` for a bunch of runtime enum types (Benjamin Bannier, Corelight)

    These had implementations of `to_string` so we could e.g., use them with
    `print`, but were missing `operator<<` which is required for formatting
    with `"..." % ..`, so this commits adds them.

    Closes #2439.

1.17.0-dev.164 | 2026-07-15 09:13:40 -0400

  * GH-2433: Fix FP cycle in types with sequential, same types (Evan Typanski, Corelight)

    Fixes #2433

    This would cause an error:

    cycle detected in definition of type 'Test::S'

    Since there's logic for QualifiedTypes to use the unification if it
    exists, the operand list should use it, too. Before, it would always
    use the unqualified check (with the occurs check), which meant that it
    would report cycles for sequential types that were the same (ie two
    parameters with the same struct type).

  * Fix unresolved struct `self` in replacement (Evan Typanski, Corelight)

    If a hilti struct got the local decl replaced by its RHS when removing
    the dead store, the new RHS would not be resolved. This would mean that
    `self` does not properly resolve anymore. Instead, make sure the RHS gets
    resolved if anything is replaced.

    This would trigger an internal error between optimizer passes, with an
    AST dump of the offending node first:

      [internal-error] declaration without canonical ID found: self

1.17.0-dev.161 | 2026-07-14 14:40:41 +0200

  * Synchronize minimum GCC version in CMake setup with docs (Benjamin Bannier, Corelight)

    In 2bcf518c28fa8439e3253d866800eaaa84fa4e07 we bumped the minimum
    required GCC version in the docs to a version with better support for
    ranges, but missed updating the CMake version check. This patch fixes
    the CMake requirements as well.

1.17.0-dev.159 | 2026-07-13 21:31:55 +0200

  * Use standard-compliant type for `std::string_view` iterator type (Benjamin Bannier, Corelight)

    We previously assumed that `std::string_view` used `const char*` as
    underlying iterator type, but this is not in the standard and in fact
    msvc deviates. Use a generic iterator type instead.

    This fixes a regression introduced in
    7c0a1f12cd672dacd28573f974c59eb30b035f69.

    fixup! Change `hilti::rt::atoi_n` to take a `string_view`

1.17.0-dev.157 | 2026-07-13 16:22:59 +0200

  * Locally suppress GCC false positive (Benjamin Bannier, Corelight)

  * Bump to llvm-22 in CI (Benjamin Bannier, Corelight)

  * Disable clang-tidy diagnostics triggered in generated code (Benjamin Bannier, Corelight)

    We use macros to generate classes for the different AST nodes. The way
    we use these can lead to inconsistent uses of `public` or `protected`
    declarations, or lead to shadowing. We should definitely fix these
    eventually, but this is a bigger exercise, so we simply disable the
    diagnostics at this point.

  * Address misc-unused-parameters diagnostics (Benjamin Bannier, Corelight)

  * Address modernize-make-unique diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-use-after-move diagnostics (Benjamin Bannier, Corelight)

  * Address modernize-use-designated-initializers diagnostics (Benjamin Bannier, Corelight)

  * Address readability-container-contains diagnostics (Benjamin Bannier, Corelight)

  * Address readability-redundant-string-cstr diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-suspicious-stringview-data-usage diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-string-literal-with-embedded-nul diagnostics (Benjamin Bannier, Corelight)

  * Address performance-unnecessary-value-param diagnostics (Benjamin Bannier, Corelight)

  * Address readability-qualified-auto diagnostics (Benjamin Bannier, Corelight)

  * Address performance-no-int-to-ptr diagnostics (Benjamin Bannier, Corelight)

  * Address readability-redundant-member-init diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-unintended-char-ostream-output diagnostics (Benjamin Bannier, Corelight)

  * Address modernize-type-traits diagnostics (Benjamin Bannier, Corelight)

  * Address performance-move-const-arg diagnostics (Benjamin Bannier, Corelight)

  * Address readability-math-missing-parentheses diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-std-namespace-modification diagnostics (Benjamin Bannier, Corelight)

  * Address misc-use-internal-linkage diagnostics (Benjamin Bannier, Corelight)

  * Address misc-multiple-inheritance diagnostics (Benjamin Bannier, Corelight)

  * Address bugprone-throwing-static-initialization diagnostics (Benjamin Bannier, Corelight)

    This only fixes a small number of issues since we still use many globals
    of types with potentially throwing constructors, e.g., since they
    allocate memory for internal strings. Overall we are pretty liberal with
    global variables which is not great, but still a prevalent pattern.
    Fixing these requires more work, so we disable the diagnostic for now.

  * Address bugprone-narrowing-conversions diagnostics (Benjamin Bannier, Corelight)

  * Address modernize-avoid-c-style-cast diagnostics (Benjamin Bannier, Corelight)

  * Address readability-redundant-typename diagnostics (Benjamin Bannier, Corelight)

  * Address readability-redundant-parentheses diagnostics (Benjamin Bannier, Corelight)

  * Fix clang-tidy config to correctly inherit checks defined in parent dir (Benjamin Bannier, Corelight)

  * Adapt logger classes for noexcept use (Benjamin Bannier, Corelight)

    We typically create global static variables for the different
    `DebugStream` values. In such a context we would not want to throw, so
    this patch adjusts `DebugStream` so its constructor cannot throw. This
    requires removing some allocations so we now use `std::string_view`
    instead of `std::string` throughout.

  * Only enable clang-tidy in CI if requested (Benjamin Bannier, Corelight)

  * Move LLVM version management from GH actions workflow into Docker image (Benjamin Bannier, Corelight)

  * Change `hilti::rt::atoi_n` to take a `string_view` (Benjamin Bannier, Corelight)

    This function previously accepted and returned generic iterators. This
    not only made calling it potentially error prone, but also lead to some
    awkwardness in using its return value (e.g., use of iterator math to
    decide whether anything was consumed). On the implementation side, it
    also restricted what operations were possible on the passed iterators
    which would make e.g., rewriting the function in terms of
    `std::from_chars` harder than needed.

    This patch changes the function to instead accept `std::string_view`
    instead, and return the number of consumed bytes.

  * Add benchmark for `hilti::rt::atoi_n` (Benjamin Bannier, Corelight)

1.17.0-dev.123 | 2026-07-10 14:19:10 -0400

  * Mark `profiler::stop` first param as `inout` (Evan Typanski, Corelight)

    It gets used as a reference and changed, so it should be inout.

  * Add `isAnyOf` to Node (Evan Typanski, Corelight)

    This is useful in a few places already, and I wanted it for some future
    stuff.

1.17.0-dev.114 | 2026-07-07 14:41:15 +0200

  * Do not fetch tags in CI (Benjamin Bannier, Corelight)

    This probably has not been needed since the time we commit `VERSION` to
    the repository. Dropping it since it messes with shallow clones.

  * Prefer `find_package` with version requirement instead custom function (Benjamin Bannier, Corelight)

  * Drop unused `cmake/TypeErase.cmake` (Benjamin Bannier, Corelight)

    We have stopped using these a longer time ago.

  * Fix CMake deprecation warnings from `3rdparty/fiber` (Benjamin Bannier, Corelight)

    The fiber library requires too low CMake versions in the
    `cmake_minimum_required` of its own dependencies with triggers
    deprecation warnings. With this patch we enforce a minimum requirement
    for 3rdparty projects consistent with our own.

  * Correctly override `3rdparty/fiber` CMake option (Benjamin Bannier, Corelight)

    We were setting a variable when `3rdparty/fiber` was declaring an
    option. This triggers a warning in recent CMake versions, so with this
    patch we now set the option like intended.

  * Bump 3rdparty/doctest (Benjamin Bannier, Corelight)

  * Fix potential ambiguity when stringifying parser maps in tests (Benjamin Bannier, Corelight)

    In these tests we stringify parser maps which contain pointers. In newer
    doctest versions the stringification of these pointers becomes ambiguous
    (pointer versus integers of varying widths). Address this locally by
    implementing a dedicated stringifier for tests with these parser maps.

1.17.0-dev.106 | 2026-07-06 09:17:01 +0200

  * Update release workflow (Benjamin Bannier, Corelight)

    We previously dropped publishing of binary artifacts, but hadn't updated
    the release workflow for that yet. This patch does that, and also
    performs a bunch of bumps and pins of actions that workflow uses.

1.17.0-dev.104 | 2026-06-30 18:19:47 +0200

  * GH-2336: Fix regression causing removal of used fields (Benjamin Bannier, Corelight)

    In 09c092a9733 from #2336 we changed how a number of optimizer passes
    reference functions. A cleanup there caused a regression in the
    `RemoveUnusedFields` pass so that we now remove fields even though they
    are used. This leads to compilation failures, e.g., in Zeek's builtin
    PostgreSQL parser.

    Since that pass works on fields instead of general functions this patch
    simply reverts the cleanup in that pass.

1.17.0-dev.102 | 2026-06-26 17:07:19 +0200

  * Inside optimizer, index per-function state by canonical ID. (Robin Sommer, Corelight)

    We were using `fullyQualifiedId()`, which isn't unique across module
    imports: separate functions can have the same FQID inside a single
    AST.

    To facilitate the switch, we replace
    `declaration::Function::functionID()` with ``Optimizer::functionID()`
    that returns a function/method's canonical ID but follows any linked
    declarations to its prototype before doing so. That way, it returns an
    ID that's suitable to use as an index inside optimizer passes to store
    state per function.

    We then use that consistently across the optimizer.

    Couple related tweaks included:

    - `dead-code-static` now resolves `MemberCall` targets via
      `op.declaration()` instead of `type::Struct::field(id)`, which only
      returned the first matching field and masked overload bugs.

    - `remove-unused-params` skips parameter removal when a struct has
      overloaded methods of the same name, since stripping unused
      parameters under canonical ID keys can collapse overloads to
      identical signatures.

  * Link free-function implementations to their prototypes. (Robin Sommer, Corelight)

    When a free function is declared separately from its implementation,
    the resolver now links the implementation to its prototype.
    Previously, we did this only for methods, which means AST consumers
    had to handle free functions themselves.

1.17.0-dev.99 | 2026-06-26 16:47:52 +0200

  * Switch docs dep management from `requirements.txt` to `pyproject.toml` (Benjamin Bannier, Corelight)

    Using a `pyproject.toml` simplifies virtualenv management with tools
    like `uv`, and I have been using this configuration for years.

  * Update documentation for removal of release package artifacts (Benjamin Bannier, Corelight)

    This drops the previous section on how to install from packages, and
    expands on how to build from source.

  * Update link to Zeek installation instructions (Benjamin Bannier, Corelight)

    Previously we would point to a placeholder doc instead of actionable
    instructions on how to install Zeek including Spicy.

1.17.0-dev.95 | 2026-06-26 10:28:13 +0200

  * GH-2414: Allow disabling of building of benchmarks (Benjamin Bannier, Corelight)

    We have a reoccurring and hard to diagnose issue with the
    google/benchmark dependency failing to detect the regex backend, #2414.
    Since the benchmarks and their dependencies are not needed during
    regular use, add a configure option `--disable-benchmarks` and a CMake
    variable `SPICY_ENABLE_BENCHMARKS` to allow turning benchmarks off.

1.17.0-dev.93 | 2026-06-17 12:34:15 +0200

  * Stop emitting unneeded constructor in codegen for list comprehensions (Benjamin Bannier, Corelight)

    Since `Set` can implicitly construct from an initializer list, there is
    no need to add an explicit constructor call, so in this patch we remove
    it to further reduced potential for us accidentally generating code
    causing most vexing parses.

  * Disambiguate constructor calls from function declarations (Benjamin Bannier, Corelight)

    We previously called constructors as `T(..)` which without context could
    lead to most vexing parses. In this patch we replace most constructor
    calls in type creations and coercions with `T{..}` instead to avoid any
    downstream issues, especially since we have passes which might remove
    the LHS.

  * GH-2404: Include coercions in detection of expressions with side effects (Benjamin Bannier, Corelight)

    We previously would always consider expressions with coercions as having
    side effects which in at least #2404 lead to us generating code which
    caused a most vexing parse. Since coercions do not have side effects
    themself, extend our detection to include them by querying the behavior
    of the coerced expression. This should fix the majority of new failures
    introduced by recent rewrites which removed the LHS of assignments; we
    will do more structural fixes in follow-up patches.

    Closes #2404.

1.17.0-dev.89 | 2026-06-16 11:56:14 +0200

  * Drop duplicate dependency install (Benjamin Bannier, Corelight)

    This should be a non-functional change.

  * Bump 3rdparty/libunistd for compatibility with newer CMake (Benjamin Bannier, Corelight)

  * Do not hardcode paths to Visual Studio installation (Benjamin Bannier, Corelight)

    On 2026-06-15 Github switched the `windows-2025` runner to mean instead
    `windows-2025-vs2026`^[1]. This caused our Windows CI job to break since
    it hardcoded the path to the Visual Studio installation.

    This patch instead switches scripts over to use the environment variable
    `VSINSTALLDIR` instead which is set up by our CI environment.

    [1]: https://github.com/actions/runner-images/issues/14017

1.17.0-dev.85 | 2026-06-12 09:59:25 +0200

  * Bump docker/build-push-action from 7.1.0 to 7.2.0 (dependabot[bot])

  * Bump CodSpeedHQ/action from 4.15.1 to 4.17.0 (dependabot[bot])

  * Bump 3rdparty/vcpkg from `41ff869` to `9849e07` (dependabot[bot])

  * Bump 3rdparty/utfcpp from `660314d` to `819011b` (dependabot[bot])

  * Bump hendrikmuhs/ccache-action from 1.2.22 to 1.2.23 (dependabot[bot])

1.17.0-dev.79 | 2026-06-12 09:54:41 +0200

  * Cache docker image directly with official Docker actions (Benjamin Bannier, Corelight)

1.17.0-dev.77 | 2026-06-11 11:06:28 +0200

  * GH-2399: Additional fixes for #2399 (Craig Leres)

    Here are more changes needed to compile spicy (zeek) on FreeBSD 16
    current after 86326398b73b. Thanks to @bbannier.

1.17.0-dev.75 | 2026-06-10 15:58:49 +0200

  * Do not assume `assert` performs C++26 contextual conversions (Benjamin Bannier, Corelight)

    In C++20 `assert` is standardized to take a scalar type, and the
    assertion triggers if the passed value is zero. Our uses of requiring
    set `std::unique_ptr` values conflicted with that, e.g., in

        assert(some_unique_ptr_value);

    the argument is not a scalar and since `std::unique_ptr`'s `operator
    bool` is `explicit` also not implicitly convertible to a `bool` which
    would be a scalar value. That this worked at all likely came from the
    fact that most implementations of `assert` perform explicit conversions
    to `bool`, but this is not required until C++26, see P2264R7 which
    for `assert` introduced the notion of "contextually convertible" which
    would apply here for `std::unique_ptr`. The concrete case were our
    current code was failing were implementations of `assert` on freebsd-16
    could be defined in a way which performed no explicit conversion.

        #define __assert_sanitize(...)  (void)sizeof(((bool(*)(bool))0)(__VA_ARGS__))

    This patch updates uses of `assert` with `std::unique_ptr` to explicitly
    convert to a scalar value via `get` where we previously passed the
    `std::unique_ptr` directly. We do not need to touch instances where we
    already converted the argument to `assert` to `bool`, either
    contextually or explicitly.

1.17.0-dev.73 | 2026-06-10 12:49:15 +0200

  * Fix windows workflow cache key (Benjamin Bannier, Corelight)

    This was not a matrix job, so `matrix.release` did not exist.

  * Display BTest errors in windows CI (Benjamin Bannier, Corelight)

  * Fix msvc warnings about unused parameters (Benjamin Bannier, Corelight)

    Instead of fixing all instances where msvc warns about this, address
    this globally by addressing everything clang-tidy's
    `misc-unused-parameters` lint reports. That lint support automatic
    updates with a fixit, so almost all changes here were done
    automatically; the only manual tweaks were updating uses of the
    constructor of `ProductionFactory` where clang-tidy correctly dropped a
    parameter, but did not update all users, and a removal of a now unused
    value around use of the resolver's `fieldType` method.

  * Implement rule-of-five for `FiberContext` (Benjamin Bannier, Corelight)

  * Implement rule-of-five for generated exceptions (Benjamin Bannier, Corelight)

  * Fix arg type in `Bytes::match` to avoid possible unintentional widening (Benjamin Bannier, Corelight)

  * Fix msvc warning about widening cast from `uint32_t` to 64-bit `void*` (Benjamin Bannier, Corelight)

  * Make implicit cast `size_t`->`int` explicit (Benjamin Bannier, Corelight)

    msvc warned about this, but it should always have been safe. Fix it
    nevertheless.

  * Be explicit about type to prevent possible narrowing (Benjamin Bannier, Corelight)

    msvc warned about this

    ```
    2
    C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\numeric(31): warning C4267: '=': conversion from 'size_t' to '_Ty', possible loss of data
    C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\numeric(31): note: the template instantiation context (the oldest one first) is
    ..\hilti\toolchain\src\compiler\optimizer\passes\dead-code-static.cc(68): note: see reference to function template instantiation '_Ty std::accumulate<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const hilti::ID,std::map<std::string,bool,std::less<std::string>,std::allocator<std::pair<const std::string,bool>>>>>>>,unsigned int,`anonymous-namespace'::Collector::run::<lambda_1>::()::<lambda_1>>(const _InIt,const _InIt,_Ty,_Fn)' being compiled
                _InIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const hilti::ID,std::map<std::string,bool,std::less<std::string>,std::allocator<std::pair<const std::string,bool>>>>>>>,
                _Fn=`anonymous-namespace'::Collector::run::<lambda_1>::()::<lambda_1>
    ```

  * Suppress warnings from libunistd (Benjamin Bannier, Corelight)

    With msvc this triggers a lot of warnings of the following form which
    are not interesting for us to fix.

    ```
    [162/444] Building CXX object hilti\toolchain\CMakeFiles\hilti-objects.dir\src\base\code-formatter.cc.obj
    ..\3rdparty\libunistd\unistd\unistd.h(79): warning C4273: 'read': inconsistent dll linkage
    C:\Program Files (x86)\Windows Kits\10\include\10.0.26100.0\ucrt\corecrt_io.h(525): note: see previous definition of 'read'
    ```

  * Fix declaration misplaced in include section (Benjamin Bannier, Corelight)

  * Consistently use `[[noreturn]]` in favor of compiler-specific attributes (Benjamin Bannier, Corelight)

    This also addresses the issue of a couple of functions not being marked
    noreturn for msvc which caused it to emit warnings about unhandled code
    paths.

  * Hide GCC pragma from other compilers (Benjamin Bannier, Corelight)

  * Add missing cast (Benjamin Bannier, Corelight)

    This cast is already present in other places, but was missed here.

1.17.0-dev.58 | 2026-06-10 09:00:57 +0200

  * Drop FreeBSD from CI (Benjamin Bannier, Corelight)

    Zeek has already removed FreeBSD from the list of supported platforms
    and from testing, do the same here.

  * Only run benchmarks on PRs targeting main (Benjamin Bannier, Corelight)

    Codspeed only stores benchmark results for the `main` branch, so any PR
    to other branches like `release/1.14` might report uninteresting
    regressions since we do not do feature development on these branches.

1.17.0-dev.55 | 2026-06-09 11:27:45 +0200

  * add windows variant to spicyc-cxx-link (Maor Hamami)

  * replace temp dir with dir on exe location (Maor Hamami)

  * [windows] fix btests failures (Maor Hamami)

1.17.0-dev.51 | 2026-06-08 15:00:48 +0200

  * Skip leak tests unless running on Linux (Benjamin Bannier, Corelight)

    Clang's leak sanitizer is only supported on Linux at the moment, so skip
    tests relying on it on all other platforms.

  * Avoid overflows when checking coercion from `real` to integer type (Benjamin Bannier, Corelight)

    The casts from `double` to integral type could previously trigger UB at
    compile time if the `double` value was outside of the range of the
    integral type, NaN or infinity. To handle this correctly we add a range
    check in this patch. Due to the way comparisons against float NaN and
    infinity work they are also handled.

1.17.0-dev.48 | 2026-06-08 12:07:55 +0200

  * Avoid underflow in `atoi_n` (Benjamin Bannier, Corelight)

    We had previously fixed some overflows in this function, but missed a
    case when extracting `INT64_MIN`. We were already parsing the absolute
    value with enough range, but could underflow when negating it for the
    final result since the negation was done in the target type which did
    not have enough range.

    With this patch we instead perform the negation in the unsigned type
    which has enough range, and only cast to the target type after.

1.17.0-dev.46 | 2026-06-05 13:46:40 +0200

  * Handle overflows in `atoi_n` (Benjamin Bannier, Corelight)

1.17.0-dev.44 | 2026-06-03 18:39:40 +0200

  * Do not run concurrent GH actions workflow for anything but tags [skip ci] (Benjamin Bannier, Corelight)

    While Cirrus CI only cancelled concurrent jobs for the same PR, this
    goes a step further and cancels existing jobs for anything but tag
    builds. For `master` this reflects our workflow of pushing individual
    merges in rapid succession where we only care about the last push. This
    should free up additional resources so jobs can schedule faster.

  * Automatically cancel existing GH CI workflows on PR update (Benjamin Bannier, Corelight)

    Previously we would run all GH actions CI workflows to completion, even
    if the PR was updated and another run was started. Since we only have a
    limited number of workers available this causes contention across the
    whole GH org. It is also inconsistent with how Cirrus CI behaved, so
    people are not at all conscious about cancelling outdated jobs.

    This PR changes the configuration of all workflows which trigger for
    pull requests to automatically cancel existing jobs on updates,
    mirroring the behavior of Cirrus CI.

1.17.0-dev.41 | 2026-06-02 19:27:42 +0200

  * Enable additional clang-format settings which reflect our current style (Benjamin Bannier, Corelight)

  * Make breaking of arguments and parameters more readable (Benjamin Bannier, Corelight)

    We previously had bin packing of arguments and parameters enabled; in
    that setting `clang-format` would try to put as many arguments as
    possible on a line before breaking due to the maximum line length. I
    suspect this was inspired by the style used by Zeek script at some
    point, and IMO trades readability for a more compact layout.

    Since we often pass many parameters, perform complex operations on them,
    or have overloads with optional parameters this could obscure what was
    passed or called. With this patch we use settings with either puts all
    parameters on a single line or each on its own.

  * Stop allowing multiple empty lines in C++ code (Benjamin Bannier, Corelight)

    At some point this seems to have been intended to logically break bigger
    blocks of code, but it never seems to have been used consistently.
    Instead it probably more often than not leaked into the code by
    accident, so let's simply not allow it anymore.

1.17.0-dev.37 | 2026-06-02 19:27:22 +0200

  * Add centos-stream-10 to CI (Benjamin Bannier, Corelight)

    This was added by Zeek, but never added here.

1.17.0-dev.35 | 2026-06-02 19:26:51 +0200

  * Handle overflows when checking whether an integer can coerce to `real`. (Benjamin Bannier, Corelight)

    We were already handling the loss of precision, but not overflow.

1.17.0-dev.33 | 2026-06-02 11:12:13 -0400

  * Bump 3rdparty/benchmark to 1.9.5 (Evan Typanski)

1.17.0-dev.31 | 2026-06-01 12:39:23 +0200

  * Stop requiring git commit titles to end in `.` [skip ci] (Benjamin Bannier, Corelight)

    This deviated from the convention in all other Zeek projects and
    always tripped me up. In the past the trailing dot also made downstream
    use harder, e.g., proper PR titles would have it autoadded which I
    always tried to remove, or when assembling release notes.

1.17.0-dev.29 | 2026-06-01 12:37:57 +0200

  * Update build status links in README. (Benjamin Bannier, Corelight)

  * Remove Cirrus CI setup. (Benjamin Bannier, Corelight)

    With the introduction of a GH actions CI setup we updated some scripts
    used by the Cirrus CI setup so they work on CI images provided by GH
    actions; this caused Windows CI to break on Cirrus CI. In any case
    Cirrus CI will go away in a couple days anyway.

1.17.0-dev.26 | 2026-05-28 16:58:12 +0200

  * Also run CI on `main` branch ¯\_(ツ)_/¯. (Benjamin Bannier, Corelight)

1.17.0-dev.24 | 2026-05-28 16:15:58 +0200

  * Add Github Actions CI. (Benjamin Bannier, Corelight)

1.17.0-dev.22 | 2026-05-21 15:43:16 +0200

  * Bump 3rdparty/vcpkg from `940f587` to `41ff869` (dependabot[bot])
  * Bump 3rdparty/utfcpp from `9dd9052` to `660314d` (dependabot[bot])

1.17.0-dev.19 | 2026-05-20 14:41:28 +0200

  * Fix Fiber constructor clobbering shared stack. (Arne Welzel, Corelight)

    Previously, when constructing a Fiber with type SharedStack, we'd
    initialize the underlying fiber with the global shared stack. This
    isn't safe: The fiber_init() call writes to the shared stack, but
    there's no guarantee that the shared stack isn't being used by
    another fiber when this happens.

    Circumvent this by moving the underlying fiber initialization into
    __fiber_switch_trampoline(), where it is guaranteed that the previously
    executing fiber has saved() the shared stack so that it is now free
    to be used by a different fiber. Use the nullptr fiber_stack() return
    as the indicator, that the initialization still needs to happen.

1.17.0-dev.17 | 2026-05-19 15:51:00 +0200

  * GH-2358: Reject patterns containing non-ASCII characters. (Benjamin Bannier, Corelight)

    Closes #2358.

1.17.0-dev.15 | 2026-05-18 16:01:42 +0200

  * Fix potential nullptr dereference in remove-unused-fields pass. (Benjamin Bannier, Corelight)

    This was introduced in 79d44f786c so needs to be backported to
    release/1.16.

1.17.0-dev.13 | 2026-05-13 15:04:46 +0200

  * GH-1829: Switch back to upstream version of 3rdparty/SafeInt. (Benjamin Bannier, Corelight)

    We moved to our own fork of SafeInt because of #1829. It looks like
    upstream has fixed enough for us to switch back to them. It might be
    that more related changes are incoming, but we can follow up on them
    separately.

1.17.0-dev.11 | 2026-05-12 15:25:29 -0400

  * Prefer worklist algorithm to fixed point iteration. (Evan Typanski, Corelight)

    Talked with Gemini to get the worklist idea

    When aliasing, we know which nodes will need their aliases recalculated.
    Use that info to create a worklist, rather than unconditionally running
    another N^2 times.

  * GH-2258: Fix transitive aliases. (Evan Typanski, Corelight)

    Fixes #2258

    Consider a program where a has two direct aliases: b and p. Then, b has
    an alias c. p and c must alias, or else writes to p might be removed.
    This forces that by unioning alias sets until convergence.

    There are other ways to ensure aliases are unioned (see: union-find) but
    this is the simplest way, albeit a little slow.

1.17.0-dev.3 | 2026-05-11 17:08:26 +0200

  * Bump visualstudio2022buildtools to 117.14.29 in CI (Benjamin Bannier, Corelight)

  * Add ccache to Windows CI. (Benjamin Bannier, Corelight)

  * Start of v1.17.0 development. (Benjamin Bannier, Corelight)

1.16.0 | 2026-05-05 15:04:16 +0200

1.16.0-dev.173 | 2026-05-05 15:04:03 +0200

  * GH-2351: Fix logic in duplicate switch case detection. (Benjamin Bannier, Corelight)

    This patch fixes jumbled logic in the duplicate switch case detection
    which we were running into for some not foldable case conditions.

    Closes #2351.

1.16.0-dev.171 | 2026-04-24 18:00:46 +0200

  * Remove unnecessary string allocation. (Benjamin Bannier, Corelight)

  * Remove reduction of entropy when computing unique IDs. (Benjamin Bannier, Corelight)

    When computing unique IDs we were internally hashing locations to
    `uint64_t`, but then reducing to `uint16_t`'s range for more readable
    identifiers in generated code. This removes reduces entropy by about
    75%.

    Given how much of a reduction this was it still seems to have worked
    surprisingly well up until de8db5061838a where we now suddenly see
    deterministic hash collisions for a single test in the
    `validate_release_tarball` task; in that case it manifests as two
    distinct hooks being generated with identical C++ identifier. Since this
    seemed so obscure I initially though this to be some memory corruption
    bug, but it turned out mundane in the end.

1.16.0-dev.168 | 2026-04-23 15:21:26 +0200

  * Fix recent issue reported by Coverity. (Benjamin Bannier, Corelight)

1.16.0-dev.166 | 2026-04-23 15:15:54 +0200

  * Extend resolver to unify duplicate case handles. (Robin Sommer, Corelight)

    The resolver now (1) catches if multiple cases inside a switch use the
    same constant, and (2) removes any duplicate constants inside a
    single case. This then allows to codegen to assume that no duplicate
    constants will be encountered across the cases of a switch.

  * GH-2321: Fix missing application of `&bitorder` for bitfields coming with a constraint. (Robin Sommer, Corelight)

    Closes #2321.

  * Fix codegen to emit missing `goto` labels. (Robin Sommer, Corelight)

    If loop statements changed during AST resolving, we wouldn't update
    any linked break statements.

    Also render linked loop statements' identities in debug output in hex,
    for easier comparison to node identities.

1.16.0-dev.160 | 2026-04-23 09:15:13 +0200

  * GH-2321: Fix missing application of `&bitorder` for bitfields coming with a constraint. (Robin Sommer, Corelight)

1.16.0-dev.158 | 2026-04-22 11:40:41 +0200

  * Fix codegen to emit missing `goto` labels. (Robin Sommer, Corelight)

    If loop statements changed during AST resolving, we wouldn't update
    any linked break statements.

    Also render linked loop statements' identities in debug output in hex,
    for easier comparison to node identities.

1.16.0-dev.156 | 2026-04-20 18:29:54 +0200

  * Revert "Produce better C++ code for `switch` statements." (Benjamin Bannier, Corelight)

    This reverts commit 324aee958ec5dd513685faac9ef0d6b94bca2529.

    The patch had a two issues:

    - it did not properly handle `switch` conditions which contained an
      assignment (`switch (local x = cond())`) and never declared the local
      variable when the HILTI `switch` was emitted as a C++ `switch`.
    - it didn't properly handle duplicate case labels. These are allowed in
      HILTI, but not in C++.

    Both these issues cause the Zeek build to fail. Revert this part of the
    PR for now.

  * Fix when we emit constants as `constexpr`. (Benjamin Bannier, Corelight)

    We previously would emit all integer constants as C++ `constexpr`
    constants. This requires that the initializer was also `constexpr` which
    we did not ensure, e.g., it would be possible to initialize a constant
    with the product of two other constants, an example of which exists in
    Zeek's Redis analyzer which MSVC failed to compile.

    This patch changes the codegen so we only emit `constexpr` for constants
    if they were initialized with a literal. This is a regression fix for
    b0ae8045417b3.

1.16.0-dev.153 | 2026-04-17 22:30:34 +0200

  * Add draft v1.16.0 release notes. (Benjamin Bannier, Corelight)

1.16.0-dev.151 | 2026-04-17 17:13:44 +0200

  * Bump to llvm-21 in CI. (Benjamin Bannier, Corelight)

1.16.0-dev.149 | 2026-04-17 10:02:44 -0400

  * GH-2327: Fix regression with val prop names and coercions (Evan Typanski, Corelight)

    Fixes #2327

    Constant propagation added special handling to replace coercions if the
    given expression was coerced. This helps for cases that will then need
    further "work" after constant propagation in order to trigger another
    coercion cycle.

    But, when value propagation gained more abilities, this became a
    liability. Coercions no longer go through the same path and end up
    missing cases. These cases are necessary to stay the same, and we get
    no value in replacing the coercion (eg for `! Null` coercions, those are
    only possible with `Ctor`).

    We need to be a bit pickier about replacing coercions when propagating.

1.16.0-dev.147 | 2026-04-17 10:32:36 +0200

  * Produce better C++ code for `switch` statements. (Robin Sommer, Corelight)

    We now emit actual C++ `switch` statements when the condition is of
    integral or enum type and all case expressions are constant values.
    Otherwise we continue to emit an `if-else` chain as before.

    Note that `break` inside a `case` exits an enclosing loop, if any; not
    the `switch`. We were potentially emitting broken code there before,
    although that situation should have been rare (`break` inside `case`
    inside `while/for`).

  * Fix operator resolving involving global constants. (Robin Sommer, Corelight)

    This would not find the intended operator:

    ```
    module Test {

    const CONST = 1;
    assert CONST != -1; #  unsupported operator: <uint<64>> != <int<64>>

    }
    ```

    The probably was that when trying to coerce, we would not follow the
    `Name` expression to see the constant value.

  * Emit C++ integer constants as `constexpr`. (Robin Sommer, Corelight)

    That way the C++ compiler allows usage in place of actual literal
    constants (like in `case N`).

  * Emit C++ `goto` instead of `break` to exit a loop prematurely. (Robin Sommer, Corelight)

    Previously, we would just emit one C++ `break` for every HILTI
    `break`, assuming that semantics match in terms of what `break` refers
    to. However, that's not really the case: in HILTI/Spicy, `break` can
    only be used to exit a loop, not for example inside a `case` in a
    switch.

    This prepares for emitting actual C++ `switch` statements, where,
    without this change, outputting a C++ `break` inside a `case` would
    now exit the switch rather than the enclosing loop.

1.16.0-dev.142 | 2026-04-15 12:38:08 +0200

  * Avoid unneeded copies in `Location`. (Benjamin Bannier, Corelight)

1.16.0-dev.140 | 2026-04-14 17:03:32 +0200

  * Bump alpine in CI. (Benjamin Bannier, Corelight)

  * Clean up some unnecessary includes. (Benjamin Bannier, Corelight)

  * Fix static initialization issues around the global "none" location. (Benjamin Bannier, Corelight)

  * Fix static initialization issues around the global logger. (Benjamin Bannier, Corelight)

  * Fix uses of copy instead of move. (Benjamin Bannier, Corelight)

1.16.0-dev.134 | 2026-04-14 09:47:39 +0200

  * Fix leak in Tuple constructor. (Benjamin Bannier, Corelight)

    We were using `construct_at` without a corresponding `destroy_at`, so
    the previously allocated memory was leaked.

1.16.0-dev.132 | 2026-04-13 11:37:58 +0200

  * Ensure consistent scope name across translation units. (Maor Hamami)

1.16.0-dev.130 | 2026-04-10 11:59:34 +0200

  * Add fast path to bytes iterator increment. (Robin Sommer, Corelight)

    The decrement operation had that path already, but not increment. Also
    sprinkling some `[[(un-)likely]]` across the fast-paths; not clear if
    that does much, but can't hurt.

  * GH-2300: Fix construction of tuples from map keys. (Robin Sommer, Corelight)

    The previous implementation did not properly handle construction
    from `std::map::value_type`, which has a `const` first element.
    We need this for iterations over maps.

1.16.0-dev.126 | 2026-04-08 11:12:45 -0400

  * Fix potential memory leak splitting strings (Evan Typanski, Corelight)

    In practice I don't think this happens, the code was technically correct.
    But, Coverity is right that there is a case where `wordfree` is not
    called. Just always call it on scope exit for safety.

1.16.0-dev.124 | 2026-04-08 14:28:01 +0200

  * Properly clean up unit sink state. (Benjamin Bannier, Corelight)

    We previously would hold unit sink state in a raw pointer inside the
    unit. This meant that we needed to manually manage its memory which was
    errorprone. This patch switches sink state over to a smart pointer so we
    get correct RAII behavior on update or when exceptions are thrown. Since
    units are copyable we need to use a `std::shared_ptr` as opposed to a
    `std::unique_ptr` here.

1.16.0-dev.122 | 2026-04-08 14:27:36 +0200

  * Use inline const instead of constexpr to support MSVC (Maor Hamami)

1.16.0-dev.120 | 2026-04-08 11:54:32 +0200

  * Bump CodSpeedHQ/action from 4.10.4 to 4.13.0 (dependabot[bot])

  * Bump hendrikmuhs/ccache-action from 1.2.20 to 1.2.22 (dependabot[bot])

  * Bump 3rdparty/utfcpp from `cfc9112` to `9dd9052` (dependabot[bot])

  * Bump 3rdparty/vcpkg from `1e5a281` to `65f9c07` (dependabot[bot])

1.16.0-dev.115 | 2026-04-08 10:32:11 +0200

  * Bump and freeze pre-commit hooks. (Benjamin Bannier, Corelight)

    We are now freezing hooks as a best practice against repos changing
    their tags behind our backs.

1.16.0-dev.113 | 2026-04-08 09:34:23 +0200

  * cmake: use absolute source paths in flex_target() calls to fix DWARF debug info (Doğukan Çağatay)

    Relative `.ll` input paths cause flex to embed bare filenames in `#line`
    directives, resulting in non-existent DWARF paths that break debugsource
    RPM packaging (cpio cannot stat them).

    Prefixing with `${CMAKE_CURRENT_SOURCE_DIR}/` fixes this.

    No functional change — only the path string in `#line` directives is affected.

1.16.0-dev.111 | 2026-04-08 09:05:07 +0200

  * Miscellaneous fixes to make BTest suite pass on Windows. (Maor Hamami)

    This patch contains a mix of changes, among them bug fixes for previous
    Windows work, adjustment for multi-platform support, and new tools for
    Windows support.

  * Use compiler-independent sort order for items in a scope. (Maor Hamami)

    We previously directly used a hashset which lead to differing sorting
    order on different compilers. Make the sorting order explicit instead.

1.16.0-dev.108 | 2026-04-02 11:11:05 +0200

  * Drop `sonoma_homebrew` task. (Benjamin Bannier, Corelight)

    This task was meant for continuously testing the Spicy Homebrew formula.
    This recently started failing, likely due to changes in Cirrus images.
    Since this has as far as I recall never caught any issue and we run it by
    hand when bumping the formula anyway drop the task here.

1.16.0-dev.106 | 2026-04-01 13:55:05 -0400

  * Add copy propagation. (Evan Typanski, Corelight)

    Copy propagation is just an extension of constant propagation that will
    also propagate a Name. That means that if you take in a parameter, like:

    function f(x: uint8) {
      local y = x;
      print(y);
    }

    You can propagate `x` into the print. Before, because `y` was not a
    constant, we would not propagate. This means the dead store can be
    eliminated, which may help for larger parsers with register spill and
    expensive copies.

    We may also apply this to more than just Names. I tested with member
    accesses, but it did not do much. The problem with doing more is that we
    have to care about aliasing of the "parent," so we cannot just rely on
    `inout` in order to see if something may change. Thus, the more we do,
    it gets significantly more complex, with each step also adding potential
    for too much propagation. Too much may hurt the performance gains.

  * Make constant propagation on calls more granular. (Evan Typanski, Corelight)

    The constant propagation pass would get around certain cases with
    functions having references by just marking everything as
    not-a-constant. But, that really limits the utility, and it's something
    that signalled a bug.

    This changes constant propagation to only mark `inout` function
    parameters as not-a-constant. This also necessitates marking a Spicy
    runtime function as having an `inout any` parameter, since it would
    otherwise cause a bitfield test to fail.

    This should allow us to propagate constants more.

  * Remove `init` from if/while if unused. (Evan Typanski, Corelight)

1.16.0-dev.102 | 2026-04-01 18:19:52 +0200

  * GH-2131: Add compile-time validation of regular expressions. (Robin Sommer, Corelight)

    So far we would catch pattern errors only at runtime. Now we report
    the following at compile time if it can be statically determined:

    - Patterns that don't compile (e.g., due to syntax errors)
    - Use of `$N` referring to a capture group that exceeds the number a pattern defines.
    - Use of `$N' with a regular expression specifying multiple patterns
      for parallel matching (in which case group numbers are ill-defined).
    - Use of `$N' with a `&nosub` field.

    Closes #2131.

  * Add a couple of static analysis methods to regular expression patterns. (Robin Sommer, Corelight)

    These allow to (1) validate a regular expression and (2) determine its
    number of capture groups. They work by temporarily compiling the
    patterns.

    Also includes a tiny cleanup removing an unused function parameter.

  * Bump justrx to pull in fix for memory leak. (Robin Sommer, Corelight)

  * GH-2294: Fix compiler crash for a type mapping to an unknown ID. (Robin Sommer, Corelight)

    Closes #2294.

1.16.0-dev.96 | 2026-04-01 14:54:21 +0200

  * GH-2186: Add support for permalinks to Spicy rubrics. (Robin Sommer, Corelight)

    If a `rubric` directive comes with a `name` (i.e., an anchor ID),
    Sphinx will now render an on-hover permalink, just like it does
    already for sections. We then use this inside our auto-generated
    function and type documentation.

    Closes #2186.

  * Move further string usages over to our custom class. (Robin Sommer)

    These originally appeared to be fine for leaving as `std::string`, but
    it turns out that's inconsistent after all and potentially leading to
    trouble.,

  * Make our strings hashable. (Robin Sommer)

1.16.0-dev.91 | 2026-03-19 20:29:36 +0100

  * Rework CHANGES slightly. (Benjamin Bannier, Corelight)

    The previous formatting confused the spellchecker.

  * Fix windows build. (Maor Hamami)

    This adds a first iteration for adding Windows support for Spicy. With
    this patch the code builds, and unit tests pass. We also tested that
    this version of Spicy is usably in a fixed up version of Zeek.

1.16.0-dev.88 | 2026-03-19 13:37:35 +0100

  * Introduce `hilti::rt::String` as a proper runtime class for HILTI strings. (Robin Sommer, Corelight)

    This is cleaning up technical debt. Strings were the only major HILTI
    type that wasn't yet represented by a dedicated runtime class: we were
    mapping them directly to `std::string` instead. That's inconsistent,
    and prevents future optimizations that might want change how strings
    are stored and managed. This commit introduces a dedicated class
    `rt::String` that runtime and codegen now use for storing HILTI
    strings. Behind the scenes, the class still derives from
    `std::string`, just like other runtime types derive from corresponding
    `std` types, so performance-wise nothing should change. For
    convenience, there's also a new literal to create HILTI string
    instances: `"foo"_hs` ("HILTI string), similar to how we already
    have `"foo"_b` for `bytes`.

    Note that `rt::String` deliberately does not convert from/to
    `std::string` to avoid accidentally mixing up the two. Instead,
    `std::string_view` can act as a go-between the two types; `rt::String`
    does convert from/to views. Overall, it's a bit of a puzzle game at
    times to get the various conversions/overloads correct between
    String/string/string_view/const char*/Bytes; trying to keep changes
    consistent and minimal.

1.16.0-dev.86 | 2026-03-18 07:31:30 -0400

  * Use an intermediate file rather than pipe in tests (Evan Typanski, Corelight)

    This means you can look at the output more easily for FileCheck tests.

  * Loosen `FileCheck` tests a bit (Evan Typanski, Corelight)

    I had two primary rules:

    1) Only test what is necessary. If we're looking for a variable
       declaration, but it wouldn't really matter what's in it, just {{.*}}
       it. If all that matters is that `self` is used between two statements,
       only test for that.

    2) Anything that's not *exactly* as it appears in source should have
       regular expressions to catch the exact minimal case. For example, if
       a hook is named `_t_on_x`, the only part we need is that it is `on_x`
       so use `{{.*}}on_x{{.*}}`. This makes it more resilient to unrelated
       compiler name changes.

    There are other simple rules, like not checking for semicolons. The goal
    should just be make the simplest looking test that catches the case you
    want.

1.16.0-dev.83 | 2026-03-12 16:38:10 +0100

  * Fix signed/unsigned comparison warning (Tim Wojtulewicz, Corelight)

1.16.0-dev.81 | 2026-03-03 15:43:56 +0100

  * Fix change tracking in `remove-unused-fields` pass. (Robin Sommer, Corelight)

    This is necessary with the recent `replaceNode()` changes.

  * Let the `dead-code-static` pass honor `--no-strict-public-api`. (Robin Sommer, Corelight)

    There were also a couple of places either not quite working as
    intended or not (any longer) needed, so tweaking things a bit. Also
    adding one extension for removing not needed member functions.

  * Let the `propagate-function-returns` pass honor `--no-strict-public-api`. (Robin Sommer, Corelight)

  * Let the `remove-unused-params` pass honor `--no-strict-public-api`. (Robin Sommer, Corelight)

  * Add optimizer helpers to determine if AST entities can be modified. (Robin Sommer, Corelight)

    These honor ``--no-strict-public-api` as well as various attributes
    and other AST properties.

    Also port the `remove-unused-fields` pass over to use one of them,
    more to come.

  * Codegen fix for wrong qualification of non-extern struct members. (Robin Sommer, Corelight)

  * Extend printer to always output functions' calling conventions. (Robin Sommer, Corelight)

    This was missing for some function types, so that one wasn't able to
    see what their calling convention was.

1.16.0-dev.73 | 2026-03-03 10:39:20 +0100

  * Optimize grouping with side-effect free local variables. (Robin Sommer, Corelight)

    Our resolver can sometimes leave new groupings behind that are more
    complex than necessary because they introduce local temporary
    variables even though their value is constant and side-effect free.
    The problem is that the resolver can't tell if something is
    side-effect free (that needs data flow analysis) and hence it needs to
    remain conservative.

    This commit adds a peephole optimization that removes local variables
    from groupings if they aren't necessary. We generally prefer repeating
    the side-effect expressions for readability and further optimizations
    down the line.

  * Extend analysis of side effects. (Robin Sommer, Corelight)

    Hardcode a couple of additional cases. Just like the existing code,
    this is temporary until we gain expression-level data flow analysis.
    This had no effect on any existing tests.

  * Make the visitors' `replaceNode()` safe. (Robin Sommer, Corelight)

    The existing `replaceNode()` method was impossible to use safely: if
    it was passed a replacement node that was already part of the AST
    somewhere, the method would disconnect that node from its original
    position first. That, however, is generally not safe because AST nodes
    do not give any guarantees about their internal child layout, so that
    simply removing one can lead to trouble. Plus, one always had to keep
    mind that the replacement node would now disappear from its original
    place, which is error-prone even in safe cases.

    This changes `replaceNode()` to instead use our standard semantics
    when making AST modifications: If a node is being inserted that
    already has a parent, we deep-copy it first. That way, the caller
    doesn't need to worry about safe memory management. In addition, we
    add a new method `replaceNodeWithChild()` that optimizes the operation
    for a special case: If an existing child is taking the position of a
    parent of itself, then we can always safely move it over into its new
    place without copying. We now use that for cases across the code base
    that match this special case.

1.16.0-dev.68 | 2026-03-03 10:27:41 +0100

  * Fix printer for functions. (Benjamin Bannier, Corelight)

    We would previously inject a redundant `function` before dispatching to
    the printer of implementations which already emits the kind.

1.16.0-dev.66 | 2026-02-25 12:55:28 +0100

  * Fix a GCC false positive on CI. (Robin Sommer, Corelight)

    The `validate_release_tarball` task was failing.

1.16.0-dev.64 | 2026-02-20 09:41:54 +0100

  * Updating documentation for optimizer changes. (Robin Sommer, Corelight)

  * Compute AST dependencies always right after resolving. (Robin Sommer, Corelight)

    Before, it was pretty inconsistent when exactly the information would
    be available. In particular it wasn't available to post-compilation
    hooks, which was unfortunate. With this change, we can now leverage
    dependencies on the Zeek side.

    Implementation note: We need to make the dependency computation a bit
    more robust here now because it can potentially run on a not validated
    (and hence invalid) AST. That can happen if the resolver flags any
    errors. On the other hand, we can't easily run the validator just
    before the dependency computation because that would change some
    assumptions on when exactly validation runs, potentially leading to
    different results.

  * Use new helper for side effects elsewhere. (Robin Sommer, Corelight)

  * Provide two flow-based helpers through the CFG context. (Robin Sommer, Corelight)

    The first provides flow information for a given expression, the second
    determines if a given expression might contain side effects. Right
    now, both are approximate, as we don't have expression-level dataflow
    tracking yet. In the future, these should be able to become more
    precise.

  * Parse fields into stack variables first. (Robin Sommer, Corelight)

    So far, when parse a standard unit field, we'd immediately store the
    retrieved value into the corresponding struct member. Now, if we parse
    a non-mutable value, we instead store it into a local temporary first,
    finish the field's processing, and only then move the value over from
    the temporary to the struct field. The advantage is better
    optimization potential: we have more opportunities to identify the
    struct field as not (productively) used, and the C++ compiler can
    likewise work on the stack temporary for most of the time. However, we
    do this only for non-mutable values, because fields of mutable types
    need to reflect incremental updates correctly at all times.

  * Add new optimizer pass removing unused struct fields. (Robin Sommer, Corelight)

    Add optimizer pass that removes struct fields with no productive
    accesses. The pass marks unused fields with `&no-emit="optimized"`,
    allowing them to remain in the AST through codegen, which then emits
    code to render them as `(optimized out)`. Fields with `&always-emit`,
    or inside types with `&always-emit`, are never removed.

    The new optimization is enabled only in `--no-strict-public-api` mode,
    which means by default it's on release builds, but not in debug
    builds. (That aligns pretty well with the fact that in debug mode,
    Spicy generates accesses to *all* parsed fields through the debug
    messages it emits, which means they wouldn't be optimized out
    anyways.)

  * Improve tuple assignment. (Robin Sommer, Corelight)

    We would in some cases introduce a temporary where we didn't need to.
    Also adding a check to catch coercion errors, which could previously
    end up not being reported.

  * Switch tests to debug builds. (Robin Sommer, Corelight)

    Most, but not all, of our tests are compiling HILTI/Spicy code with
    `--debug`. This changes some of the remaining tests over, both for
    consistency and to prepare for upcoming optimizations that would hide
    the anticipated output in release builds. None of this changes any
    baselines.

    (This does not touch any tests for optimizations or CFGs in case
    they explicitly want the release builds.)

  * Fix CFG logic for adding function parameters. (Robin Sommer, Corelight)

    I was getting assertion errors and noticed the logic wasn't making use
    of the AST information that the resolver computes for types linked to
    methods. So this switches that over.

    It's a slightly larger change because we need to get the CFG access to
    the AST context, which is a bit of hassle to get it in place. On the
    plus side, having the context available seems generally useful for the
    CFG class, so that seems ok.

  * Extend groupings to support multiple expressions. (Robin Sommer, Corelight)

    The HILTI AST so far did not have a way to express a sequence of
    expressions (think: `,` operator in C). This adds support for that by
    extending grouping expressions to contain more than one expression.
    They will be evaluated in sequence, with all having access to the
    local tmp if defined; and the grouping will return the value of the
    final expression as its value. Nor surprisingly, these are codegened
    to C++ through the `,` operator.

  * Add a couple of AST node editing methods. (Robin Sommer, Corelight)

    Most of the these allow detaching an existing child expression from a
    node, to then re-use it elsewhere without requiring a deep copy.

  * Expose a couple of helper runtime functions to throw exceptions. (Robin Sommer, Corelight)

    This adds `hilti::throw_unset_optional()` and
    `hilti::throw_attribute_not_set()` that throw the corresponding
    exceptions. Having functions will allow us to use throw from inside
    expressions, which C++' `throw` cannot do. The C++ implementation of
    the former already existed but wasn't accessible to HILTI code yet.

  * Add null checks to AST printers. (Robin Sommer, Corelight)

    For convenience, to avoid caller-side checks.

  * Add new linkage `export`. (Robin Sommer, Corelight)

    This applies to structs and units, and generally works like `public`, but in addition declares that the
    HILTI optimizer/codegen may not change the fields of the type. It's
    like `--strict-public-api` but on a per type basis.

    To export a type, it first needs to declared normally, and can then
    be exported. In Spicy:

    ``
    type Foo = unit { ... }

    export Foo;
    ``

    (`export type Foo` doesn't work for parsing reasons; plus we want to
    be able to export already existing types.)

  * Add `&always-emit` attribute to Spicy. (Robin Sommer, Corelight)

    This attribute already existed at the HILTI level to express that
    struct fields are not to be skipped from the emitted code. We allow
    the same in Spicy now for unit fields, and carry the attribute through
    to the corresponding Spicy struct.

  * Extend `&no-emit` attribute with string argument support. (Robin Sommer, Corelight)

    The existing (purely internal) `&no-emit` attribute now requires a
    string argument to distinguish between 'private' fields (never visible
    to user) and 'optimized' fields (removed by optimizer, but still
    included in type information and type rendering; in the latter case,
    they will be printed as `(optimized out)`.

    `optimized` isn't in actual use yet. The corresponding optimizer pass
    adding it will come in a subsequent change. However, we do already
    include a test that adds `&no-emit` manually to exercise the code
    generation and rendering. We already adapt `spicy-dump` as well, but
    can't test it yet.

    This comes with two slightly backwards-incompatible changes:

    - Before, we used to include private struct fields into the type
      information, even though we weren't using them anywhere (our tools
      using type information were just skipping over them already). For
      simplicity, we now directly skip them when emitting type
      information. That means that host application can assume that any
      fields included into the type information but marked as
      not-emitted, are fields that would normally be visible to the user
      but have been optimized out.

    - spicy-dump output now includes struct fields that don't have a value
      set. In text output, they are rendered as `(unset)`, in JSON output
      with `null` values. The reason is that, because we want to have
      optimized fields rendered as "(optimized out)" in text output, it
      would seem surprising to have any non-optimized fields not appear at
      all. Similarly for JSON, where we render optimized fields as `null`
      (although one could debate whether they should be included in JSON
      at all).

  * Add new options `--[no-]strict-public-api` to toolchain commands. (Robin Sommer, Corelight)

    If active, this disallows any optimizations that affect the external
    C++ API of the generated code. By default, this is on when generating
    debug code and off when generating release code.

  * Add environment variable `HILTI_DISABLE_OPTIMIZER_PASSES`. (Robin Sommer, Corelight)

    We used to have an environment variable to specify which optimizer
    passes to run. This brings it back in inverse: a colon-separated list
    of passes to disable. Leaving out individual passes seems more useful
    than having to list all passes that one wants to run.

    Not documenting the names of passes as this is primarily for
    development purposes.

  * Catch up on docs. (Robin Sommer, Corelight)

    We had some changes that weren't reflected in the auto-generated docs
    yet.

1.16.0-dev.42 | 2026-02-09 13:36:59 +0100

  * Implicitly declare `Undef` for C++ enum like we do already in HILTI. (Benjamin Bannier, Corelight)

  * Remove macro to create enums with non-`Undef` default value. (Benjamin Bannier, Corelight)

  * GH-2259: Require that all runtime enums have an explicit `Undef` variant. (Benjamin Bannier, Corelight)

    We previously would not require that C++ runtime enums had an `Undef`
    variant. Instead we override the "default" entry which changed the
    default variant such an enum value would take. This worked in C++ code,
    but never in HILTI.

    This patch adds an `Undef` variant for all C++ runtime enums.

    Closes #2259

  * Fix runtime enums implemented in C++. (Benjamin Bannier, Corelight)

    Enums which we declare in C++ but expose to HILTI code we currently
    declare twice: in C++, and again in HILTI (with a `&cxxname`). The way
    we did that was inconsistent in that HILTI would implicitly add an
    `Undef = -1` variant while many of our C++ declarations with
    `HILTI_RT_ENUM` would declare `Undef` first and without value, leading
    to `Undef = 0`; this likely also lead to all other enum variants being
    inconsistently numbered. The most visible effect of this was that `Undef`
    values of such enums were often truthy.

    This patch cleans this up:

    - C++ enums now declare `Undef` as last entry to ensure consistent
      numbering
    - C++ enums now explicitly set `Undef = -1`

1.16.0-dev.37 | 2026-02-09 13:36:44 +0100

  * Bump CodSpeedHQ/action from 4.8.2 to 4.10.4 (dependabot[bot])

1.16.0-dev.35 | 2026-02-05 14:42:05 -0500

  * GH-2260: Fix regression with propagating tuple returns. (Evan Typanski, Corelight)

    Fixes #2260

    With groupings, you can assign to a tuple without assigning all values.
    Since this would break parts of the placements mechanism when
    propagating returns, just disallow this for safety.

1.16.0-dev.33 | 2026-02-02 13:25:18 +0100

  * GH-2251: Actually implement `enum` coercion to `bool`. (Benjamin Bannier, Corelight)

    Previously we implemented `enum` coercion to `bool` as a comparison
    against the `Undef` label. While `Undef` values coerce to `false`,
    different `Undef` values only compare equal if they map to the exact
    same underlying integer value, so our implementation was not correct.

    This patch implements coercion in terms of `has_label`. While this is
    unlikely to be the most performant implementation a better impl
    would likely require to change how we declare runtime enums so we could
    have the macro generate code which explicitly checks against all know
    labels. Given that `HILTI_RT_ENUM..` allows declaring values both with
    and without values that is currently hard to implement.

    Closes #2251.

1.16.0-dev.31 | 2026-02-02 13:24:50 +0100

  * GH-2238: Correctly compute argument constness in CFG. (Benjamin Bannier, Corelight)

    We previously tried to fix this in #2238, but did not take into account
    that one cannot simply iterate operands since often they are present as
    tuples. This patch reimplements the helper function we introduced then,
    and removes a helper which is not used anymore.

  * Add explicit CFG handling for `assert` arguments. (Benjamin Bannier, Corelight)

    By default arguments to an `assert` are just read. Add explicit handling
    for that so we do not mark them as writes as well.

  * GH-2254: Add explicit CFG handling for member accesses. (Benjamin Bannier, Corelight)

    We previously didn't explicitly handle access of struct and union
    members, and instead used the default treatment of marking them as both
    read and write operations. Since both these accesses are just reads this
    patch adds explicit treatment for that.

    Closes #2254.

  * Bump CodSpeedHQ/action from 4.5.2 to 4.8.2 (dependabot[bot])

1.16.0-dev.25 | 2026-01-20 17:41:16 -0500

  * Include optimizer header when used. (Evan Typanski, Corelight)

    This header had a bit of messiness, and that's an important header.

  * Do not propagate returns if same name and test. (Evan Typanski, Corelight)

  * GH-2031: Add function return propagation. (Evan Typanski, Corelight)

    Closes #2031

    This optimization aims to reduce the amount of tuples propagated through
    Spicy parsers. Many of the parse functions get a parameter, then return
    the unchanged parameter. This adds unnecessary work, as we have to
    construct a tuple at the end with the parameter, even though it does
    nothing.

    The general form is this transformation:

    function tuple<uint<64>, uint<64>> f(uint<64> x, uint<64> y) {
      return (x, y);
    }
    global x = 0, y = 1;
    (x, y) = f(x, y);

    Turns into:

    function void f() {
      return;
    }
    global x = 0, y = 1;
    f();

    In order for this to actually apply to real parsers, there is an extra
    consideration: sometimes there is a second function in the middle, like:

    function tuple<uint<64>, uint<64>> f(uint<64> x, uint<64> y) {
      return (x, y);
    }
    function tuple<uint<64>, uint<64>> passthrough(uint<64> x, uint<64> y) {
      return f(x, y);
    }

    Then, something will call passthrough, not f. For this case, we need a
    concept of passthroughs, where we check the *passthroughs* uses instead
    of the particular function we are optimizing.

    This can often make the parsing functions only pass around `_t_error`,
    which means that the tuple is no longer constructed at all. Many others
    will never use lookahead, so they get to only a 2-element tuple, which
    may make a significant impact. Any sufficiently complex Spicy parser
    would likely not see much change.

    This also aligns more with what a user would expect when reading the
    code, giving a nice simplification.

  * Remove unnecessary quote include. (Evan Typanski, Corelight)

  * Move callers optimizer collector to header. (Evan Typanski, Corelight)

    This way, we can reuse it, namely in the function return propagation.

  * Allow void functions to return void expressions. (Evan Typanski, Corelight)

    This is needed if we remove an expression in a return.

  * Move `enclosingFunction` to the optimizer. (Evan Typanski, Corelight)

  * Propagate variable that is immediately returned. (Evan Typanski, Corelight)

    This will propagate the `result` variable in cases like:

    ```
    result = my_method_call();
    return result;
    ```

    into:

    ```
    return my_method_call();
    ```

1.16.0-dev.16 | 2026-01-20 09:47:15 +0100

  * Apply `&on-heap` selectively only where needed. (Robin Sommer, Corelight)

    Previously, we would attach `&on-heap` to any `struct` compiled from a
    Spicy `unit`. Now we only attach it only for specific cases that need it,
    moving state to the stack otherwise.

  * Prepare for moving parser temporaries to the stack. (Robin Sommer, Corelight)

    The parser generator is creating temporaries at a few places that will
    then later receive parsed values. Currently, those temporaries are
    always simply of the type being parsed. Turns out that works for
    units/structs only because we're always wrapping them into
    `value_ref`, meaning we can create those temporaries as null values.
    However, in a subsequent commit, we will get rid of those wrappings in
    some cases, meaning the structs would need to be default initialized
    at the time they are created on the stack. That doesn't work for some
    struct types though: if a struct receives parameters, we would need to
    pass them at instantiation time, but for these temporaries we don't
    know parameters at that point. So to prepare for the upcoming change,
    this commit wraps such struct values types into `optional<>`.

  * Skip optimizer consistency checks with `--skip-validation`. (Robin Sommer, Corelight)

1.16.0-dev.12 | 2026-01-14 18:23:48 +0100

  * Bump 3rdparty/utfcpp from `7079562` to `cfc9112` (dependabot[bot])

  * Bump 3rdparty/utf8proc from `a36778d` to `e5e7992` (dependabot[bot])

  * Bump CodSpeedHQ/action from 4.4.1 to 4.5.2 (dependabot[bot])

1.16.0-dev.8 | 2026-01-12 10:03:48 -0500

  * Avoid lookahead in size benchmarks. (Evan Typanski, Corelight)

  * Separate lookahead and size benchmarks. (Evan Typanski, Corelight)

    Since the two benchmarks used the same `Inner`, they would get the same
    interprocedural optimizations. This doesn't give the full picture about
    how something changes, so separate them so that we can get a better
    picture.

    This definitely makes the benchmarks more "micro," but I believe that we
    see more people using *either* lookahead *or* size, not both on the same
    unit.

1.16.0-dev.5 | 2026-01-12 14:51:21 +0100

  * Fix a typo. (Benjamin Bannier, Corelight)

  * Take operand constness into account in CFG construction. (Benjamin Bannier, Corelight)

    When computing the CFG data access information we would previously
    assume that any operator use would both read and write its operands,
    e.g., we would assume that an equality check could write its operands.
    Due to how we resolve operators of non-const operands this does reflect
    what we see in many ASTs, but does not take into account when we
    actually use an operand as const.

    This patch adds handling of operators so that we can avoid recording
    writes when the operand is used as const.

  * Fix method signatures. (Benjamin Bannier, Corelight)

    The methods claimed to not modify `self` when they did in fact do that.

  * Add side effects to test. (Benjamin Bannier, Corelight)

    This prevents removal of these operations should we ever (i.e., in a
    following patch) detect them as having no effect of their own.

  * Start of v1.16.0 development. (Benjamin Bannier, Corelight)

1.15.0 | 2026-01-12 11:43:12 +0100

  * Add spicy-1.15 release notes. [skip CI] (Benjamin Bannier, Corelight)

1.15.0-dev.189 | 2026-01-07 13:41:24 +0100

  * Extend our notion of reserved C++ identifiers. (Robin Sommer, Corelight)

    Now including anything starting with `__` or `_[A-Z]`.

  * Revert change to disallow leading underscores in user identifiers. (Robin Sommer, Corelight)

    In #2205, we started disallowing leading underscores in user
    identifiers as we were using them internally in generated code for
    private identifiers. That's a pretty drastic change, however,
    affecting existing Spicy code that's now no longer valid. It's also
    generally surprising to not have access to identifiers with leading
    underscores.

    This reverts the change and allows leading underscores again. Instead,
    we internally now use a `_t_` prefix for generated IDs. We
    now disallow *that* for users but don't specially mention the
    restriction in the docs as that feels quite specific.

1.15.0-dev.186 | 2025-12-17 17:38:15 -0500

  * Remove expression statements without side effects. (Evan Typanski, Corelight)

    This is necessary to be separate from the statement/declaration tracking
    since there are more cases of just "floating" expression statements,
    like `(a, b, c, d)` after some constant propagation and dead code
    elimination.

  * Replace assignments with their RHS, not remove. (Evan Typanski, Corelight)

    After 5197e79, we replace some declarations with the RHS of the
    assignment so that we don't remove method calls. The same problem applies
    to assignments generally, so add cases for those.

    This also makes some code stick around (particularly when paired with
    constant propagation), so we need more aggressive removal of expressions
    whose result is unused and who don't have side effects.

1.15.0-dev.183 | 2025-12-17 12:43:42 +0100

  * GH-2236: Include `Flow` nodes in CFG construction pruning step. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/utf8proc from `90daf9f` to `a36778d` (dependabot[bot])

1.15.0-dev.179 | 2025-12-17 11:49:52 +0100

  * Add new validator pass that checks CFG-based properties. (Robin Sommer, Corelight)

    We run this *after* optimization because then we can just reuse the
    CFGs the optimizer is leaving behind, meaning no performance
    impact. Downside is that we won't catch stuff in code that was
    optimized out—-which however seems like a reasonable trade-off.

  * Pass externally instantiated CFG cache into optimizer. (Robin Sommer, Corelight)

    This moves ownership of the cache over to the AST processing. That
    way we will be able to re-use it elsewhere.

  * Factor out logic & state for CFG caching into separate class. (Robin Sommer, Corelight)

    This encapsulates the functionality, making it reusable; and will also
    allow us to later pass the cache around to different parts of the
    compiler pipeline.

    While the internal structure of the cache is slightly different to the
    previous implementation inside the optimizer, there's no functionality
    change to the optimizer except for one fix: we were not correctly
    discarding all affected block CFGs when invalidating a module. We do
    now, with the result that we're computing some more CFGs overall,
    costing us about 1-2% in performance.

  * Correct guarantees provided by feature-requirements visitor. (Robin Sommer, Corelight)

    The pass *is* changing the CFG. Doesn't really matter right now,
    because it's always the first pass running, but still.

  * Fix optimizer for `if`/`while` statements with initializers. (Robin Sommer, Corelight)

    Constant folding was removing initializer expressions. For simplicity,
    we know just don't fold if/while-statements at all if they have
    initializers.

     Also improving optimizer logic for `if` and `while`.

    Baseline diffs are due to avoiding more unnecessary node copies now.

1.15.0-dev.172 | 2025-12-16 18:09:03 +0100

  * GH-2214: Update documentation for #2214. (Benjamin Bannier, Corelight)

1.15.0-dev.170 | 2025-12-16 09:54:28 -0500

  * Fix nondeterminism in CFG dead code elimination. (Evan Typanski, Corelight)

    Co-authored-by: Benjamin Bannier <benjamin.bannier@corelight.com>

  * GH-2231: Fix dead code removing methods when removing vars. (Evan Typanski, Corelight)

    Fixes #2231

    Given code like this:

    ```
      local y = dat.test();
    ```

    if `y` was never used, then the whole statement would get removed. This
    makes it so that the RHS sticks around. Then, if the RHS should also be
    removed, it gets removed later.

1.15.0-dev.167 | 2025-12-16 15:35:32 +0100

  * Add validator rejecting invalid uses of capture groups. (Benjamin Bannier, Corelight)

  * GH-2222: Add resolving for capture groups. (Benjamin Bannier, Corelight)

    We would previously not perform proper resolving of capture groups.
    Instead we emitted a magic C++ identifier so this only resolved at C++
    compile time. This introduced a number of downsides:

    - incorrect uses of capture groups via `$1`, `$2`, ... outside of field
      hooks which defined the magic captures was impossible to diagnose;
      instead this caused failed C++ compilation

    - code rewrites needed to treat captures special since their use was not
      correctly reflected on the AST

    This patch lowers uses of capture keywords to the identifier name
    much earlier so it behaves like any other use of an identifier.

    Closes #2222.

1.15.0-dev.164 | 2025-12-11 16:47:37 +0100

  * Add rvalue overloads for `Result` accessors. (Benjamin Bannier, Corelight)

    A somewhat typical use case of results is to get them from some function
    and then immediately dereference the returned value and bind its value to
    a new value (i.e., not a reference). The binding to a new value prevents
    us introducing a reference to a temporary which will go out of scope and
    the end of the statement.

    This is incorrectly diagnosed by Coverity as a unnecessary copy
    (`AUTO_CAUSES_COPY`), but also exposes an API which makes it easy to
    create dangling references. This patch introduces rvalue overloads for
    `Result` accessors so we can directly obtain a value inside a `Result`
    without having to go through a copy of a reference. With that we also
    catch incorrect uses of temporary `Result` values which we also fix.

  * Remove dependency of global pass registry on global logger. (Benjamin Bannier, Corelight)

    Both these objects represent singletons which live in different
    translation units. That means that the order in which they are
    constructed is unspecified and we shouldn't rely on a particular one.

    This patch removes a user of the logger to raise an internal error with
    an assertion to break that dependency.

  * Drop stray CFG edge for `while` loops with inits. (Benjamin Bannier, Corelight)

    It looks like this was simply added by accident, and never caught since
    we had no test. This patch fixes the code and adds a test.

  * Assert the Spicy plugin is invoked with a `spicy::Builder`. (Benjamin Bannier, Corelight)

  * Add missing scope computations in `flatten-blocks` pass. (Benjamin Bannier, Corelight)

    We incorrectly assumed that a `Node` scope was always present when it
    might need to be computed. This patch fixes the code to create a scope
    if it is missing.

  * Fix optimizer to use pre-existing builder instance. (Benjamin Bannier, Corelight)

    The pre-existing builder is of the right kind: if we're running
    through the Spicy driver, it'll be a Spicy builder (in contrast to a
    HILTI builder).

1.15.0-dev.157 | 2025-12-11 09:24:35 +0100

  * Remove `expression::BuiltInFunction`. (Robin Sommer, Corelight)

    This wasn't used anywhere.

  * Fix C++ compile error with tuple assignment expressions. (Robin Sommer, Corelight)

  * GH-2175: Fix tuple assignment when coercing individual elements. (Robin Sommer, Corelight)

    The tuple expression could end up being evaluated multiple times.

    Closes #2175.

  * Add helper to create a grouping with a temporary local. (Robin Sommer, Corelight)

    The helper ensures the temporary's ID is unique.

    Factors out some existing code for creating unique names to avoid
    duplication.

  * Extend HILTI group expression to support a local temporary. (Robin Sommer, Corelight)

    This extends the HILTI `Grouping` expression (`(...)`) so that it
    allows declaring a variable local to the group. To do that, one
    prefixes the group's contained expression with a `local` declaration
    inside `{...}`:

        ({local int i = 2;} i * i) # evaluates to 4

    This isn't meant as a user-level feature but will be useful for
    internal transformations. It's helpful for situations where an
    expression is needed multiple times inside the group but must be
    evaluated only once.

    The HILTI syntax is pretty arbitrary and primarily meant to not
    interfere with any code that's currently valid.

    Due to the internal nature, we don't expose this in Spicy.

  * Fix ambiguous C++ constructors for generated struct. (Robin Sommer, Corelight)

    This issue has been hidings for a while but was eventually bound to
    come up: If a struct had just a single field or parameter, the
    generated C++ struct would get a constructor that likewise receives a
    single parameter. However, we also generated constructor copy and move
    constructors, and if we're unlucky, then creating a struct with its
    single argument would would become ambiguous with those constructors.
    The second code example in https://github.com/zeek/spicy/issues/2197
    taggers just that.

    Additionally, we could also run into trouble if the types of a
    struct's parameters and its fields matched: then our constructors
    could likewise become ambiguous.

    This fixes things by adding an additional tag parameters, one for
    constructors receiving struct fields and one for constructors
    receiving parameter values. That disambiguates them from each other,
    and from the copy/move constructors.

    We should have done this a long time ago already. The patch is pretty
    technical but mostly straight-forward. The main challenge is finding
    all the places where the tags need to be added now.

  * GH-2197: Support coercion from empty list to struct. (Robin Sommer, Corelight)

    Closes #2197.

1.15.0-dev.148 | 2025-12-10 17:29:38 +0100

  * Make optimizer guarantees less granular. (Robin Sommer, Corelight)

    This makes the guarantees that an optimizer pass can provide less
    granular: it can either say the AST is fully resolved, or it's not. If
    not, the full suite of
    resolver/coercion/type-unification/scope-building will be run on any
    changed parts of the AST. A pass can no longer just have some of those
    parts run.

    This is because it's too hard to understand when exactly what type of
    guarantee if ok to give. For example, in an upcoming patch, the
    coercer will start adding new temporaries. That then requires scope
    building and a full resolver pass afterwards, meaning doing just
    coercions will never be possible anymore.

    More specifically, this commit includes:

    - Remove `resolver::coerce()`.

    - When re-resolving an AST during optimization, loop over a sequence
      of scope-building, type unifications, and the standard resolver
      processing.

    - Remove `optimizer::Guarantees::{ResolvedExceptCoercions,
      ScopesBuilt, TypesUnified}` and replace
      `optimizer::Guarantees::FullyResolved` with
      `optimizer::Guarantees::Resolved`. The latter now encompasses scope
      building and type-unification as well.

    Inside the resolver code, I'm leavings the coercion visitor (V3) split
    out, even though strictly speaking that isn't necessary anymore. But
    seems fine to keep that semantic distinction internally.

1.15.0-dev.146 | 2025-12-09 18:25:47 +0100

  * GH-1425: Add pass which performs block flattening. (Benjamin Bannier, Corelight)

    A number of other rewrites currently depend on a simpler flow without
    additional scopes. This patch implements such a pass which removes
    nested scopes. This involves first renaming any identifiers which would
    clash when lifted to the parent scope, and then merging the scope's
    contents into its parent.

    We also perform extra handling where an value aliased a value from the
    removed scope. The previous behavior was that the alias would have
    become dangling after the scope. Since this is something we explicitly
    allow and diagnose at runtime we preserve that behavior by now pointing
    it to fresh data.

    Closes #1425.

  * Add `Block::removeStatements`. (Benjamin Bannier, Corelight)

1.15.0-dev.143 | 2025-12-09 17:25:36 +0100

  * GH-2205: Uglify internal identifiers. (Benjamin Bannier, Corelight)

    We prefixed the generated identifiers with double underscore so they do
    not clash with user-defined identifiers, but identifiers with leading
    underscores are reserved by C++. In fact, `__hlt` is already defined for
    some ARM64 compilers where it refers to the `halt` instruction.

    This patch replaces the leading `__` with a new reserved prefix
    `hlt_internal` for identifiers in global scope, and else a `_`.

    Closes #2205.

1.15.0-dev.141 | 2025-12-05 12:54:14 +0100

  * Refactor optimizer. (Robin Sommer, Corelight)

    This is a large change refactoring, streamlining, and speeding up of
    the optimizer and its individual passes.

    Conceptually, the core change is that we now have a well-defined
    contract between optimizer and optimization passes: before running a
    pass, the optimizer ensures that the AST is in a consistent,
    fully-resolved state; and when a pass finishes, the pass tells the
    optimizer what needs to be done to get the new AST back into that
    state. See `optimizer::PassInfo` for the details.

    We also substantially simplify the optimizer loop: it's no longer
    nested across multiple phases & levels, and just runs all passes in
    order until the AST stabilizes. Optionally, a individual pass maybe
    itself repeated until stabilization, too, but that's the only nesting.

    The passes themselves gain a new structure/API that clearly separates
    between collection and mutation. We provide base visitor classes for
    both kinds to derive from. The new structure no longer joins the
    collection/mutation into a single visitor, which was hard to follow.

    This new API enables the optimizer to track what parts of the AST were
    changed by a pass, so that it can then re-resolve only the
    corresponding subparts of the AST after each pass. We track changes
    at the function-level so that we just need to recompute state for any
    functions that have changed. The exception is global code/types, where
    we re-resolve the whole module.

    The optimizer's CFG state is centralized so all passes can share the
    same, cached CFGs when possible, rather than each computing their own.
    We use the function-tracking mentioned above to decide which CFGs need
    re-computation.

    The previous type/member/function passes got merged into single
    dead-code-static pass, with joint collection and mutation visitors.

    The constant-folder pass now re-uses the AST resolver's corresponding
    functionality. No more two implementations of constant folding.

    In debug builds, we do extensive checks that after a pass has
    finished, and the AST state updated as prescribed, the AST is indeed
    fully resolved again. We do this by recomputing all AST state from
    scratch and comparing it against the current one. If there's a
    difference, that's hard internal error and the compiler will abort.
    This check is expensive and disabled in release builds. It can also be
    disabled even in debug builds by setting a new CMake variable
    HILTI_SKIP_EXPENSIVE_DEBUG_CHECKS.

    This removes `HILTI_OPTIMIZER_PASSES` and
    `HILTI_OPTIMIZER_ENABLE_CFG`. Neither seems that useful anymore, and
    removing them simplifies the main optimizer loop. If we do still need
    one of them, we can re-add later.

  * Speed up the graph data structure. (Robin Sommer, Corelight)

    We now maintain more pre-computed state about edges and neighbors,
    making it slightly more expensive to build the graph, but much faster
    to retrieve the information.

  * Extend resolver APIs. (Robin Sommer, Corelight)

    This primarily extends the resolver APIs for more flexibility for
    external callers. There's no functionality change here, it's all at
    the API level.

    This commit:

        - Enables the various resolver operators to operate on sub-trees
          instead of the whole AST. There's no functionality change beyond
          the APIs here, the resolver logic was already operating
          independently of which node is started from. However, there's
          one larger internal change inside the Resolver: we move all
          coercion logic into its own visitor pass, so that we will be
          able to call that individually later
          (`detail::resolver::coerce()`). This change is the source of the
          one baseline update I believe.

        - Extends the constant folder with some options. These will later
          be used by the optimizer, which has slightly different
          requirements on what's to be folded.

        - Adds a couple new APIs to validate that resolver properties are
          satisfied by the current AST.

        - Extends a couple of debugging APIs for dumping out ASTs.

        - Makes some formerly private AST context methods public for
          external use.

        - Extends some AST node APIs slightly.

  * Consistently type function bodies as `statement::Block`. (Robin Sommer, Corelight)

    We were already storing them as such in all places, but still needed
    to cast on access to turn them back into a block type.

1.15.0-dev.136 | 2025-12-03 14:34:08 +0100

  * Bump freebsd-14 image in CI. (Benjamin Bannier, Corelight)

  * Add FAQ for code optimizers can remove. (Benjamin Bannier, Corelight)

  * Explicitly handle `expression::Name` in CFG. (Benjamin Bannier, Corelight)

    These come up when visiting statements like

    ```
    if (NAME) {}
    ```

  * Handle expression use in boolean context in CFG. (Benjamin Bannier, Corelight)

  * Remove unused factory function. (Benjamin Bannier, Corelight)

1.15.0-dev.130 | 2025-12-03 14:33:43 +0100

  * Bump hendrikmuhs/ccache-action from 1.2.19 to 1.2.20 (dependabot[bot])

  * Bump 3rdparty/libb64 from `ce864b1` to `d86057c` (dependabot[bot])

1.15.0-dev.126 | 2025-12-03 14:33:05 +0100

  * GH-2199: GH-2202: Consistently use underlying `Node` when hashing `GraphNode`. (Benjamin Bannier, Corelight)

    This is a follow-up for #2202. I was initially hoping that the
    inconsistency between `GraphNode` equality and hash operators was a
    cause for the behavior seen in #2199, but this seems to be unrelated. It
    is still something which we should fix.

1.15.0-dev.124 | 2025-11-25 16:12:57 +0100

  * Remove `nodes::transform` and `nodes::filter`. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/utf8proc from `96e9b86` to `90daf9f` (dependabot[bot])

1.15.0-dev.120 | 2025-11-25 15:28:26 +0100

  * GH-2204: Bump minimal GCC version to gcc-12. (Benjamin Bannier, Corelight)

1.15.0-dev.118 | 2025-11-25 09:18:29 -0500

  * Enable clang-tidy enforce traditional ops. (Evan Typanski, Corelight)

    This enforces that `&&` be preferred over `and` for all of the possible
    operators. It's pretty confusing to mix them, and Spicy almost always
    prefers the traditional versions, so seeing one-off keywords is weird.

    I've also seen some compilers (MSVC, though we don't support it) disable
    this by default in an extension. It's not worth the trouble for us.

1.15.0-dev.116 | 2025-11-24 19:32:57 +0100

  * Bump CodSpeedHQ/action from 4.3.4 to 4.4.1 (dependabot[bot])

  * Bump actions/checkout from 5 to 6 (dependabot[bot])

1.15.0-dev.113 | 2025-11-24 19:31:57 +0100

  * Reimplement `rt::currentExecutable`. (Benjamin Bannier, Corelight)

1.15.0-dev.111 | 2025-11-21 17:05:03 +0100

  * Change `util:slice` to return a range instead of a `vector`. (Benjamin Bannier, Corelight)

  * Make `util::join` range-aware. (Benjamin Bannier, Corelight)

  * Replace transform and filter utility functions with range adaptors. (Benjamin Bannier, Corelight)

  * Add a helper to convert a range to a vector. (Benjamin Bannier, Corelight)

1.15.0-dev.106 | 2025-11-21 16:07:29 +0100

  * GH-2199: Fix non-determinism in computation of CFG data flow facts. (Benjamin Bannier, Corelight)

1.15.0-dev.104 | 2025-11-18 18:17:02 +0100

  * Do not normalize ID names inside type information. (Robin Sommer)

    Closes https://github.com/zeek/zeek/issues/5008.

1.15.0-dev.102 | 2025-11-17 21:06:51 +0100

  * Bump 3rdparty/utfcpp from `961e7a3` to `7079562` (dependabot[bot])

  * Bump 3rdparty/utf8proc from `d7bf128` to `96e9b86` (dependabot[bot])

  * Bump CodSpeedHQ/action from 4.2.1 to 4.3.4 (dependabot[bot])

1.15.0-dev.98 | 2025-11-05 17:38:06 +0100

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Drop fedora-41, add fedora-43. (Benjamin Bannier, Corelight)

1.15.0-dev.95 | 2025-10-28 16:01:42 +0100

  * New `Optional` implementation. (Robin Sommer, Corelight)

    So far the runtime used `std::optional` for representing optionals.
    This commit replaces that with a custom `Optional` class that
    encapsulates the implementation, and directly provides the semantics
    we want. That means in particular that we can now remove most of the
    former free functions,  and move their functionality directly into the
    class. For example, the `value()` method now throws the expected HILTI
    exception directly, without needing to remember to use a wrapper.  We
    also rename some method to follow our coding conventions.

    Behind the scenes, we continue to use `std::optional` for implementing
    optionals, now through protected inheritance, similar like we do for
    some other types as well.

    This is all similar to how we already wrap other `std` types into
    custom runtime types (e.g., vector).

  * No longer use `std::*` for working with HILTI optionals. (Robin Sommer, Corelight)

    Even though optionals remain instances of `std::optional` for now, we
    now consistently use `hilti::rt::Optional<T>` and
    `hilti::rt::optional::make()` to work with them. We also use
    `rt::Null()` instead of `std::nullopt`, and we also no longer use
    brace initialization when instantiating them, but likewise
    `optional::make`. This makes it clear where exactly we work with HILTI
    runtime optionals.

  * New tuple implementation. (Robin Sommer, Corelight)

    So far our runtime `rt::Tuple` type was just an alias to
    `std::tuple<std::optional<Ts...>>`. This commit moves away from that
    and instead provides our own, custom tuple type. Doing so encapsulates
    the implementation and allows for HILTI-specific changes in semantics
    and implementation. This is similar to how we already wrap other `std`
    types into custom runtime types (e.g., vector).

    One immediate benefit we get is cleaner semantics for unset elements.
    With the prior alias, the `optional` wrappers remained visible to
    tuple users, even though semantically the cases where they matter are
    very rare. When retrieving a tuple element, it's much more natural to
    get the element itself back, not an optional to it; and instead handle
    the unset case through exceptions. The new class does that now.

    Internally, behind the scenes, we still implement our custom tuple
    class through a `std::tuple`, but now without the `optional` wrappers.
    Instead we maintain a bitmask that records which elements are set.
    This implementation should save a little bit of memory, and maybe also
    some cycles (although we now instantiate some otherwise unneeded
    default values for elements that aren't set; but, as said, unset
    elements are rare).

    The move away from `optional` elements requires a small tweak to the
    type information API for tuples: when iterating over elements, there's
    likewise no optional returned anymore. Instead we nullify the values
    directly in case an element is not set. Because bitfields rely on
    tuples internally, they get a corresponding change.

  * No longer use `std::*` for working with HILTI tuples. (Robin Sommer, Corelight)

    Even though tuples remain instances of `std::tuple` for now, we now
    consistently use `hilti::rt::tuple::{make,get}` to work with them. We
    also no longer use brace initialization when instantiating them, but
    likewise `tuple::make`. This makes it clear where exactly we work with
    HILTI runtime tuples.

  * Fix value reference assignment operators. (Robin Sommer, Corelight)

    They couldn't deal with null pointers.

1.15.0-dev.88 | 2025-10-24 07:36:37 +0200

  * GH-2184: Fix FPs in `FunctionParamVisitor` when parameters are shadowed. (Benjamin Bannier, Corelight)

    The tracking of parameter use in `FunctionParamVisitor` relied on IDs to
    correlate seen `expression::Name`s and parameter declarations. This
    broke down when parameters where shadowed, e.g., we often end up
    shadowing the `__cur` parameter.

    With this patch we additionally check that the resolved `Declaration`
    for an `Name` matches the parameter to take this into account.

    Closes #2184.

1.15.0-dev.86 | 2025-10-23 16:46:27 +0200

  * Remove doctest minimum macOS version hack. (Robin Sommer, Corelight)

    For doctest on macOS, we used to set __MAC_OS_X_VERSION_MIN_REQUIRED
    to some dummy value if not defined otherwise. This broke for me with
    current doctest versions (because we were using an invalid, and too
    old, value of 1000), and it seems it's no longer necessary anyways.

1.15.0-dev.83 | 2025-10-21 21:12:18 +0200

  * Bump 3rdparty/utf8proc from `d7bf128` to `231da1a` (dependabot[bot])

  * Bump CodSpeedHQ/action from 4.1.1 to 4.2.1 (dependabot[bot])

1.15.0-dev.80 | 2025-10-10 10:37:08 +0200

  * Prefer `cmake-core` over `cmake` in FreeBSD CI. (Benjamin Bannier, Corelight)

    It looks like `cmake` has spotty availability across versions, just use
    `cmake-core` instead which should already have what we need.

  * Bump CI to freebsd-13.5. (Benjamin Bannier, Corelight)

  * Bump CodSpeedHQ/action from 4.0.1 to 4.1.1 (dependabot[bot])

1.15.0-dev.76 | 2025-10-09 14:07:47 -0400

  * Fix C++ compile error with Null->optional cast. (Evan Typanski, Corelight)

  * GH-2154: Handle explicit `Null` casts. (Evan Typanski, Corelight)

    Fixes #2154

1.15.0-dev.73 | 2025-10-02 07:55:18 +0200

  * Fix C++ code generation for struct parameters passed as references. (Benjamin Bannier, Corelight)

    Previously we could generate C++ moves for constructor arguments passed
    as references. This is semantically incorrect, but seems to have had no
    ill effects on code we generated. Since it could still confuse readers
    and static analysis tools fix this to only generate moves if the
    argument was passed as `copy`, but write out copies for all other
    argument passing. This more clearly reflects what was already happening.

1.15.0-dev.71 | 2025-09-30 12:58:41 +0200

  * Bump 3rdparty/utfcpp from `f931919` to `961e7a3` (dependabot[bot])

1.15.0-dev.69 | 2025-09-23 09:56:26 +0200

  * Bump 3rdparty/utfcpp from `cfea16a` to `f931919` (dependabot[bot])

1.15.0-dev.67 | 2025-09-18 08:32:35 -0400

  * GH-2171: Fix misnamed variable [skip CI]. (Evan Typanski, Corelight)

1.15.0-dev.65 | 2025-09-18 08:18:45 +0200

  * Cleanup some optimizer code. (Evan Typanski, Corelight)

    This includes a fix for a Coverity issue that shouldn't flag since
    `succ_node` is directly from the graph.

  * GH-2158: Add environment variable to omit CFG dataflow. (Evan Typanski, Corelight)

    Closes #2158

    It gets really annoying to have dataflow facts when they're not getting
    used, so this adds an environment variable to disable them.

1.15.0-dev.62 | 2025-09-18 08:16:27 +0200

  * Bump hendrikmuhs/ccache-action (dependabot[bot])

  * Bump CodSpeedHQ/action from 3.8.1 to 4.0.1 (dependabot[bot])

  * Bump 3rdparty/utf8proc from `72918b9` to `d7bf128` (dependabot[bot])

  * Bump 3rdparty/utfcpp from `e66f648` to `cfea16a` (dependabot[bot])

  * Bump hendrikmuhs/ccache-action (dependabot[bot])

1.15.0-dev.54 | 2025-09-09 09:19:06 +0200

  * Fix ASAN false positive on ARM. (Robin Sommer, Corelight)

    Our fiber code could trigger ASAN to report a false positive: If a
    block of memory had already been used before as stack memory for a
    previously existing fiber, that usage may have left ASAN guard regions
    in place reflecting the state when that old fiber finished. If we were
    now reusing the same memory for a new fiber's stack, ASAN would
    continue to check any accesses against that old state. So when this
    memory now got reinitialized with a new stack structure (i.e.,
    essentially writing to arbitrary locations inside the block), those
    writes could trigger ASAN to report an out-of-bounds access.

    The solution is to explicitly clear that memory with ASAN before
    reusing.

    This triggered on ARM, but could have just as well triggered in x86 as
    well. I think it was just by chance that x86 ended up working.

1.15.0-dev.52 | 2025-09-08 11:23:42 -0400

  * Fix resource leak if OOM. (Evan Typanski, Corelight)

  * Fix variable copied when should move. (Evan Typanski, Corelight)

  * Fix auto causes copy. (Evan Typanski, Corelight)

  * Fix dereference null return values. (Evan Typanski, Corelight)

    These seem perfectly valid since they're guaranteed elsewhere.
    So just add assertions.

1.15.0-dev.47 | 2025-09-05 17:21:04 +0200

  * Use default implementation for `GraphNode` assignment operator. (Benjamin Bannier, Corelight)

  * Add unit parameters to function body flows. (Benjamin Bannier, Corelight)

1.15.0-dev.44 | 2025-09-04 16:49:53 +0200

  * Enable control-flow based optimizations by default. (Benjamin Bannier, Corelight)

1.15.0-dev.42 | 2025-09-03 10:56:22 -0400

  * Move CFG printing from optimizer to `ASTContext`. (Evan Typanski, Corelight)

  * GH-2150: Coerce `Null` to false and optimize it. (Evan Typanski, Corelight)

    Fixes #2150

    This does 2 things:

    1) Makes Null (and null-like-things, like a strong ref ctor) coerce to
       False when coercing to a boolean.
    2) Allows the optimizer to work with boolean coercions.

    In turn, this lets the optimizer get rid of `if (!Null)` checks that got
    constant propagated from a previous optimizer run.

  * Run all optimizations until convergence. (Evan Typanski, Corelight)

    This is the first step to get the optimizer to play nicely with
    coercion. We run resolution/coercion after optimization, but if we want
    tho optimizer to play nice with newly-coerced results, we have to run
    the optimizer after the coercion as well. This way, changes in coercion
    from constant propagation can make other optimizations run.

  * Use the correct form of `deepcopy`. (Evan Typanski, Corelight)

  * Fix optimizer phases not returning to previous. (Evan Typanski, Corelight)

    Since the outer modified was continuously set to `false` this would
    cause incorrect results. The outer `modified` would always be false when
    it broke out of phases.

1.15.0-dev.36 | 2025-09-03 15:57:28 +0200

  * Add Ubuntu 24 to installation instructions. (Robin Sommer, Corelight)

1.15.0-dev.34 | 2025-09-03 15:56:51 +0200

  * Enforce naming conventions across toolchain using clang-tidy. (Robin Sommer, Corelight)

    This comes with one style clarification: for static, file-local
    functions we had an inconsistent mix of prefixing their names with an
    underscores vs not. The original intent was to have that prefix, but I
    don't see a way to enforce it through clang-tidy, and it's hard to
    find all those instances not having the prefix otherwise. So switching
    over to not using an underscore prefix.

  * Enable clang-tidy's naming check. (Robin Sommer, Corelight)

    Not sure why this was excluded: we want it for the toolchain, and it
    doesn't seem to hurt for the rest.

  * Add `--use-clang-tidy` flag to `configure`. (Robin Sommer, Corelight)

  * Prettify configure output for sanitizers. (Robin Sommer, Corelight)

1.15.0-dev.29 | 2025-09-02 19:31:52 +0200

  * Rename variable for clarity. (Benjamin Bannier, Corelight)

  * Use non-legacy ruff-check version for pre-commit. (Benjamin Bannier, Corelight)

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Remove workaround for C++17. (Benjamin Bannier, Corelight)

  * GH-2124: Fix computation of aliasing and variable access in CFG. (Benjamin Bannier, Corelight)

  * Fix cfg handling of RHS assignments in variable declarations. (Benjamin Bannier, Corelight)

  * Properly store declarations. (Benjamin Bannier, Corelight)

  * Prevent removing switch statements which only have a default case. (Benjamin Bannier, Corelight)

  * Fix CFG modelling of switch cases with multiple labels. (Benjamin Bannier, Corelight)

  * Properly model switch case condition reads. (Benjamin Bannier, Corelight)

1.15.0-dev.18 | 2025-08-26 13:12:38 +0200

  * Bump CodSpeedHQ/action from 3.8.0 to 3.8.1 (dependabot)[bot]

1.15.0-dev.16 | 2025-08-26 12:29:35 +0200

  * Bump 3rdparty/utfcpp from `da71cf9` to `e66f648` (dependabot[bot])

1.15.0-dev.14 | 2025-08-20 09:45:21 -0400

  * Sort the CFG for constant propagation. (Evan Typanski, Corelight)

  * Log dataflow iterations for constant propagation. (Evan Typanski, Corelight)

  * Fix potential infinite loop in constant propagation. (Evan Typanski, Corelight)

  * Cleanup CFG code slightly. (Evan Typanski, Corelight)

1.15.0-dev.9 | 2025-08-19 11:20:59 -0400

  * GH-2146: Handle `switch` statements in CFG. (Evan Typanski, Corelight)

    Closes #2146

  * GH-2137: Add constant propagation pass. (Evan Typanski, Corelight)

    Closes #2137

  * Mark operators `InOut` if they change operand. (Evan Typanski, Corelight)

1.15.0-dev.5 | 2025-08-19 08:00:23 +0200

  * Bump 3rdparty/utf8proc from `20d192a` to `72918b9` (dependabot[bot])

  * Bump hendrikmuhs/ccache-action (dependabot[bot])

1.15.0-dev.2 | 2025-08-18 15:49:52 -0400

  * GH-2144: Fix function parameter/local name clash. (Evan Typanski, Corelight)

    Fixes #2144

1.15.0-dev | 2025-08-14 16:38:55 +0200

  * Start of 1.15.0 development. (Benjamin Bannier, Corelight)

1.14.0 | 2025-08-14 16:34:53 +0200

  * Release 1.14.0.

1.14.0-dev.214 | 2025-08-13 16:33:42 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Drop debian-11, add debian-13. (Benjamin Bannier, Corelight)

1.14.0-dev.211 | 2025-08-13 12:26:20 +0200

  * Rework how we store the fields offsets inside a struct. (Robin Sommer, Corelight)

    So far Spicy was tracking unit field offsets by storing an additional
    vector in each compiled struct that was recording begin/end position
    of the fields. That was fragile because it depended on the order of
    the structs' fields matching the order of unit fields exactly,
    including which ones were emitted at all. That happened to work, but
    was cumbersome to maintain that way. And with all the upcoming
    optimization work, depending on field specifics in the final struct,
    certainly isn't not a good ideas either.

    This work changes the vector to a map indexed by field ID, making
    maintenance and access of the information much easier and well
    defined. While somewhat slower, offset tracking is already an opt-in
    feature (`spicyc -Q`) that assumes performance isn't critical.

    This also brings one new feature: In addition to the fields' offsets,
    we now also record beginning and end offsets of the whole struct
    itself. We store that in a map entry hardcoded to `self` (because
    that's a reserved ID, it cannot conflict with a field name).

    Tested through the existing (and updated) spicy-dump code/tests.

  * Prettify usage message. (Robin Sommer, Corelight)

  * Add width of underlying integer to type information for bitfields. (Robin Sommer, Corelight)

  * Add bit ranges to type information for bitfields. (Robin Sommer, Corelight)

    Now host applications can retrieve the bit range for each bit field.

  * Fix unit test for bitfields. (Robin Sommer, Corelight)

    This worked only through sheer luck.

  * Remove `AttributeSet::has()`. (Robin Sommer, Corelight)

    `AttributeSet::find()` is good enough.

  * Add `&cxx-any-as-ptr` attribute. (Robin Sommer, Corelight)

    This is a very niche attribute extending the host application API:
    Given an external C++ function that's made available to HILTI/Spicy
    through `&cxxname`, if that function has a parameter of type `any`,
    HILTI normally passes the corresponding argument by *reference* to the
    argument's original type. This works well if the C++ implementation
    for the target function uses a template parameter to receive the
    argument, which is how we use `any` inside the HILTI/Spicy runtime
    libraries at various points. It however doesn't work well if we don't
    want to (or cannot) use templates, for example because the function is
    part of a library without a corresponding C++ template header.

    For that case, this adds a new attribute `&cxx-any-as-ptr` that can be
    added to an `any` parameter to change the passing convention to pass a
    *pointer* instead of a reference. The pointer is still typed according
    to the value the caller passes, but now it can be received by
    implementations taking a `void *`. Along with the type information
    that HILTI provides to the C++ function as a subsequent argument
    (which we already did; no change), the receiving function can now for
    example create a standard runtime `type_info::Value` instance for the
    `any` argument and work with that generically. If HILTI is asked to
    generate a prototype for the external function, it also generates that
    with `void *` now if the attribute is present.

    For the record, I considered changing to pointers generally, but
    by-reference has some advantages for the cases where it works, for
    example by being able to pass RHS values.)

    If this is all hard to comprehend, see
    `tests/hilti/codegen/cxx-any-as-ptr.hlt` for an example. :)

    The patch also includes a small fix for generating the C++ prototype
    for such a function: we missed including the type information into the
    prototype as an additional argument coming with `any` parameters.

    (No tests for the various failure modes of applying the new attribute
    wrongly, like without `&cxxname` on the function. Validator checks are
    in place, but seems not worth the extra tests.)

  * Include all fields into a struct's type information, even if not emitted. (Robin Sommer, Corelight)

    So far, a host application couldn't learn about any fields in a HILTI
    `struct` that, although defined by the HILTI type, were skipped from
    the C++ struct generated by the codegen (e.g., because it's anonymous
    and hence won't receive a value anyways). Now we include these fields
    into the struct's type information as well, so that they can still be
    discovered during introspection. The field's type information gains a
    new flag for querying whether it has been emitted. However, when
    iterating a struct's field *values* (in contrast to its field
    *types*) we continue to skip these fields since they don't have a
    value after all. This also means that existing host applications
    shouldn't run into any trouble when iterating the values, nothing
    changes there.

1.14.0-dev.199 | 2025-08-12 10:03:45 +0200

  * Bump hendrikmuhs/ccache-action (dependabot[bot])

  * Bump actions/checkout from 4 to 5 (dependabot[bot])

  * Bump CodSpeedHQ/action from 3.7.0 to 3.8.0 (dependabot[bot])

1.14.0-dev.195 | 2025-08-01 15:24:19 +0200

  * Move data instead of copying. (Benjamin Bannier, Corelight)

  * Always initialize pointer member. (Benjamin Bannier, Corelight)

1.14.0-dev.192 | 2025-07-30 08:44:58 -0400

  * Avoid removing `__captures` from non-public units. (Evan Typanski, Corelight)

    This caused a regression/C++ compiler error in spicy-nats.

1.14.0-dev.190 | 2025-07-29 17:56:01 +0200

  * Track kill set for each declaration. (Benjamin Bannier, Corelight)

  * Include declaration for `in` and `out` set when rendering CFG. (Benjamin Bannier, Corelight)

  * GH-2123: Fix dataflow extraction of reads and writes in assignments. (Benjamin Bannier, Corelight)

1.14.0-dev.186 | 2025-07-25 17:55:15 +0200

  * Fix broken BTest meta in tests. (Benjamin Bannier, Corelight)

1.14.0-dev.182 | 2025-07-23 15:48:45 +0200

  * Fix typo in NEWS. (Benjamin Bannier, Corelight)

  * Drop unused swig dependency in CI setups. (Benjamin Bannier, Corelight)

  * Add missing base class specifier. (Benjamin Bannier, Corelight)

  * Fix stringification of `pack`. (Benjamin Bannier, Corelight)

  * Fix HILTI printing of LogicalAnd. (Benjamin Bannier, Corelight)

  * Reformat code for compiler and linker flags. (Benjamin Bannier, Corelight)

  * Fix misformatted BTest test doc. (Benjamin Bannier, Corelight)

  * Remove some dead statements. (Benjamin Bannier, Corelight)

    This patch adds a component to compute control and data flow for
    statements. We then use this component to detect "dead statements",
    i.e., statements which are not seen by any other needed computations.

    This control flow analysis is sensitive to other passes cleaning up code
    and introduce an ordering dependency, e.g., the pass removing unused
    statements might interfere with a pass recognizing certain code patterns
    like `PeepholeOptimizer`'s removal of error push/pop constructs. For
    that reason we need to run passes in some order which is implemented by
    assigning phases to passes and running them in order; after each pass we
    use the `PeepholeOptimizer` to clean up the simplified code.

    Currently we handle two classes of dead statements:

    - assignments which are override before being used
    - unreachable code, e.g., due to preceding `return` or `throw`

    While the latter is pretty straightforward, the former becomes tricky
    due to exceptions. In Spicy pretty much any expression could throw, and
    without fully modelling this control flow becomes practically
    unmanageable. We work around this by ignore possibly throwing
    expressions when constructing the control flow graph, but instead taking
    into account whether the effect of a statement is actually visible. In
    that framework to decide whether a write to a block-local declaration is
    visible we can use regular data flow; for "globally visible data" on the
    other hand we always need to consider each write potentially visible. We
    need to treat globals, `inout` parameters and struct members as globally
    visible.

  * Add `UnqualifiedType::isAliasingType`. (Benjamin Bannier, Corelight)

  * Fix Peephole optimizer to gracefully handle groupings. (Benjamin Bannier, Corelight)

    This isn't really needed for code we generate, but without it it is
    impossible to directly test this pass.

  * Mark `hilti::util::detail::internalError` noreturn. (Benjamin Bannier, Corelight)

  * Make `Node::identity` deterministic. (Benjamin Bannier, Corelight)

  * Add class for working with directed graphs. (Benjamin Bannier, Corelight)

  * Add side effects to some tests. (Benjamin Bannier, Corelight)

    The statements we were using previously would get removed by dead code
    removal.

1.14.0-dev.167 | 2025-07-22 15:11:08 +0200

  * Bump 3rdparty/utf8proc from `571a3ca` to `20d192a` (dependabot[bot])

1.14.0-dev.165 | 2025-07-18 11:04:51 +0200

  * Bring back debian-11 CI. (Benjamin Bannier, Corelight)

    I incorrectly removed this in 6a2d959d57a1ee503d53fe4c10d1ce50c6e5414a,
    but it looks like it is actually not EOL live yet and we need to keep
    supporting it.

  * GH-2120: Add non-range workaround for gcc-10.2.1. (Benjamin Bannier, Corelight)

    Closes #2120.

1.14.0-dev.162 | 2025-07-16 14:03:49 +0200

  * Fix missing inline functions in enum prototypes. (Robin Sommer, Corelight)

    Our prototype generation could miss function bodies for `inline`
    functions.

1.14.0-dev.160 | 2025-07-15 14:23:49 -0400

  * Avoid changing `parseX` function signatures. (Evan Typanski, Corelight)

    These may get removed, but should not be changed because the runtime
    library relies on their signatures. Therefore, a new attribute was
    added.

  * Refactor getting a function's ID to the decl. (Evan Typanski, Corelight)

    The ID associated with the function includes the module that the decl is
    in, so in order to get the proper ID it needs the prototype's module.
    This was used in a few places, so it seems like a good helper in the
    decl or the context.

  * Don't remove params with side effects. (Evan Typanski, Corelight)

  * GH-2030: Remove unused function parameters. (Evan Typanski, Corelight)

    Closes #2030

    This uses the new operator uses in order to remove function parameters.
    Technically this can be done within the visitor, but it sets up to not
    require visiting all expressions when pruning decls and uses. It's also
    conceptually simpler (to me).

    This will be particularly useful after a couple more optimizations,
    where parse functions won't need nearly as many arguments if they're
    only used in returns (and simply passed through without ever using
    them). This is a relatively common pattern, enough so that this should
    decrease the overhead of large numbers of small units substantially when
    combined with future optimizations.

  * GH-2029: Track HILTI operator uses. (Evan Typanski, Corelight)

    Closes #2029

    This does not provide much rewriting infrastructure yet, but the rest
    can be handled with helpers as needed. One use would be provide a
    function which writes something before or after a given call (which may
    be in a block). This would be necessary if we remove parameters that may
    have side effects in the future. It's also necessary later when changing
    return types and values of functions. But, for now, it is not.

1.14.0-dev.154 | 2025-07-15 14:18:28 +0200

  * Clean up temporary JIT output files. (Robin Sommer, Corelight)

1.14.0-dev.152 | 2025-07-15 13:07:33 +0200

  * Make parser constructor choice easier for C++20. (Evan Typanski, Corelight)

    GCC 15 with C++20 was confused about its constructor when selecting for
    templates, making it think that recursive types were not copy/move
    constructible (thanks to the non-explicit constructor). Mark it as
    explicit so that it's easier for the compiler to see the true way
    forward.

  * Fix uninitialized pointers causing segfault. (Evan Typanski, Corelight)

    This was the cause of a segfault on opensuse15_6 (+more).

  * Initialize all `Parser` members. (Benjamin Bannier, Corelight)

  * Disable GCC warnings instead just making them non-fatal. (Benjamin Bannier, Corelight)

    The previous approach was to make some noisy GCC warning non-fatal which
    often triggered FPs. This meant that users could build with `-Werror`,
    but they would still see the warnings.

    With this patch we just completely disable these warning categories
    since they are not actionable anyway.

  * Bump to gcc-14 in opensuse-15.6 CI setup. (Benjamin Bannier, Corelight)

  * Work around PathFind relying on presence of `BSD` preproc define. (Benjamin Bannier, Corelight)

    It looks like with our switch to C++20 that macro is not present
    anymore, but it seems that we can use `__FreeBSD__` to detect whether we
    should set it.

  * Silence GCC's `-Wmaybe-uninitialized` since it serves too many FPs. (Benjamin Bannier, Corelight)

  * Add missing include. (Benjamin Bannier, Corelight)

  * Silence FP from GCC. (Benjamin Bannier, Corelight)

  * Remove EOL debian-11. (Benjamin Bannier, Corelight)

  * Include cleanup. (Benjamin Bannier, Corelight)

  * Switch from `linb::any` to `std::any`. (Benjamin Bannier, Corelight)

    We introduced `linb::any` to work around the broken implementation of
    `std::any` with the version of GCC shipping with debian-10. We have in
    the meantime dropped support for debian-10, and also require a compiler
    with support for C++20, so `std::any` should be well-supported.

  * Switch from `ghc::filesystem` to `std::filesystem`. (Benjamin Bannier, Corelight)

    Filesystem was added in C++17. Since we now require C++20 we can assume
    that compilers support `std::filesystem` reasonably well.

  * Fix modernize-loop-convert. (Benjamin Bannier, Corelight)

  * Fix modernize-use-starts-ends-with. (Benjamin Bannier, Corelight)

  * Fix readability-container-contains. (Benjamin Bannier, Corelight)

  * Fix modernize-use-ranges. (Benjamin Bannier, Corelight)

  * Fix modernize-use-integer-sign-comparison. (Benjamin Bannier, Corelight)

  * Fix modernize-use-designated-initializers. (Benjamin Bannier, Corelight)

  * Fix modernize-concat-nested-namespaces. (Benjamin Bannier, Corelight)

  * Fix modernize-use-constraints. (Benjamin Bannier, Corelight)

  * Rename `Set` member type alias. (Benjamin Bannier, Corelight)

  * Switch compilation to C++20. (Benjamin Bannier, Corelight)

1.14.0-dev.128 | 2025-07-15 09:30:08 +0200

  * Bump hendrikmuhs/ccache-action (dependabot[bot])
  * Bump CodSpeedHQ/action from 3.5.0 to 3.7.0 (dependabot[bot])
  * Bump 3rdparty/utf8proc from `b2f72ca` to `571a3ca` (dependabot[bot])

1.14.0-dev.124 | 2025-07-10 09:06:27 -0400

  * Document operator precedence. (Evan Typanski, Corelight)

  * GH-1905: Make `in` have less binding power. (Evan Typanski, Corelight)

    Closes #1905

    It was really unintuitive that `in` would bind so closely.

  * Clean up operator precedence in spicy grammar. (Evan Typanski, Corelight)

    This should have minimal changes to functionality. Some known changes
    include:

    - Function calls were updated to only parse from scoped IDs
    - `++` and `--` now share a precedence, with right associativity. This
      should manifest very, very rarely.
    - Unary negate had its precedence changed to match other unary operators

1.14.0-dev.120 | 2025-07-09 17:23:49 +0200

  * Fix visibility of C++ globals storing linker scopes. (Robin Sommer, Corelight)

    We emitted them as weak symbols, but that wasn't right because that
    way multiple HLTOs could end up using the same scope value.

    The requirements for the scope symbols are: (1) inside a single HLTO,
    all object files link to the same symbol; and (2) across HLTOs, they
    must not be visible. Setting their visibility to `hidden` archives this.

    (I checked our other weak symbols as well, and I believe they work
    correctly as is.)

  * Add linker scope to more debugging output. (Robin Sommer, Corelight)

  * When looking up parsers, allow to consider linker scope. (Robin Sommer, Corelight)

    This is optional and doesn't change existing behavior. No immediate
    need for this actually, but it seems that (1) it's reasonable to
    offer, and (2) it lets callers think about if scopes matter for them.

  * Fix remaining places where we passed scopes as `string`. (Benjamin Bannier, Corelight)

    This is a fixup for 2ac6fa117615662472a0b578a991e76fc582a518.

  * Allow registering multiple modules in the same scope. (Benjamin Bannier, Corelight)

    In 2ac6fa117615662472a0b578a991e76fc582a518 we switched to dynamically
    injecting scopes for libraries. This assumed that
    `Library::currentScope` was called exactly once per collection of
    inputs, but this is not the case if there are multiple modules in such a
    collection which each need to register. `Library::currentScope` was
    called once per module, but if one does not compile to a HLTO file it
    uses an implementation which returns a new value for each invocation.
    This was a problem in e.g., Zeek where we do not use HLTO files, but
    instead generate C++ code for all files of a collection

    This patch changes generated code so it only override the scope variable
    embedded in generated code if it was not already set up. We need an
    extra twist for the case of separately compiled linker files as tested
    by `tests/hilti/hiltic/cc/separate-units.hlt`; for that we add a new
    method to `Library` which allows to detect whether `currentScope` would
    return a stable or generated value.

1.14.0-dev.114 | 2025-07-08 09:58:31 +0200

  * Bump 3rdparty/utfcpp from `0bef8b2` to `da71cf9` (dependabot[bot])

1.14.0-dev.112 | 2025-07-03 09:51:05 -0400

  * Fix clang-tidy CRTP lint in IDBase. (Evan Typanski, Corelight)

    The warning is bugprone-crtp-constructor-accessibility.

  * Update clang-tidy config to run on files with `-`. (Evan Typanski, Corelight)

  * Fix random includes, copyright, and `auto` use. (Evan Typanski, Corelight)

1.14.0-dev.108 | 2025-06-27 07:45:06 +0200

  * GH-1085: Allow registering a module twice. (Robin Sommer, Corelight)

    So far, if one compiled the same HILTI module twice, each into its own
    HLTO, then when loading the two HLTOs, the runtime system would skip
    the second instance. However, that's not really what we want: a module
    could intentionally be part of multiple HLTOs, in which case each
    should get its own copy of that module state (i.e., its globals).

    This change allows the same module to be registered multiple times,
    with the HLTO linker scope distinguishing between the instances at
    runtime, as usual. To make that work, we move computation of the scope
    from compile time to runtime, using the library's absolute path as the
    scope.

    A complication is that we don't always load modules through HLTO
    files: they can also be turned into C++ code that is then manually
    compiled. In that case, generate unique scope IDs for each such
    module.

    Internally, to simplify memory management, we switch the scopes from
    a string representation to an uint64 hash of a string.

1.14.0-dev.106 | 2025-06-26 17:26:52 +0200

  * Remove stale code. (Robin Sommer, Corelight)

  * Update architecture diagram for new toolchain. (Robin Sommer, Corelight)

  * GH-2100: Add missing deref operations for struct try-member/has-member operators. (Robin Sommer, Corelight)

    The regular member access operators already did this.

1.14.0-dev.100 | 2025-06-26 10:53:29 +0200

  * Render all bitfield instances with included field names. (Robin Sommer, Corelight)

    This requires passing the bitfield type information into bitfield
    instances, which then allows us to unify the printing.

    Most of the change is pretty mechanical to get us access to the
    typeninfo. Plus, this also contains a fix where the `bits` typeninfo
    previously would point directly to the stored integer type, even
    though we wrap the integers into `optional` values and hence the
    typeninfo should correctly reflect that.

  * GH-1660: When printing anonymous bitfields inside a struct, lift up the fields. (Robin Sommer, Corelight)

    This now prints, e.g.,  `[$fin=1, $rsv=0, $opcode=2, $remaining=255]`
    instead of `[$<anon>=(1, 0, 2, 255)]`.

    In addition, we also prettify non-anonymous bitfields. They now print
    as, e.g., `[$y=(a: 4, b: 8)]` instead of `[$y=(4, 8)]`.

    The implementation is a bit of hack (because we normally don't convey
    type information through `cxx::*` elements) but can't of think
    anything nicer.

    Tested through updates to existing tests.

  * GH-2052: Move calling convention from function to function type.
    (Evan Typanski / Robin Sommer, Corelight)

    Includes slight cleanup for printing out methods: we now prefix them
    just with `method` instead of `method extern`.

1.14.0-dev.95 | 2025-06-26 09:55:25 +0200

  * Fully implement iterator interface for `set::Iterator`. (Benjamin Bannier, Corelight)

1.14.0-dev.93 | 2025-06-24 10:40:39 +0200

  * Bump 3rdparty/utfcpp from `65701fe` to `0bef8b2` (dependabot[bot])

1.14.0-dev.91 | 2025-06-24 10:40:26 +0200

  * Bump 3rdparty/utf8proc from `24e2a19` to `b2f72ca` (dependabot[bot])

1.14.0-dev.89 | 2025-06-23 08:41:57 -0400

  * GH-2091: Fix strong->value reference coercion in calls. (Evan Typanski, Corelight)

    Fixes #2091

    Calls would auto-deref any strong references when resolving the function
    call. But, this auto-deref gets removed for units because of
    7f269c5da866bd9da744ebdb7784641e1affce3f. For `new` calls, this
    continued to work because they then got *re-resolved*. Calls did not
    have this. This simply adds that re-resolution to function calls.

    Technically this could apply to methods, but I couldn't trigger it in
    Spicy, so I left it.

  * Cleanup comments and unused function. (Evan Typanski, Corelight)

1.14.0-dev.86 | 2025-06-18 12:34:03 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Fix performance issues flagged by static analysis. (Benjamin Bannier, Corelight)

1.14.0-dev.83 | 2025-06-13 09:59:13 -0400

  * GH-1996: Catch exceptions in `processInput` gracefully. (Evan Typanski, Corelight)

    Fixes #1996

    The exceptions bubbled up to `main` then got caught in those exception
    handlers with `spicy-driver`, so something like `spicy-driver -Z` would
    not emit profiling information if there was a parse error. This makes
    exceptions get caught sooner so that the calling code can use the same
    error mechanisms as already exist in order to gracefully exit.

1.14.0-dev.81 | 2025-06-10 21:33:18 +0200

  * GH-2066: When C++ compilation fails, ask user for help. (Robin Sommer, Corelight)

    This records the C++ compiler in a dedicated output file
    "hilti-jit-error.log", and asks the user to file a ticket. If the
    environment variable `HILTI_JIT_SHOW_CXX_OUTPUT` is set, the output
    will also go to stderr. We set this variable inside CI.

    Before, the process management code was trying to capture the output
    in memory, but that didn't actually work, it always ended up on stderr
    anyways. Now we tell reproc to just write all compiler output into a
    temporary file, where we can then copy it from if needed.

  * GH-2086: Fix scope resolution of local variables. (Robin Sommer, Corelight)

    If usage of a local comes before its declaration, we now no longer
    resolve that usage to this local. It'll either be resolved to an
    upper layer ID (if there is one of the same name), or rejected if it's
    otherwise unknown.

1.14.0-dev.77 | 2025-06-10 17:48:03 +0200

  * GH-1988: Enforce that block-local declarations must be variables. (Robin Sommer, Corelight)

    Logically we already had this restriction in place, but so far it
    would lead to either a crash or an internal error.

  * GH-2078: Fix C++ output for constants of constant type. (Robin Sommer, Corelight)

  * GH-2044: Catch if methods are implemented multiple times. (Robin Sommer, Corelight)

1.14.0-dev.71 | 2025-06-10 15:48:21 +0200

  * Bump 3rdparty/utf8proc from `a1b99da` to `24e2a19` (dependabot[bot])

1.14.0-dev.69 | 2025-06-06 15:53:34 +0200

  * Make `-Wstringop-overflow` not fatal with gcc. (Benjamin Bannier, Corelight)

1.14.0-dev.67 | 2025-06-06 14:09:59 +0200

  * Fix `readability-qualified-auto` lint. (Benjamin Bannier, Corelight)

  * Bump main CI image to ubuntu-24.04. (Benjamin Bannier, Corelight)

  * Make `-Warray-bounds` not fatal with gcc-13.0. (Benjamin Bannier, Corelight)

    This diagnostic returns false positives in code we do not own and in
    ways which are hard to work around with pragmas, see e.g.,
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111273.

  * Add benchmark for iteration of rt containers. (Benjamin Bannier, Corelight)

    This patch repurposes the existing `hilti-rt-fiber-benchmark` to be a
    more general benchmark suite of HILTI runtime behaviors.

  * GH-1663: Speed up checking of iterator compatibility. (Benjamin Bannier, Corelight)

    We were previously using a control block which held a weak_ptr to the
    protected data. This was pretty inefficient for a number of reasons:

    - access to the controlled data always required a `weak_ptr::lock` which
      created a temporary shared_ptr copy and immediately destroyed it after
      access
    - to check whether the control block was expired we used `lock` instead
      of `expired` which introduced the same overhead
    - to check compatibility of iterators we compared shared_ptrs to the
      control data which again required full locks instead of using
      `owner_before`

    This patch introduces a new control block data structure and uses it
    across all classes which previously held ad hoc implementations
    (`Bytes`, `Map`, `Set`, `Vector`). The main improvement is that we now
    separate tracking liveliness and the data, and use a better
    implementation for control block equality checks. With the new
    implementation I see throughput improvements across the board for
    anything needing to iterate, e.g., I see bytes iteration being up to 30x
    faster in trivial setups; the code from the original issue is now 10x
    faster.

    Closes #1663.

1.14.0-dev.61 | 2025-06-05 15:47:29 +0200

  * GH-2064: Ensure generated typeinfos are declared before used. (Robin Sommer, Corelight)

1.14.0-dev.59 | 2025-06-05 08:44:03 -0400

  * GH-2063: Fix C++ compilation issue with weak->strong refs. (Evan Typanski, Corelight)

1.14.0-dev.55 | 2025-06-04 10:34:41 +0200

  * Add codspeed integration. (Benjamin Bannier, Corelight)

1.14.0-dev.53 | 2025-05-28 15:46:04 +0200

  * Fix fiber abortion. (Robin Sommer, Corelight)

    When aborting a fiber, we need to activate it once more, to then leave
    it for good by raising an `AbortException. Problem was that that
    exception ended up being caught by user code because it was derived
    from `std::exception`. This change removes the base class so that the
    exception is guaranteed to go back to the managing fiber code, where
    we just ignore it.

1.14.0-dev.51 | 2025-05-28 10:25:20 +0200

  * Prevent throwing naked exception when yielding from aborted fiber. (Benjamin Bannier, Corelight)

1.14.0-dev.49 | 2025-05-27 09:14:21 +0200

  * Fix test for alpine-3.18.3. (Benjamin Bannier, Corelight)

    Since recently `wordexp` on Alpine seems to ignore the `WRDE_UNDEF`
    flag. This fixes the test to accommodate that.

  * Use namespaced option for `3rdparty/justrx`. (Benjamin Bannier, Corelight)

  * Do not build benchmarks or test for `3rdparty/justrx`. (Benjamin Bannier, Corelight)

    To run benchmarks or unit tests for that project we should just run them
    over there.

  * Allow disabling building of tests. (Benjamin Bannier, Corelight)

    This patch adds a new CMake option `SPICY_ENABLE_TESTS` which if toggled
    on forces building of test and benchmark binaries; it is `ON` by
    default. This flag can be used by projects building Spicy to disable
    building of tests if they are not interested in them. We also provide a
    configure flag `--disable-tests` which has has the effect of turning it
    off.

  * Only build benchmarks when building `test` target. (Benjamin Bannier, Corelight)

1.14.0-dev.43 | 2025-05-26 12:43:01 +0200

  * Bump 3rdparty/doctest from `3a01ec3` to `1da23a3` (dependabot[bot])

1.14.0-dev.41 | 2025-05-23 07:54:50 -0400

  * Fix auto causes copies. (Evan Typanski, Corelight)

  * Fix copy instead of moves. (Evan Typanski, Corelight)

1.14.0-dev.38 | 2025-05-20 17:33:54 +0200

  * GH-2061: Fix cyclic usage of units types inside other types. (Robin Sommer, Corelight)

    We had cyclic dependencies partially solved through the `&on-heap`
    conversion, but weren't consistently applying it to types nested
    inside others.

  * Fix compiler error. (Robin Sommer, Corelight)

  * Small tweak to builder API so that we can create index expression
    with operands other than integers. (Robin Sommer, Corelight)

  * Add API method to ctors to see if they create a reference. (Robin Sommer, Corelight)

1.14.0-dev.33 | 2025-05-20 10:28:07 -0400

  * GH-2065: Error for redefined locals from statement inits. (Evan Typanski, Corelight)

    Closes #2065

    This now properly errors in Hilti from code that redefines a local
    inside a statement with an initializer, like:

    for (i in vec) {
        local int<64> i = 5;
    }

    This avoids a C++ error later.

1.14.0-dev.31 | 2025-05-14 14:14:32 +0200

  * GH-2057: Fix `bytes` iterator dereference operation. (Robin Sommer, Corelight)

    It now returns a safe integer.

  * GH-2059: Remove the documentation's linkcheck from CI. (Robin Sommer, Corelight)

    This is now instead part of the release checklist.

1.14.0-dev.27 | 2025-05-13 17:12:24 -0400

  * Add `FileCheck` tests. (Evan Typanski, Corelight)

1.14.0-dev.25 | 2025-05-13 14:32:23 +0200

  * Use `auto*` instead of `auto`. (Benjamin Bannier, Corelight)

1.14.0-dev.23 | 2025-05-13 14:31:45 +0200

  * Remove unnecessary declaration of `main` as `extern "C"`. (Benjamin Bannier, Corelight)

  * Suppress dedicated compiler warnings from 3rdparty/json. (Benjamin Bannier, Corelight)

  * Upgrade to llvm-20 in CI. (Benjamin Bannier, Corelight)

1.14.0-dev.19 | 2025-05-13 14:31:20 +0200

  * Make doc linkcheck job more verbose. (Benjamin Bannier, Corelight)

  * Fix doc link to Zeek's Slack. (Benjamin Bannier, Corelight)

1.14.0-dev.16 | 2025-05-13 14:30:02 +0200

  * Change `default<T>` to hold a mutable T. (Benjamin Bannier, Corelight)

  * Remove incorrect HILTI printer for `value_ref` ctrs. (Benjamin Bannier, Corelight)

  * Add workaround for rendering init of locals with void expressions. (Benjamin Bannier, Corelight)

  * Add `--skip-validation` flag to `spicy-driver`. (Benjamin Bannier, Corelight)

  * Fix hlt output for exception values. (Benjamin Bannier, Corelight)

  * Fix printing of empty statements. (Benjamin Bannier, Corelight)

1.14.0-dev.9 | 2025-05-09 15:05:44 +0200

  * CI: Drop Fedora 40, add Fedora 42 (Arne Welzel, Corelight)

1.14.0-dev.7 | 2025-05-09 13:37:40 +0200

  * Drop unnecessary Bison include from CMake function. (Benjamin Bannier, Corelight)

    We do not seem to need any includes from Bison, but where previously
    adding some include path in a pretty ad hoc way. This patch performs
    minimal cleanup of this. There is probably the opportunity to clean up
    how we add dependencies with Flex and Bison (e.g., using by refactoring
    how we propagate this and using functionality like
    `add_flex_bison_dependency` at the lowest level), but I punt on that
    here.

1.14.0-dev.5 | 2025-05-08 16:14:22 -0400

  * Fix `hiltic -p` printing invalid functions. (Evan Typanski, Corelight)

1.14.0-dev.2 | 2025-05-08 16:12:21 -0400

  * Prefer stdout over stderr for `--help` messages. (Evan Typanski, Corelight)

    This makes help messages greppable. It also makes incorrect arguments
    not print the whole help message, instead they prompt the user to use
    --help

1.13.0 | 2025-05-08 16:49:41 +0200

1.13.0-dev.222 | 2025-05-08 16:48:26 +0200

  * Update NEWS for v1.13. [skip CI] (Benjamin Bannier, Corelight)

1.13.0-dev.220 | 2025-05-08 09:27:22 +0200

  * Make sure `bytes::to[U]Int` returns runtime integers. (Benjamin Bannier, Corelight)

1.13.0-dev.218 | 2025-05-08 09:25:46 +0200

  * Add `#include <cstdint>` for fixed-width integers (i2z1)

1.13.0-dev.216 | 2025-04-25 10:05:52 -0400

  * Touchup docs style section [skip CI]. (Evan Typanski, Corelight)

    They mentioned a nonexistent Makefile

1.13.0-dev.214 | 2025-04-25 12:33:30 +0200

  * Prevent escape of non-HILTI exception in lower-level driver functions. (Benjamin Bannier, Corelight)

    While we already did some handling of non-HILTI exceptions in Spicy's
    high-level drivers[^spicy-driver] (even though this would allow escape
    of exceptions not deriving from `std::exception`), we did not do the
    same for the lower level processing functionality in the actual driver.
    This is the interface used by e.g., Zeek, and already an
    `std::exception` thrown from a parser would lead to the exception
    propagating into Zeek and ultimately causing a `std::terminate` there,
    see e.g., [this oss-fuzz
    report](https://oss-fuzz.com/testcase-detail/6088469254569984). In that
    particular case a call to `std::vector::reserve` exceeding the available
    memory caused raising of a `std::length_error`.

    This patch extends the exception handling in the driver so all
    exceptions are handled by now transforming any non-HILTI exceptions into
    HILTI exceptions like expected by callers.

    [^spicy-driver]: https://github.com/zeek/spicy/blob/32251850bd8808d18c5dd9306dc0d56c7ebd5d9d/spicy/toolchain/bin/spicy-driver.cc#L331-L334

1.13.0-dev.212 | 2025-04-24 08:31:03 -0400

  * Limit `reserve` calls on vectors to prevent OOM. (Evan Typanski, Corelight)

1.13.0-dev.210 | 2025-04-23 15:32:56 +0200

  * CI: No more Ubuntu 20.04 (Arne Welzel, Corelight)

    EOL in April 2025, remove it now.

1.13.0-dev.208 | 2025-04-23 12:20:45 +0200

  * Bump `justrx`. (Robin Sommer, Corelight)

1.13.0-dev.206 | 2025-04-22 17:40:06 +0200

  * Reserve vectors with repeat counts. (Evan Typanski, Corelight)

    This improves performance of large vectors with a known size by about
    10-20% while not hurting performance of small vectors.

  * Fix minor comment issues in `vector.h`. (Evan Typanski, Corelight)

1.13.0-dev.203 | 2025-04-22 17:38:22 +0200

  * Prevent unneeded copy. (Benjamin Bannier, Corelight)

1.13.0-dev.201 | 2025-04-17 14:03:12 -0400

  * Avoid attribute temporaries for constants. (Evan Typanski, Corelight)

  * GH-2016: Fix `&size` expressions evaluating multiple times. (Evan Typanski, Corelight)

    Fixes #2016

    If the attribute is evaluated multiple times, some cases with side
    effects may unknowingly get evaluated multiple times. This effect would
    be different depending what happens - if there's a parse error, it could
    even trigger an integer overflow when calculating offsets.

    This solution uses a temporary and passes it around the parser builder
    when it's needed. The downside is this is only applicable to `&size`,
    but, luckily, that seems to be all that it currently applies to.

    There are some alternative solutions, but they don't seem right. One
    would be adding the temporary to the attribute, but that relies on only
    retrieving that temporary if you're in the correct scope. Making the
    attribute itself scope-aware seems wrong, as does removing the stored
    expression when it would be out of scope.

    It could also technically apply to the state, but that ended up being
    more cumbersome than seemed necessary.

1.13.0-dev.198 | 2025-04-17 16:52:19 +0200

  * Bump justrx to pull in CCL speed-up. (Robin Sommer, Corelight)

1.13.0-dev.196 | 2025-04-16 13:42:21 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Only disable clang-tidy if CMake version supports it. (Benjamin Bannier, Corelight)

1.13.0-dev.193 | 2025-04-16 10:38:34 +0200

  * GH-1955: Split attributes between HILTI and Spicy. (Robin Sommer, Corelight)

    A previous change had moved knowledge of Spicy attributes into the
    HILTI layer. This splits that out again to separate concerns. The main
    challenge is that we were using C++ enums, which could not be extended
    by Spicy to add its own attributes. We now replace those enums values
    with a custom helper class so that we can define constants at
    multiple places.

    Other than that new helper class, most of the changes are pretty
    mechanical, with the main objective being that Spicy only refers to
    its own attributes for anything that can appear in Spicy source code,
    and uses HILTI attributes only when interacting with the HILTI layer.

1.13.0-dev.191 | 2025-04-15 10:06:29 +0200

  * Drop unreachable lexer rules. (Benjamin Bannier, Corelight)

1.13.0-dev.189 | 2025-04-15 08:30:10 +0200

  * Bump 3rdparty/filesystem from `076592c` to `9fda7b0` (dependabot[bot])

  * Bump 3rdparty/utfcpp from `b26a5f7` to `65701fe` (dependabot[bot])

1.13.0-dev.186 | 2025-04-10 16:06:16 +0200

  * Remove spurious include. (Robin Sommer, Corelight)

1.13.0-dev.184 | 2025-04-10 10:14:16 +0200

  * GH-2013: Disallow illegal characters in hook IDs and a couple other places. (Robin Sommer, Corelight)

    The lexer wasn't handling all cases.

  * Revert "Bring back the internal `__visit` method for generated structs." (Robin Sommer, Corelight)

    This reverts commit 479b2d4bfb88c3010aba21f63db4c2c04a65216a. We now
    *really* don't need this anymore since Zeek has been adapted
    accordingly.

  * GH-2007: Fix using `&try` with `&max-size`, and potentially other cases. (Robin Sommer, Corelight)

    In the generated code, a temporary was declared inside the `try { ...
    }`  block that we create for `&try`, but then used afterwards outside
    of the block. A similar issue probably could have happened in
    other situations as well.

    The fix is to move more of the logic that was so far following the
    `try`-block into the block. This comes with potential slight semantic
    changes where in case of a parse error, before we would have executed
    some post-field logic that now skip. The main example is hooks:
    before, if a field with a `&try` had a hook, this would still run in
    case of a parse error; now it's not running anymore—--which indeed
    seems the better semantics.

  * Let optimizer and dependency tracker ignore unresolved declarations. (Robin Sommer, Corelight)

    This normally doesn't happen because validation catches unresolved
    declarations early. However, for debugging it can be helpful to
    support this when running with `--skip-validation` (e.g., to get to
    the output of `--output-hilti` for debugging broken code generation).

1.13.0-dev.177 | 2025-04-09 12:33:40 +0200

  * Bump 3rdparty/utf8proc from `5568eff` to `3de4596` (dependabot[bot])

1.13.0-dev.175 | 2025-04-08 14:22:30 +0200

  * Make sure `scope_exit` never throws on teardown. (Benjamin Bannier, Corelight)

  * Restructure fold expression for Coverity. (Benjamin Bannier, Corelight)

  * Prevent unneeded copies. (Benjamin Bannier, Corelight)

1.13.0-dev.171 | 2025-04-07 11:31:12 +0200

  * Add `bytes::ends_with`. (Benjamin Bannier, Corelight)

  * Add `string::ends_with`. (Benjamin Bannier, Corelight)

  * Add `hilti::rt::endsWith`. (Benjamin Bannier, Corelight)

1.13.0-dev.167 | 2025-04-02 14:13:29 +0200

  * Fix a path in the CMake config for the recent benchmark. (Robin Sommer, Corelight)

1.13.0-dev.165 | 2025-04-02 12:37:53 +0200

  * Fine-tune recent CMake 4 tweak. (Robin Sommer, Corelight)

1.13.0-dev.163 | 2025-04-02 10:28:07 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Always build benchmarks. (Benjamin Bannier, Corelight)

  * Never build 3rdparty code with `-Werror`. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/benchmark to 1.9.2. (Benjamin Bannier, Corelight)

  * Fix clang-tidy warnings on macos. (Benjamin Bannier, Corelight)

1.13.0-dev.157 | 2025-04-02 10:27:53 +0200

  * Fix minor typos in comments and docs [skip CI]. (Evan Typanski, Corelight)

1.13.0-dev.155 | 2025-04-02 09:59:29 +0200

  * Change runtime representation of tuples. (Robin Sommer, Corelight)

    At runtime, we so far stored HILTI tuples simply as `std::tuple` of
    the corresponding element types. However, that ignored that in HILTI
    tuple elements can remain unset, which that runtime representation
    could not express. This still worked so far because (a) unset elements
    are rare (the main use case is the `.?` operator used inside a tuple
    constructor); and (b) in the cases we needed it, we had C++-side
    template code figure things out a compile time. However, the old
    representation meant that a host application using introspection
    through HILTI's runtime type information, could not receive/see unset
    tuple elements at all.

    This commit changes the runtime tuple representation to wrap all
    elements into `std::optional`. So a HILTI tuple `tuple<T1, T2, T3>`
    now gets turned into `std::tuple<std::optional<T1>, std::optional<T2>,
    std::optional<T3>>`. While that comes with some additional overhead,
    that can now fully capture all possible tuple values. The runtime type
    information is adjusted accordingly as well. While that is a breaking
    change, it presumably affects just Zeek as the only external user of
    that API currently. A corresponding Zeek change is forthcoming.

    The rest of the commit is mainly mechanical: it adapts code generator
    and runtime to work with the new tuple representation.

  * Provide `type_info::Value` constructor not taking a parent. (Robin Sommer, Corelight)

    This leaves the internal member unset, saving an unnecessarily created
    `shared_ptr`.

  * Add mechanism to leave temporary codegen variables uninitialized. (Robin Sommer, Corelight)

    Local variables now support a "special" init expression for
    performance optimization: If the init expression is an instance of
    `expression::Void`, the generated C++ code will not default-initialize
    the variable. That means it's not safe to read from it before it has
    been written to at least once. This avoids the overhead of the
    creating the default value when it's not needed, but it disables
    HILTI's safety property of forcing all runtime values to have
    well-defined content at all times.

    This is a work-around until we have flow-based optimization which
    should be able to figure out automatically when it's safe to skip
    computing the default.

  * Add builder method to create an `add` expression. (Robin Sommer, Corelight)

  * Remove AST node for deferred expressions. (Robin Sommer, Corelight)

    This was no longer used anywhere now.

  * Change FFI calling convention for `any`. (Robin Sommer, Corelight)

    When translating HILTI functions to C++, we now convert any HILTI-side
    arguments of type `any` into *two* C++-side arguments: the value (as
    before) plus a `TypeInfo*` pointer describing the value's type.

    Before, we did this manually in a few cases where we needed the type
    information by adding an additional `type` parameter to the HILTI
    function. Now this happens implicitly and is therefore automatically
    available to all functions using `any` parameters. The advantage is
    that we don't need to modify an call sites to provide type information
    explicitly, in particular when they are inside generated code. The
    downside is that we end up receiving that new parameter in a few cases
    where we don't actually need it (though this could change in the
    future if we ever started to move away from templates inside the C++
    runtime).

  * Add a few missing type information pieces. (Robin Sommer, Corelight)

    - Add runtime type information for `Null` type.
    - Generate `vector` type information for type `List` (because that's how we store lists).
    - Fix type information for `result<void>`.
    - dd `to_string()` support for `Nothing`.

  * Make pre-defined type information objects constant. (Robin Sommer, Corelight)

  * Report `ast-final` debugging output even if AST validation fails. (Robin Sommer, Corelight)

1.13.0-dev.142 | 2025-04-01 17:41:10 +0200

  * Work-around CMake 4 no longer setting `CMAKE_OSX_SYSROOT` by default. (Robin Sommer, Corelight)

  * Let `configure` work with CMake 4. (Robin Sommer, Corelight)

  * GH-1580: Catch when functions aren't called. (Robin Sommer, Corelight)

    There are only very few cases where usage of a function is permitted
    without calling it.

  * GH-1971: Extend unit `switch` based on look-ahead to support blocks of items. (Robin Sommer, Corelight)

1.13.0-dev.135 | 2025-03-28 09:44:11 +0100

  * GH-1967: Fix inactive stack size check during module initialization. (Robin Sommer, Corelight)

  * GH-1974: Add documentation on how to interpret stack traces involving fibers. (Robin Sommer, Corelight)

  * GH-1964: Document use of `$$` inside `&{while,until,until-including}`. (Robin Sommer, Corelight)

  * GH-1963: Document `assert-exception`. (Robin Sommer, Corelight)

  * GH-1155: Document iteration over maps/set/vectors. (Robin Sommer, Corelight)

1.13.0-dev.128 | 2025-03-26 11:02:19 -0400

  * Add simple parser benchmarking. (Evan Typanski, Corelight)

1.13.0-dev.126 | 2025-03-18 09:04:37 +0100

  * Bring back the internal `__visit` method for generated structs. (Robin Sommer)

    This reverts part of cb7336ff8d02a32fc: as it turns out, the Zeek
    integration still needs `__visit`. I'd like to solve this differently
    on the Zeek side, but have't quite gotten that to work yet. So
    reverting this for now so that we don't block.

1.13.0-dev.124 | 2025-03-12 09:02:38 -0400

  * Fix defaulted params with different return types. (Evan Typanski, Corelight)

    The overload check for equivalent non-defaulted parameters was within a
    check for non-equivalent return types, so it only applied if return
    types differed. This fixes that to apply when return types are the same.

  * Fix overload conflicts beyond with the first decl. (Evan Typanski, Corelight)

    Previously it would only compare with the first declaration, but this
    makes it compare with all previous declarations.

  * Add reasons for rejecting invalid overloads. (Evan Typanski, Corelight)

  * GH-1982: Reject equivalent functions. (Evan Typanski, Corelight)

    Fixes #1982

  * Reject function prototypes without `&cxxname`. (Evan Typanski, Corelight)

1.13.0-dev.118 | 2025-03-06 09:05:38 -0500

  * Fix `for` loop snippet to run as-is. (Evan Typanski, Corelight)

  * GH-1538: Implement compound statements (`{...}`). (Evan Typanski, Corelight)

    Closes #1538

    The functionality was there, just not available in the parser.

1.13.0-dev.115 | 2025-03-06 12:00:38 +0100

  * GH-1981: Reject function overloads which only differ in default'd parameters. (Benjamin Bannier, Corelight)

    Resolution of calls to functions who's signatures differ only in
    defaulted parameters behaved non-intuitively in that when given with
    less than the maximum possible number of parameters we resolved to the
    overload with most parameters.

    With this patch we reject such overloads where the only difference is in
    defaulted parameters.

    Closes #1981.

1.13.0-dev.113 | 2025-03-03 17:39:36 +0100

  * GH-1983: Audit links in README. (Benjamin Bannier, Corelight)

    Closes #1983.

1.13.0-dev.111 | 2025-03-03 17:15:46 +0100

  * GH-1977: Disallow function redef with different return. (Evan Typanski, Corelight)

    Fixes #1977

    C++ doesn't allow different return types with equivalent parameters, so
    Spicy should grab that and error before it gets to the C++ error.

1.13.0-dev.109 | 2025-03-03 17:13:37 +0100

  * GH-1976: Fix unit `&max-size` not returning to proper loc. (Evan Typanski, Corelight)

    Fixes #1976

    &max-size was treated the same as &size - so it was going to the end of
    the limited view rather than to the proper location based on what was
    parsed.

1.13.0-dev.107 | 2025-02-21 11:05:36 +0100

  * Fix possibly-incorrect custom host compile command (Evan Typanski)

    The order of `ldflags` compared to the `-o` output matters - they should
    be after. As-is, the documentation fails to compile, but with this
    change, the command succeeds for me.

1.13.0-dev.105 | 2025-02-20 12:28:40 +0100

  * Remove documentation of ``&nosub``. (Robin Sommer, Corelight)

    Turns out we have never supported that in Spicy (only in HILTI). The
    reasons seems to be a parsing challenge: cannot easily add attributes
    to regular expression constants with our Spicy Bison parser.

  * GH-1965: Add support for case-insensitive matching to regular expressions. (Robin Sommer, Corelight)

    By adding an `i` flag to a regular expression pattern, it will no w be
    matched case-insensitively (e.g. `/foobar/i`).

  * GH-100: Switch regular expressions to new justrx API. (Robin Sommer, Corelight)

    justrx no longer parses group match IDs out of the expression string,
    but instead now offers an API to set them directly. This switches over
    to using that new API.

    As a result, setting a match ID inline inside a regexp doesn't work
    anymore. An example of old syntax was: `/foobar${#100}/`. Instead, we
    now allow IDs to be provided after the final slash. The new syntax is
    `/foobar/$(100)`. While this is technically a breaking change, I doubt
    anybody has been using this, and I don't think it's worth putting any
    backwards-compatibility in.

    Admittedly, that new ID syntax is bit arbitrary, and mostly chosen so
    that it can be parsed easily. But it's not something users will
    commonly use, so that seems fine. The Bison parser for that new syntax
    already prepares for more pattern flags as well that we will want to
    support.

  * Bump justrx to pull in new API group matching. (Robin Sommer, Corelight)

  * Refactor regexp patterns. (Robin Sommer, Corelight)

    So far we were storing the regexp patterns as strings directly inside
    the `RegExp` class. This factors out that storage into a new `Pattern`
    helper class. Right now, that helper class likewise only stores a
    string, just as before. But will extend that soon.

1.13.0-dev.99 | 2025-02-18 11:43:18 +0100

  * Add a `to_string()` callback to our custom runtime type information. (Robin Sommer, Corelight)

    Now a host application can render a value into a string that it has
    retrieved through the runtime introspection API. The
    `type_info::Value` class gains a `to_string()` method as the
    user-facing entry point to that.

  * Provide generated, C++-side structs and unions with explicit `__to_string` methods. (Robin Sommer, Corelight)

    This replaces the `__visit` methods we had so far, which we only used
    for implementing the free-standing ``to_string()`` overloads for structs and units.

    This is primarily cleanup, simplifying our generated code by avoiding
    the hard-to-read `__visit` indirection, and maybe also speeding up
    compilation times a bit because we no longer need any templates.

    We also rename the `__str__` method (used for implementing the `on
    %print` hook) to `__hook_to_string` for consistency.

    Note that external C++ code should continue to call the free-standing
    `to_string()` function to render a struct/unit, not the new method,
    because the method doesn't take the `on %print` hook into account.

  * Move runtime function `lookupParser()` into global space. (Robin Sommer, Corelight)

    This used to be a method of the Spicy `Driver` class, but isn't really
    tied to it, and useful on its own as well. Moving it to global scope,
    but keeping the existing method for backwards compatibility.

  * Make `type` a type. (Robin Sommer, Corelight)

    This is primarily for making it easier to pass type information to
    host applications. It contains the following:

        - In HILTI & Spicy, allow to declare variables to have type
          `type`. These variables then store type information objects.

          Initialization can come from either `typeinfo(TYPE)` (which
          already existed in HILTI, but not Spicy), or coercion from an
          existing type ID (e.g., `global T: type = MyStruct);` (which is
          new in both HILTI and Spicy). Note that coercion from a basic
          type does not work because of limitations of our Bison parser
          (it can't parse, e.g., `t = bool`).

          The effect of `type` was already achievable by declaring
          variables to be of type
          `__library_type("hilti::rt::TypeInfo*")`, but that was quite
          hackish/internal.

        - Add an attribute to `type::Library` that records whether the
          underlying C++ type is always `const`, and needs to be declared
          as such. We need this for `hilti::rt::TypeInfo`, which is always
          constant. So far we had just added that `const` to C++-side type
          itself, but that (1) was just a hack, and (2) could cause
          trouble if the name was used in places where that `const`
          confused the C++ compiler.

          To be able to declare a `const` library type from inside
          HILTI/Spicy, we add a new keyword `__library_type_const`.

        - Include the C++ name of the library type into it's runtime type
          information.

        - Add `print` support for type information, printing the type's
          `display` name.

  * Do not include CXX flags into linker flags. (Robin Sommer, Corelight)

    Unnecessary, and may confuse the linker.

  * Map C++ types corresponding to public structs into public namespace in generated C++ prototypes. (Robin Sommer, Corelight)

  * Fix generated C++ prototype header. (Robin Sommer, Corelight)

1.13.0-dev.91 | 2025-02-18 11:42:52 +0100

  * Remove `TryCoercionWithinSameType` from all shortcut coercion styles. (Robin Sommer, Corelight)

    Seems it wasn't needed anywhere there actually, mostly because it
    combination with `TryCoercion` it wasn't adding anything.

  * Compose a coercion bit. (Benjamin Bannier, Corelight)

  * Reuse previously declared coercion bits for readability. (Benjamin Bannier, Corelight)

  * Remove unused conversion bit. (Benjamin Bannier, Corelight)

  * GH-1968: Fix coercion of function call arguments. (Robin Sommer, Corelight)

    Before, we could unnecessarily coerce integer types when a direct
    match was available. The fix takes out the `TryCoercionWithinSameType`
    style for non-coercing function call arguments, which solves it. I
    don't recall why that was in there in the first place, but it doesn't
    seem to break anything to skip it ...

1.13.0-dev.85 | 2025-02-18 10:04:22 +0100

  * Fix possessive "it's" in contexts docs. (Evan Typanski, Corelight)

  * GH-1966: Reject anonymous units in variables and fields. (Evan Typanski, Corelight)

  * Avoid creating external types unnecessarily during AST construction. (Robin Sommer, Corelight)

    We could end up creating external types for freshly created AST nodes
    just because we wanted them to have a certain constness/sideness. This
    could then lead to the original types not being validated because they
    weren't inserted into the AST anywhere.

    This also extends the AST dump output for qualified types to indicate
    whether it's an internal or external type.

1.13.0-dev.81 | 2025-02-07 09:21:54 +0100

  * Drop freebsd-13 from default CI jobs. (Benjamin Bannier, Corelight)

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Bump freebsd-14 in CI. (Benjamin Bannier, Corelight)

  * Bump freebsd-13 in CI. (Benjamin Bannier, Corelight)

  * Bump opensuse-15 in CI. (Benjamin Bannier, Corelight)

1.13.0-dev.75 | 2025-01-23 10:29:10 +0100

  * Regenerate usage documentation. (Benjamin Bannier, Corelight)

  * Clean up minor warts in usage strings of some executables. (Benjamin Bannier, Corelight)

  * Add `spicy-dump` option to enable profiling. (Benjamin Bannier, Corelight)

1.13.0-dev.71 | 2025-01-14 17:26:02 +0100

  * Prevent unneeded copy in setting up unit `parseX` functions. (Benjamin Bannier, Corelight)

  * Used fixed initialization for order for global static. (Benjamin Bannier, Corelight)

    The `HILTI_PRE_INIT` macros work on the global
    `_registered_preinit_functions` container. Since uses of the macro and
    the global container are likely in different translation units their
    initialization order can be undetermined (even though we have some
    manual checks whether the `unique_ptr<vector>>` is null).

    This patch cleans up initialization of the global so it should always be
    fully initialized when accessed.

1.13.0-dev.68 | 2025-01-13 22:54:50 +0100

  * GH-1958: Prevent copies in various places. (Benjamin Bannier, Corelight)

    This adds a change incorrectly dropped from #1958.

1.13.0-dev.66 | 2025-01-13 22:09:19 +0100

  * Prevent copies in various places. (Benjamin Bannier, Corelight)

1.13.0-dev.64 | 2025-01-10 09:55:22 +0100

  * Address a FIXME. (Benjamin Bannier, Corelight)

  * Prevent exception in generic `noexcept` function. (Benjamin Bannier, Corelight)

  * Avoid theoretical exception in widely used helper function. (Benjamin Bannier, Corelight)

  * Prevent destructor from throwing. (Benjamin Bannier, Corelight)

  * Avoid throwing never handled exception in low-level helper function. (Benjamin Bannier, Corelight)

  * Prevent exception escape. (Benjamin Bannier, Corelight)

  * Drop dereference of end iterator. (Benjamin Bannier, Corelight)

  * Prevent potential nullptr dereference. (Benjamin Bannier, Corelight)

  * Prevent copies in various places. (Benjamin Bannier, Corelight)

    This patch removes copies in different places by e.g., leveraging const
    lifetime expansion or move semantics. We also clean up getters to return
    new values less often.

  * Prevent division by zero which is UB. (Benjamin Bannier, Corelight)

  * Clearly mark up unreachable code. (Benjamin Bannier, Corelight)

  * Add missing `break` in `switch` case. (Benjamin Bannier, Corelight)

  * Drop redundant string copy. (Benjamin Bannier, Corelight)

  * Remove copyright end year in source files [skip CI]. (Benjamin Bannier, Corelight)

  * Remove copyright years [skip CI]. (Evan Typanski, Corelight)

1.13.0-dev.47 | 2025-01-08 17:48:23 +0100

  * Fix update Fedora links in installation docs. (Benjamin Bannier, Corelight)

1.13.0-dev.45 | 2025-01-08 17:15:06 +0100

  * GH-1936: Migrate `Attribute::Kind` to enum stringification framework. (Benjamin Bannier, Corelight)

    This patch performs cleans up the recently added `Attribute::Kind` enum
    so it is properly integrated.

    - introduce a standalone enum `attribute::Kind` outside of the
      `Attribute` class
    - use enum helpers for conversion from and to string

    Closes #1936.

1.13.0-dev.43 | 2025-01-08 09:39:45 +0100

  * Drop unused includes. (Benjamin Bannier, Corelight)

  * Move temporaries instead of creating copies. (Benjamin Bannier, Corelight)

  * Avoid copies in implementation of trivial getters. (Benjamin Bannier, Corelight)

  * Avoid copy when constructing node properties. (Benjamin Bannier, Corelight)

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Always initialize enum member to reasonable default. (Benjamin Bannier, Corelight)

  * Always initialize pointer members. (Benjamin Bannier, Corelight)

  * Fix use-after-move. (Benjamin Bannier, Corelight)

1.13.0-dev.34 | 2025-01-08 09:39:11 +0100

  * Bump `3rdparty/filesystem` to pick up fixes for clang-tidy-19. (Benjamin Bannier, Corelight)

  * Drop unused clang-format integration in `./ci/run-ci`. (Benjamin Bannier, Corelight)

    This was already unused since we moved clang-format to a pre-commit
    hook.

  * Move `./ci/run-ci`'s clang-tidy check to CMake. (Benjamin Bannier, Corelight)

    Instead of implementing this ourself instead use CMake with
    `CMAKE_CXX_CLANG_TIDY`/`CMAKE_C_CLANG_TIDY`.

  * Update CMake version in CI for clang-tidy. (Benjamin Bannier, Corelight)

  * Bump LLVM toolchain used in CI. (Benjamin Bannier, Corelight)

  * Fix up APIs in AST API which were not actually moving. (Benjamin Bannier, Corelight)

    Many functions in the AST API were moving arguments only for them to
    ultimately be copied; `clang-tidy` diagnosed most of these.
    This patch cleans up the flagged useless passes by value and `std::move`
    without effect.

  * Fix up container helpers to ensure moving. (Benjamin Bannier, Corelight)

    It is not immediately clear to me when the previous implementation could
    move their values over. `clang-tidy` ended up flagging many of these as
    not moving and forcing copies.

    This patch rewrites the loops in these helpers to enforce iteration with
    move.

  * Disable clang-tidy on generated lexer/parser files. (Benjamin Bannier, Corelight)

  * Reformat code not recognized as C++ by pre-commit hook. (Benjamin Bannier, Corelight)

  * Remove some unneeded includes. (Benjamin Bannier, Corelight)

  * Parenthesize expression when arithmetic mixes difference precedences. (Benjamin Bannier, Corelight)

    `clang-tidy` suggests adding extra parentheses when mixing e.g.,
    addition and multiplication. Apply these suggestions (automatically).

  * Consistently pass `std::string_view` by value. (Benjamin Bannier, Corelight)

    `std::string_view` is a type which is designed to be (very) cheap to
    copy.

  * Remove unneeded copies. (Benjamin Bannier, Corelight)

  * Fix APIs taking `std::string_view` assuming them to be null-terminated. (Benjamin Bannier, Corelight)

    In general `std::string_view` values do not need to be null-terminated,
    e.g., if they reference subranges in a bigger null-terminated string. We
    were previously passing `std::string_view` in a few places where we
    assumed them to be null-terminated, e.g., for passing them on to C APIs
    expecting null-terminated `const char*`. These worked well enough for us
    for now, but these APIs were generally unsafe.

    This patch switches to instead passing either `const char*` signalling
    proper, null-terminated strings, or by passing in a `const std::string&`
    where it should already be present in the caller.

  * Consistently mark functions and values not exposed `static`. (Benjamin Bannier, Corelight)

  * Locally suppress `clang-tidy` diagnostic. (Benjamin Bannier, Corelight)

    This suppresses a `clang-tidy` lint suggesting to mark our default
    `main` function as not exported. This function is shipped as part of
    libhilti and intended to be available as a weak symbol.

  * Prefer `std::max` over ad hoc implementations. (Benjamin Bannier, Corelight)

  * Fix APIs where we assumed a string_view was null-terminated. (Benjamin Bannier, Corelight)

    This either switches to using `const char*` to signify guaranteed null
    termination, or locally suppress clang-tidy warnings about assuming
    null-terminated string_views.

  * Bring configuration for `clang-tidy` up-to-date. (Benjamin Bannier, Corelight)

    This patch brings our clang-tidy setup up to date. Much of this was
    built with `./ci/run-ci` `in mind with extra suppressions hardcoded
    e.g., in `.clang-tidy.ignore`. With this patch we instead configure
    `.clang-tidy` files so they can suppress diagnostics from certain
    directories. We also set up 3rdparty code to work with CMake's
    `clang-tidy` integration[1].

    We also globally suppress some diagnostics which we have no intention of
    addressing.

    [^1]: https://cmake.org/cmake/help/latest/prop_tgt/LANG_CLANG_TIDY.html#prop_tgt:%3CLANG%3E_CLANG_TIDY

1.13.0-dev.14 | 2025-01-06 16:29:53 +0100

  * Do not require owning strings for `startsWith`. (Benjamin Bannier, Corelight)

    By passing in a `const std::string&` we would have incurred construction
    costs of an owning string when all we needed was a non-owning view.

    We also clean up the implementation of `startsWith` to use standard
    library functionality.

  * Move implementation of `Bytes::[lower|upper]` to cc file. (Benjamin Bannier, Corelight)

  * GH-1788: Implement decoding and encoding UTF16 `Bytes`. (Benjamin Bannier, Corelight)

    This adds two new charsets `UTF16LE` and `UTF16BE` for little and big
    endian UTF16 respectively.

    We also clean up use of the Unicode replacement character to make it
    work consistently between UTF16 and UTF8.

    Closes #1788.

  * Add utfcpp submodule. (Benjamin Bannier, Corelight)

  * Remove unneeded explicit conversion to HILTI enum in test. (Benjamin Bannier, Corelight)

  * Add optional `errors` parameter to `strings::encode`. (Benjamin Bannier, Corelight)

    This parameter defaults to `DecodeErrorStrategy::REPLACE` like the
    previous implicit parameter used in the implementation.

  * Move `Bytes` encoding into `string`. (Benjamin Bannier, Corelight)

    This allows a cleaner separation between `Bytes` as "bags of bytes" and
    `string` as "valid UTF8". Having such a clean separation will make
    adding support for more encodings less duplicative.

  * Use unified `DecodeErrorStrategy` for both `bytes` and `string`. (Benjamin Bannier, Corelight)

    This was already exposed as a single type in Spicy and HILTI anyway. We
    also move `Charset` into the `unicode` namespace.

  * Update for spicy-1.12.0 release. (Benjamin Bannier, Corelight)

  * Keep test `spicy.rt.time` working for the next 200 years. (Benjamin Bannier, Corelight)

    This test still compares the current time against hardcoded times to
    check ordering. Extend the upper value so this test passes for the next
    ~200 years.

1.13.0-dev.2 | 2024-12-19 17:08:09 +0100

  * GH-1949: Fix codegen for string literals containing null bytes. (Benjamin Bannier, Corelight)

    Our strings are UTF8 which can contain literal null bytes. We were
    previously generating incorrect C++ for such literals. This was due to
    us constructing C++ value via constructors taking `const char*` which is
    expected to be null-terminated, i.e., everything after the terminator
    was ignored even though it was emitted.

    With this patch we switch to C++ literals for generating literal and
    runtime strings.

    Closes #1949.

1.13.0-dev.0 | 2024-12-13 09:26:36 +0100

  * GH-1901: Add consistent validation for attributes. (Evan Typanski, Corelight)

    This updates attribute validation to see if attributes are in the
    right places. The goal here is to have one place (ie a big set) to
    answer the question "Can I use X attribute on Y node?"

    There are a lot more moving parts with attribute validation, but those
    generally have to do with behavior. A lot of that requires extra context
    in the validator, which is exactly what the validator is meant to do.
    Much of that is pretty ad-hoc, so it could get cleaned up as well.

1.12.0-dev.240 | 2024-12-12 13:09:05 +0100

  * Make sure autogen-docs pre-commit hook can always run in CI. (Benjamin Bannier, Corelight)

1.12.0-dev.238 | 2024-12-10 14:53:29 +0100

  * Update tutorial to use spicy-driver's batch mode. (Robin Sommer, Corelight)

  * Allow defining parser alias names when running spicy-driver. (Robin Sommer, Corelight)

    ``--parser-alias <alias>=<name>`` now makes the parser of name
    `<name>` accessible under an additional name `<alias>`. The option can
    be used multiple times.

    This is particularly useful when using input batches: by adding an
    alias of the form `PORT/PROTOCOL` (e.g., `--parser-alias
    80/tcp=MyHTTP::Message`), this allows to define a parser to use on for
    connections on that port (because the batch processing interprets any
    ports in the trace as strings and tries to lookup a parser of the
    corresponding name). Adding `%orig` or `%resp` to the alias name
    limits it to the corresponding direction (e.g., ``--parser-alias
    80/tcp%orig=MyHTTP::Request``).

    See the `spicy-driver` documentation for more details on how to use
    this with batches.

  * Let `spicy-{dump,driver}` print out parser alias names with ``-ll``. (Robin Sommer, Corelight)

    ``-list-parsers`` prints the direct names of all known parsers.
    However, internally, we sometimes register additional alias names that
    can also be used to lookup a parser (e.g., if there's a `%mime-type`
    or `%port` property). If one specifies ``-list-parsers`` twice now,
    those aliases are printed as well.
  * GH-1829: Catch integer shifts exceeding the width of the operand. (Robin Sommer, Corelight)

    For constants, we now reject such shifts at compile time. At runtime,
    we catch them by having the forked version of `SafeInt` throw an
    overflow exception.

  * Change `SafeInt` submodule to a fork including a fix. (Robin Sommer, Corelight)

    We now use a fork of `SafeInt` that includes
    https://github.com/dcleblanc/SafeInt/pull/64 (as well as general bump
    to upstream `master`).

  * Add `max-lines` option to Sphinx' `spicy-output` directive. (Robin Sommer, Corelight)

    This limits the lines of output shown to the given number, adding a
    `...` marker if truncated.

  * GH-1928: Deprecate `&anchor` with regular expression constructors. (Robin Sommer, Corelight)

  * Update auto-generated architecture diagram. (Robin Sommer, Corelight)

    Looks like some dependency upgrade changed the content slightly.

1.12.0-dev.226 | 2024-12-09 17:28:27 +0100

  * Fix `HILTI_CXX_FLAGS` for when multiple flags are passed. (Benjamin Bannier, Corelight)

  * Add helper function to perform shell-like string splitting. (Benjamin Bannier, Corelight)

1.12.0-dev.223 | 2024-12-09 11:54:03 +0100

  * Fix ruff 'ISC' lints. (Benjamin Bannier, Corelight)

  * Fix ruff 'I' lints. (Benjamin Bannier, Corelight)

  * Fix ruff 'C4' lints. (Benjamin Bannier, Corelight)

  * Migrate Python linting to ruff. (Benjamin Bannier, Corelight)

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Upgrade Python to 3.9 with pyupgrade. (Benjamin Bannier, Corelight)

1.12.0-dev.216 | 2024-12-06 10:34:31 +0100

  * Introduce `deprecated` helper function in Spicy validator. (Benjamin Bannier, Corelight)

  * Add test for using both `[]` and `&count`. (Benjamin Bannier, Corelight)

  * GH-1938: Deprecate `&count` attribute. (Benjamin Bannier, Corelight)

    The preferred way to indicate how many elements should be parsed for a
    vector has been vector syntax over `&count` for a long time, e.g.,

    ```
    type X = unit {
        : uint8[] &count=42; # AVOID.
        : uint8[42];         # PREFER.
    };
    ```

    With this patch `&count` is now deprecated and we emit a warning. We
    will remove support for `&count` in a future release.

    Closes #1938.

1.12.0-dev.212 | 2024-12-05 10:31:19 +0100

  * Fix doc code snippet that won't compile. (Evan Typanski, Corelight)

1.12.0-dev.210 | 2024-12-04 12:08:31 +0100

  * Fix issue with type inference for `result` constructor. (Robin Sommer, Corelight)

    `global x = result("foo");` would end up having type `string` instead
    of `result<string>`.

  * GH-1856: Disallow dereferencing a `result<void>` value. (Robin Sommer, Corelight)

    Closes #1856.

  * GH-1856: Teach `&requires` to accept condition-tests expressions. (Robin Sommer, Corelight)

    This now allows creating custom error messages when a `&require`
    condition fails. Example:

        type Foo = unit {
            x: uint8 &requires=($$ == 1 : error"Deep trouble!'");

            # or, shorter:
            y: uint8 &requires=($$ == 1 : "Deep trouble!'");
        };

    Internally, `&requires` now always wants a condition-test expression.
    That remains transparent to the user, however, because the resolver
    knows how to coerce a pure boolean `&requires` expression into a
    condition test, crafting an error message that happens to look like
    what we used to produce in the past.

    Closes #1856.

  * Teach `assert` to accept an `result<void>` value. (Robin Sommer, Corelight)

    This allows to use the new condition-test operator with assert:

        assert 3 == 4 : error"not equal"

    Because of the RHS of a condition test coercing a `string` to `error`
    automatically, this now also covers the existing syntax for `assert`.
    So the above is now (externally and internally) the same as:

        assert 3 == 4 : "not equal"

  * Add new "condition-test" operator. (Robin Sommer, Corelight)

    This adds a new expression operator to both HILTI and Spicy:

        `COND : ERROR`

    where `COND` is a boolean expression, and `ERROR` is an expression of
    type `error`. When evaluated, the new operator yields a value of type
    `result<void>`, which will be true if the `COND` is true, and set to
    `ERROR` if `COND` is false. In other words, this is a short-cut to
    both test a condition and provide an error message in case it fails.

1.12.0-dev.204 | 2024-11-28 13:57:57 +0100

  * Spell all `Attribute::Kind` values in Pascal case. (Benjamin Bannier, Corelight)

    We are not 100% consistent, but we seem to prefer PascalCase over
    SNAKE_UPPERCASE for enum values. Rename the recently introduced
    `Attribute::Kind` values to that style.

    An intended side effect of this is that we now avoid collisions with a
    possibly defined `DEBUG` macro (e.g., Zeek defines it).

1.12.0-dev.202 | 2024-11-26 18:31:48 +0100

  * GH-1901: Prefer enum over string for attributes. (Evan Typanski, Corelight)

1.12.0-dev.200 | 2024-11-25 16:14:56 +0100

  * GH-1920: Fix some inconsistencies in random access docs. (Evan Typanski, Corelight)

  * GH-1914: Make `$$` documentation more precise. (Evan Typanski, Corelight)

    The documentation would refer to `$$` in an attribute and hook with
    similar language (the "parsed" value). But, in an attribute, it refers
    to the value before any conversions. In a hook, it refers to the value
    after any conversions.

    Now, "parsed" is used to refer to the pre-conversion value, and "final"
    is used to refer to the post-conversion value. Those terms were chosen
    because they make sense when no conversions are applied (or when `$$` is
    used *in* a conversion). But, "final" can still be a little confusing,
    since you can write to `$$`.

1.12.0-dev.196 | 2024-11-25 08:30:19 +0100

  * GH-1918: Fix potential segfault with stream iterators. (Robin Sommer, Corelight)

    When trimming off the beginning of a stream, an existing iterator
    could end up dereferencing its internal chunk pointer even if the
    chunk now no longer existed. The issue was inside the
    increment/decrement operations, which didn't check if the *current*
    iterator offset was still valid (because only then the current chunk
    is guaranteed to be valid too).

  * GH-1918: Add regression tests triggering #1918. (Robin Sommer, Corelight)

1.12.0-dev.193 | 2024-11-21 14:48:06 +0100

  * GH-1919: Validate that sets are sortable. (Evan Typanski, Corelight)

1.12.0-dev.191 | 2024-11-14 11:18:29 +0100

  * Locally disable some warnings for >=gcc-13. (Benjamin Bannier, Corelight)

    fedora-40 and fedora-41 come with GCC versions which trigger new
    warnings.

    - Some uses of `visitor::range` trigger dangling-reference false
      positives, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107532.
    - The dtor of `Location` triggers maybe-uninitialized false positives in
      `hilti::rt::filesystem::path` for `_file`.

    Disable these warnings locally if we are building with >=gcc-13 for now.

  * Bump Fedora versions in CI. (Benjamin Bannier, Corelight)

1.12.0-dev.188 | 2024-11-07 15:19:35 +0100

  * Make units encompass attributes in location. (Evan Typanski, Corelight)

  * GH-1898: Move type alias attribute validation to parser. (Evan Typanski, Corelight)

    Closes #1898

    This was originally in a validator, but there's some sense that this is
    a parsing issue since attributes should not be allowed at all on most
    constructs of that form.

    Note that a lot of the cleanup here was meant to span removing the
    `opt_attributes` field in `type_decl` altogether, but the fallout from
    that is pretty large. It ended up being less cleanup and more
    rearchitecting. This way still avoids the hacky test for type aliases in
    the validator while not changing the AST structure.

1.12.0-dev.182 | 2024-11-06 14:19:55 +0100

  * GH-1859: Improve error message when a unit parameter is used as a
    field. (Robin Sommer, Corelight)

1.12.0-dev.180 | 2024-11-06 08:41:55 +0100

  * GH-1913: Avoid redundant computation during literal parsing. (Robin Sommer, Corelight)

  * GH-1910: Optimize parsing of literal bytes. (Robin Sommer, Corelight)

    We now create the bytes instance representing the literal as a global
    singleton to avoid instantiating it over and over again.

    Closes #1910.

  * Introduce `UnsafeConstIterator` for bytes instances. (Robin Sommer, Corelight)

    An unsafe iterator offers fast but unchecked access to the data. We
    also rename `bytes::Iterator` to `bytes::SafeConstIterator` so that
    for bytes we now follow the same two-tiered iterator structure as for
    streams. We then switch some library code over to now use unsafe
    iterators, gaining a noticeable speed-up in some cases.

  * Add infrastructure to create and cache global constants. (Robin Sommer, Corelight)

    So far we had replicated low-level code a few times that cached
    constants through a global declaration for reuse. This now factors out
    that logic into a central method inside the Spicy code generator.

    This isn't full interning, which I'm not sure we want/need, but covers
    the performance use case that has now come up a few times.

  * Replace our poor hash function with `std::hash()`. (Robin Sommer, Corelight)

1.12.0-dev.173 | 2024-10-28 10:22:29 +0100

  * GH-1908: Fix performance regression when parsing bytes. (Robin Sommer, Corelight)

    Turns out our improved error messages were adding additional overhead
    because we were now constructing them through `fmt()` each time we
    needed more data, independent of whether there was actually going to
    be an error reported.

    This adds a second version of `waitForInput()` that doesn't receive an
    already prepared error message, but just returns false on error so
    that the caller can throw itself.

  * GH-1857: Support `&requires`for individual vector items. (Robin Sommer, Corelight)

1.12.0-dev.169 | 2024-10-25 10:09:50 +0200

  * GH-1895: Do no longer escape backslashes when printing strings or bytes. (Robin Sommer, Corelight)

    Escaping backslashes in `print` output seems both unnecessary and
    confusing.

  * Rename `expandEscapes()` to `expandUTF8Escapes`. (Robin Sommer, Corelight)

    For better readability to avoid confusion about the semantics of the
    function.

  * Introduce style flags for functions rendering values into strings. (Robin Sommer, Corelight)

    This is just cleanup for better readability. I also fixed a couple of
    cases where we now escape control characters where previously we
    wouldn't, but I believe should have. Otherwise no functional change.

  * GH-1893: Encompass child node's location in parent. (Evan Typanski, Corelight)

    When a child is added with `addChild`, the parent's location should
    (generally) span over that child as well. This primarily helps for cases
    where a node doesn't have much of a location until it gets children
    added - like `AttributeSet`. The locations for those should encompass
    all of the attributes within the set. That logic applies for any node
    with a child: if it's the child, then its location should reflect that.

1.12.0-dev.163 | 2024-10-24 09:59:35 +0200

  * GH-1803: Fix namespacing of `hilti` IDs in Spicy-side diagnostic output. (Robin Sommer, Corelight)

    We now show them with a `spicy` prefix, which makes more sense for
    users.

  * Add printer plugin hook to customize ID printing. (Robin Sommer, Corelight)

    Because IDs are no longer AST nodes, we did not have a way for a
    compiler plugin's printing code to modify how it would like them to be
    printed. This adds a corresponding hook. It's not used anywhere yet,
    but will be soon.

    In addition, we add a notion of "user-visibility" to the printer API
    so that printing code knows whether the resulting output is something
    that will be shown to the user (e.g., in diagnostics), or remains
    internal (e..g, raw code output, debugging output). Likewise not used
    yet, but will be soon.

    We also clean up the printer API a little bit.

  * Add scope guard utility class. (Robin Sommer, Corelight)

1.12.0-dev.159 | 2024-10-23 17:33:28 +0200

  * Bump pre-commit hooks (Benjamin Bannier, Corelight)

  * Remove stray removal of directory in `/tmp` in test. (Benjamin Bannier, Corelight)

1.12.0-dev.156 | 2024-10-21 15:50:46 +0200

  * GH-1063: Document arguments to `new` operator. (Robin Sommer, Corelight)

  * GH-1858: Fix the literals parsers not following coercions. (Robin Sommer, Corelight)

1.12.0-dev.152 | 2024-10-18 15:31:40 +0200

  * GH-1891: Fix GCC 11 compilation failure. (Evan Typanski, Corelight)

1.12.0-dev.150 | 2024-10-17 10:16:57 +0200

  * GH-1792: Prioritize error message reporting unknown field. (Robin Sommer, Corelight)

    This suppresses some non-interesting follow-up errors.

  * GH-1790: Provide proper error message when trying access an unknown unit field. (Robin Sommer, Corelight)

    Returning `type::Unknown` instead of `type::Auto` will let the
    resolver process stop, allowing an already existing error message to
    kick in later. We were doing it this way already for structs, but not
    for units.

    This also includes a fix for a bug with finding bitfield ranges by ID,
    which was triggered by the change.

  * GH-1791: Fix usage of `&convert` with unit's requiring parameters. (Robin Sommer, Corelight)

    The generated code needs to create a temporary instance of the type,
    but doesn't have any arguments to provide to it. But that's ok, and we
    now let the validation pass and just instantiate a default-constructed
    instance.

    However, this change now requires an additional validator check on the
    Spicy side to ensure fields giving arguments to types do so correctly
    Before we happened to check that implicitly on the HILTI-side through
    code that now would let it pass if no arguments were given.

  * Factor out logic to validate arguments given to a type. (Robin Sommer, Corelight)

    This will allow Spicy's validator to use it as well.

    We also add two options to (1) accept usages where no argument is given at
    all even when the type would normally require it,;and (2) skip any
    actual type checking, and just confirm argument count. In a subsequent
    change, we'll use (1) to fall-back to a type's default constructor,
    and (2) to check type usage inside unit fields where we haven't
    fully coerced arguments yet.

1.12.0-dev.144 | 2024-10-16 16:10:40 +0200

  * GH-1861: Disallow ignored attributes on type aliases. (Evan Typanski, Corelight)

    This may make previously fine code invalid. Since that code would likely
    be hiding a bug, that seems okay to me.

    Closes #1861

1.12.0-dev.140 | 2024-10-15 16:21:58 +0200

  * GH-1871: Fix `&max-size` on unit containing a `switch`. (Robin Sommer, Corelight)

    We would advance our input too early, letting the subsequent
    `&max-size` check fail.

1.12.0-dev.138 | 2024-10-14 16:16:08 +0200

  * GH-1868: Associate source code locations with current fiber instead of current thread. (Robin Sommer, Corelight)

    This fixes potential location mix-ups when switching between fibers.
    Note that we still need a context-wide fallback location as well
    because we're not always running inside a fiber.

    I ran a performance comparison before/after and couldn't measure a
    difference. Looks like using TLS storage was a case of premature
    optimization.

1.12.0-dev.136 | 2024-10-14 14:20:16 +0200

  * Disable cpplint iwyu check. (Benjamin Bannier, Corelight)

  * Replace a few C-style casts with `static_cast`. (Benjamin Bannier, Corelight)

1.12.0-dev.133 | 2024-10-08 21:50:53 +0200

  * Document `continue` statements. (Evan Typanski, Corelight)

1.12.0-dev.131 | 2024-10-08 17:09:30 +0200

  * Fix "it's" used as a possessive. (Evan Typanski, Corelight)

1.12.0-dev.129 | 2024-10-07 13:02:38 +0200

  * Stop using deprecated pre-commit stage names. (Benjamin Bannier, Corelight)

    The names we used have been deprecated since some time, see
    https://github.com/pre-commit/pre-commit/issues/2732.

1.12.0-dev.127 | 2024-10-05 13:21:27 +0200

  * GH-1867: Fix infinite loops with recursive types. (Evan Typanski, Corelight)

    Closes #1867

    There are two different cases where infinite loops happen with recursive
    types. First, a type may reference itself (`type Data = Data`). Second,
    a type may reference itself inside some other type (`type Data =
    vector<Data>`).

    The first is fixed with a recursion limit. Since the type simply cannot
    resolve, it doesn't get anywhere near codegen. You could detect cycles,
    but that introduces some extra overhead and complexity that shouldn't
    be needed in a "simple" function.

    The second is fixed with an ad-hoc "occurs" check in type unification.
    That just detects cycles and aborts if one is present. This could be
    placed at some other place in the "resolve until convergence" loop, but
    it seems best put closest to the source of the issue.

1.12.0-dev.124 | 2024-09-30 17:43:41 +0200

  * GH-1875: Fix potential nullptr dereference when comparing streams. (Robin Sommer, Corelight)

    Because we are operating on unsafe iterators, need to catch when one
    goes out of bounds.

1.12.0-dev.122 | 2024-09-30 14:18:09 +0200

  * GH-1874: Add new library function `spicy::bytes_to_mac`. (Robin Sommer, Corelight)

    ```
    ## Returns a bytes value rendered as a MAC address string (i.e., colon-separated hex bytes).
    public function bytes_to_mac(value: bytes) : string;
    ```

  * Optimize `spicy::bytes_to_hexstring` and `spicy::bytes_to_mac`. (Robin Sommer, Corelight)

1.12.0-dev.119 | 2024-09-30 13:37:10 +0200

  * GH-1846: Fix bug with captures groups. (Robin Sommer, Corelight)

    When extracting the data matching capture groups we'd take it from the
    beginning of the stream, not the beginning of the current view, even
    though the latter is what we are matching against.

  * Add missing trim after matching a regular expression. (Robin Sommer, Corelight)

1.12.0-dev.116 | 2024-09-30 13:35:49 +0200

  * GH-1842: Fix when input redirection becomes visible. (Robin Sommer, Corelight)

    With `&parse-at/from` we were updating the internal state on our
    current position immediately, meaning they were visible already when
    evaluating other attributes on the same field afterwards, which is
    unexpected.

1.12.0-dev.114 | 2024-09-30 10:24:42 +0200

  * GH-1844: Fix nested look-ahead parsing. (Robin Sommer, Corelight)

    When parsing nested vectors all using look-ahead, we need to return
    control back to upper level when an inner look-ahead isn't found.

    This may change the error message for "normal" look-ahead parsing (see
    test baseline), but the new one seems fine and potentially even
    better.

  * Apply compiler suggestion. (Robin Sommer, Corelight)

1.12.0-dev.111 | 2024-09-26 20:00:42 +0200

  * Remove `ast-stats` output from tests baselines. (Robin Sommer, Corelight)

    These are too noisy as they update with every AST change. Originally I
    included `ast-stats` into some test baselines to ensure the new AST
    infrastructure isn't doing weird stuff, but seems that's working out
    ok.

1.12.0-dev.109 | 2024-09-26 17:29:17 +0200

  * Fix parsing ambiguity with properties. (Robin Sommer, Corelight)

    In the past, we had special-cased properties in our Flex/Bison parser
    so that when parsing an expression, they wouldn't be recognized.
    However, that now led an error field hook of the form `x: bytes
    &size=42 %error` to be parsed as `&size=(42 % error)`. We now switch
    to white-listing all known properties, just as we already do for
    attributes. That way conflicts should be extremely rare.

  * Redo error handling docs (Robin Sommer, Corelight)

    The old text was very outdated. This extends the content, documents
    the new per-field `%error` handler, and moves it all into the
    "parsing" section to have it closer to the error recovery content.

  * GH-1824: Add support for field-local `%error` handlers. (Robin Sommer, Corelight)

    We now support attaching an `%error` handler to an individual field:

        type Test = unit {
            a: b"A";
            b: b"B" %error { print "field B %error", self; }
            c: b"C";
        };

    With input `AxC`, that handler will trigger, whereas with `ABx` it
    won't. If the unit had a unit-wide `%error` handler as well, that one
    would trigger in both cases (i.e., for `b`, in addition to its field
    local handler).

    The handler can also be provided separately from the field:

        on b %error { ... }

    In that separate version, one can receive the error message as well by
    declaring a corresponding string parameter:

        on b(msg: string) %error { ... }

    This works externally, from outside the unit, as well:

        on Test::b(msg: string) %error { ... }

    This is eebased on top of `topic/robin/optimize-type-parsing` so that
    we get the peephole optimizer.

  * Refactor field hook attributes. (Robin Sommer, Corelight)

    Currently we only have two types of field hooks: standard hooks and
    `foreach` hooks. To prepare for more types, this refactors the code
    to represent the type with an `enum` instead of a `foreach` boolean. It
    also moves validation of permitted attributes from the parser to
    the validator.

1.12.0-dev.104 | 2024-09-26 14:14:36 +0200

  * Fine-tune `bytes` literal parsing further. (Robin Sommer, Corelight)

    This now optimizes the generated code for parsing a `bytes` literal
    based on what we're going to use it for, or not (require literal vs.
    look-ahead vs skip).

    The standard case of a parsing an expected literal now looks like
    this:

    ```
        # Begin parsing production: Ctor: b1  -> b"abc" (const bytes)
        (*self).b1 = spicy_rt::expectBytesLiteral(__data, __cur, b"abc", "../tests/spicy/types/bytes/parse-length.spicy:20:10-20:15", Null);
        __cur = __cur.advance(3);

        if ( __trim )
            (*__data).trim(begin(__cur));

        # End parsing production: Ctor: b1  -> b"abc" (const bytes)
    ```

  * Add peephole optimization simplifying rethrowing catch blocks. (Robin Sommer, Corelight)

    The optimization turns this:

    ```
    function void foo() {
         try {
            ...
         } catch {
             throw;
         }
     }
    ```

    into

    ```
    function void foo() {
         {
            ...
         }
     }
    ```

    It would be even nicer if we didn't need the braces around the
    remaining block, but it's generally not safe to remove them because if
    the block declares any locals their life-times and visibility would
    change.

  * GH-1592: Add peephole optimizer for final AST tuning. (Robin Sommer, Corelight)

    We use this to remove two statement constructs that the main optimizer
    may leave behind:

        1. `default<void>()`
        2. `(*self).__error = __error; __error = (*self).__error;`

    The second case is a quite specific situation that eventually, once we
    have CFG/DFG tracking, the main optimizer should be able to cover more
    generically. However, for now, it's just not nice to always have
    these blocks in the generated C++ code, so adding this special case
    seems useful.

    Couples notes on (2):

        - Per #1592, case 2 may also have overhead. Closes #1592.
        - Technically, this optimization isn't always correct: subsequent
          code could assume that `(*self).__error` is set, whereas after
          removal it's not (or not to the expected value). However,
          `__error` is strictly-internal state, and we know that we don't
          use it any different, so this seems ok until we have more
          general optimizer logic.

  * Disable check for reserved IDs with `--skip-validation`. (Robin Sommer, Corelight)

    This allows to write tests that use internal IDs.

  * Simplify parsing of literals. (Robin Sommer, Corelight)

    There are two changes in here:

    1. For grammars that don't use look-ahead, we skip the runtime check for a
    pending look-ahead symbol, because we know we will never have one. This removes
    generated code of the form `if ( _lah ) { ... }`. This change needs a bit of
    machinery unfortunately because we need to get the information about look-ahead
    usage over into the codegen for literal parsing.

    2. For bytes literals, we now outsource their parsing to a runtime function to
    make the generated code simpler. As a side effect this also provides more
    informative error messages when the literal isn't found.

    Taking the two together means that the code for parsing a plain `b"Foo"`
    literal may look like this now:

        spicy_rt::expectBytesLiteral(__data, __cur, b"Foo", "b.spicy:4:10-4:15", Null);
        __cur = __cur.advance(3);

        if ( __trim )
            (*__data).trim(begin(__cur));

        (*self).foo = b"Foo";

  * Optimize parsing for `bytes &size=N`. (Robin Sommer, Corelight)

  * Add mode for optimize types parsing. (Robin Sommer, Corelight)

    This provides the surrounding infrastructure, but does not yet
    implement it for any type.

  * Refactor type parsing modes. (Robin Sommer, Corelight)

    So far we had a boolean flag to differentiate between "normal" and
    "try" parsing. We turn this flag into an enum now so that we can more
    easily extend the set of modes later. No functional change otherwise.

  * Refactor pre/post parsing logic. (Robin Sommer, Corelight)

    This splits out the `&size/&max-size` handling so that we can
    special-case that later.

  * Cleanup: replace optionals with pointers. (Robin Sommer, Corelight)

    For AST nodes, we can/should use nullptrs instead of unset optionals.
    The versions using `optional` were still a left-over from the old AST
    code.

1.12.0-dev.93 | 2024-09-26 13:07:41 +0200

  * Disallow unit variables nested into other items. (Robin Sommer, Corelight)

    Initialization would be ill-defined.

  * GH-1839: Support `if`-blocks in unit. (Robin Sommer, Corelight)

    We now support `if` around a block of unit items:

        type X = unit {
             x: uint8;

             if ( self.x == 1 ) {
                 a1: bytes &size=2;
                 a2: bytes &size=2;
             };
        };

    One can also add an `else`-block:

        type X = unit {
             x: uint8;

             if ( self.x == 1 ) {
                 a1: bytes &size=2;
                 a2: bytes &size=2;
             }
             else {
                 b1: bytes &size=2;
                 b2: bytes &size=2;
             };
        };

  * Add a new unit item `Block` that stores a sequence of subitems. (Robin Sommer, Corelight)

    We now have a new unit item `Block` that represents a sequence of
    sub-items. This goes along with a new production `Block` that the item
    gets turned into inside the grammar.

    The implementation reuses logic from `unit::item::switch_::Case`. We
    then refactor `Case` to use the new `Block` instead of continuing to
    maintain its own list of items.

    We also refactor some other logic previously located with `Switch`
    to now apply to `Blocks` as well.

    Optionally, a `Block` can have a conditional expressions, an
    "else"-block as well attributes with it. We don't use them yet, but
    will soon; tests then coming as well. However, we already also
    refactor some attribute logic that previously went just with the
    `Switch` unit item to now also apply to the `Block` item, so that the
    two can support the same attributes.

  * Remove `production::Boolean`. (Robin Sommer, Corelight)

    Turns out this was neither used nor fully implemented.

  * Run a final resolver pass after optimization. (Robin Sommer, Corelight)

    Optimization may leave node state unset, such as canonical IDs if we
    created new nodes. The final resolver pass gets that back to a
    well-defined state.

    This also moves the debug output for `ast-final` out of the resolver
    loop; it now executes at the very end after optimization. That's a
    change I've been meaning to do for a while because the "final" AST
    wasn't really final. `ast-resolved` now shows what used to be
    `ast-final` (and no longer each iteration of the resolver).

    Test coming with subsequent commit, where a new test would break
    otherwise.

1.12.0-dev.87 | 2024-09-26 13:07:06 +0200

  * Compile generated C++ with `-O0` in debug mode. (Robin Sommer, Corelight)

  * Bump centos-stream in documentation. (Benjamin Bannier, Corelight)

  * Bump latest release in docs. (Benjamin Bannier, Corelight)

1.12.0-dev.83 | 2024-09-19 08:58:15 +0200

  * Fix attributes not getting validated. (Evan Typanski, Corelight)

    This particularly fixes the case where a ctor within a field will not
    have its attributes validated because it does not go through
    `isParseableType`. The "generic attribute checks" are moved to apply to
    all attributes, while type-specific ones remain in `isParseableType`

1.12.0-dev.81 | 2024-09-18 14:42:34 +0200

  * Add internal error for unvalidatable vectors. (Evan Typanski, Corelight)

    Vectors were changed to never be a vector-of-type, just a
    vector-of-items that redirect to a type. This allows validating
    attributes and whatnot properly, which only apply to fields, not types.
    The consequence is that a vector-of-types should be impossible, or else
    there is an error in the parser's workarounds to get to that state,
    which is a bug.

    Add an internal error so that case never surfaces without a big scary
    error.

  * Move legacy vector syntax check to new production. (Evan Typanski, Corelight)

  * Remove vector builders for type/ids. (Evan Typanski, Corelight)

    Currently, vectors need the inner type to actually point to a field.
    This removes the repeat from builder methods that would otherwise need a
    field but don't so that they aren't mistakenly added.

1.12.0-dev.77 | 2024-09-11 08:18:38 +0200

  * GH-1847: Fix resynchronization issue with trimmed input. (Robin Sommer, Corelight)

    When input had been trimmed, `View::advanceToNextData` could end up
    returning a view starting ahead of the valid area.

  * Add missing printer support for exception values. (Robin Sommer, Corelight)

  * GH-1860: Fix parsing for vectors of literals. (Robin Sommer, Corelight)

    This was broken in two ways:

    1. with the `(LITERAL)[]` syntax, the parser would not recognize literals
       using type constructors
    2. with the syntax `LITERAL[]`, we'd try to store the parsed value
       into a vector

  * Fix error message. (Robin Sommer, Corelight)

1.12.0-dev.71 | 2024-09-06 16:29:02 +0200

  * Move some `scoped_id` out for better locations. (Evan Typanski, Corelight)

  * Fix `vector<>` syntax missing diagnostics. (Evan Typanski, Corelight)

  * GH-1832: Fail for vectors with bytes but no stop. (Evan Typanski, Corelight)

    Cases with parentheses were caught before this change. The comments
    indicate behavior before the change, even though both cases should fail:

    public type BytesVectors = unit {
        : bytes[10] &size=5; # No diagnostic - oh no!
        : (bytes)[10] &size=5; # Error - good
    };

    That's because a new `_anon` field is created with the parentheses. This
    makes the `bytes` in an item, which can have its own `&size` and gets
    checked later. But `bytes` by itself cannot have the `&size` attribute
    since it's just a type - the vector will use its own `&size` attribute!

    The fix makes all types in vectors use the anonymous field instead, so
    their lack of attributes are properly modeled during validation.

1.12.0-dev.67 | 2024-09-04 12:44:42 +0200

  * GH-1852: Fix `skip` with units. (Robin Sommer, Corelight)

    For unit parsing with `skip`, we would create a temporary instance
    but wouldn't properly initialize it, meaning for example that
    parameters weren't available. We now generally fully initialize any
    destination, even if temporary.

  * Do not by default skip CI in update-changes cfg. (Benjamin Bannier, Corelight)

    We rely on CI to create releases, so having `[skip CI]` in our
    update-changes config was always a hassle which needed to be edited out
    when creating a release (just tagging would autocommit with the message
    template without a way to change the commit message before tagging).

    Drop this part to make releases easier and less error prone.

1.12.0-dev.63 | 2024-08-26 17:10:07 +0200

  * Bump 3rdparty/any from `7c76129` to `a05d5ad` (dependabot[bot])

1.12.0-dev.61 | 2024-08-14 14:04:27 +0200

  * Suppress warning `invalid-offsetof`. (Robin Sommer, Corelight)

    We now run into these in CI due to `-Werror`.

    Also clean up existing duplication of
    `-Wno-unused-command-line-argument`.

  * GH-1835: Fix computation of declaration dependencies. (Robin Sommer, Corelight)

    One more branch we had to follow to track down all dependencies
    between global declarations: external qualified types.

1.12.0-dev.58 | 2024-08-09 15:57:52 +0200

  * Add `string::lower` and `string::upper` (Evan Typanski, Corelight)

    These already had a whole impl in the `string` namespace, so this just
    hooks it up so you can use them reasonably on a string type in a spicy
    file. It also switches those impls to use `string_view`

  * Fix `split` and `split1` docs to be more accurate (Evan Typanski, Corelight)

    The documentation for the bytes method seemed incorrect (or, at least,
    confusing) where an empty separator did *not* split on white space. This
    correctly documents the behavior with what the actual behavior is
    (especially for split1).

    Note, the behavior is a bit confusing, unintuitive, and maybe
    inconsistent between the implementations of `split` and `split1`.
    Namely, `split1` will sometimes but the entire value in the first
    element of the tuple (if a match isn't found) or the second element (if
    the separator is just an empty string).

    For now this just updates the documentation, but I'd also welcome a
    change in behavior.

  * Add `string::split` and `string::split1` helpers (Evan Typanski, Corelight)

    This doesn't do any work to fix the TODOs that were already in the Bytes
    version. Also, there is a small unclear bit about the documentation for
    the `split` op in both Bytes and now string, namely that an empty `sep`
    argument should make the break take place at sequences of whitespace,
    but it does not do that. It may also be misreading the documentation,
    but one of the two should probably be clarified.

  * Add `string::starts_with` helper (Evan Typanski, Corelight)

1.12.0-dev.53 | 2024-08-09 15:45:05 +0200

  * GH-1831: Fix optimizer regression. (Robin Sommer, Corelight)

    We were no longer marking types as used that are referenced through a
    type name.

1.12.0-dev.51 | 2024-08-09 15:43:51 +0200

  * Fix AST dependency computation. (Robin Sommer, Corelight)

    Turns out the logic wasn't quite right yet. It worked well enough if
    all units get wrapped into `ValueReference` because then we just need
    a forward declaration to make that work; and those we would always
    output first. But it wouldn't actually track dependencies correctly to
    output them in the right order so that full struct are available where
    needed. This commit reworks that logic. Turns out this also further
    simplifies logic and state tracking, which is a good sign.

  * Provide dependency information to AST transformations. (Robin Sommer, Corelight)

    Before, we computed dependency information only once just before final
    codegen, meaning that Spicy-to-HILTI lowering would not have it
    available. This adds a separate dependency computation just before the
    transformation pass. While this isn't used yet, the change prepares
    for future functionality leveraging dependencies during lowering (like
    selective application of `&on-heap`).

  * Make AST dependency information deterministic. (Robin Sommer, Corelight)

    The dependency information returned by the context wasn't sorted, with
    order depending on pointer values. That means that users of that
    information would end up processing dependencies in an undetermined
    order, making their results non-deterministic.

  * Fix an error message. (Robin Sommer, Corelight)

1.12.0-dev.45 | 2024-08-09 14:01:49 +0200

  * Silence unused result warnings when expression has [[nodiscard]]. (Arne Welzel, Corelight)

    The code generated by assert-exception *o == "", where o is an optional
    results in an unused result warning due to operator== being
    [[nodiscard]].

  * Add -Wno-unused-command-line-argument to LD_FLAGS. (Arne Welzel, Corelight)

    Suppress warnings when flags on the command line aren't used:

        c++: error: -lspicy-rt-debug: 'linker' input unused
          [-Werror,-Wunused-command-line-argument]

  * Add Ubuntu 24.04 to CI. (Arne Welzel, Corelight)

  * Avoid maybe-uninitialized warning. (Arne Welzel, Corelight)

    Not sure, but Ubuntu 20's GCC 9.4 and OpenSUSE 15.5's GCC 7.3 are reporting

        /hilti/runtime/include/hilti/rt/types/map.h:235:21: error: '<anonymous>'
          may be used uninitialized in this function [-Werror=maybe-uninitialized]

  * Fix sys/errno.h warning. (Arne Welzel, Corelight)

    On Alpine 3.18:

        /usr/include/sys/errno.h:1:2: error: #warning redirecting incorrect
          #include <sys/errno.h> to <errno.h> [-Werror=cpp]
        1 | #warning redirecting incorrect #include <sys/errno.h> to <errno.h>

  * Avoid use-after-free warning with GCC-13.2. (Arne Welzel, Corelight)

    Not exactly sure what's going on here. I *think* calling data->begin()
    and data->end(), it sees/assumes one path freeing the underlying chain
    of the SafeConstIterator and the other then accessing the freed pointer.
    Maybe something about the evaluation of the arguments being unspecified.
    It doesn't trigger when fetching offsets sequentially beforehand, so do
    that...

        inlined from 'spicy::rt::detail::printParserState(...)::<lambda()>'
          at /src/spicy/runtime /src/parser.cc:81:19:
        /src/hilti/runtime/include/hilti/rt/intrusive-ptr.h:43:20:
          error: pointer used after 'void operator delete(void*, std::size_t)'
          -Werror=use-after-free]
        43 |     if ( m && --m->_references == 0 )
           |                 ~~~^~~~~~~~~~~$

  * Use Bytes directly instead of uint8_t array for pack(). (Arne Welzel, Corelight)

    GCC 12.2 on Debian 12 complains that raw might be unused. Replace
    with Bytes/std::string and casting data() to uint8_t* instead.

    Warning was:

        inlined from 'hilti::rt::Bytes hilti::rt::Address::pack(
          hilti::rt::ByteOrder) const'
          at /src/hilti/runtime/src/types/address.cc:132:54:
          /usr/include/c++/12/bits/char_traits.h:431:56: error:
         'raw' may be used uninitialized [-Werror=maybe-uninitialized]

  * Don't ignore alloca() return value in test. (Arne Welzel, Corelight)

    Silence warning on Alpine:

        fiber.cc:314:11: error: ignoring return value of 'void*
          __builtin_alloca(long unsigned int)' declared with attribute
          'warn_unused_result' [-Werror=unused-result]

  * Disable -Werror when precompiling libspicy.h headers (Arne Welzel, Corelight)

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47857

  * Use operator() from OptimizerVisitor via using. (Arne Welzel, Corelight)

    This triggers -Werror=overloaded-virtual= on GCC 13.2 otherwise.

  * Fix --enable-werror werror_flags. (Arne Welzel, Corelight)

    Found while trying to test something with EXTRA_CXX_FLAGS.
    This got lost in e27cd5ac0443659e7e9fdae2f3bbe5920bd3564b.

1.12.0-dev.33 | 2024-08-07 12:38:27 +0200

  * Add an AST pass collecting dependencies between declarations. (Robin Sommer, Corelight)

  * Rework emission of C++ code. (Robin Sommer, Corelight)

    We now use the new AST dependency information to determine in which
    order to output C++ declarations, including whether to output them at
    all. Previously, we used a needed to get the desired order through
    a pretty hacky, adhoc scheme that would prioritize some types
    manually as needed.

    This includes:

    - We now only declare C++ types that are actually needed by the unit;
      no more bulk import everything from an imported unit.

    - Remove all the manual scheduling of when `cxx::declaration::*` are
      to be emitted (no more forward declarations, no more manual
      prioritization). The order of output is now generally determined
      through dependencies. For example, before we output a type, we
      output anything it depend on.

    - Merge `cxx::Function` into `cxx::declaration::Function`. This means
      we generally don't need to emit separate declaration vs
      implementation anymore; instead we decide at emission time what
      parts to output.

    - Unify treatment of cxx::declaration::*: we go through emission
      phases now where each type decides what to emit when.

    - Remove various state from cxx::declaration::* that’s no longer
      needed/used.

    - We now unconditionally forward declare structs and unions; seems
      cheap enough and makes things quite a bit easier.

    - We new logic strives to maintain the same output where possible so
      that we only get minimal baselines changes (mainly some small
      ordering changes).

  * Properly set parse extension when importing by path. (Benjamin Bannier, Corelight)

  * Rename `cxx::type::Struct`'s `inlineCode` to `code`. (Benjamin Bannier, Corelight)

    This function now generates not `inline` code, but instead code with
    bodies which we would only want to include once in the generated C++.

  * Tweak when we emit struct inline code. (Benjamin Bannier, Corelight)

    We would previously emit inline C++ code for types into each unit module
    where the type's module was imported. This meant that we potentially
    compiled identical function bodies in many files. While this could in
    theory lead to better local inlining decisions it also caused poor
    scaling as the number of modules in a Spicy grammar grows (in
    particular).

    With this patch we now emit these bodies at most once, in particular
    into the module of the type. To support this we make a number of
    declarations and definitions not `inline` anymore so they can link
    correctly. We also reduce which code gets included when importing a
    module.

  * Only emit full C++ body of functions in module of matching namespace. (Benjamin Bannier, Corelight)

  * Simplify body of generated `operator<<`. (Benjamin Bannier, Corelight)

  * Remove unused methods to retrieve module dependencies. (Robin Sommer, Corelight)

    If we ever need this, we can now use the new declaration dependencies
    instead.

  * Fix `Node::tryAs_()`. (Robin Sommer, Corelight)

    (Not used anywhere currently, but didn't work and want to keep.)

  * Fully qualify runtime identifiers in generated code. (Robin Sommer, Corelight)

    We weren't consistent doing that everywhere, which would lead to
    trouble with upcoming changes.

1.12.0-dev.21 | 2024-08-07 10:49:10 +0200

  * GH-1823: Don't qualify magic linker symbols with C++ namespace. (Robin Sommer, Corelight)

    We need them at their original values because that's what the runtime
    lbirary is hard-coded to expect.

1.12.0-dev.19 | 2024-08-06 15:01:21 +0200

  * Fix use of move'd from variable. (Benjamin Bannier, Corelight)

    Function parameters still shadown members in C++. This is a fixup of
    c3abbbe8eb28d1e2cee5b58b19e1a30710b38853.

1.12.0-dev.17 | 2024-08-06 13:49:47 +0200

  * GH-1817: Prevent null ptr dereference when looking on nodes without `Scope`. (Benjamin Bannier, Corelight)

    Closes #1817.

1.12.0-dev.15 | 2024-08-06 13:21:57 +0200

  * GH-3865: Add CMAKE_CXX_FLAGS to HILTI_CONFIG_RUNTIME_LD_FLAGS. (Arne Welzel, Corelight)

    When building Spicy with CXXFLAGS='--coverage', a subsequent
    spicy-driver invocation fails with:

        $ ./build/bin/spicy-driver ./x.spicy
        [error] failed to load library "/tmp/__library__c2d0d689ca0dbabb.hlto":
        /tmp/__library__c2d0d689ca0dbabb.hlto: undefined symbol: __gcov_merge_add

    Similarly for `spicyz` and Zeek.

    CMake adds CMAKE_CXX_FLAGS to all its linker invocations [1] which is why
    building Spicy's executables itself works out. Prepend EXTRA_CXX_FLAGS
    and CMAKE_CXX_FLAGS to HILTI_CONFIG_RUNTIME_LD_FLAGS as a fix.

    Unclear if building Spicy with `--coverage` should imply building produced
    `.hlto` files with coverage, too, but that's what is done with other CXXFLAGS
    already today.

    Relates to zeek/zeek#3865.

    [1] https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS.html

1.12.0-dev.13 | 2024-08-06 12:51:46 +0200

  * Updates <bytes>.to_int() <bytes>.to_uint() documentation. (Arne Welzel, Corelight)

    I'm going for RuntimeError for now, given that's at least not wrong
    given what's thrown in various places.

  * Fix undefined shifts of 32bit integer in toInt(). (Arne Welzel, Corelight)

    1U is 32bit on a 64bit system and shifting it by more than 31 bits
    is undefined. The following does currently produce -4294967296 instead
    of -1:

        b"\xff\xff\xff\xff".to_int(spicy::ByteOrder::Big)

  * Fix to_uint(ByteOrder) for empty byte ranges. (Arne Welzel, Corelight)

    to_uint() and to_int() for empty byte ranges throw when attempting to
    convert printable decimals to integers. Do the same for the byte order
    versions. The assumption is that it is really an error when the user
    calls to_int() or to_uint() on an empty byte range.

1.12.0-dev.9 | 2024-08-02 12:30:03 +0200

  * Simplify test. (Benjamin Bannier, Corelight)

    This test was using complicated input data and parsing it in a
    hard to follow way. This patch simplifies the test data and its
    handling.

  * GH-1815: Disallow expanding limited `View`s again with `limit`. (Benjamin Bannier, Corelight)

    The documented semantics of `View::limit` are that it creates a new view
    with equal or smaller size. In contrast to that we would still have
    allowed to expand views with more calls `limit` again as well.

    This patch changes the implementation of `View::limit` so it can only
    ever make a `View` smaller.

    We also tweak the implementation of the check for consumed `&size` when
    used together with `&eod`: if the `&size` was already nested in a
    limited view a larger `&size` value could previously extend the view so
    the `&eod` effectively was ignored. Since we now do not extend the
    `View` anymore we need to only activate the check for consumed `&size`
    if `&eod` was not specified since in this case the user communicated that
    they are fine with consuming less data.

    Closes #1815.

1.12.0-dev.6 | 2024-07-31 14:24:26 +0200

  * Start v1.12.0 development. (Benjamin Bannier, Corelight)

1.11.0-dev.287 | 2024-07-31 11:15:49 +0200

  * Remember normalized paths when checking for duplicate files in driver. (Benjamin Bannier, Corelight)

  * Remember files processed by the driver. (Benjamin Bannier, Corelight)

  * GH-1813: Fix equality implementation of module UID. (Benjamin Bannier, Corelight)

1.11.0-dev.282 | 2024-07-30 17:02:31 +0200

  * GH-1810: Fix nested look-ahead switches. (Robin Sommer, Corelight)

1.11.0-dev.279 | 2024-07-26 12:47:30 +0200

  * GH-1808: Fix non-converging optimizer pass for used functions. (Benjamin Bannier, Corelight)

1.11.0-dev.277 | 2024-07-22 14:44:40 +0200

  * Add rsync to CI Docker image. (Benjamin Bannier, Corelight)

    `rsync` is used by `doc/scripts/autogen-docs` and without it the script
    cannot run.

  * Fix running of `autogen-docs` pre-commit hook. (Benjamin Bannier, Corelight)

    If the `diagrams` package was not installed this hook would now fails.
    Since it runs for changes to any type of file this was not ideal.

    This patch adds a check for that dependency and stops the docs update
    script if it is missing.

1.11.0-dev.274 | 2024-07-22 12:01:04 +0200

  * GH-1795: Fix illegal stream content access through invalid view. (Robin Sommer, Corelight)

    When a view's beginning ended up outside of the stream's valid range
    (e.g., because the stream has been trimmed in the meantime), we
    wouldn't catch that on access and attempt to access data that was no
    longer valid. This commit extends the safety checks accordingly.

1.11.0-dev.272 | 2024-07-22 10:53:56 +0200

  * GH-1800: Add test for invoked but unimplemented sink hooks. (Benjamin Bannier, Corelight)

    This is a regression test for #1800.

  * GH-1800: Guard access to sink hooks. (Benjamin Bannier, Corelight)

    If no sink hooks were specified by the user trying to invoke them would
    raise a `std::bad_function_call` previously since we did not have
    explicitly guard the code. With #1736 we us infrastructure with less
    implicit checks so we need to handle the absence of a value ourself
    since otherwise we might end up dereferencing a nullptr.

1.11.0-dev.269 | 2024-07-22 10:53:15 +0200

  * Do not search for Python in CMake setup. (Benjamin Bannier, Corelight)

    We previously needed this since during the build we were generating
    files with Python. This is not the case anymore.

1.11.0-dev.267 | 2024-07-22 10:50:22 +0200

  * GH-1462: Defer start of feature-dependent transformations to a later point. (Benjamin Bannier, Corelight)

    We previously would evaluate whether a unit field or method was required
    by an optional feature before we had finished collecting all feature
    requirements. This behavior was fine when we were visiting individual
    modules' AST one by one, but breaks with #1462 were we changed using a
    single AST to hold all modules.

    This patch defers transformations until all feature requirements have
    been collected.

1.11.0-dev.264 | 2024-07-22 09:27:15 +0200

  * Update developer's documentation. (Robin Sommer, Corelight)

    Includes:

    - Rework and update developer documentation's architecture diagram.
    This is now generated through Python's `diagrams` package (i.e.,
    graphviz). Because the layout is automatically determined by `dot`,
    it's not perfect; but seems good enough.

    - Update debugging streams.

    - Remove benchmarking section, as this was completely outdated.

1.11.0-dev.262 | 2024-07-15 11:49:46 +0200

  * Remove unused `Engine` type and tracking. (Benjamin Bannier, Corelight)

  * Remove API customization points for `spicy::Engine`. (Benjamin Bannier, Corelight)

  * Remove support for customizable Spicy hook and field engine. (Benjamin Bannier, Corelight)

1.11.0-dev.258 | 2024-07-12 16:34:16 +0200

  * GH-1784: Fix import HILTI vs Spicy confusion. (Robin Sommer, Corelight)

    Our tracking of module dependencies could end up mixing `.spicy`
    and `.hlt` modules when the former transitioned into the latter.

1.11.0-dev.255 | 2024-07-12 13:46:57 +0200

  * Update lists of releases in docs [skip CI]. (Benjamin Bannier, Corelight)

  * Bump latest release in docs [skip CI]. (Benjamin Bannier, Corelight)

  * Drop docs around `try`/`catch` [skip CI]. (Benjamin Bannier, Corelight)

    This feature is not on the horizon and having it documented prominently
    painted an incorrect picture for users. Drop its docs for now until we
    actually provide it.

1.11.0-dev.251 | 2024-07-09 18:16:15 +0200

  * Drop unused include. (Benjamin Bannier, Corelight)

  * GH-1785: Prevent defining already forwarded constants. (Benjamin Bannier, Corelight)

    We previously would add both forward declarations as well as full
    definitions for any constant in an imported module, i.e. we emitted
    the same constant in multiple C++ files which the linker seems to have
    cleaned up for us.

    With this path we only emit a definition if we are not already emitting
    a forward declaration.

    Closes #1785.

  * Remove duplicate emission of types. (Benjamin Bannier, Corelight)

    This was a noop but still useless work.

1.11.0-dev.247 | 2024-07-09 10:38:23 +0200

  * Add missing include. (Benjamin Bannier, Corelight)

1.11.0-dev.244 | 2024-07-09 09:23:01 +0200

  * Document spicy-driver's `@gap` for batch input. (Robin Sommer, Corelight)

1.11.0-dev.242 | 2024-07-04 12:19:21 +0200

  * Fix copy-n-paste error in GH action name. (Benjamin Bannier, Corelight)

  * Fix when GH `email-failure` action sends notification. (Benjamin Bannier, Corelight)

    In order to detect whether to send out a failure email we previously
    would check that the action conclusion contained certain statuses. This
    check seems to have been nonsensical as we only notified for benign
    failure reasons (the check would have made a little more sense if
    negated, but would have then also notified on successes).

    With this patch we instead explicitly enumerate the failure conclusions
    to trigger on, see
    https://docs.github.com/en/webhooks/webhook-events-and-payloads#check_suite--check_suite-object
    for the full list of conclusions.

1.11.0-dev.239 | 2024-07-04 12:13:40 +0200

  * Drop macos versions unsupported by Cirrus. (Benjamin Bannier, Corelight)

1.11.0-dev.237 | 2024-07-04 12:13:03 +0200

  * GH-1775: Extend validation of synchronization properties. (Robin Sommer, Corelight)

    Closes #1775.

1.11.0-dev.235 | 2024-07-04 12:09:41 +0200

  * GH-1777: Fix interning of regexps for `%skip*`. (Benjamin Bannier, Corelight)

    If we used regexps for `%skip`, `%skip-pre` or `%skip-post` we would
    previously compute unique identifiers in a way which clashed with
    general regexp interning elsewhere[^1].

    With this patch we now pick a unique stem for `%skip*`-related regexps
    so they do not clash anymore.

    [^1]: https://github.com/zeek/spicy/blob/90751715212c7268ebb86276d4365dfaedd94882/spicy/toolchain/src/compiler/codegen/parsers/literals.cc#L115

1.11.0-dev.233 | 2024-07-04 12:08:15 +0200

  * GH-1774: Fix synchronization with symbol different from last lookahead token. (Benjamin Bannier, Corelight)

    If `synchronize-[at|after]` used a lookahead symbol different from the
    last lookahead symbol (e.g., normal parsing used a
    literal, recovery a regexp), synchronization would clobber the lookahead
    symbol so that after successful synchronization normal parsing could
    still not succeed.

    This patch sets up dedicated parser state for synchronization to prevent
    the clobbering.

  * Use symbol unique for each error recovery. (Benjamin Bannier, Corelight)

    By using a constant symbol name we could run into situations where
    different error recoveries on different regexps (e.g., in unrelated
    units) could accidentally use the same symbol. This is due to regexps
    being automatically interned.

    With this patch we generate unique symbols for each position where we
    recover.

  * Add debug log of parser state during synchronization. (Benjamin Bannier, Corelight)

    We have a similar debug log already when synchronizing on regexps, but
    where missing it for other literals.

1.11.0-dev.229 | 2024-07-03 12:00:00 +0200

  * Call `%sync_advance` hook also when entering sync mode. (Benjamin Bannier, Corelight)

    This allows users to control the full synchronization lifecycle, from
    entering it, to regular checks during the search (both via
    `%sync_advance`, until it is left (via their explicit `confirm`, e.g.,
    from a `%synced` hook).

1.11.0-dev.227 | 2024-06-28 13:20:55 +0200

  * Improve doc wrt. `%error` hook in sync mode. (Jan Grashoefer, Corelight)

  * Add draft release notes for spicy-1.11.0. [skip CI] (Benjamin Bannier, Corelight)

1.11.0-dev.224 | 2024-06-25 08:50:58 +0200

  * GH-3779: Add `%sync_advance` hook. (Robin Sommer, Corelight)

    This adds support for a new unit hook:

    ```
    on %sync_advance(offset: uint64) {
        ...
    }
    ```

    This hook is called regularly (see below) during error recovery when
    synchronization skips over data or gaps while searching for a valid
    synchronization point. It can be used to check in on the
    synchronization to, e.g., abort further processing if it just keeps
    failing. `offset` is the current position inside the input stream that
    synchronization just skipped to.

    By default, "called regularly" means that it's called every 4KB of
    input skipped over while searching for a synchronization point. That
    value can be changed by setting a unit property
    `%sync-advance-block-size = <number of bytes>`.

    As an additional minor tweak, this also changes the name of what used
    to be the `__gap__` profiler to now be called `__sync_advance` because
    it's profiling the time spent in skipping data, not just gaps.

  * Add stream method `statistics()` to retrieve input statistics. (Robin Sommer, Corelight)

    This returns a struct of the following type, reflecting the input
    seen so far:

    ```
    type StreamStatistics = struct {
        num_data_bytes: uint64;     ## number of data bytes processed
        num_data_chunks: uint64;    ## number of data chunks processed, excluding empty chunks
        num_gap_bytes: uint64;      ## number of gap bytes processed
        num_gap_chunks: uint64;     ## number of gap chunks processed, excluding empty chunks
    };
    ```

  * Extend HILTI's stream implementation to track data statistics. (Robin Sommer, Corelight)

  * Add unit method `stream()` to access current input stream. (Robin Sommer, Corelight)

    We implement this by storing the current input stream inside the
    internal parse struct as a new field `__stream`. Using `stream()` then
    turns into an access to that field (i.e,  `*(self.__stream)`). If that
    field never gets accessed, the optimizer will remove it, so there's no
    overhead if nobody ever uses `stream()` with a unit.

1.11.0-dev.219 | 2024-06-20 10:32:09 +0200

  * Fix Spicy's support for `network` type. `network` was not
    recognized by the scanner. (Robin Sommer, Corelight)

1.11.0-dev.217 | 2024-06-19 09:29:16 +0200

  * Fix lints reported by clang-tidy-18 (Benjamin Bannier, Corelight)

1.11.0-dev.202 | 2024-06-18 12:31:36 +0200

  * GH-1763: Only allow creation of `const` variables from literals. (Benjamin Bannier, Corelight)

    Since it is hard to enforce that `const` variables are initialized in
    correct order (order of decls usually is not significant in Spicy/HILTI
    and works e.g., for `global`s, but this is not the case for `const`s due
    to codegen), this patch disallows creating `const` values from anything
    but literals. This completely removes the ordering issue.

1.11.0-dev.200 | 2024-06-14 10:56:04 +0200

  * GH-1759: Fix `if`-condition with `switch` parsing. (Robin Sommer, Corelight)

    The parser generator was ignoring `if` conditions attached to `switch`
    constructs. While we actually had a test for this already, turns out
    we had recorded a broken baseline. Plus, we were testing only one
    variant of `switch` (expression-based, not look-ahead-based). This
    implements and tests both variants now.

  * Fix clang-tidy. (Robin Sommer, Corelight)

1.11.0-dev.197 | 2024-06-13 12:43:33 +0200

  * GH-1750: Add `to_real` method to `bytes`. (Robin Sommer, Corelight)

    This interprets the data as representing an ASCII-encoded floating
    point number and converts that into a ``real``. The data can be in
    either decimal or hexadecimal format. If it cannot be parsed as
    either, throws an `InvalidValue` exception.

  * GH-1608: Add `get_optional` method to maps. (Robin Sommer, Corelight)

    This returns an optional either containing the map's element for the
    given key if that entry exists, or an unset optional if it does not.

  * Update some debug baselines. (Robin Sommer, Corelight)

1.11.0-dev.193 | 2024-06-13 12:10:22 +0200

  * GH-1760: Fix generated code for huge `const` collections. (Benjamin Bannier, Corelight)

1.11.0-dev.191 | 2024-06-13 09:59:22 +0200

  * GH-1598: Enforce that the argument `new` is either a type or a
    ctor. (Robin Sommer, Corelight)

    So far we allowed some more generic expressions as well, but it's hard
    for the parser to support arbitrary expressions here due to parsing
    ambiguities, leaving things inconsistent. So we now limit it to what
    was pretty much the intent originally anyways.

    Note that the error message for #1598 stays the same: it's not great,
    but seems good enough. However, we now actually disallow the
    workaround shown in the ticket as well for consistency. The new
    work-around is shown in the changes to `hilti.codegen.type-info`.

  * GH-90/GH-1733: Add `result` and `spicy::Error` types to Spicy to
    facilitate error handling. (Robin Sommer, Corelight)

    The `result` and `error` types were already implemented internally
    HILTI-side, but not yet available to Spicy users. This exposes them to
    Spicy as well. To avoid name clashes with existing code, we don't
    introduce `error` as a new type keyword, but instead make it available
    as a library type ``spicy::Error``.

    Typical usage is something like this:

    ```
    function foo() : result<int64> {
        ...
        if ( everything_is_ok )
            return 42;
        else
            return error"Something went wrong.";
    }

    if ( local x = foo() )
        print "result: %d " % *x;
    else
        print "error: %s " % x.error();
    ```

    The documentation has more specifics.

  * Support `result<void>` to HILTI. (Robin Sommer, Corelight)

    This allows to capture errors even if there's no actual result
    otherwise. Example (HILTI syntax):

    ```
    function result<void> x(bool b) {
         if ( b )
             return Null; # coerces to a successful result<void>
         else
             return error("trouble...");
     }

    assert x(True);
    assert x(False).error() == error("trouble...");

    ```

  * Add `==`/`!=` operators for HILTI `error` instances. (Robin
    Sommer, Corelight)

1.11.0-dev.185 | 2024-06-11 18:47:19 +0200

  * Bump centos-stream in CI. (Benjamin Bannier, Corelight)

1.11.0-dev.183 | 2024-06-07 10:35:53 +0200

  * GH-1745: Fix C++ initialization of global constants through global functions. (Robin Sommer, Corelight)

    The changes ordering of the emitted global declarations so that
    functions now come first, allowing them be used inside subsequent
    constant initializations.

1.11.0-dev.181 | 2024-06-04 10:18:25 +0200

  * Clean up includes. (Benjamin Bannier, Corelight)

  * Fix Flex linker error when building as part of Zeek. (Benjamin Bannier, Corelight)

    When building Spicy as part of Zeek against the Homebrew flex-2.6.4 I
    saw linker errors after f52325693aad8bd7931d51c4658027a8b7d7adae,

    ```
    ld: Undefined symbols:
      HiltiFlexLexer::LexerInput(char*, unsigned long), referenced from:
          vtable for hilti::detail::parser::Scanner in driver.cc.o
      HiltiFlexLexer::LexerOutput(char const*, unsigned long), referenced from:
          vtable for hilti::detail::parser::Scanner in driver.cc.o
    ```

    It is still not clear to me how this error comes about, but the change in
    this patch seems to address the issue.

1.11.0-dev.178 | 2024-06-03 09:50:53 +0200

  * Fix a typo in packing.rst (Tanner Kvarfordt)

    Fix a typo in packing.rst where the template argument to unpack was (u)int
    instead of real.

  * Expand guidelines on improving compilation performance. [skip CI] (Benjamin Bannier, Corelight)

  * Fix documented type mapping for integers. [skip CI] (Benjamin Bannier, Corelight)

1.11.0-dev.172 | 2024-05-17 12:51:34 +0200

  * GH-1742: Unroll ctrs of big containers. (Benjamin Bannier, Corelight)

    When generating C++ code for container ctrs we previously would directly
    invoke the respective C++ ctrs taking an initializer list. For very big
    initializer lists this causes very bad C++ compiler performance, e.g.,
    compiling code constructing a vector with 10,000 elements could take
    minutes.

    With this patch we unroll such ctrs calls by calling a dedicated
    initialization function. For huge containers this causes creating of big
    functions instead of big initializer lists, but compiling functions
    seems to behave more predictively.

    Closes #1742.

1.11.0-dev.170 | 2024-05-17 12:51:06 +0200

  * GH-1743: Use a checked cast for `map`'s `in` operator. (Benjamin Bannier, Corelight)

1.11.0-dev.168 | 2024-05-15 10:19:54 +0200

  * Fix behavior for unset accept and decline hooks. (Benjamin Bannier, Corelight)

    We did not properly initialize pointer values for accept and decline
    hooks. In downstream code they then appeared to be set when they were in
    fact not.

    With this patch we initialize them with proper defaults.

1.11.0-dev.166 | 2024-05-14 11:54:16 +0200

  * Docs: Add new section with guidelines and best practices. (Robin Sommer, Corelight)

    This focuses on performance for now, but may be extended with other
    areas alter.

    Much of the content was contributed by Corelight Labs.

  * Docs: Update Custom Extensions section. (Robin Sommer, Corelight)

    The usage of `-P` wasn't up to date.

  * Docs: Update feedback section. (Robin Sommer, Corelight)

1.11.0-dev.162 | 2024-05-13 14:42:08 +0200

  * Update types.rst (Smoot)

1.11.0-dev.160 | 2024-05-13 11:45:04 +0200

  * GH-1657: Update Spicy runtime driver to use new stream features for improved performance. (Robin Sommer, Corelight)

    This does two things:

    - When adding data to a stream, we now do that without copying
      anything initially. For block input (e.g., UDP) that's always fine
      because the parser will never suspend before it's fully done
      parsing; hence we can safely delete it once the parser returns. For
      stream input (e.g., TCP), we make the stream own its data later
      if (and only if) the parser suspends.

    - For block input (e.g., UDP) we now keep reusing the same stream for
      subsequent blocks, instead of creating a new one each time. This
      allows the stream to reuse an allocated chunk that it may have still
      cached internally.

    The result of this, plus the new chunk caching introduced earlier, is
    that for a UDP flow, we never need to allocate more than one chunk,
    and never need to copy any data; and for TCP it's the same as long as
    parsing consumes all data before suspending (which should be a common
    case), plus, when we allocate new storage we only copy data that didn't
    get trimmed immediately anyways.

  * Give stream a method to reset it into freshly initialized state. (Robin Sommer, Corelight)

    This does not clear the internal chunk cache.

  * Cache previously trimmed chunks inside stream for reuse. (Robin Sommer, Corelight)

    A chain now retains one previously used but no longer needed chunk for
    reuse, so that we can avoid constant cycles of creating/destructing
    chunks (and their payload memory) in the common case of a parser
    consuming full chunks without yielding. The caching is also geared
    towards owning/non-owning semantics staying consistent across
    subsequent append operations.

  * Extend stream API to allow for chunks that don't own their data. (Robin Sommer, Corelight)

    By default, we still copy data when creating chunks but we add a
    parallel API that just stores pointers, assuming the data will stay
    around as long as needed. If the stream owner cannot guarantee that,
    they may at any point convert all not-owned data into owned data
    through a corresponding `makeOwning()` stream method. To make that
    method efficient even with long chains of chunks, we internally
    maintain an invariant that only the last chunk of chain can be
    non-owning: whenever we add a new chunk to a chain, we ensure that the
    previous tail become owning at that point. In other words, we amortize
    the work across all newly added chunks.

  * Remove `std::functional` from `DeferredExpression`. (Robin Sommer)

  * Revert "Remove support for deferred expressions." (Robin Sommer)
    Turns out this is actually still being used by the Zeek
    integration.

1.11.0-dev.151 | 2024-05-10 16:35:50 +0200

  * Remove unused include headers. (Robin Sommer, Corelight)

  * Remove all usage of `std::function` from toolchain. (Robin Sommer, Corelight)

  * Remove usage of `std::function` from parser and sink runtime representations. (Robin Sommer, Corelight)

    We switch to raw function pointers, which is easy enough.

  * Remove use of `std::function` from `spicy::rt::Configuration`. (Robin Sommer, Corelight)

    Callbacks are now classic function pointers.

  * Remove unused functional header. (Robin Sommer, Corelight)

  * Remove use of `std::function` from runtime vector class. (Robin Sommer, Corelight)

  * Remove support for deferred expressions. (Robin Sommer, Corelight)

    These weren't used anymore anywhere so we can remove the corresponding
    code from toolchain and runtime.

1.11.0-dev.142 | 2024-05-06 15:14:40 +0200

  * GH-1664: Fix `&convert` typing issue with bit ranges. (Robin Sommer, Corelight)

    Turns out #1664 was only indirectly related to the `&convert` itself;
    the real issue was that we couldn't assign one bitfield struct to
    another if their field types didn't match exactly, even in cases where
    at the C++ level there was no meaningful difference. In this case we
    ended up with a field that had a C++ type `rt::Bool` in one type and
    `bool` in another, leading to errors when assigning the latter to the
    former. We now allow to creating instances of the former from the
    latter through standard C++ type conversions on a per field basis.

  * Suppress new `clang-tidy` warnings. (Robin Sommer, Corelight)

  * Fix a Spicy scoping issue across imports. (Robin Sommer)

    We could get a bogus "unknown ID" error for default arguments of
    functions defined in an imported module if that default argument was
    itself referring to an identifier inside yet another imported module.
    The test case shows the exact situation that was broken.

1.11.0-dev.137 | 2024-04-25 13:38:42 +0200

  * Remove Spicy parser support for unsupported `&priority` attribute. (Benjamin Bannier, Corelight)

  * Make spelling of hook `priority` consistent across Spicy and HILTI. (Benjamin Bannier, Corelight)

    We were naming the priority attribute differently in Spicy (`priority`)
    and HILTI (`&priority`). While e.g., a Spicy `Hook` could correct
    extract its priority, this still could have lead to potential issues if
    we were attempting to access the priority of a Spicy hook from HILTI as
    we do not perform any adjustment of this attribute when lowering to
    HILTI. This distinction also made it hard to generate intended code from
    the outside using our API (e.g., from Zeek) since one needed to be aware
    at which level the attribute was injected (Spicy or HILTI).

    With this patch we internally translate a Spicy `priority` attribute to
    `&attribute` syntax.

1.11.0-dev.134 | 2024-04-25 13:36:59 +0200

  * Fix incremental skipping. (Benjamin Bannier, Corelight)

    We previously would incorrectly compute the amount of data to skip which
    could have potentially lead to the parser consuming more data than
    available. With this patch we correctly use the actually consumed amount
    to compute what the trim from the input.

  * GH-1724: Fix skipping in size-constrained units. (Benjamin Bannier, Corelight)

    We previously could skip too much data if `skip` was used in a unit with
    a global `&size`. This was due to the machinery moving the input forward
    believing that `skip` units were that really field productions. While
    this is true in a sense in this particular case it still lead to
    incorrect behavior, in particular as far is input handling is concerned
    `skip` productions largely behave like any other unit.

1.11.0-dev.131 | 2024-04-25 09:27:48 +0200

  * Fix potential internal error in port string conversion. (Robin Sommer)

  * GH-1284: GH-1693: Promote use of `-x` over `-c`, clean up `-P`. (Robin Sommer)

    This includes these pieces:

    - `-P` now requires a prefix argument that set's the C++ namespace, so
      that generated prototypes match that of `-x`. Like with `-x`, the
      prefix may be empty (`-P ""`) to get back to the old `hlt::`.

    - For both `-P` and `-x` the prefix now must be a valid C++ identifier,
      because we use it as such.

    - `spicyc` usage message now refers to `-c` and `-l` as for debugging
      use.

    - Update documentation on host applications, switching to using `-x`
      instead of `-{cl}`.

    - Scanned for other use of `-c` and `-l` in the docs as well, the
      remaining ones seem fine.

  * Remove generated, in-code linker JSON meta data. (Robin Sommer)

    This was originally to allow for compiling multiple Spicy modules
    separately, with the meta data providing what's the necessary to add
    any cross-module functionality. However, we've moved away from that
    approach and now already require the compiler to always see all code,
    so this is no longer needed/possible.

1.11.0-dev.125 | 2024-04-18 15:53:48 +0200

  * GH-1501: Improve some error messages for runtime parse errors. (Robin Sommer, Corelight)

  * GH-1586: Make skip productions behave like the production they are wrapping. (Robin Sommer, Corelight)

  * GH-1719: Fix `new` passing a unit reference to an `inout` unit parameter. (Robin Sommer, Corelight)

    One might debate whether this is something we should allow at all but
    we do permit it elsewhere when passing unit parameters, and changing
    that would probably break code, so for consistency this allows it for
    `new` as well.

    Internally, there was a more general inconsistency introduced by
    automatic derefs of Spicy-level strong references. While we do need
    that deref to happen for operator resolution, we now remove it after
    generation of HILTI code so that HILTI-level resolution can then work
    as expected on the value references introduced for units. I wouldn't
    be surprised if the prior behavior was causing more trouble than just
    #1719 and we just hadn't run into yet it.

  * Mark automatic derefs inside the operator's AST node. (Robin Sommer, Corelight)

    This allows to differentiate between explicit `deref` operations part
    of the source code and implicit `deref` operations inserted by the
    coercer. A subsequent commit will leverage this information, but I've
    been meaning to do this anyways because it could be hard to track
    where a particular `deref` was coming from.

  * Unify code generation for `new`. (Robin Sommer, Corelight)

    There's no functional change (afaict) but for consistency of
    implementation and results, `new` should go through
    `compileCallArguments()`.

  * GH-1655: Reject joint usage of filters and look-ahead. (Robin Sommer, Corelight)

    We cannot retrieve look-ahead information from units to which a filter
    is connected, because parsing for outer and inner layers will be
    operating on separate streams. While we could pass the lahead token
    number upwards, we would also need the stream position for the end of
    the lahead symbol, but we cannot tie an iterator on the filtered
    stream back to a position on the original stream. So we now reject
    this.

    This shouldn't cause any actual backwards-incompatibility because this
    wasn't working in the first place: it  would reliably abort with an
    invalid stream iterator exception during parsing.

  * Add test confirming that `&parse-{at,from}` don't interfere with outer look-ahead parsing. (Robin Sommer, Corelight)

    This makes sure fields with these attributes are ignored for
    look-ahead computation of the unit containing them. We actually have a
    related test for `&parse-from` already, but can't hurt to have it
    covered further here.

1.11.0-dev.114 | 2024-04-16 09:38:38 +0200

  * Bump baselines. (Benjamin Bannier, Corelight)

1.11.0-dev.112 | 2024-04-15 17:22:55 +0200

  * Update NEWS with a list of incompatibilities compared to previous version. (Robin Sommer)

  * Pretty print reference types in Spicy output. (Robin Sommer)

    We now render `strong_ref<T>` as `T&`, as one would expect on
    the Spicy side.

  * Do not perform automatic deref on RHS of an assignment. (Robin Sommer)

    This used to be accepted but had not the intended effect at runtime:

    ```
    function f(s: string&) {
         *s = new "xxx";
    }
    ```

  * Fix line numbers. (Robin Sommer)

    Line numbers could be off in the presence of comments including '#'
    characters.

  * Fix auto-deref of LHS references. (Robin Sommer)

    We were checking the constness of the reference, not of the wrapped
    value.

  * Improve error message. (Robin Sommer)

1.11.0-dev.105 | 2024-04-10 13:24:03 +0200

  * Add missing file to git. (Robin Sommer, Corelight)

  * Document generic operators. (Robin Sommer, Corelight)

  * Refactor output logic in `spicy-doc-to-rst`. (Robin Sommer, Corelight)

  * GH-1711: Fix forwarding of a reference unit parameter to a non-reference parameter. (Robin Sommer, Corelight)

  * GH-1599: Fix integer increment/decrement operators require mutable arguments. (Robin Sommer, Corelight)

  * Add tests checking sinks as unit parameters. (Robin Sommer, Corelight)

  * GH-1710: Improve implementation of sink type. (Robin Sommer, Corelight)

    So far we lowered Spicy's `sink` type into a `strong_ref` a HILTI
    codegen time, meaning that a unit's `sink` field would have type
    `sink` at the Spicy-level and then later `strong_ref<sink>` inside
    HILTI (actually: `strong_ref<spicy_rt::Sink>`). This approach led some
    inconsistencies because of the mismatch between the two levels, and it
    also made the implementation more complex than necessary. We now let
    `sink` fields simply have type `sink&` (i.e., `strong_ref<sink>`) in
    Spicy; everything else then falls in place more easily. From a user
    perspective, the change should remain largely invisible.

  * Fix internal assertion potentially triggering erroneously during retrieval of parent node. (Robin Sommer, Corelight)

  * GH-1618: Fix and clarify usage of references in Spicy. (Robin Sommer, Corelight)

    References weren't fully consistent in their properties and
    implementation, and they weren't documented either. This commit cleans
    that up and adds documentation.

    Changes:

    - Constness 1: For a type `T&`, which internally is `strong_ref<T>`,
      we now consistently make the inner `T` a mutable LHS type. That
      seems most natural and useful from a user perspective. In
      particular, this allows mutating objects passed into functions as
      parameters without declaring them `inout`: (`foo (x: bytes&)`). This
      is important because declaring the parameter `inout` makes the
      reference itself mutable (not the contained object), which isn't
      what one wants. Plus, the latter doesn't work for unit parameters
      anyways. Accordingly, we also adapt our built-in operators to
      use`T&` instead of `inout T&`.

    - Constness 2: For a type `T&`, we now make the outer reference type
      constant and non-mutable. This is mostly for consistency, it doesn't
      really change anything as we didn't havemutating operations on
      references anyways.

    - Feature: We add `new BASIC_TYPE` as syntax for creating default
      initialized values of basic types. So far we only had `new
      NAMED_TYPE` and `new VALUE`.

    Technical note to the reviewer: the changes to the `recreateAs*`
    methods are necessary to avoid complex types being copied into the
    newly created type, which would lead to name resolution problems. This
    is tested through existing tests which fail otherwise
    (`spicy.types.sink.filter-it.spicy`,
    `spicy.rt.base64-filter-eod.spicy`). (Well, `recreateAsLHS()` is
    tested that way, but the others would have the same issue.) This is a
    good change anyways, because it keeps the AST smaller.

  * GH-1515: Catch unsupported types for unit inout parameters. (Robin Sommer, Corelight)

    We support only types that are (internally) passed around as
    references.

  * GH-1583: Disallow coercion when passing arguments to `inout` parameters. (Robin Sommer, Corelight)

1.11.0-dev.92 | 2024-04-10 09:40:32 +0200

  * Update release version in documentation. (Robin Sommer, Corelight)

    This hadn't been updated, leading to outdated links.

  * Do not require all AST nodes to be destroyed before we begin compilation. (Robin Sommer)

    If a 3rdparty (like Zeek) still retains a pointer to a `Node`, the
    check would trigger, making usage awkward. Instead we now just
    check at context destruction time that we no longer have any live
    nodes.

1.11.0-dev.88 | 2024-04-09 09:33:03 +0200

  * Bump 3rdparty/utf8proc from `1fe43f5` to `894e810` (dependabot[bot])

1.11.0-dev.86 | 2024-04-04 15:51:17 +0200

  * Overhaul AST node memory management. (Robin Sommer)

    We switch back to reference counting nodes, but through a custom
    scheme that allows us to continue passing around raw pointers most
    of the time.

  * Remove unused class. (Robin Sommer)

  * Reduce memory usage for operators with complex argument types. (Robin Sommer)

    We now use external types for to store operands of name types, which
    reduces the number of AST nodes created for operators substantially.

  * Remove meta/location information from AST IDs. (Robin Sommer)

    Turns out these aren't used anywhere.

  * Use less memory for storing context IDs. (Robin Sommer)

    32 bits should still be plenty. Because these are stored in many
    nodes, the change is noticeable in overall memory consumption.

  * Compute an ID's internal views on demand. (Robin Sommer)

    We had previously optimized IDs by pre-computing some information for
    quick access. However, for most IDs that information isn't actually
    accessed at all, so we now compute it only on demand the first time
    it's needed. This saves both CPU and memory.

  * Move inherit-scope information into virtual method. (Robin Sommer)

    This saves space, and is also more aligned with how other information is
    managed as well.

  * Change storage for AstContext. (Robin Sommer)

    No need for `shared_ptr`, now using a `unique_ptr`.

  * Do not auto-allocate storage for errors with each AST node. (Robin Sommer)

    We now create the vector for error messages only when needed.

  * Reuse `Meta` instances across nodes. (Robin Sommer)

    We now store each `Meta` value only once globally. Saves about 15%
    memory.

1.11.0-dev.75 | 2024-04-03 11:55:16 +0200

  * Remove a few left-over unused variables. (Benjamin Bannier, Corelight)

  * Fix a few instances where codegen was non-deterministic. (Benjamin Bannier, Corelight)

1.11.0-dev.72 | 2024-04-03 09:35:23 +0200

  * Fix repeated evaluations of `&parse-at` expression. (Robin Sommer)

  * GH-1316: GH-1635: Provide better error messages for some cases of unknown unit IDs. (Robin Sommer, Corelight)

  * GH-1493: Support/fix public type aliases to units. (Robin Sommer, Corelight)

    An alias like `public type Unit1 = Unit2` used to lead to C++-side
    compiler errors, which this fixes. We also fully support this now by
    making both `Unit1` and `Unit2` available for parsing to host
    applications. Internally, the `Unit1` parser is just a small facade
    pointing to the parsing functions for `Unit2`.

  * GH-1661: Deprecate usage of `&convert` with `&chunked`. (Robin Sommer, Corelight)

    Per discussion in #1661, this combination can lead to confusion and
    can be worked around if really needed.

1.11.0-dev.64 | 2024-04-02 17:44:13 +0200

  * Fix GCC false positive around `strncpy` use. (Benjamin Bannier, Corelight)

1.11.0-dev.62 | 2024-03-25 10:39:42 +0100

  * Reimplement `IDBase` for better performance. (Robin Sommer)

    Our codegen phase had quite some overhead due to repeated ID
    operations recomputing the same information over and over again (e.g.,
    subpaths and namespaces). This reimplements the class to compute
    everything once upfront, cutting codegen time into half.

  * Add more tests for `IDBase`. (Robin Sommer)

    This includes a tiny semantic change for `IDBase::length()`: it now
    returns zero for an empty ID, which seems more consistent. (This
    doesn't seem to have an impact anywhere, all tests pass.)

1.11.0-dev.59 | 2024-03-21 12:35:06 +0100

  * Rework order of C++ codegen. (Robin Sommer)

    We used to potentially codegen modules multiple times. Now we cache a
    module's generated C++ code inside the AST node the first time we
    create it. From there, we can then easily reuse it later, in
    particular when needing to import its declarations into another
    module. Internally, we switch storage for `cxx::Unit` to shared
    pointers, and tweak the debug logging a bit for better readability in
    this new model.

  * Cleanup: Remove flag to compile implementation from higher-level codegen method. (Robin Sommer)

    Pushing down the condition that we used to pass in, to lower-level
    code.

  * Fix duplicates in module dependency tracking. (Robin Sommer)

    We now use a set instead of a vector to unique dependencies
    automatically.

  * Fix file name case for fuzzer builds. (Benjamin Bannier, Corelight)

1.11.0-dev.54 | 2024-03-18 09:56:58 +0100

  * Refresh CI platforms. (Benjamin Bannier, Corelight)

1.11.0-dev.50 | 2024-03-16 08:55:11 +0100

  * Rework memory management for AST nodes. (Robin Sommer, Corelight)

    We switch memory management of AST nodes to an arena/bump allocator
    that releases them as a whole once the AST gets destroyed, not
    individually/continiously through their own life-time scoping. This
    then allows us to also switch them from `shared_ptr` to raw pointers
    throughout the AST code. The result is a compiler speed up of about
    20% for some complex analyzer.

  * Centralize the `vector` type we use for storing AST nodes. (Robin Sommer, Corelight)

    No functional change, this just unifies the various vectors of
    `Node`-derived classes so that there's a central place where to define
    the underlying vector type. For now this is just for easier
    maintenance. In the future we could experiment with different vector
    or allocator implementations.

  * Make node tags `constexpr`. (Robin Sommer, Corelight)

1.11.0-dev.45 | 2024-03-15 15:11:26 +0100

  * Fix broken f-string. (Benjamin Bannier, Corelight)

  * Remove Moneterey Homebrew CI tasks. (Benjamin Bannier, Corelight)

  * Add Cirrus tasks running non-Homebrew macos builds and tests. (Benjamin Bannier, Corelight)

1.11.0-dev.41 | 2024-03-15 12:47:42 +0100

  * Fix fuzzer builds for reworked AST. (Benjamin Bannier, Corelight)

1.11.0-dev.39 | 2024-03-13 09:07:42 +0100

  * Bump softprops/action-gh-release from 1 to 2 (dependabot[bot])

  * Bump typos pre-commit hook. (Benjamin Bannier, Corelight)

  * Bump clang-format. (Benjamin Bannier, Corelight)

  * Modernize Python scripts with `pyupgrade`. (Benjamin Bannier, Corelight)

  * Reformat Python with ruff-format. (Benjamin Bannier, Corelight)

  * Fix generation of doc example code. (Benjamin Bannier, Corelight)

  * Fix Python lints diagnosed by ruff. (Benjamin Bannier, Corelight)

1.11.0-dev.30 | 2024-03-12 12:02:43 +0100

  * Get rid of more dynamic casts. (Robin Sommer, Corelight)

    The main use of dynamic casts that's left now (other than for
    debugging code) is inside the grammar's production hierarchy. That
    logic isn't standing out during profiling, so seems fine to leave for
    now.

  * Introduce custom RTTI system for casting safely between node
    types. (Robin Sommer, Corelight)

    Our custom system is faster than C++'s `dynamic_cast<>`, resulting in
    a noticeable speed-up for larger parsers.

    We assign a unique integer tag to  each `Node`-derived class. Each
    class' constructors pass an array through to the top-level `Node`
    class that contains a series of these integers describing the
    inheritance path from the derived class back up to `Node`. The `Node`
    class stores this path for fast type checks. In addition, each
    `Node`-derived class `T` gets a couple constants as members: (1) a
    copy of its own tag (`T::NodeTag`), and (2) a level indicating its
    distance from `Node` in the inheritance tree (`T::NodeLevel`). The
    level is used as index into an instance's tag array when performing
    type checks. The result is that we can do `isA<T>` operation with just
    a single comparison between an array element and a constant value.

    This system is optimized for our very simple Node hierarchy: not very
    deep (max. 4 entries in the tag array), single-inheritance only,
    derived class are always the same distance from `Node`, and
    all `Node`-derived classes are known upfront.

1.11.0-dev.27 | 2024-03-06 17:06:09 +0100

  * Speed up `util::toIdentifier`. (Robin Sommer)

    Turns out this is called a lot. This changes baselines due to slight
    differences in generated IDs (changes are good because they better avoid
    potential conflicts).

    This also removes the option to ensure non-keyword IDs: I don't
    think we need that because we check for that when we generate C++
    code.

  * GH-1675: Extend runtime profiling to measure parser input volume. (Robin Sommer, Corelight)

    With `--enable-profiling` the output for Spicy units/fields now
    includes a new `volume` column, like this:

    ```
    #name                                                   count       time      avg-%    total-%          volume
    [...]
    spicy/unit/test::A                                          1     285500      43.96      43.96               8
    spicy/unit/test::A/__gap__                                  4       3167       0.12       0.49               0
    spicy/unit/test::A/__synchronize__                          1      35500       5.47       5.47               4
    spicy/unit/test::A::a                                       1      74833      11.52      11.52               -
    spicy/unit/test::A::b                                       1      15333       2.36       2.36               1
    spicy/unit/test::A::c                                       1      19125       2.94       2.94               1
    spicy/unit/test::A::d                                       1       7583       1.17       1.17               1
    spicy/unit/test::A::e                                       1       8042       1.24       1.24               1
    ```

    Three different things here:

    - The `volume` column for `spicy/unit/TYPE` and
      `spicy/unit/TYPE::FIELD` augments the already existing timing
      measurement and reports the total, aggregate number of bytes that
      this unit/field got to parse over the course of the processing.

    - For units going into synchronization mode, there are now additional
      rows `spicy/unit/TYPE/__synchronize__` that report both CPU time and
      volume spent in synchronization while processing that unit.

    - For units encountering input gaps during synchronization, there are
      now additional rows 'spicy/unit/TYPE/__gap__` that report total
      aggregate gap size encountered while processing the unit.

    All the volume measurements are taken as differences of two offsets
    inside the input stream. For normal unit/field parsing, we subtract
    the final offset after parsing an instance from the initial offset
    where its parsing started.[1] For synchronization, it's the offset
    where synchronization stopped successfully minus where it started.[2]
    For gaps, it's the offset where we continued after the gap minus where
    the gap started.[3] All these differences are then added up for each
    row over the course of total input stream processing.

    Note that volume isn't counted if parsing for some reason never
    reaches the point where the end measurement would be taken (e.g., a
    parser error prevents it from being reached; in the output above
    that's the case for `spicy/unit/test::A::a`).

    Closes #1675.

    [1] This *includes any ranges that the unit spent in synchronization
    mode trying to recover from parse errors.

    [2] This does *not* include any gaps encountered because they don't
    affect stream offsets.

    [3] Little glitch: these values can currently by off by one due to some
    internal ambiguity.

  * Move inferring of a unit's context type into the resolver. (Robin Sommer)

    No functional change here, just cleanup: this is where the logic
    belongs.

  * Infer constness of `<unit>.context()` from that of `<unit>`. (Robin Sommer)

    Closes https://github.com/corelight/zeek-spicy-openvpn/issues/11.

  * Ensure constness of result for const map/vector index operator. (Robin Sommer)

    Not sure this actually changes anything, but it ensures they are correct.

  * Simplify constness check for struct field assignments. (Robin Sommer)

    Same treatment as for unit fields.

  * Bump 3rdparty/filesystem from `2fc4b46` to `42ea4fc` (dependabot[bot])

1.11.0-dev.15 | 2024-03-05 10:43:27 +0100

  * Bump 3rdparty/filesystem from `2fc4b46` to `42ea4fc` (dependabot[bot])

1.11.0-dev.11 | 2024-03-04 10:07:25 +0100

  * New AST architecture. (Robin Sommer)

    This is a large revamp of compiler internals, cleaning up and speeding
    up lots of the AST pipeline. From a user perspective, nothing changes,
    except that the new compiler is a tiny bit more strict: turns out that
    in rare cases the old compiler ended up accepting some ill-formed
    Spicy code that is now (rightfully) rejected. Specifically, two
    instances of this are known where existing Spicy code may need
    tweaking now:

    - Identifiers from the (internal) `hilti::` namespace are no longer
      accessible. Usually you can just scope them with `spicy::` instead,
      and it'll work.

    - The old compiler didn't always enforce constness as it should have.
      In particular, function parameters could end up being mutable even
      when they weren't declared as `inout`. Now `inout` is required for
      supporting any mutable operations on a parameter, so make sure to
      add it where needed.

1.11.0-dev.9 | 2024-03-01 18:10:49 +0100

  * Simplify `while` loops over constant conditions. (Benjamin Bannier, Corelight)

    While loops with constant conditions are unlikely to occur in code
    generated by us, but could appear in user code. Cleaning them up is
    simple and cheap, so this patch implements a pass which simplifies them.

1.11.0-dev.7 | 2024-02-27 17:44:22 +0100

  * GH-1624: Enable optimizations when running `spicy-build`. (Benjamin Bannier, Corelight)

    We previously would emit single C++ source files from `spicy-build`.
    This made it impossible to enable optimizations since we could not know
    whether individual code was used. Since optional features are by default
    enabled and only disabled through an optimizer pass this meant that
    `spicy-build` emitted code which performed a lot of work not done
    usually.

    This patch reworks `spicy-build` to use `spicyc`'s `-x` instead which
    has a global view and can run optimizations, and emits all source files
    into a prefix.

    Closes #1624.
    Closes #1625.
    Closes #1622.

  * Fix some shellcheck warnings in `spicy-build`. (Benjamin Bannier, Corelight)

  * Fix handling of `spicyc -x` when passed a filename. (Benjamin Bannier, Corelight)

    For the `-x` flag users can pass either the name of a directory or a
    file. If passed a filename the file name is incorporated into the
    identifier generated namespace identifier of e.g., the form
    `__hlt_FILENAME` in the emitted C++ files. Previously when passing a
    directory we would still emit a `_` separator, but since there was no
    filename nothing after it so we generated namespace identifiers like
    `__hlt_`.

    With this patch we now only emit the separator if passed a filename.

  * Do not optimize out public functions. (Benjamin Bannier, Corelight)

    Optimizing out public functions breaks the assumption we have elsewhere
    that something marked `public` is part of the public API and would not
    get optimized out. This is e.g., the behavior we have for units.

1.11.0-dev.2 | 2024-02-26 12:16:17 +0100

  * Fix stray Python escape sequence. (Benjamin Bannier, Corelight)

1.10.0-dev.149 | 2024-02-22 09:48:01 +0100

  * GH-1585: Put closing of unit sinks behind feature guard. (Benjamin Bannier, Corelight)

    This code gets emitted, regardless of whether a sink was actually
    connected or not. Put it behind a feature guard so it does not enable
    the feature on its own.

    Closes #1585.

1.10.0-dev.147 | 2024-02-21 10:30:22 +0100

  * GH-1667: Always advance input before attempting resynchronization. (Benjamin Bannier, Corelight)

    When we enter resynchronization after hitting a parse error we
    previously would have left the input alone, even though we know it fails
    to parse. We then relied fully on resynchronization to advance the
    input.

    While this just pushed work downstream when synchronizing on literals,
    it could cause us losing input if synchronizing on regular expressions
    if we happened to fail parsing due to a gap which is now at the front of
    the input (parse errors from gaps are the most likely resynchronization
    scenario when parsing genuine traffic); in this case the regular
    expression would synchronize at the second byte after the input and we
    would synchronize only at a later position.

    With this patch we always forcibly advance the input to the next non-gap
    position. This has no effect for synchronization on literals, but allows
    it to happen earlier for regular expressions.

    Closes #1667.

  * Refactor test `spicy.types.unit.synchronize-on-gap`. (Benjamin Bannier, Corelight)

    This refactoring cleans up how we feed gaps into the parser to testing
    with more inputs simpler.

1.10.0-dev.144 | 2024-02-14 15:55:35 +0100

  * GH-1652: Fix filters consuming too much data. (Benjamin Bannier, Corelight)

    We would previously assume that a filter would consume all available
    data. This only holds if the filter is attached to a top-level unit, but
    in general not if some sub-unit uses a filter. With this patch we
    explicitly compute how much data is consumed.

    Closes #1652.

1.10.0-dev.142 | 2024-02-08 17:00:53 +0100

  * GH-1668: Fix incorrect data consumption for `&max-size`. (Benjamin Bannier, Corelight)

    We would previously handle `&size` and `&max-size` almost identical
    with the only difference that `&max-size` sets up a slightly larger view
    to accommodate a sentinel. In particular, we also used identical code to
    set up the position where parsing should resume after such a field.

    This was incorrect as it is in general impossible to tell where parsing
    continues after a field with `&max-size` since it does not signify a
    fixed view like `&size`. In this patch we now compute the next position
    for a `&max-size` field by inspecting the limited view to detect how
    much data was extracted.

    Closes #1668.

1.10.0-dev.140 | 2024-02-08 13:22:52 +0100

  * GH-1522: Drop overzealous validator. (Benjamin Bannier, Corelight)

    This validator was intended to reject incorrect parsing of vectors but instead
    ending up rejecting all vector parsing if the vector elements itself produced
    vectors. Since this code has no test and it seems to have no clear purpose this
    patch drops this validation.

    Closes #1522.

1.10.0-dev.138 | 2024-02-08 13:20:31 +0100

  * Remove now unused testing `random.seed`. (Benjamin Bannier, Corelight)

  * GH-1659: Lift requirement that `bytes` forwarded from filter be mutable. (Benjamin Bannier, Corelight)

    Since we did not declare the `bytes` argument to `unit::forward`
    constant it was implicitly mutable so that it was impossible to e.g.,
    pass literal bytes. This patch uses the originally intended type.

    Closes #1659.

1.10.0-dev.135 | 2024-01-30 12:29:28 +0100

  * GH-1665: Fix running of `codebase` tests. (Benjamin Bannier, Corelight)

1.10.0-dev.133 | 2024-01-29 10:59:23 +0100

  * GH-1489: Deprecate &bit-order on bit ranges. (Arne Welzel, Corelight)

    This does not appear to have any effect and allowing it may be
    confusing to users. Deprecate it with the idea of eventual
    removal.

  * Add extensive bitfield test including endianness behavior. (Arne Welzel, Corelight)

  * Add bitfield examples. (Arne Welzel, Corelight)

1.10.0-dev.129 | 2024-01-23 17:48:19 +0100

  * Adjust end of Bison-generated locations. (Robin Sommer, Corelight)

    The Bison-side end column points one beyond the element, which isn't
    that nice in error messages, so we adjust them now.

  * Extend location printing to include single-line ranges. (Robin Sommer, Corelight)

    For a location of, e.g., "line 1, column 5 to 10", we now print
    `1:5-10`, whereas we used to print it as only `1:5`, hence dropping
    information.

  * Fix Bison locations. (Robin Sommer, Corelight)

    If a Bison rule started with an optional element, its location would
    start at the end of the *previous* token if that optional element
    wasn't present. We now skip token locations that are zero-sized at the
    beginning of a rule.

1.10.0-dev.125 | 2024-01-23 16:27:43 +0100

  * Bump 3rdparty/any from `e88b1bf` to `7c76129`

  * Fix incorrect check_suite type in GH actions [skip CI]. (Benjamin Bannier, Corelight)

1.10.0-dev.122 | 2024-01-18 08:39:05 +0100

  * Update documentation of `offset()`. (Benjamin Bannier, Corelight)

    The originally documented caveats do not apply anymore, so remove them.

  * Always store a valid begin iterator in units. (Benjamin Bannier, Corelight)

  * Always pass a valid begin iterator to parse methods. (Benjamin Bannier, Corelight)

  * GH-1648: Provide meaningful unit `__begin` value when parsing starts. (Benjamin Bannier, Corelight)

    We previously would not provide `__begin` when starting the initial
    parse. This meant that e.g., `offset()` was not usable if nothing ever
    got parsed.

    With this patch we provide a meaningful value now.

    Closes #1648.

1.10.0-dev.117 | 2024-01-17 16:43:22 +0100

  * GH-1640: Implement skipping for any field with known size. (Benjamin Bannier, Corelight)

    This patch adds `skip` support for fields with `&size` attribute or of
    builtin type with known size. If a unit has a known size and it is
    specified in a `&size` attribute this also allows to skip over unit
    fields.

  * Add method to field to optionally return its size. (Benjamin Bannier, Corelight)

  * Fix skipping of literal fields with condition. (Benjamin Bannier, Corelight)

1.9.0-111 | 2024-01-11 11:55:07 +0100

  * GH-1645: Fix `&size` check. (Robin Sommer, Corelight)

    The current parsing offset could legitimately end up just beyond the
    `&size` amount.

1.9.0-109 | 2024-01-11 09:00:08 +0100

  * GH-1634: Fix infinite loop in regular expression parsing. (Robin Sommer, Corelight)

1.9.0-107 | 2024-01-11 08:59:05 +0100

  * Bump justrx to pull in bugfix. (Robin Sommer, Corelight)

  * CI: Re-enable `clang17_ubuntu_debug_task`. (Robin Sommer, Corelight)

1.10.0-dev.103 | 2024-01-09 14:00:44 +0100

  * Remove references to Cirrus cron task. (Benjamin Bannier, Corelight)

    We do not schedule CI runs with cron anymore.

  * Run CI ASAN task also for PRs. (Benjamin Bannier, Corelight)

  * Skip tests around stack size on macos with ASAN. (Benjamin Bannier, Corelight)

    These tests produce false positives on macos with ASAN which seem hard
    to get rid of. Disable them on the smallest possible subset of setups.

  * Fix ASAN false positives introduces with d332827aee7d70cdb642631d7a289751e1d8a36a. (Benjamin Bannier, Corelight)

    Since the logging changes of d332827aee7d70cdb642631d7a289751e1d8a36a
    ASAN reports false positives on e.g., macos-13.6.2 with its
    clang-1500.0.40.1. This patch slightly reorganizes the code so these
    false positiives are not triggered.

1.10.0-dev.98 | 2024-01-09 13:55:27 +0100

  * Bump dependencies. (Benjamin Bannier, Corelight)

  * GH-1632: Bump justrx to pull in bugfix. (Robin Sommer, Corelight)

    Closes #1632.

  * CI: drop freebsd-12, add freebsd-14. (Benjamin Bannier, Corelight)

  * GH-1500: Add `+=` operator for `string`. (Benjamin Bannier, Corelight)

    This allows appending to a `string` without having to allocate a new
    string. This might perform better most of the time.

    Closes #1500.

1.9.0-97 | 2024-01-09 10:13:30 +0100

  * GH-1632: Bump justrx to pull in bugfix. (Robin Sommer, Corelight)

1.10.0-dev.91 | 2024-01-04 12:44:32 +0100

  * Add unit tests for extracting from expanding Views. (Benjamin Bannier, Corelight)

  * Add unit tests for extracting from Views with gaps. (Benjamin Bannier, Corelight)

  * Add fast pass to noop unsafe stream iterator increment/decrement. (Benjamin Bannier, Corelight)

    We already had this optimization for safe, but not for unsafe iterators.

  * GH-1628: Avoid potentially inefficient data access in `View::extract`. (Benjamin Bannier, Corelight)

    While we already had a fast path to extract data out of `View`s
    consisting of a single chunk we still would use a potentially
    inefficient approach when extracting from `View`s over multiple chunks.

    This patch uses the same optimized handling for both cases.

    Closes #1628.

1.10.0-dev.86 | 2024-01-02 16:38:08 +0100

  * Suppress clang-tidy `misc-include-cleaner` lint. (Benjamin Bannier, Corelight)

    This currently triggers a lot of issues. While it seems to be useful
    getting us to a passing state seems to require substantial work.

  * Remove outdated workaround for clang-tidy. (Benjamin Bannier, Corelight)

    With newer clang-tidy versions this is not needed anymore.

  * Reenable clang-tidy `readability-simplify-boolean-expr` lint. (Benjamin Bannier, Corelight)

    This currently triggers no issues, and the lint seems to be generally
    useful.

  * Drop `;` after `#pragma`. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `readability-redundant-string-init` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `bugprone-exception-escape` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `misc-header-include-cycle` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `bugprone-use-after-move` lints. (Benjamin Bannier, Corelight)

  * Suppress clang-tidy `bugprone-switch-missing-default-case` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `readability-avoid-unconditional-preprocessor-if` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `modernize-use-emplace` lints. (Benjamin Bannier, Corelight)

  * Suppress clang-tidy `modernize-macro-to-enum` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `performance-avoid-endl` lints. (Benjamin Bannier, Corelight)

  * Fix clang-tidy `modernize-type-traits` lints. (Benjamin Bannier, Corelight)

  * Update clang-tidy suppression for newer clang-tidy versions. (Benjamin Bannier, Corelight)

  * Remove nightly task. (Benjamin Bannier, Corelight)

    This task originally tested against Zeek's `master` branch. We do not do
    that anymore since some time so this task has lost its purpose.

  * Remove `--rpath` flag to `ci/run-ci`. (Benjamin Bannier, Corelight)

    Uses of this flag have been mirroring external setup of
    `LD_LIBRARY_PATH` in `.cirrus.yml` for some time with no added benefit.

    Drop it instead of investing work in keeping it consistent.

  * Disable building benchmarks in CI. (Benjamin Bannier, Corelight)

    On some platforms the CMake configure phase of 3rdparty/benchmark fails
    with errors like

    ```
    CMake Error at 3rdparty/benchmark/CMakeLists.txt:301 (message):
      Failed to determine the source files for the regular expression backend
    ```

    Since it is not executed in CI anyway disable it.

  * Refresh LLVM version in CI Docker image. (Benjamin Bannier, Corelight)

  * Remove unused Docker image args. (Benjamin Bannier, Corelight)

  * Bump CI image to ubuntu-22.04. (Benjamin Bannier, Corelight)

1.10.0-dev.64 | 2024-01-02 15:50:26 +0100

  * Add dependency of generated file `spicy-build` on source file. (Benjamin Bannier, Corelight)

    Without this dependency we never updated the generated file.

  * Remove use of `IntrusivePtr` over `const`. (Benjamin Bannier, Corelight)

    It looks like using a `IntrusivePtr<const T>` interferes with default'ed
    move constructors and assignment operators so that the non-move versions
    are called. This can incur additional overhead.

    This patch simply gets rid all `IntrusivePtr<const T>` in favor of
    `IntrusivePtr<T>` which does not seem to show this issue. It might be
    possible to instead adjust something e.g., `ManagedObject` so
    `IntrusivePtr` does not regress when holding semantically `const`
    values though.

    For a big internal parser this shows runtime improvements up to 2%.

1.10.0-dev.61 | 2024-01-02 15:50:05 +0100

  * Fix docs namespace for symbols from `filter` module. (Benjamin Bannier, Corelight)

    We previously would document these symbols to be in `spicy` even though
    they are in `filter`.

1.10.0-dev.59 | 2023-12-15 13:29:41 +0100

  * Add move ctr for `stream::SafeConstIterator`. (Benjamin Bannier, Corelight)

  * Use unchecked operations for `View::unsafeEnd`. (Benjamin Bannier, Corelight)

    We previously would call `end()` to compute `unsafeEnd` which incurs
    overheads this function is explicitly designed to avoid. We now switch
    this implementation of this function to completely unsafe code avoiding
    these overheads.

  * Add move ctr for `stream::View`. (Benjamin Bannier, Corelight)

    In C++17 move ctors are not by default generated, add them explicitly.
    We also get rid of the `View` dtr since it adds nothing (e.g., the class
    is declared `final`), but declaring them could e.g., make the class not
    POD anymore (this is not the case here though).

1.10.0-dev.55 | 2023-12-12 18:38:24 +0100

  * GH-1617: Fix handling of `%synchronize-*` attributes for units in lists. (Benjamin Bannier, Corelight)

    We previously would not detect `%synchronize-at` or `%synchronize-from`
    attributes if the unit was not directly in a field, i.e., we mishandled
    the common case of synchronizing on a unit in a list.

    With this patch we now handle these attributes, regardless of how the
    unit appears.

1.10.0-dev.53 | 2023-12-12 13:05:41 +0100

  * Avoid unnecessary copy when constructing `Stream` from `Bytes`. (Benjamin Bannier, Corelight)

  * Back Chunk with a std::string instead of std::variant. (Arne Welzel, Corelight)

    This is probably a bit funky due to the trailing \0 and a Chunk not
    being a string, but hey, hilti::rt::Bytes is backed by std::string, too.

    Looking at the creation of Chunk::Chunk(), there's actually a memset()
    operation visible due to the variant holding some 40 bytes that are
    zero initialized upon construction. std::string supports SSO, so we
    can leverage even if the actual size is out of our control. The
    std::get_if()s do show up very marginally for the View::size() calls.

1.10.0-dev.50 | 2023-12-11 12:08:12 +0100

  * GH-1615: Optimize C++ tuple element coercions. (Benjamin Bannier, Corelight)

    This patch introduces an optimization to pass C++ tuples through if they
    do not need C++-side coercion. This emits better code if a tuple ctor
    already has the right types. We also optimize codegen if we are coercing
    from a temporary tuple in that we now capture it in a temporary and
    coerce elements from that instead of repeatedly emitting the same tuple
    ctor (we scale with the number of tuple elements now not its square
    anymore).

1.10.0-dev.48 | 2023-12-08 15:55:12 +0100

  * Use deterministic destruction of Spicy runtime in unit tests. (Benjamin Bannier, Corelight)

    We previously would shut down the runtimes in units tests with
    library destructors. Due to recent changes ASAN correctly flags this as
    potential use-after-free errors (e.g., it might run after the
    configuration global has already been destructed).

    With this patch implement our own doctest main function and
    deterministically tear down runtimes from that.

1.10.0-dev.46 | 2023-12-08 09:56:14 +0100

  * Remove redundant forward decl. (Benjamin Bannier, Corelight)

  * GH-1611: Silence ASAN warning. (Benjamin Bannier, Corelight)

1.10.0-dev.43 | 2023-12-08 09:55:13 +0100

  * Allocate Vector::_control lazily. (Arne Welzel, Corelight)

  * Allocate Bytes::_control lazily. (Arne Welzel, Corelight)

1.10.0-dev.40 | 2023-12-06 12:31:27 +0100

  * GH-1605: Allow for unresolved types for set `in` operator. (Benjamin Bannier, Corelight)

1.10.0-dev.38 | 2023-12-06 12:28:27 +0100

  * Avoid reallocating Bytes when appending from view (Arne Welzel, Corelight)

    When copying a full view into a Bytes instance, avoid potential
    reallocations and memcpy() by pre-allocating enough capacity in
    the underlying string.

  * Allocate vector of correct size right away when constructing Chunks. (Benjamin Bannier, Corelight)

  * Avoid one extra std::string copy in Stream::append. (Arne Welzel, Corelight)

    For a chunk of significant size, seems that would result in an extra
    malloc and copy of the input data.

  * Reduce safe iterator use in internal code for `Bytes`. (Benjamin Bannier, Corelight)

    The safe iterator for bytes dynamically allocates which can cause
    overhead. Use index-based or at least string iterators to reduce that
    overhead where possible.

  * Use unsafe iterators in `View::extract`. (Benjamin Bannier, Corelight)

  * Avoid unneeded parameter copy in parse functions. (Benjamin Bannier, Corelight)

  * Streamline `View::firstBlock`. (Benjamin Bannier, Corelight)

  * Reduce allocations when connecting sinks by mime-type. (Benjamin Bannier, Corelight)

  * Reduce allocations for `Sink` debug logging. (Benjamin Bannier, Corelight)

  * Deprecate `builder::string`. (Benjamin Bannier, Corelight)

  * Reduce allocations when creating exceptions. (Benjamin Bannier, Corelight)

  * Reduce allocations in `builder::addAssert`. (Benjamin Bannier, Corelight)

  * Reduce allocations in `ParserBuilder::waitForInput`. (Benjamin Bannier, Corelight)

  * Reduce allocations in `Builder::startProfiler`. (Benjamin Bannier, Corelight)

  * Reduce allocatons in `Builder::addDebug*` methods. (Benjamin Bannier, Corelight)

  * Reduce allocations in `ParserBuilder::parseError`. (Benjamin Bannier, Corelight)

  * Reducing copying when forwarding data to sinks. (Benjamin Bannier, Corelight)

  * Reduce lookup overhead in indent/dedent logger functions. (Benjamin Bannier, Corelight)

  * Emit C++ string literals for HILTI string literals. (Benjamin Bannier, Corelight)

    When emitting literals for HILTI strings (string ctors) we would
    previously explicitly force creation of `std::string`. This was almost
    always an unnecessary pessimisation over emitting string literals since
    even if their C++ uses expected `std::string` string literals can
    convert to this type implicitly; at the same time it made it impossible
    to make effective use of APIs accepting `std::string_view`.

    With this patch we now emit C++ string literals for HILTI string
    literals.

  * Emit locations as generated strings. (Benjamin Bannier, Corelight)

  * Avoid allocations when creating parsers. (Benjamin Bannier, Corelight)

  * Use non-owning strings for `fmt`. (Benjamin Bannier, Corelight)

  * Use non-owning strings for `printParserState`. (Benjamin Bannier, Corelight)

  * GH-1591: Use non-owning strings in the logging framework. (Benjamin Bannier, Corelight)

    Closes #1591.

  * Add `to_string_for_print` for string literals. (Benjamin Bannier, Corelight)

  * GH-1589: Reduce string allocations on hot parse path. (Benjamin Bannier, Corelight)

    When waiting for input we pass down strings for a possible error message
    and the triggering location. In generated code these are always
    literals.

    With this patch we do not take them as owning strings, but instead as
    views into existing strings to minimize allocations. In the case of
    error messages the created low-level exception objects already had used
    string_views, so this also aligns the APIs.

    Closes #1589.

  * Bump pre-commit hooks (Benjamin Bannier, Corelight)

1.10.0-dev.10 | 2023-12-06 10:40:22 +0100

  * Allow unsafe Vector iteration over underlying std::vector. (Arne Welzel, Corelight)

1.10.0-dev.8 | 2023-11-17 14:04:16 +0100

  * doc: Fix typo and outdated info for host applications (Anthony VEREZ)

  * Add placeholder section for 1.10 to NEWS. (Benjamin Bannier, Corelight)

1.9.0 | 2023-10-24 16:28:18 +0200

  * Release 1.9.0.

1.9.0-dev.159 | 2023-10-24 16:26:42 +0200

  * Bump 3rdparty/utf8proc (dependabot[bot])

1.9.0-dev.157 | 2023-10-23 10:58:57 +0200

  * Fix spicy-build to correctly infer library directory. (Robin Sommer, Corelight)

    Closes https://github.com/zeek/zeek/issues/3384.

1.9.0-dev.155 | 2023-10-23 10:54:13 +0200

  * GH-1565: Disable capturing backtraces with HILTI exceptions in non-debug builds. (Robin Sommer, Corelight)

    They can be expensive to capture, and aren't used anywhere by default
    unless explicitly requested.

    We change it so that the exception class still remains ABI
    compatible between release and debug builds. It's the compilation
    settings of the code including `exception.h` that determines if a
    backtrace it captured.

    Closes #1565.

1.9.0-dev.152 | 2023-10-23 10:49:19 +0200

  * GH-1567: Speed up runtime calls to start profilers. (Robin Sommer, Corelight)

    We now cache the profiler tags to avoid frequent re-computation.

    Closes #1567.

1.9.0-dev.150 | 2023-10-23 10:48:59 +0200

  * GH-1568: Fix bitfield's lack of declaring its C++-side type dependencies. (Robin Sommer, Corelight)

    Closes #1568.

1.9.0-dev.148 | 2023-10-23 10:10:39 +0200

  * Remove check of Zeek docs in Cirrus cron config. (Benjamin Bannier, Corelight)

    This is a follow-up to 2b92da596631ff1a29b7deac05e00faaad9305f3.

1.9.0-dev.146 | 2023-10-13 12:26:24 +0200

  * Remove Zeek-specific documentation. (Robin Sommer, Corelight)

    This now lives Zeek-side.

    This keeps the section structure so that we make things easier to
    find, and put in pointers to the new Zeek-side documentation

    It leaves everything in the development section as is; hard to piece
    apart and seems fine to leave it here.

1.9.0-dev.144 | 2023-10-13 11:47:35 +0200

  * GH-1571: Remove trimming inside individual chunks. (Benjamin Bannier, Corelight)

    Trimming `Chunk`s (always from the left) causes a lot of internal work
    with only limited benefit since we manage visibility with `stream::View`s
    on top of `Chunk`s anyway.

    This patch removes trimming inside `Chunk`s so now any trimming only
    removes `Chunk`s from `Chain`s, but does not internally change
    individual `Chunk`s anymore. This might lead to slightly increased memory
    use, but callers usually have that data in memory anyway.

    Closes #1571.

1.9.0-dev.142 | 2023-10-09 11:10:35 +0200

  * Explicitly set ASM compiler. (Benjamin Bannier, Corelight)

    When not setting an ASM compiler we might end up configuring Clang as C
    compiler, but GCC as ASM compiler. The code in `3rdparty/fiber` then
    causes Clang-only flags like `-Weverything` to be passed to GCC (which
    does not understand it).

    The way we need to do this is subtle. We need to rely on
    `3rdparty/fiber` to explicitly `enable_language(ASM)` and not set it as
    a project language to work around `find_package(BISON)` breaking if
    `CMAKE_ASM_COMPILER` is set. By removing ASM from project languages and
    setting the ASM config after Bison was found, but before we configure
    `3rdparty/fiber` things seem to work as intended.

1.9.0-dev.140 | 2023-10-06 12:34:02 +0200

  * Set `ParserState::begin` on all possible paths into a parser. (Benjamin Bannier, Corelight)

    We previously would sometimes leave `ParserState::begin` unset, e.g.,
    when parsing beginning parsing of a top-level production. With this
    patch we now set its value on all possible paths.

  * Fix spicy-rt-tests for freebsd-12. (Benjamin Bannier, Corelight)

  * GH-1089: Make `offset()` independent of random access functionality. (Benjamin Bannier, Corelight)

    With this patch we store the value returned by `offset()` directly in
    the unit instead of computing it on the fly when requested from `cur -
    begin`. With that `offset()` can be used without enabling random access
    functionality on the unit.

    Closes #1089.

  * Move `offset()` into its own feature. (Benjamin Bannier, Corelight)

    This patch makes `__position` depend on `uses_offset` so uses of it
    (`position()`, `offset()`) can be tracked separately. Since `offset()`
    still requires random access `uses_offset` enables `uses_random_access`
    for that use case; we plan to relax that in a follow-up patch.

  * Consistently wrap `ParserState::begin` in optional. (Benjamin Bannier, Corelight)

1.9.0-dev.134 | 2023-10-04 11:20:46 +0200

  * Bump 3rdparty/fiber from `f75b2f9` to `ada36b2` (dependabot[bot])

    Bumps [3rdparty/fiber](https://github.com/simonfxr/fiber) from `f75b2f9` to `ada36b2`.
    - [Commits](https://github.com/simonfxr/fiber/compare/f75b2f93aa312b9922f9c977021e5470ff7715fa...ada36b254c10d487eb4d8d108a3cb156538e1885)

    ---
    updated-dependencies:
    - dependency-name: 3rdparty/fiber
      dependency-type: direct:production
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

  * Bump 3rdparty/benchmark from `0d98dba` to `7736df0` (dependabot[bot])

    Bumps [3rdparty/benchmark](https://github.com/google/benchmark) from `0d98dba` to `7736df0`.
    - [Release notes](https://github.com/google/benchmark/releases)
    - [Commits](https://github.com/google/benchmark/compare/0d98dba29d66e93259db7daa53a9327df767a415...7736df03049c362c7275f7573de6d6a685630e0a)

    ---
    updated-dependencies:
    - dependency-name: 3rdparty/benchmark
      dependency-type: direct:production
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

  * Bump 3rdparty/SafeInt from `4cafc91` to `925235c` (dependabot[bot])

    Bumps [3rdparty/SafeInt](https://github.com/dcleblanc/SafeInt) from `4cafc91` to `925235c`.
    - [Release notes](https://github.com/dcleblanc/SafeInt/releases)
    - [Commits](https://github.com/dcleblanc/SafeInt/compare/4cafc9196c4da9c817992b20f5253ef967685bf8...925235c06de490865f871218fa2bd8ac38241a95)

    ---
    updated-dependencies:
    - dependency-name: 3rdparty/SafeInt
      dependency-type: direct:production
    ...

    Signed-off-by: dependabot[bot] <support@github.com>

  * GH-1549: GH-1554: Fix potential infinite loop when trimming data before stream. (Benjamin Bannier, Corelight)

    Previously we would trigger an infinite loop if one tried to trim before
    the head chunk of a stream. In praxis this seem to have been no issue
    due to #1549 and us emitting way less calls to trim than possible.

    This patch adds an explicit check whether we need to trim anything, and
    exits the low-level function early for such cases.

    Closes #1554.

1.9.0-dev.128 | 2023-09-29 13:27:28 +0200

  * GH-1550: Replace recursive deletion with explicit loop to avoid stack overflow. (Benjamin Bannier, Corelight)

1.9.0-dev.126 | 2023-09-29 13:26:53 +0200

  * GH-1549: Add feature guards to accesses of a unit's `__position`. (Benjamin Bannier, Corelight)

    Access of `__position` triggers a random access functionality. In order
    to distinguish our internal uses from accesses due to user code, most
    access in our generated code should be guarded with a feature constant
    (`if` or ternary).

    In this patch add proper guards for a couple instances where we did not
    do that correctly. That mishap caused all units with containers to be
    random access (even the root unit) which in turn could have lead to
    e.g., unbounded memory growth, or runtime overhead due to generation and
    execution of unneeded code, or expensive cleanup on very large untrimmed
    inputs.

    Closes #1549.

  * Refactor feature guard helper to directly take unit ID instead of type. (Benjamin Bannier, Corelight)

1.9.0-dev.123 | 2023-09-27 09:41:04 +0200

  * Escape rendered bitfield fields. (Benjamin Bannier, Corelight)

  * Enforce that `Bitfield`s always own their fields. (Benjamin Bannier, Corelight)

  * Fix typos. (Benjamin Bannier, Corelight)

1.9.0-dev.119 | 2023-09-27 09:39:35 +0200

  * GH-1542: GH-1547: Bump dependencies. (Benjamin Bannier, Corelight)

1.9.0-dev.111 | 2023-09-26 16:05:25 +0200

  * Add GH dependabot config. (Benjamin Bannier, Corelight)

1.9.0-dev.109 | 2023-09-22 16:35:02 +0200

  * Add explicit dependency for local pre-commit hook. (Benjamin Bannier, Corelight)

  * Fix file selection in clang-format pre-commit hook. (Benjamin Bannier, Corelight)

1.9.0-dev.106 | 2023-09-22 12:19:21 +0200

  * GH-1533: Fix access to anonymous bitfield element through a constant value. (Robin Sommer, Corelight)

1.9.0-dev.104 | 2023-09-22 11:04:19 +0200

  * Artificially limit the number of open files. (Benjamin Bannier, Corelight)

    This works around a silent failure in reproc where it would refuse to
    run on systems which huge rlimits for the number of open files. We have
    seen this hit on huge production boxes.

1.9.0-dev.102 | 2023-09-22 11:04:01 +0200

  * GH-1478: Add regression test for #1478. (Benjamin Bannier, Corelight)

  * Add begin to parser state. (Benjamin Bannier, Corelight)

    This patch adds the current begin position to the parser state, and
    makes the corresponding changes to generated parser functions so it is
    passed down.

    We already modelled the semantic beginning of the input in the unit, but
    had no reliable way to keep this up-to-date across non-unit contexts
    like `&parse-from`. This would then for certain setups lead to generated
    code where `input` and `position` would point to different inputs which in
    turn caused `offset` (modelled as `position - input`) to be incorrect.

  * Factor computation of feature const into separate function. (Benjamin Bannier, Corelight)

  * Expand validator error message. (Benjamin Bannier, Corelight)

  * Add trait class to bitfield types. (Robin Sommer, Corelight)

    This lets C++ templates test if a class T is a bitfield.

1.9.0-dev.95 | 2023-09-20 12:14:50 +0200

  * Add trait class to bitfield types. (Robin Sommer, Corelight)

1.9.0-dev.93 | 2023-09-20 09:26:29 +0200

  * Declare Spicy pygments extension as parallel-safe. [skip CI] (Benjamin Bannier, Corelight)

1.9.0-dev.91 | 2023-09-19 11:50:32 +0200

  * Skip validating links to https://www.icir.org/hilti. (Benjamin Bannier, Corelight)

  * Document using anonymous field for extracting TCP messages. (Benjamin Bannier, Corelight)

1.9.0-dev.88 | 2023-09-15 10:47:53 +0200

  * Use find_package(Python) with version. (Arne Welzel, Corelight)

    Zeek's configure sets Python_EXECUTABLE has hint, but Spicy is using
    find_package(Python3) and would only use Python3_EXECUTABLE as hint.
    This results in Spicy finding a different (the default) Python executable
    when configuring Zeek with --with-python=/opt/custom/bin/python3.

    Switch Spicy over to use find_package(Python) and add the minimum
    version so it knows to look for Python3.

1.9.0-dev.86 | 2023-09-14 10:36:25 +0200

  * Add support for passing arbitrary C++ compiler flags. (Benjamin Bannier, Corelight)

    This adds a magic environment variable `HILTI_CXX_FLAGS` which if set
    specifies compiler flags which should be passed during C++ compilation
    after implicit flags. This could be used to e.g., set defines, or set
    low-level compiler flags.

    Even with this flag, for passing include directories one should still
    use `HILTI_CXX_INCLUDE_DIRS` since they are searched before any
    implicitly added paths.

1.9.0-dev.84 | 2023-09-07 17:12:00 +0200

  * GH-1467: Support bitfield constants in Spicy for parsing. (Robin Sommer, Corelight)

    One can now define bitfield "constants" for parsing by providing
    integer expressions with fields:

        type Foo = unit {
          x: bitfield(8) {
            a: 0..3 = 2;
            b: 4..7;
            c: 7 = 1;
          };

    This will first parse the bitfield as usual and then enforce that the
    two bit ranges that are coming with expressions (i.e., `a` and `c`)
    indeed containing the expected values. If they don't, that's a parse
    error.

    We also support using such bitfield constants for look-ahead parsing:

        type Foo = unit {
          x: uint8[];
          y: bitfield(8) {
            a: 0..3 = 4;
            b: 4..7;
          };
        };

    This will parse uint8s until a value is discovered that has its bits
    set as defined by the bitfield constant.

    (We use the term "constant" loosely here: only the bits with values
    are actually enforced to be constant, all others are parsed as usual.)

    Closes #1467.

  * Extend bitfield type with per-item storage for constant values. (Robin Sommer, Corelight)

    This allows to associate an expression with each bit value. We don't
    use this from HILTI because there's isn't a good syntax to do so
    (and/or: it's not worth adding), but we'll use (and test) this from
    Spicy in a subsequent commit.

  * Add bitfield constants. (Robin Sommer, Corelight)

    It's now possible to initialize a bitfield value through an assignment
    from a struct constructor expression:

        type BF = bitfield(8) {
          a: 0..3;
          b: 4..7;
          c: 4..5;
        };

        global BF bf = [$a = 1, $c = 2];

  * Change internal tuple representation of bitfield to store optional values. (Robin Sommer, Corelight)

    This will allow us to create bitfield constants where not at all
    elements are set. We also add an operator to test if an element is
    set (test forthcoming in a subsequent commit).

1.9.0-dev.79 | 2023-09-07 11:15:05 +0200

  * GH-1520: Fix handling of `spicy-dump --enable-print`. (Benjamin Bannier, Corelight)

    This flag was understood, but not handled since at least v1.1.0.

1.9.0-dev.77 | 2023-09-06 14:38:55 +0200

  * Clarify error handling docs [skip CI]. (Benjamin Bannier, Corelight)

    The docs previously made it sound as if exceptions could potentially be
    swallowed with `on %error` handlers. Since this is currently not
    supported, but a often requested feature, clarify the docs to not stir
    up too much anticipation.

1.9.0-dev.75 | 2023-09-05 16:15:17 +0200

  * Merge branch 'topic/bbannier/rtd-search-suppress-doxygen-results' (Benjamin Bannier, Corelight)

  * GH-1516: Do not include generated Doxygen documentation in RTD search results [skip CI]. (Benjamin Bannier, Corelight)

    Doxygen documentation is likely not relevant for users and hides results
    they are looking for. Also, Doxygen already comes with its own search
    which is reachable the developer documentation.

    Closes #1516.

  * Reduce ccache cache size in CI. (Benjamin Bannier, Corelight)

1.9.0-dev.71 | 2023-09-01 10:33:35 +0200

  * Drop removed RTD config key. (Benjamin Bannier, Corelight)

1.9.0-dev.69 | 2023-09-01 09:57:22 +0200

  * GH-1503: Handle anonymous bitfields inside `switch` statements. (Robin Sommer, Corelight)

    We now map items of anonymous bitfields inside a `switch` cases into
    the unit namespace, just like we already do for top-level fields. We
    also catch if two anonymous bitfields inside those cases carry the
    same name, which would make accesses ambiguous.

    So the following works now:

    ```
        switch (self.n) {
            0 -> : bitfield(8) {
                A: 0..7;
            };
            * -> : bitfield(8) {
                B: 0..7;
            };
        };
    ```

    Whereas this does not work:

    ```
        switch (self.n) {
            0 -> : bitfield(8) {
                A: 0..7;
            };
            * -> : bitfield(8) {
                A: 0..7;
            };
        };
    ```

    The latter not working is reasonable I think, rather than trying to
    figure out that the two cases have the same type and hence could be
    mapped to a single data member in the resulting code (which we do, and
    support, for cases of the same *name* and type).

    Closes #1503.

  * Polish string rendering of anonymous bitfields in structs. (Robin Sommer, Corelight)

    We now print their ID as `<anon>`. This isn't perfect, it would be
    nicer if we printed out the IDs of the bitfield's items at the
    top-level (like `spicy-dump` does). However we don't have the
    necessary type information available when rendering as a string, and
    this seems good enough.

  * Support `.?` and `?.` for items of anonymous bitfields. (Robin Sommer, Corelight)

1.9.0-dev.64 | 2023-08-28 17:05:18 +0200

  * GH-1508: Fix returned value for `<unit>.position()`. (Benjamin Bannier, Corelight)

    We declared this method to return an iterator, but potentially returned
    an optional iterator. This patch add an additional deref so we get the
    correct value.

1.9.0-dev.62 | 2023-08-28 12:11:40 +0200

  * GH-1504: Use user-inaccessible chars for encoding `::` in feature variables. (Benjamin Bannier, Corelight)

    When setting up feature tracking variables for the optimizer we
    previously would normalize `:` as `_`, e.g., `mod::Unit` would lead to
    feature variables `__feat%mod__Unit%...`. In various places in the
    optimizer we would then use that knowledge to extract module and unit
    ID. Since user-specified identifiers can contain literal `_` or `__`
    this could confuse the optimizer.

    With this patch we now normalize `:` as `@` which is not
    user-accessible. We add a new codegen normalization so `@` becomes
    `0x40`. This gives a more reliable encoding.

  * Clean up extraction and handling of feature flag in optimizer. (Benjamin Bannier, Corelight)

1.9.0-dev.59 | 2023-08-22 15:10:07 +0200

  * Add documentation for `export` extensions. (Robin Sommer, Corelight)

    This goes with https://github.com/zeek/zeek/pull/3228.

  * spicy-dump: Level up anonymous bitfields. (Robin Sommer, Corelight)

    Spicy-dump now renders items of anonymous bitfields at the parent
    level. Offsets are added accordingly as well if requested.

  * spicy-dump: Make offsets in JSON output useful. (Robin Sommer, Corelight)

    We were including offsets into spicy-dumps JSON output, but there was
    no information in there saying which offsets belong to what field.
    Turning `__offsets` from an array into a map indexed by field name now.

  * spicy-dump: Change format how bitfields are printed. (Robin Sommer, Corelight)

    We now render them as key/value form in both text and JSON output.

  * Include a flag into a unit field's type information indicating if it's anonymous. (Robin Sommer, Corelight)

    This preservers the information if a field had a name even though
    internally we do carry a generated dummy name around in that case. For
    now, we just adapt `spicy-dump` to not print the dummy name in that
    case in its text output. Later, Zeek will leverage this when
    auto-generating record types.

  * GH-1468: Allow to directly access members of anonymous bitfields. (Robin Sommer, Corelight)

    This works now:

        type Foo = unit {
          : bitfield(8) {
            x: 0..3;
            y: 4..7;
          };

          on %done {
            print self.x, self.y;
          }
    };

  * GH-1032: GH-1484: Switch Spicy over to use the new HILTI-side bitfield type. (Robin Sommer, Corelight)

  * Implement remaining pieces to make `bitfield` a full HILTI type. (Robin Sommer, Corelight)

    We keep representing bitfields as a C++ tuple behind the scenes, but
    no longer map it into a HILTI-side tuple as well. Instead `Bitfield`
    is now a regular type with corresponding operators and runtime
    functionality.

    The one change to the C++ tuple representation is that we add an
    additional hidden tuple element at the end that stores the original
    integer value. That allows for displaying it (which we will do for now
    only inside Spicy debug output) and could later also facilitate modifying
    fields and reconstructing an integer.

  * Move `bitfield` type from Spicy to HILTI. (Robin Sommer, Corelight)

    This prepares for making `bitfield` a fully-supported HILTI type. This
    change only moves existing code over to HILTI without breaking
    Spicy-side functionality. There are still HILTI-side pieces missing
    for providing full support, which will come next.

  * Fix comparison for resolved operators. (Robin Sommer, Corelight)

    The `isEqual` method was implemented in the base class, which led to
    wrong template types being used.

    A subsequent commit will depend on this working correctly, including a test
    breaking if not.

1.9.0-dev.47 | 2023-08-14 11:32:33 +0200

  * GH-1384: Fix stringification of `DecodeErrorStrategy`. (Benjamin Bannier, Corelight)

    This was pointed out by Simeon Miteff in #1384.

1.9.0-dev.45 | 2023-08-14 11:32:11 +0200

  * Fix handling of `--show-backtraces` flag. (Benjamin Bannier, Corelight)

    This flag was intended and always documented as a toggle, but instead
    implemented as an argument taking a value (which was never evaluated).
    This patch fixes the implementation to align with itend and
    documentation.

1.9.0-dev.43 | 2023-08-14 11:31:35 +0200

  * Bump FreeBSD versions in CI. (Benjamin Bannier, Corelight)

1.9.0-dev.41 | 2023-07-19 09:17:47 +0200

  * Mention unit switch statements in conditional parsing docs. (Benjamin Bannier, Corelight)

    Instead of decorating many fields with `if` conditions for certain
    grammars a simpler approach can be to use a unit switch statement with
    branch-by-expressions. Add a link to unit switch from the conditional
    parsing section.

1.9.0-dev.39 | 2023-07-18 11:21:27 +0200

  * GH-1485: Add validator rejecting unsupported multiple uses of attributes. (Benjamin Bannier, Corelight)

    While for some attributes like e.g., `&requires` we support multiple
    mentions, for many we actually only support at most one instance. We
    previously would only interpret only one, even if multiple instances
    where given.

    This patch adds a validator which rejects code with multiple instances
    of such attributes. We also add test coverage for `&requires` supporting
    multiple instances.

    Closes #1485.

1.9.0-dev.37 | 2023-07-07 12:56:37 +0200

  * Fix typo: maccOS -> macOS (Ryan Schmidt)

1.9.0-dev.35 | 2023-07-07 11:22:41 +0200

  * GH-1465: Support skipping explicit `%done` in external hooks. (Robin Sommer, Corelight)

    Assuming `Foo::X` is a unit type, these two are now equivalent:

        on Foo::X::%done   { }
        on Foo::X          { }

  * GH-1465: Produce better error message when hooks are used on a
    unit field. (Robin Sommer, Corelight)


1.9.0-dev.32 | 2023-07-05 13:03:56 +0200

  * GH-1475: Add regression test for #1475. (Benjamin Bannier, Corelight)

1.9.0-dev.30 | 2023-07-04 17:10:32 +0200

  * GH-1475: Revert #1439. (Benjamin Bannier, Corelight)

    The changes for #1439 were incorrect and introduced incorrect parsing with
    possible undefined behavior at runtime when encountering a combination of
    list parsing and `&parse-from` or `&parse-at`.

    This revert reopens GH-1421 and GH-1089.

1.9.0-dev.27 | 2023-06-28 14:43:05 +0200

  * Run a few pre-commit checks only at `commit` stage. (Benjamin Bannier, Corelight)

  * GH-1466: Reject uses of `self` in unit `&size` and `&max-size` attribute. (Benjamin Bannier, Corelight)

    Values in `self` are only available after parsing has started while
    `&size` and `&max-size` are consumed before that. This means that any
    use of `self` and its members in these contexts would only ever see
    unset members, so it should not be the intended use.

    This patch adds a validation which rejects uses of `self` for these unit
    attributes.

  * Refactor validation code for unit `&size` and `&max-size` attributes. (Benjamin Bannier, Corelight)

1.9.0-dev.23 | 2023-06-28 10:20:18 +0200

  * Bump doc sphinx-rtd-theme dependency. (Benjamin Bannier, Corelight)

1.9.0-dev.21 | 2023-06-27 10:04:53 +0200

  * Fix rendering in validation of `%byte-order` attribute. (Benjamin Bannier, Corelight)

  * GH-1275: Add missing lowering of Spicy unit ctor to HILTI struct ctor. (Benjamin Bannier, Corelight)

1.9.0-dev.18 | 2023-06-27 10:04:11 +0200

  * Bump freebsd12 version in CI. (Benjamin Bannier, Corelight)

1.9.0-dev.16 | 2023-06-26 14:48:32 +0200

  * Factor out code to guard search during recovery. (Benjamin Bannier, Corelight)

  * GH-1231: GH-1464: Add special handling for potential `advance` failure in trial mode. (Benjamin Bannier, Corelight)

    In 7c18597f1b95747b0305918eb1777ed22c06b166 for #1231 we added code to
    handle advance failures in trial mode when synchronizing on regexps, but
    missed adding the same support for literals. This patch adds that
    missing part.

1.9.0-dev.13 | 2023-06-26 14:39:10 +0200

  * GH-1446: Initialize generated struct members in constructor body. (Benjamin Bannier, Corelight)

    We previously would generate them with default member initializers. This
    lead to issues since for some constructs we need to create temporaries
    (e.g., mutable accessors to `self`). With this patch we now always emit
    a constructor body which ensures we have a block to attach temporaries
    to.

  * Disable implicit conversions of `cxx::Block` to `bool`. (Benjamin Bannier, Corelight)

    I ran into this when I incorrectly tried to directly output a
    `cxx::Block` to an iostream which worked but output a boolean (via
    implicit conversion).

  * Add missing newline in spicy-driver usage string. (Benjamin Bannier, Corelight)

1.9.0-dev.9 | 2023-06-20 08:48:49 +0200

  * Fix signedness warning. (Arne Welzel, Corelight)

1.9.0-dev.7 | 2023-06-15 14:40:25 +0200

  * Fix autogeneration of zeek docs. (Benjamin Bannier, Corelight)

1.9.0-dev.5 | 2023-06-14 16:37:26 +0200

  * GH-1435: Add bitwise operators `&`, `|`, and `^` for booleans. (Benjamin Bannier, Corelight)

1.9.0-dev.3 | 2023-06-14 16:35:45 +0200

  * GH-1343: Include condition in `&requires` failure message. (Benjamin Bannier, Corelight)

    With this patch we now include the `&requires` condition in the failure
    message in case the condition is not met. Since we do not have direct
    access to the Spicy source code anymore we render HILTI code for now,
    but undo the most common desugaring by replacing `__dd` with `$$`.

  * Update links to some release artifacts. (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.9 to NEWS. (Benjamin Bannier, Corelight)

1.8.0 | 2023-06-14 08:53:34 +0200

  * Release 1.8.0.

1.8.0-dev.176 | 2023-06-14 08:52:14 +0200

  * Update Zeek docs for Zeek 6.0. (Robin Sommer, Corelight)

1.8.0-dev.173 | 2023-06-09 10:01:28 +0200

  * GH-1447: Do not forcibly make `strong_ref` `in` function parameters immutable. (Benjamin Bannier, Corelight)

    We previously would always emit a `const` value when passing a
    `strong_ref` as a function parameter. This lead to the unintuitive error
    that non-const `strong_ref` parameters could not be modified or have
    non-const methods called on them (this would actually fail at codegen
    time).

    With this patch we remove the special treatment of `strong_ref`
    parameter mutability.

    Closes #1447.

1.8.0-dev.171 | 2023-06-09 10:00:51 +0200

  * GH-1452: Allow resolving of unit parameters before `self` is fully resolved. (Benjamin Bannier, Corelight)

    When constructing the list of declarations in a scope we previously
    would not emit any items for struct types without fully resolved type.
    This lead to the situation where when resolving references to a unit
    parameter we might end up resolving them to similarly named globals
    since they were available before the struct type was resolved.

    This patch makes sure that we emit at least unit parameters at struct
    scope level, even if we cannot emit `self` yet. This improves the
    situation around globals mentioned above and is likely okay since `self`
    should only ever resolve to something at struct scope.

    Closes #1452.

1.8.0-dev.169 | 2023-06-09 09:59:42 +0200

  * Fix docs for long-form of `-x` flag to spicyc. (Benjamin Bannier, Corelight)

    The long form of `-x` is `--output-c++-files` but we documented
    `--output-c++` instead which is used for `-c` and takes no argument.

1.8.0-dev.167 | 2023-06-09 09:59:08 +0200

  * Replace obsolete uses of `egrep` with `grep -E`. (Benjamin Bannier, Corelight)

1.8.0-dev.165 | 2023-06-07 17:23:04 +0200

  * Clean up dependencies for ubuntu-22 image. (Benjamin Bannier, Corelight)

1.8.0-dev.163 | 2023-06-07 15:15:10 +0200

  * Remove unsupported fedora-36, add fedora-38. (Benjamin Bannier, Corelight)

  * Bump supported Alpine version to latest release. (Benjamin Bannier, Corelight)

  * Refresh supported Ubuntu versions to upstream supported ones. (Benjamin Bannier, Corelight)

  * Remove EOL debian-9. (Benjamin Bannier, Corelight)

1.8.0-dev.158 | 2023-06-05 11:26:41 +0200

  * GH-1448: Adjust getting started docs for removed JIT compilation via Zeek. (Benjamin Bannier, Corelight)

  * Fix markup for code blocks. (Benjamin Bannier, Corelight)

1.8.0-dev.155 | 2023-05-26 13:59:22 +0200

  * Remove Zeek from Spicy CI. (Benjamin Bannier, Corelight)

1.8.0-dev.153 | 2023-05-11 16:26:49 +0200

  * Profile exception activity. (Robin Sommer, Corelight)

1.8.0-dev.151 | 2023-05-11 16:19:28 +0200

  * Add new `skip` keyword to let unit items efficiently skip over
    uninteresting data. (Robin Sommer, Corelight)

    From the documentation:

        For cases where your parser just needs to skip over some data, without
        needing access to its content, Spicy provides a ``skip`` keyword to
        prefix corresponding fields with:

        .. spicy-code:: skip.spicy

            module Test;

            public type Foo = unit {
                x: int8;
                 : skip bytes &size=5;
                y: int8;
                on %done { print self; }
            };

        ``skip`` works for all kinds of fields but is particularly efficient
        with ``bytes`` fields, for which it will generate optimized code
        avoiding the overhead of storing any data.

        ``skip`` fields may have conditions and hooks attached, like
        any other fields. However, they do not support ``$$`` in
        expressions and hooks.

        For readability, a ``skip`` field may be named (e.g., ``padding: skip
        bytes &size=3;``), but even with a name, its value cannot be accessed.

  * Deprecate parsing `void` fields with attributes. (Robin Sommer, Corelight)

    `skip` supersedes the existing void-with-attributes parsing. For
    now we continue to support that by internally mapping it over to
    the new mechanism, but will eventually remove it. `void` without
    attributes (for not parsing anything) remains supported.

  * GH-1051: Support `&requires` with `void` fields. (Robin Sommer, Corelight)

1.8.0-dev.133 | 2023-05-10 13:11:54 +0200

  * Skip failure notifications for unsuccessful non-error runs. (Benjamin Bannier, Corelight)

1.8.0-dev.131 | 2023-05-09 11:15:01 +0200

  * Fix readthedocs build. (Benjamin Bannier, Corelight)

1.8.0-dev.129 | 2023-05-08 15:20:11 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Slightly tweak existing feature requirements test. (Benjamin Bannier, Corelight)

  * GH-1089: Allow to use `offset()` without enabling full random-access support. (Benjamin Bannier, Corelight)

    In particular this allows to use `offset()` while still keeping trimming
    enabled.

  * GH-1421: Store numerical offset in units instead of iterator for position. (Benjamin Bannier, Corelight)

    We will use this in a subsequent patch to make `offset()` available
    without having to enable full support for random-access.

    Closes #1421.

1.8.0-dev.124 | 2023-04-28 11:41:21 +0200

  * GH-1436: Make sure `Bytes::sub` only throws HILTI exceptions. (Benjamin Bannier, Corelight)

    We previously would directly invoke `Base::substr` which can throw
    and leak `std::out_of_range`. We now make sure to only throw HILTI
    exceptions from that function.

    Closes #1436.

  * Implement all `Bytes::sub` in terms of bytes offsets. (Benjamin Bannier, Corelight)

    We will use this in a subsequent patch which cleans up exception
    handling from `std::string::substr`.

1.8.0-dev.121 | 2023-04-27 15:19:08 +0200

  * Suppress uninteresting compiler diagnostic in test stderr diff. (Benjamin Bannier, Corelight)

  * Fix gcc-13 warnings about possibly dangling references. (Benjamin Bannier, Corelight)

  * Roll back 3rdparty/reproc upgrade. (Benjamin Bannier, Corelight)

  * Silence gcc-13 warning for reproc. (Benjamin Bannier, Corelight)

  * Add missing include for `uint64_t`. (Benjamin Bannier, Corelight)

1.8.0-dev.115 | 2023-04-24 10:59:27 +0200

  * Make sure Spicy runtime config is initialized after `spicy::rt::init`. (Benjamin Bannier, Corelight)

    We previously wouldn't explicitly initialize the Spicy runtime
    configuration but instead rely on `configuration::get` (which implicitly
    initializes it) to be called somewhere in the driver. This makes it hard
    to use parsers outside of our drivers, we e.g., saw nullptr derefs in
    our fuzzer binaries.

    With this patch we force initialization in `spicy::rt::init` which is
    the documented way to ensure all runtime dependencies are set up
    correctly.

  * Roll back 3rdparty/reproc downgrade. (Benjamin Bannier, Corelight)

    This appears to have been downgraded to a two year old version by
    accident.

1.8.0-dev.112 | 2023-04-24 10:10:57 +0200

  * Move exception creation out of reference getters. (Benjamin Bannier, Corelight)

    This helps reduce the size of the changed functions which might allow
    more inlining.

  * Make it cheaper to access a `ValueReference`. (Benjamin Bannier, Corelight)

    Since we know that if a `ValueReference` holds a raw pointer it must
    always be valid we can inline some paths from `_get` directly into
    `_safeGet`. We also reduce the size of `_get` from the knowledge that we
    must hold exactly two alternatives, and replace uses of `variant`
    `std::get` (which sets up exception handling) with `std::get_if` which
    is slightly cheaper at runtime.

  * Disallow constructing ValueReferences from nullptrs. (Benjamin Bannier, Corelight)

    We will use this in a subsequent patch which makes use of the fact that
    `self` references are always valid.

1.8.0-dev.108 | 2023-04-24 10:10:26 +0200

  * Add fast pass for iterator difference in `offset()`. (Benjamin Bannier, Corelight)

    When generating code for `offset()` we previously would use the
    difference of safe iterator which has extra code to make sure the two
    iterators belong to the same stream. This check can never fail when
    computing `offset()` so use a fast pass in that case.

1.8.0-dev.106 | 2023-04-21 12:03:21 +0200

  * Bring new structure of safe/unsafe getters for global/config state to Spicy. (Robin Sommer, Corelight)

  * Fix ordering issue in spicy-driver when shutting down runtime. (Robin Sommer, Corelight)

  * Switch some more places to use unsafe getters for global/config state. (Robin Sommer, Corelight)

  * Speed up access checks for `optional`. (Robin Sommer, Corelight)

  * Provide unsafe fastpath to access global state. (Robin Sommer, Corelight)

  * Move runtime configuration out of central global state. (Robin Sommer, Corelight)

  * Reduce stack checking overhead. (Robin Sommer, Corelight)

  * Reduce overhead of profiler operations when not needed. (Robin Sommer, Corelight)

  * Add fast path to `View::extract()`. (Robin Sommer, Corelight)

  * Inline a couple more stream methods. (Robin Sommer, Corelight)

1.8.0-dev.95 | 2023-04-19 10:13:12 +0200

  * Fix gcc-13 warning about pessimizing move. (Benjamin Bannier, Corelight)

1.8.0-dev.93 | 2023-04-14 10:39:02 +0200

  * Implement `View::data` with `Bytes::append`. (Benjamin Bannier, Corelight)

  * Avoid unneeded temporaries when appending `View` to `Bytes`. (Benjamin Bannier, Corelight)

    We used `View::data` to constructs a new `Bytes` to append from. Since
    we cannot reuse the temporary in the append but have to copy the data
    this introduced unneeded overhead. This patch inlines the low-level
    `View` block iteration into `Bytes::append`.

    I looked at this coming from zeek/spicy-dns#7, and with that particular
    test case where many small views are appended the speedup is only ~1.5%.
    I suspect the speedup to be bigger the bigger the view we append.

    In order to amortize reallocation costs I also looked into aggressively
    reserving capacity in the different `append` overloads, e.g., if the new
    size is bigger than the current capacity, reserve double the needed
    capacity in anticipation of more append operations to come. This did not
    make a noticeable difference, probably due to the underlying
    `std::string::append` already doing something similar.

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.8.0-dev.89 | 2023-04-12 19:40:28 +0200

  * Pin btest version on ubuntu-16 in CI. (Benjamin Bannier, Corelight)

    The recently released btest-1.0 requires python-3.7 while this system
    has only python-3.5.

1.8.0-dev.87 | 2023-04-12 17:37:26 +0200

  * Bump copyright dates in license headers. (Benjamin Bannier, Corelight)

  * Use diffutils instead of BusyBox `diff` in Alpine CI. (Benjamin Bannier, Corelight)

    The version of `btest` recently published to pypi uses flags which are
    unsupported by the BusyBox `diff` binary which ships with Alpine by
    default, see https://github.com/zeek/btest/issues/92. Use `diffutils`
    instead.

  * Add missing license headers. (Benjamin Bannier, Corelight)

  * Use safe helper to get runtime configuration. (Benjamin Bannier, Corelight)

    We previously would directly access a value from the configuration in
    the global state in functions for `accept_input` and `decline_input`.
    This is only safe if the configuration was created previously, but would
    read uninitialized memory if e.g., a parser using these functions is
    embedded in code not doing that.

    With this patch we use a safe accessor for the configuration which
    ensures that it always contains a good value.

1.8.0-dev.81 | 2023-04-12 09:11:00 +0200

  * GH-1416: Fix build with gcc13 development snapshot. (Benjamin Bannier, Corelight)

    This patch bumps 3rdparty/reproc to a version including
    DaanDeMeyer/reproc@0b23d88894ccedde04537fa23ea55cb2f8365342
    so Spicy can be build with a gcc13 development snapshot. We do not bump
    to the latest development snapshot since
    DaanDeMeyer/reproc@51540e1d1f7be2a82f9f4ae80c41232205b6b0ab changed the
    process ownership semantics which would require changes on our side; we
    will tackle that once upstream has committed to an API in a release.

    This patch does not add CI for gcc13 since it is not yet released.

1.8.0-dev.79 | 2023-04-07 09:31:18 +0200

  * Avoid some redundant location tracking code. (Robin Sommer, Corelight)

  * Emit Spicy globals as true C++ globals by default. (Robin Sommer, Corelight)

    This improves runtime performance. We retain the original approach
    through an option: `--cxx-enable-dynamic-globals` now switches back to
    managing globals through dynamically allocated structs, with each
    runtime context creating separate instances.

  * Fix compiler warnings. (Robin Sommer, Corelight)

    These have started appearing with recent clangs:

    ```
    warning: variable 'yynerrs_' set but not used
    ```

  * Inline `stream::View::size()` and `stream::View::~View()`. (Robin Sommer, Corelight)

  * Move runtime location tracking to dedicated TLS variable. (Robin Sommer, Corelight)

  * Remove custom location tracking that some runtime types were using. (Robin Sommer, Corelight)

  * Apply more fiber tuning. (Robin Sommer, Corelight)

1.8.0-dev.70 | 2023-04-05 10:38:03 +0200

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

  * Preserve indention when extracting comments in doc generation. (Benjamin Bannier, Corelight)

1.8.0-dev.66 | 2023-04-03 14:28:14 +0200

  * Fix signed-unsigned comparison. (Benjamin Bannier, Corelight)

1.8.0-dev.64 | 2023-04-03 09:52:25 +0200

  * Document how to check whether an `optional` value is set. (Benjamin Bannier, Corelight)

  * Fix docs reference typo. (Benjamin Bannier, Corelight)

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.8.0-dev.59 | 2023-03-23 15:51:45 +0100

  * Install missing dependency for running with clang-15. (Benjamin Bannier, Corelight)

    Between clang-15.0.6 upstream broke out the runtime libraries needed for
    e.g., ASAN into a separate, optional package. Install it as well.

  * Remove unused CI setups for packages. (Benjamin Bannier, Corelight)

1.8.0-dev.56 | 2023-03-23 14:15:40 +0100

  * Fix potential double accounting for units in profiling output.
    (Robin Sommer, Corelight)

1.8.0-dev.54 | 2023-03-23 11:49:32 +0100

  * GH-1396: Fix regex performance regression introduced by constant
    folding. (Robin Sommer, Corelight)

  * Cache regular expressions to compile each only once. (Robin
    Sommer, Corelight)

1.8.0-dev.51 | 2023-03-23 11:09:17 +0100

  * GH-1399: Guard access to unit `_filters` member with feature flag. (Benjamin Bannier, Corelight)

    The unit `_filters` member is accessed by most low-level functions
    extracting data from the input, but its value is only interesting if a
    unit actually supports filters. We had previously annotated `_filters`
    with a requirement for filter support so any use of it with trigger
    enabling support. By guarding access with a feature flag we can detect
    such dependent uses in a subsequent patch.

  * Extend detection of conditionally used features in optimizer. (Benjamin Bannier, Corelight)

    We previously were only able to detect conditionally used features if
    the feature flag was an `if` condition. In order to support
    conditionally used features in expressions (as opposed to statements) we
    add support for detecting their use under a ternary operator with this
    patch.

  * Add support for folding ternary operator uses in optimizer. (Benjamin Bannier, Corelight)

1.8.0-dev.47 | 2023-03-23 10:21:35 +0100

  * Add runtime profiling infrastructure.  (Robin Sommer, Corelight)

    This add an option `-enable-profiling` to the HILTI and Spicy
    compilers. Use of the option does two things: (1) it sets a flag
    enabling inserting additional profiling instrumentation into
    generated C++ code, and (2) it enables using instrumentation for
    recording profiling information during execution of the compiled
    code, incl. dumping out a profiling report at the end. The
    profiling information collected includes time spent in HILTI
    functions as well as for parsing Spicy units and unit fields.

  * Fix parser generator to not store any parsed items for transient
    containers. (Robin Sommer, Corelight)

  * Disallow using `$$` with anonymous containers. (Robin Sommer, Corelight)

    Transient containers don't store their values, which means `$$`
    produces an always-empty container. Disallowing its use avoids simple
    mistakes.

  * Fiber tuning (Robin Sommer, Corelight)

    - Tune buffer memory management during stack switching.
    - Tune fibers' stack buffer management for less memory activity.
    - Track high-level water mark for stack size needed by fibers.

1.8.0-dev.30 | 2023-03-22 15:58:42 +0100

  * Update docs for changes in spicy-plugin. (Benjamin Bannier, Corelight)

1.8.0-dev.28 | 2023-03-10 11:22:48 +0100

  * Fix stringification of enum values. (Benjamin Bannier, Corelight)

    If an enum type or label used a C++ reserved identifier we would
    previously stringify to name normalized for use in C++. Since we are
    generating strings this is not needed and also confusing as stringified
    names deviate from what the user wrote in the input.

    With this patch we emit names which directly correspond to input
    Spicy/HILTI names and labels.

  * GH-1394: Fix C++ normalization of generated enum values. (Benjamin Bannier, Corelight)

    Closes #1394.

1.8.0-dev.25 | 2023-03-08 16:27:27 +0100

  * Fix typo in types documentation (tbfhg)

1.8.0-dev.23 | 2023-03-08 11:38:16 +0100

  * Only run lint CI task from scheduled builds or PRs. (Benjamin Bannier, Corelight)

1.8.0-dev.21 | 2023-03-07 09:44:38 +0100

  * Avoid expensive checked iterator for internal `Bytes` iteration. (Benjamin Bannier, Corelight)

    We previously would go through a checked iterator to iterate a `Bytes`
    instance. Since none of the iterators were user-provided this was always
    safe, but incurred the performance overhead for checking.

    With this patch we iterate the underlying bytes directly.

  * GH-1390: Initialize `Bytes` internal control block for all constructors. (Benjamin Bannier, Corelight)

    `Bytes` inherits constructors from its base class. We previously would
    not initialize the internal control block for these constructors so some
    operations involving iterators on such `Bytes` instances would have
    failed, even thought the controlled object was still valid.

    With this patch we always set up the control block, no matter which
    constructor is used.

    Closes #1390.

1.8.0-dev.18 | 2023-03-07 09:43:59 +0100

  * Do not force locale on users of libhilti. (Benjamin Bannier, Corelight)

    Setting a locale from a library can interfere negatively with the rest
    of the application. We previously would set a locale inside
    `hilti::rt::init`, but we probably do not need it at all.

1.8.0-dev.16 | 2023-03-06 16:24:55 +0100

  * Cache HILTI C++ compilations with ccache in CI. (Benjamin Bannier, Corelight)

1.8.0-dev.14 | 2023-03-06 16:24:20 +0100

  * GH-1386: Prevent internal error when passed invalid context. (Benjamin Bannier, Corelight)

    We previously would trigger an internal error when encountering
    `self.context()` in a unit which declared a `%context` to something
    which was not a type. With this patch we now reject such calls.

    We picked a simplified implementation strategy: when querying a `Unit`'s
    `contextType` we still return an optional type to handle both units
    without context as well as units where %context does not point to a
    type; if a context is present but does not refer to a type we return an
    empty result. With that we potentially trigger two errors, from
    validating that `%context` refers to a type, and from validating that
    the unit had a `%context` when using `self.context()`, i.e., if the
    `%context` is invalid we continue parsing as if the unit had no
    `%context` at all. The alternative would have been to return e.g., a
    `Result<optional_ref<Type>>` from `contextType` to capture both the
    unset as well as invalid case and move some of the validation into
    `contextType` itself; this still would have led to a lot of manual
    unwrapping in users.

    Closes #1386.

1.8.0-dev.12 | 2023-02-24 17:13:42 +0100

  * Fix potential use-after-move bug. (Benjamin Bannier, Corelight)

1.8.0-dev.10 | 2023-02-22 15:42:04 +0100

  * Switch `SafeInt` to current upstream. (Robin Sommer, Corelight)

1.8.0-dev.8 | 2023-02-22 11:16:08 +0100

  * Set reupload_on_changes for ccache caches. (Arne Welzel, Corelight)

  * Build centos stream again for PRs, disable clang-12 debug. (Benjamin Bannier, Corelight)

1.8.0-dev.5 | 2023-02-20 14:31:21 +0100

  * Fix sign-unsigned comparison. (Benjamin Bannier, Corelight)

  * GH-169: Build debian-11 instead of centos stream 8 in CI. (Benjamin Bannier, Corelight)

  * Update docs for removal of fedora-35, addition of fedora-36. [skip CI] (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.8 to NEWS. (Benjamin Bannier, Corelight)

1.7.0 | 2023-02-13 17:41:31 +0100

  * Release 1.7.0.

1.7.0-dev.124 | 2023-02-13 17:41:08 +0100

  * Revert "Make all CI tasks greedy." (Benjamin Bannier, Corelight)

    This reverts commit 3176c2cadc71aaf4c0c3dd28d37c1d465323da8c.

  * Revert "Decrease excessive RAM on some CI platforms." (Benjamin Bannier, Corelight)

    This reverts commit 6ce665b9f3dc7f3630167e1bdf3f752ce3647dcf.

1.7.0-dev.121 | 2023-02-13 14:47:21 +0100

  * GH-1310: Fix ASAN false positive with GCC. (Robin Sommer, Corelight)

  * Skip clang-specific ASAN flags with other compilers. (Robin Sommer, Corelight)

  * Don't instantiate a debug logger if we aren't going to debug log. (Robin Sommer, Corelight)

  * Simplify runtime library's extract methods. (Robin Sommer, Corelight)

  * Shortcut some stream offset computations. (Robin Sommer, Corelight)

  * GH-1345: Apply alternative fix for #1345. (Robin Sommer, Corelight)

1.7.0-dev.112 | 2023-02-09 11:03:09 +0100

  * Make `printParserState` cheaper to call if debug logging is disabled. (Benjamin Bannier, Corelight)

1.7.0-dev.110 | 2023-02-03 15:57:39 +0100

  * https://github.com/zeek/spicy-plugin/issues/134: Search
    `HILTI_CXX_INCLUDE_DIRS` paths before default include paths.
    (Robin Sommer, Corelight)

  * Support Zeek-style documentation strings in Spicy source code. (Robin Sommer, Corelight)

    This adds support for extracting and retaining Zeek-style
    documentation strings (`##`, `##!`) inside Spicy source code to any
    top-level AST nodes where it's appropriate: if they are prefixed with
    a block of such comments, that information is retained along with the
    node for later access.

    The code printer (`-p`) learns to emit doc strings coming with the
    nodes it's printing out.

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.7.0-dev.105 | 2023-02-01 11:17:25 +0100

  * Documentation updates. (Robin Sommer, Corelight)

        - Documenting the new type `export` feature for Zeek.
        - Update Zeek docs for JIT removal and `accept_input`/`decline_input`.

1.7.0-dev.102 | 2023-01-31 14:02:45 +0100

  * GH-1367: Use unique filename for all object files generated during JIT. (Benjamin Bannier, Corelight)

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

  * Point doc repo links to latest release instead of `main`. (Benjamin Bannier, Corelight)

  * Fix installation links for macos platforms. (Benjamin Bannier, Corelight)

  * Bump latest release in docs. (Benjamin Bannier, Corelight)

1.7.0-dev.95 | 2023-01-27 12:00:41 +0100

  * Streamline runtime exception hierarchy. (Robin Sommer, Corelight)

    We were inconsistent in the structure of exceptions that could
    happen during runtime, making it hard for host applications for
    consistently handle trouble. We tweak this, as follows:

        - We now only have two general subcategories of exceptions under the
          top-level `hilti::rt::Exception`:

            - `RuntimeError`: non-fatal errors that mean a host
              applications cannot complete the current line of processing,
              but can otherwise continue. This is the main exception that
              host applications should catch, and then proceed
              appropriately.

            - `UsageError`: fatal errors that indicate something about
              using the runtime environment was fundamentally wrong, and a
              host application should abort.

        - Almost all other exceptions are now derived from `RuntimeError`,
          including Spicy's `ParseError` and `RecoverableFailure`, so that
          they can treated consistently.

1.7.0-dev.93 | 2023-01-27 11:57:58 +0100

  * Search user module paths before system paths. (Robin Sommer, Corelight)

    With, e.g., `spicyz -L /x/y/z`, we used to append the given module
    path to the internal system paths, so that it was searched last. This
    change turns around the priority to search `/x/y/x` first, before the
    internal ones. That seems both more useful and more intuitive.

  * Provide ability for host applications to initiate runtime's
    module-pre-init phase manually. (Robin Sommer, Corelight)

1.7.0-dev.89 | 2023-01-27 11:44:31 +0100

  * Add DPD-style `spicy::accept_input()` and `spicy::decline_input()`. (Robin Sommer, Corelight)

    This generalizes the accepting/decline input from being a Zeek thing to
    being part of Spicy. Any Spicy grammar can call these functions as to
    tell its host application if it recognizes the input format. The host
    application can (but doesn't have to) install callbacks to receive
    that information and react appropriately. For example, the Zeek
    plugin will just forward it to Zeek's standard DPD hooks.

    For testing, `spicy-driver` gets a new option `--require-accept`
    that lets it exit with success only if `spicy::accept()` has
    been called, and  `spicy::decline_input()` hasn't.

    Note: The naming of the two functions is avoid conflicts with the
    existing notion of synchronization's confirm/reject.

  * Add a global configuration object to the Spicy runtime. (Robin Sommer, Corelight)

    We didn't have a mechanism yet for a host application to configure the
    runtime library's behavior. This follows what we do on the HILTI-side
    to provide that capability.

1.7.0-dev.86 | 2023-01-27 11:35:35 +0100

  * Add driver option to output full set of generated C++ files. (Robin Sommer, Corelight)

    `-x <prefix>` now writes out all generated C++ code as
    `<prefix>_*.cc`, also setting the internal C++ namespace prefix to
    `<prefix>`.

  * Add test for sink's paying attention to linker scopes with static C++ code. (Robin Sommer, Corelight)

  * Make test helper scripts `cxx-*` usable with Spicy code as well. (Robin Sommer, Corelight)

  * Provide new HILTI keyword `$scope` to access linker scope. (Robin Sommer, Corelight)

  * Prefix the linker scope with the internal CXX namespace. (Robin Sommer, Corelight)

  * Fix a couple of places hardcoding the internal C++ namespace prefix. (Robin Sommer, Corelight)

  * Prefix the linker symbols for versioning with C++ namespace. (Robin Sommer, Corelight)

1.7.0-dev.78 | 2023-01-27 11:16:01 +0100

  * GH-1123: Support arbitrary expression as argument to type
    constructors, such as `interval(...)`. (Robin Sommer, Corelight)

    So far we used constructor expressions like `interval(...)` to create
    *constants* of the given type, and for that we required that the
    argument was a single atomic value. The result was that these
    constructor expressions were really more like literals for the
    corresponding types than "normal" expressions. While that's useful
    internally, it's confusing to the user. This commits changes that
    to support arbitrary expressions as arguments.

    To make this change without losing a way to create actual constants
    (which we need at some places), we implement this in two stages: the
    parser initially turns such `interval(...)` expressions into call
    operators[1] that the types now define for each desired constructor. We
    then extend the normalizer with a new constants folding pass that
    turns the call expressions into constants if possible.

    The new constant folder remains limited to the cases we need for
    this use case, but we'll be able to expand that later to  more
    general folding.

  * Fix bug in cast from `real` to `interval`. (Robin Sommer, Corelight)

  * Add anchors to FAQ items in docs [skip CI]. (Benjamin Bannier, Corelight)

1.7.0-dev.53 | 2023-01-25 09:39:02 +0100

  * Add stringification to UnitContext. (Benjamin Bannier, Corelight)

1.7.0-dev.51 | 2023-01-25 09:36:56 +0100

  * Remove potential race during JIT when using `HILTI_CXX_COMPILER_LAUNCHER`. (Benjamin Bannier, Corelight)

1.7.0-dev.49 | 2023-01-20 10:41:46 +0100

  * GH-1349: Fix incremental regexp matching for potentially empty results. (Robin Sommer, Corelight)

    When feeding data incrementally into the regexp matcher, we could run
    into an assert trying to ensure that the end of a match wasn't in the
    previous chunk already. Turns out, however, that *is* possible with
    empty matches that are determined only later (and maybe it's possible
    in other cases, too). To fix this, we need to account for potentially
    backtracking into data from a previous round. This could be a bit
    surprising to callers of the `advance()` method, but should
    work as long as they aren't trimming the stream in between (which in
    our use cases shouldn't be the case).

    Closes #1349.

  * Install full nlohmann JSON header as well. (Benjamin Bannier, Corelight)

    We previously would only install the nlohmann header with forward
    declaration while in `hilti/rt/json.h` we include the full header. With
    that it was impossible to include this header in user code.

    This patch makes sure we install the full header as well.

1.7.0-dev.45 | 2023-01-19 09:46:14 +0100

  * Remove dead code. (Benjamin Bannier, Corelight)

  * Remove performance pessimization introduced in `84fb4f21f494`. (Benjamin Bannier, Corelight)

    When exposing this function directly we made the argument always
    evaluate. This now causes us to compute strings for logging even if they
    are never emitted.

    Undo this change as it is actually not needed for the cleanup it was
    initially intended for.

  * GH-1345: Fix pathological performance for `_haveEod` on highly chunked streams. (Benjamin Bannier, Corelight)

    This function was identified as a performance bottleneck when parsing
    `bytes` with a huge size from a stream with many chunks. The reason it
    performed so poorly was due to its use of `unsafeEnd`: since `unsafeEnd`
    creates an unsafe iterator from `end()` it always needs to compute the
    chunk the safe iterator pointed to; if the stream contains many chunks
    this causes the seen poor performance.

    Since we only access `offset` use safe iterators instead. This makes it
    much cheaper to call this function so we can safely use it during
    parsing.

    Since this change only affects performance we do not add a test case.
    For a benchmark see #1345.

    Closes #1345.

  * Remove EOL fedora-35, add fedora-37. (Benjamin Bannier, Corelight)

  * Bump Zeek version in zeek-plugin CI job. (Benjamin Bannier, Corelight)

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.7.0-dev.37 | 2023-01-09 16:10:40 +0100

  * Decrease excessive RAM on some CI platforms. (Benjamin Bannier, Corelight)

  * Make all CI tasks greedy. (Benjamin Bannier, Corelight)

  * Rerun BTest up to three times in CI. (Benjamin Bannier, Corelight)

1.7.0-dev.33 | 2023-01-05 17:33:00 +0100

  * Update repo to not publish Docker images anymore. (Benjamin Bannier, Corelight)

1.7.0-dev.31 | 2023-01-05 15:38:13 +0100

  * GH-1326: Generate proper runtime types for enums. (Benjamin Bannier, Corelight)

  * Allow default for `vector::Allocator` with some non-class types. (Benjamin Bannier, Corelight)

  * Remove unused define. (Benjamin Bannier, Corelight)

1.7.0-dev.25 | 2023-01-04 10:26:33 +0100

  * GH-1330: Reject uses of imported module IDs as expression. (Benjamin Bannier, Corelight)

  * Fix test `Backtrace.comparison` for aggressive constant folding. (Benjamin Bannier, Corelight)

1.7.0-dev.22 | 2022-12-14 13:25:57 +0100

  * Push container images to Docker Hub zeek org, too. (Arne Welzel, Corelight)

1.7.0-dev.20 | 2022-12-14 13:24:47 +0100

  * Bump Cirrus macos CI. (Benjamin Bannier, Corelight)

  * Fix test `Backtrace.comparison` for aggressive constant folding. (Benjamin Bannier, Corelight)

  * Remove workaround for outdated Homebrew db on Cirrus CI. (Benjamin Bannier, Corelight)

1.7.0-dev.16 | 2022-12-14 10:29:59 +0100

  * Audit previously disabled clang-tidy-15 checks. (Benjamin Bannier, Corelight)

1.7.0-dev.4 | 2022-12-13 10:56:35 +0100

  * Fix docs for enum using semicolon instead of comma. (Arne Welzel, Corelight)

1.7.0-dev.2 | 2022-12-13 10:43:41 +0100

  * GH-1322: Bring implementation of `Sink::write` in line with declaration. (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.7 to NEWS. (Benjamin Bannier, Corelight)

1.6.0 | 2022-12-12 12:38:01 +0100

  * Release 1.6.0. (Benjamin Bannier, Corelight)

1.6.0-dev.147 | 2022-12-12 09:40:49 +0100

  * GH-1319: Add validation rejecting unsupported attributes on unit variables. (Benjamin Bannier, Corelight)

1.6.0-dev.145 | 2022-12-12 09:14:22 +0100

  * doc/zeek: zkg template changed and mention packet analyzers (Arne
    Welzel, Corelight)

1.6.0-dev.143 | 2022-12-12 09:02:59 +0100

  * GH-1298: Fix/clarify bitfield docs. (Robin Sommer, Corelight)

1.6.0-dev.141 | 2022-12-12 08:56:24 +0100

  * Expose new `pack`/`unpack` operators in Spicy. These provide
    low-level primitives for transforming a value into, or out of, a
    binary representations. See
    https://docs.zeek.org/projects/spicy/en/latest/programming/language/packing.html
    for more. Internally, `unpack` already existed; `pack` is new.
    (Robin Sommer, Corelight)

  * Update clang-tidy config for clang-15. (Benjamin Bannier, Corelight)

  * Use clang-15 for lint CI job. (Benjamin Bannier, Corelight)

1.6.0-dev.133 | 2022-12-07 08:44:38 +0100

  * Improve efficiency of `startsWith` for long inputs. (Benjamin Bannier, Corelight)

1.6.0-dev.131 | 2022-12-06 10:37:30 +0100

  * Drop redundant leading `::` for C++ entities in script land. (Benjamin Bannier, Corelight)

  * GH-1285: Remove implemented TODO in docs. (Benjamin Bannier, Corelight)

  * Normalize names used in `__library_type`. (Benjamin Bannier, Corelight)

  * Normalize any type `cxxID` set through C++ API. (Benjamin Bannier, Corelight)

  * Normalize `&cxxname` values to be fully qualified. (Benjamin Bannier, Corelight)

  * Expose function instead of macro for `hilti::debug`. (Benjamin Bannier, Corelight)

  * Fix duplicate prefixing of `::` for prototypes generated for `&cxxname`. (Benjamin Bannier, Corelight)

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

1.6.0-dev.122 | 2022-12-05 09:31:26 +0100

  * GH-1311: Validate that unit using `self.context()` declares `%context`. (Benjamin Bannier, Corelight)

1.6.0-dev.120 | 2022-12-05 09:30:26 +0100

  * Explicitly type integer to boolean cast. (Benjamin Bannier, Corelight)

1.6.0-dev.118 | 2022-12-02 12:20:30 +0100

  * cmake/FindGoldLinker: Do not use gold by default (Arne Welzel, Corelight)

  * cmake/FindGoldLinker: Put -fuse-ld=gold before existing flags (Arne Welzel, Corelight)

1.6.0-dev.115 | 2022-12-01 13:59:34 +0100

  * GH-1303: Fix incorrect offset computation in `advanceToNextData`. (Benjamin Bannier, Corelight)

1.6.0-dev.113 | 2022-11-18 11:48:35 +0100

  * GH-1294: Add library function to parse an address from string or bytes. (Robin Sommer, Corelight)

        ## Parses an address from a string. The address can be in standard IPv4 or IPv6
        ## ASCII representation. The function raises ``InvalidArgument`` if the string
        ## could not be parsed.
        public function parse_address(s: string) : addr;

        ## Parses an address from a bytes instance. The address can be in standard IPv4
        ## or IPv6 ASCII representation. The function raises ``InvalidArgument`` if the
        ## string could not be parsed.
        public function parse_address(b: bytes) : addr;

  * Support overloaded functions in documentation. (Robin Sommer, Corelight)

1.6.0-dev.110 | 2022-11-16 09:43:26 +0100

  * GH-1299: Add validator for bitfield field ranges. (Benjamin Bannier, Corelight)

  * Bump doctest to 2.4.9. (Benjamin Bannier, Corelight)

1.6.0-dev.107 | 2022-11-14 09:19:03 +0100

  * Post synchronization-related debug messages in `spicy-verbose` stream. (Benjamin Bannier, Corelight)

  * Log successful synchronization. (Benjamin Bannier, Corelight)

1.6.0-dev.104 | 2022-11-07 09:54:12 +0100

  * Quote CMake string to ensure correct argument count. (Nic Boet)

  * Fix Zeek docs build for case-sensitive filesystems. (Benjamin Bannier, Corelight)

1.6.0-dev.101 | 2022-10-27 12:59:41 +0200

  * Fix fuzzer build for recently renamed spicy-tftp files. (Benjamin Bannier, Corelight)

  * Make it possible to parameterize location of fuzzer lib. (Benjamin Bannier, Corelight)

  * Update docs for changes in spicy-plugin and spicy-tftp. (Benjamin Bannier, Corelight)

1.6.0-dev.97 | 2022-10-27 08:47:59 +0200

  * Downgrade required Flex version. (Johanna Amann, Corelight)

1.6.0-dev.95 | 2022-10-27 08:47:30 +0200

  * GH-1273: Replace `Lambda` class. (Benjamin Bannier, Corelight)

1.6.0-dev.93 | 2022-10-27 08:46:22 +0200

  * Show btest progress in CI. (Benjamin Bannier, Corelight)

  * Remove configuration from JIT hash. (Benjamin Bannier, Corelight)

1.6.0-dev.90 | 2022-10-26 14:57:02 +0200

  * Remove `hilti::rt::isDebugVersion()`. (Robin Sommer, Corelight)

  * Remove `--optimize` flag. This was already a no-op, and just
    confusing/misleading. (Robin Sommer, Corelight)

  * Tie HLTOs files to the Spicy version that generated them. They
    will now fail at load time if the current Spicy version doesn't
    match what they were built with. (Robin Sommer, Corelight)

  * Embed a C function into `hilti-rt` that encodes our version into
    its name. If a host applications links against this, it will fail
    to load if the runtime version changes without a rebuild. (Robin
    Sommer, Corelight)

1.6.0-dev.81 | 2022-10-26 12:32:26 +0200

  * Documentation updates. (Robin Sommer, Corelight)

    - Document how to pull custom C++ code into Spicy.
    - Adapt Zeek instructions for zkg template updates.
    - Documentation updates for recent Zeek integration changes.

1.6.0-dev.71 | 2022-10-20 18:40:36 +0200

  * Bump justrx. (Robin Sommer, Corelight)

1.6.0-dev.68 | 2022-10-05 08:50:05 +0200

  * GH-1266: Fix wrong type for Spicy-side `self` expression. (Robin
    Sommer, Corelight)

  * GH-1261: Fix inability to access unit fields through `self` in
    `&convert` expressions. (Robin Sommer, Corelight)

  * GH-1267: Install only needed SafeInt header. (Benjamin Bannier,
    Corelight)

  * Disallow `self` as ID in declarations. (Robin Sommer, Corelight)

  * Fix accidental lookup of empty IDs. (Robin Sommer, Corelight)

  * Add helper script to diff two AST. (Robin Sommer, Corelight)

  * Documentation updates.  (Benjamin Bannier, Corelight)
    - Update doc link to commits mailing list.
    - Update version referenced in docs.
    - Add doc link to releases packages for centos8-stream.

1.6.0-dev.55 | 2022-09-27 13:22:08 +0200

  * GH-1267: Install only needed SafeInt header. (Benjamin Bannier, Corelight)

1.6.0-dev.53 | 2022-09-07 16:21:02 +0200

  * Clarify that `%context` can only be used in top-level units. (Robin Sommer, Corelight)

1.6.0-dev.50 | 2022-08-22 16:33:10 +0200

  * GH-1249: Allow combining `&eod` with `&until` or `&until-including`. (Benjamin Bannier, Corelight)

1.6.0-dev.48 | 2022-08-18 16:30:14 +0200

  * GH-1251: When decoding bytes into a string using a given character
    set, allow caller to control error handling. (Robin Sommer,
    Corelight)

    All methods taking a charset parameters now take an additional
    enum selecting 1 of 3 possible error handling strategies in case a
    character can't be decoded/represented: `STRICT` throws an error,
    `IGNORE` skips the problematic character and proceeds with the
    next, and `REPLACE` replaces the problematic character with a safe
    substitute. `REPLACE` is the default everywhere now, so that by
    default no errors are triggered.

    This comes with an additional functional change for the ASCII
    encoding: we now consistently sanitize characters that ASCII can't
    represent when in `REPLACE`/`IGNORE` modes (and, hence, by
    default), and trigger errors in `STRICT` mode. Previously, we'd
    sometimes let them through, and never triggered any errors. This
    also fixes a bug with the ASCII encoding sometimes turning a
    non-printable character into multiple repeated substitutes.

  * GH-1170: Fix contexts not allowing being passed `inout`. (Robin
    Sommer, Corelight)

  * GH-1143, GH-1220: Add coercion on assignment for optionals that
    only differ in constness of their inner types. (Robin Sommer,
    Corelight)

  * GH-1115, GH-1196: Explicitly type temporary value used by
    `&max_size` logic. (Robin Sommer, Corelight)

  * GH-1250: Fix internal errors when seeing unsupported character
    classes in regular expression. (Robin Sommer, Corelight)

  * GH-1234, GH-1238: Fix assertions with anonymous struct
    constructor. (Robin Sommer, Corelight)

  * GH-1233: Reject key types for maps that can't be sorted. (Robin
    Sommer, Corelight)

  * GH-1230: Add coercion to default argument of `map::get`. (Robin
    Sommer, Corelight)

  * GH-1248: Fix `stop` for unbounded loop. (Robin Sommer, Corelight)

1.6.0-dev.28 | 2022-07-27 08:43:04 +0200

  * Fix build with empty CMAKE_CXX_FLAGS_{DEBUG,RELEASE}. (Fabrice Fontaine)

1.6.0-dev.26 | 2022-07-26 11:15:20 +0200

  * Fix validator for field `&default` expression types for constness. (Benjamin Bannier, Corelight)

1.6.0-dev.24 | 2022-07-26 11:14:06 +0200

  * Merge branch 'topic/bbannier/doc-fixes' (Benjamin Bannier, Corelight)

  * Clarify that `&until` consumes the delimiter. (Benjamin Bannier, Corelight)

  * Add FAQ item on source locations. (Benjamin Bannier, Corelight)

  * Add example for use of `?.`. (Benjamin Bannier, Corelight)

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.6.0-dev.19 | 2022-07-12 10:46:48 +0200

  * GH-1236: Add support for adding link dependencies via `--cxx-link`. (Benjamin Bannier, Corelight)

1.6.0-dev.17 | 2022-07-08 12:12:02 +0200

  * GH-1227: Fix code generation when a module's file could be imported through different means. (Robin Sommer, Corelight)

1.6.0-dev.15 | 2022-07-07 12:11:55 +0200

  * GH-1231: Add special handling for potential `advance` failure in trial mode. (Benjamin Bannier, Corelight)

  * Expose type `MissingData` in HILTI. (Benjamin Bannier, Corelight)

  * GH-1231: Add failing test for #1231. (Benjamin Bannier, Corelight)

  * Use default compiler on FreeBSD. (Benjamin Bannier, Corelight)

  * Update CI to freebsd-13.1. (Benjamin Bannier, Corelight)

1.6.0-dev.8 | 2022-07-06 11:40:25 +0200

  * GH-1240: Clarify docs on `SPICY_VERSION`. (Benjamin Bannier, Corelight)

1.6.0-dev.6 | 2022-07-05 14:22:35 +0200

  * Add C keywords up to C23 to identifier sanitizer list. (Benjamin Bannier, Corelight)

  * Add C++ keywords up to C++20 to identifier sanitizer list. (Benjamin Bannier, Corelight)

  * Sort list of C++ keywords to sanitize. (Benjamin Bannier, Corelight)

  * Fix doc check for renames in spicy-tftp. (Benjamin Bannier, Corelight)

  * Update doc links for latest releases. (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.6 to NEWS. (Benjamin Bannier, Corelight)

1.5.0 | 2022-06-30 12:15:14 +0200

  * Release 1.5.0 (Benjamin Bannier, Corelight)

  * Explicitly request content write permission for create-release action. (Benjamin Bannier, Corelight)

  * Update NEWS file. (Benjamin Bannier, Corelight)

1.5.0-dev.131 | 2022-06-30 10:15:01 +0200

  * Extending content on zkg template. (Robin Sommer, Corelight)

1.5.0-dev.129 | 2022-06-28 12:08:25 +0200

  * GH-1224: Fix import segfault. (Robin Sommer, Corelight)

1.5.0-dev.127 | 2022-06-27 14:35:05 +0200

  * Bump doc links to 1.4.1. (Benjamin Bannier, Corelight)

  * Fix links to Fedora artifacts for releases. (Benjamin Bannier, Corelight)

  * GH-1205: Update Spicy docs for now being built into Zeek. (Benjamin Bannier, Corelight)

1.5.0-dev.123 | 2022-06-21 13:32:59 +0200

  * GH-1217: Produce `hilti::rt::Bool` when casting to boolean. (Benjamin Bannier, Corelight)

1.5.0-dev.121 | 2022-06-20 14:39:05 +0200

  * GH-1209: Provide error message to `%error` handler. (Robin Sommer, Corelight)

    We now allow to optionally provide a string parameter with
    `%error` that will receive the associated error message:

        on %error(msg: string) { print msg; }

  * GH-1206: Fix detection of recursive dependencies. (Robin Sommer, Corelight)

  * Fix internal error with not fully resolved IDs. (Robin Sommer, Corelight)

1.5.0-dev.116 | 2022-06-17 11:01:21 +0200

  * Avoid recomputing signatures. (Benjamin Bannier, Corelight)

  * Avoid computing format string if debug stream not enabled. (Benjamin Bannier, Corelight)

  * Use `unordered_set` to cache resolved types. (Benjamin Bannier, Corelight)

  * Reorder instructions to avoid performing unneeded work. (Benjamin Bannier, Corelight)

  * Avoid recomputing same information when resolving expressions. (Benjamin Bannier, Corelight)

  * Prevent excessive copies. (Benjamin Bannier, Corelight)

  * Small optimizations in `matchOverloads`. (Benjamin Bannier, Corelight)

  * Remove excessive copying in `Operator::operands`. (Benjamin Bannier, Corelight)

1.5.0-dev.107 | 2022-06-17 08:43:12 +0200

  * GH-1210: Prevent unnecessarily executable stack with GNU toolchain. (Benjamin Bannier, Corelight)

1.5.0-dev.105 | 2022-06-15 12:11:01 +0200

  * Drop support for end-of-life Fedora 33/34, add support for Fedora 35/36. (Benjamin Bannier, Corelight)

  * GH-1204: Remove potential use-after-move. (Benjamin Bannier, Corelight)

1.5.0-dev.102 | 2022-06-09 15:31:22 +0200

  * Allow changing `DESTDIR` between configure and install time. (Benjamin Bannier, Corelight)

  * GH-1183: Update docs for Discourse migration. (Benjamin Bannier, Corelight)

1.5.0-dev.99 | 2022-06-08 16:37:08 +0200

  * GH-1201: Adjust removal of symlinks on install for `DESTDIR`. (Benjamin Bannier, Corelight)

1.5.0-dev.97 | 2022-06-08 16:33:24 +0200

  * Disable building of benchmark target by default. (Benjamin Bannier, Corelight)

1.5.0-dev.95 | 2022-06-08 12:22:01 +0200

  * Prevent too early integer overflow in `pow`. (Benjamin Bannier, Corelight)

  * Make handling of sanitizer workarounds more granular. (Benjamin Bannier, Corelight)

1.5.0-dev.92 | 2022-06-07 11:53:18 +0200

  * GH-44: Update docs for spicy-plugin rename `_Zeek::Spicy` -> `Zeek::Spicy`. (Benjamin Bannier, Corelight)

1.5.0-dev.90 | 2022-06-03 13:11:14 +0200

  * GH-1187: Fix support for having multiple source modules of the
    same name. (Robin Sommer, Corelight)

    There was an underlying assumption in much of the code that a module
    name would be globally unique, meaning it could be used as index into
    maps and as seeds for C++ identifiers. However, while that's often the
    case, the `import ... from ...` syntax allow pulling in multiple
    modules all having the same name.
    This change fixes that to track a module's "scope" (i.e., the part
    after `from ...`) more thoroughly across various pieces..

  * Fix test that could break because of file name clash. (Robin
    Sommer, Corelight)

  * Fix concatenation of IDs. (Robin Sommer, Corelight)

  * Fix error message. (Robin Sommer, Corelight)

  * Fix for HILTI printing of `import` statements. (Robin Sommer, Corelight)

  * Dump ASTs with ``--dump-code`` as well. (Robin Sommer, Corelight)

1.5.0-dev.83 | 2022-06-02 09:43:07 +0200

  * Bump 3rdparty/pathfind to latest snapshot. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/filesystem to 1.5.12. (Benjamin Bannier, Corelight)

  * Switch to vendored nlohmann/json. (Benjamin Bannier, Corelight)

  * Bump Zeek docs. (Benjamin Bannier, Corelight)

1.5.0-dev.78 | 2022-05-31 15:08:20 +0200

  * Stop interning Locations. (Benjamin Bannier, Corelight)

  * Avoid recomputing already known canonical ID. (Benjamin Bannier, Corelight)

  * Simplify creating of refs when building scope. (Benjamin Bannier, Corelight)

  * Speed up building of scopes. (Benjamin Bannier, Corelight)

1.5.0-dev.73 | 2022-05-31 15:07:35 +0200

  * GH-1073: Switch to ECR images in documentation. (Benjamin Bannier, Corelight)

1.5.0-dev.71 | 2022-05-30 10:24:58 +0200

  * GH-1050: Update location when entering most parser methods. (Benjamin Bannier, Corelight)

  * Add builder method to set a new location. (Benjamin Bannier, Corelight)

1.5.0-dev.68 | 2022-05-30 10:03:28 +0200

  * Suppress GCC warning about maybe uninitialized variable. (Benjamin Bannier, Corelight)

1.5.0-dev.66 | 2022-05-25 14:31:13 +0200

  * GH-1174: Do not artificially suppress uses of `(u)int8` in some cases. (Benjamin Bannier, Corelight)

1.5.0-dev.64 | 2022-05-25 14:30:37 +0200

  * GH-1190: Replace uses of deprecated `result_of` with `invoke_result`. (Benjamin Bannier, Corelight)

1.5.0-dev.62 | 2022-05-25 09:21:15 +0200

  * Bump justrx. (Benjamin Bannier, Corelight)

  * Do not build fiber benchmark target by default. (Benjamin Bannier, Corelight)

  * Suppress GCC FP warnings around freeing of non-heap objects. (Benjamin Bannier, Corelight)

  * Work around GCC incorrect state tracking involving std::optional<T*>` (Benjamin Bannier, Corelight)

1.5.0-dev.57 | 2022-05-18 14:16:12 +0200

  * Use `rt::hashCombine` instead of handwritten hash combine. (Benjamin Bannier, Corelight)

  * Drop contents of included codes from JIT state hash. (Benjamin Bannier, Corelight)

1.5.0-dev.54 | 2022-05-17 13:05:48 +0200

  * GH-1179: Cap parallelism use for JIT background jobs. (Benjamin Bannier, Corelight)

  * Move JIT background jobs to its own class. (Benjamin Bannier, Corelight)

1.5.0-dev.51 | 2022-05-16 16:37:15 +0200

  * Avoid truncation when performing int64 range check. (Benjamin Bannier, Corelight)

1.5.0-dev.49 | 2022-05-16 16:27:50 +0200

  * Fix signed/unsigned comparison warnings flagged by GCC. (Benjamin Bannier, Corelight)

  * Remove unused variables. (Benjamin Bannier, Corelight)

  * Fix linking of runtime test executables. (Benjamin Bannier, Corelight)

  * Only check whether Zeek docs are up-to-date from cron builds. (Benjamin Bannier, Corelight)

1.5.0-dev.44 | 2022-05-10 09:01:16 +0200

  * Minor edits to the Zeek Integration section (Christian Kreibich, Corelight)

1.5.0-dev.42 | 2022-05-06 11:43:58 +0200

  * GH-1171: Remove freebsd11, add freebsd13. (Benjamin Bannier, Corelight)

1.5.0-dev.40 | 2022-05-04 14:25:52 +0200

  * Enable building on armv7. (Benjamin Bannier, Corelight)

  * Remove test assumption on whether `char` is signed. (Benjamin Bannier, Corelight)

1.5.0-dev.37 | 2022-05-03 15:54:47 +0200

  * Add binary packaging mode. (Benjamin Bannier, Corelight)

1.5.0-dev.35 | 2022-04-26 11:28:26 +0200

  * GH-1114: Update test comments to reflect actual behavior. (Benjamin Bannier, Corelight)

1.5.0-dev.33 | 2022-04-21 16:35:04 +0200

  * GH-1164: Make compiler plugin initialization explicit. (Benjamin Bannier, Corelight)

  * Refresh package docs with `doc/scripts/autogen-zeek-docs`. (Benjamin Bannier, Corelight)

1.5.0-dev.30 | 2022-04-21 09:10:11 +0200

  * Bump pre-commit hooks. (Benjamin Bannier, Corelight)

  * Add fuzzing related files. (Benjamin Bannier, Corelight)

  * Refresh package docs with `doc/scripts/autogen-zeek-docs`. (Benjamin Bannier, Corelight)

1.5.0-dev.26 | 2022-04-14 07:53:47 +0200

  * Fix warnings from LGTM. (Benjamin Bannier, Corelight)

  * Bump LLVM in LGTM config. (Benjamin Bannier, Corelight)

  * Allow building with gcc-8.3. (Benjamin Bannier, Corelight)

1.5.0-dev.22 | 2022-04-13 12:18:43 +0200

  * Disable tests of lossy (u)int64_t-double conversion on 32bit. (honk)

  * Adjust signature in test. (Benjamin Bannier, Corelight)

  * Fix `chars_to_uint64` for 32bit platforms. (honk)

  * Simplify implementation of `ast::ctor::SignedInteger`. (Benjamin Bannier, Corelight)

  * Allow building on 32bit platforms. (Benjamin Bannier, Corelight)

1.5.0-dev.16 | 2022-04-12 11:03:38 +0200

  * GH-1142: Fix clang-tidy `HeaderFilterRegex`. (Benjamin Bannier, Corelight)

1.5.0-dev.14 | 2022-04-11 11:34:39 +0200

  * Fix incorrect exception for parse errors. (Benjamin Bannier, Corelight)

1.5.0-dev.12 | 2022-04-07 11:44:43 +0200

  * GH-1134: Add support for synchronize-at and synchronize-after properties. (Benjamin Bannier, Corelight)

1.5.0-dev.10 | 2022-04-07 11:44:04 +0200

  * GH-1080: Reject constant declarations at non-global scope. (Benjamin Bannier, Corelight)

  * Fix test for `Map::value_type` stringification. (Benjamin Bannier, Corelight)

1.5.0-dev.7 | 2022-03-30 15:28:35 +0200

  * GH-1154: Add stringificaton of `Map::value_type`. (Benjamin Bannier, Corelight)

1.5.0-dev.5 | 2022-03-22 14:21:43 +0100

  * GH-1150: Preserve additional permissions from umask when generating HLTO files. (Benjamin Bannier, Corelight)

1.5.0-dev.3 | 2022-03-22 10:44:59 +0100

  * Refresh package docs with `doc/scripts/autogen-zeek-docs`. (Benjamin Bannier, Corelight)

  * Fix doc gen script to allow for tuples with named fields in return type. (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.5 to NEWS. (Benjamin Bannier, Corelight)

1.4.0 | 2022-03-11 11:16:37 +0100

  * Update NEWS. (Benjamin Bannier, Corelight)

  * Bump docs for spicy-plugin. (Benjamin Bannier, Corelight)

1.4.0-dev.264 | 2022-03-10 11:22:08 +0100

  * Add missing include. (Benjamin Bannier, Corelight)

  * Allow teardown of resumables even if runtime is already gone. (Benjamin Bannier, Corelight)

  * Fix clang-tidy warning about trivially copyable types in `stream.h`. (Benjamin Bannier, Corelight)

  * Remove unused method `Chunk::isCompact`. (Benjamin Bannier, Corelight)

  * Take gaps explicitly into account when recovering. (Benjamin Bannier, Corelight)

  * Add a test for error recovery on gap. (Benjamin Bannier, Corelight)

  * Use more general exception type for recoverable errors in Spicy. (Benjamin Bannier, Corelight)

  * Add a chunk type for gaps. (Benjamin Bannier, Corelight)

1.4.0-dev.255 | 2022-03-04 09:01:36 +0100

  * GH-1036: Support unit initialization through a struct constructor
    expression. (Robin Sommer, Corelight)

    This works now:

      ```
      type X = unit {
          a: uint8;
          b: uint8;
      };

      ...

      local x: X = [$a = 1, $b = 2];
      ```

  * GH-1112: Fix constness for dereferencing references. (Robin
    Sommer, Corelight)

  * Fix code markup in NEWS file. (Benjamin Bannier, Corelight)

1.4.0-dev.247 | 2022-02-23 09:43:39 +0100

  * GH-1072: Disallow enum declarations with non-unique values. (Benjamin Bannier, Corelight)

    It is unclear what code should be generated when requested to convert an
    integer value to the following enum:

        type E = enum {
            A = 1,
            B = 2,
            C = 1,
        };

    For `1` we could produce either `E::A` or `E::C` here.

    Instead of allowing that ambiguity we disallow enums with non-unique
    values with this patch.

    Closes #1072.

1.4.0-dev.245 | 2022-02-23 09:37:14 +0100

  * GH-1043: Add validation rejecting untyped variable decl from struct initializer. (Benjamin Bannier, Corelight)

1.4.0-dev.243 | 2022-02-23 09:04:22 +0100

  * GH-1096: Bump submodules and pre-commit hooks. (Benjamin Bannier, Corelight)

1.4.0-dev.236 | 2022-02-23 09:03:43 +0100

  * GH-1131: Optimize out unused hooks related to synchronization. (Benjamin Bannier, Corelight)

1.4.0-dev.234 | 2022-02-23 09:03:08 +0100

  * Fix styling of lists on RTD. (Benjamin Bannier, Corelight)

1.4.0-dev.232 | 2022-02-21 15:28:31 +0100

  * Move clang-tidy run to its own CI job. (Benjamin Bannier, Corelight)

1.4.0-dev.230 | 2022-02-21 15:27:55 +0100

  * GH-1120: Do not change a LHS to RHS when codegen'ing BuiltinFunctions. (Benjamin Bannier, Corelight)

1.4.0-dev.228 | 2022-02-18 19:12:51 +0100

  * Add support for error recovery. (Benjamin Bannier, Corelight)

  * Format unsigned integers with uppercase suffix. (Benjamin Bannier, Corelight)

  * Do not prefix rendered parse errors with `parse error:`. (Benjamin Bannier, Corelight)

  * Provide grammar function to return look-ahead literals for a given (Robin Sommer, Corelight)
    production.

  * Print grammar debug output only once tables have been computed. (Robin Sommer, Corelight)

  * Remove duplicated and incorrect `default` case rendering to HILTI. (Benjamin Bannier, Corelight)

1.4.0-dev.180 | 2022-02-18 12:25:18 +0100

  * Add step in `ci/run-ci` checking whether Zeek docs are up-to-date. (Benjamin Bannier, Corelight)

  * Add doc build target to check whether docs are up-to-date. (Benjamin Bannier, Corelight)

  * Remove unimplemented `deploy_docs` function in `ci/run-ci`. (Benjamin Bannier, Corelight)

1.4.0-dev.176 | 2022-02-17 14:14:06 +0100

  * GH-1122: Make sure user-visible enums are represented by `int64_t`. (Benjamin Bannier, Corelight)

1.4.0-dev.174 | 2022-02-02 20:31:53 +0100

  * Add a FAQ entry explicitly calling out Layer 2 analyzers. (Benjamin Bannier, Corelight)

1.4.0-dev.172 | 2022-01-26 12:05:12 +0100

  * Redefine noop macro case so it always requires a semicolon. (Benjamin Bannier, Corelight)

  * Be explicit about bugprone narrowing conversions. (Benjamin Bannier, Corelight)

  * Fix diagnostics from clang-tidy's bugprone category. (Benjamin Bannier, Corelight)

  * Fix diagnostics from clang-tidy's readability category. (Benjamin Bannier, Corelight)

  * Fix diagnostics from clang-tidy's performance category. (Benjamin Bannier, Corelight)

  * Fix diagnostics from clang-tidy's modernize category. (Benjamin Bannier, Corelight)

  * Fix diagnostics from clang-tidy's cert category. (Benjamin Bannier, Corelight)

  * Fix clang-tidy config. (Benjamin Bannier, Corelight)

    We previously enabled subcategories incorrectly so that much fewer tests
    than expected were run. We will fix the newly triggered diagnostics in
    follow-up patches.

  * Fix HeaderFilterRegex in clang-tidy config. (Benjamin Bannier, Corelight)

1.4.0-dev.162 | 2022-01-25 12:22:48 +0100

  * Fix documentation link to TFTP sample capture files. (Benjamin Bannier, Corelight)

  * Update documentation for removed centos releases. (Benjamin Bannier, Corelight)

    This is a documentation fixup commit for 55d7775de25c8 where we removed
    supported for EOL centos releases.

1.4.0-dev.159 | 2022-01-20 09:38:49 +0100

  * GH-1084: Fix typing of map/vector index operators. (Robin Sommer,
    Corelight)

  * GH-1079: Fix import of global constants. (Robin Sommer, Corelight)

1.4.0-dev.153 | 2022-01-13 17:12:31 +0100

  * Remove support for EOL centos releases, add centos-stream-8. (Benjamin Bannier, Corelight)

1.4.0-dev.151 | 2022-01-13 08:18:29 +0100

  * GH-1092: Strip installation artifacts. (Benjamin Bannier, Corelight)

    This removes debug symbols from installation artifacts. This leads to a
    marked reduction in their size.

  * Switch configure to use Release mode by default. (Benjamin Bannier, Corelight)

1.4.0-dev.148 | 2022-01-13 08:17:53 +0100

  * Use libc++ instead of libstdc++ on debian-9. (Benjamin Bannier, Corelight)

    In libstdc++-10-dev-10.3.0-13 Debian includes the upstream GCC patch
    2b2d97fc545 without also including at least 4f032929ac9. This leads to
    errors e.g., triggered from nlohmann/json were `&noexcept` attributes
    are used inconsistently.

    Since debian-9 should only receive security updates at this point it is
    unclear to me how such a feature change ended up being backported. At
    this point it is not clear to me whether it will see another patch
    release. For these reasons we switch the build over to use libc++
    instead which comes from the LLVM repo and should still receive reliable
    updates.

1.4.0-dev.146 | 2022-01-08 10:02:10 +0100

  * GH-1076: Do not pass errors inside sink units back up to parent.
    (Robin Sommer, Corelight)

  * GH-1077: Fix self-recursive units. (Robin Sommer, Corelight)

  * GH-1069: Allow implicit C++ conversion from value reference to
    strong reference. (Robin Sommer, Corelight)

  * Fix typos in the source and docs. (Benjamin Bannier, Corelight)

1.4.0-dev.137 | 2022-01-07 10:41:29 +0100

  * Fix typos in the source and docs. (Benjamin Bannier, Corelight)

1.4.0-dev.135 | 2021-12-22 11:04:51 +0100

  * Update docs for Zeek plugin functions with recent changes. (Robin
    Sommer, Corelight)

1.4.0-dev.133 | 2021-12-21 11:45:51 +0100

  * GH-1088: Ensure that field hooks for lists see correct offset. (Benjamin Bannier, Corelight)

  * Remove stray baselines. (Benjamin Bannier, Corelight)

  * Lint all sh scripts with checkbashisms. (Benjamin Bannier, Corelight)

1.4.0-dev.129 | 2021-12-17 12:30:33 +0100

  * GH-1087: Make `offset` return correct value even before parsing of field. (Benjamin Bannier, Corelight)

1.4.0-dev.127 | 2021-12-16 11:46:32 +0100

  * GH-1045: Decouple whether Spicy was build with ccache from ccache use during JIT. (Benjamin Bannier, Corelight)

1.4.0-dev.124 | 2021-12-15 16:54:10 +0100

  * Remove unneeded `%random-access` in tests and docs. (Benjamin Bannier, Corelight)

  * Add validation catching use of deprecated `%random-access`. (Benjamin Bannier, Corelight)

  * Enable random-access by default. (Benjamin Bannier, Corelight)

  * Generate branch for `%random-access`-dependent trimming. (Benjamin Bannier, Corelight)

1.4.0-dev.117 | 2021-12-15 16:13:53 +0100

  * GH-1068: Fix syntax for Spicy `struct` declaration. (Benjamin Bannier, Corelight)

1.4.0-dev.115 | 2021-12-15 15:51:26 +0100

  * Fix typos in variable documentation. (Robin Sommer, Corelight)

  * Document visibility for globals. (Benjamin Bannier, Corelight)

1.4.0-dev.112 | 2021-12-13 10:46:37 +0100

  * Fix zeek_plugin CI task for broken apart zeek/spicy-analyzers. (Benjamin Bannier, Corelight)

1.4.0-dev.110 | 2021-12-13 10:46:04 +0100

  * Show log for configure failures. (Benjamin Bannier)

1.4.0-dev.108 | 2021-12-13 10:43:52 +0100

  * Refresh package docs with `doc/scripts/autogen-zeek-docs`. (Benjamin Bannier, Corelight)

  * Fix docs build for split-apart zeek/spicy-analyzers. (Benjamin Bannier, Corelight)

    That analyzer repo has been broken up into specific analyzer repos. Fix
    scripts and docs on our side for that.

1.4.0-dev.105 | 2021-12-10 09:50:54 +0100

  * Fix lints from cmake-lint. (Benjamin Bannier, Corelight)

  * Reformat CMake files with cmake-format. (Benjamin Bannier, Corelight)

1.4.0-dev.102 | 2021-12-09 11:24:39 +0100

  * Avoid calculating AST dump if we do not output it. (Benjamin Bannier, Corelight)

  * Fix accidental calculation of immediately discarded debug output. (Benjamin Bannier, Corelight)

1.4.0-dev.99 | 2021-12-09 09:30:35 +0100

  * GH-1056: Fix constness check for struct parameters. (Robin Sommer,
    Corelight)

  * GH-1057: Fix code generator to emit types correctly for transitive
    dependencies. (Robin Sommer, Corelight)

1.4.0-dev.95 | 2021-12-07 11:23:17 +0100

  * Fix dependency tracking of spicy-build CMake target. (Benjamin Bannier, Corelight)

  * Fix outputs of CMake command to generate precompiled headers. (Benjamin Bannier, Corelight)

1.4.0-dev.92 | 2021-12-03 11:34:17 +0100

  * Fix a typo in container Github action filter. (Benjamin Bannier, Corelight)

1.4.0-dev.90 | 2021-12-03 08:43:55 +0100

  * GH-1059: Allow to use unit contexts in units with parameters. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/filesystem to v1.5.10. (Benjamin Bannier, Corelight)

  * Bump gitlint pre-commit hooks to v0.17.0. (Benjamin Bannier, Corelight)

  * Bump 3rdparty/benchmark to v1.6.0. (Benjamin Bannier, Corelight)

1.4.0-dev.85 | 2021-12-02 12:22:48 +0100

  * Do not by default run Docker workflow for PRs. (Benjamin Bannier, Corelight)

  * Bump published container to zeek-4.0.4. (Benjamin Bannier, Corelight)

  * Use releases instead of HEAD for packages in published container image. (Benjamin Bannier, Corelight)

  * Also push container image to ECR. (Benjamin Bannier, Corelight)

  * Unify Docker build jobs for tags and for latest. (Benjamin Bannier, Corelight)

  * Use variable to store Docker GH action build args. (Benjamin Bannier, Corelight)

  * Also build Docker image in PR, but do not publish it. (Benjamin Bannier, Corelight)

  * Split build and push step for Docker GH action. (Benjamin Bannier, Corelight)

  * Simplify GH action Docker build pipeline. (Benjamin Bannier, Corelight)

  * Checkout submodules via normal checkout action. (Benjamin Bannier, Corelight)

1.4.0-dev.74 | 2021-11-19 17:31:51 +0100

  * Update documentation for the Zeek plugin's new `$packet` feature.
    (Robin Sommer, Corelight)

1.4.0-dev.72 | 2021-11-16 16:56:18 +0100

  * Fix potentially use-after-free in stringification of `stream::View`. (Benjamin Bannier, Corelight)

    This is a fixup commit for dbc4c6e0d8e where we missed a couple
    potential use-after-frees.

1.4.0-dev.70 | 2021-11-12 09:36:24 +0100

  * GH-106: Bump zkg in published Docker images. (Benjamin Bannier, Corelight)

1.4.0-dev.68 | 2021-11-12 09:35:59 +0100

  * Refresh package docs with `doc/scripts/autogen-zeek-docs`. (Benjamin Bannier, Corelight)

  * Fix lints in `doc/scripts/autogen-zeek-docs.` (Benjamin Bannier, Corelight)

  * Fix `doc/scripts/autogen-zeek-docs` for changed layout of spicy-analyzers repo. (Benjamin Bannier, Corelight)

1.4.0-dev.64 | 2021-11-12 09:35:38 +0100

  * Use clang-format pre-commit hook which installs its own `clang-format` binary. (Benjamin Bannier, Corelight)

1.4.0-dev.62 | 2021-11-09 10:21:28 +0100

  * Fix potentially use-after-free in stringification of `stream::View`. (Benjamin Bannier, Corelight)

1.4.0-dev.60 | 2021-11-09 10:19:53 +0100

  * Document structs. (Benjamin Bannier, Corelight)

  * GH-842: Add Spicy support for struct initialization. (Benjamin Bannier, Corelight)

  * Add basic tests for Spicy `struct` types. (Benjamin Bannier, Corelight)

1.4.0-dev.56 | 2021-11-05 14:55:09 +0100

  * Use compiler launcher from ccache if one was used there. (Benjamin Bannier, Corelight)

  * Use atomic operations to create temporary files during JIT. (Benjamin Bannier, Corelight)

  * Use explicit guard controlling deletion of temporary files in JIT. (Benjamin Bannier, Corelight)

  * Explicitly enforce that a module is only registered once. (Benjamin Bannier, Corelight)

  * Do not delete temporary files if requested. (Benjamin Bannier, Corelight)

  * Fix extension of precompiled headers. (Benjamin Bannier, Corelight)

  * Cache JIT results in CI. (Benjamin Bannier, Corelight)

  * Allow use of ccache during JIT. (Benjamin Bannier, Corelight)

  * Include HILTI config in JIT hash. (Benjamin Bannier, Corelight)

  * Extend hashCombine so it can combine more than two hashes. (Benjamin Bannier, Corelight)

  * Use deterministic locations for files created during JIT. (Benjamin Bannier, Corelight)

  * Avoid unneeded parameter copy. (Benjamin Bannier, Corelight)

  * Ensure cleanup of temporary driver HLTO files on errors. (Benjamin Bannier, Corelight)

  * Compute module linker scope variable from module contents. (Benjamin Bannier, Corelight)

  * Remove unused `created` field in linker version. (Benjamin Bannier, Corelight)

1.4.0-dev.40 | 2021-11-04 13:03:09 +0100

  * Fix build for RTD. (Benjamin Bannier, Corelight)

1.4.0-dev.38 | 2021-11-04 12:35:22 +0100

  * Make Spicy prefix visible for CI jobs testing spicy-[plugin|analyzers]. (Benjamin Bannier, Corelight)

1.4.0-dev.36 | 2021-11-02 13:07:00 +0100

  * Show diff if pre-commit fails in CI. (Benjamin Bannier, Corelight)

1.4.0-dev.34 | 2021-11-01 16:32:40 +0100

  * GH-1028: Add TODO to docs on unit initialization via list coercion. (Benjamin Bannier, Corelight)

1.4.0-dev.32 | 2021-11-01 13:19:49 +0100

  * GH-1030: Make sure types required for globals are declared before being used. (Benjamin Bannier, Corelight)

  * Fix bug in emission of prioritized types. (Benjamin Bannier, Corelight)

  * Fully qualify some identifiers when emitting C++. (Benjamin Bannier, Corelight)

  * Do not emit `__init_globals` if there are no globals. (Benjamin Bannier, Corelight)

1.4.0-dev.27 | 2021-10-26 15:43:54 +0200

  * GH-994: Model types in `set` and `map` `in` operators. (Benjamin Bannier, Corelight)

1.4.0-dev.25 | 2021-10-25 16:30:35 +0200

  * Prevent exception if cache directory is not readable. (Benjamin Bannier, Corelight)

1.4.0-dev.23 | 2021-10-25 16:29:53 +0200

  * Fix issues flagged by shellcheck in `./configure`. (Benjamin Bannier, Corelight)

  * Propagate failure from `cmake` up to `./configure`. (Benjamin Bannier, Corelight)

1.4.0-dev.20 | 2021-10-22 11:40:46 +0200

  * Make `-D ast-codegen` work even without `-j`. (Benjamin Bannier, Corelight)

1.4.0-dev.18 | 2021-10-22 11:39:45 +0200

  * Set `HILTI_DEBUG` to known value for tests. (Benjamin Bannier, Corelight)

  * GH-981: Emit comments for enabled features. (Benjamin Bannier, Corelight)

1.4.0-dev.15 | 2021-10-20 11:37:36 +0200

  * Fix computation of dependent features if multiple features are involved. (Benjamin Bannier, Corelight)

  * Remove workaround always emitting parser functions. (Benjamin Bannier, Corelight)

  * Register parsers depending on feature. (Benjamin Bannier, Corelight)

  * Do not remove unused functions if they are required by type features. (Benjamin Bannier, Corelight)

  * Allow to guard on a list of features. (Benjamin Bannier, Corelight)

  * Constant fold logical operations on booleans. (Benjamin Bannier, Corelight)

  * Factor out getting of bool literals in optimizer. (Benjamin Bannier, Corelight)

  * Always emit filter functionality. (Benjamin Bannier, Corelight)

  * Change `connect_mime_type` to consider public units and same linker scope units. (Benjamin Bannier, Corelight)

  * Allow registration of non-public parsers. (Benjamin Bannier, Corelight)

  * Enable sink support for non-public units as well. (Benjamin Bannier, Corelight)

1.4.0-dev.3 | 2021-10-20 08:10:39 +0200

  * Fix internal link in docs. (Benjamin Bannier, Corelight)

  * Remove fedora32 from docs, add fedora34. (Benjamin Bannier, Corelight)

  * Add placeholder section for 1.4 to NEWS. (Benjamin Bannier, Corelight)

1.3.0 | 2021-10-18 16:23:34 +0200

  * Release 1.3.0.

1.3.0-dev.133 | 2021-10-18 16:16:23 +0200

  * GH-934: Allow `$$` in place of `self` in unit convert attributes. (Benjamin Bannier, Corelight)

  * Add stringification for Keywords. (Benjamin Bannier, Corelight)

1.3.0-dev.130 | 2021-10-12 18:45:17 +0200

  * Run pip3 as superuser in macos CI. (Benjamin Bannier, Corelight)

1.3.0-dev.128 | 2021-10-12 12:12:02 +0200

  * Fix GCC 11 build error for set iterators (Christian Kreibich, Corelight)

  * Modernize CI: drop Fedora 32 (EOL since May), add Fedora 34 (Christian Kreibich, Corelight)

1.3.0-dev.125 | 2021-10-02 08:55:47 +0200

  * GH-46: Switch Spicy and HILTI parsers to use variants. (Benjamin Bannier, Corelight)

  * GH-1009: Fix overly generous generation of type information. (Robin Sommer, Corelight)

  * GH-1013: Split validation into two passes. (Robin Sommer, Corelight)

1.3.0-dev.113 | 2021-09-24 13:02:22 +0200

  * Document release artifaces for debian-11. (Benjamin Bannier, Corelight)

  * Switch release version referenced in docs to v1.2.1. (Benjamin Bannier, Corelight)

1.3.0-dev.110 | 2021-09-23 18:22:44 +0200

  * Remove duplicate rule diagnosed by Bison. (Benjamin Bannier, Corelight)

  * Avoid rendering modules if the debug stream is disabled. (Benjamin Bannier, Corelight)

1.3.0-dev.107 | 2021-09-23 15:39:31 +0200

  * Remove unneeded copies. (Benjamin Bannier, Corelight)

  * Remove unneeded unwrapping of type. (Benjamin Bannier, Corelight)

  * Cleanup optimizer after AST rework. (Benjamin Bannier, Corelight)

  * Fix execution order of hooks in test. (Benjamin Bannier, Corelight)

  * Also collect type uses from function declarations. (Benjamin Bannier, Corelight)

1.3.0-dev.101 | 2021-09-21 12:10:25 +0200

  * Major internal overhaul of the AST infrastructure. (Robin Sommer,
    Corelight)

1.3.0-dev.100 | 2021-09-17 13:18:50 +0200

  * Fix lints in rst files. (Benjamin Bannier, Corelight)

  * Bump pre-commit-hooks. (Benjamin Bannier, Corelight)

1.3.0-dev.97 | 2021-09-16 10:48:42 +0200

  * Use safe integers for runtime size functions. (Benjamin Bannier, Corelight)

    In fd5c53cb8ffd1a18aadb7d21b927bda801e264c8 we changed the size
    functions of runtime containers to use safe integers. This patch adjusts
    the remaining size functions to use safe integers as well.

1.3.0-dev.95 | 2021-09-15 11:46:16 +0200

  * More fixes for building on ARM64. (Benjamin Bannier, Corelight)

    In 89d3295f1363d8d07eda5c711740b18f31483d88 we adjusted some
    preprocessor code to enable building on arm64. That patch missed an
    update of another instance to the same conditional which we fix with
    this patch.

    Some ARM64 platforms do not seem to reliably set the `__arm64__` define,
    but instead `__aarch64__`. We now allow that as an alternative.

1.3.0-dev.93 | 2021-09-15 11:45:50 +0200

  * Fix example links for recent reorg in zeek/spicy-analyzers. (Benjamin Bannier, Corelight)

1.3.0-dev.91 | 2021-09-14 14:10:28 +0200

  * Fix parsers for bison-3.8.1. (Benjamin Bannier, Corelight)

1.3.0-dev.89 | 2021-09-13 15:13:00 +0200

  * GH-999: Unify `transform` and `filter` functions. (Benjamin Bannier, Corelight)

  * Add `insert` with hint to `Vector` and `Set`. (Benjamin Bannier, Corelight)

1.3.0-dev.86 | 2021-09-09 10:38:22 +0200

  * Precompile `libspicy.h`. (Benjamin Bannier, Corelight)

1.3.0-dev.84 | 2021-09-09 10:36:23 +0200

  * GH-941: Allow use of units with all defaulted parameters as entry points. (Benjamin Bannier, Corelight)

1.3.0-dev.82 | 2021-09-09 10:33:14 +0200

  * Disable leak tests if `ASAN_OPTIONS` are already set. (Benjamin Bannier, Corelight)

  * Correctly handle lookups for NULL library symbols. (Benjamin Bannier, Corelight)

1.3.0-dev.79 | 2021-09-09 10:32:29 +0200

  * GH-939: Document initializers for unit variables. (Benjamin Bannier, Corelight)

1.3.0-dev.77 | 2021-09-08 10:46:32 +0200

  * Make it possible to build on arm64. (Benjamin Bannier, Corelight)

    Since we currently do not test on arm64 we do not advertize it as a
    supported platform.

1.3.0-dev.75 | 2021-09-07 08:39:58 +0200

  * GH-982: Model feature constants with actual constants. (Benjamin Bannier, Corelight)

1.3.0-dev.73 | 2021-09-06 09:19:16 +0200

  * GH-988: Use safe integer for runtime container sizes. (Benjamin Bannier, Corelight)

1.3.0-dev.71 | 2021-09-03 14:36:35 +0200

  * Add collection logging to the optimizer. (Benjamin Bannier, Corelight)

  * Rename global optimizer to optimizer everywhere. (Benjamin Bannier, Corelight)

1.3.0-dev.68 | 2021-08-31 10:11:16 +0200

  * Disable constant folding for anything but feature variables. (Benjamin Bannier, Corelight)

1.3.0-dev.66 | 2021-08-31 10:10:42 +0200

  * GH-979: Properly track use of uninitialized enum values in units. (Benjamin Bannier, Corelight)

1.3.0-dev.64 | 2021-08-30 16:23:13 +0200

  * Add optimizer pass removing unused members. (Benjamin Bannier, Corelight)

  * Always emit `__sink` field for units with `%mime-type`. (Benjamin Bannier, Corelight)

  * Mark unit field `__offsets` as `&always-emit`. (Benjamin Bannier, Corelight)

  * Optimize away unused sink functionality. (Benjamin Bannier, Corelight)

  * Add annotations for sink functionality. (Benjamin Bannier, Corelight)

  * Optimize away unused filter functionality. (Benjamin Bannier, Corelight)

  * Add annotations for filter functionality. (Benjamin Bannier, Corelight)

  * Collect feature requirements from function call parameters. (Benjamin Bannier, Corelight)

  * Add support for HILTI function parameter attributes. (Benjamin Bannier, Corelight)

  * Use `&needed-by-feature` to annotate feature-dependent fields. (Benjamin Bannier, Corelight)

  * Add an optimizer helper function to get the innermost type. (Benjamin Bannier, Corelight)

  * Fix generated code to always invoke parsing of subunits. (Benjamin Bannier, Corelight)

1.3.0-dev.51 | 2021-08-26 15:34:35 +0200

  * Wrap long line in NEWS file. (Benjamin Bannier, Corelight)

1.3.0-dev.50 | 2021-08-26 12:38:15 +0200

  * Fix C++ snippets in "Custom Host Application" docs. (Benjamin Bannier, Corelight)

1.3.0-dev.48 | 2021-08-24 15:22:43 +0200

  * Add optimizer pass removing unused `%random-access` features. (Benjamin Bannier, Corelight)

  * Annotate parser fields related to `%random-access`. (Benjamin Bannier, Corelight)

  * Annotate generated parser code with feature flags. (Benjamin Bannier, Corelight)

  * Add function optimizer pass removing orphaned method implementations. (Benjamin Bannier, Corelight)

  * Add an optimizer pass performing basic constant folding. (Benjamin Bannier, Corelight)

  * Add mutator for `statement::If` removing `else` branch. (Benjamin Bannier, Corelight)

  * Prepare `statement::Block` for optimizer edits. (Benjamin Bannier, Corelight)

  * Add accessor for resolved IDs of expressions. (Benjamin Bannier, Corelight)

  * Fix type visitor to properly handle wrapped types. (Benjamin Bannier, Corelight)

  * Check environment variable `HILTI_OPTIMIZER_PASSES` for optimizer passes to enable. (Benjamin Bannier, Corelight)

  * Change optimizer tests to compare HILTI code instead of ASTs. (Benjamin Bannier, Corelight)

  * Change `-p` to print source after optimizations. (Benjamin Bannier, Corelight)

  * Clear module declaration cache after optimizations. (Benjamin Bannier, Corelight)

  * Add a visitor base class for the global optimizer. (Benjamin Bannier, Corelight)

  * Change return type of `AttributeSet::add` so it always returns some set. (Benjamin Bannier, Corelight)

  * Remove outdated TODO. (Benjamin Bannier, Corelight)

  * Prevent unneeded copy of return value. (Benjamin Bannier, Corelight)

1.3.0-dev.30 | 2021-08-23 09:36:24 +0200

  * Hardcode DockerHub org we publish images for in GH workflow. (Benjamin Bannier, Corelight)

1.3.0-dev.28 | 2021-08-19 10:38:45 +0200

  * Add FAQ item for parsing TCP conversations. (Benjamin Bannier, Corelight)

1.3.0-dev.26 | 2021-08-06 14:52:54 +0200

  * Make test type public to prevent it being optimized out. (Benjamin Bannier, Corelight)

  * Add optimizer pass to remove unused types. (Benjamin Bannier, Corelight)

  * Clear preserved nodes of modules after optimizing. (Benjamin Bannier, Corelight)

  * Factor out function to remove an AST node. (Benjamin Bannier, Corelight)

  * Remove unused state in global optimizer. (Benjamin Bannier, Corelight)

  * Rename visitor for functions in global optimizer. (Benjamin Bannier, Corelight)

  * Move optimizer collection state into visitor. (Benjamin Bannier, Corelight)

1.3.0-dev.18 | 2021-08-05 17:26:57 +0200

  * GH-970: Use publicly accessible links to Docker images. (Benjamin Bannier, Corelight)

1.3.0-dev.16 | 2021-08-05 11:24:08 +0200

  * Implement removal of unused member functions in global optimizer. (Benjamin Bannier, Corelight)

  * Explicitly mark parse functions of filters as `&always-emit`. (Benjamin Bannier, Corelight)

  * Factor out functions to compute IDs for global optimizer. (Benjamin Bannier, Corelight)

  * Remove unused function `hilti::type::Struct::ids`. (Benjamin Bannier, Corelight)

1.3.0-dev.11 | 2021-08-05 11:23:24 +0200

  * Fix flaky test `util.memory_statistics` in hilti-rt-tests. (Benjamin Bannier, Corelight)

  * Execute correct test target in validate_release_tarball Cirrus CI task. (Benjamin Bannier, Corelight)

  * Fix validate_release_tarball Cirrus CI task. (Benjamin Bannier, Corelight)

  * Only consider typical release tags when checking whether we are on a release tag. (Benjamin Bannier, Corelight)

  * GH-960: Swallow Git error messages during CMake if run from tarball. (Benjamin Bannier, Corelight)

1.3.0-dev.5 | 2021-08-03 11:04:26 +0200

  * GH-966: Emit linker glue type definitions for vector fields. (Benjamin Bannier, Corelight)

1.3.0-dev.3 | 2021-08-02 16:40:30 +0200

  * Directly maintain VERSION file in repo. (Benjamin Bannier, Corelight)

1.2.0 | 2021-07-29 16:05:44 +0200

  * Release 1.2.0. (Benjamin Bannier, Corelight)

1.2.0-dev.110 | 2021-07-29 15:01:46 +0200

  * GH-956: Fix issues around generating version information. (Benjamin Bannier, Corelight)

1.2.0-dev.105 | 2021-07-29 09:49:24 +0200

  * GH-961: Make detection of current executable more robust. (Benjamin Bannier, Corelight)

1.2.0-dev.103 | 2021-07-29 09:46:05 +0200

  * Make it possible to build Spicy as a CMake subproject. (Benjamin Bannier, Corelight)

1.2.0-dev.101 | 2021-07-23 16:47:13 +0200

  * Add Debian Bullseye (11) to CI. (Matthias Vallentin)

  * Update plugin docs for build system changes. (Robin Sommer,
    Corelight)

1.2.0-dev.94 | 2021-07-19 18:59:32 +0200

  * CI tweaks. (Robin Sommer, Corelight)

1.2.0-dev.92 | 2021-07-19 10:05:36 +0200

  * Remove spicy-plugin and spicy-analyzers submodules, along with the
    `--build-zeek-plugin` configure option. Spicy no longer support
    building them in-tree. This comes along with removing almost all
    Zeek-related pieces from Spicy proper (except for CI testing
    integration with the external Zeek plugin).

  * Add environment variable `HILTI_CXX_INCLUDE_DIRS` to specify
    additional C++ include directories when compiling generated code.
    (Robin Sommer, Corelight)

1.2.0-dev.75 | 2021-07-14 11:07:14 +0200

  * GH-940: Add runtime check for parsing progress during loops.
    (Robin Sommer, Corelight)

1.2.0-dev.71 | 2021-07-14 11:02:28 +0200

  * Add unique "linker scope" identifier to HLTO files. In Spicy, we
    use now store this linker scope along with the parsers when they
    get registered with the runtime. (Robin Sommer, Corelight)

  * GH-952: Switch the Cirrus macOS images to `*-xcode` and (still)
    update Brew for Catalina. (Robin Sommer, Corelight)

  * Make Spicy version available to subprojects. (Robin Sommer, Corelight)

  * Bump Zeek submodules. (Robin Sommer, Corelight)

  * Fix missing documentation update. (Robin Sommer, Corelight)

  * Perform optimizations in a loop. This patch changes the optimizer
    to now run a collect/prune loop until no further AST changes are
    made. (Benjamin Bannier, Corelight)

  * Disable clang-tidy `NewDeleteLeaks` check. (Benjamin Bannier, Corelight)

  * Reduce memory load for clang-tidy CI step. (Benjamin Bannier, Corelight)

  * Use clang-tidy-12 in CI. (Benjamin Bannier, Corelight)

  * Fix accidental truncating conversion in integer code. (Benjamin
    Bannier, Corelight)

1.2.0-dev.55 | 2021-07-09 08:34:26 +0200

  * Perform optimizations in a loop. (Benjamin Bannier, Corelight)

1.2.0-dev.53 | 2021-07-08 12:36:43 +0200

  * Disable clang-tidy `NewDeleteLeaks` check. (Benjamin Bannier, Corelight)

  * Reduce memory load for clang-tidy CI step. (Benjamin Bannier, Corelight)

  * Use clang-tidy-12 in CI. (Benjamin Bannier, Corelight)

  * Remove accidental truncating conversion. (Benjamin Bannier, Corelight)

  * Document for clang-tidy that field can never be unset. (Benjamin Bannier, Corelight)

  * Silence warning on unused variable in generated code. (Benjamin Bannier, Corelight)

  * Do not drop errors when move-constructing Nodes. (Benjamin Bannier, Corelight)

  * Fix range of check. (Benjamin Bannier, Corelight)

1.2.0-dev.43 | 2021-07-05 09:18:12 +0200

  * GH-918: Remove workaround for #918. (Benjamin Bannier, Corelight)

  * GH-918: GH-949: Use forward declarations in linker metadata. (Benjamin Bannier, Corelight)

  * Add registered cxx_includes to linker outputs. (Benjamin Bannier, Corelight)

1.2.0-dev.38 | 2021-06-29 09:33:19 +0200

  * Avoid name collision when codegen'ing struct element initializers. (Benjamin Bannier, Corelight)

1.2.0-dev.36 | 2021-06-29 09:31:59 +0200

  * Prefer VERSION file over git information. (Benjamin Bannier, Corelight)

  * Introduce top-level `spicy-*/` directory in release tarball. (Benjamin Bannier, Corelight)

1.2.0-dev.33 | 2021-06-28 09:23:54 +0200

  * Add optimizer code removing unused function declarations. (Benjamin Bannier, Corelight)

1.2.0-dev.30 | 2021-06-17 10:52:32 +0200

  * Remove unused variable lookup. (Benjamin Bannier, Corelight)

  * Use prefiltered candidate list when resolving operators. (Benjamin Bannier, Corelight)

  * Make `Module::declarations` more robust. (Benjamin Bannier, Corelight)

  * Fix Scope rendering to not access expired references. (Benjamin Bannier, Corelight)

  * Whitelist stringification functions in optimizer collection phase. (Benjamin Bannier, Corelight)

  * Implement removal of unused global hooks. (Benjamin Bannier, Corelight)

  * Bump spicy-plugin and spicy-analyzer submodules. (Benjamin Bannier, Corelight)

1.2.0-dev.17 | 2021-05-31 12:36:27 +0200

  * Add tests for global optimizations. (Benjamin Bannier, Corelight)

  * Add optimizer pass removing unimplemented member functions.

    This patch introduces a global pass triggered after all individual input
    ASTs have been finalized, but before we generate any C++ code. We then
    strip out any unimplemented member functions (typically Spicy hooks),
    both their definitions as well as their uses.

    In order to correctly handle previously generated C++ files which might
    have been generated with different optimization settings, we disallow
    optimizations if we detect that a C++ input file was generated by us. (Benjamin Bannier, Corelight)

  * Fix computation of unset locations. (Benjamin Bannier, Corelight)

  * Detect presence of sink hooks at compile time.

    Sink hooks are by default generated for any `public` unit. With the
    introduction of an optimizer pass to remove unused hooks we might now
    remove them and need to detect their presence when e.g., registering a
    parser.

    This patch moves from these instances from branching on whether a unit
    is `public` to directly detecting the presence of the hooks. (Benjamin Bannier, Corelight)

  * Introduce dedicated codegen step in Driver. (Benjamin Bannier, Corelight)

  * Fix test to correctly log output.

    We previously logged the output of this test to a file we never
    examined. (Benjamin Bannier, Corelight)

  * Autoupdate pre-commit hooks. (Benjamin Bannier, Corelight)

1.2.0-dev.9 | 2021-05-31 12:11:30 +0200

  * GH-913: Add support for unit switch &parse-at and &parse-from attributes. (Benjamin Bannier, Corelight)

  * Add validation of unit switch attributes.  (Benjamin Bannier, Corelight)

1.2.0-dev.5 | 2021-05-31 12:10:44 +0200

  * Make only draft releases from automation. (Benjamin Bannier, Corelight)

1.2.0-dev.3 | 2021-05-31 12:08:12 +0200

  * Adjust processes used to build Docker image. (Benjamin Bannier, Corelight)

  * Update NEWS with 1.2.0 placeholder sections. (Benjamin Bannier, Corelight)

  * Bump spicy-plugin and spicy-analyzer submodules. (Benjamin Bannier, Corelight)

  * Update NEWS. (Benjamin Bannier, Corelight)

1.1.0-dev.104 | 2021-05-20 10:32:54 +0200

  * GH-920: Track patching of Bison files through proper dependencies.
    (Benjamin Bannier, Corelight)

1.1.0-dev.102 | 2021-05-20 10:31:25 +0200

  * GH-917: Default-initialize forwarding fields without type arguments.
    (Benjamin Bannier, Corelight)

1.1.0-dev.99 | 2021-05-20 09:22:52 +0200

  * Fix missing operator<< for enums when generating debug code.
    (Robin Sommer, Corelight)

1.1.0-dev.95 | 2021-05-18 13:26:32 +0200

  * Bump version. (Benjamin Bannier, Corelight)

  * Draft 1.1 release notes. (Robin Sommer, Corelight)

1.1.0-dev.91 | 2021-05-17 14:29:24 +0200

  * Remove redundant version computation. (Benjamin Bannier, Corelight)

  * Do not update unchanged version files. (Benjamin Bannier, Corelight)

  * Remove redundant indention in generated VERSION file. (Benjamin Bannier, Corelight)

1.1.0-dev.87 | 2021-05-12 18:38:40 +0200

  * Make sure container sizes are runtime integers. (Benjamin Bannier, Corelight)

1.1.0-dev.85 | 2021-05-11 16:19:12 +0200

  * Add functions for CRC32 computation to Spicy library. (Robin
    Sommer, Corelight)

  * Add a find() method to units to search within their block of
    input. (Robin Sommer, Corelight)

  * Add support for searching a stream view backward for bytes. (Robin Sommer, Corelight)

  * Optimize implementation of Spicy's library filters a little bit. (Robin Sommer, Corelight)

  * Fix missing update to input position before running `%done` hook. (Robin Sommer, Corelight)

  * Add support for `&eod` to `void` fields. This skips all data until
    the end of the current input is encountered. (Robin Sommer,
    Corelight)

  * Add support for `&until` to `void` fields.

      Example:

        ```
        public type Foo = unit {
          : void &until=b"XYZ";
}
        ```

    This skips all data until `XYZ` is encountered. Similar to the
    `&until` attribute that `bytes` provides, the deliminator is
    extracted from the stream before continuing. (Robin Sommer,
    Corelight)

  * Add support for `&chunked` when parsing bytes data with `&until`
    or `&until_including`. (Robin Sommer, Corelight)

1.1.0-dev.74 | 2021-05-06 19:11:00 +0200

  * GH-911: Add `encode()` method to strings for conversion to bytes.
    (Robin Sommer, Corelight)

  * Let CI show any diff from clang-tidy. (Robin Sommer, Corelight)

  * Fix to run-clang-tidy. (Robin Sommer, Corelight)

1.1.0-dev.70 | 2021-05-05 11:40:32 +0200

  * Lower minimum required Python version to 3.2. (Benjamin Bannier, Corelight)

1.1.0-dev.68 | 2021-05-05 11:40:05 +0200

  * Add rough scaffolding for fuzzing parsers. (Benjamin Bannier, Corelight)

1.1.0-dev.66 | 2021-05-04 16:20:50 +0200

  * Specify python3 on cmake invocations for autogen-version. (Eli M)

  * Bump minimum python version to 3.6. (Eli M)

  * Port autogen-version to python3. (Eli M)

1.1.0-dev.62 | 2021-05-03 12:29:38 +0000

  * GH-901: Fix type resolution bug in &convert. (Robin Sommer, Corelight)

  * Extend HILTI printer to include IDs into tuple type output. (Robin
    Sommer, Corelight)

1.1.0-dev.59 | 2021-04-30 14:34:20 +0200

  * GH-882: Add Cirrus CI task for opensuse-15.2. (Benjamin Bannier, Corelight)

  * Add Dockerfile for opensuse-15.2. (Benjamin Bannier, Corelight)

  * Silence a signed-unsigned comparison warning. (Benjamin Bannier, Corelight)

1.1.0-dev.53 | 2021-04-29 13:00:26 +0000

  * Updating submodule(s).

  * Do not run clang-tidy/clang-format on Zeek submodules. (Robin
    Sommer, Corelight)

1.1.0-dev.48 | 2021-04-27 15:52:40 +0200

  * GH-882: Make spicy compile with bison 3.0. (Johanna)

1.1.0-dev.45 | 2021-04-27 08:51:29 +0000

  * Provide mktime() library function. This allows creating a `time`
    value from individual components, similar to mktime(3). (Robin
    Sommer, Corelight)

1.1.0-dev.43 | 2021-04-26 15:32:25 +0000

  * Allow to pass zlib's window bits parameter into Zlib unit type.
    (Robin Sommer, Corelight)

  * Force type information to come last in generated C++ code.

  * Fix crash on macOS ARM when writing over an existing HLTO file.
    (Robin Sommer, Corelight)

1.1.0-dev.37 | 2021-04-24 09:28:04 +0200

  * Add new Spicy runtime function `spicy::zlib_init(window_bits)`
    that initializes a `ZlibStream` for decompression with the given
    window size argument. See the zlib documentation at
    https://www.zlib.net/manual.html for more on the argument. (Robin
    Sommer, Corelight)

1.1.0-dev.35 | 2021-04-23 11:27:07 +0200

  * GH-37: Add documentation on how to skip data with `void` fields.

1.1.0-dev.33 | 2021-04-23 09:41:18 +0200

  * Reject `void` fields with names. (Benjamin Bannier, Corelight)

  * Validate supported attributes for `void` fields. (Benjamin Bannier, Corelight)

  * Add validation rejecting `$$` in hooks not supporting it. (Benjamin Bannier, Corelight)

  * GH-37: Fix handling of `&size` attribute for anonymous void fields. (Benjamin Bannier, Corelight)

1.1.0-dev.26 | 2021-04-21 13:13:11 +0200

  * GH-889: Fix hook handling for anonymous void fields.

1.1.0-dev.24 | 2021-04-19 15:30:16 +0200

  * Build Zeek plugin for benchmarking job. (Benjamin Bannier, Corelight)

1.1.0-dev.22 | 2021-04-19 09:24:14 +0000

  * GH-766: Port Spicy to Apple silicon. (Robin Sommer, Corelight)

1.1.0-dev.20 | 2021-04-19 08:58:24 +0000

  * GH-872: Fix missing normalization of enum label IDs. (Robin
    Sommer, Corelight)

  * GH-878: Fix casting integers to enums. (Robin Sommer, Corelight)

1.1.0-dev.15 | 2021-04-19 08:57:24 +0000

  * Fix versioning for development. (Robin Sommer, Corelight)

1.1.0-dev.13 | 2021-04-15 14:27:47 +0200

  * GH-844: Add support for &size attribute for unit switch statement. (Benjamin Bannier, Corelight)

1.1.0-dev.12 | 2021-04-15 14:26:45 +0200

  * GH-26: Add skip, skip-pre and skip-post properties. (Benjamin Bannier, Corelight)

  * Perform explicit validation of Spicy module properties. (Benjamin Bannier, Corelight)

1.1.0-dev.9 | 2021-04-15 13:25:20 +0200

  * Add assertion to ensure that code cannot be reached. (Benjamin Bannier, Corelight)

1.1.0-dev.7 | 2021-04-13 11:49:36 +0200

  * Disable 'create-release' and 'docker-tags' workflows for dev tags. (Benjamin Bannier, Corelight)

  * Include build status for 1.0 release branch in README. (Benjamin Bannier, Corelight)

1.1.0-dev.3 | 2021-04-12 18:23:41 +0200

  * Fix leftovers in GH actions from master -> main rename. (Benjamin Bannier, Corelight)

  * Remove build tag for release build from README for now. (Benjamin Bannier, Corelight)

1.0.0 | 2021-04-12 14:22:09 +0200

  * Fix metadata in Docker publishing workflow. (Benjamin Bannier, Corelight)

0.4.0-1694 | 2021-04-12 11:15:53 +0200

  * Do not take freebsd12 into account for cumulative CI status.

  * Documentation updates for 1.0.0 release. (Benjamin Bannier, Corelight)

  * Do not automatically create `spicy:latest` Docker tag from `main`.

0.4.0-1687 | 2021-04-08 17:07:45 +0200

  * Fix version string checking out release tags.

  * Switch versioning scheme for dev versions for 1.0.0 release. (Benjamin Bannier, Corelight)

0.4.0-1684 | 2021-04-06 10:56:32 +0000

  * Add a couple of documentation updates. (Robin Sommer, Corelight)

  * Update CI release infrastructure. (Benjamin Bannier, Corelight)

  * GH-860: Fix regexp matching across chunk boundaries. (Benjamin
    Bannier, Corelight)

  * Fix code markup in unit and sink docs. (Benjamin Bannier,
    Corelight)

  * GH-861: Add new combined operation for combined map indexing &
    assignment. (Benjamin Bannier, Corelight)

  * Add map index operator which can mutate contained returned value.
    (Benjamin Bannier, Corelight)

  * Bump pre-commit plugins. (Benjamin Bannier, Corelight)

0.4.0-1662 | 2021-03-27 08:49:01 +0000

  * Update Zeek submodules.

  * Fix doc links to package artifacts. (Benjamin Bannier, Corelight)

  * Test plugins in CI on macOS. (Benjamin Bannier, Corelight)

0.4.0-1656 | 2021-03-25 12:19:35 +0000

  * Adapt to `master` -> `main` branch renaming. (Robin Sommer, Corelight)

0.4.0-1653 | 2021-03-25 09:23:12 +0100

  * Add new (missing) autogenerated docs. (Benjamin Bannier, Corelight)

0.4.0-1650 | 2021-03-25 07:40:06 +0000

  * GH-848: Disable default building of Zeek plugin. (Benjamin
    Bannier, Corelight)

  * Update installation instructions for recent changes. (Robin
    Sommer, Corelight)

0.4.0-1640 | 2021-03-24 22:09:16 +0100

  * Clean up of CI artifact naming. (Benjamin Bannier, Corelight)

  * Drop noexcept in Sink move constructor. (Benjamin Bannier, Corelight)

0.4.0-1632 | 2021-03-23 20:01:10 +0100

  * GH-853: Fix extraction of integer bits when all bits requested.

    When calculating the extraction mask, we previously would shift an
    integer beyond its width which triggers UB. With this patch we now
    correctly detect such cases and directly return the input.

  * GH-450: Add `!in` to HILTI and Spicy parser.

0.4.0-1614 | 2021-03-18 12:27:45 +0000

  * GH-827: Bump Zeek LTS version to 4.0.0 in some CI and Docker
    images. (Benjamin Bannier, Corelight)

  * Code optimization: Pass some arguments by ref if no value is
    needed. (Benjamin Bannier, Corelight)

  * Remove duplicate key in clang-format configuration. (Benjamin
    Bannier, Corelight)

  * Updating submodules.

0.4.0-1609 | 2021-03-18 09:45:01 +0000

  * GH-817: Fix vector parsing potentially missing EOD. (Robin Sommer, Corelight)

  * GH-835: Fix some issues diagnosed by LGTM. (Benjamin Bannier, Corelight)

  * Fix `?.` operator to work with constant structs. (Robin Sommer, Corelight)

0.4.0-1603 | 2021-03-17 10:02:17 +0100

  * GH-815: Add creation of DEB and RPM packaging artifacts. (Benjamin Bannier, Corelight)

0.4.0-1575 | 2021-03-13 09:24:03 +0000

  * GH-821: Fix &max-size with constant argument. (Robin Sommer,
    Corelight)

  * GH-819: Fix unification of internal compiler arguments to not
    change order. (Robin Sommer, Corelight)

0.4.0-1568 | 2021-03-11 07:04:13 +0000

  * Fix some CMake, CI, and documtation issues. (Robin Sommer,
    Corelight)

0.4.0-1564 | 2021-03-10 11:21:02 +0000

  * Fix broken links in documentation. (Robin Sommer, Corelight)

0.4.0-1561 | 2021-03-10 08:40:38 +0000

  * Move Zeek plugin into submodule and remove all dependencies on
    Zeek from main Spicy distribution. (Robin Sommer, Corelight)

  * Add environment variable HILTI_PRINT_SETTINGS that trigger
    printing out compiler settings to stderr. (Robin Sommer,
    Corelight)

  * GH-812: Fix typos in docs. (Benjamin Bannier, Corelight)

  * GH-813: Add missing word in docs. (Benjamin Bannier, Corelight)

  * GH-569: Fix error message in validation of `real` fields.
    (Benjamin Bannier, Corelight)

  * GH-806: Fix benchmark script for move of analyzers. (Benjamin
    Bannier, Corelight)

0.4.0-1551 | 2021-03-04 09:52:00 +0100

  * GH-570: Explicitly reject comparisons of units with `==` and `!=`.

    Comparisons with `==` and `!=` are not explicitly modelled in Spicy or
    HILTI which means that while we resolved the types of the LHS and RHS,
    during codegen we just emit a `==` or `!=` which needs to be resolved.

    While most runtime types should support these operators, units do not,
    so that previously users would see a compiler error during JIT when
    comparing values of unit type with `==` or `!=`. This patch adds a
    validator which explicitly rejects such comparisons.

0.4.0-1547 | 2021-03-03 09:13:25 +0100

  * GH-798: Prevent conversions of some integers to doubles on the Zeek interface.

    While we previously provided specialized conversion functions to Zeek
    `ValPtr` these were not used for plain integer types like e.g.,
    `std::size_t` or `unsigned long`. Instead C++ overload resolution
    preferred to instead convert the integers to `double` (for which we
    provide a specialization) and them being emitted with `TYPE_DOUBLE`.

    This patch introduces an additional specialization which converts such
    naked integers to safe integers and then converts them to Zeek.

0.4.0-1545 | 2021-03-03 09:12:29 +0100

  * GH-733: Validate that `foreach` is only used with container fields.

0.4.0-1543 | 2021-03-02 07:37:21 +0000

  * Move protocol analyzers into submodule. This moves all the
    protocol analyzers into its own submodule `spicy-analyzers`, which
    doubles as a Zeek package installing them. There's a new
    `spicy-analyzers` target to pre-compile those analyzers for Zeek.
    (Robin Sommer, Corelight)

  * Zeek plugin updates (Robin Sommer, Corelight)

      - Move registration of Zeek components to load time.
      - Work around problem in Zeek's analyzer API.

   * Update pathfind to fix problem on Alpine. (Robin Sommer,
     Corelight)

0.4.0-1541 | 2021-03-02 07:22:26 +0000

  * Add support for `@if/@else/@endif` in Spicy scripts, similar to
    what EVT files already provided. This currently supports testing
    for three constants at compile time: `SPICY_VERSION`,
    `ZEEK_VERSION`, `HAVE_ZEEK`. See the documentation for more.
    (Robin Sommer, Corelight)

  * Increase CI memory for platforms that are prone to OOMing. (Robin
    Sommer, Corelight)

0.4.0-1533 | 2021-03-02 07:21:39 +0000

  * Fix strftime unit test: increase portability of localtime_r()
    usage (Christian Kreibich, Corelight)

0.4.0-1531 | 2021-03-01 11:40:35 +0100

  * GH-768: Add language support to explicitly trigger a parse error.

    This patch adds a Spicy `throw` statement of the form

        throw EXPR;

    which when hit triggers a parse error with the message `EXPR`.

0.4.0-1529 | 2021-03-01 11:06:22 +0100

  * GH-767: Add &max-size attribute.

    This patch adds a &max-size field and unit attribute. The attribute
    allows setting up a maximum number of bytes a parse step should consume.

    It is conceptually similar to the existing &size attribute but differs
    from it in that an error is raised only if more than the specified bytes
    were extracted (&size enforces that exactly the specified number of
    bytes is extracted).

    &max-size cannot be used together with &size.

0.4.0-1521 | 2021-02-26 08:50:04 +0000

  * GH-791: Bring back validation of field parseability. (Robin
    Sommer, Corelight)

  * GH-762: Add support for Zeek file analyzer replacement (requires
    Zeek 4.1+). (Jon Siwek, Corelight)

0.4.0-1513 | 2021-02-25 14:49:43 +0000

  * GH-771: Improve docs for vector &until parsing. (Jon Siwek,
    Corelight)

0.4.0-1511 | 2021-02-24 19:34:56 +0000

  * GH-694: Support unit-level `&convert` attribute. (Robin Sommer,
    Corelight)

    This attribute transforms a unit instance after parsing by returning the
    result of a custom expression to parent units, instead of the instance
    itself.

    Example:

        type Data = unit {
    data:
        bytes& size = 2;
    }
    &convert = self.data.to_int();

public
    type Foo = unit {
    numbers:
        Data[];
        on % done { print self.numbers; }
    };

#printf 12345678 | spicy - driver unit - convert.spicy
        [12, 34, 56, 78]

    Note how the `Data` sub-elements have been turned into integers. Without
    the new `&convert` attribute, the output would have looked like this:

        [[$data=b"12"], [$data=b"34"], [$data=b"56"], [$data=b"78"]]

  * GH-736: Fix bug that could cause hooks for anonymous fields to not
    execute. (Robin Sommer, Corelight)

  * Support parsing of nested fields. (Robin Sommer, Corelight)

    The new test case shows a number of examples that are now supported:

        public type Test = unit {
        i1:
            (bytes& size = 5);
        i1b:
            (bytes& size = 5 & convert = 42);
        i2:
            (int8[3]);
        i3:
            (int8[2])[3];
        i4:
            (int8[]& until = ($$ == 'X'))[]& until = ($$ == vector(55, 56));
        i5:
            (FooImpl);
        i6:
            (FooImpl[2]);
        i7:
            (FooImpl[2])[3];
        i8:
            (FooImpl& convert = 42);
        i9:
            (FooImpl& convert = 42)& convert = $$ * 2;
        i10a:
            (bytes& size = 5 & convert = $$.to_int());
        i10b:
            (Bytes& size = 5 & convert = $$.to_int());
        i10c:
            (FooImpl& convert = $$.data.to_int());
        i11:
            (FooImpl& convert = $$.data.to_int())& convert = $$ * 2;
        i12:
            (FooImpl& convert = $$.data.to_int())[2];
        i13: (FooImpl &convert=$$.data.to_int())[2] &convert=[3 * xyz for xyz in $$];
        }

    While the expectation isn't really that people would write this, this
    puts the infrastructure in place to support functionality that needs
    more complex field structures. (Robin Sommer, Corelight)


  * Force use of clang11 on FreeBSD 11. (Benjamin Bannier, Corelight)

  * Support inline methods in HILTI structs. (Benjamin Bannier,
    Corelight)

  * Prettify error message when ID lookups yield something of
    unexpected type. (Robin Sommer, Corelight)

  * Add HILTI support for "auto" type that's derived through operator
    resolving. (Robin Sommer, Corelight)

0.4.0-1491 | 2021-02-24 09:00:24 +0100

  * GH-773: Refine check for incompatible parse attributes.

0.4.0-1489 | 2021-02-24 08:59:36 +0100

  * GH-769: Skip evaluating `parse-at` or `parse-from` if field condition is False.

0.4.0-1486 | 2021-02-23 19:02:16 +0000

  * Documentation updates. (Jon Siwek, Corelight)

    - Add explicit mention of named-tuple elements.
    - Fix inline literal markup in "optional" type.
    - Add time/interval to Spicy->Zeek type conversion table.
    - Remove "missing" tag on README's link to "real analyzer tutorial".
    - Fix documentation link. (Benjamin Bannier, Corelight)

0.4.0-1479 | 2021-02-23 14:22:12 +0100

  * GH-770: Evaluate the AND of all field `requires` clauses.

    We already did this correctly for units by previously only evaluated the
    first `&requires` clause for fields.

0.4.0-1476 | 2021-02-23 14:21:25 +0100

  * GH-774: Fix method argument type deduction for argument packs.

0.4.0-1474 | 2021-02-22 13:46:31 +0000

  * Tweak auto-discover of *.hlto files in Zeek plugin. (Robin Sommer, Corelight)

    The plugin now scans for *.hlto files at startup at two locations by
    default:

        1. A directory "modules/" inside the plugins top-level directory.

        2. Zeek's default plugin directory.

    Both of these places are searched *recursively*, similar to how Zeek
    looks for binary plugins.

    Alternatively, one can override both of these by setting an environment
    variable `SPICY_MODULE_PATH` to a colon-separated list of directories,
    which will then be searched recursively *instead* of the default
    locations.

  * Extend spicy-config with a couple more Zeek-related options, and
    tweak some existing option names. (Robin Sommer, Corelight)

0.4.0-1470 | 2021-02-22 14:31:35 +0100

  * GH-772: Allow trailing comma in tuple type list.

    Closes #772. (Benjamin Bannier, Corelight)

0.4.0-1468 | 2021-02-22 10:12:33 +0100

  * GH-600: Add validation for field names clashing with unit names.

    This would previously fail during C++ codegen; now we reject this code.

    Closes #600. (Benjamin Bannier, Corelight)

0.4.0-1462 | 2021-02-22 10:10:53 +0100

  * GH-719: Reject local variables at module scope.

    Closes #719. (Benjamin Bannier, Corelight)

0.4.0-1455 | 2021-02-18 17:05:01 +0100

  * Document `&byte-order` unit attribute. (Benjamin Bannier, Corelight)

  * Document `&requires` unit attribute. (Benjamin Bannier, Corelight)

  * Convert %byte-order unit property to an attribute. (Benjamin Bannier, Corelight)

  * Convert %requires property to an attribute. (Benjamin Bannier, Corelight)

  * Make tuple index type calculation more resilient. (Benjamin Bannier, Corelight)

  * GH-744: Fix out-of-bounds access in tuple index type resolution.

    This code was previously indexing into a vector beyond the end when
    determining the type of a tuple index operation. We now
    return an unknown type here here so that we can reject the operation
    during later validation.

0.4.0-1446 | 2021-02-18 09:31:13 +0000

  * GH-709: Fix codegen's result type of unit.offset(). (Robin Sommer,
    Corelight)

  * GH-709: Add description of enum use to Zeek plugin documentation.
    (Robin Sommer, Corelight)

  * Fix bug with custom enum types not being available in time for
    Zeek scripts. Turns out that for precompiled Zeek analyzers it
    didn't work to automatically make the Spicy-side enum types
    available to Zeek scripts because of a timing issue. (Robin
    Sommer, Corelight)

  * Add grouping() function to builder API. (Robin Sommer, Corelight)

  * Add new function linkage "preinit" to HILTI. (Robin Sommer,
    Corelight)

0.4.0-1437 | 2021-02-17 11:08:16 +0100

  * GH-682: Remove TODO in docs. (Benjamin Bannier, Corelight)

0.4.0-1435 | 2021-02-17 11:07:03 +0100

  * GH-723: Provide constructor for ports.

    Closes #723. (Benjamin Bannier, Corelight)

0.4.0-1430 | 2021-02-17 11:06:27 +0100

  * GH-731: Add unit `position` method.

    This method returns an iterator to the current position in the unit's
    input stream.

    Closes #731. (Benjamin Bannier, Corelight)

0.4.0-1428 | 2021-02-16 16:04:42 +0000

  * GH-690: Add `%finally` hook to Spicy units.

    ``on %finally  {
        ...
    }``
        Executes once unit parsing has completed in any way. This hook is
        most useful to modify global state that needs to be updated no
        matter the success of the parsing process. Once `%init` triggers, this
        hook is guaranteed to eventually execute as well. It will run
        *after* either ``%done`` or ``%error``, respectively. (If a new
        error occurs during execution of ``%finally``, that will not
        trigger the unit's ``%error`` hook.)

  * Generalize %error to catch all exceptions. So far it was catching
    only HILTI-side errors. Now we do general catch-all so have a
    reliably hook for error handling no matter what's the cause.
    (Robin Sommer, Corelight)

  * Support finalizers in HILTI structs. There's a now new magic hook
    `~finally` that will run automatically when a struct instance gets
    destroyed. (Robin Sommer, Corelight)

  * Fix double normalization in ID strings. (Robin Sommer, Corelight)

0.4.0-1422 | 2021-02-16 10:49:34 +0000

  * GH-696: Add support for shared unit contexts with lifetime
    determined by host application. (Robin Sommer, Corelight)

    This introduces a new unit property for public unit types:

        %context = <type>;

    The unit's new `context()` method will then return a value of type
    `<type>&` (i.e, a reference to an instance of the given type). This will
    be initialized with a reference to a default-constructed instance of the
    type.

    What makes this special is that the host application can determine how a
    context instance is being shared across different parsers: it can (1)
    let multiples units link their context to the same instance, and (2)
    retain a context instance beyond any specific unit's lifetime.

    We use this new mechanism to provide contexts with connection-level
    semantics: the Zeek plugin, and also spicy-driver's batch mode, will
    create a single context instance that the two originator-side and
    responder-side units will share (they must declare matching contexts
    for that to work). The object will live until the connections gets
    torn down (also meaning it'll be reused across the per-packet parsers
    for UDP).

    See the documentation for examples.

  * Add `<vector>.pop_back()`. (Robin Sommer, Corelight)

  * Support assignment to tuple elements. (Robin Sommer, Corelight)

  * Extend the spicy-driver batch format to be able to express
    bi-direction connection semantics. This increases the batch format
    version to v2. (Robin Sommer, Corelight)

  * Add new variant of external function linkage to HILTI that skips
    the resumable wrapping. (Robin Sommer, Corelight)

0.4.0-1415 | 2021-02-16 10:29:53 +0000

  * GH-726: $$ wasn't accessible from inside an `&until-including`
    expression. (Robin Sommer, Corelight)

  * GH-740: May address the unstable behavior by rewriting the code
    surrounding the `&while` parsing (but keeping semantics the
    same). (Robin Sommer, Corelight)

0.4.0-1412 | 2021-02-16 10:07:45 +0000

  * Activate CI for Debian 10 on master. (Robin Sommer, Corelight)

  * GH-629: Use linb::any instead of std::any across the code base.
    (Robin Sommer, Corelight)

  * GH-738: Fix crash in spicy-driver when used with units that
    require parameters. (Robin Sommer, Corelight)

  * GH-737: Fix non-converging AST in case of ambiguous ID usage.
    (Robin Sommer, Corelight)

0.4.0-1403 | 2021-02-09 13:23:55 +0000

  * Fix missing f-string in Spicy Pygments lexer for floats/reals (Jon
    Siwek, Corelight)

  * GH-722: Bump pathfind. (Benjamin Bannier, Corelight)

  * GH-732: Add test for setting input beyond current position. (Benjamin Bannier, Corelight)

  * Add missing dependency of header precompilation target on script.
    (Benjamin Bannier, Corelight)

  * Fix documentation of `set_input`. (Benjamin Bannier, Corelight)

0.4.0-1394 | 2021-02-05 07:09:51 +0000

  * Fix compatibility with Zeek 4.1 API changes/removals. (Jon Siwek,
    Corelight)

0.4.0-1392 | 2021-02-04 15:14:31 +0000

  * GH-962: Fix type inference for constructors of
    vector/list/set/map, and for locals/globals. (Benjamin Bannier,
    Corelight; Robin Sommer, Corelight)

  * Remove unused function typeOfExpressions. (Benjamin Bannier,
    Corelight)

0.4.0-1385 | 2021-02-04 14:59:06 +0000

  * Add Pygments lexers for `.spicy` and `.evt` files. (Jon Siwek,
    Corelight)

  * Use syntax highlighting for Spicy/EVT/Zeek/C++ in documentation.
    (Jon Siwek, Corelight)

  * Add 'livehtml' target to `doc/Makefile` that will run
    `sphinx-autobuild`, plus some cleanup. (Jon Siwek, Corelight)

0.4.0-1375 | 2021-02-03 11:43:19 +0100

  * Enhance parsing of single-element container constructors so that
    trailing `,` is optional. (Benjamin Bannier, Corelight)

  * GH-711: Fix formatting of a number of predefined enum values.
    (Benjamin Bannier, Corelight)

  * GH-697: Allow trailing ',' in enum declarations. (Benjamin
    Bannier, Corelight)

  * Update some links in the documentations. (Benjamin Bannier,
    Corelight)

  * GH-699: Add script to store and upload release artifacts.
    (Benjamin Bannier, Corelight)

0.4.0-1358 | 2021-02-01 10:40:23 +0100

  * GH-701: Make offsets usable from unit field attributes.

    We previously updated parse positions when entering productions. This is
    insufficient as the evaluation of attributes might already access the
    position via `self.offset()`.

    With this patch we now only update the parse position before we start
    parsing of a field.

    Closes #701. (Benjamin Bannier, Corelight)

  * Use ubuntu-20 as base for published Docker image. (Benjamin Bannier, Corelight)

  * Set PATH and ZEEK_PLUGIN_PATH for ubuntu Docker images. (Benjamin Bannier, Corelight)

  * Validate Zeek installation for Docker CI tasks. (Benjamin Bannier, Corelight)

  * Fix Docker images for possible lib libdir.

    This patch fixes the `ZEEK_PLUGIN_PATH` set in Docker images so Zeek can
    find plugins even if the Spicy installation was performed with a libdir
    named `lib` instead of `lib64`. (Benjamin Bannier, Corelight)


0.4.0-1346 | 2021-01-29 08:26:26 +0000

  * GH-685: Allow to define a minimum Spicy version that a module
    requires. Adding `%spicy-version = "1.0";` to a module now lets it
    require to compile with a Spicy of at least that version. The
    version can be specified as either `x.y` or `x.y.z`. (Robin
    Sommer, Corelight)

  * GH-688: Add functions `zeek::uid()` and `zeek::fuid()` to access
    UIDs and FUIDs, respectively. (Robin Sommer, Corelight)

  * GH-689: Allow to pass a MIME type to `file_new()` when beginning
    file analysis. (Johanna Amann, Corelight)

  * GH-700: Support `&size` attribute at the unit level.

    This limits input to the given number of bytes for the unit:

        type Bar = unit(n: uint64) {
x:
    bytes& eod;
        } &size=n;

    Parsing less than `n` bytes is an error. (Robin Sommer, Corelight)

  * Fix --git-root in autogen-version call. (Robin Sommer, Corelight)

  * Fix using `Null` as a parameter default value for `optional<T>`.
    (Robin Sommer, Corelight)

  * Add timestamp removal to the Zeek log canonification in tests.
    (Johanna Amann, Corelight)

0.4.0-1330 | 2021-01-28 10:22:55 +0100

  * GH-701: Add strptime Spicy library function.

0.4.0-1324 | 2021-01-26 17:59:30 +0000

  * Update reproc to release version. (Robin Sommer, Corelight)

0.4.0-1321 | 2021-01-26 13:23:11 +0100

  * Lots of CI / clang-format / Docker cleanup. (Benjamin Bannier, Corelight)

0.4.0-1305 | 2021-01-21 15:34:39 +0000

  * Fix failing Zeek tests. (Robin Sommer, Corelight)

0.4.0-1304 | 2021-01-21 13:37:38 +0000

  * Fix a couple of issues with Zeek 4.0. (Robin Sommer, Corelight)

  * GH-640: Extend spicy-doc to document begin/end operators. (Robin
    Sommer, Corelight)

  * Bulk update of all test baselines. (Robin Sommer, Corelight)

  * Update copyright headers. (Robin Sommer, Corelight)

  * Do not use #pragma once in libhilti.h. (Robin Sommer, Corelight)

  * Disable output from header compilation. (Robin Sommer, Corelight)

  * Update README. (Robin Sommer, Corelight)

  * Remove unused TLS baselines. (Robin Sommer, Corelight)

  * Prettify configure output. (Robin Sommer, Corelight)

0.4.0-1286 | 2021-01-21 12:04:58 +0100

  * Add CI job to validate release tarball. (Benjamin Bannier,
    Corelight)

  * Document more platforms in the installation docs. (Benjamin
    Bannier, Corelight)

  * Use "default" compiler if possible in Docker images. (Benjamin
    Bannier, Corelight)

  * Make master-only CI tasks triggerable. (Benjamin Bannier,
    Corelight)

0.4.0-1277 | 2021-01-20 19:55:47 +0000

  * Add final newline to ASCII output of spicy-dump. (Robin Sommer,
    Corelight)

  * GH-671: Fix parsing of empty look-ahead vectors. (Robin Sommer,
    Corelight)

  * Fix Zeek plugin build when toolchain is disabled. (Robin Sommer,
    Corelight)

  * Let the autogen-version script execute out of the top-level
    directory. (Robin Sommer, Corelight)

0.4.0-1270 | 2021-01-20 14:04:16 +0100

  * Allow to enforce sequential execution of jobs spawned during JIT.
    If the environment variable `HILTI_JIT_SEQUENTIAL` is set jobs are
    executed sequentially. (Benjamin Bannier, Corelight)

  * Use sequential JIT mode in CI to save memory. (Benjamin Bannier,
    Corelight)

  * GH-582: Add master CI task for macOS Big Sure. (Benjamin Bannier,
    Corelight)

  * GH-670: Remove pre-commit hooks which require external tool
    installation. (Benjamin Bannier, Corelight)

  * Move `spicy::rt::getenv` to `hilti::rt`. (Benjamin Bannier,
    Corelight)

0.4.0-1262 | 2021-01-19 08:28:41 +0000

  * macOS fixes (Robin Sommer, Corelight)

    - GH-664: Increase minimum fiber stack size.
    - Pass CMAKE_OSX_SYSROOT through to JIT linker.

  * Add a couple cron scripts to repository. (Benjamin Bannier, Corelight)

    - `ci/cron/spicy-benchmark.sh:` run Spicy benchmarks
    - `ci/cron/update_spicy_dockerhub.sh: update Spicy Docker images

0.4.0-1255 | 2021-01-18 08:45:26 +0000

  * Port JIT to use host C++ compiler instead of libclang/libllvm.
    (Robin Sommer, Benjamin Bannier; Corelight).

    This completely removes the dependency on an existing clang
    installation. Instead, JIT now requires only a C++17 host
    compiler. Internally, this comes with a substantial refactor of
    the JIT components.

    This changes also includes the following additional pieces:

        - We pull in `https://github.com/DaanDeMeyer/reproc` as a
          submodule for spawning the host compiler.

        - The environment variable `HILTI_CXX` overrides the
          executable to use as the C++ compiler during JIT. It won't
          work to switch in a completely different compiler that way
          (because we'd continue to make some assumptions based on the
          default compiler), but it allows to provide an additional
          wrapper around the default compiler.

        - We remove the distinction between building the toolchain
          with/without JIT. We now always assume we have the JIT
          capability available, but will fail gracefully when unable to
          use the host compiler.

        - JIT compilation captures & reports C++ error output.

  * Extend `{hilti,spicy}-config` with options `--cxx-flags-hlto`/`--cxx-flags-hlto`
    printing compiler flags for building HLTO files.

  * CMake: Redoing object library linking. We weren't consistent in
    how we linked them, which led to some off effects. (Robin Sommer,
    Corelight)

  * Codegen: Construct initializer lists from literals. Benjamin
    Bannier, Corelight)

  * Cleanup left-over ASAN code that was no longer in use. (Robin
    Sommer, Corelight)

  * Increase CI memory limit for Ubuntu debug task. (Robin Sommer, Corelight)

  * Bump CMake in CI Docker image. (Benjamin Bannier, Corelight)

0.4.0-1227 | 2021-01-13 07:41:35 +0000

  * Re-implement the runtime's fiber (co-routine) code. (Benjamin
    Bannier, Robin Sommer; Corelight).

    This should be mostly transparent to users, but internally the
    main pieces are:

    - GH-561: Switch from libtask to new 3rd-party fiber library
      (https://github.com/simonfxr/fiber.git).

    - GH-561: Support "shared stack" mode for fibers where the runtime
      only allocates a single stack that's used by all fibers, vs.
      individual per-fiber stacks. This comes with a slight
      performance penalty for context switching, but substantially
      improves memory usage (and, in turn, performance with lots of
      concurrent fibers). The shared stack is used by default now.
      There's also new benchmark hilti-rt-fiber-benchmark to profile
      performance.

    - GH-460: Add runtime checks for risk of stack overflow. When the
      HILTI codegen creates a function, it now always inserts a stack
      check at the beginning that ensures that a minimal amount of
      stack space remains available. If it is not, we abort with a
      runtime exception. This gives us well-defined behavior if call
      stacks go too deep. The minimum amount of stack space is
      configurable through a global option.

    Along with this comes large refactor of the runtime's fiber code.

  * Fix Linux' --ldflags for pthread. (Robin Sommer, Corelight)

  * Make hilti::rt::isInitialized() save to be used when no global
    state is available. (Robin Sommer, Corelight)

  * When running the CI container through the Makefile, use local
    user's UID/GID. (Robin Sommer, Corelight)

  * Adding missing call to rt::done() to default main(). (Robin
    Sommer, Corelight)

  * Fix CMake logic for hilti-rt. (Robin Sommer, Corelight)

  * Enable leak checking by default in ASAN builds. ASAN itself
    enables it only on Linux by default. (Robin Sommer, Corelight)

  * Let autogen-version find VERSION independent of current directory.
    (Robin Sommer, Corelight)

0.4.0-1201 | 2021-01-11 21:03:10 +0100

  * Activate building Spicy in CentOS 7 Docker image. (Benjamin Bannier,
    Corelight)

0.4.0-1199 | 2021-01-10 14:03:48 +0000

  * Remove manual installation of Zeek CMake files on FreeBSD CI. (Benjamin
    Bannier, Corelight)

0.4.0-1196 | 2021-01-09 19:13:50 +0100

  * GH-650: Add infrastructure to upload a release tarball for tags. (Benjamin
    Bannier, Corelight)

  * GH-633: Fixes for FreeBSD, plus CI support. (Benjamin Bannier, Corelight)

  * Bump minimal version of BTest in CI to 0.66. (Benjamin Bannier,
    Corelight)

0.4.0-1175 | 2021-01-06 07:28:23 +0000

  * Fix for macOS 10.16. (Robin Sommer, Corelight)

0.4.0-1173 | 2021-01-05 11:01:34 +0100

  * GH-644: Remove Spicy support for `else` on `while`.

0.4.0-1148 | 2021-01-04 08:10:25 +0000

  * Overhauling regexp matching semantics.

    We were inconsistent in how regular expressions (1) handled being anchored
    vs not, and (2) allowed to retrieve the matching data. We fix this as
    follows:

    - We rename the regexp methods for more consistency: `match` now means
      "matching is anchored at the beginning of the data", and `find` means
      we find matches anywhere in the data. This leads to the following
      renames:

        * <regexp>.find -> <regexp>.match
        * <regexp>.find_groups -> <regexp>match_groups
        * <regexp>.find_span -> <regexp>.find

      `<bytes>.match` adapts to the new semantics as well.

    - We remove the `&anchor` attribute because that's the default now.

    - `&no_sub` remains available to override the default choice of the
      matcher type: it'll use the minimal matcher and disable capture group
      support.

0.4.0-1145 | 2021-01-02 20:43:29 +0100

  * GH-635: Collection of cleanups from consuming Spicy in external project.
    (Benjamin Bannier)

  * GH-620: Add paths to Spicy and Zeek to Ubuntu Docker image PATHs. (Benjamin Bannier, Corelight)

  * Extend Docker images. (Benjamin Bannier, Corelight)

    - Add Debian-10 Docker image.
    - Add Debian-9 Docker image.
    - Add Fedora-32 Docker image.
    - Add Fedora-33 Docker image.
    - Add Ubuntu-16 Docker image.
    - Add Ubuntu-18 Docker image.
    - Add Ubuntu-20 Docker image.
    - Remove unsupported Ubuntu-19.10.
    - Fix yum repository name in CentOS 8 Docker images. (GH-619)
    - Use correct download location for Zeek packages.

  * GH-575: Add support for FreeBSD. (Benjamin Bannier, Corelight)

  * Fix test 'spicy.rt.time'. (Benjamin Bannier, Corelight)

  * C++ fix to be explicit on which variant we construct in `Result`. (Benjamin
    Bannier, Corelight)

0.4.0-1118 | 2020-12-11 07:18:52 +0000

  * GH-602: Install Zeek from packages. (Benjamin Bannier, Corelight)

0.4.0-1112 | 2020-12-10 10:33:31 +0000

  * GH-25: Add support for manual backtracking to Spicy. If a field is
    marked with ``&try``, a later call to ``self.backtrack()``
    anywhere down in the parse tree will return to that position and
    continue there. See the documentation for more, including an
    example. (Robin Sommer, Corelight).

  * Support &eod for vector parsing. (Robin Sommer, Corelight)

  * Fix Sphinx helper script that emits command lines. (Robin Sommer,
    Corelight)

0.4.0-1106 | 2020-12-10 10:10:16 +0000

  * Make capture groups available inside hooks of regular expression fields.
    (Robin Sommer, Corelight)

    Example:

         x: /(a.c)(de*f)(h.j)/ {
    print $1, $2, $3;
}

    This will print the pieces corresponding to the three groups inside the
    expression.

    Couple notes:

        - We don't make $0 available as that would be the same as `$$`.

        - Matching with capture groups is more expensive that without. If
          you don't use any groups in the regexp, the overhead is
          automatically removed. If you use groups, but don't need them to
          capture, add `&nosub` to the field.

  * Make new captures() method available on regexp matching state in
    HILTI. (Robin Sommer, Corelight)

  * Fix argument mismatches between Spicy generated C++ prototypes and
    Zeek plugin runtime code. (Robin Sommer, Corelight)

  * Fix compile error on non-JIT version of plugin, and fix unsafe use
    of string_view. (Robin Sommer, Corelight)

  * Fix warnings reported by Apple's compiler. (Robin Sommer,
    Corelight)

0.4.0-1093 | 2020-12-10 08:39:26 +0100

  * Switch runtime library to use "fiber" library instead of libtask.
    We now leverage https://github.com/simonfxr/fiber. (Benjamin
    Bannier, Corelight)

  * GH-599: Fix construction of `Bytes`. (Benjamin Bannier, Corelight)

  * GH-603: Disable precompiled headers if we are building with GCC.
    (Benjamin Bannier, Corelight)

  * GH-94: Explicitly enable leak checking on tests relying on it being
    active. (Benjamin Bannier, Corelight)

  * GH-492: Add unit tests for IntrusivePtr. (Benjamin Bannier,
    Corelight)

  * Make run-zeek script also work with ASAN on macOS. (Benjamin
    Bannier, Corelight)

  * Remove unused Zeek compiler driver variable. (Benjamin Bannier,
    Corelight)

  * Add missing runtime cleanups in a few places. (Benjamin Bannier,
    Corelight)

  * Fix some documentation links and link checking. (Benjamin Bannier)

  * Fix GitHub link. (Robin Sommer, Corelight)

0.4.0-1071 | 2020-11-30 18:16:35 +0000

  * Series of speed-ups to the Spicy compiler. (Robin Sommer, Corelight)

    - Add caching of derived information to some AST nodes.
    - Use optional_ref<T> for returning references of AST node attributes instead of copies. (Robin Sommer, Corelight)
    - Cache location instances.
    - Returning const references for lots of accessor methods. (Robin Sommer, Corelight)
    - Mark two AST node classes as singletons.
    - Switch AST infrastructure from shared_ptr to IntrusivePtr.
    - Use forward declaration for nlohmann:json where we can.

  * Relabel profiling collector names in JIT code. (Robin Sommer, Corelight)

  * Fix for type erasure profiling. (Robin Sommer, Corelight)

0.4.0-1057 | 2020-11-23 08:35:04 +0000

  * GH-584: Add new vector methods resize/sub/at. (Robin Sommer, Corelight)

  * Revert accidental unbumping of tinyformat. (Benjamin Bannier, Corelight)

0.4.0-1053 | 2020-11-18 08:33:32 +0000

  * GH-568: Change parsing of look-ahead vectors to use a loop instead
    of recursion. (Robin Sommer, Corelight)

  * GH-583: Fix `foreach` inside a unit hook. The `foreach` attribute
    wasn't passed on, and the '$$' lookup didn't work inside a
    non-inline hook. (Robin Sommer, Corelight)

  * GH-574: Implement and document hook priorities. Robin Sommer,
    Corelight)

  * GH-389: Add additional tuple constructor expression (`tuple(...)`).
    (Robin Sommer, Corelight)

  * GH-544: Let Zeek plugin search for HLTO files at startup. By
    default, the plugin now loads all *.hlto files found in
    `$prefix/lib/spicy/Zeek_Spicy/modules/`. This can be changed by
    setting the environment variable SPICY_MODULE_PATH to a
    colon-separated list of directories to search. (Robin Sommer,
    Corelight)

  * Force upgrade to well-defined BTest version in our Docker
    containers. (Robin Sommer, Corelight)

  * Forward Zeek plugin's debug messages to Zeek's debug logger. That
    means that 'zeek -B plugin-_Zeek-Spicy' will send them into Zeek's
    debug.log. (Robin Sommer, Corelight)

0.4.0-1031 | 2020-11-17 14:05:32 +0100

  * GH-571: Fix padding handling when formatting nan and inf values.

    This patch bumps tinyformat to a version containing the upstream fix for
    https://github.com/c42f/tinyformat/issues/76 (and the follow up fix
    https://github.com/c42f/tinyformat/pull/80).

    We also add a regression test.

    Closes #571. (Benjamin Bannier, Corelight)

  * GH-589: Fix "'_debug’ was not declared in this scope" build error (Robin Sommer, Corelight)

  * Mention header precompilation in installation docs. (Benjamin Bannier, Corelight)

  * Disable precompiled headers for gcc CI job.

    While mixing GCC and Clang with precompiled headers is an issue for JIT
    (JIT always uses Clang to compile modules while precompiled headers are
    created with the compiler used to compile Spicy itself), we disable
    precompiled headers for the non-JIT, GCC job since GCC emits a
    non-suppressible warning, see
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89808,

        build/hilti/runtime/include/hilti/rt/libhilti.h:3:9: error: #pragma once in main file [-Werror]
            3 | #pragma once
              |         ^~~~
        cc1plus: all warnings being treated as errors

    Instead of not treating warnings as errors anymore we disable precompiled
    headers in this build since it does not use them anyway. (Benjamin Bannier, Corelight)

  * Add missing include. (Benjamin Bannier, Corelight)

  * Optionally precompile libhilti.h.

    This patch adds precompilation of libhilti.h for developer setups. This
    header is included in all files during JIT, and precompiling it can for
    individual files reduce JIT time by up to 30%. This behavior can be
    disabled by setting the CMake option `HILTI_DEV_PRECOMPILE_HEADERS=OFF`.

    Specifically, we add a cmake target which creates debug and release
    versions of a precompiled libhilti.h. We modify HILTI's built-in
    CXXFLAGS to check for the presence of the needed precompiled header in
    the expected location. We expect the header either in a specific
    location in the build directory, or optionally in a version directory in
    `$HOME/.cache/spicy`.

    In this patch we enable use of the precompiled header only during JIT,
    but e.g., not when building Spicy targets. This allows us to profit from
    faster JIT while still making efficient use of e.g., ccache.
    Additionally, this approach allows us to punt on fixing a number of
    issues in header files which get exposed during JIT (JIT artifacts are
    not affected at the moment).

    The original goal was to precompile lihilti.h before installation which
    is not reached. In general, it seems that precompiled headers are not
    intended to be moved after creation. This poses a challenge when the
    header gets installed: while we could in principle generate the
    precompiled header at the final location during install time, this seems
    not reliably possible when generating packages which can be expanded in
    arbitrary locations.

    Additionally, we also install a script for users to take advantage of
    precompiled headers once Spicy has been installed. (Benjamin Bannier, Corelight)


0.4.0-1020 | 2020-11-12 11:04:57 +0000

  * Fix performance regression by removing wasteful formatting of debug message
    in release mode in Spicy runtime driver. (Robin Sommer, Corelight)

  * Fix fiber result handling on abort. (Robin Sommer, Corelight)

  * GH-578: Fix glib decompression. Robin Sommer, Corelight)

  * Add helper tool 'spicy-batch-extract' that extracts a single session out
    of a Spicy batch file. (Robin Sommer, Corelight)

  * Add preliminary benchmark script `scripts/run-benchmarks`. See developer
    docs for more. (Robin Sommer, Corelight)

0.4.0-1011 | 2020-11-05 17:09:53 +0100

  * GH-451: Support building on centos7 (Benjamin Bannier, Corelight)

0.4.0-1006 | 2020-11-05 12:56:56 +0000

  * GH-497: Add support for packet analyzers to Zeek plugin. (Robin Sommer,
    Corelight)

    Zeek's master branch received support for adding low-level "packet
    analyzers" through plugins. This extends the Spicy plugin to support that.
    The documentation gained a new section explaining how to sue that.

    Note: This feature will not "officially" be supported until Zeek 4.0
    comes out (because we don't have Zeek master in CI).

  * Add --zeek-version argument to spicy-config. (Robin Sommer, Corelight)

  * Compile fix for GCC on Ubuntu. (Robin Sommer, Corelight)

0.4.0-1001 | 2020-11-05 08:47:23 +0000

  * Use stable names for hook implementations, plus a text fix.

0.4.0-999 | 2020-11-04 15:18:45 +0100

  * Use a lightweight lambda class to callbacks executing on fibers. (Benjamin Bannier, Corelight)

  * Require all callbacks executing on fibers to return something. (Benjamin Bannier, Corelight)

  * Remove unused type_info::overload. (Benjamin Bannier, Corelight)

  * GH-546: Model `TypeInfo` with a union instead of a `std::variant`. (Benjamin Bannier, Corelight)

0.4.0-994 | 2020-11-03 09:22:40 +0000

  * Update test baseline. (Robin Sommer, Corelight)

0.4.0-993 | 2020-11-02 16:09:13 +0000

  * GH-159: Add some missing operator<< to runtime library. This now lets
    "-X trace" work for Spicy parsers. (Robin Sommer, Corelight)

  * GH-531: Make generated grammar symbols globally unique during Spicy
    codegen. (Robin Sommer, Corelight)

  * GH-176: Avoid infinite recursion when printing ASTs with self-recursive
    types. (Robin Sommer, Corelight)

  * Fix premature library shutdown in spicy-dump, which could lead to crashes
    during cleanup of the parsed unit. (Robin Sommer, Corelight)

  * Fix error message in validator. (Robin Sommer, Corelight)

  * Aggressively compress package artifact for static build. (Benjamin Bannier,
    Corelight)

  * Remove packaging tasks for static CI build. Static builds tend to produce
    very large binaries which cannot reliably be compressed to be inside Cirrus
    CI's 1GB artifact size limit. (Benjamin Bannier, Corelight)

  * Fix documentation source link. (Benjamin Bannier, Corelight)

  * Consistently use `hilti::rt::filesystem` instead of `std::filesystem`.
    (Benjamin Bannier, Corelight)

0.4.0-979 | 2020-10-23 14:11:27 +0000

  * GH-95: Zeek plugin: Respect %port and %mime-type properties in
    units. (Robin Sommer, Corelight)

  * GH-513: Catch if an interval's number of seconds is out of range.
    (Robin Sommer, Corelight)

  * Clean up parsers' bounds checking of signed integer values. (Robin
    Sommer, Corelight)

  * GH-515: Change {
        time, interval
    }::nanoseconds() to return integers
    instead of real. (Robin Sommer, Corelight)

  * Fix bashism in test helper script. (Robin Sommer, Corelight)

  * GH-490, GH-507: Provide error message when attempting to have
    spicy-driver compile inputs when JIT is not available. (Robin
    Sommer, Corelight)

  * Reject regexp unit fields that aren't constant. (Robin Sommer, Corelight)

  * GH-524: Fix spicy-driver usage message. (Robin Sommer, Corelight)

  * GH-526: Show executable's name in usage/error messages of binaries
    replying on the spicy-driver host code. (Robin Sommer, Corelight)

  * GH-527: Updating usage output in docs. (Robin Sommer, Corelight)

  * GH-528: Clarify spicyc's error message on needing HLTO filenames
    with -o. (Robin Sommer, Corelight)

  * GH-529: Clarifying libhilti's usage() fallback message. (Robin
    Sommer, Corelight)

  * GH-540: Fix bug in regular expression parsing. (Robin Sommer,
    Corelight)

  * GH-270: Fix for unit filters. (Robin Sommer, Corelight)

  * GH-500: Remove --include-linker option from driver. The better way
    to do all this is using "-l" to generate *just* the linker code,
    then compile the two together as two compilation units. (Robin
    Sommer, Corelight)

  * GH-499: Provide has_label() method for enum values. Returns true
    if the enum maps to a known type value other than Undef. (Robin
    Sommer, Corelight)

  * GH-556: Fix coercion of optional. (Robin Sommer, Corelight)

  * GH-481: Correctly set locale in centos8 image. (Benjamin Bannier,
    Corelight)

  * Use working and stable link in host application documentation.
    (Benjamin Bannier, Corelight)

  * Fix documentation to reference latest support alpine version.
    (Benjamin Bannier, Corelight)

  * GH-546: Use plain function pointers for type info accessors.
    (Benjamin Bannier, Corelight)

0.4.0-946 | 2020-10-23 09:35:04 +0200

  * GH-522: Switch filesystem impl over to ghc::filesystem.

    Closes #522. (Benjamin Bannier, Corelight)

  * Fix use of uninitialized value when numbering unit fields.

    When were using a non-const member function to call a delegated base
    class constructor. Since at the point where the member function was
    called the derived class was not fully constructed, the members it
    accessed and mutated were uninitialized, we were reading from an unset
    variable, attempting to set it, and then overwrote its values when the
    member initializer was triggered (after the base class was constructed).
    This lead to unit field indices set to large value which were not usable
    down the line.

    We now delegate maintaining the field counter to a mixin class which can
    be constructed before the base class needing its state. (Benjamin Bannier, Corelight)

0.4.0-939 | 2020-10-21 14:35:30 +0200

  * GH-521: Do not create copies when loading HLTO libraries. (Benjamin Bannier, Corelight)

0.4.0-935 | 2020-10-12 07:13:46 +0000

  * Add support for new %print hook to Spicy units. (Robin Sommer,
    Corelight)

    This allows a unit to customize its appearance when printed (or
    more generally: rendered into a string).

    Example:
#cat test.spicy
        public type Test = unit {
        on % init { print self; }
    f1:
        uint32;
    f2:
        uint8;
        on % done { print self; }

        on % print {
            local f1 = "-";
            local f2 = "-";

                if ( self?.f1 )
                    f1 = "%s" % self.f1;

                if ( self?.f2 )
                    f2 = "%s" % self.f2;

                return "%s|%s" % (f1, f2);
        }
    };

#printf '\x00\x00\x00\x01\x02' | spicy - driver test.spicy
        -|-
        1|2

  * Allow customizing the string rendering of HILTI structs. If a
    struct provide a hook __str__(), that will be used instead of the
    built-in rendering of all its fields. (Robin Sommer, Corelight)

  * Make ID getter method constant. (Robin Sommer, Corelight)

0.4.0-930 | 2020-10-09 18:10:13 +0200

  * Change `Stream::data` and `stream::View::data` to return a `Bytes`
    instead of a `string`. (Benjamin Bannier, Corelight)

  * Test & CI updates. (Benjamin Bannier, Corelight)

    - Add a CI master step to validate Homebrew formula works.
    - Add missing Cirrus CI instance to Homebrew task.
    - Build compiler toolchain by default when configuring directly from CMake.
    - Bump default Zeek package in Docker images to more recent version.
    - Fix removal of build directory in CentOS 8 Docker container.
    - Increase sleep amount in test to make time measurable in CI.
    - Speed up test `spicy.types.unit.trimming`.

  * Help clang-tidy understand control flow in a couple of places.
    (Benjamin Bannier, Corelight)

0.4.0-918 | 2020-10-06 12:23:08 +0200

  * Introduce the notion of Spicy-specific compiler options.

    So far, we only had codegen options for the HILTI compiler. This
    change allows Spicy to track options as well that control specifics of
    how the Spicy-to-HILTI code generations operates. Includes a couple of
    things:

            - As there's no appropriate global state on the Spicy side
              where we could story options easily, we extend the
              HILTI-side options struct with the notion of "auxiliary
              options", described by key/value pairs. Spicy can then store
              its options in there.

            - We derived a separate spicy::Driver from hilti::Driver to
              customize behaviour.

            - We introduce hooks into the hilti::Driver to add support for
              additional command line options. This remains a bit ad-hoc
              for now. At some point, we'll clean up of command-line
              handling generally works across the various tools, we have
              quite a bit of code duplication there right now.

            - This introduces a Spicy-side `-Q` option to record stream
              offsets during parsing. Right now, the option isn't having
              any effect yet, the implementation is going to come in a
              subsequent commit. spicy-dump's previous `-o` is renamed to
              `-Q` as well. (Robin Sommer, Corelight)

  * Add an option to emit data offsets from spicy-dump.

    This patch adds an option `-o` to `spicy-dump` which can be used to
    trigger outputting of the stream offsets where unit fields were parsed
    from. (Benjamin Bannier, Corelight)

  * Make parser struct `__offset` member accessible from Values. (Benjamin Bannier, Corelight)

  * Store field offsets during parsing. (Benjamin Bannier, Corelight)

  * Make unit fields store their unit-wide field counter.

    Initially the parser will create unit fields as `UnresolvedField`s. This
    patch adds an `_index` field and accessor for this field which will
    be used to number all unit fields in the final, fully constructed and
    resolved unit so offsets can be computed. (Benjamin Bannier, Corelight)

  * Store whether a struct field is internal on type level. (Benjamin Bannier, Corelight)

  * Fix `type::struct_::Field::is*` methods to return booleans.

    These functions were previously returning optional field values which
    carry no information beyond being set or not. This patch changes these
    methods to return booleans instead. (Benjamin Bannier, Corelight)

  * Fully type constructions of empty optional values. (Benjamin Bannier, Corelight)

  * Make `rt::Map::contains` `const`. (Benjamin Bannier, Corelight)

0.4.0-906 | 2020-10-06 08:11:53 +0200

  * GH-511: Fix order of flags in spicyc usage message.

  * GH-512: Fix typo in error message.

0.4.0-903 | 2020-09-28 18:42:38 +0000

  * Reorganize source code to allow for building the runtime library
    standalone. This adds a corresponding configure option:
    --build-toolchain=yes/no (default: yes)

  * Add configure option --disable-zeek-plugin-install to disable
    installing the Zeek plugin into Zeek's plugin path. (Robin Sommer,
    Corelight)

  * Add CMake module that enables Zeek plugins to build Spicy parsers.

  * Rename Zeek plugin to "_Zeek::Spicy" to work-around a loading
    order issue in Zeek. (Robin Sommer, Corelight)

  * Turn all 3rdparty code into proper git submodules. (Robin Sommer,
    Corelight)

  * Make using Gold linker default in CMake config. This is no change
    from when using "configure", but it changes the default when
    running "cmake" directly. (Robin Sommer, Corelight)

  * Fix configuration of Gold linker to apply to cmake modules as
    well. (Robin Sommer, Corelight)

  * Extend hilti-config and spicy-config with options to print the
    runtime's C++ include directories. (Robin Sommer, Corelight)

  * Avoid needing "which" in configure. (Robin Sommer, Corelight)

  * Disable a couple unit tests when running as root. (Robin Sommer,
    Corelight)

  * Fix compiler warning. (Robin Sommer, Corelight)

0.4.0-890 | 2020-09-28 18:41:08 +0000

  * Port Zeek plugin to current Zeek master. (Robin Sommer, Corelight)

  * GH-508: Prevent loss of precision when codgening Time
    constructors. (Benjamin Bannier, Corelight)

  * GH-503: Fix constructor `interval_ns` to accept unsigneds like
    documented. (Benjamin Bannier, Corelight)

  * Include `netinet/in.h` for `in[6]_addr` in `rt/address.h`.
    (Benjamin Bannier, Corelight)

  * Fix whitespace in spicy-driver batch usage string. (Benjamin
    Bannier, Corelight)

0.4.0-884 | 2020-09-08 07:39:00 +0000

  * Reimplement HILTI's stream type to substantially improve
    performance. (Robin Sommer, Corelight)

  * Move resolving of exceptions' backtrace symbols to point-of-use
    for improving performance. (Robin Sommer, Corelight)

  * Fix problem with fiber reuse. (Robin Sommer, Corelight)

  * Fix a unit test that's using multiple filters. (Robin Sommer,
    Corelight)

  * Add macOS work-around for problem with doctests' platform
    detection. (Robin Sommer, Corelight)

  * When configured for debug mode, build tests without -O and link
    them against {hilti,spicy}-rt-debug. (Robin Sommer, Corelight)

0.4.0-874 | 2020-08-27 14:21:57 +0200

  * Update parser lookup tables exclusively from `spicy::rt::init`.

    We previously were updating `globalState()->parsers_by_mime_type` from
    `registerParser` while `globalState()->parsers_by_name` was updated by
    `init`. This patch makes `init` the only function updating the parser
    lookup tables `parsers_by_name` and `parsers_by_mime_type`. (Benjamin Bannier, Corelight)

  * Remove unintentional `return` in `rt::haveEod`. (Benjamin Bannier, Corelight)

  * Avoid creating vain global state in `spicy::rt::{
            done, isInitialized
        }`. (Benjamin Bannier, Corelight)

  * Reinitialize default parser when reinitializing spicy::rt library. (Benjamin Bannier, Corelight)

0.4.0-861 | 2020-08-24 13:04:33 +0200

  * Diagnose invalid `zlib::Stream`s.

    When a `zlib::Stream` enters a failed state it cannot be reused
    anymore. Previously we would return empty data whenever such a stream
    was used again nevertheless. Since empty data is a valid result of
    decompressing non-empty input this leaves users with no good way to
    catch such scenarios after the fact.

    This patch modifies `zlib::Stream::decompress` to now throw an exception
    instead of returning valid but empty data. (Benjamin Bannier, Corelight)

0.4.0-855 | 2020-08-24 10:56:17 +0000

  * Fix Cirrus CI file for Alpine 3.12. (Robin Sommer, Corelight)

0.4.0-854 | 2020-08-24 08:41:23 +0000

  * Switch Dockerfile for Alpine from 3.11 to 3.12.

  * Compile code with debug information also when in release mode.
    (Robin Sommer, Corelight)

  * Compile the toolchain with -O3 instead of -O2. (Robin Sommer,
    Corelight)

  * Always link against thread library. The performance of some of our
    runtime code depends on whether the executable is linked against
    pthread or not. (Robin Sommer, Corelight)

0.4.0-849 | 2020-08-24 08:39:14 +0000

  * Fiber runtime library updates. (Robin Sommer, Corelight)

    - Fix state tracking in fibers. When taking a fiber from the
      cache, we would reset its state on INIT, which then led to
      restarting it from scratch instead of reusing the already
      running loop.

    - Add a function to fill the fiber cache with preinitialized
      instances.

    - Track number of fiber initialization in statistics.

    - Unify fiber debug logging.

0.4.0-843 | 2020-08-21 13:10:42 +0200

  * Consistently deal with `std::filesystem` still being experimental in hilti-rt. (Benjamin Bannier, Corelight)

0.4.0-840 | 2020-08-21 10:04:02 +0200

  * Prevent use after free in `rt::base64::finish`. (Benjamin Bannier, Corelight)

0.4.0-833 | 2020-08-19 11:06:44 +0200

  * Add assertion catching out-of-bounds HILTI module access. (Benjamin Bannier, Corelight)

  * Add check to prevent nullptr dereference in `hilti::rt::done`. (Benjamin Bannier, Corelight)

  * Add missing context cleanup in `hilti::rt::done`.

    We configure a `Context` owned by `GlobalState` in `hilti::rt::init`.
    Since we destruct that context in `hilti::rt::done` we also need to
    reset the context as we would otherwise leave a dangling refernence
    behind. (Benjamin Bannier, Corelight)

  * Call out gitlint in commit message style guidelines. (Benjamin Bannier, Corelight)

  * Remove guidance on not rebasing development branches. (Benjamin Bannier, Corelight)

  * Add developer manual section on pre-commit linters. (Benjamin Bannier, Corelight)

  * Add pre-commit linter for commit messages. (Benjamin Bannier, Corelight)

0.4.0-819 | 2020-08-19 11:05:55 +0200

  * Explicitly set locale in centos Docker container.

    `hilti::rt::init` needs to be able to set the locale on the host system
    and will abort with a fatal error if it cannot do so. This patch makes
    sure this is possible in the centos-8 Docker container provided by us.

    Note: This already worked in BTests since its config file enforces the
    needed environment variables. This patch fixes it also for standalone
    usage of Spicy (and now e.g., the `locale` command emits no more
    errors). (Benjamin Bannier, Corelight)

0.4.0-817 | 2020-08-18 11:24:52 +0200

  * Add `hilti::rt::Library::symbol`.

    This patch adds a new member function `Library::symbol` which can be
    used to obtained a symbol from a specific library.

    While currently `Library` users just call `::dlsym` globally to obtain a
    symbol, this becomes ambiguous if multiple libraries in the process image
    provide similarly named symbols. Instead they could hold handles to
    all interesting libraries and obtain symbols with the added function.
    With that we could also `::dclose` libraries in the `Library`
    destructor; we'll leave that change for a later point. (Benjamin Bannier, Corelight)

  * Fix warning potentially emitted from `rt::Library` destructor. (Benjamin Bannier, Corelight)

  * Fix format string in `rt::createTemporaryFile`. (Benjamin Bannier, Corelight)

  * Extend error message when `rt::Library::save` fails. (Benjamin Bannier, Corelight)

  * Change CI job to use non-privileged user.

    At least on ubuntu `root` seems to be able to modify even read-only
    directories which makes it hard to write tests checking handling of
    permission errors.

    Change the image used in CI to use a non-privileged user instead. (Benjamin Bannier, Corelight)

  * Change directory used for ccache store in CI.

    We were originally using `/var/spool/ccache` which could require
    extended privileges to create. Switch over to use `/tmp/ccache` which
    should be easier to create even for unprivileged users. (Benjamin Bannier, Corelight)

  * Prevent `rt::Resumable::get` from leaking non-HILTI exceptions. (Benjamin Bannier, Corelight)

  * Make `hilti::rt::Resumable`'s operator bool explicit. (Benjamin Bannier, Corelight)

  * Consistently provide stringification for all exceptions. (Benjamin Bannier, Corelight)

  * Add comparison operators to `rt::Backtrace`. (Benjamin Bannier, Corelight)

  * Fix `to_string_for_print` for `DeferredExpression`.

    Since `DeferredExpression` is a template itself we cannot specialize the
    master template of the `detail` namespace; instead we need to provide an
    overload. (Benjamin Bannier, Corelight)

0.4.0-798 | 2020-08-14 07:25:00 +0000

  * CI: Move Zeek package specs back into tasks to work around Cirrus
    issue, per https://github.com/cirruslabs/cirrus-ci-docs/issues/692.
    (Robin Sommer, Corelight)

0.4.0-796 | 2020-08-14 07:20:31 +0000

  * Embed version information into HLTO files that encodes information
    about the HILTI version/config they were built with.  (Robin
    Sommer, Corelight)

    We use this for detecting (1) mismatches in the HITLI version used
    for building vs running, and (2) running an optimized HLTO file
    with a debug runtime. In both cases, the runtime will print a
    warning to stderr, but still proceed processing the library.

    Note that this is breaking change that will prevent HLTOs built
    with earlier versions from loading now.

  * Add option -U to tools that summarizes runtime resource
    consumption at termination. The measurement excludes time spent
    for startup/termination. (Robin Sommer, Corelight)

  * Use cout/cerr in debug logger instead of reopening them
    separately. Output can get mixed up otherwise if other places
    write to cout/cerr directly. (Robin Sommer, Corelight)

  * Update nlohmann-json and move to top-level 3rdparty directory.
    (Robin Sommer, Corelight)

0.4.0-789 | 2020-08-11 07:47:30 +0000

  * Lots of new test coverage for HILTI runtime library: references,
    debug logger, configuration, safe-int, iterator, backtrace; along
    with related fixes and cleanups. (Benjamin Bannier, Corelight)

0.4.0-737 | 2020-08-11 07:39:31 +0000

  * Fix exception handling across library boundaries. (Robin Sommer,
    Corelight)

  * Allow limiting the "%port" of a unit to a specific direction.
    (Robin Sommer, Corelight)

    We now allow to add attributes `&originator`/`&responder` to a `%port`
    unit property to limit it to the corresponding direction of a session.
    When selecting a parser through `--parser <port>` in spicy-driver, one
    can now add `%orig` or `%resp` to the port to indicate the desired
    directionality. If one leaves that off, only parsers are selected that
    have no directionlity defined (i.e., just like it used to be).

  * Add batch input mode to spicy-dump. spicy-dump gains an option -F
    to process multiple interleaved input streams pre-recorded in a
    batch input file. The format of that file is described in the
    manual, and there's a Zeek script generating batch files from PCAP
    input traces.  (Robin Sommer, Corelight)

  * When naming a parser to use through "spicy-driver -p XXX", one can
    now also specify a port ("80/tcp") or a MIME type
    ("application/text") if the desired Spicy unit defines a
    corresponding property. See the documentation of spicy-driver for
    more. (Robin Sommer, Corelight)

  * Port Zeek plugin to new driver stateful matching API. (Robin
    Sommer, Corelight)

0.4.0-730 | 2020-08-11 07:38:44 +0000

  * Switch to Zeek 3.2.0 release packages for CI. (Robin Sommer,
    Corelight)

  * Add helper Makefile to build and run the CI docker image locally.
    (Robin Sommer, Corelight)

0.4.0-725 | 2020-08-05 12:44:26 +0200

  * Remove conversion of `rt::Time` to `bool`. (Benjamin Bannier, Corelight)

  * Fix assignment operator for `rt::Union` of non-copyable types. (Benjamin Bannier, Corelight)

  * Fix format string error possibly triggered when adding Times and Intervals. (Benjamin Bannier, Corelight)

0.4.0-716 | 2020-08-03 22:24:56 +0200

  * Make default-constructed `rt::Address` instances invalid. (Benjamin Bannier, Corelight)

  * Make `rt::Address` remember its address family.

    This class was previously unable to distinguish IPv4 and IPv6 addresses
    with all bits sets to zero from each other. By explicitly storing its
    address family we are able to distinguish them, and can also preserve
    the address family across operations like masking. (Benjamin Bannier, Corelight)

  * Bump doctest to 2.4.0. (Benjamin Bannier, Corelight)

  * Validate prefix length inputs when constructing `rt::Network` values. (Benjamin Bannier, Corelight)

0.4.0-703 | 2020-08-03 07:41:51 +0000

  * GH-444: Port Zeek plugin to Zeek 3.2. (Robin Sommer, Corelight)

  * GH-323: Suppress bogus warning by Zeek when installing our plugin.
    (Robin Sommer, Corelight)

  * Extend EVT file syntax with @if/@else/@endif preprocessor directives.

    For now, we support one type of expression for "@if": a Zeek version check. Example:

        @if ZEEK_VERSION < 30200
        ....
        @else
        ....
        @endif (Robin Sommer, Corelight)

    Also collecting all the Zeek includes into zeek-compat.h. (Robin Sommer, Corelight)

  * Fix frequent off-by-one errors in EVT error message locations.
    (Robin Sommer, Corelight)

0.4.0-691 | 2020-07-31 15:19:57 +0200

  * Emitted fully typed initializer lists in codegen.

  * Correctly handle flipping with zero valid bytes in `rt::integer::flip`. (Benjamin Bannier, Corelight)

  * Add additional precondition checks to `rt::integer::bits`. (Benjamin Bannier, Corelight)

  * Consistently use `ntohX` type functions for `rt::integer::ntohX`. (Benjamin Bannier, Corelight)

0.4.0-681 | 2020-07-23 14:55:25 +0000

  * Fix potential invalid iterator deref in debug output. (Robin Sommer, Corelight)

  * Add operator "bytes += uint8" for adding a single byte. (Robin Sommer, Corelight)

  * Fix missing filter end-of-input signal. (Robin Sommer, Corelight)

  * GH-423: Remove C{,XX}_SYSTEM_INCLUDE_DIRS cmake flags. (Robin
    Sommer, Corelight)

    If this functionality is needed, set CXX_FLAGS instead during
    configure, e.g.:

        CXXFLAGS="-isystem /opt/rh/devtoolset-9/root/usr/include/c++/9" ./configure ...

  * GH-441: Fix generation of lists of reserved words. (Robin Sommer, Corelight)

  * GH-449: Fix documentation example. (Robin Sommer, Corelight)

0.4.0-670 | 2020-07-20 15:25:04 +0000

  * GH-415: Add missing type coercion for parameterized types. (Robin
    Sommer, Corelight)

  * GH-395: Fix tuple constructor expressions to not return a type
    until all elements are fully resolved. (Robin Sommer, Corelight)

  * GH-402: Allow switch statements without any "case". (Robin Sommer,
    Corelight)

  * GH-387: Extend a test's life time. (Robin Sommer, Corelight)

0.4.0-661 | 2020-07-16 07:06:14 +0000

  * Fix build failures from building against Zeek 3.2 dev versions.
    (Tim Wojtulewicz, Corelight)

0.4.0-659 | 2020-07-16 06:34:30 +0000

  * GH-352: Add chapter on custom host applications to manual. (Robin
    Sommer, Corelight)

  * Series of smaller documentation updates. (Robin Sommer, Corelight)

    * Add documentation for types time/interval/optional.
    * Add list of reserved keywords.
    * Update debugging sections.
    * Add note about commutativity to operator documentation where applicable.
    * Add note about checking if optional unit variables remains unset still.
    * Fix typo in documentation for 'print'.
    * Fix an operator's description.

  * GH-408: Remove "time + time" operator. (Robin Sommer, Corelight)

  * GH-404: Add `time_ns(X)` and `interval_ns(X)` expressions to
    instantiate values with nanosecond resolution. (Robin Sommer,
    Corelight)

  * Extend `{hilti,spicy}-config` with a `--dynamic-loading` option.
    This adapts `--ldflags` for applications that want to dynamically
    load precompiled parsers. (Robin Sommer, Corelight)

  * Make `&cxxname` usable for user code: The code generator now
    automatically adds prototypes for the corresponding C++ functions.
    To optionally disable that, a new attribute `&have_prototype` has
    been added. We also no longer require explicit global scoping for
    `&cxxname` IDs. (Robin Sommer, Corelight)

  * Fix joint usage of options `spicyc` options `-cKo`. This would end
    up saving only the linker code, not the combined parsing + linker
    code, in the specific output file. (Robin Sommer, Corelight)

0.4.0-645 | 2020-07-16 06:33:23 +0000

  * GH-423: Update configure's usage message. (Robin Sommer,
    Corelight)

  * GH-433: Add support for declaring constants with explicit types.
    (Robin Sommer, Corelight)

0.4.0-641 | 2020-07-14 06:13:11 +0000

  * GH-429: Fix generation of C++ prototypes for host applications.
    (Robin Sommer, Corelight)

0.4.0-639 | 2020-07-13 10:01:31 +0000

  * GH-400: Fix build with static libraries. (Robin Sommer, Corelight)

  * Fix ill-defined order of internal HILTI plugin execution. (Robin
    Sommer, Corelight)

  * Remove JIT's {init,finish}Runtime() methods. They were no-ops
    already. (Robin Sommer, Corelight)

0.4.0-634 | 2020-07-09 12:32:17 +0200

  * Lots of new & updates unit tests for the HILTI runtime. (Benjamin Bannier, Corelight)

  * Remove `AddressFamily::` prefix when stringifying values. (Benjamin Bannier, Corelight)

0.4.0-612 | 2020-07-08 15:21:20 +0000

  * GH-39: Add `spicy-dump`, a new standalone command line application
    that compiles and executes Spicy parsers on the fly and prints out
    the parsed information at the end in either a readable, custom
    ASCII format, or as JSON. (Robin Sommer, Corelight)
#echo "GET /index.html HTTP/1.0" | spicy - dump my - http.hlto
        MyHTTP::RequestLine {
        method:
            GET uri : / index.html version : MyHTTP::Version {
            number:
                1.0
            }
        }

#echo "GET /index.html HTTP/1.0" | spicy - dump - J my - http.hlto
        {
            "method" : "GET", "uri" : "/index.html", "version" : { "number" : "1.0" }
        }

  * GH-56: Add reflection API to libhilti for dynamic, runtime
    inspection of parsed units. This includes:

      * A "typeinfo(X)" expression for HILTI that, at runtime, wwill
        yield a pointer to a new `hilti::rt::TypeInfo`` struct
        describing the type of `X`, which can be a type or an
        expression.

      * `include/rt/type-info.h` builds out a comprehensive set of
        classes to describe HILTI types, and to access their values
        generically, at runtime.

      * A 3rd kind of host application-side parse function for public
        units. Spicy's driver's processInput() now uses that.

  * Change string rendering of ports to skip "Protocol::" prefix.
    (Robin Sommer, Corelight)

  * Fix bug in move assignment operator of ValueReference. (Robin
    Sommer, Corelight)

  * Add stringification for exception type. (Robin Sommer, Corelight)

  * Add stringification for "any" type. (Robin Sommer, Corelight)

  * Add missing &internal attributes to some codegenerated struct
    fields. This hides them from user visible output. (Robin Sommer,
    Corelight)

  * Add equality operator to regexp type. (Robin Sommer, Corelight)

  * Add operator<< for regexp. (Robin Sommer, Corelight)

  * Support anonymous namespaces in C++ output. (Robin Sommer,
    Corelight)

  * Add missing printer code for iterator<set> and iterator<map>.
    (Robin Sommer, Corelight)

  * Add const version of vector iterator's dereference operator.
    (Robin Sommer, Corelight)

  * Add -O0 to libhilti/libspicy for debug builds.  (Robin Sommer,
    Corelight)

0.4.0-572 | 2020-07-08 11:36:53 +0200

  * Fix parsing of `rt::Port` for out-of-range port values. (Benjamin Bannier, Corelight)

0.4.0-552 | 2020-07-03 15:47:06 +0200

  * Switch `real::unpack` error reporting to use `rt::Result`. (Benjamin Bannier, Corelight)

0.4.0-549 | 2020-07-01 15:03:27 +0200

  * Remove unintended conversion of `rt::Result` to `bool`.

0.4.0-547 | 2020-07-01 11:41:06 +0200

  * GH-392: Fix handling of vector of bools. (Benjamin Bannier, Corelight)

0.4.0-544 | 2020-07-01 09:35:52 +0200

  * Remove `hilti::rt::List` in favor of `hilti::rt::Vector`. (Benjamin Bannier, Corelight)

0.4.0-538 | 2020-06-30 08:08:16 +0000

  * Fixed semantics of `hilti::rt::Interval`-bool conversions. They
    now return true for non-zero intervals. (Benjamin Bannier,
    Corelight)

  * Add tests of `rt::Interval` stringification. (Benjamin Bannier, Corelight)

  * Add tests of `result::Error` stringification. (Benjamin Bannier, Corelight)

0.4.0-532 | 2020-06-30 08:03:40 +0000

  * Add a DHCP analyzer. (Benjamin Bannier, Corelight)

  * Fix filename in getting started docs. (Dirk Loss)

  * Move reporting logic for --report-times so that it always executes
    when the HILTI-side driver destructs. (Robin Sommer, Corelight)

  * Fix header inclusion in Spicy plugin. (Benjamin Bannier, Corelight)

  * Remove unused `is_optional` type trait. (Benjamin Bannier,
    Corelight)

  * Enable translation of optional types on the Spicy-Zeek interface.
    (Benjamin Bannier, Corelight)

0.4.0-525 | 2020-06-26 14:55:08 +0200

  * Add dedicated method to resize and assign a vector. (Benjamin Bannier, Corelight)

0.4.0-522 | 2020-06-24 22:24:34 +0200

  * Fix `hilti::rt::is_optional` so it applies to const and ref of optionals also. (Benjamin Bannier, Corelight)

0.4.0-520 | 2020-06-24 06:59:04 +0000

  * GH-398: Remove duplicate spicy-driver CMake target. (Benjamin
    Bannier, Corelight)

0.4.0-518 | 2020-06-24 06:50:48 +0000

  * GH-140: Add "&requires"/"%requires" unit attribute/property.
    (Robin Sommer, Corelight)

    Fields may now use an attribute ``&requires=EXPR`` to enforce
    additional constraints on their values. ``EXPR`` must a be boolean
    expression that will be evaluated after the parsing for the field
    has finished, but before any hooks execute. If ``EXPR`` returns
    ``False``, the parsing process will abort with an error, just as
    if the field had been unparsable in the first place.

    One can similarly enforce conditions globally at the unit level
    through a property ``%requires = EXPR``, which will be evaluated
    once the unit has been full parsed, but before any ``%done`` hook
    executes. If ``EXPR`` returns ``False``, the unit's parsing
    process will abort with an error.

  * Add Doxygen output to Sphinx documentation. It's integrated into
    the "Read the Docs build". Locally, "make doxygen" will run it.
    (Benjamin Bannier, Corelight)

  * Clean up Sphinx custom extension. (Benjamin Bannier, Corelight)
    - Remove use of `sphinx.locale.l_`
    - Format with autopep8.

0.4.0-510 | 2020-06-23 16:16:43 +0200

  * GH-386: Add codegen for Spicy time difference. (Benjamin Bannier, Corelight)

0.4.0-508 | 2020-06-22 06:03:34 +0000

  * Series of improvements for utility infrastructure (Benjamin Bannier, Corelight)
      - Add tests for `util::escapeBytes`.
      - Add tests for some functions in `hilti::rt::util`.
      - Extend list of supported escape characters in hilti::rt escaping functions.
      - Fix `rt::split` for trailing delimiters.
      - Fix edge cases rt::atoi_n.
      - Fix typos in `hilti/rt/util.h`.
      - Make `rt::util::tuple_for_each` also work on rvalues.
      - Make documentation for `hilti::rt::rtrim` more specific.
      - Remove unused `escape_control` argument to `util::escapeBytes`.
      - Use raw character literals in some `hilti::rt::utils` tests.

  * Fix extraction of event priority in EVT files. (Benjamin Bannier, Corelight)

0.4.0-496 | 2020-06-18 15:46:44 +0000

  * GH-381: Have the code generator fully declare enum types directly
    as part of the forward-declarations block. (Robin Sommer, Corelight)

  * GH-380: Corrections to tutorial. (Duffy Ocraven)

  * Adding short "Next Steps" section to tutorial. (Robin Sommer, Corelight)

0.4.0-492 | 2020-06-17 10:41:13 +0200

  * Move hilti's `util` namespace into the `hilti` namespace. (Benjamin Bannier, Corelight)

0.4.0-490 | 2020-06-17 10:36:36 +0200

  * GH-228: Prevent more overflows when working with hilti::rt Time and Interval (Benjamin Bannier,
    Corelight)
    - Change `hilti::rt::Interval` to use safe integers.
    - Change `hilti::rt::Time` to use safe integers.
    - Fix some typos in `hilti/base/util.h`.
    - Remove hilti-rt-tests dependency on hilti library.
    - Reorganize test cases for `hilti::util`.

0.4.0-484 | 2020-06-16 07:15:25 +0000

  * Add new tutorial chapter. (Robin Sommer, Corelight)

  * Add Zeek-side option "Spicy::enable_print" to control whether the
    output of Spicy-side "print" output is shown. Default is off
    (which is a change in behaviour compared to previous versions).

  * Clean up representation of type arguments and function calls in
    auto-generated operator reference. (Robin Sommer, Corelight)

  * Make the target stream of hilti::print() configurable. Default
    remains standard output. Leaving it unset will silence
    hilti::print(). (Robin Sommer, Corelight)

  * Do not use use "using X === ..." for forward-declaring struct
    types in C++ output, as that could accidentally pull in IDs from
    outer namespaces. (Robin Sommer, Corelight)

  * Fix scanner for accepting comment lines at end of file without
    terminating newline. (Robin Sommer, Corelight)

0.4.0-477 | 2020-06-15 07:36:43 +0000

  * GH-293: Fix precedence of "in" operator. (Robin Sommer, Corelight)

  * GH-319: When using &convert with a list expression, transparently
    turn the result into a vector. (Robin Sommer, Corelight)

  * GH-324: Fix error message that was too specific about source type.
    (Robin Sommer, Corelight)

  * GH-325: Fix a couple of segfaults in scope builder when hitting
    invalid code. (Robin Sommer, Corelight)

  * Update spicy-driver usage message. (Robin Sommer, Corelight)

  * Handle unknown options in getopt() consistently in driver code.
    (Robin Sommer, Corelight)

  * GH-344: Type check assignments and fix constness propagation.
    (Robin Sommer, Corelight)

  * GH-345: Validate type of &default expressions. (Robin Sommer,
    Corelight)

  * Add more debug information about constness to AST. (Robin Sommer,
    Corelight)

0.4.0-467 | 2020-06-15 07:18:03 +0000

  * Redo testing of `hilti::rt::Stream` and clean up implementation (Benjamin Bannier, Corelight)
    - Add Doxygen documentation to `rt::Stream`.
    - Add `begin` and `end` methods for `rt::list::Empty`.
    - Add additional nullptr checks when accessing `rt::Stream` iterator chunks or contents.
    - Fix escaping of `rt::Stream` and `rt::View` in stringification
      to ensure all non-printable byte sequences are escaped.
    - Make `rt::stream::View` iterators be safe by default.
    - Prevent nullptr dereference in `rt::Stream` iterator `chunk` and `content`.
    - Remove `rt::Stream::safe_[begin|end]`.
    - Remove `rt::stream::View::safe_[begin|end]`.
    - Remove `safe_begin` and `safe_end` extension points.
    - Remove unused `Chunk::begin`.
    - Remove unused `rt::Stream::chain` function.
    - Remove unused `rt::Stream::compare` functions.
    - Remove use of unsafe iterators in a few places.
    - Rename `rt::iterator::safe_range` to drop the 'safe' qualifier.
    - Add lots of tests new cases, and reorganize exists test cases.

  * Add `begin` and `end` methods for `rt::list::Empty`. (Benjamin
    Bannier, Corelight)

0.4.0-430 | 2020-06-12 08:07:16 +0200

  * Reenable some already passing clang-tidy checks. (Benjamin Bannier, Corelight)

0.4.0-428 | 2020-06-12 08:06:23 +0200

  * GH-274: Unbreak build for when other Spicy headers are already installed.

    If Spicy headers were already installed into a path somewhere in the
    include lookup, we could have found the same header twice, preferring
    the installed header over the one of the current checkout. This could
    have lead to diagnostics about duplicate definitions since due to use of
    `#pragma once` in our headers the compiler would not have detected that
    a header was already included (and even if it would have detected this,
    it would have included the incorrect header).

    This patch adds include paths from the current checkout before any
    system paths.

0.4.0-426 | 2020-06-09 17:16:13 +0000

  * Increase CI memory limit for Ubuntu Docker further. (Robin Sommer,
    Corelight)

  * GH-352: Fix Zeek link in README. (Robin Sommer, Corelight)

0.4.0-424 | 2020-06-09 15:22:26 +0000

  * GH-355: Allow access to unit parameters inside default expressions for unit
    variables. (Robin Sommer, Corelight)

  * GH-315: Fix autogen-spicy-lib to extract multi-line comments.
    (Robin Sommer, Corelight)

0.4.0-417 | 2020-06-08 10:26:32 +0000

  * Increase CI memory limit for GCC further. (Robin Sommer, Corelight)

  * Fix GCC warning. (Robin Sommer, Corelight)

0.4.0-415 | 2020-06-08 08:28:19 +0000

  * GH-368: Fix &convert for vectors of enums. (Robin Sommer, Corelight)

  * Add missing HILTI printer code for "unset" operator. (Robin
    Sommer, Corelight)

0.4.0-411 | 2020-06-05 07:28:40 +0000

  * GH-361: Fix construction of vectors with element types that
    provide default values. (Robin Sommer, Corelight)

  * GH-365: Zeek plugin: Catch if more parameters are given in an EVT
    spec than Zeek expects. (Robin Sommer, Corelight)

  * Remove branch name from Cirrus CI emails due to API limitations.
    (Benjamin Bannier, Corelight)

0.4.0-406 | 2020-06-04 09:14:27 +0000

  * GH-354: No longer allow dashes inside identifiers. (Robin Sommer, Corelight)

  * GH-350: Restrict parsing of attributes and properties to avoid
    ambiguities. (Robin Sommer, Corelight)

  * Clean up the expression mode in the Spicy Bison parser. (Robin Sommer, Corelight)

    This comes with a couple of grammar changes to avoid ambiguitues:

        - "new X" no longer allows full expressions for X, just values or
          identifiers.

        - Switch cases that use look-ahead now also need to be introduced
          with an arrow, e.g.:

               switch {
      ->a : A;
      ->b : B;
      ->c : C;
  };

  * Reduce resources requested from Cirrus. (Robin Sommer, Corelight)

  * Make iterators into vectors ordered. (Benjamin Bannier, Corelight)

  * GH-343: Fix duplicate evaluation of if-condition when used with
    &parse-at. (Robin Sommer, Corelight)

  * Add validation check for initializations that use the ID that's
    currently being declared. (Robin Sommer, Corelight)

  * Fix mailing list links in README. (Robin Sommer, Corelight)

0.4.0-393 | 2020-06-04 08:41:28 +0200

  * Rework implementation of `hilti::rt::Bytes`.
   - Add test cases for `rt::Bytes` member functions.
   - Fix construction of `rt::Bytes` from string and charset.
   - Fix handling of undefined byte order in ByteOrder conversions to integers.
   - Prevent throwing `std::out_of_range` from `rt::Bytes::extract`.
   - Add additional safety to `bytes::Iterator`.
   - Made some `rt::Bytes` methods `const`.
   - Remove rvalue overload of `rt::Bytes::str`.

  * Fix ADL for `rt::to_string`. (Benjamin Bannier, Corelight)

  * Fix `rt::util::split` for empty delimiter case. (Benjamin Bannier, Corelight)

0.4.0-364 | 2020-06-04 08:40:25 +0200

  * Make functions of `rt::string` throw instead of triggering internal errors
    for invalid input. (Benjamin Bannier, Corelight)

0.4.0-362 | 2020-06-02 15:20:59 +0000

  * GH-282: Set PATH when building documentation so that we find the
    Spicy tools. (Robin Sommer, Corelight)

  * GH-348: Fix integer overflows in regexp parsing & matching.
    (Robin Sommer, Corelight)

0.4.0-356 | 2020-05-28 10:23:04 +0000

  * Small documentation updates, including some notes on DPD
    integration and standalone plugin builds. (Robin Sommer,
    Corelight)

0.4.0-348 | 2020-05-27 13:03:22 +0200

  * GH-335: Add http_all_headers() event to HTTP EVT file.

    The event isn't used anywhere by default in Zeek, but it's a nice
    example of transforming Spicy information on the fly to match a
    Zeek-side event signature.

# 335(Robin Sommer, Corelight)

0.4.0-346 | 2020-05-27 13:00:28 +0200

  * jrx: Fix leak in `jrx_match_state_done`. (Benjamin Bannier, Corelight)
  * jrx: Fix test harness. (Benjamin Bannier, Corelight)
  * Fix leaks of jrx state when copying `regexp::MatchState`. (Benjamin Bannier, Corelight)
  * jrx: Allow copying from const. (Benjamin Bannier, Corelight)
  * Bump doctest to 2.3.8. (Benjamin Bannier, Corelight)

0.4.0-325 | 2020-05-27 06:49:26 +0000

  * GH-333: Validate that unit fields have parseable types. (Robin Sommer, Corelight)

  * GH-330: Add range check to port parsing in EVT files. (Robin
    Sommer, Corelight)

  * GH-335: Add support for converting maps from Spicy to Zeek. (Robin
    Sommer, Corelight)

  * Send emails for successful CI builds. (Benjamin Bannier, Corelight)

0.4.0-318 | 2020-05-26 10:07:38 +0000

  * Change Slack links to point to Zeek's Connect page. (Robin Sommer, Corelight)

0.4.0-317 | 2020-05-25 09:54:25 +0200

  * GH-286: Fix regexp handling to respect &size. (Benjamin Bannier, Corelight)

0.4.0-311 | 2020-05-21 07:54:43 +0000

  * Fix JIT-less build of Zeek plugin. (Robin Sommer, Corelight)

0.4.0-309 | 2020-05-20 12:35:36 +0000

  * GH-299: Support compiling the Zeek plugin without JIT support.
    (Robin Sommer, Corelight)

    If configured with `--disable-jit`, the Zeek plugin will now still
    be built and will support loading pre-compiled HLTO files. The
    plugin will have dependencies only on system libraries, and hence
    can be installed on systems that don't have the Spicy libraries
    available.

    There's also a new configure option `--disable-jit-for-zeek` that
    disables JIT support just for the Zeek plugin, creating the same
    dependency-free result.

  * GH-83: Add standalone tool spicyz to precompile analyzers for
    Zeek. (Robin Sommer, Corelight)

    This replaces the previous shell wrapper around Zeek, meaning that
    we can now precompile Zeek analyzers without actually relying on
    having a Zeek binary itself available. (We continue to require
    access to the Zeek development headers.)

    As a bonus feature, the new spicyz comes with an option "-c
    <prefix>" that, instead of producing a fully compiled HLTO, just
    writes out all the generated C++ code into files, each named
    "<prefix>-<module ID>.cc". This goes along way towards supporting
    compiling Spicy analyzers statically into an application, similar
    to how BinPAC is being used (GH-72).

  * Fix for Bison versions >= 3.6. (Robin Sommer, Corelight)

0.4.0-295 | 2020-05-20 07:23:14 +0000

  * Fix a couple typos in documentation. (Robin Sommer, Corelight)

0.4.0-293 | 2020-05-19 06:57:49 +0000

  * Rework implementation of `hilti::rt::List`. (Benjamin Bannier, Corelight)

    - Hide that `rt::List` inherits from `std::list` from users.
    - Make iterators of `rt::List` safe.
    - Add tests for `rt::List`.

0.4.0-286 | 2020-05-18 10:38:44 +0000

  * Remove FAQ pointer from README. (Robin Sommer, Corelight)

  * Fix bug in EVT reading. (Robin Sommer, Corelight)

0.4.0-284 | 2020-05-18 08:29:49 +0000

  * GH-237: Add library function `spicy::strftime`. (Benjamin Bannier,
    Corelight)

0.4.0-282 | 2020-05-18 08:28:08 +0000

  * GH-312: Fix comment parsing in EVT files. (Robin Sommer,
    Corelight)

0.4.0-280 | 2020-05-15 07:11:01 +0000

  * Rework implementation of `hilti::rt::Map`. (Benjamin Bannier, Corelight)

    - Hide that `rt::Map` inherits from `std::map` from users.
    - Make iterators of `rt::Map` safe.
    - Slim down `AssignProxy`.
    - Fix `rt::Map::get`.
    - Add test for `rt::Map` stringification.

  * Fix display of compiler flags in JIT debug log. (Benjamin Bannier, Corelight)

  * Document using Docker Hub images. (Benjamin Bannier, Corelight)

0.4.0-270 | 2020-05-14 07:00:54 +0000

  * Clean up example code. (Robin Sommer, Corelight)

  * Change structure of example section, and add more links. (Robin
    Sommer, Corelight)

  * Make autogen-docs script more robust. (Robin Sommer, Corelight)

  * Fix documentation of -= and /= opertators. (Robin Sommer, Corelight)

0.4.0-264 | 2020-05-13 14:18:08 +0000

  * Add an end-to-end TFTP analyzer for Zeek, it comes with a Zeek
    script producing a typical ``tftp.log`` log file. This analyzer is
    a good introductory example because the Spicy side is pretty
    straight-forward. (Robin Sommer, Corelight)

  * GH-306: Do not fail documentation build for broken links.
    (Benjamin Bannier, Corelight)

0.4.0-260 | 2020-05-12 10:37:16 +0000

  * Documentation updates. (Robin Sommer, Corelight)

    - GH-230: Fix a series of smaller inaccuracies and typos. Reported by Duffy Ocraven.
    - Document list type.
    - Include CHANGES into the documentation's release notes.
    - Update link to macOS LLVM binaries. (Robin Sommer, Corelight)

  * Clean up parsing of list constructor. (Robin Sommer, Corelight)

  * Clean up cast operators. (Robin Sommer, Corelight)

  * Remove a couple of empty source files. (Robin Sommer, Corelight)

0.4.0-251 | 2020-05-12 10:33:24 +0000

  * Redo implementation of `hilti::rt::Set`. (Benjamin Bannier, Corelight)

    - Hide that `rt::Set` inherits from `std::set` from users.
    - Make iterators of `rt::Set` safe.
    - Add test of rt::Set stringification.

0.4.0-245 | 2020-05-11 08:39:49 +0000

  * Redo implementation of `hilti::rt::Vector`. (Benjamin Bannier, Corelight)

    - Hide that `rt::Vector` inherits from `std::vector` from users.
    - Replace iterators of `rt::Vector` with safe alternatives.
    - Add Doxygen comments to `rt::Vector`.
    - Remove support for stringification of `std::vector` in hilti::rt.
    - Add test for stringification of `Empty` vector.
    - Make `rt::MIMEType` default-constructible.
    - Fix includes of `rt/mime.h`.
    - Use less ambiguous form for generated `rt::Vector` constructors.

  * Require Zeek plugin for Zeek protocol parser tests. (Benjamin
    Bannier, Corelight)

0.4.0-234 | 2020-05-11 08:33:55 +0000

  * GH-229: Add a Spicy function to render bytes as hex string.
    (Benjamin Bannier, Corelight)

        ## Returns a bytes value rendered as a hex string.
        public function bytes_to_hexstring(value: bytes) : string;

  *GH - 200 : Add library function `spicy::getenv()` to retrieve environment variables.(Robin Sommer, Corelight)

                  ##Returns the value of an environment variable,
      if set.public function getenv(name
                                    : string)
      : optional<string>;

  * GH-200: Add option -f to `spicy-driver` to read input from file.
    (Robin Sommer, Corelight)

  * Use fully qualified IDs for internal `&cxxname` in libraries
    `hilti.hlt` and `spicy.spicy`. (Benjamin Bannier, Corelight)

  * Fix shell commands in `docker/Makefile`. (Benjamin Bannier,
    Corelight)

0.4.0-226 | 2020-05-06 15:12:52 +0000

  * Apply a set of tweaks to specifics of &size. (Robin Sommer,
    Corelight)

    - We now enforce that a field consumes all its &size characters of
      input, unless explicitly overridden where a types allow for that
      (as, e.g., "bytes" does with an additional &eod).

    - We slightly change semantics for parsing bytes: A &size of zero
      will now set the field an empty bytes value; it used to leave
      the field unset.

    - Document that &size works with all fields (which it already
      did).

    - Clean up the implementation of &size.

  * GH-289: Do not perform look-ahead parsing for vectors fed from
    &parse-from/at. (Robin Sommer, Corelight)

  * GH-288: Rename "&until_including" attribute to "&until-including".
    (Robin Sommer, Corelight)

  * GH-269: Add support for "&until-including" when parsing bytes.
    (Robin Sommer, Corelight)

  * GH-286: Fix Bison parser's attribute association for regular
    expressions. (Robin Sommer, Corelight)

  * Add an "unset" operator to HILTI's struct type to clear optional
    types. (Robin Sommer, Corelight)

0.4.0-216 | 2020-05-05 12:25:40 +0000

  * GH-212: Resize eagerly when accessing out-of-bounds Vector
    elements. (Benjamin Bannier, Corelight)

0.4.0-214 | 2020-05-04 10:51:06 +0000

  * GH-267: Fix spicy-build to support absolute output paths. (Robin
    Sommer, Corelight)

  * GH-275, GH-276: Sort options in the usage messages of various
    tools. (Robin Sommer, Corelight)

0.4.0-208 | 2020-05-04 10:49:21 +0000

  * Use doctest test suites as top-level grouping. (Benjamin Bannier,
    Corelight)

  * GH-268: Properly escape data when stringifying streams. (Benjamin
    Bannier, Corelight)

0.4.0-203 | 2020-05-03 15:37:30 +0000

  * GH-265: Require unit properties to end with a semicolon. We were
    inconsistent with that. Note that this will break existing code
    that wasn't using the semicolons, including some examples from the
    documentation (which have been updated). For example, it's now
    `%filter;` instead of `%filter`. (Robin Sommer, Corelight)

  * GH-266: Fix missing validation of unit properties. (Robin Sommer,
    Corelight)

  * GH-262: Allow signs in intN/uintN() constructors. (Robin Sommer,
    Corelight)

  * GH-254: Make UTF8 default for bytes::decode(). (Robin Sommer,
    Corelight)

  * GH-248: Fix AST inconsistency with how modules were stored in
    scopes. (Robin Sommer, Corelight)

  * GH-263: Improve error messages for unresolved operators and IDs.
   (Robin Sommer, Corelight)

  * Improve suppression of repetitive errors. (Robin Sommer,
    Corelight)

  * Avoid leaking passwords into command lines in `docker/Makefile`.
    (Benjamin Bannier, Corelight)

0.4.0-189 | 2020-04-30 10:33:54 +0000

  * GH-196: Reject container constructors with inconsistent types, and
    coerce elements once the type is known. (Robin Sommer, Corelight)

0.4.0-187 | 2020-04-30 10:26:13 +0000

  * Improve `vector` implementation. (Benjamin Bannier, Corelight)

        - Fix semantics of safe mutating access to `hilti::rt::Vector` elements.
        - Remove broken `rt::Vector::set`.
        - Fix includes of `hilti/rt/types/vector.h`.
        - Add unit test for a couple of `hilti::rt::Vector` methods.`

  * GH-272: Document precompiled MacOS packages. (Benjamin Bannier, Corelight)

0.4.0-179 | 2020-04-29 15:15:14 +0200

  * GH-192: Remove internal errors that we ended up running into during AST
    validation. (Robin Sommer, Corelight)

  * GH-178: Fix spurious semicolons in C++ output and potential problem in C++
    block rendering (Robin Sommer, Corelight)

0.4.0-173 | 2020-04-29 08:20:21 +0000

  * Report column information in error messages. Locations are emitted
    as `<line>:<character>` so that e.g., the second character on the
    fourth line would be displayed as `4:2`. This extends to ranges as
    well which look e.g., like `1:1-2:30`. (Benjamin Bannier,
    Corelight)

0.4.0-171 | 2020-04-28 19:08:50 +0000

  * Add a section to the development manual on the structure of the
    runtime libraries. (Robin Sommer, Corelight)

  * Fix `hilti::rt::to_string` for character literals. (Benjamin
    Bannier, Corelight)

  * GH-179: Enable `hilti::rt::to_string` for `std::vector`. (Benjamin
    Bannier, Corelight)

  * Remove return of rvalue when generating parse functions. (Benjamin
    Bannier, Corelight)

0.4.0-162 | 2020-04-28 10:14:01 +0000

  * GH-219: Clean up string interface exposed by `rt::Bytes` to
    remove overloading ambiguities. (Benjamin Bannier, Corelight)

  * GH-257: Fix documentation whitespace issues and remove outdated
    FIXMEs around usages of `Result`. (Benjamin Bannier, Corelight)

0.4.0-154 | 2020-04-27 11:58:00 +0000

  * GH-242: Suppress any output from doc's `make check` by default.
    (Benjamin Bannier, Corelight)

  * GH-251: Ignore package links in documentation linkcheck.
    (Benjamin Bannier, Corelight)

  * Edit pass on documentation's reassembly section. (Robin Sommer,
    Corelight)

0.4.0-148 | 2020-04-24 13:19:22 +0000

  * GH-226: Add CI setup for building published Docker images. This
    patch adds an `update_dockerhub` target to `docker/Makefile`,
    which builds, tests and uploads images to Dockerhub. It also
    changes the Dockerfiles in `docker/` back to include Spicy build
    commands, so that they become practically self-documenting
    (Benjamin Bannier, Corelight).

  * GH-222: Output changes to make rendered ASTs easier to parse
    (Benjamin Bannier, Corelight)

0.4.0-140 | 2020-04-24 09:18:51 +0000

  * Tune update-changes configuration. (Robin Sommer, Corelight)

  * GH-245: Fix typo in documentation. (Dominik Charousset)

0.4.0-136 | 2020-04-23 16:53:22 +0000

  * Update link in README. (Yacin Nadji)

  * Fix link to FAQ in README.

  * Remove left-over debug output from DNS grammar.

0.4.0-130 | 2020-04-23 10:44:12 +0000

  * GH-170: Change "+<int>" to create a signed integer value. It used
    to create an unsigned integer.

  * GH-225: Preserve parentheses inside expressions during code
    generation.

  * GH-231: Add range check to digits in Spicy's atoi_n().

  * GH-210: Catch & report broken escape sequences in HILTI/Spicy code
    at parse time.

  * GH-217: Fix code generation of escaped C++ string literals.

0.4.0-120 | 2020-04-22 15:40:34 +0000

  * Fix package artifact links in docs.

  * Fix documentation links to Spicy mailing lists.

  * Fix issue base URL in documentation.

  * Add documentastion build target to check links.

  * Fix package creation in CI.

0.4.0-114 | 2020-04-22 13:17:05 +0000

  * Make sure auto-generated documentation items have stable ordering.

  * Cache CI ccache even if build failed.

0.4.0-111 | 2020-04-22 10:23:15 +0000

  * Build documentation from documentation folder instead of from a
    symlink inside the build directory.

0.4.0-109 | 2020-04-21 11:40:41 +0000

  * Execute CI jobs automatically.

  * Fix potential sign-unsigned mismatch in comparison.

  * Fix unused variable warning.

0.4.0-105 | 2020-04-21 10:41:25 +0000

  * Update documentation links in README.

0.4.0-104 | 2020-04-21 10:15:14 +0000

  * Tweak documentation build for standalone operation.

  * GH-172: Re-add missing autogenerated usage for spicy-build.

  * Add map & set to the auto-documented types.

0.4.0-96 | 2020-04-21 08:27:51 +0000

  * GH-129: Add infrastructure and documentation for providing binary
    packages.

0.4.0-91 | 2020-04-21 07:38:18 +0000

  * GH-174: Fix a number of smaller documentation issues.

  * GH-191: Change bytes iterator's deref operator to return uint8
    instead of uint64, and fix implementation to no longer use a
    signed integer ingternally.

  * GH-153: Prettify error messages for fmt() problems.

  * GH-154: Fix crash when accessing an unknown tuple element.

  * GH-171: Fix spelling in some diagnostic messages.

  * GH-175: Catch unresolved unit fields during validation.

  * GH-198: Show functions as "<function>" when rendering them.

  * GH-203: Add type check for elements in vector/set/map constructors.

  * GH-204: Remove support for legacy syntax for parsing sequences.
    "vector<T>" is no longer supported for parsing sequences; one must
    now use the new "T[]" syntax instead.

  * Remove Spicy's legacy list type (which was just an alias for
    "vector").

  * GH-181: Validate correct usage of struct/unit parameters.

  * Add a number of validation checks for unit hooks.

  * GH-195: Add range check for bytes' to_int() base parameter, which
    now must be between 2 and 36.

  * GH-155: Overhaul AST error reporting for more concise error
    messages.

  * GH-119: Generally include location information when throwing
    runtime exceptions.

  * Add packaging to CMake setup and CI jobs.

  * Set proper CMake project version.

  * Execute installation tests in Docker CI tasks.

0.4.0-48 | 2020-04-15 16:56:28 +0000

  * GH-163: Fix initialization of &default struct parameters.

  * GH-156: Fix look-ahead parsing for vectors terminated through
    end-of-data.

  * GH-182: Fix "for" loop's type resolution for the iteration variable.

  * GH-180: Fix printing of bytes instances that have non-printable
    characters. This also changes how we print "\n/\r/\t" inside
    bytes: We now render them as "\xXX", like any other non-printable
    character.

  * Add missing 'Undef' to byte-order enum.

  * Add clang-format to pre-commit config.

  * Add minimal CI test runs for CentOS 8, Alpine 3.11, and Ubuntu
    19.10.

  * Clean up our Docker setup/usage.

0.4.0-29 | 2020-04-15 09:04:28 +0000

  * Add pre-commit check that generated docs are up-to-date.

  * Clean up spicy-doc-to-rst and make output stable.

  * Add auto-generated docs to the tree so that one can build the full
    documentation without needing to build Spicy itself.

0.4.0-20 | 2020-04-09 15:11:43 +0000

  * GH-159: Properly close quotes and parens in "hilti-flow" debug
    statement.

  * GH-146: Validate that &byte-order attributes have an argument.

0.4.0-16 | 2020-04-09 15:06:04 +0000

  * GH-92: Documentation updates.

0.4.0-13 | 2020-04-09 11:23:15 +0000

  * Copy edit "Getting Started".

0.4.0-11 | 2020-04-09 10:56:29 +0000

  * GH-145: Fix underlinking of hilti-rt library.

  * GH-147: Add a configure time check validating that submodules are
    in place.

  * Add more CI configurations, including for macOS.

0.4.0 | 2020-04-07 14:50:17 +0000

  * Starting CHANGES.
