[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
[RFC v3 14/32] scripts/qapi: add QAPISchemaIfCond.rsgen(), marcandre . lureau, 2021/09/07
[RFC v3 15/32] scripts/qapi: strip trailing whitespaces, marcandre . lureau, 2021/09/07
[RFC v3 16/32] scripts/qapi: add Rust FFI bindings generation, marcandre . lureau, 2021/09/07
[RFC v3 17/32] scripts/qapi: learn to generate ABI dump for Rust FFI,
marcandre . lureau <=
[RFC v3 18/32] tests: generate Rust bindings, marcandre . lureau, 2021/09/07
[RFC v3 19/32] tests: check Rust and C CABI diffs, marcandre . lureau, 2021/09/07
[RFC v3 20/32] scripts/qapi: generate high-level Rust bindings, marcandre . lureau, 2021/09/07
[RFC v3 22/32] qga: build qapi-cabi binary (ABI from C), marcandre . lureau, 2021/09/07
[RFC v3 21/32] tests/rust: build a common library, checking bindings compile, marcandre . lureau, 2021/09/07
[RFC v3 23/32] qga/rust: build and link an empty static library, marcandre . lureau, 2021/09/07
[RFC v3 24/32] qga/rust: generate QGA QAPI types FFI bindings, marcandre . lureau, 2021/09/07
[RFC v3 25/32] qga/rust: build a qga-cabi-rs executable (ABI from Rust), marcandre . lureau, 2021/09/07
[RFC v3 26/32] qga/rust: check the Rust C binding, marcandre . lureau, 2021/09/07
[RFC v3 27/32] qga/rust: build high-level Rust QAPI types, marcandre . lureau, 2021/09/07