123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- /*
- Declarations which are required by the compiler
- ## Descriptions of files
- There are a lot of files in this package and below is described roughly what
- kind of functionality is placed in different files:
- | File pattern | Description
- |----------------------|------------------------------------------------------|
- | `core.odin` | Contains the declarations that compiler will require to be present. Contains context-related declarations, `Type_Info` declarations and some other types used to implement the runtime and other packages. |
- | `core_builtin*.odin` | Contain `@(builtin)` declarations that can be used without importing the package. Most of them aren't required by the compiler |
- | `default_*.odin` | Contain default implementations for context allocators |
- | `entry_*.odin` | Contain OS-specific entry points |
- | `os_specific_*.odin` | Contain OS-specific utility procedures |
- | `*internal*.odin` | Contain implementations for internal procedures that can be called by the compiler |
- ## Implementing custom runtime
- For embedded and kernel development it might be required to re-implement parts
- of the `base:runtime` package. This can include changing the default printing
- procedures that handle console output when the program panics, custom
- entry-points, tailored for a specific platform or execution environment, or
- simply switching up implementations of some procedures.
- In case this is required, the following is suggested:
- 1. Define `$ODIN_ROOT` environment variable to point to a directory within your
- project that contains the following directories: `base/`, `core/` and `vendor/`.
- 2. Inside the `$ODIN_ROOT/base` subdirectory, implement the *necessary
- declarations*.
- What constitutes the necessary definitions is described below.
- ### Context-related
- The compiler will require these declarations as they concern the `context`
- variable.
- * `Maybe`
- * `Source_Code_Location`
- * `Context`
- * `Allocator`
- * `Random_Generator`
- * `Logger`
- * `__init_context`
- ### Runtime initialization/cleanup
- These are not strictly required for compilation, but if global variables or
- `@(init)`/`@(fini)` blocks are used, these procedures need to be called inside
- the entry point.
- * `_startup_runtime`
- * `_cleanup_runtime`
- ### Type assertion check
- These procedures are called every time `.(Type)` expressions are used in order
- to check the union tag or the underlying type of `any` before returning the
- value of the underlying type. These are not required if `-no-type-assert` is
- specified.
- * `type_assertion_check`
- * `type_assertion_check2` (takes in typeid)
- ### Bounds checking procedures
- These procedures are called every time index or slicing expression are used in
- order to perform bounds-checking before the actual operation. These are not
- required if the `-no-bounds-check` option is specified.
- * `bounds_check_error`
- * `matrix_bounds_check_error`
- * `slice_expr_error_hi`
- * `slice_expr_error_lo_hi`
- * `multi_pointer_slice_expr_error`
- ### cstring calls
- If `cstring` or `cstring16` types are used, these procedures are required.
- * `cstring_to_string`
- * `cstring_len`
- * `cstring16_to_string16`
- * `cstring16_len`
- ### Comparison
- These procedures are required for comparison operators between strings and other
- compound types to function properly. If strings, structs nor unions are compared,
- only `string_eq` procedure is required.
- * `memory_equal`
- * `memory_compare`
- * `memory_compare_zero`
- * `cstring_eq`
- * `cstring16_eq`
- * `cstring_ne`
- * `cstring16_ne`
- * `cstring_lt`
- * `cstring16_lt`
- * `cstring_gt`
- * `cstring16_gt`
- * `cstring_le`
- * `cstring16_le`
- * `cstring_ge`
- * `cstring16_ge`
- * `string_eq`
- * `string16_eq`
- * `string_ne`
- * `string16_ne`
- * `string_lt`
- * `string16_lt`
- * `string_gt`
- * `string16_gt`
- * `string_le`
- * `string16_le`
- * `string_ge`
- * `string16_ge`
- * `complex32_eq`
- * `complex32_ne`
- * `complex64_eq`
- * `complex64_ne`
- * `complex128_eq`
- * `complex128_ne`
- * `quaternion64_eq`
- * `quaternion64_ne`
- * `quaternion128_eq`
- * `quaternion128_ne`
- * `quaternion256_eq`
- * `quaternion256_ne`
- ### for-in `string` type
- These procedures are required to iterate strings using `for ... in` loop. If this
- kind of loop isn't used, these procedures aren't required.
- * `string_decode_rune`
- * `string_decode_last_rune` (for `#reverse for`)
- ### Required when RTTI is enabled (the vast majority of targets)
- These declarations are required unless the `-no-rtti` compiler option is
- specified. Note that in order to be useful, some other procedures need to be
- implemented. Those procedures aren't mentioned here as the compiler won't
- complain if they're missing.
- * `Type_Info`
- * `type_table`
- * `__type_info_of`
- ### Hashing
- Required if maps are used
- * `default_hasher`
- * `default_hasher_cstring`
- * `default_hasher_string`
- ### Pseudo-CRT required procedured due to LLVM but useful in general
- * `memset`
- * `memcpy`
- * `memove`
- ### Procedures required by the LLVM backend if u128/i128 is used
- * `umodti3`
- * `udivti3`
- * `modti3`
- * `divti3`
- * `fixdfti`
- * `fixunsdfti`
- * `fixunsdfdi`
- * `floattidf`
- * `floattidf_unsigned`
- * `truncsfhf2`
- * `truncdfhf2`
- * `gnu_h2f_ieee`
- * `gnu_f2h_ieee`
- * `extendhfsf2`
- ### Procedures required by the LLVM backend if f16 is used (WASM only)
- * `__ashlti3`
- * `__multi3`
- ### When -no-crt is defined (windows only)
- * `_tls_index`
- * `_fltused`
- ### Arithmetic
- * `quo_complex32`
- * `quo_complex64`
- * `quo_complex128`
- * `mul_quaternion64`
- * `mul_quaternion128`
- * `mul_quaternion256`
- * `quo_quaternion64`
- * `quo_quaternion128`
- * `quo_quaternion256`
- * `abs_complex32`
- * `abs_complex64`
- * `abs_complex128`
- * `abs_quaternion64`
- * `abs_quaternion128`
- * `abs_quaternion256`
- ## Map specific calls
- * `map_seed_from_map_data`
- * `__dynamic_map_check_grow` (for static map calls)
- * `map_insert_hash_dynamic` (for static map calls)
- * `__dynamic_map_get` (for dynamic map calls)
- * `__dynamic_map_set` (for dynamic map calls)
- ## Dynamic literals (`[dynamic]T` and `map[K]V`) (can be disabled with `-no-dynamic-literals`)
- * `__dynamic_array_reserve`
- * `__dynamic_array_append`
- * `__dynamic_map_reserve`
- ### Objective-C specific
- * `objc_lookUpClass`
- * `sel_registerName`
- * `objc_allocateClassPair`
- ### Other required declarations
- This is required without conditions.
- * `Load_Directory_File`
- */
- package runtime
|