From f1ba2387d39a19fdf18a2572a4d15e6ce80a0d3c Mon Sep 17 00:00:00 2001 From: Jack May Date: Mon, 17 Aug 2020 10:24:34 -0700 Subject: [PATCH] More efficient padding (#11656) --- programs/bpf_loader/src/serialization.rs | 9 +++++---- programs/bpf_loader/test_elfs/noop_aligned.so | Bin 58088 -> 57208 bytes sdk/bpf/c/inc/solana_sdk.h | 5 ++--- sdk/src/entrypoint.rs | 7 +++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/programs/bpf_loader/src/serialization.rs b/programs/bpf_loader/src/serialization.rs index 87137efa1a..25ac540b5b 100644 --- a/programs/bpf_loader/src/serialization.rs +++ b/programs/bpf_loader/src/serialization.rs @@ -147,9 +147,10 @@ pub fn serialize_parameters_aligned( v.write_u64::(keyed_account.data_len()? as u64) .unwrap(); v.write_all(&keyed_account.try_account_ref()?.data).unwrap(); - for _ in 0..16 - (v.len() % 16) { - v.write_u8(0).unwrap(); // 128 bit aligned again - } + v.resize( + v.len() + (v.len() as *const u8).align_offset(align_of::()), + 0, + ); v.write_u64::(keyed_account.rent_epoch()? as u64) .unwrap(); } @@ -188,7 +189,7 @@ pub fn deserialize_parameters_aligned( .data .clone_from_slice(&buffer[start..end]); start += keyed_account.data_len()?; // data - start += 16 - (start % 16); // padding + start += (start as *const u8).align_offset(align_of::()); start += mem::size_of::(); // rent_epoch } else { start += 7; // padding diff --git a/programs/bpf_loader/test_elfs/noop_aligned.so b/programs/bpf_loader/test_elfs/noop_aligned.so index 28bbdc0980a7023ccb04591967638007c3d82d1e..b466240811c5c662d4db8a78b05543701bf03276 100755 GIT binary patch delta 11597 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 aGsZp@A@Jq?v!9pGvj0}#X87=8;r{|Z%uaX! delta 12315 zcmdU#dr*{DmcYO7LJJZN4MN)z1MP!{BtYjOA(;d_x?z|+5FbD%(GeUa#0P>VN~bF} z(Mg7>WHOjLI#gz304+eHOiwx!+0}F-8pB4{VNx{~d1y$@#Pn9px@>lmqLSLM=iEp0 z-MgEqoj+1rdrLUq@0@ebec$ii4=2KL(YNE;=cJehOCBza=*Ro=ivtr!I7(^QIiqtt z{EQvttjh~&TrZ`}M?gIdeu5Eh*X2kS*9%FEMEVK&QSw44%hxq9iAH}$Eqx$vNlFtV zU)Pw>HqaZYv#EVfeBg7ao$pWww|BQQ8R_DI6TsFwIXUUiujKje@-q1>H0(bxUsoH? z*W1eN87)lSI6H?0NKeRS(&ytn;oF(WI00Jagr|h*Mu0t>fM7R);siDsQe=ma8-(1? zB^C_znT#}ZMt{g^pdKG0JiZaBo3f({?eox%-3ckOkINH;Zn`5Wum|Ww91oSAhygh> z3B8G$^l3tmBMIq*P3W1GGt+}x0op}VWR(*V48sk2Uzg~kW**OGeE2BqG$-)$uVDzD zFu*K$lmUD_waibp4fUhoW93PRQDuCe1;BW(zeY3TGqQbMeEfXfeEfWe#C$m1z(QiE z2kF}QZ6r03UW_lxuhr^-W8;K|w+^z<>=$PGMG`Hw6_P(6rH!_n_*~G_4%^*kGyQ|D zCT#;$z*@P*z|=D>Ezqe&$%n3#t;AXnX!abRbMP<+fM_DBF0jy~WD6t1nSKwhj#t8uA8u+zD*s-N2pu#A(m4Omcui$kK&Q;S2*+XO= z=d2Z62JYoDB6_q2Mg^u&zzEzY43%7Bi?9kc@B@p+z%Dc_6EYbYQgc0*Sn(A2DRA)` zL@*dpfeXIh&&6!89yi-eE4Y*#PTfwjxc>m=v+ z|IbANou(`j3K~ekneR5O$$KOm&QoDJ3{3t$*nRDp|({96knwc+1^V{5f^BfnN;0IG= zHkY{aen&4)Taq#Y3&8p|{Dc-HEHU4rTN4%p{9+d5!c@W~l6))A?VrcbGcqbhdj))~ zd{E;qjelujna}6saeaFrAiR_(XJnIQ$LO`0j+8uY+Zdw{&CDfFm~`jNLegl`o|$Fe z=K2nEebl6-*XPWyHlY)mcr#?Nc%pHE$_Z6^^ccO8;4t^o^u%A2BdPRUVx##AT|B)A zes7$foAyKSk!J#wzk+zQbNXDeIu3^FfVqZNCFPnm^y#G8spVRoH>S{@q)f8er00_Q z$*NSk^SXMooL;`}4)Z>mJ|k=HbW3o#r(z-ZVIh?>=92H3v~fm`nMU`|$eQs5R9jYs zI?3H6J(X6ITWR@*d32G-PH#!Ofuv2+inL7gBf2$hFYTChbHZ0JE2@lm`r52H<`DgK z)@`At>mQ6GFBmkOl1YAU&?_lB{%{c787T(=qzo{0j1K z$LJ*xUmc@43v!ZHfj92#lgDWFf*f++H+1)cVlw?WeG_OUr_AHju`q`$o}{GHqDf_ePu!fo+?#97;sT|!&3^XS-&6#9N%Ng$Vxmp?-s7sdO}dL0;m zknDX4u8}?5ACJzMu#<`)uCHs5z32QHBTP*XDqKJ8UrS~C+y@;)w` zc`FS6CLTRK@q2Kzf_N{tveK-z>A>1`^Lz;bSX**L-uq7|=ujuiP_P$Hhmdf-H=X9r z_*+gn9KjAa+N9qa-p}};FtUpp2ycBx=&2i1Sk(1noS6kv~5mGT{9mWe+D0` z=4RfdesP=iiN^Xf_z*;%;jyvocx;S?AAworPvS!tyY;?AznYU35Q`}RD&&Fyk)1pW zb}`NgJTzi2%Bv|x{{o^}`2iN)%UbGdO@=TO`3o}E(<4li%F*aUIP*#1*jl2qHGy3r< zWcVM!aScEL_wxZvzLVMEvj=ZcRh-DcMXaT=CH{;kub7zaHQ=DPx_N&8Ld=cjLVUb2`xnA2UY5yt*ah{>)R+VO4 zw$vO?GBB=&6Sj_$GcM|5BR@amE zGqluOMuH$}nC-J~NAk|n;<_-|^(OtYt~BHM-%fdB6L9L`=epnjmR78H zkQHyx`t_w5AH1%5EfQWgheF}?jV2jB8!Fszj*zjVp)c#p;>n$1TDsXm?g-QB%{$3$ zVR~_MDRGBG*Ka8^IXdW;tzNPiEe`t8)+TaKm{v4qlDos9#>O0z+#8F~zwH27!u{4X zjbN6-=1XL0m^L;#=-lmjWEp!5t=T?I$mqMFoF}h`IreU-c;~c4;(D5v?%s*wTHtQ_ z`R+Z6=0%ctKD4{_3L!1$=@0j2l3KvM#U^o|554*0{@G+a9IF5OdI;A`FTTP?#Bs2m z1kcmm2YX2Sd0Y_mg;%{~pgr4g@N5+rR7Y~(^KOLnP50#OT^C8FKR6;#H zPP;2_z3+*QJ6z^W zZM!yZAbnr%t7z-m{MLf~&#v1L|Na|)sXnpihG1IF50<`w<3j)a*e&$=-V*wC-@VsO z4HW8^hVDL+X@iI2(1HHO8DuzxPCJ=NMpI}Gh-eBeJDF*lfQ`&f=k?5{ttXu+#y|5A zVskP)^vKDq)ZdA?aO7ZV{5<^tB6M7!U!5#W9lOA_{2gN$o{u41hAj$OJN@LNH24U_ z(n0tZC;no=&e!5KYgqMV;E4+flU4tH;QvX#+@k*g;^W+uDef551%TfEmfe!2FNPhP^!mI4adRyBCLk^p8%t-v zF6Rj<|5|<1AfucG-leo6;z;Uyl}F;3Z|~!H6{1=bG7M5IMPX}>I39WYH)`SAfak}Y zU{HbOV9tS&l!fmDy|t5jfoCfDXy%|J^$k#4XV~T6(89MIsW-v~X&uS(*Ks5>+ChE4 z2!gXoocfIR*XhAQ)ts-IFAh3L`|F{rgAQ}PePAjI2CMx?_+@E&?Ws`a(6xACJdXXB zKjA|s7}}?}%oFnO!fGA2!A=@>*z8Zkj!#!aX5H%E#4}Wi`#_}#6oiZ(Zem|6^Tcy7 zO#9z)*u1!$a9u6BiyJ&JuUx_h#n+Hu?k32UU06@z?8HrimJB~LUCibZ8yy;M40z!^ zgh|e+K8-uYHY4o=8c%3ECdOF$%gHI(B_^xjIKwlIcE48``(u;z8yIBOiq&gGEim0MN$wOYO|nxgR>1+I9IpzN4DwsM%wRvQ+C8F|rQNG>BK}bjlC--t?o=2~ zw(^sn%;3=qEDtPbg3CyG#=5oAzSsA9|U9t z8wyo>J8tQa(2nIBZCVRDHBNM+*HoAGY4!n)M{ZI5+iz3ZyEw+Ie8Y7|Ou-&T^nfL* zeN?k|maF!}3YA?NJ6A|MFW(rCDY&70rF7u3Q{$+{?p3OPRAcvQ)!rsqly8hk1@|+Y zRceNIjYljA?0@)?6>y@$!fuUA zG_KS*_^_IPLgU&;RC^yVn}4zb6PknPQ7wbU;~IO`sQzslk851AmX{yv0k77g28~-Z zZr8X|reJTRC8!sr?x0qr}CJ_6B_5OSN%O2M*|yGhrW81qZ%8JsdlHv zUX7bH9&1qZ2aL0-!me?i#w8k8YTTf4tH$!?E_yrwS9Y}m!*8oRs&Q1~zRjxt_%@Xj zn^bO97{-54QNVKCu4ZV_*w~@kT^g4^q1tOTp0F~`zp*FP3IDmUy^Iq%0RcWUf@R<+yPRCZ4>FTdfZszahyA*aS}jmtHz)Yz+W zZH#&OMoUb=E8^@@E7aPp^03D4L#lmLUqZ?Ip8R?o2}tOa&}SR~;HOu5_sOvDqruI#n*8qp~wY<+f~KC_mPsVN_Un zL}TYos@*9*$jBCZHEtK@erflJbH8N#OCXjXtAGm>R(9(w&h;|D_^qn{!0jrx7OOnI zL}m91UVf|s<*QYPadFC(1x|=VspLU%V3C|C4j7Uv*Q)V4*Qq>O$J%e{0r7s80ctfi z#Oqkv%Qddmc zMN`~V0R$cgH7>WQb|XvWN{u@;mj5Xm%Y*m2h&O z>mavE*+k#JT$D6^o@?P_cj}emq>c+5;iLCTK>5*o>;ir1N^$JFx%__aq3>TQO7eWn W^S~GJ)Q?M3S_Q7>TK3&+_J0ACaC^A` diff --git a/sdk/bpf/c/inc/solana_sdk.h b/sdk/bpf/c/inc/solana_sdk.h index 7bae5304e7..db86969657 100644 --- a/sdk/bpf/c/inc/solana_sdk.h +++ b/sdk/bpf/c/inc/solana_sdk.h @@ -297,7 +297,7 @@ static bool sol_deserialize( uint64_t data_len = *(uint64_t *) input; input += sizeof(uint64_t); input += data_len; - input += 16 - (data_len % 16); // padding + input = (uint8_t*)(((uint64_t)input + 8 - 1) & ~(8 - 1)); // padding input += sizeof(uint64_t); } continue; @@ -334,8 +334,7 @@ static bool sol_deserialize( input += sizeof(uint64_t); params->ka[i].data = (uint8_t *) input; input += params->ka[i].data_len; - - input += 16 - (params->ka[i].data_len % 16); // padding + input = (uint8_t*)(((uint64_t)input + 8 - 1) & ~(8 - 1)); // padding // rent epoch params->ka[i].rent_epoch = *(uint64_t *) input; diff --git a/sdk/src/entrypoint.rs b/sdk/src/entrypoint.rs index 6be53a323d..2f488a3bd2 100644 --- a/sdk/src/entrypoint.rs +++ b/sdk/src/entrypoint.rs @@ -5,7 +5,7 @@ use crate::{account_info::AccountInfo, program_error::ProgramError, pubkey::Pubk use alloc::vec::Vec; use std::{ cell::RefCell, - mem::size_of, + mem::{align_of, size_of}, rc::Rc, // Hide Result from bindgen gets confused about generics in non-generic type declarations result::Result as ResultGeneric, @@ -80,7 +80,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec(); - offset += 4; // padding + offset += size_of::(); // padding to u64 let key: &Pubkey = &*(input.add(offset) as *const Pubkey); offset += size_of::(); @@ -100,8 +100,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec()); // padding #[allow(clippy::cast_ptr_alignment)] let rent_epoch = *(input.add(offset) as *const u64);