Skip to content

Releases: odin-lang/Odin

dev-2021-06

01 Jun 11:05
Compare
Choose a tag to compare

New Language Features

  • Allow unions to be comparable if all the variants are comparable
  • Comparable unions allowed as map keys
  • Improve implicit selector expression inference rules with unions
  • Unified cond ? x : y and x if cond else y logic
  • Improve type inference system to allow &{} alongside &T{} in some cases
  • Change for in x..y behaviour to prevent the possibility of overflowing on maximum integer size and causing an infinite loop
  • Allow ..= alongside .. as a "full range" operator (..= will probably replace .. for ranges)
  • Remove @(static) for global variables
  • Add @(link_section=<string>) for global variables
  • Add intrinsics: mem_zero, mem_copy, mem_copy_non_overlapping, sqrt, ptr_offset, ptr_sub

Compiler Improvements

  • Tokenize ++ and -- as tokens but disallow them in the parser, and give better error messages for they are used as operators/statements
  • Add -verbose-errors
  • Improved parsing error messages
  • EXPERIMENTAL -use-separate-modules support (useful for speeding up code generation in development builds)
  • Correct SysV ABI edge cases
  • Array arithmetic code generation improvements for small arrays

Packages

  • package core:odin/printer
  • package core:odin/format
  • package core:odin/doc-format
  • package core:math improvements for f16
  • package core:image/png fixes
  • Added test.fail_now
  • Add soa_zip and soa_unzip to demo

Fixes

  • Numerous bug fixes

dev-2021-05 New Backend Release

01 May 17:49
Compare
Choose a tag to compare

Compiler Changes

  • Removal of the old backend which manually produced .ll files and passed them to the LLVM binaries directly
    • Removes need for llc and opt binaries
  • LLVM C API based backed as the main backend for all platforms and targets
    • Removes need for -llvm-api
  • Full debug symbols support for Windows (*nix is still experimental)
  • M1 ARM64/AARCH64 Support -target:darwin_arm64
  • -strict-style style as default
  • New Versioning System dev-yyyy-mm:sha
  • New flags
    • -build-mode modes:
      • llvm-ir
      • assembly
    • -o:<string> flag as an alternative to -opt:<integer>
      • Accepted values: mininal, size, speed
    • -vet-extra for extra vet checks (many usually false positives)
    • -microarch:<string>
    • -disallow-do
    • -default-to-nil-allocator
  • ODIN_ROOT environment variable to be able to change the root directory for the Odin root path
  • odin test
    • build ands runs procedures with the attribute @(test) in the initial package
  • odin doc
    • generate documentation from a .odin file, or directory of .odin files
    • -doc-format Generates documentation as the .odin-doc format (useful for external tooling)
  • Improvements to -vet
  • Many bug fixes

Language Changes

  • Ability to iterate on #soa types with a for-in loop
  • soa_zip (generate #soa type from slices)
  • soa_unzip (generate slices from #soa type)
  • make_soa and delete_soa
  • Allocator procedure signature change to support return a []byte and Allocator_Error code
  • Removal of intrinsics.x86_mmx
  • Remove #opaque types
  • Remove bit_field types
    • Prefer bits.bitfield_extract and bits.bitfield_insert procedures located in core:math/bits
  • Replace inline and no_inline with #force_inline and #force_no_inline, respectively
  • Improved #optional_ok logic
  • New procedure attributes:
    • @(disabled=<boolean>)
    • @(cold)
    • @(optimization_mode=<string>)
  • f16, f16le, f16be types
  • Removal of "pure" calling convention
  • Addition of "naked" calling convention (removes prologue and epilogue)
  • min(T)/max(T) support where T is a float
  • Make any struct comparable as long as all of its fields are comparable
  • Make any comparable type a valid map key type
  • //+build ignore tag
    • Useful for examples within a package

Core Library Changes

New Packages

  • core:bufio
  • core:bytes
  • core:c/frontend/tokenizer
  • core:c/frontend/preprocessor
  • core:compress
  • core:compress/gzip
  • core:compress/zlib
  • core:image
  • core:image/png
  • core:io
  • core:math/fixed
  • core:path (URI-like paths)
  • core:path/filepath (OS paths)
  • core:slice
  • core:sort
  • core:text/scanner

Experimental Packages

  • core:sync/sync2 (will replace core:sync when finished)

New Additions to package intrinsics

  • volatile_load
  • volatile_store
  • debug_trap
  • trap
  • alloca
  • cpu_relax
  • read_cycle_counter
  • count_ones
  • count_zeros
  • count_trailing_zeros
  • count_leading_zeros
  • reverse_bits
  • byte_swap
  • overflow_add
  • overflow_sub
  • overflow_mul
  • expect
  • type_has_field
  • type_proc_parameter_count
  • type_proc_return_count
  • type_proc_parameter_type
  • type_proc_return_type
  • type_polymorphic_record_parameter_count
  • type_polymorphic_record_parameter_value
  • type_field_index_of
  • type_equal_proc
  • type_hasher_proc

pre-dev-2021-04 Pre Old Backend Removal Release

26 Apr 10:55
Compare
Choose a tag to compare

Transitionary release for two things:

  • Replacing the Old Backend with the New Backend Transition Period #891
  • New Odin Versioning System for Pre Version 1.0 #887

Notes

Please use this release if you are still relying on the old backend for your projects.

Release notes will be published in the release in which the old backend is removed.

v0.13.0

30 Aug 16:52
31989c9
Compare
Choose a tag to compare

New Features

  • LLVM C API integration for Windows through -llvm-api
  • Experimental Support for -llvm-api for Linux and MacOS
  • union #maybe directive
  • Built-in Maybe type, e.g. Maybe(int) or Maybe(^T)
  • Selector Call Expressions x->y(123) == x.y(x, 123) (useful for COM APIs)
  • Allow .? to unwrap any union depending on the inferred context
  • Remove using import
  • not_in replaced notin
  • Relative pointers #relative(i16) ^Foo
  • Relative slices #relative (i16) []Foo
  • Add "pure" procedure types
  • Add new ternary expressions: x if cond else y and `x when cond else y
  • Support by-reference semantics for for value_ref, i in &some_array and for key, value_ref in &some_map
  • Allow map indices to be references &m[key] and return a valid pointer if exists otherwise nil
  • Allow referencing a compound literal &Foo{}
  • Slice literals will use stack memory within a procedure and global memory in a global scope
  • Add -subsystem flag for Windows
  • Allow shadowing for -vet with immutable parameters
  • @(force)/@(require) attributes for foreign import (they are equivalent)
  • Endian specific floats, i.e. f32le f64be
  • #optional_ok for procedures
  • Improved odin <command> help
  • -ignore-vs-search
  • Support --flag as redundancy for -flag
  • Add -extra-linker-flags:<string>
  • Add #config to replace #defined
  • Restrict #defined within procedure bodies to remove possible race conditions
  • Remove the need for type_of, size_of, align_of, and offset_of to be keywords (now regular identifiers)
  • Strip \r from raw string literals
  • Experimental Support for WASM
  • Add -target:<string> with fuzzy checking

Library Improvements

  • Improve package os
  • Add package unicode with basic letter querying
  • Add utf8.string_to_runes and utf8.runes_to_string
  • Add more intrinsics (cpu_relax, alloca, type_*, etc)
  • Add #const to enforce constant procedure parameters to variable parameters
  • Add package sys/windows which will replace package sys/win32 in the future
  • Add more helpers to package reflect
  • Remove context.stdout/stderr
  • Add package container
  • Add more hashes
  • More package sync features
  • More package thread features
  • New mem.Allocator_Modes Query_Features and Query_Info

Bug Fixes

  • Numerous core library bug fixes
  • Fix defer related bugs
  • Fix __dynamic_array_reserve edge cases with zero sized types
  • Improve System V ABI
  • Fix name mangling for @(private) entities
  • Fix time.now() being one day out on leap years after the leap month

v0.12.0

18 Jan 15:55
Compare
Choose a tag to compare

New Features

  • Indexed and ranged fields for array compound literals:
    • [?]int {0 = 123, 5..9 = 54, 10..<16 = 72}
  • Constant compound literals declarations
    • FOO :: [5]int{1, 2, 3, 4, 5};
  • #partial switch
    • Implement the previous #complete switch as the default behaviour
  • Enumerated Arrays:
    • [Enum_Type]Value
    • #partial [Enum_Type]Value
  • SOA Arrays, Slices, and Dynamic Arrays
    • #soa[N]T
    • #soa[]T
    • #soa[dynamic]T
  • New #simd type syntax
    • #simd[N]T
  • Add @(private="file") and @(private="package")
  • Make string type elements immutable, akin to char const * in C
  • Allow #no_bounds_check on an expression
  • Deprecate using import
  • Full System V ABI support
  • Remove requirement for vcvarsall.bat for Windows. Windows SDK and Binaries are found automatically
  • Add -help which prints information about the compiler flags
  • Add x y z w fields to quaternion types
  • Add r g b a fields to array types len(array) <= 4 alongside x y z w fields

Library Improvements

  • Improve package math
  • Add package math/linalg
  • Improve runtime/default_allocators.odin
  • Make default context.temp_allocator thread safe
  • Add strings.unsafe_string_to_cstring
  • Add strings.ptr_from_string
  • Support package thread on unix

Bug Fixes

  • Fix string reversal
  • Fix linux build
  • Fix System V bitcast/transmute bug
  • Fix os.write on darwin
  • Fix transmute of uintptr to/from proc
  • Fix fmt.string_to_enum_value
  • Fix mem.Arena
  • Fix using on array in struct
  • Fix -no-crt on Windows
  • Fix loadsatypos

v0.11.1

12 Nov 21:27
Compare
Choose a tag to compare

New Features

  • multivalued procedure calls allows in for in to allow a pseudo-iterator
  • @thread_local for variables in procedure
  • SOA Struct support intrinsics.soa_struct
  • 128-bit random procedures added to package math/rand
  • intrinsics.type_is_unsigned
  • -show-more-timings (More in-depth timings)

Bug Fixes

  • Fix linalg,mul and add linalg.Matrix1xN
  • Fix linalg.cross3 typo
  • Fix typeid comparison bug
  • Add extra messages for pointer address errors
  • Use runtime.mem_copy in package mem
  • //+build system
  • Fix inline for bug for #468
  • Fix "Polymorphic parameter declared in return type doesn't compile #464" by giving a conversion error (code wasn't handling polymorphic result types as intended)
  • Fix Slice passed incorrectly in LLVM IR to procedure called via procedure pointer #465
  • Fix big_int_or and big_int_xor

v0.11.0

01 Nov 19:50
Compare
Choose a tag to compare

New Features:

  • Ranged fields for array compounds literals
foo := [?]int {
	0 = 123,
	5..9 = 54,
	10..<16 = i*3 + (i-1)*2,
};
  • inline for loops (only for in based for loops)
inline for x, i in 1..<4 {
	fmt.println(x, i);
}
  • where clauses for procedures, structs, and unions
foo :: proc(x: [$N]int) -> bool
	where N > 2 {
	fmt.println(#procedure, "was called with the parameter", x);
	return true;
}
  • Proper System V AMD64 Support on Darwin and Linux
  • Built-in Quaternions (Not just an April Fool's Joke any more)
    • quaternion128 and quaternion256
  • Struct field tags
Foo :: struct {
	x: int    `tag1`,
	y: string `json:"y_field"`,
	z: bool, // no tag
};
  • New and improved package math
  • New package math/linalg
  • intrinsics.type_*
  • package reflect (replaces package types)
  • union #no_nil
  • mem.slice_data_cast
  • #panic
  • Add @force for foreign import
  • Add minor suggestions to errors on casts and assignments
  • Change ODIN_OS string for macos/osx "osx" to "darwin" to allow for other platforms
  • Add dummy packages purely for documentation of builtin and intrinsics

Updates:

  • Type inference improvements for call expressions and procedure group parameters
  • Update package odin_parser et al.
  • require_results is now an attribute rather than a suffix tag for procedures
  • Improved multi-threaded parser
  • Change the behaviour of foreign import on darwin to be more consistent with other platforms
  • fmt.print*_err has been replaced with fmt.eprint*
  • Consistent typeid semantics across all assignments
  • Improvements to package unicode/utf8

Bug fixes:

  • Fix ranges in switch statements for strings
  • Fix comparison for bit field values
  • Fix double-pointer indexing bug
  • Fix procedure group compiler assert with no matching arguments
  • Fix procedure constant declarations value type assignment checking
  • Fix disallow blank identifier polymorphic types $_
  • Fix unions with zero variants
  • Fix bounds checking on slices for constant parameters
  • Fix array comparisons
  • Fix ~(1 << x) inference bug
  • Fix Using any in if statement
  • Fix #complete switch with pointer case
  • Fix procedure group "best fit" algorithm for polymorphic procedures
  • Fix double calling of LHS of logical binary expressions
  • Fix stack overflow bug caused by polymorphic record with polymorphic parameters
  • Fix polymorphic record parameter determination bug caused by polymorphic constants not be handled correctly

v0.10.0

02 Jun 12:11
Compare
Choose a tag to compare
  • Implicit Selector Expressions
  • Half-closed range a..<b ([a, b))
    • This is alongside the closed range a..b ([a, b])
  • notin binary operator for map and bit_set types:
    • x notin y (equivalent to !(x in y))
  • Endian specific integers
    • e.g. i32, i32le, i32be
  • Reintroduction of i128 and u128
  • Labels for blocks and if statements (break only)
  • Improved common parsing errors (e.g. C-style -> for selectors rather than Odin-style .)
  • Import name rules
    • The import name for the package will try to be determined from the import path
  • Context-based Logging system
  • #load
    • Load a file at compile time as a byte slice
  • Procedure group syntax change to proc{}
  • General core library improvements
  • Odin Parser as part of the core library
    • import "core:odin/parser" et al.
  • New build flag: -define:foo=123
  • #defined built-in procedure
    • when #defined(FOO) { ... }
  • Improved -vet
  • Replace foreign export with @export
  • @private
  • @static

Experimental Features

  • odin query
    • -go-to-definitions (OGTD file format)
    • -global-definitions (JSON file format)
    • -compact (compactify the JSON file)
  • intrinsics.vector type

Related Topics

Odin v0.9.1

01 Dec 22:15
Compare
Choose a tag to compare

Bug Fixes

  • Debug fix
  • Recursive loop bug for polymorphic types
  • #complete switch for pointers to unions
  • Allow for single fields struct #raw_union
  • Redefine how union tag size is calculated to match alignment of the union data

Odin v0.9.0

22 Nov 10:43
Compare
Choose a tag to compare

New Features

  • package system
  • Improved PDB support with code inspection
  • typeid type (also a keyword)
  • type is not a keyword any more
  • opaque type
  • Parameteric polymorphic union type:
    • union(T: typeid, N: int) {int, T, [N]T}
  • bit_set type:
    • bit_set[Some_Enum];
    • bit_set['A' .. 'Z'];
    • bit_set[0..8; u16];
  • cstring type (useful for interfacing with C libraries)
  • in binary operator for map and bit_set types:
    • x in y
  • Parametric polymorphic signature changes with polymorphic names:
    • new :: proc($T: typeid) -> ^T {}
    • make_int_array :: proc($N: int) -> [N]int {}
    • foo :: proc($N: $I, $T: typeid) {}
  • auto_cast unary operator
  • Explicit inline and no_inline on procedure calls
  • deprecated attributes
  • Built-in procedures:
    • #defined
    • #assert compile time assert
    • expand_to_tuple for (fixed length) arrays
    • typeid_of
  • "intrinsics" package:
    • Atomics
  • Diverging procedures proc() -> ! (no return)
  • using Foo :: enum {A, B, C}; f := A;
  • Foo :: enum {A, B, C}; len(Foo)
  • New context features:
    • temp_allocator
    • logger (Still in development)
    • Assigning directly to context parameters creates a new context
    • (context is scope based)
  • New compiler flags:
    • -lld (use LLD as the linker on Windows)
  • Improved minimum dependency building
  • foreign import x {"foo.lib", "bar.lib"}

Removed Features

  • using in
  • Old import system (replaced with the package system)