| /* This D file is implicitly imported by all ImportC source files. | |
| * It provides definitions for C compiler builtin functions and declarations. | |
| * The purpose is to make it unnecessary to hardwire them into the compiler. | |
| * As the leading double underscore suggests, this is for internal use only. | |
| * | |
| * Copyright: Copyright Digital Mars 2022 | |
| * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). | |
| * Authors: Walter Bright | |
| * Source: $(DRUNTIMESRC __builtins.d) | |
| */ | |
| module __builtins; | |
| /* gcc relies on internal __builtin_xxxx functions and templates to | |
| * accomplish <stdarg.h>. D does the same thing with templates in core.stdc.stdarg. | |
| * Here, we redirect the gcc builtin declarations to the equivalent | |
| * ones in core.stdc.stdarg, thereby avoiding having to hardware them | |
| * into the D compiler. | |
| */ | |
| import core.stdc.stdarg; | |
| alias va_list = core.stdc.stdarg.va_list; | |
| version (Posix) | |
| { | |
| version (X86_64) | |
| alias __va_list_tag = core.stdc.stdarg.__va_list_tag; | |
| } | |
| alias __builtin_va_start = core.stdc.stdarg.va_start; | |
| alias __builtin_va_end = core.stdc.stdarg.va_end; | |
| alias __builtin_va_copy = core.stdc.stdarg.va_copy; | |
| /* dmd's ImportC rewrites __builtin_va_arg into an instantiation of va_arg | |
| */ | |
| alias va_arg = core.stdc.stdarg.va_arg; | |
| version (CRuntime_Microsoft) | |
| { | |
| //https://docs.microsoft.com/en-us/cpp/cpp/int8-int16-int32-int64?view=msvc-170 | |
| alias __int8 = byte; | |
| alias __int16 = short; | |
| alias __int32 = int; | |
| alias __int64 = long; | |
| } | |
| /*********** floating point *************/ | |
| /* https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html | |
| */ | |
| version (DigitalMars) | |
| { | |
| double __builtin_inf()() { return double.infinity; } | |
| float __builtin_inff()() { return float.infinity; } | |
| real __builtin_infl()() { return real.infinity; } | |
| alias __builtin_huge_val = __builtin_inf; | |
| alias __builtin_huge_valf = __builtin_inff; | |
| alias __builtin_huge_vall = __builtin_infl; | |
| import core.stdc.math; | |
| alias __builtin_fabs = core.stdc.math.fabs; | |
| alias __builtin_fabsf = core.stdc.math.fabsf; | |
| alias __builtin_fabsl = core.stdc.math.fabsl; | |
| ushort __builtin_bswap16()(ushort value) | |
| { | |
| import core.bitop; | |
| return core.bitop.byteswap(value); | |
| } | |
| uint __builtin_bswap32()(uint value) | |
| { | |
| import core.bitop; | |
| return core.bitop.bswap(value); | |
| } | |
| ulong __builtin_bswap64()(ulong value) | |
| { | |
| import core.bitop; | |
| return core.bitop.bswap(value); | |
| } | |
| // Stub these out to no-ops | |
| int __builtin_constant_p(T)(T exp) { return 0; } // should be something like __traits(compiles, enum X = expr) | |
| long __builtin_expect()(long exp, long c) { return exp; } | |
| void* __builtin_assume_aligned()(const void* p, size_t align_, ...) { return cast(void*)p; } | |
| // https://releases.llvm.org/13.0.0/tools/clang/docs/LanguageExtensions.html#builtin-assume | |
| void __builtin_assume(T)(lazy T arg) { } | |
| /* Header on macOS for arm64 references this. | |
| * Don't need to implement it, it just needs to compile | |
| */ | |
| align (16) struct __uint128_t | |
| { | |
| ulong a, b; | |
| } | |
| } |