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);

Reply via email to