qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC v3 17/32] scripts/qapi: learn to generate ABI dump for Rust FFI


From: marcandre . lureau
Subject: [RFC v3 17/32] scripts/qapi: learn to generate ABI dump for Rust FFI
Date: Tue, 7 Sep 2021 16:19:28 +0400

From: Marc-André Lureau <marcandre.lureau@redhat.com>

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 scripts/qapi/cabi.py | 50 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/scripts/qapi/cabi.py b/scripts/qapi/cabi.py
index f33680477f..29c6d5144d 100644
--- a/scripts/qapi/cabi.py
+++ b/scripts/qapi/cabi.py
@@ -7,6 +7,7 @@
 from typing import List, Optional
 
 from .common import c_enum_const, c_name, mcgen
+from .rs import rs_name, to_snake_case
 from .schema import (
     QAPISchemaEnumMember,
     QAPISchemaIfCond,
@@ -24,6 +25,9 @@ def __init__(self, name: str, ifcond: QAPISchemaIfCond):
     def gen_c(self) -> str:
         raise NotImplementedError()
 
+    def gen_rs(self) -> str:
+        raise NotImplementedError()
+
 
 class CABIEnum(CABI):
     def __init__(
@@ -48,6 +52,19 @@ def gen_c(self) -> str:
         ret += self.ifcond.gen_endif()
         return ret
 
+    def gen_rs(self) -> str:
+        return mcgen("""
+%(cfg)s
+{
+    println!("%(name)s enum: sizeof={}", ::std::mem::size_of::<%(rs_name)s>());
+    println!(" max={}", %(rs_name)s::_MAX as u32);
+    println!();
+}
+""",
+                     name=self.name,
+                     rs_name=rs_name(self.name),
+                     cfg=self.ifcond.rsgen())
+
 
 class CABIStruct(CABI):
     def __init__(self, name: str, ifcond: QAPISchemaIfCond):
@@ -84,6 +101,21 @@ def gen_c(self) -> str:
         ret += self.ifcond.gen_endif()
         return ret
 
+    def gen_rs(self) -> str:
+        ret = mcgen("""
+%(cfg)s
+{
+    println!("%(name)s struct: sizeof={}",
+        ::std::mem::size_of::<%(rs_name)s>());
+""", name=self.name, rs_name=rs_name(self.name), cfg=self.ifcond.rsgen())
+        for member in self.members:
+            ret += member.gen_rs()
+        ret += mcgen("""
+    println!();
+}
+""")
+        return ret
+
 
 class CABIStructMember:
     def __init__(self, struct: CABIStruct, name: str,
@@ -105,6 +137,24 @@ def gen_c(self) -> str:
         ret += self.ifcond.gen_endif()
         return ret
 
+    def gen_rs(self) -> str:
+        ret = ''
+        if self.ifcond:
+            ret += self.ifcond.rsgen()
+        protect = not self.prefix or self.prefix[-1] == '.'
+        rsmember = self.prefix + to_snake_case(rs_name(self.name, protect))
+        ret += mcgen("""
+unsafe {
+    println!(" %(member)s member: sizeof={} offset={}",
+        ::std::mem::size_of_val(
+            &(*::std::ptr::null::<%(sname)s>()).%(rsmember)s
+        ),
+        &(*(::std::ptr::null::<%(sname)s>())).%(rsmember)s as *const _ as usize
+    );
+}
+""", member=self.name, sname=rs_name(self.struct.name), rsmember=rsmember)
+        return ret
+
 
 def gen_object_cabi(
     name: str,
-- 
2.33.0.113.g6c40894d24




reply via email to

[Prev in Thread] Current Thread [Next in Thread]