aboutsummaryrefslogtreecommitdiff
path: root/lib/zig.h
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-11-02 00:02:37 -0400
committerkcbanner <kcbanner@gmail.com>2023-11-05 20:34:13 -0500
commitce293c982e1b6d9db775e02fefb8905caa4ee748 (patch)
treebb3a9a7ef4746efaeb656857aff91172520ee309 /lib/zig.h
parent58789cb054b16e87d0a9b69ed8484cd30664fdb0 (diff)
downloadzig-ce293c982e1b6d9db775e02fefb8905caa4ee748.tar.gz
zig-ce293c982e1b6d9db775e02fefb8905caa4ee748.zip
cbe: avoid collisions with builtins and intrinsics
Changes: - Add `isMangledIdent` to determine if `fmtIdent` would make any edits to the identifier - Any function that has a mangled identifier is referred to using the mangled identifer within the current file, but if it is exported the first export will be with the non-mangled name. - Add `zig_import` to import a symbol under a different name - Add a level of indirection to float function names. Now, they are referred to as `zig_float_fn_<float type>_<operation>`. The definitions in zig.h are wrapped with `zig_import` to import the symbol under the real name. The specific problem that sparked this change was the combination of `zig_libc_name_f80(name) __##name##x` with the input `fma`, resulting in `__fmax`, which is a new intrinsic in recent versions of cl.exe. With the above changes in place, compiler_rt can output the following: ``` static zig_weak_linkage_fn zig_f80 zig_e___fmax(zig_f80, zig_f80, zig_f80); zig_export(zig_weak_linkage_fn zig_f80 zig_e___fmax(zig_f80, zig_f80, zig_f80), __fmax, "__fmax"); ``` Within compiler_rt, `zig_e___fmax` is used to refer to the function, but consumers will import `__fmax`, which maps to their `zig_float_fn_f80_fma` definition from zig.h.
Diffstat (limited to 'lib/zig.h')
-rw-r--r--lib/zig.h70
1 files changed, 42 insertions, 28 deletions
diff --git a/lib/zig.h b/lib/zig.h
index 233c2961cb..ee4a338be7 100644
--- a/lib/zig.h
+++ b/lib/zig.h
@@ -175,19 +175,33 @@ typedef char bool;
#endif
#if zig_has_attribute(alias)
-#define zig_export(sig, symbol, name) zig_extern sig __attribute__((alias(symbol)))
+#define zig_export(sig, symbol, name) zig_extern sig __attribute__((alias(#symbol)))
#elif _MSC_VER
#if _M_X64
-#define zig_export(sig, symbol, name) sig;\
- __pragma(comment(linker, "/alternatename:" name "=" symbol ))
+#define zig_export(sig, symbol, name) zig_extern sig;\
+ __pragma(comment(linker, "/alternatename:" name "=" #symbol ))
#else /*_M_X64 */
-#define zig_export(sig, symbol, name) sig;\
- __pragma(comment(linker, "/alternatename:_" name "=_" symbol ))
+#define zig_export(sig, symbol, name) zig_extern sig;\
+ __pragma(comment(linker, "/alternatename:" name "=" #symbol ))
#endif /*_M_X64 */
#else
-#define zig_export(sig, symbol, name) __asm(name " = " symbol)
+#define zig_export(sig, symbol, name) __asm(name " = " #symbol)
#endif
+#if _MSC_VER
+#if _M_X64
+#define zig_import(sig, symbol, name) sig;\
+ __pragma(comment(linker, "/alternatename:" #symbol "=" #name ))
+#else /*_M_X64 */
+#define zig_import(sig, symbol, name) sig;\
+ __pragma(comment(linker, "/alternatename:_" #symbol "=_" #name ))
+#endif /*_M_X64 */
+#else
+#define zig_import(sig, symbol, name) zig_extern sig asm(#name);
+#endif
+
+#define zig_expand_import(sig, symbol, name) zig_import(sig, symbol, name)
+
#if zig_has_attribute(weak) || defined(zig_gnuc)
#define zig_weak_linkage __attribute__((weak))
#define zig_weak_linkage_fn __attribute__((weak))
@@ -3330,31 +3344,31 @@ zig_float_negate_builtin(128, zig_make_u128, (UINT64_C(1) << 63, UINT64_C(0)))
zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, sub, -) \
zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, mul, *) \
zig_expand_concat(zig_float_binary_builtin_, zig_has_f##w)(f##w, div, /) \
- zig_extern zig_f##w zig_libc_name_f##w(sqrt)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(sin)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(cos)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(tan)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(exp)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(exp2)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(log)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(log2)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(log10)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(fabs)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(floor)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(ceil)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(round)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(trunc)(zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(fmod)(zig_f##w, zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(fmin)(zig_f##w, zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(fmax)(zig_f##w, zig_f##w); \
- zig_extern zig_f##w zig_libc_name_f##w(fma)(zig_f##w, zig_f##w, zig_f##w); \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_sqrt(zig_f##w), zig_float_fn_f##w##_sqrt, zig_libc_name_f##w(sqrt)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_sin(zig_f##w), zig_float_fn_f##w##_sin, zig_libc_name_f##w(sin)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_cos(zig_f##w), zig_float_fn_f##w##_cos, zig_libc_name_f##w(cos)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_tan(zig_f##w), zig_float_fn_f##w##_tan, zig_libc_name_f##w(tan)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_exp(zig_f##w), zig_float_fn_f##w##_exp, zig_libc_name_f##w(exp)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_exp2(zig_f##w), zig_float_fn_f##w##_exp2, zig_libc_name_f##w(exp2)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_log(zig_f##w), zig_float_fn_f##w##_log, zig_libc_name_f##w(log)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_log2(zig_f##w), zig_float_fn_f##w##_log2, zig_libc_name_f##w(log2)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_log10(zig_f##w), zig_float_fn_f##w##_log10, zig_libc_name_f##w(log10)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_fabs(zig_f##w), zig_float_fn_f##w##_fabs, zig_libc_name_f##w(fabs)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_floor(zig_f##w), zig_float_fn_f##w##_floor, zig_libc_name_f##w(floor)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_ceil(zig_f##w), zig_float_fn_f##w##_ceil, zig_libc_name_f##w(ceil)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_round(zig_f##w), zig_float_fn_f##w##_round, zig_libc_name_f##w(round)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_trunc(zig_f##w), zig_float_fn_f##w##_trunc, zig_libc_name_f##w(trunc)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_fmod(zig_f##w, zig_f##w), zig_float_fn_f##w##_fmod, zig_libc_name_f##w(fmod)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_fmin(zig_f##w, zig_f##w), zig_float_fn_f##w##_fmin, zig_libc_name_f##w(fmin)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_fmax(zig_f##w, zig_f##w), zig_float_fn_f##w##_fmax, zig_libc_name_f##w(fmax)) \
+ zig_expand_import(zig_extern zig_f##w zig_float_fn_f##w##_fma(zig_f##w, zig_f##w, zig_f##w), zig_float_fn_f##w##_fma, zig_libc_name_f##w(fma)) \
\
static inline zig_f##w zig_div_trunc_f##w(zig_f##w lhs, zig_f##w rhs) { \
- return zig_libc_name_f##w(trunc)(zig_div_f##w(lhs, rhs)); \
+ return zig_float_fn_f##w##_trunc(zig_div_f##w(lhs, rhs)); \
} \
\
static inline zig_f##w zig_div_floor_f##w(zig_f##w lhs, zig_f##w rhs) { \
- return zig_libc_name_f##w(floor)(zig_div_f##w(lhs, rhs)); \
+ return zig_float_fn_f##w##_floor(zig_div_f##w(lhs, rhs)); \
} \
\
static inline zig_f##w zig_mod_f##w(zig_f##w lhs, zig_f##w rhs) { \
@@ -3458,7 +3472,7 @@ zig_float_builtins(64)
zig_##Type zig_atomicrmw_desired; \
zig_atomic_load(zig_atomicrmw_expected, obj, memory_order_relaxed, Type, ReprType); \
do { \
- zig_atomicrmw_desired = zig_libc_name_##Type(fmin)(zig_atomicrmw_expected, arg); \
+ zig_atomicrmw_desired = zig_float_fn_##Type##_fmin(zig_atomicrmw_expected, arg); \
} while (!zig_cmpxchg_weak(obj, zig_atomicrmw_expected, zig_atomicrmw_desired, order, memory_order_relaxed, Type, ReprType)); \
res = zig_atomicrmw_expected; \
} while (0)
@@ -3467,7 +3481,7 @@ zig_float_builtins(64)
zig_##Type zig_atomicrmw_desired; \
zig_atomic_load(zig_atomicrmw_expected, obj, memory_order_relaxed, Type, ReprType); \
do { \
- zig_atomicrmw_desired = zig_libc_name_##Type(fmax)(zig_atomicrmw_expected, arg); \
+ zig_atomicrmw_desired = zig_float_fn_##Type##_fmax(zig_atomicrmw_expected, arg); \
} while (!zig_cmpxchg_weak(obj, zig_atomicrmw_expected, zig_atomicrmw_desired, order, memory_order_relaxed, Type, ReprType)); \
res = zig_atomicrmw_expected; \
} while (0)