This is an automated email from the ASF dual-hosted git repository. tqchen pushed a commit to branch refactor-s1 in repository https://gitbox.apache.org/repos/asf/tvm.git
commit 0b441dfa51205ffddffa69f0e99dec2c8dc106a7 Author: tqchen <[email protected]> AuthorDate: Sun Apr 13 17:18:01 2025 -0400 [FFI] 32bit compact --- ffi/include/tvm/ffi/base_details.h | 12 ++++++++++++ ffi/include/tvm/ffi/string.h | 1 + ffi/include/tvm/ffi/type_traits.h | 10 ++++++---- ffi/tests/cpp/test_reflection.cc | 11 ++++++----- ffi/tests/cpp/test_string.cc | 6 +++--- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/ffi/include/tvm/ffi/base_details.h b/ffi/include/tvm/ffi/base_details.h index a779eb89ea..9debc5b8ee 100644 --- a/ffi/include/tvm/ffi/base_details.h +++ b/ffi/include/tvm/ffi/base_details.h @@ -99,6 +99,18 @@ throw err; \ } +/*! + * \brief Clear the padding parts so we can safely use v_int64 for hash + * and equality check even when the value stored is a pointer. + * + * This macro is used to clear the padding parts for hash and equality check + * in 32bit platform. + */ +#define TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result) \ + if constexpr (sizeof(result->v_obj) != sizeof(result->v_int64)) { \ + result->v_int64 = 0; \ + } + namespace tvm { namespace ffi { namespace details { diff --git a/ffi/include/tvm/ffi/string.h b/ffi/include/tvm/ffi/string.h index 9406bd2cd3..c41b41c92e 100644 --- a/ffi/include/tvm/ffi/string.h +++ b/ffi/include/tvm/ffi/string.h @@ -440,6 +440,7 @@ struct TypeTraits<TVMFFIByteArray*> : public TypeTraitsBase { static TVM_FFI_INLINE void CopyToAnyView(TVMFFIByteArray* src, TVMFFIAny* result) { TVM_FFI_ICHECK_NOTNULL(src); result->type_index = TypeIndex::kTVMFFIByteArrayPtr; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_ptr = src; } diff --git a/ffi/include/tvm/ffi/type_traits.h b/ffi/include/tvm/ffi/type_traits.h index 7ec340f59a..aceb04676c 100644 --- a/ffi/include/tvm/ffi/type_traits.h +++ b/ffi/include/tvm/ffi/type_traits.h @@ -301,10 +301,7 @@ struct TypeTraits<void*> : public TypeTraitsBase { static TVM_FFI_INLINE void CopyToAnyView(void* src, TVMFFIAny* result) { result->type_index = TypeIndex::kTVMFFIOpaquePtr; - // maintain padding zero in 32bit platform - if constexpr (sizeof(void*) != sizeof(int64_t)) { - result->v_int64 = 0; - } + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_ptr = src; } @@ -384,6 +381,7 @@ struct TypeTraits<DLTensor*> : public TypeTraitsBase { static TVM_FFI_INLINE void CopyToAnyView(DLTensor* src, TVMFFIAny* result) { TVM_FFI_ICHECK_NOTNULL(src); result->type_index = TypeIndex::kTVMFFIDLTensorPtr; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_ptr = src; } @@ -428,6 +426,7 @@ struct ObjectRefTypeTraitsBase : public TypeTraitsBase { } TVMFFIObject* obj_ptr = details::ObjectUnsafe::TVMFFIObjectPtrFromObjectRef(src); result->type_index = obj_ptr->type_index; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_obj = obj_ptr; } @@ -440,6 +439,7 @@ struct ObjectRefTypeTraitsBase : public TypeTraitsBase { } TVMFFIObject* obj_ptr = details::ObjectUnsafe::MoveObjectRefToTVMFFIObjectPtr(std::move(src)); result->type_index = obj_ptr->type_index; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_obj = obj_ptr; } @@ -573,12 +573,14 @@ struct TypeTraits<const TObject*, std::enable_if_t<std::is_base_of_v<Object, TOb static TVM_FFI_INLINE void CopyToAnyView(const TObject* src, TVMFFIAny* result) { TVMFFIObject* obj_ptr = details::ObjectUnsafe::GetHeader(src); result->type_index = obj_ptr->type_index; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_obj = obj_ptr; } static TVM_FFI_INLINE void MoveToAny(const TObject* src, TVMFFIAny* result) { TVMFFIObject* obj_ptr = details::ObjectUnsafe::GetHeader(src); result->type_index = obj_ptr->type_index; + TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result); result->v_obj = obj_ptr; // needs to increase ref because original weak ptr do not own the code details::ObjectUnsafe::IncRefObjectHandle(result->v_obj); diff --git a/ffi/tests/cpp/test_reflection.cc b/ffi/tests/cpp/test_reflection.cc index a69505935c..8e229eface 100644 --- a/ffi/tests/cpp/test_reflection.cc +++ b/ffi/tests/cpp/test_reflection.cc @@ -29,14 +29,15 @@ using namespace tvm::ffi; using namespace tvm::ffi::testing; struct A : public Object { - ObjectRef obj; - int32_t x; - int32_t y; + int64_t x; + int64_t y; }; TEST(Reflection, GetFieldByteOffset) { - EXPECT_EQ(details::GetFieldByteOffsetToObject(&A::x), 8 + sizeof(TVMFFIObject)); - EXPECT_EQ(details::GetFieldByteOffsetToObject(&A::y), 12 + sizeof(TVMFFIObject)); + + + EXPECT_EQ(details::GetFieldByteOffsetToObject(&A::x), sizeof(TVMFFIObject)); + EXPECT_EQ(details::GetFieldByteOffsetToObject(&A::y), 8 + sizeof(TVMFFIObject)); EXPECT_EQ(details::GetFieldByteOffsetToObject(&TIntObj::value), sizeof(TVMFFIObject)); } diff --git a/ffi/tests/cpp/test_string.cc b/ffi/tests/cpp/test_string.cc index d2c395bfb0..847ed6f955 100644 --- a/ffi/tests/cpp/test_string.cc +++ b/ffi/tests/cpp/test_string.cc @@ -300,7 +300,7 @@ TEST(String, Bytes) { EXPECT_EQ(b.size(), 4); EXPECT_EQ(b.operator std::string(), s); - TVMFFIByteArray arr{s.data(), static_cast<int64_t>(s.size())}; + TVMFFIByteArray arr{s.data(), static_cast<size_t>(s.size())}; Bytes b2 = arr; EXPECT_EQ(b2.size(), 4); EXPECT_EQ(b2.operator std::string(), s); @@ -308,7 +308,7 @@ TEST(String, Bytes) { TEST(String, BytesAny) { std::string s = {'\0', 'a', 'b', 'c'}; - TVMFFIByteArray arr{s.data(), static_cast<int64_t>(s.size())}; + TVMFFIByteArray arr{s.data(), static_cast<size_t>(s.size())}; AnyView view = &arr; EXPECT_EQ(view.type_index(), TypeIndex::kTVMFFIByteArrayPtr); @@ -327,7 +327,7 @@ TEST(String, StdString) { EXPECT_EQ(view1.type_index(), TypeIndex::kTVMFFIRawStr); EXPECT_EQ(view1.as<std::string>().value(), s1); - TVMFFIByteArray arr1{s1.data(), static_cast<int64_t>(s1.size())}; + TVMFFIByteArray arr1{s1.data(), static_cast<size_t>(s1.size())}; AnyView view2 = &arr1; EXPECT_EQ(view2.type_index(), TypeIndex::kTVMFFIByteArrayPtr); EXPECT_EQ(view2.as<std::string>().value(), s1);
