Skip to content

Releases: odin-lang/Odin

dev-2021-10

01 Oct 14:19
Compare
Choose a tag to compare

New Language Features

New Packages

  • vendor:raylib
    • Including vendor:raylib/easings.odin
  • vendor:microui
    • Odin native source port
  • vendor:stb/image
    • Includes: stb_image.h, stb_image_resize.odin, stb_image_write.odin
  • vendor:stb/easy_font
  • vendor:stb/vorbis
  • vendor:stb/truetype
  • core:hash/xxhash
  • core:mem/virtual (still experimental and work in progress)

Package Improvements

  • Improvements and additions to core:encoding/json
    • Support json.unmarshal
      • Writing to []byte, strings.Builder, and io.Writer
    • Support three different dialects of JSON: JSON (strict), JSON5, MSJON (Bitsquid flavour)
  • Minor corrections to vendor:sdl2
  • Improvements to vendor:vulkan to use [^] where appropriate
  • Improvements to core:math/big
  • Additions to core:reflect
    • reflect.equal, reflect.not_equal
    • reflect.any_base, reflect.any_core
    • reflect.set_union_value
  • Changes to core:io
    • Optional n_read/n_written parameters (useful for building utility procedures)
    • Move strings.write_quoted_* to io.write_quoted_*
  • Numerous tests for the the png, gzip, zlib, et al packages
  • Add bits.log2
  • Add i128 and u128 parsers to core:strconv
  • Correct append_soa for #soa[dynamic][N]T

Compiler Improvements

  • Update Windows to LLVM 12.0.1
  • odin strip-semicolon utility tool to remove unnecessary semicolons
  • -strict-style
  • -strict-style-init-only
  • intrinsics.prefetch_* procedures
  • Fix slice indices endianness
  • General dead code culling in the compiler
  • Simplify parsing for directives
  • Correct f64 <-> u128/i128 code generation
  • Make map internals more robust when using mem.nil_allocator()
  • Fix [^]u8 to cstring conversion
  • Allow [^]T to uintptr conversion

dev-2021-09

01 Sep 12:15
Compare
Choose a tag to compare

New Language Features

  • or_return atom expression (suffix)
    • extremely useful for early returning with multiple return values
    • x, err = foo(); if err != nil { return } can now becomes x = foo() or_return;
  • or_else as a binary (infix) operator
  • Multi-Pointers [^]T
    • A way to describe foreign (C-like) pointers which act like arrays (pointers that map to multiple items)
    • The main purpose of this type is to aid with foreign code and act as a way to auto-document functionality and allow for easier transition to Odin code, especially converting pointers to slices.
  • Allow len and cap to return uint if a type is uint to aid people wanting to use unsigned integers
  • Unify semantics of the built-in swizzle procedure with the selector expression semantics e.g. .xyz
  • Define where #bounds_check and #no_bounds_check can be applied
    • May only be applied to one of the following statements: {}, if, when, for, switch, return, defer, assignment, variable declaration
    • May only be applied to a variable declaration, and not a constant value declaration

Packages

  • core:math/big (big integer support)
  • core:encoding/hxa (reader and writer)
  • core:c/libc - (mostly) projected all of C11's standard library to Odin, as defined by the C11 specification: N1570, or ISO/IEC 9899:2011.
  • Remove core:encoding/cel
  • The new vendor library collection
  • vendor:sdl2
    • Full bindings to the SDL2 library
    • Ships with DLLs and Libs for Microsoft Windows
    • Bundled with gamecontrollerdb.txt
  • vendor:sdl2/image
  • vendor:sdl2/mixer
  • vendor:sdl2/net
  • vendor:sdl2/ttf
  • vendor:OpenGL
  • vendor:vulkan
  • vendor:glfw
  • vendor:portmidi

Compiler Improvements

  • Unify multithreading logic through the compiler
  • Remove numerous possible race conditions
  • Disallow using on enum declarations in favour of implicit selector expressions: .A
  • Simplify data structures within the compiler for better memory reuse
  • Correct DllMain behaviour
  • Delete a lot of dead code

General Changes

  • Prefer ..= over .. in the core library
  • Add Allocator_Error.Mode_Not_Implemented
  • Allow + in import paths
  • Add #any_int directive to replace auto_cast uses on parameters
  • Add map_insert which returns the pointer to the inserted value (assuming no resizes happen in the mean time)

dev-2021-08

02 Aug 21:32
Compare
Choose a tag to compare

New Language Features

  • or_else built-in procedure for values which have an optional-ok value
  • Allow x in ptr_to_map_or_bit_set
  • Ability to add custom warnings to procedures with the attribute@(warning=<string>)

Compiler Improvements

  • Multithread the entire Semantic Checker stage of the compiler
    • This will decrease odin check times
    • Can be disabled with either -no-threaded-checker (disables parsing in only the semantic checker) or -thread-count:1 (will also disable threading in parser)
  • Improve error handling for parsing errors
  • Replace the old big int library with libTomMath

Packages

  • Add #no_bounds_check to linalg procedures
  • Add slice.sort_by_cmp
  • Add slice.min and slice.max
  • Add strings.cut
  • Deprecate sort.slice and sort.reverse_slice
  • Add documentation for the overview of package fmt

Bug Fixes

  • Fix numerous swizzle related bugs
  • Fix parametric Polymorphic struct with default parapoly parameter bug

dev-2021-07

01 Jul 13:02
Compare
Choose a tag to compare

New Language Features

  • Swizzling syntax for arrays len <= 4 (GLSL-like behaviour)
    • e.g. v.xyz, v.zyx, v.xxx
    • e.g. v.rgb, v.bgr, v.rrr
  • Optional Ok Pointer addressing mode:
    • ptr, ok := &m[v];
    • ptr, ok := &v.(T);
  • Disallow defers in a scope which terminates with a diverging procedure -> !
  • Compound literals for struct #raw_union types
  • Allow alternative syntax for offset_of:
    • offset_of(Struct_Type, field) (current syntax)
    • offset_of(value.field) (new alternative syntax)

Compiler Improvements

  • Performance optimizations for switch statements (normal and type)
  • Performance optimizations for array programming

Packages

  • Remove context.thread_id
  • Improve documentation for the Odin binary doc-format spec
  • Improvements to reflect
  • Add intrinsics.type_is_endian_platform
  • Add bufio.Scanner
  • Add bufio.Lookahead_Reader
  • Many improvements to png
  • Many improvements to gzip
  • Many improvements to zlib
  • Huge performance improvements to hashing procedures:
    • hash.crc32
    • hash.adler32

Bug Fixes

  • Fix filepath bug leak
  • Improve linalg.transpose return type behaviour
  • Fix 128-bit integer to float cast by explicitly calling the procedure (was an LLVM bug)
  • Fix -lld on Windows
  • FIx double evaluation buf with selector call expressions x->y(z)->w(a)
  • Fix semicolon insertion rule for ---

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