summaryrefslogtreecommitdiff
path: root/builtin/builtin.odin
blob: f342ff980ff45052f2a19c79d86677c4d1fce356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
package ols_builtin

// Procedures


@builtin len :: proc(array: Array_Type) -> int ---
@builtin cap :: proc(array: Array_Type) -> int ---

@builtin size_of      :: proc($T: typeid) -> int ---
@builtin align_of     :: proc($T: typeid) -> int ---
@builtin type_of      :: proc(x: expr) -> type ---
@builtin type_info_of :: proc($T: typeid) -> ^runtime.Type_Info ---
@builtin typeid_of    :: proc($T: typeid) -> typeid ---

@builtin offset_of_selector :: proc(selector: $T) -> uintptr ---
@builtin offset_of_member   :: proc($T: typeid, member: $M) -> uintptr ---

@builtin offset_of :: proc{offset_of_selector, offset_of_member}

@builtin offset_of_by_string :: proc($T: typeid, member: string) -> uintptr ---

@builtin swizzle :: proc(x: [N]T, indices: ..int) -> [len(indices)]T ---

@builtin complex    :: proc(real, imag: Float) -> Complex_Type ---
@builtin quaternion :: proc(real, imag, jmag, kmag: Float) -> Quaternion_Type --- // fields must be named
@builtin real       :: proc(value: Complex_Or_Quaternion) -> Float ---
@builtin imag       :: proc(value: Complex_Or_Quaternion) -> Float ---
@builtin jmag       :: proc(value: Quaternion) -> Float ---
@builtin kmag       :: proc(value: Quaternion) -> Float ---
@builtin conj       :: proc(value: Complex_Or_Quaternion) -> Complex_Or_Quaternion ---

@builtin min   :: proc(values: ..T) -> T ---
@builtin max   :: proc(values: ..T) -> T ---
@builtin abs   :: proc(value: T) -> T ---
@builtin clamp :: proc(value, minimum, maximum: T) -> T ---

@builtin unreachable :: proc() -> ! ---

@(private="file") _raw_data_slice   :: proc(value: []$E)         -> [^]E    ---
@(private="file") _raw_data_dynamic :: proc(value: [dynamic]$E)  -> [^]E    ---
@(private="file") _raw_data_array   :: proc(value: ^[$N]$E)      -> [^]E    ---
@(private="file") _raw_data_simd    :: proc(value: ^#simd[$N]$E) -> [^]E    ---
@(private="file") _raw_data_string  :: proc(value: string)       -> [^]byte ---
// raw_data is a built-in procedure which returns the underlying data of a built-in data type as a Multi-Pointer.
@builtin raw_data :: proc{_raw_data_slice, _raw_data_dynamic, _raw_data_array, _raw_data_simd, _raw_data_string}

/*
	This is interally from the compiler
*/


@builtin
Odin_Arch_Type :: enum int {
	Unknown,
	amd64,
	i386,
	arm32,
	arm64,
	wasm32,
	wasm64p32,
	riscv64,
}

/*
	An `enum` value indicating the target's CPU architecture.
	Possible values are: `.amd64`, `.i386`, `.arm32`, `.arm64`, `.wasm32`, `.wasm64p32`, and `.riscv64`.
*/
@builtin
ODIN_ARCH: Odin_Arch_Type

/*
	A `string` indicating the target's CPU architecture.
	Possible values are: "amd64", "i386", "arm32", "arm64", "wasm32", "wasm64p32", "riscv64".
*/
@builtin
ODIN_ARCH_STRING: string

@builtin
Odin_Build_Mode_Type :: enum int {
	Executable,
	Dynamic,
	Static,
	Object,
	Assembly,
	LLVM_IR,
}

/*
	An `enum` value indicating the type of compiled output, chosen using `-build-mode`.
	Possible values are: `.Executable`, `.Dynamic`, `.Static`, `.Object`, `.Assembly`, and `.LLVM_IR`.
*/
@builtin
ODIN_BUILD_MODE: Odin_Build_Mode_Type

/*
	A `string` containing the name of the folder that contains the entry point,
	e.g. for `%ODIN_ROOT%/examples/demo`, this would contain `demo`.
*/
@builtin
ODIN_BUILD_PROJECT_NAME: string

/*
	An `i64` containing the time at which the executable was compiled, in nanoseconds.
	This is compatible with the `time.Time` type, i.e. `time.Time{_nsec=ODIN_COMPILE_TIMESTAMP}`
*/
@builtin
ODIN_COMPILE_TIMESTAMP: int

/*
	`true` if the `-debug` command line switch is passed, which enables debug info generation.
*/
@builtin
ODIN_DEBUG: bool

/*
	`true` if the `-default-to-nil-allocator` command line switch is passed,
	which sets the initial `context.allocator` to an allocator that does nothing.
*/
@builtin
ODIN_DEFAULT_TO_NIL_ALLOCATOR: bool

/*
	`true` if the `-default-to-panic-allocator` command line switch is passed,
	which sets the initial `context.allocator` to an allocator that panics if allocated from.
*/
@builtin
ODIN_DEFAULT_TO_PANIC_ALLOCATOR: bool

/*
	`true` if the `-disable-assert` command line switch is passed,
	which removes all calls to `assert` from the program.
*/
@builtin
ODIN_DISABLE_ASSERT: bool

/*
	An `string` indicating the endianness of the target.
	Possible values are: "little" and "big".
*/
@builtin
ODIN_ENDIAN_STRING: string

@builtin
Odin_Endian_Type :: enum int {
	Unknown,
	Little,
	Big,
}

/*
	An `enum` value indicating the endianness of the target.
	Possible values are: `.Little` and `.Big`.
*/
@builtin
ODIN_ENDIAN: Odin_Endian_Type

@builtin
Odin_Error_Pos_Style_Type :: enum int {
	Default = 0,
	Unix    = 1,
}

/*
	An `enum` value set using the `-error-pos-style` switch, indicating the source location style used for compile errors and warnings.
	Possible values are: `.Default` (Odin-style) and `.Unix`.
*/
@builtin
ODIN_ERROR_POS_STYLE: Odin_Error_Pos_Style_Type

/*
	`true` if the `-foreign-error-procedures` command line switch is passed,
	which inhibits generation of runtime error procedures, so that they can be in a separate compilation unit.
*/
@builtin
ODIN_FOREIGN_ERROR_PROCEDURES: bool

/*
	A `string` describing the microarchitecture used for code generation.
	If not set using the `-microarch` command line switch, the compiler will pick a default.
	Possible values include, but are not limited to: "sandybridge", "x86-64-v2".
*/
@builtin
ODIN_MICROARCH_STRING: string

/*
	An `int` value representing the minimum OS version given to the linker, calculated as `major * 10_000 + minor * 100 + revision`.
	If not set using the `-minimum-os-version` command line switch, it defaults to `0`, except on Darwin, where it's `11_00_00`.
*/
@builtin
ODIN_MINIMUM_OS_VERSION: int

/*
	`true` if the `-no-bounds-check` command line switch is passed, which disables bounds checking at runtime.
*/
@builtin
ODIN_NO_BOUNDS_CHECK: bool

/*
	`true` if the `-no-crt` command line switch is passed, which inhibits linking with the C Runtime Library, a.k.a. LibC.
*/
@builtin
ODIN_NO_CRT: bool

/*
	`true` if the `-no-entry-point` command line switch is passed, which makes the declaration of a `main` procedure optional.
*/
@builtin
ODIN_NO_ENTRY_POINT: bool

/*
	`true` if the `-no-rtti` command line switch is passed, which inhibits generation of full Runtime Type Information.
*/
@builtin
ODIN_NO_RTTI: bool

/*
	`true` if the `-no-type-assert` command line switch is passed, which disables type assertion checking program wide.
*/
@builtin
ODIN_NO_TYPE_ASSERT: bool

@builtin
Odin_Optimization_Mode :: enum int {
	None       = -1,
	Minimal    =  0,
	Size       =  1,
	Speed      =  2,
	Aggressive =  3,
}

/*
	An `enum` value indicating the optimization level selected using the `-o` command line switch.
	Possible values are: `.None`, `.Minimal`, `.Size`, `.Speed`, and `.Aggressive`.

	If `ODIN_OPTIMIZATION_MODE` is anything other than `.None` or `.Minimal`, the compiler will also perform a unity build,
	and `ODIN_USE_SEPARATE_MODULES` will be set to `false` as a result.
*/
@builtin
ODIN_OPTIMIZATION_MODE: Odin_Optimization_Mode

@builtin
Odin_OS_Type :: enum int {
	Unknown,
	Windows,
	Darwin,
	Linux,
	Essence,
	FreeBSD,
	OpenBSD,
	NetBSD,
	Haiku,
	WASI,
	JS,
	Orca,
	Freestanding,
}

/*
	An `enum` value indicating what the target operating system is.
*/
@builtin
ODIN_OS: Odin_OS_Type

/*
	A `string` indicating what the target operating system is.
*/
@builtin
ODIN_OS_STRING: string

@builtin
Odin_Platform_Subtarget_Type :: enum int {
	Default,
	iPhone,
	iPhoneSimulator,
	Android,
}

/*
	An `enum` value indicating the platform subtarget, chosen using the `-subtarget` switch.
	Possible values are: `.Default` `.iPhone`, .iPhoneSimulator, and `.Android`.
*/
@builtin
ODIN_PLATFORM_SUBTARGET: Odin_Platform_Subtarget_Type

/*
	A `string` representing the path of the folder containing the Odin compiler,
	relative to which we expect to find the `base` and `core` package collections.
*/
@builtin
ODIN_ROOT: string

@builtin
Odin_Sanitizer_Flag :: enum u32 {
	Address = 0,
	Memory  = 1,
	Thread  = 2,
}

@builtin
Odin_Sanitizer_Flags :: distinct bit_set[Odin_Sanitizer_Flag; u32]

/*
	A `bit_set` indicating the sanitizer flags set using the `-sanitize` command line switch.
	Supported flags are `.Address`, `.Memory`, and `.Thread`.
*/
@builtin
ODIN_SANITIZER_FLAGS: Odin_Sanitizer_Flags

/*
	`true` if the code is being compiled via an invocation of `odin test`.
*/
@builtin
ODIN_TEST: bool

/*
	`true` if built using the experimental Tilde backend.
*/
@builtin
ODIN_TILDE: bool

/*
	`true` by default, meaning each each package is built into its own object file, and then linked together.
	`false` if the `-use-single-module` command line switch to force a unity build is provided.

	If `ODIN_OPTIMIZATION_MODE` is anything other than `.None` or `.Minimal`, the compiler will also perform a unity build,
	and this constant will also be set to `false`.
*/
@builtin
ODIN_USE_SEPARATE_MODULES: bool

/*
	`true` if Valgrind integration is supported on the target.
*/
@builtin
ODIN_VALGRIND_SUPPORT: bool

/*
	A `string` which identifies the compiler being used. The official compiler sets this to `"odin"`.
*/
@builtin
ODIN_VENDOR: string

/*
	A `string` containing the version of the Odin compiler, typically in the format `dev-YYYY-MM`.
*/
@builtin
ODIN_VERSION: string

/*
	A `string` containing the Git hash part of the Odin version.
	Empty if `.git` could not be detected at the time the compiler was built.
*/
@builtin
ODIN_VERSION_HASH: string

@builtin
Odin_Windows_Subsystem_Type :: enum int {
	Unknown,
	Console,
	Windows,
}

/*
	An `enum` set by the `-subsystem` flag, specifying which Windows subsystem the PE file was created for.
	Possible values are:
		`.Unknown` - Default and only value on non-Windows platforms
		`.Console` - Default on Windows
		`.Windows` - Can be used by graphical applications so Windows doesn't open an empty console

	There are some other possible values for e.g. EFI applications, but only Console and Windows are supported.

	See also: https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header64
*/
@builtin
ODIN_WINDOWS_SUBSYSTEM: Odin_Windows_Subsystem_Type

/*
	An `string` set by the `-subsystem` flag, specifying which Windows subsystem the PE file was created for.
	Possible values are:
		"UNKNOWN" - Default and only value on non-Windows platforms
		"CONSOLE" - Default on Windows
		"WINDOWS" - Can be used by graphical applications so Windows doesn't open an empty console

	There are some other possible values for e.g. EFI applications, but only Console and Windows are supported.

	See also: https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header64
*/
@builtin
ODIN_WINDOWS_SUBSYSTEM_STRING: string

/*
	`true` if LLVM supports the f16 type.
*/
@builtin
__ODIN_LLVM_F16_SUPPORTED: bool