Skip to content

Commit c119149

Browse files
committed
Skip serializing empty type headers
1 parent 3327b93 commit c119149

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

cobalt-ast/src/context.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub struct Flags {
2626
pub all_move_metadata: bool,
2727
pub private_syms: bool,
2828
pub skip_header_version_check: bool,
29+
pub add_type_map: bool,
2930
}
3031
impl Default for Flags {
3132
fn default() -> Self {
@@ -37,6 +38,7 @@ impl Default for Flags {
3738
all_move_metadata: false,
3839
private_syms: true,
3940
skip_header_version_check: false,
41+
add_type_map: false,
4042
}
4143
}
4244
}
@@ -331,9 +333,13 @@ impl Serialize for CtxTypeSerde<'_, '_, '_> {
331333
{
332334
use ser::*;
333335
let tsr = TYPE_SERIAL_REGISTRY.pin();
334-
let mut map = serializer.serialize_map(Some(tsr.len()))?;
336+
let mut map = serializer.serialize_map(Some(
337+
tsr.iter().filter(|(_, info)| (info.has_header)()).count(),
338+
))?;
335339
for (id, info) in &tsr {
336-
map.serialize_entry(&HexArray(id.to_le_bytes()), &(info.erased_header)())?;
340+
if (info.has_header)() {
341+
map.serialize_entry(&HexArray(id.to_le_bytes()), &(info.erased_header)())?;
342+
}
337343
}
338344
map.end()
339345
}
@@ -384,8 +390,19 @@ impl Serialize for CompCtx<'_, '_> {
384390
}
385391
}
386392
});
387-
let mut map = serializer.serialize_struct("Context", 3)?;
393+
let mut map =
394+
serializer.serialize_struct("Context", 3 + usize::from(self.flags.add_type_map))?;
388395
map.serialize_field("version", &HEADER_FMT_VERSION)?;
396+
if self.flags.add_type_map {
397+
map.serialize_field(
398+
"names",
399+
&TYPE_SERIAL_REGISTRY
400+
.pin()
401+
.iter()
402+
.map(|(k, v)| (hex::encode(k.to_le_bytes()), v.name))
403+
.collect::<hashbrown::HashMap<_, _>>(),
404+
)?;
405+
}
389406
map.serialize_field("types", &CtxTypeSerde(self))?;
390407
self.with_vars(|v| map.serialize_field("vars", v))?;
391408
SERIALIZATION_CONTEXT.with(|c| {
@@ -399,6 +416,8 @@ impl Serialize for CompCtx<'_, '_> {
399416
#[serde(bound = "'a: 'de")]
400417
struct ContextDeProxy<'a> {
401418
version: u16,
419+
#[serde(rename = "names")]
420+
_names: Option<serde::de::IgnoredAny>, // if it gets into the serialization, ignore it for deserialization - it should be stable
402421
#[serde(borrow = "'a")]
403422
types: serde::__private::de::Content<'a>,
404423
#[serde(borrow = "'a")]

cobalt-ast/src/types.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,18 @@ impl<T: ConcreteType> TypeKind for T {
8787
pub trait TypeSerde: Sized {
8888
type Header: Serialize + DeserializeOwned;
8989
type Proxy: Serialize + DeserializeOwned;
90+
fn has_header() -> bool {
91+
true
92+
}
9093
fn get_header() -> Self::Header;
9194
fn set_header(header: Self::Header);
9295
fn get_proxy(&'static self) -> Self::Proxy;
9396
fn from_proxy(body: Self::Proxy) -> &'static Self;
9497
}
9598
pub trait TypeSerdeFns {
99+
fn has_header() -> bool
100+
where
101+
Self: Sized;
96102
fn erased_header() -> Box<dyn erased_serde::Serialize>
97103
where
98104
Self: Sized;
@@ -109,6 +115,9 @@ pub trait TypeSerdeFns {
109115
Self: Sized;
110116
}
111117
impl<T: Type + TypeSerde> TypeSerdeFns for T {
118+
fn has_header() -> bool {
119+
<Self as TypeSerde>::has_header()
120+
}
112121
fn erased_header() -> Box<dyn erased_serde::Serialize> {
113122
Box::new(Self::get_header())
114123
}
@@ -136,6 +145,9 @@ pub trait NullType: Type {
136145
impl<T: NullType> TypeSerde for T {
137146
type Header = ();
138147
type Proxy = ();
148+
fn has_header() -> bool {
149+
false
150+
}
139151
fn get_header() -> Self::Header {}
140152
fn set_header(header: Self::Header) {}
141153
fn get_proxy(&'static self) -> Self::Proxy {}
@@ -146,6 +158,9 @@ impl<T: NullType> TypeSerde for T {
146158
macro_rules! no_type_header {
147159
() => {
148160
type Header = ();
161+
fn has_header() -> bool {
162+
false
163+
}
149164
fn get_header() -> Self::Header {}
150165
fn set_header(header: Self::Header) {}
151166
};
@@ -732,6 +747,8 @@ impl<'de> Deserialize<'de> for TypeRef {
732747
}
733748
pub struct TypeLoader {
734749
pub kind: u64,
750+
pub name: fn() -> &'static str,
751+
pub has_header: fn() -> bool,
735752
pub erased_header: fn() -> Box<dyn erased_serde::Serialize>,
736753
pub load_header: fn(&mut dyn erased_serde::Deserializer) -> Result<(), erased_serde::Error>,
737754
pub load: fn(&mut dyn erased_serde::Deserializer) -> Result<TypeRef, erased_serde::Error>,
@@ -741,6 +758,11 @@ macro_rules! type_loader {
741758
($T:ty) => {
742759
$crate::types::TypeLoader {
743760
kind: <$T as $crate::types::ConcreteType>::KIND,
761+
name: || {
762+
let s = ::std::any::type_name::<$T>();
763+
s.rsplit_once("::").map_or(s, |x| x.1)
764+
},
765+
has_header: <$T as $crate::types::TypeSerdeFns>::has_header,
744766
erased_header: <$T as $crate::types::TypeSerdeFns>::erased_header,
745767
load_header: <$T as $crate::types::TypeSerdeFns>::load_header,
746768
load: <$T as $crate::types::TypeSerdeFns>::load,
@@ -758,23 +780,29 @@ macro_rules! submit_types {
758780
}
759781
inventory::collect!(TypeLoader);
760782
pub struct LoadInfo {
783+
pub has_header: fn() -> bool,
761784
pub erased_header: fn() -> Box<dyn erased_serde::Serialize>,
762785
pub load_header: fn(&mut dyn erased_serde::Deserializer) -> Result<(), erased_serde::Error>,
763786
pub load: fn(&mut dyn erased_serde::Deserializer) -> Result<TypeRef, erased_serde::Error>,
787+
pub name: &'static str,
764788
}
765789
impl LoadInfo {
766790
pub fn new(
767791
&TypeLoader {
768792
kind,
793+
has_header,
769794
erased_header,
770795
load_header,
771796
load,
797+
name,
772798
..
773799
}: &'static TypeLoader,
774800
) -> (u64, Self) {
775801
(
776802
kind,
777803
Self {
804+
name: name(),
805+
has_header,
778806
erased_header,
779807
load_header,
780808
load,

cobalt-ast/src/types/custom.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ impl<'de> Deserialize<'de> for CustomHeader {
243243
}
244244
impl TypeSerde for Custom {
245245
type Header = CustomHeader;
246+
fn has_header() -> bool {
247+
!CUSTOM_DATA.is_empty() // may return a false positive but much faster than iterating
248+
}
246249
fn get_header() -> Self::Header {
247250
CustomHeader
248251
}

cobalt-cli/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,7 @@ pub fn driver(cli: Cli) -> anyhow::Result<()> {
13931393
{
13941394
flags.word_size = size as u16;
13951395
}
1396+
flags.add_type_map = dump_header;
13961397
let ctx = CompCtx::with_flags(&ink_ctx, &input_name, flags);
13971398
let trip = TargetMachine::get_default_triple();
13981399
let triple = trip.as_str().to_string_lossy();
@@ -2360,6 +2361,7 @@ pub fn driver(cli: Cli) -> anyhow::Result<()> {
23602361
{
23612362
flags.word_size = size as u16;
23622363
}
2364+
flags.add_type_map = dump_header;
23632365
let ctx = CompCtx::with_flags(&ink_ctx, "multi-check", flags);
23642366
ctx.module.set_triple(&trip);
23652367
let mut cc = cc::CompileCommand::new();

0 commit comments

Comments
 (0)