DWriteCore: Windows App SDK 1.6.1 (PDB 9DA72605) -> 2.1.1 (PDB 92A5ED42) ============================================================================== Method: functions = distinct code addresses named by S_LPROC32/S_GPROC32 module records or by publics with flags=function; language = the object file that contributed the address (rustc .rcgu.o = Rust; hand-written .obj = C/C++; MSVC CRT/STL objects listed separately). Code bytes = section contributions flagged as code, per contributing object. Public PDBs omit inlined code and every count is a lower bound; ratios by count are not ratios by bytes. 1.6.1 2.1.1 delta Rust functions (by object) 1,356 1,274 -82 (-6.0%) C/C++ functions (by object, incl. EH funclets) 5,252 5,086 -166 (-3.2%) of which EH funclets (dtor$/catch$) 1,295 1,219 -76 (-5.9%) C/C++ functions excluding funclets 3,957 3,867 -90 (-2.3%) MSVC CRT/STL functions 326 314 -12 (-3.7%) All named functions 6,966 6,708 -258 (-3.7%) Rust code bytes 1,081,273 1,108,273 +27,000 (2.5%) C/C++ code bytes 746,148 766,838 +20,690 (2.8%) MSVC CRT/STL code bytes 40,875 37,886 -2,989 (-7.3%) All attributed code bytes 1,868,488 1,913,201 +44,713 (2.4%) .text VirtualSize (binary) 1,894,009 1,938,833 +44,824 (2.4%) Rust share of named functions: 19.5% -> 19.0% Rust share of attributed code bytes: 57.9% -> 57.9% Publics by mangling (for completeness; Rust functions are LTO-internalized and never reach the publics table): dwritecore161: publics=6,479 rust-mangled=2 msvc=5,554 plain/other=923 dwritecore211: publics=8,424 rust-mangled=0 msvc=7,369 plain/other=1,055 Coverage of Rust code bytes by sized function records: 92.7% (1.6.1), 91.8% (2.1.1); C/C++: 25.1% and 27.2% (external C++ functions are named by publics but carry no size in a public PDB). Naming note: the umbrella crate that implements the DirectWrite API surface is called 'api_impl' in 1.6.1 (227 functions) and 'dwrite' in 2.1.1 (207 functions); 'api_impl' survives in 2.1.1 only as a small crate of 17 functions. Treat api_impl+dwrite as one unit when comparing. Likewise the COM plumbing moved from the 'com' crate (1.6.1, 10 fns) to 'windows_core' (2.1.1, 71 fns); both are Microsoft-authored crates published on crates.io. api_impl + dwrite combined: 228 -> 224 functions (-4) Crates added in 2.1.1 (not present in 1.6.1): bitvec third-party 0 1 +1 foldhash third-party 0 3 +3 shaping_cache first-party 0 15 +15 shaping_unicode_data first-party 0 1 +1 windows_core third-party 0 71 +71 windows_result third-party 0 1 +1 zerocopy third-party 0 2 +2 Crates removed in 2.1.1 (present in 1.6.1 only): bumpalo_pool first-party 2 0 -2 com third-party 10 0 -10 com_utils first-party 1 0 -1 rustc_demangle stdlib 31 0 -31 shaping_interop first-party 19 0 -19 Per-crate function count, every crate (first-party listed first, then third-party, then stdlib): crate class 1.6.1 2.1.1 delta dwrite first-party 1 207 +206 truetype first-party 164 163 -1 shaping first-party 109 108 -1 otls first-party 94 94 +0 layout first-party 68 59 -9 unicode_analysis first-party 26 25 -1 api_impl first-party 227 17 -210 shaping_cache first-party 0 15 +15 variation first-party 15 14 -1 font_fallback first-party 9 9 +0 langtag first-party 8 9 +1 dwritecore_defs first-party 5 6 +1 unicode_interop first-party 13 6 -7 sfnt_reader first-party 6 5 -1 glyph_rendering_subpixel first-party 3 3 +0 font_fallback_com first-party 14 2 -12 font_rasterizers first-party 2 2 +0 last_resort_font first-party 10 2 -8 fixedpoint first-party 1 1 +0 opentype_decoder_runtime first-party 1 1 +0 read_at first-party 1 1 +0 rendering_helpers first-party 1 1 +0 shaping_unicode_data first-party 0 1 +1 bumpalo_pool first-party 2 0 -2 com_utils first-party 1 0 -1 shaping_interop first-party 19 0 -19 windows_core third-party 0 71 +71 bumpalo third-party 6 10 +4 widestring third-party 6 4 -2 foldhash third-party 0 3 +3 smallvec third-party 2 2 +0 zerocopy third-party 0 2 +2 bitvec third-party 0 1 +1 windows_result third-party 0 1 +1 com third-party 10 0 -10 core stdlib 250 222 -28 alloc stdlib 88 81 -7 std stdlib 76 44 -32 hashbrown stdlib 6 5 -1 panic_unwind stdlib 3 3 +0 rustc_demangle stdlib 31 0 -31 Per-crate Rust code bytes (sized functions only): crate class 1.6.1 2.1.1 delta dwrite first-party 808 107,745 +106,937 truetype first-party 181,713 174,448 -7,265 shaping first-party 259,731 263,632 +3,901 otls first-party 96,827 95,253 -1,574 layout first-party 110,721 107,214 -3,507 unicode_analysis first-party 19,146 19,670 +524 api_impl first-party 97,094 7,764 -89,330 shaping_cache first-party 0 25,588 +25,588 variation first-party 13,534 13,276 -258 font_fallback first-party 15,237 12,550 -2,687 langtag first-party 6,199 6,951 +752 dwritecore_defs first-party 3,215 11,078 +7,863 unicode_interop first-party 1,610 1,670 +60 sfnt_reader first-party 940 875 -65 glyph_rendering_subpixel first-party 3,952 787 -3,165 font_fallback_com first-party 15,677 853 -14,824 font_rasterizers first-party 28,815 31,370 +2,555 last_resort_font first-party 1,094 762 -332 fixedpoint first-party 164 164 +0 opentype_decoder_runtime first-party 35 34 -1 read_at first-party 46 46 +0 rendering_helpers first-party 244 236 -8 shaping_unicode_data first-party 0 90 +90 bumpalo_pool first-party 1,029 0 -1,029 com_utils first-party 231 0 -231 shaping_interop first-party 2,623 0 -2,623 windows_core third-party 0 6,712 +6,712 bumpalo third-party 1,309 2,209 +900 widestring third-party 2,131 2,645 +514 foldhash third-party 0 939 +939 smallvec third-party 933 814 -119 zerocopy third-party 0 513 +513 bitvec third-party 0 133 +133 windows_result third-party 0 1,961 +1,961 com third-party 1,040 0 -1,040 core stdlib 67,915 72,327 +4,412 alloc stdlib 14,061 13,573 -488 std stdlib 29,471 25,971 -3,500 hashbrown stdlib 4,727 7,261 +2,534 panic_unwind stdlib 313 308 -5 rustc_demangle stdlib 19,926 0 -19,926 Verdict (plain language): By code bytes (the reliable measure): the Rust side grew by 27,000 bytes (2.5%); the C/C++ side grew by 20,690 bytes (2.8%). By named-function count: Rust shrank by 82 (-6.0%); C/C++ shrank by 166 (-3.2%; 90 excluding EH funclets). Rust share of code bytes 57.9% -> 57.9%; share of named functions 19.5% -> 19.0%. So: the Rust side did not shrink and the C++ side did not shrink either; both grew by a few percent in bytes and the Rust share stayed flat. The lower function counts come from fewer, larger functions (inlining / different rustc and MSVC versions), not from code being removed. By target, the C++ OpenTypeShaping (11,750 bytes) and FontCacheL1 (10,097) modules are absent from 2.1.1 while FontCache (13,301) and SharedCache (1,040) appear on the C++ side and shaping_cache (25,588 bytes) on the Rust side: consistent with one small C++ shaping module replaced by Rust and one C++ cache layer renamed, and no larger migration. The API crate is api_impl in 1.6.1 and dwrite in 2.1.1; COM plumbing moved from com to windows_core. C/C++ code bytes by CMake target (module name prefix before '.dir\'), 1.6.1 vs 2.1.1: target 1.6.1 2.1.1 delta OpenTypeFont 151,401 154,336 +2,935 CffRasterizer 114,686 117,725 +3,039 ApiImpl 89,193 100,278 +11,085 FontApi 92,220 95,793 +3,573 GlyphData 60,761 62,893 +2,132 Binding 56,151 56,886 +735 OpenType 54,934 55,733 +799 RenderingHelpers 48,029 49,452 +1,423 FontStreaming 33,669 34,922 +1,253 Common 13,700 13,946 +246 FontCache 0 13,301 +13,301 Unicode 3,710 4,056 +346 CacheHelpers 2,213 2,150 -63 DWriteCore 911 1,557 +646 SharedCache 0 1,040 +1,040 TrueTypeRust 705 773 +68 BindingShared 730 762 +32 Language 623 572 -51 Layout 340 387 +47 FontBinding 325 276 -49 FontCacheL1 10,097 0 -10,097 OpenTypeShaping 11,750 0 -11,750