Skip to content

Commit 51d778b

Browse files
ezhulenevshawnwang18
authored andcommitted
[xla:ffi] Make TypeInfo mandatory in XLA_FFI_REGISTER_TYPE
Add placeholders for future Type serialization/deserialization. It's not an ABI breaking change as it's unused today, and it allows to avoid ABI breaking change in the future when FFI will add proper ser/des support for user defined types. PiperOrigin-RevId: 820676169
1 parent ffb628b commit 51d778b

File tree

4 files changed

+16
-24
lines changed

4 files changed

+16
-24
lines changed

xla/ffi/api/c_api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ typedef struct XLA_FFI_TypeId {
272272
// to destroy their state when executable is being destroyed.
273273
typedef struct XLA_FFI_TypeInfo {
274274
void (*deleter)(void* object);
275+
void (*serialize)(); // placeholder for future use
276+
void (*deserialize)(); // placeholder for future use
275277
} XLA_FFI_TypeInfo;
276278

277279
// We use byte spans to pass strings to handlers because strings might not be

xla/ffi/api/ffi.h

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,33 +1466,20 @@ struct CtxDecoding<FfiExecutionContext> {
14661466
//===----------------------------------------------------------------------===//
14671467

14681468
template <typename T>
1469-
XLA_FFI_TypeInfo TypeInfo() {
1469+
constexpr XLA_FFI_TypeInfo TypeInfo() {
14701470
return XLA_FFI_TypeInfo{[](void* ptr) { delete static_cast<T*>(ptr); }};
14711471
}
14721472

1473-
#define XLA_FFI_REGISTER_TYPE_WITH_INFO(API, NAME, TYPE_ID, TYPE_INFO) \
1474-
XLA_FFI_REGISTER_TYPE_WITH_INFO_(API, NAME, TYPE_ID, TYPE_INFO, __COUNTER__)
1475-
#define XLA_FFI_REGISTER_TYPE_WITH_INFO_(API, NAME, TYPE_ID, TYPE_INFO, N) \
1476-
XLA_FFI_REGISTER_TYPE_WITH_INFO__(API, NAME, TYPE_ID, TYPE_INFO, N)
1477-
#define XLA_FFI_REGISTER_TYPE_WITH_INFO__(API, NAME, TYPE_ID, TYPE_INFO, N) \
1473+
#define XLA_FFI_REGISTER_TYPE(API, NAME, TYPE_ID, TYPE_INFO) \
1474+
XLA_FFI_REGISTER_TYPE_(API, NAME, TYPE_ID, TYPE_INFO, __COUNTER__)
1475+
#define XLA_FFI_REGISTER_TYPE_(API, NAME, TYPE_ID, TYPE_INFO, N) \
1476+
XLA_FFI_REGISTER_TYPE__(API, NAME, TYPE_ID, TYPE_INFO, N)
1477+
#define XLA_FFI_REGISTER_TYPE__(API, NAME, TYPE_ID, TYPE_INFO, N) \
14781478
XLA_FFI_ATTRIBUTE_UNUSED static const XLA_FFI_Error* \
14791479
xla_ffi_type_##N##_registered_ = [] { \
14801480
return ::xla::ffi::Ffi::RegisterTypeId(API, NAME, TYPE_ID, TYPE_INFO); \
14811481
}()
14821482

1483-
#define XLA_FFI_REGISTER_TYPE_X(x, API, NAME, TYPE_ID, TYPE_INFO, FUNC, ...) \
1484-
FUNC
1485-
1486-
// Registers external type with XLA runtime and assigns it a unique type id.
1487-
//
1488-
// This is a trick to define macro with optional parameters.
1489-
// Source: https://stackoverflow.com/a/8814003
1490-
#define XLA_FFI_REGISTER_TYPE(API, NAME, TYPE_ID, ...) \
1491-
XLA_FFI_REGISTER_TYPE_X( \
1492-
, API, NAME, TYPE_ID, ##__VA_ARGS__, \
1493-
XLA_FFI_REGISTER_TYPE_WITH_INFO(API, NAME, TYPE_ID, __VA_ARGS__), \
1494-
XLA_FFI_REGISTER_TYPE_WITH_INFO(API, NAME, TYPE_ID, {nullptr}))
1495-
14961483
//===----------------------------------------------------------------------===//
14971484
// UserData
14981485
//===----------------------------------------------------------------------===//

xla/ffi/api/ffi_test.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,13 +1202,14 @@ struct MyDataWithExplicitTypeId {
12021202

12031203
// Rely on XLA to assign unique type id for the type.
12041204
TypeId MyDataWithAutoTypeId::id = XLA_FFI_UNKNOWN_TYPE_ID;
1205-
XLA_FFI_REGISTER_TYPE(GetXlaFfiApi(), "my_data_auto",
1206-
&MyDataWithAutoTypeId::id);
1205+
XLA_FFI_REGISTER_TYPE(GetXlaFfiApi(), "my_data_auto", &MyDataWithAutoTypeId::id,
1206+
TypeInfo<MyDataWithAutoTypeId>());
12071207

12081208
// Provide explicit type id and rely on XLA to check that it's unique.
12091209
TypeId MyDataWithExplicitTypeId::id = {42};
12101210
XLA_FFI_REGISTER_TYPE(GetXlaFfiApi(), "my_data_explicit",
1211-
&MyDataWithExplicitTypeId::id);
1211+
&MyDataWithExplicitTypeId::id,
1212+
TypeInfo<MyDataWithExplicitTypeId>());
12121213

12131214
TEST(FfiTest, UserData) {
12141215
MyDataWithAutoTypeId data0{"foo"};
@@ -1253,7 +1254,8 @@ struct MyState {
12531254
};
12541255

12551256
TypeId MyState::id = {}; // zero-initialize type id
1256-
XLA_FFI_REGISTER_TYPE(GetXlaFfiApi(), "state", &MyState::id);
1257+
XLA_FFI_REGISTER_TYPE(GetXlaFfiApi(), "state", &MyState::id,
1258+
TypeInfo<MyState>());
12571259

12581260
TEST(FfiTest, StatefulHandler) {
12591261
ExecutionState execution_state;

xla/pjrt/host_callback.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ CreateHostCallbackStateAndAppendSendRecvCallbacks(
181181
// First 64 bits of SHA-512 of "xla::FfiLoadedHostCallbacks".
182182
ffi::TypeId FfiLoadedHostCallbacks::id = {7357244197867843242};
183183
XLA_FFI_REGISTER_TYPE(ffi::GetXlaFfiApi(), "FfiLoadedHostCallbacks",
184-
&FfiLoadedHostCallbacks::id);
184+
&FfiLoadedHostCallbacks::id,
185+
ffi::TypeInfo<FfiLoadedHostCallbacks>());
185186

186187
} // namespace xla

0 commit comments

Comments
 (0)