[fidl][rust] Add padding masks to fidl_struct! macro

This adds padding masks to the fidl_struct! macro, to apply padding more
directly at specific offsets where it is needed. The masks can be of
different integer sizes (u64, u32, u16) and are generated in fidlgen.

This CL only changes behavior in rust for encoding.
A later CL will also change decoding (this is harder to
do for decoding now because of the way offsets are managed by
the decoder object).

This also saves 94208 bytes in binary size.

Rust/Encode/BoolArray/256/WallTime                                                                       slower            1.094-1.097    1961.4 +/- 1.4 ns              2149.0 +/- 1.2 ns
Rust/Encode/ByteArray/16/WallTime                                                                        faster            0.933-0.938    67.865 +/- 0.088 ns            63.488 +/- 0.060 ns
Rust/Encode/ByteArray/256/WallTime                                                                       no_sig_diff       0.775-1.184    75.9 +/- 5.5 ns                73 +/- 10 ns
Rust/Encode/ByteVector/16/WallTime                                                                       faster            0.959-0.968    112.05 +/- 0.24 ns             107.98 +/- 0.30 ns
Rust/Encode/ByteVector/256/WallTime                                                                      no_sig_diff       0.949-1.037    152.9 +/- 3.9 ns               151.7 +/- 2.9 ns
Rust/Encode/ByteVector/4096/WallTime                                                                     no_sig_diff       0.953-1.069    411.8 +/- 9.4 ns               416 +/- 14 ns
Rust/Encode/ByteVector/65536/WallTime                                                                    no_sig_diff       0.951-1.119    4389 +/- 208 ns                4526 +/- 153 ns
Rust/Encode/ByteVectorLimit/1/WallTime                                                                   faster            0.954-0.965    111.42 +/- 0.23 ns             106.89 +/- 0.40 ns
Rust/Encode/DatagramSocket/RecvMsg/Request/WallTime                                                      faster            0.850-0.863    93.11 +/- 0.56 ns              79.76 +/- 0.14 ns
Rust/Encode/DatagramSocket/RecvMsg/Result/WallTime                                                       no_sig_diff       0.957-1.011    512.7 +/- 5.9 ns               504.4 +/- 8.0 ns
Rust/Encode/DatagramSocket/SendMsg2/Request/WallTime                                                     no_sig_diff       0.961-1.030    434.9 +/- 6.4 ns               432.8 +/- 8.7 ns
Rust/Encode/DatagramSocket/SendMsg2/Result/WallTime                                                      faster            0.971-0.974    120.237 +/- 0.068 ns           116.92 +/- 0.10 ns
Rust/Encode/EmptyStruct/WallTime                                                                         slower            1.003-1.016    50.03 +/- 0.18 ns              50.50 +/- 0.14 ns
Rust/Encode/EnumArray/256/WallTime                                                                       no_sig_diff       0.973-1.005    2876 +/- 18 ns                 2843 +/- 28 ns
Rust/Encode/ErrorSyntaxResult_Failure/WallTime                                                           slower            1.002-1.007    114.45 +/- 0.13 ns             114.98 +/- 0.15 ns
Rust/Encode/ErrorSyntaxResult_Success/WallTime                                                           faster            0.863-0.866    200.74 +/- 0.22 ns             173.499 +/- 0.096 ns
Rust/Encode/FloatArray/256/WallTime                                                                      no_sig_diff       0.919-1.029    2297 +/- 67 ns                 2234 +/- 62 ns
Rust/Encode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte1024/Semaphore32/WallTime                no_sig_diff       0.956-1.039    349.0 +/- 6.2 ns               347.9 +/- 8.3 ns
Rust/Encode/GPUMagma/ExecuteImmediateCommandsRequest/CommandByte128/Semaphore8/WallTime                  no_sig_diff       0.970-1.002    240.9 +/- 1.7 ns               237.5 +/- 2.2 ns
Rust/Encode/HardwareDisplay/OnVsyncEvent/Image64/WallTime                                                no_sig_diff       0.969-1.015    171.9 +/- 1.8 ns               170.5 +/- 2.2 ns
Rust/Encode/Int32Array/256/WallTime                                                                      no_sig_diff       0.917-1.047    138.0 +/- 4.6 ns               135.2 +/- 4.4 ns
Rust/Encode/Int32Vector/256/WallTime                                                                     no_sig_diff       0.952-1.049    214.4 +/- 4.5 ns               214.3 +/- 5.9 ns
Rust/Encode/Media/StreamPacket/WallTime                                                                  faster            0.791-0.795    134.20 +/- 0.31 ns             106.419 +/- 0.035 ns
Rust/Encode/MessageHeader/WallTime                                                                       faster            0.899-0.909    97.58 +/- 0.40 ns              88.23 +/- 0.12 ns
Rust/Encode/OptionalStructTree/Depth8/WallTime                                                           slower            1.020-1.041    15246 +/- 84 ns                15713 +/- 70 ns
Rust/Encode/PaddedStructTree/Depth8/WallTime                                                             faster            0.653-0.669    4956.4 +/- 2.6 ns              3277 +/- 40 ns
Rust/Encode/String/16/WallTime                                                                           faster            0.957-0.967    105.93 +/- 0.24 ns             101.87 +/- 0.30 ns
Rust/Encode/String/256/WallTime                                                                          no_sig_diff       0.933-1.002    147.0 +/- 2.3 ns               142.1 +/- 2.8 ns
Rust/Encode/String/4096/WallTime                                                                         no_sig_diff       0.946-1.056    410.3 +/- 9.1 ns               410 +/- 13 ns
Rust/Encode/StructArray/256/WallTime                                                                     faster            0.641-0.685    8872 +/- 157 ns                5879 +/- 94 ns
Rust/Encode/StructField/16/WallTime                                                                      faster            0.793-0.802    196.41 +/- 0.21 ns             156.68 +/- 0.67 ns
Rust/Encode/StructField/256/WallTime                                                                     faster            0.675-0.681    2771.9 +/- 8.5 ns              1879.8 +/- 2.9 ns
Rust/Encode/StructTree/Depth8/WallTime                                                                   faster            0.882-0.883    3392.98 +/- 0.91 ns            2994.1 +/- 2.0 ns
Rust/Encode/StructVector/256/WallTime                                                                    faster            0.651-0.657    8878 +/- 22 ns                 5806 +/- 14 ns
Rust/Encode/Table/AllSet/1/WallTime                                                                      slower            1.012-1.014    142.246 +/- 0.057 ns           144.102 +/- 0.047 ns
Rust/Encode/Table/AllSet/16/WallTime                                                                     slower            1.003-1.007    976.51 +/- 0.70 ns             981.4 +/- 1.1 ns
Rust/Encode/Table/AllSet/256/WallTime                                                                    slower            1.003-1.012    13617 +/- 31 ns                13722 +/- 31 ns
Rust/Encode/Table/LastSetOthersReserved/16/WallTime                                                      slower            1.010-1.014    160.38 +/- 0.20 ns             162.313 +/- 0.067 ns
Rust/Encode/Table/LastSetOthersReserved/256/WallTime                                                     no_sig_diff       0.999-1.008    205.52 +/- 0.20 ns             206.24 +/- 0.65 ns
Rust/Encode/Table/SingleSet/16_of_16/WallTime                                                            slower            1.037-1.044    666.2 +/- 1.4 ns               693.0 +/- 1.0 ns
Rust/Encode/Table/SingleSet/16_of_256/WallTime                                                           slower            1.009-1.013    1357.6 +/- 1.5 ns              1372.9 +/- 1.2 ns
Rust/Encode/Table/SingleSet/1_of_1/WallTime                                                              slower            1.006-1.010    144.89 +/- 0.10 ns             146.06 +/- 0.14 ns
Rust/Encode/Table/SingleSet/1_of_16/WallTime                                                             no_sig_diff       0.998-1.000    185.76 +/- 0.15 ns             185.57 +/- 0.11 ns
Rust/Encode/Table/SingleSet/1_of_256/WallTime                                                            slower            1.005-1.010    862.94 +/- 0.88 ns             869.6 +/- 1.1 ns
Rust/Encode/Table/SingleSet/256_of_256/WallTime                                                          slower            1.029-1.059    8694 +/- 51 ns                 9076 +/- 75 ns
Rust/Encode/Table/Unset/1/WallTime                                                                       faster            0.984-0.994    66.85 +/- 0.11 ns              66.11 +/- 0.21 ns
Rust/Encode/Table/Unset/16/WallTime                                                                      faster            0.984-0.991    105.24 +/- 0.35 ns             103.959 +/- 0.026 ns
Rust/Encode/Table/Unset/256/WallTime                                                                     no_sig_diff       0.997-1.002    782.17 +/- 0.89 ns             781.69 +/- 0.94 ns
Rust/Encode/Union/LastSet/1/WallTime                                                                     slower            1.003-1.006    114.659 +/- 0.093 ns           115.171 +/- 0.032 ns
Rust/Encode/Union/LastSet/16/WallTime                                                                    faster            0.990-0.992    113.856 +/- 0.090 ns           112.850 +/- 0.053 ns
Rust/Encode/Union/LastSet/256/WallTime                                                                   faster            0.979-0.982    114.43 +/- 0.12 ns             112.183 +/- 0.060 ns

Test: goldens (added padding.test.fidl), rust conformance tests

Change-Id: Ief67c51da50f3cc2ce1f3ececb27f078a692855c
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404653
Commit-Queue: Benjamin Prosnitz <bprosnitz@google.com>
Reviewed-by: Pascal Perez <pascallouis@google.com>
Reviewed-by: Mitchell Kember <mkember@google.com>
Testability-Review: Mitchell Kember <mkember@google.com>
36 files changed
tree: b6a5c8e3b5061ab206b26bfd3d519a6c1a8f74ea
  1. boards/
  2. build/
  3. bundles/
  4. cts/
  5. docs/
  6. examples/
  7. garnet/
  8. products/
  9. scripts/
  10. sdk/
  11. src/
  12. third_party/
  13. tools/
  14. zircon/
  15. .clang-format
  16. .clang-tidy
  17. .gitattributes
  18. .gitignore
  19. .gn
  20. .style.yapf
  21. AUTHORS
  22. BUILD.gn
  23. CODE_OF_CONDUCT.md
  24. CONTRIBUTING.md
  25. LICENSE
  26. OWNERS
  27. PATENTS
  28. README.md
  29. rustfmt.toml
README.md

Fuchsia

Pink + Purple == Fuchsia (a new operating system)

What is Fuchsia?

Fuchsia is a modular, capability-based operating system. Fuchsia runs on modern 64-bit Intel and ARM processors.

Fuchsia is an open source project with a code of conduct that we expect everyone who interacts with the project to respect.

How can I build and run Fuchsia?

See Getting Started.

Where can I learn more about Fuchsia?

See fuchsia.dev.