| 1 | const std = @import("std"); |
| 2 | |
| 3 | const ast = @import("ast.zig"); |
| 4 | |
| 5 | /// All builtins need to have a source so that macros can reference them |
| 6 | /// but for some it is possible to directly call an equivalent Zig builtin |
| 7 | /// which is preferrable. |
| 8 | pub const Builtin = struct { |
| 9 | /// The name of the builtin in `c_builtins.zig`. |
| 10 | name: []const u8, |
| 11 | tag: ?ast.Node.Tag = null, |
| 12 | }; |
| 13 | |
| 14 | pub const map = std.StaticStringMap(Builtin).initComptime([_]struct { []const u8, Builtin }{ |
| 15 | .{ "__builtin_abs", .{ .name = "abs" } }, |
| 16 | .{ "__builtin_assume", .{ .name = "assume" } }, |
| 17 | .{ "__builtin_bswap16", .{ .name = "bswap16", .tag = .byte_swap } }, |
| 18 | .{ "__builtin_bswap32", .{ .name = "bswap32", .tag = .byte_swap } }, |
| 19 | .{ "__builtin_bswap64", .{ .name = "bswap64", .tag = .byte_swap } }, |
| 20 | .{ "__builtin_ceilf", .{ .name = "ceilf", .tag = .ceil } }, |
| 21 | .{ "__builtin_ceil", .{ .name = "ceil", .tag = .ceil } }, |
| 22 | .{ "__builtin_clz", .{ .name = "clz" } }, |
| 23 | .{ "__builtin_constant_p", .{ .name = "constant_p" } }, |
| 24 | .{ "__builtin_cosf", .{ .name = "cosf", .tag = .cos } }, |
| 25 | .{ "__builtin_cos", .{ .name = "cos", .tag = .cos } }, |
| 26 | .{ "__builtin_ctz", .{ .name = "ctz" } }, |
| 27 | .{ "__builtin_exp2f", .{ .name = "exp2f", .tag = .exp2 } }, |
| 28 | .{ "__builtin_exp2", .{ .name = "exp2", .tag = .exp2 } }, |
| 29 | .{ "__builtin_expf", .{ .name = "expf", .tag = .exp } }, |
| 30 | .{ "__builtin_exp", .{ .name = "exp", .tag = .exp } }, |
| 31 | .{ "__builtin_expect", .{ .name = "expect" } }, |
| 32 | .{ "__builtin_fabsf", .{ .name = "fabsf", .tag = .abs } }, |
| 33 | .{ "__builtin_fabs", .{ .name = "fabs", .tag = .abs } }, |
| 34 | .{ "__builtin_floorf", .{ .name = "floorf", .tag = .floor } }, |
| 35 | .{ "__builtin_floor", .{ .name = "floor", .tag = .floor } }, |
| 36 | .{ "__builtin_huge_valf", .{ .name = "huge_valf" } }, |
| 37 | .{ "__builtin_inff", .{ .name = "inff" } }, |
| 38 | .{ "__builtin_isinf_sign", .{ .name = "isinf_sign" } }, |
| 39 | .{ "__builtin_isinf", .{ .name = "isinf" } }, |
| 40 | .{ "__builtin_isnan", .{ .name = "isnan" } }, |
| 41 | .{ "__builtin_labs", .{ .name = "labs" } }, |
| 42 | .{ "__builtin_llabs", .{ .name = "llabs" } }, |
| 43 | .{ "__builtin_log10f", .{ .name = "log10f", .tag = .log10 } }, |
| 44 | .{ "__builtin_log10", .{ .name = "log10", .tag = .log10 } }, |
| 45 | .{ "__builtin_log2f", .{ .name = "log2f", .tag = .log2 } }, |
| 46 | .{ "__builtin_log2", .{ .name = "log2", .tag = .log2 } }, |
| 47 | .{ "__builtin_logf", .{ .name = "logf", .tag = .log } }, |
| 48 | .{ "__builtin_log", .{ .name = "log", .tag = .log } }, |
| 49 | .{ "__builtin___memcpy_chk", .{ .name = "memcpy_chk" } }, |
| 50 | .{ "__builtin_memcpy", .{ .name = "memcpy" } }, |
| 51 | .{ "__builtin___memset_chk", .{ .name = "memset_chk" } }, |
| 52 | .{ "__builtin_memset", .{ .name = "memset" } }, |
| 53 | .{ "__builtin_mul_overflow", .{ .name = "mul_overflow" } }, |
| 54 | .{ "__builtin_nanf", .{ .name = "nanf" } }, |
| 55 | .{ "__builtin_object_size", .{ .name = "object_size" } }, |
| 56 | .{ "__builtin_popcount", .{ .name = "popcount" } }, |
| 57 | .{ "__builtin_roundf", .{ .name = "roundf", .tag = .round } }, |
| 58 | .{ "__builtin_round", .{ .name = "round", .tag = .round } }, |
| 59 | .{ "__builtin_signbitf", .{ .name = "signbitf" } }, |
| 60 | .{ "__builtin_signbit", .{ .name = "signbit" } }, |
| 61 | .{ "__builtin_sinf", .{ .name = "sinf", .tag = .sin } }, |
| 62 | .{ "__builtin_sin", .{ .name = "sin", .tag = .sin } }, |
| 63 | .{ "__builtin_sqrtf", .{ .name = "sqrtf", .tag = .sqrt } }, |
| 64 | .{ "__builtin_sqrt", .{ .name = "sqrt", .tag = .sqrt } }, |
| 65 | .{ "__builtin_strcmp", .{ .name = "strcmp" } }, |
| 66 | .{ "__builtin_strlen", .{ .name = "strlen" } }, |
| 67 | .{ "__builtin_truncf", .{ .name = "truncf", .tag = .trunc } }, |
| 68 | .{ "__builtin_trunc", .{ .name = "trunc", .tag = .trunc } }, |
| 69 | .{ "__builtin_unreachable", .{ .name = "unreachable", .tag = .@"unreachable" } }, |
| 70 | .{ "__has_builtin", .{ .name = "has_builtin" } }, |
| 71 | |
| 72 | // __builtin_alloca_with_align is not currently implemented. |
| 73 | // It is used in a run and a translate test to ensure that non-implemented |
| 74 | // builtins are correctly demoted. If you implement __builtin_alloca_with_align, |
| 75 | // please update the tests to use a different non-implemented builtin. |
| 76 | }); |