Builtin
Compiler builtins are automatically loaded into every assembly.
Current running platform
Platform :: enum s32 {
UNKNOWN;
WINDOWS;
DARWIN;
LINUX;
}
PLATFORM :: <SET_BY_COMPILER>;
Current running architecture
Arch :: enum s32 {
UNKNOWN;
X86_64;
AARCH64;
ARM64;
}
ARCH :: <SET_BY_COMPILER>;
Current running environment
Env :: enum s32 {
UNKNOWN;
MSVC;
GNU;
MUSL;
}
ENV :: <SET_BY_COMPILER>;
Compiler version
BLC_VER_MAJOR : s32 : <SET_BY_COMPILER>;
BLC_VER_MINOR : s32 : <SET_BY_COMPILER>;
BLC_VER_PATCH : s32 : <SET_BY_COMPILER>;
string_view
string_view :: []u8
Builtin string slice.
File: a.bl
TypeKind
TypeKind :: enum {
TYPE = 1;
VOID = 2;
INT = 3;
REAL = 4;
FN = 5;
PTR = 6;
BOOL = 7;
ARRAY = 8;
STRUCT = 9;
ENUM = 10;
NULL = 11;
STRING = 12;
FN_GROUP = 16;
}
TypeKind describes kind of BL type returned in TypeInfo
structure. This value can be used for
safe casting.
Variants
TYPE
- Base type of all types in type system.VOID
- Void type. (Implicitly used for functions without return value)INT
- Any integer type:s8
,s16
,s32
,s64
,u8
,u16
,u32
,u64
,usize
.REAL
- Any real type:f32
,f64
.FN
- Function type.PTR
- Pointer type.BOOL
- Boolean type.ARRAY
- Array type.STRUCT
- Structure type.ENUM
- Enumerator type.NULL
- Null-value type.STRING
- String type. @Cleanup: remove this!FN_GROUP
- Function group type.
File: a.bl
TypeInfo
TypeInfo :: struct {
kind: TypeKind;
size_bytes: usize;
alignment: usize;
}
Base TypeInfo
structure returned by typeinfo
operator. This structure pointer can be casted to
child type to get more descriptive information about the type.
Members
kind
- Type info kind.size_bytes
- Size of type in bytes.alignment
- Alignment of type.
File: a.bl
TypeInfoInt
TypeInfoInt :: struct {
bit_count: s32;
is_signed: bool;
}
Detailed information about integer types: s8
, s16
, s32
, s64
, u8
, u16
, u32
, u64
, usize
.
Members
bit_count
- Size of type in bits.is_signed
- True when type is signed integer type.
File: a.bl
TypeInfoReal
TypeInfoReal :: struct {
bit_count: s32;
}
Detailed information about real types: f32
, f64
.
Members
bit_count
- Size of type in bits.
File: a.bl
TypeInfoFn
TypeInfoFn :: struct {
args: []TypeInfoFnArg;
ret_type: *TypeInfo;
is_vargs: bool;
}
Detailed information about function types.
Members
args
- Slice of argument type infos.ret_type
- Return type info.is_vargs
- True when function has variable argument list.
File: a.bl
TypeInfoFnGroup
TypeInfoFnGroup :: struct {
variants: []*TypeInfoFn;
}
Detailed information about function group and contained possible overloads.
Members
variants
- Group content.
File: a.bl
TypeInfoPtr
TypeInfoPtr :: struct {
pointee_type: *TypeInfo;
}
Detailed information about pointer types.
Members
pointee_type
- Underlaying pointed type info.
File: a.bl
TypeInfoArray
TypeInfoArray :: struct {
name: string_view;
elem_type: *TypeInfo;
len: s64;
}
Detailed information about array types.
Members
name
- Array name.elem_type
- Array element type info.len
- Array element count.
File: a.bl
TypeInfoStruct
TypeInfoStruct :: struct {
name: string_view;
members: []TypeInfoStructMember;
is_slice: bool;
is_union: bool;
is_dynamic_array: bool;
}
Detailed information about structure types.
Members
name
- Structure type name.members
- Slice of structure member infos.is_slice
- True when structure is slice.is_union
- True when structure is union.is_dynamic_array
- True when structure is dynamic array.
File: a.bl
TypeInfoEnum
TypeInfoEnum :: struct {
name: string_view;
base_type: *TypeInfo;
variants: []TypeInfoEnumVariant;
is_flags: bool;
}
Detailed information about enumerator types.
Members
name
- Enumerator type name.base_type
- Base type info.variants
- Slice of all enumerator variants.is_flags
- True when enumerator was defined with #flags directive.
File: a.bl
TypeInfoVoid
TypeInfoVoid :: struct {
}
Placeholder for information about void
type.
File: a.bl
TypeInfoNull
TypeInfoNull :: struct {
}
Placeholder for information about null
type.
File: a.bl
TypeInfoString
TypeInfoString :: struct {
}
Placeholder for information about string
type.
File: a.bl
TypeInfoType
TypeInfoType :: struct {
}
Placeholder for information about type
type.
File: a.bl
TypeInfoBool
TypeInfoBool :: struct {
}
Placeholder for information about bool
type.
File: a.bl
TypeInfoStructMember
TypeInfoStructMember :: struct {
name: string_view;
base_type: *TypeInfo;
offset_bytes: s32;
index: s32;
tag: u64;
is_base: bool;
}
Detailed information about structure member.
Members
name
- Member type name.base_type
- Member type info.offset_bytes
- Byte-offset of member inside structure ABI.index
- Order in structure.tag
- User defined member tag can be used to store any custom user data up to 8 bytes into the type info structure when structure member is defined.
Foo :: struct {
i: s32 #tag 123;
j: s32 #tag 321;
};
is_base
- True when member is inherrited base of the parent structure type.
File: a.bl
TypeInfoEnumVariant
TypeInfoEnumVariant :: struct {
name: string_view;
value: s64;
}
Detailed information about enumerator variant.
Members
name
- Member type name.value
- Variant value.
File: a.bl
TypeInfoFnArg
TypeInfoFnArg :: struct {
name: string_view;
base_type: *TypeInfo;
}
Detailed information about function's argument.
Members
name
- Member type name.base_type
- Argument type info.
File: a.bl
Any
Any :: struct {
type_info: *TypeInfo;
data: *u8;
}
Any type is special builtin type used for passing value of "any" type as function argument.
Members
type_info
- Type info associated to data type.data
- Data pointer. (not owner!)
File: a.bl
TestCase
TestCase :: struct {
func: *fn () ;
name: string_view;
file: string_view;
line: s32;
}
Type of test case record found during compilation.
Members
func
- Pointer to test case function.name
- Name of the test case.file
- File where the test case is declared.line
- Line in the file where the test case is declared.
File: a.bl
CodeLocation
CodeLocation :: struct {
file: string_view;
line: s32;
function: string_view;
hash: u32;
}
Type of source code location used by #call_location
directive.
Example
foo :: fn (loc: *CodeLocation = #call_location) {
print("%\n", @loc);
}
main :: fn () s32 {
foo();
return 0;
}
Members
file
- Full source file path.line
- Line in the source file.function
- Name of the function.hash
- File and line combination hash.
File: a.bl
PrintLogFn
PrintLogFn :: *fn (kind: PrintLogKind, file: string_view, line: s32, format: string_view, args: ...)
Type of print log function.
Arguments
kind
Kind of report message.format
Format string.args
Additional arguments.file
Call side filename.line
Call side line in source file.
File: a.bl
AbortFn
AbortFn :: *fn ()
File: a.bl
AssertFn
AssertFn :: *fn (message: string_view, loc: *CodeLocation)
File: a.bl
Context
Context :: struct {
print_log_fn: PrintLogFn;
abort_fn: AbortFn;
assert_fn: AssertFn;
allocator: *Allocator;
temporary_allocator: *Allocator;
_assert_handled: bool;
}
Global application context. This structure provides possibility to override common operations done on the compiler internal level or on the user code level.
Members
print_log_fn
- Print log callback.abort_fn
- Abort handler callback.assert_fn
- Assert handler callback.allocator
- Global memory allocator used across the application.temporary_allocator
- Global temporary allocator. This allocator is implicitly used i.e. bytprint
function. The default implementation is thread save (be careful replacing this allocator with a custom implementation, it may be called from other threads depending on use case).
File: a.bl
application_context
application_context :=
Default application context. Implicit context is compiler internal global variable containing basic context for the whole assembly. This variable is mutable and can be modified by user code. For example we can replace default memory allocator with custom one, this will affect all memory allocations made after.
File: a.bl
command_line_arguments
command_line_arguments : []string_view =
Contains all arguments passed from command line. First argument is executable name.
File: a.bl
enum_count
enum_count :: fn (T: type) s64
Compile-time helper function resolving count of enumerator variants, passed type 'T' must be an enumerator type (checked by assert).
File: a.bl
is_number
is_number :: fn (T: type) bool
Returns true
if the T
type is an integer type.
File: a.bl
is_real
is_real :: fn (T: type) bool
Returns true
if the T
type is an floating point number type.
File: a.bl
is_real_or_number
is_real_or_number :: fn (T: type) bool
Returns true
if the T
type is an integer or floating point number type (f32 or f64).
File: a.bl
is_signed_number
is_signed_number :: fn (T: type) bool
Returns true if the T
type is a signed integer type.
File: a.bl
is_pointer
is_pointer :: fn (T: type) bool
Returns true if the T
type is a pointer type.
File: a.bl
is_function
is_function :: fn (T: type) bool
Returns true if the T
type is a function type.
File: a.bl
is_struct
is_struct :: fn (T: type) bool
Returns true if the T
type is a struct type.
File: a.bl
typeid
typeid :: fn (v: type) u64
Returns unique type identificator in compile-time.
File: a.bl
is_enum
is_enum :: fn (T: type) bool
Returns true
if the T
type is an enumerator type.
File: a.bl
number_type
number_type :: fn (size_bytes: usize, is_signed: bool) type
Returns signed or unsigned builtin number type of the requested size.
The size_bytes
must be 1, 2, 4 or 8 Bytes.
File: a.bl
has_member
has_member :: fn (TStruct: type, member_name: string_view) bool
Check in compile-time whether structure type TStruct
contains member called member_name
.
File: a.bl
has_member2
has_member2 :: fn (TStruct: type, member_name: string_view) bool
File: a.bl
member_offset_bytes
member_offset_bytes :: fn (TStruct: type, member_name: string_view) s64
File: a.bl
member_ptr
member_ptr :: fn {
fn (base_ptr: *u8, member: *TypeInfoStructMember) *u8;
fn (TMember: type, base_ptr: *?T, member_name: string_view) *TMember;
} #inline
File: a.bl