1 /* runtime.def
-- Definitions for D runtime functions.
2 Copyright (C
) 2014-2022 Free Software Foundation
, Inc.
4 GCC is free software
; you can redistribute it and
/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation
; either version
3, or (at your option
)
9 GCC is distributed in the hope that it will be useful
,
10 but WITHOUT ANY WARRANTY
; without even the implied warranty of
11 MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with GCC
; see the file COPYING3. If not see
16 <http
://www.gnu.org
/licenses
/>.
*/
18 /* D runtime library functions.
*/
20 /* DEF_D_RUNTIME (CODE
, NAME
, FLAGS
)
21 CODE The enum code used to refer to this function.
22 NAME The name of this function as a string.
23 FLAGS ECF flags to describe attributes of the function.
25 Used for declaring functions that are called by generated code. Most are
26 extern(C
) - for those that are not
, ensure to use correct mangling.
*/
28 /* Helper macros for parameter building.
*/
30 #define
P1(T1
) 1, LCT_ ## T1
32 2, LCT_ ## T1
, LCT_ ## T2
33 #define
P3(T1
, T2
, T3
) \
34 3, LCT_ ## T1
, LCT_ ## T2
, LCT_ ## T3
35 #define
P4(T1
, T2
, T3
, T4
) \
36 4, LCT_ ## T1
, LCT_ ## T2
, LCT_ ## T3
, LCT_ ## T4
37 #define
P5(T1
, T2
, T3
, T4
, T5
) \
38 5, LCT_ ## T1
, LCT_ ## T2
, LCT_ ## T3
, LCT_ ## T4
, LCT_ ## T5
39 #define
RT(T1
) LCT_ ## T1
41 /* Used when an
assert() contract fails.
*/
42 DEF_D_RUNTIME (ASSERTP
, "_d_assertp", RT(VOID
), P2(IMMUTABLE_CHARPTR
, UINT
),
44 DEF_D_RUNTIME (ASSERT_MSG
, "_d_assert_msg", RT(VOID
), P3(STRING
, STRING
, UINT
),
47 /* Used when an
assert() contract fails in a unittest function.
*/
48 DEF_D_RUNTIME (UNITTESTP
, "_d_unittestp", RT(VOID
), P2(IMMUTABLE_CHARPTR
, UINT
),
50 DEF_D_RUNTIME (UNITTEST_MSG
, "_d_unittest_msg", RT(VOID
),
51 P3(STRING
, STRING
, UINT
), ECF_NORETURN
)
53 /* Used when an array index outside the bounds of its range.
*/
54 DEF_D_RUNTIME (ARRAYBOUNDSP
, "_d_arrayboundsp", RT(VOID
),
55 P2(IMMUTABLE_CHARPTR
, UINT
), ECF_NORETURN
)
56 DEF_D_RUNTIME (ARRAYBOUNDS_SLICEP
, "_d_arraybounds_slicep", RT(VOID
),
57 P5(IMMUTABLE_CHARPTR
, UINT
, SIZE_T
, SIZE_T
, SIZE_T
),
59 DEF_D_RUNTIME (ARRAYBOUNDS_INDEXP
, "_d_arraybounds_indexp", RT(VOID
),
60 P4(IMMUTABLE_CHARPTR
, UINT
, SIZE_T
, SIZE_T
), ECF_NORETURN
)
62 /* Used when calling new on a class.
*/
63 DEF_D_RUNTIME (NEWCLASS
, "_d_newclass", RT(OBJECT
), P1(CONST_CLASSINFO
), 0)
64 DEF_D_RUNTIME (NEWTHROW
, "_d_newThrowable", RT(OBJECT
), P1(CONST_CLASSINFO
), 0)
66 /* Used when calling delete on a stack
-allocated class or interface.
*/
67 DEF_D_RUNTIME (CALLFINALIZER
, "_d_callfinalizer", RT(VOID
), P1(VOIDPTR
), 0)
68 DEF_D_RUNTIME (CALLINTERFACEFINALIZER
, "_d_callinterfacefinalizer", RT(VOID
),
71 /* Used for casting to a class or interface.
*/
72 DEF_D_RUNTIME (DYNAMIC_CAST
, "_d_dynamic_cast", RT(OBJECT
),
73 P2(OBJECT
, CLASSINFO
), 0)
74 DEF_D_RUNTIME (INTERFACE_CAST
, "_d_interface_cast", RT(OBJECT
),
75 P2(OBJECT
, CLASSINFO
), 0)
77 /* Used when calling new on a pointer. The `i
' variant is for when the
78 initializer is nonzero. */
79 DEF_D_RUNTIME (NEWITEMT, "_d_newitemT", RT(VOIDPTR), P1(CONST_TYPEINFO), 0)
80 DEF_D_RUNTIME (NEWITEMIT, "_d_newitemiT", RT(VOIDPTR), P1(CONST_TYPEINFO), 0)
82 /* Used when calling new on an array. The `i' variant is for when the
83 initializer is nonzero
, and the `m
' variant is when initializing a
84 multi-dimensional array. */
85 DEF_D_RUNTIME (NEWARRAYT, "_d_newarrayT", RT(ARRAY_VOID),
86 P2(CONST_TYPEINFO, SIZE_T), 0)
87 DEF_D_RUNTIME (NEWARRAYIT, "_d_newarrayiT", RT(ARRAY_VOID),
88 P2(CONST_TYPEINFO, SIZE_T), 0)
89 DEF_D_RUNTIME (NEWARRAYMTX, "_d_newarraymTX", RT(ARRAY_VOID),
90 P2(CONST_TYPEINFO, ARRAY_SIZE_T), 0)
91 DEF_D_RUNTIME (NEWARRAYMITX, "_d_newarraymiTX", RT(ARRAY_VOID),
92 P2(CONST_TYPEINFO, ARRAY_SIZE_T), 0)
94 /* Used for allocating an array literal on the GC heap. */
95 DEF_D_RUNTIME (ARRAYLITERALTX, "_d_arrayliteralTX", RT(VOIDPTR),
96 P2(CONST_TYPEINFO, SIZE_T), 0)
98 /* Used for value equality (x == y) and comparisons (x < y) of non-trivial
99 arrays. Such as an array of structs or classes. */
100 DEF_D_RUNTIME (ADEQ2, "_adEq2", RT(INT),
101 P3(ARRAY_VOID, ARRAY_VOID, CONST_TYPEINFO), 0)
103 /* Used for (array.length = n) expressions. The `i' variant is for when the
104 initializer is nonzero.
*/
105 DEF_D_RUNTIME (ARRAYSETLENGTHT
, "_d_arraysetlengthT", RT(ARRAY_VOID
),
106 P3(CONST_TYPEINFO
, SIZE_T
, ARRAYPTR_VOID
), 0)
107 DEF_D_RUNTIME (ARRAYSETLENGTHIT
, "_d_arraysetlengthiT", RT(ARRAY_VOID
),
108 P3(CONST_TYPEINFO
, SIZE_T
, ARRAYPTR_VOID
), 0)
110 /* Used for allocating closures on the GC heap.
*/
111 DEF_D_RUNTIME (ALLOCMEMORY
, "_d_allocmemory", RT(VOIDPTR
), P1(SIZE_T
),
114 /* Used for copying an array into a slice
, adds an enforcment that the source
115 and destination are equal in size and do not overlap.
*/
116 DEF_D_RUNTIME (ARRAYCOPY
, "_d_arraycopy", RT(ARRAY_VOID
),
117 P3(SIZE_T
, ARRAY_VOID
, ARRAY_VOID
), 0)
119 /* Used for array assignments from an existing array. The `set
' variant is for
120 when the assignment value is a single element. */
121 DEF_D_RUNTIME (ARRAYASSIGN, "_d_arrayassign", RT(ARRAY_VOID),
122 P3(CONST_TYPEINFO, ARRAY_VOID, ARRAY_VOID), 0)
123 DEF_D_RUNTIME (ARRAYASSIGN_L, "_d_arrayassign_l", RT(ARRAY_VOID),
124 P4(CONST_TYPEINFO, ARRAY_VOID, ARRAY_VOID, VOIDPTR), 0)
125 DEF_D_RUNTIME (ARRAYASSIGN_R, "_d_arrayassign_r", RT(ARRAY_VOID),
126 P4(CONST_TYPEINFO, ARRAY_VOID, ARRAY_VOID, VOIDPTR), 0)
127 DEF_D_RUNTIME (ARRAYSETASSIGN, "_d_arraysetassign", RT(VOIDPTR),
128 P4(VOIDPTR, VOIDPTR, SIZE_T, CONST_TYPEINFO), 0)
130 /* Used for concatenating two or more arrays together. Then `n' variant is
131 for when there is more than two arrays to handle.
*/
132 DEF_D_RUNTIME (ARRAYCATT
, "_d_arraycatT", RT(ARRAY_BYTE
),
133 P3(CONST_TYPEINFO
, ARRAY_BYTE
, ARRAY_BYTE
), 0)
134 DEF_D_RUNTIME (ARRAYCATNTX
, "_d_arraycatnTX", RT(ARRAY_VOID
),
135 P2(CONST_TYPEINFO
, ARRAYARRAY_BYTE
), 0)
137 /* Used for appending a single element to an array.
*/
138 DEF_D_RUNTIME (ARRAYAPPENDCTX
, "_d_arrayappendcTX", RT(ARRAY_BYTE
),
139 P3(CONST_TYPEINFO
, ARRAYPTR_BYTE
, SIZE_T
), 0)
141 /* Same as appending a single element to an array
, but specific for when the
142 source is a UTF
-32 character
, and the destination is a UTF
-8 or
16 array.
*/
143 DEF_D_RUNTIME (ARRAYAPPENDCD
, "_d_arrayappendcd", RT(ARRAY_VOID
),
144 P2(ARRAYPTR_BYTE
, DCHAR
), 0)
145 DEF_D_RUNTIME (ARRAYAPPENDWD
, "_d_arrayappendwd", RT(ARRAY_VOID
),
146 P2(ARRAYPTR_BYTE
, DCHAR
), 0)
148 /* Used for appending an existing array to another.
*/
149 DEF_D_RUNTIME (ARRAYAPPENDT
, "_d_arrayappendT", RT(ARRAY_VOID
),
150 P3(TYPEINFO
, ARRAYPTR_BYTE
, ARRAY_BYTE
), 0)
152 /* Used for allocating a new associative array.
*/
153 DEF_D_RUNTIME (ASSOCARRAYLITERALTX
, "_d_assocarrayliteralTX", RT(VOIDPTR
),
154 P3(CONST_TYPEINFO
, ARRAY_VOID
, ARRAY_VOID
), 0)
156 /* Used for value equality of two associative arrays.
*/
157 DEF_D_RUNTIME (AAEQUAL
, "_aaEqual", RT(INT
),
158 P3(CONST_TYPEINFO
, ASSOCARRAY
, ASSOCARRAY
), 0)
160 /* Used to determine is a key exists in an associative array.
*/
161 DEF_D_RUNTIME (AAINX
, "_aaInX", RT(VOIDPTR
),
162 P3(ASSOCARRAY
, CONST_TYPEINFO
, VOIDPTR
), 0)
164 /* Used to retrieve a value from an associative array index by a key. The
165 `Rvalue
' variant returns null if the key is not found, where as aaGetY
166 will create new key entry for assignment. */
167 DEF_D_RUNTIME (AAGETY, "_aaGetY", RT(VOIDPTR),
168 P4(POINTER_ASSOCARRAY, CONST_TYPEINFO, SIZE_T, VOIDPTR), 0)
169 DEF_D_RUNTIME (AAGETRVALUEX, "_aaGetRvalueX", RT(VOIDPTR),
170 P4(ASSOCARRAY, CONST_TYPEINFO, SIZE_T, VOIDPTR), 0)
172 /* Used when calling delete on a key entry in an associative array. */
173 DEF_D_RUNTIME (AADELX, "_aaDelX", RT(BOOL),
174 P3(ASSOCARRAY, CONST_TYPEINFO, VOIDPTR), 0)
176 /* Used for throw() expressions. */
177 DEF_D_RUNTIME (THROW, "_d_throw", RT(VOID), P1(OBJECT), ECF_NORETURN)
178 DEF_D_RUNTIME (BEGIN_CATCH, "__gdc_begin_catch", RT(VOIDPTR), P1(VOIDPTR), 0)
180 /* C++ exception handlers. */
181 DEF_D_RUNTIME (CXA_BEGIN_CATCH, "__cxa_begin_catch", RT(VOIDPTR), P1(VOIDPTR),
183 DEF_D_RUNTIME (CXA_END_CATCH, "__cxa_end_catch", RT(VOID), P0(), 0)
185 /* When invariant() contracts are turned on, used after testing whether a
186 class != null for validating the state of a class. */
187 DEF_D_RUNTIME (INVARIANT, "_D9invariant12_d_invariantFC6ObjectZv", RT(VOID),