XIRASM 0.3.5
Source

RELEASE HISTORY / NEWEST FIRST

Release notes

Each release's new features, fixes, performance work, and the library and documentation changes that affect how you use XIRASM.

0.3.5 LATEST FIRST
FEATURE

Android SDK types and native floating-point fields.

0.3.5 adds an Android SDK declaration entry point and 25 public NDK structure layouts, including explicit ARM32 variants, nested structures, arrays, unions, and callbacks. Meta/DSL structure and union fields support f32 and f64 with typed defaults, packed or natural alignment, and IEEE-754 byte emission. The catalog holds 22,956 exact provider records for 4,405 names in 25 libraries across five ABIs. Checked imports validate the image ABI, minimum API, library, and symbol kind; object imports use GOT slots with OBJECT dynamic-symbol types. Android tutorials and native demos use these types and imports. Includes backend 0.1.5.

FIX

Correct SPIR-V words and safer compile-time state.

0.3.4 follows the current SPIR-V 1.6 grammar and keeps extension schemas separate. It preserves hexadecimal floating-point payloads, corrects half and BFloat16 constants and 64-bit Switch literals, and keeps symbolic IDs and quoted strings separate from Meta expressions. Value-returning Meta functions preserve caller-owned mutable values, and empty writes retain reserve-tail trimming. The generated AArch64 library shares repeated encoding bodies. Includes backend 0.1.5; unsupported floating formats produce diagnostics.

PERFORMANCE

Less repeated work in Meta and DSL evaluation.

Version 0.3.3 removes two pieces of repeated work from Meta and DSL evaluation. A meta_if condition is parsed once and its parsed form reused, instead of being re-parsed on every execution of the statement, and operand.eval borrows the bindings captured with the operand instead of cloning them into a fresh scope on every call. A capture still means the values it was taken with, and the bytes encoded for the same source are unchanged.

FEATURE

SPIR-V IDs you can name, and errors on the line that failed.

0.3.2 lets a SPIR-V module name its result IDs. A numeric ID keeps the number it was written with and nothing is renumbered; a name is numbered from 1 upward in the order it first appears, skipping the numbers literals already use, so an entry point can be named before the function that defines it. A name that is never defined, or that is defined twice, is rejected at the line that caused it, and every SPIR-V text failure now reports the line that failed instead of the first line of the module.

PERFORMANCE

Faster AArch64 macro expansion.

Version 0.3.1 takes two copies out of the AArch64 macro path. A macro capture no longer deep-copies the generated instruction tables, and a read-only built-in borrows the collection it is handed instead of copying it first. The bytes encoded for the same source are unchanged, and the language behaves exactly as before.

FEATURE

The first release ready for real work.

0.3.0 is XIRASM's first release for actual use: source goes straight to runnable output; the documentation matches the assembler and every example in it has been assembled; Android builds an installable APK from native sources alone β€” no Java, no resource compiler, no third-party runtime.

  • Android, from native source to an installable APKA project writes its NativeActivity library, declares its resources and packages the archive without leaving XIRASM. The APK writer emits the ZIP container, the binary AndroidManifest.xml and a resources.arsc compiled from a res/ tree, while the resource table and the native libraries stay uncompressed and aligned the way Android requires.
  • Guides that match the assemblerThe format tutorial is rewritten in English and Chinese with one section order and the same examples in both, and a new Android guide carries a complete shared library instead of a stub. Every code block is annotated, and each example in the guides is assembled as a test.
  • The platform symbol catalog, checked against real devices25 Android libraries and 4,416 records carry each symbol's first available API level, alongside 1,168 header constants and 161 structure field offsets covering both Android data models. Every number is compiled back against the NDK headers as a static assertion.
  • Output read back by independent readersThe manifest, the resource table and the libraries are read back with the Android SDK tools and the LLVM readers, the resource table matching the platform resource compiler byte for byte across four fixtures, and the release packages ship native binaries for Windows, Linux and Apple Silicon.
  • Nesting is bounded, and failures say whereA few kilobytes of nested blocks or parentheses used to end the process with a stack overflow and no message at all. Statements now nest 128 levels, expressions and aggregate literals 64, and documents read at compile time 64, each reported with a location and a reason. A configuration file ending in two quotes no longer reads past its buffer, and an out-of-range escape is rejected instead of wrapping into the valid range.
  • A segment respects the alignment it declaresA shared object placed segment addresses by page congruence alone, so .bss and .data could land on addresses that broke the 8-byte alignment they declare. The file position now starts at that alignment, which moves the address and the file offset together. Every built-in format fixture is read back with an independent reader that checks extents, overlap, alignment, and the p_vaddr == p_offset (mod p_align) relation.
  • The command line says one thing once--isa is the official spelling and --target keeps working; aarch64, arm64, and a64 are all accepted directly; xirasm init --template replaces the previous four flags; an explicit --target x64 is no longer silently overridden by the project file. Passing an init-only option to an assembly points out where the platform is set.
  • A listing you can readListing rows lead with the address and keep the file offset as their own column; bytes the file holds but no fragment claims are listed with their contents instead of an empty cell; and a line produced by a macro expansion carries its depth and the call site that produced it.
FEATURE

The Android platform catalog, checked against real devices.

0.2.22 moves the NDK platform into the assembler: sources import platform libraries by name, structure fields use generated offsets, and the renderer example ships both device ABIs in one package.

  • 25 platform libraries behind one importThe catalog records which library provides each of 4,137 platform symbols, from which API level, on which ABIs. Importing a library file welds its name onto the import list, so a source never writes libz.so by hand and cannot pick a library that does not export the symbol.
  • Header constants and structure offsets1,168 constants and 161 field offsets generated from the NDK headers cover both Android data models β€” callback slots and stack frames use generated offsets instead of hand counting. Every number is compiled back against the headers as a static assertion.
  • Verified on a deviceA smoke library imports one sample symbol from every platform library and the loader resolves them all at load time; comparing the catalog against the symbols a device actually exports lands at 3,906 of 3,916. The renderer example runs on both ABIs, packed in one archive.
FEATURE

Android APKs, resource trees, and compressed entries.

0.2.21 finishes the last piece of the Android path: resource directories compile into the binary resource table, platform resource IDs resolve by name, archive entries support DEFLATE compression, and the Meta language can enumerate directories at assembly time.

  • An installable APK from one source fileThe APK writer emits the ZIP container, the binary AndroidManifest.xml, and resources.arsc, and it can carry the NativeActivity shared library assembled from the same project. There is no DEX, no Java source, and no third-party runtime; the shipped demo builds a 39 KB archive holding a GLES2 renderer.
  • Resource trees compile into resources.arscapk_res_dir scans a res directory: density and locale qualifiers, values tables, drawables, and raw files all become resources with the archive entries they need, in a deterministic order that rebuilds to the same bytes.
  • Framework resource IDs and compressed entriesA generated catalog exposes platform IDs such as @android:style/Theme.DeviceDefault, and deflate.compress with matching archive entries lets assets be stored compressed while shared libraries and the resource table stay uncompressed and aligned.
FEATURE

AArch64, Mach-O, and native Apple Silicon builds.

0.2.19 completes AArch64 instruction encoding, adds the Mach-O DSL for executables and object files, and ships native packages for Windows x86-64, Linux x86-64, and macOS AArch64.

  • Generated AArch64 encoding covers modern ARM64The checked-in ARM64 DSL covers scalar, memory, floating-point, SIMD, atomic, cryptographic, pointer-authentication, MOPS, and CSSC instruction families.
  • Mach-O joins the executable-format DSL libraryXIRASM source can now construct 64-bit Apple executables and object files alongside PE, COFF, and ELF outputs.
  • Native packages now cover three desktop platformsThe release ships Windows x86-64, Linux x86-64, and Apple Silicon macOS binaries, plus the existing VS Code extension and language server package.
FIX

More reliable x86 expression fixups.

Version 0.2.16 focuses on internal Zig implementation fixes for x86 expression fixups, range validation, and diagnostics. XIRASM syntax and public APIs are unchanged.

FIX

Constant immediates and multiline parameters fixed.

Constant expressions now resolve correctly when used as x86 immediate operands, and function declarations can split parameter lists across multiple lines.

VIEW CHANGE
PERFORMANCE

Buffered streams move data faster.

Bulk stream write, read, and flush paths now use compact x86-64 block copies. The public IO surface and ABI behavior remain unchanged.

  • Faster buffered transfersMeasured 64 to 4096 byte copies improved by roughly 2.5 to 50 times on a Ryzen 5 5600.
  • Smaller generated loopsEach stream expansion emits about 17 fewer bytes by replacing byte-at-a-time loops with rep movsb.
  • Keep byte operations for single bytesUse io_stream_write_byte and io_stream_read_byte for one-byte operations. The IO library remains experimental.
FEATURE

Executable formats, without the ceremony.

XIRASM 0.2.15 focuses on the format DSL, Win32 development support, and shorter practical documentation. ISA encoders and the assembler core remain unchanged.

  • Executable formats start with a mutable planPE, COFF, and ELF now use direct mutable plans. Batch imports and exports replace image0/image1 chains and repeated const rebinding, while Win32 API selections plug directly into PE imports.
  • Win32, GUID, and COM support is built inPartitioned includes provide 339 DLLs, 17,105 APIs, 93,534 constants, and 21,717 ABI aggregate types. Structures preserve signed fields; GUID, IID, CLSID bytes, and COM vtable offsets are ready to use.
  • Five practical chapters replace the large format manualStart with template choice, PE, ELF, object files, and common rules. Advanced construction remains separate for users who need direct control.
BACK TO XIRASM