summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorswarmer <[email protected]>2026-07-06 20:16:10 +0300
committerswarmer <[email protected]>2026-07-06 20:51:08 +0300
commitc0103a765a3d969af6adebc562976fefe3e2cd41 (patch)
treedac81e1d4c02f588ffaf5ad939cf619b712a53c4
parent419745c91be602ca853b51cf7e6cb08164375122 (diff)
Use trivial_abi in THolder
Apply trivial_abi to THolder so it can be passed directly in registers instead of through an invisible reference to caller-allocated memory. commit_hash:b63c37dd510deb46bb146c54dbab6daa91db588a
-rw-r--r--util/generic/fwd.h2
-rw-r--r--util/generic/ptr.h2
-rw-r--r--util/system/compiler.h13
3 files changed, 15 insertions, 2 deletions
diff --git a/util/generic/fwd.h b/util/generic/fwd.h
index d07deeb37d6..cfc98dd9902 100644
--- a/util/generic/fwd.h
+++ b/util/generic/fwd.h
@@ -101,7 +101,7 @@ template <class T, class D = TDelete>
class TAutoPtr;
template <class T, class D = TDelete>
-class THolder;
+class Y_TRIVIAL_ABI THolder;
template <class T, class C, class D = TDelete>
class TRefCounted;
diff --git a/util/generic/ptr.h b/util/generic/ptr.h
index 04cfe50a425..7219a1c85ca 100644
--- a/util/generic/ptr.h
+++ b/util/generic/ptr.h
@@ -260,7 +260,7 @@ private:
};
template <class T, class D>
-class THolder: public TPointerBase<THolder<T, D>, T> {
+class Y_TRIVIAL_ABI THolder: public TPointerBase<THolder<T, D>, T> {
public:
constexpr THolder() noexcept
: T_(nullptr)
diff --git a/util/system/compiler.h b/util/system/compiler.h
index db4416a6c65..e716438b97c 100644
--- a/util/system/compiler.h
+++ b/util/system/compiler.h
@@ -839,6 +839,19 @@ Y_FORCE_INLINE void DoNotOptimizeAway(const T&) = delete;
#endif
/**
+ * @def Y_TRIVIAL_ABI
+ *
+ * Indicates that a class or structure can be considered trivial for the purpose of calls.
+ *
+ * @see https://clang.llvm.org/docs/AttributeReference.html#trivial-abi
+ */
+#if Y_HAS_CPP_ATTRIBUTE(clang::trivial_abi)
+ #define Y_TRIVIAL_ABI [[clang::trivial_abi]]
+#else
+ #define Y_TRIVIAL_ABI
+#endif
+
+/**
* @def Y_CORO_AWAIT_ELIDABLE
*
* A class attribute which can be applied to a coroutine return type.