From b1e3d488a5029af6921cdd1a727421f1be091cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Sat, 4 Aug 2018 02:28:39 +0200 Subject: [PATCH] Add generated code samples, detail compilation --- report/TODO | 3 - report/imgs/call_stack/call_stack.png | Bin 34353 -> 38322 bytes report/imgs/call_stack/call_stack.xcf | Bin 75380 -> 80158 bytes report/report.tex | 83 +++++++++++++----- .../{fib7.eh_elf.c => fib7.eh_elf_basic.c} | 12 +-- report/src/fib7/fib7.eh_elf_outline.c | 33 +++++++ 6 files changed, 96 insertions(+), 35 deletions(-) rename report/src/fib7/{fib7.eh_elf.c => fib7.eh_elf_basic.c} (50%) create mode 100644 report/src/fib7/fib7.eh_elf_outline.c diff --git a/report/TODO b/report/TODO index f79e58f..a906a46 100644 --- a/report/TODO +++ b/report/TODO @@ -1,4 +1 @@ -- Add a sample of geenrated code? -- Explicitly tell that we only support unwinding, and this only for a few - registers - Make consistant -ise / -ize (eg. optimize) diff --git a/report/imgs/call_stack/call_stack.png b/report/imgs/call_stack/call_stack.png index 131fc1a4c2bf730934ce764bace85b3564dd9da7..391387ffd8ca1653c20f800f36e2497e7ede026b 100644 GIT binary patch delta 21178 zcma&NWmH{Dv?WXwhhV`a5Ineh5m-+Q+w~KRcp;P=d6;Tr=h_s-v_W3-#!Aad3ty`3;D-C)-Tc(Xoij9esMVShjA$^593+LyacAqH&XH;# zNZCh#&-{fbVHP^>lVi>7kIX%|h$0~F7}1%e?cdmEdy2u*=dy-DO8<(NtlVP9zs4Rm zWOu>8EQbRxVKz=bVLC(7 z@@%wK{0JJ%o>nc(S)08k=Lx0C3aN?d68zNuGn0+Y50}sk*~8bHGbE|F20Na=MxkM^ z2!9BP2b|L{SRL)^oam>)V9QvZB1ypsIDT*6lzmq?H?nbnI8HbC|sQ*Q$+V zigrQo4`2O&D6-j6ewx;0JXrDTB6*ZIfPh zgy&CNph1kGo}Le+;lJ&7l#k32pMS#+f$Z&mgoH>(HjtPbYe|`SzXxN-E{r)zwC-L8aSVtv#(mw&a_) zZ=a*0hQ3U`X<=F*4SEY+^)`>$c3rZ6U_e}4Jgu-WXntO^(ro6Vh{#Jn6har>D=>Ow zvR0WwZw#GAZc$Opz5VX=QNS8DgSMn1q=-2)Goz@eC@U-b-pPqmTU)z7k)v2n``90i zOiV(8?Co2j{pkPk%%c)_X$UWJg`uDQ7x#=yX!yrN=jJP#w)~0e*qN1X{D1<+npr)oE zQB6(F{_Tl^tKG68Mkc0kY8K~X{rrLg{9PYJCTut%&NX6#?yxt;CMG?ZdHMOH4X%z) zpFT~wzB*WJka+(dhEh6-JTD-TqBpHkDIRp=4k<$V<5yOy&u~=a8=DX&~+G z!>{_Jb+NxNGBWapkx`ar+4X$)%kFeZx#d#h;-Z~`%Q~qx*rUY$Z+t`lbcd4>@VQ_@ z5M;5`C}mp}q{s2x-Q7KgUaL1&$3y(fmp4Ql$6gHT~3WzS@o-uztW(=I&Ede#<7{cPD@MEZ1Ny9H8ths z<4e8qz%IZ+cz(LZfM!wbblTA?b}lt8k+9@ ze*LZx!up&2Iw?aPFd=aevjGB_B0UgrZl@!nHi9TSt=?poDW@v2wP3s1F6TBLhT_rC zxE=RU?k+aq3knKGMMddT-0&h;T3Sjgu+Fh;9!d<4=os62E)G z?d>gP3=;Kq19PvF{M@QJt`|~yB77N$mS0Mgi zWR;aIMo$p`zJ^QDX&>Ytf+;B};pF6eML-}4Ha>B@%G(RH;QzLSbEa(H((<{l=L7^eQXCqM-7ibzs)O%m7=k1x-8yy zS?@Npv%B*rui1*8oH$Bw**jt9iN{hi&^i~*-QC67PB$Elac{`T)b%$0>Qm!)WQDy| z36C#w@);~0MSuL^v_A`SDXjnpeiJ+qNc|fM=8)V6`qah~^r>a~#>1&wZyWV0Afmrdr#$?hvXtUk<^w4=tU_{2*u}rn@GrFbQAsd5C zoZv@0xSiPgf%>(&k;#$B9(*ht0z!8(Gamjq2|;7FF}=fwhQ1ML^f#47b zX_=5XyhI|3{$l-uzPy&!z?Og`lYXnFdYlFy_TK2^M9#*aDL8)TKR!f4hx0DWplUd| zxEyy8L%(%95JHFrq@kro_kf_FOy`qzX6K88B^gj0ww9WjWUC(Fr~^h6V`7JElQZT^ zwq5(MH#gaeb(|aiaMeWXr z@_rZTRQ)2kmuEbnn+wR#ua%sM^Ji%neqqbPmZCg~!fChd1$mpIvR2p;eHCNtfsgg) zyuc1%`l4EH5-KtEWZHgLerPfOC1zpXNwegWp~$4Mk(UkR$TvJ zd0RKMNI~n42X$uu^6?jtxCKQn2$#iIyTRoNn??;64-W)cm;Xvl7bZL4KRbx~FV|Wc2KuaW4`% zE)G&-6OUiNXxus75&zhp%BHKQXKimE?V+r!+&MNDd3ot%qOPQbWja~-1r&_wxj96G zn^0LbwHBWy)RjfsSG_dHvDF4VqTCmR!p)2Jnh1PerWao2jF#RYUSEo2hq}Q}I$kE) z?apK0t<%X)ji;yA2L&Zk6I@zjfqZcU?WYfnmJ-&Tl3h+~TV%KEnT&l%PS-d{~d$AA=2k!@aX!?Qw|nVvVg(wMifh zoPg`|F=ca;3(p3b<>8_UJK{?k;v#rBv^4%GWrxpaCPf-J;vwcN?d?SjRm{nG_Eux%?(Z1FLQwMJy_;ScZ0{>+paaXBBq z#h{dSGt)xttUozEo~|^G;KC`}F zu_$S1vx?Dt0Y%E35Y$UKg{k)RV7_Nv*EY0VzDYb=qxHWE=Q6UhM4^5`!K3_we2^qy zTvZr?)GH&hb%K#8Iaq>YDF<8nM_;qqOMwwa#z$LPDkudh2Uj*5k)xs~k=*ND$k9Fj z77uicWz{D*66^ExXRCDv)tG7HOZZp z8cjck!U8~Ei*$x)eV*MHsDkQoQ%O&G=MtfN&{)C8pRw59JgxXQSP`V>*iPxT;b|lT zET!^)`$B#Gy9&Q7K z0s^U_0{3wYO}FUo?swc1@zK#8<9P}*b&dymp$BtSkW9jBOw4uwbK#MY+6M=V#CzfJ zMAb}~VDLhnPgRr@a=iVp3FloE!l2msBuS8W$u=*GcW0`@@OxBnm_4%1kg6C{t8+=v z>HQ)SaHK>Mb^}kBTW=%?3QUdv-W}_sJe2!tGXx82nNe6up)OvMsNbH_dw~Ex~J>^A_xg3aU@8=yVzt2IEnv#5PehTt|Ka zWE4X=&WMNzC;O%MP-Fe^`Nx+JOLdtP+J<|rQ%4#V#C*^6;!EjM7IRI%3LLv7yCMrq zXsF!h{nS%=dSU*Sk~TT!wK=}l%jTcX63b-JLw0_t{62ZrVf%ydOB90c{e?O%*YkH- zSy|6tzC=eu^Qx-ifC01B+0z5hz);LR1->;aEG!h0md*xPe|!6DKLB+hi3tfdd$Vkx zBqVwU2RoORQp?L(0geKVjI64Wdmmhae{GOhn3!?4>0_xaT5ylMZo$)ZZGie`$m+zJ zJkGqVy0j{P9j)ZppTP566(o5+Q&dv!b*tQyJ^9AO#-yGQwjQps z)Nylnx3-HSuK4r!Z_BqAh{GdtyDc-bv!(hy=txLNFtQ2?dad6f_{_}A!yd}iSJ>E; zDwcvE`uq}H21vhj2wx#n6?}lbSp1&K|9&vpuK%4mOtsAsZ%;{Dkn@egZZaR(lX|Gs4N#6a1;O5Y zzQ0Yf>-{9L`W>nV`B<;|X4+>>OQ_mG467Z&%Ki zK1sNksVbmdajAvE`CyH^q2eV-$-g9_++lycmt>HV|DEza=+EY6cdh-7e_){AM84AW z%#56xT2F5@?M%Hh%jD#wzJb9=v5vq?B%Ed+L~I-$hj$PF*wKOZf&&jr@D}ThzbgN1H8>_*pK6b0TCf3Q?-sO9;qtwH6-Nq z`1tsMOf}3I6|J_vk<*!b`gxWql zOayN?&2bc28*k9KG_Y!m{0!Dmk4Ul-H@sX9UZq7?8I~ah<$%nUBO=l{u=fYT4}=p? zF~4Ut6?RQ#QBq{bNXb(i>=X9>uqi3sx@^@xU>GmI0V!j7W20+I2ckR6#Xv{j9L+-f z^y%V2rKqS#v(c?)G1Rllg8CfVwXrqrJo{>D%JI0?CVD&lJ>DAK4YrBvbno;-qGK>i zF6uf$=>$AFnQ?~(D+P_l%TEt=P8uco>9oi?uj#)Gb^0LejBuEFiKd1V-0i{Iu#DlH z&%z?COoMVGnNk(8XL>tbGb!^$Yr(Bk{DFg!-C+K7=*nclZIUkK9TaKV{oUD~Xy}eH zIvR_B=XY?4B}B6^Gi$%uT0E!n3L8t32bMz~g8>7Jpj)E2Ug6*b2~WT;bJ{9q0GDDa zRj_L)3ZG_rnAwqe6vlX__u8jnQilrd;i!xF==eBYqsju6cVDS5pe((-_P6_uL$*{R z1vU|v%PEy-t5gWSJR~yg^v<07XJP&an^tlzG{^JP&cX`hJQcm_=!E8AQ)|ps1HHvg zBCvL5NxY06-34PTtY6MY_dsd=_|c9Eot%8O&aSPaOhDMjIkcil8|LrO4GW|<5V#1GKby+(NmE$VEiq4%U8!srIF9ZbUKpZZ<6yH;MKI+<0y`J3L z8n=f5+?#(O!dKa*4&fK!5Jwy3k%3$Z??m->5k&8bIEB1xz=H?7nEnO1f~T#_43b;T*38rfsOqX5o{cnEyY2@ z1rbQan3$MWtKDdwp~ORd3{Cx@xPR+yU@8G@;Jmib(56UF4$1*3_vza)ezoFZ2@GCh zUe3M6UtJRR^eSolI75viCNU`$M*KVzCN`^H?I5pd*-JofA;pI ztgIMCLy5A=%cGhe?h^qzV>TZC>5^)6wmtDkfY8#?j*pKs0)FK7@<>%x^|#p!vybk4 z81uL6G=-`s^I{?7YiJBaFBsUF!i|h~R>d`7r?6|28NPpe{``4ZO3Gk&_;DaIE`*C~ zeSK;I=(+a(c$TB{^Yz=S6B)OFJUBf)J&()3u#dU2#T&M#w^#S_@NW>Y01+*10R=6Y zF`nI7Fb>m9sDdBVTACbr*!duciM49&biu8iSRrZXj)x}g?At~?geQYAQZI`=!h$D_ zc3TB5kjjuHk!oUiy+4%9$bgKflD>73oKIuIJ%9RU8Sn!nmmIJDM&*1D2ncYp1SID7 ze;9&)zdQU$>WhPb2ce0-O~-it?Io$9**~Nx&Og6ABp?&XflEQqwefvV5}J;i*ouJ- z_x#%fBcK<+!2Z>b#OS{i>wkPe!-l|Zyi_!T-x2@J2=DHaInmdI6LbN%DPB*|yTDUbQfix)<-=yao5W;3@mh&3c%#yM3F7iI zti8TXJxJeZg%(F6NMB3u4fI9cZcakw)to+n0}iF!oG!ktJ+qB3-<_i#eejb`5=Bi_ z5fbI2#Kc}NyWDFGN~-mw*KQN?15aJwotdMxHuWnt!^o_K){?Gy9-wAqsouU%)cr%` zd+P77*4EN9?mvvPmA9wlKXNU#)-2>io+AqUnGm2BaNo#H4Yv+YE80ao&dXt;yq3}n z&k*esm*~EshPDaX@V8w$tLpQ@<7^cr_Q%aV3xTiK%`>lT%2+Pl)<63;-J@wWh|(19 zOqtXAH(~a>_Bo{I=hG{&Q!FD{%eBl)2IoXqJVQx#`SWM?nG{{JAD+AvNH(N{cfz`m zB+hH|*_Bay7ze_-@iMLdwy!=#3feK(u(xOHIl>O$#C|Wo`vP~a(v3}qUi+as&S`Rw zHN8zb0w9sXQ`SN=?#~80L0Vn(#ygvln66$2{3kCyKU_TMfq#)P$!Aye{pxe$bD{-d7mT{cZn#gHJlJ9mVg`N|Qe8A|>Sv=75_nb!8d22W;Lg@w zbiDbujfQk~Ewssxci;GeRfX*Bl^Slc7#aK)@MB-O{;i%bxt@J(P4Ah?;WlbK2RhP| zv##Ra%mwL&kB21<)vm#x`^T^BiwYXeoitNfv$P(U(?xe?FnrKm6z#VoVeChlKeO&6 zbp3Omjm>^|g;Ueye?{m!BfO^o?2T}fGa^{TTq*{#6+;AA56uqf$%9gTopD*YSr`2s z9DikOBK48#tX&w^{UsI5EO+$+cHph%ZBx7q53J*LXxulsK4m~=$*Ie?SI~x=>6{U5 zgzj~@wqwHBlv*5(Rh^iO%%;di3N)A7^Su9feI|5nsnPOl6^Hu_N50sDtK5`r0k*N% zuK+dO^m9<@k5Ar^S>IrN&k#O;%Y5y#Hp+o4uvBF99({(Oi#!I7F@4lLG*2J6C^ID@A##DmtGd(jiC_4rPFg&>2 z)&(V3-9YJKo>x6A`JmvC3%X4c)D{H zu9e7%jER%xgjtmpr4~bd7=}}G^caZvW(0h)pf}(uu0#Pf)$W8yX@h%v&X@8`Tw#Ws z*V^l+S8jgZSW8EFbv z2|j^xjB5f9G1~*sE%BfNGQiDR55c_&a)UM=WpKFR{HHfZqg>jFW#|DyHV<+SkKN+` z-YhO*$3&z*9Uo`QWH6$eo$jlUl2g~RIyx26QqbT>l9QRUm@gaXA5|`*XQ8cgnbF@F zkJr25u-@NfnC7$>0ijrPs0by0q&_oii@eUv+eHU?mi2YOcf;D3tYd7CS&Z^x@wWDk zc93Ys$93pUoZ9TXD?w9VsOd%|!Oi9uE2Ze@Qh`$xEzVnvObU^)Mg>$DbOyhP?{;QM z`p4@_15bZaG3=DAD=R5|+8bdqrY7SYCC<#p%T`7?+ecV%Wnd)Eh8ioeuvYnJ*|8>E zW(*DH!qrmuR^>OvC+QPDs>#vsYm-@7?F9s9@O*Xs3MIq9kiduweNfy^u+Pr{J5WBA zHTs_&NFgGnQk-P5)=7^g&JS#andwNcu91k)7ke@F(o5vo&ZA(7Fr| z6BXpNdjpoB%#EJ`;LW3YGxfLx{&piBmcnX9CbieW|BroTbe&VAn~ zLNuj-ztV(l%(dJcYwfHOO!aFP35|L`843X60Xy-CCMDi<;ofzMhPwHU#If_{$t3g^ z8Bw%Td0cWMDloMn!LJ^F?g_fhlFNup;A1 z0sR`mf=i#@`$E(DvDNB8``7HbYTSRmjACZ8`TEW}u&{mDS2f4UeM41{o4!>4qEb5f zkugIvx+h`bQxY+wrR`13M3yp$1-14M^(#V$AHT=^s@+#0JfEu?Mdc_3HMtKS7VKyn z&n_1pXkjG#3o{K)ku_jmIUez5kqav-DanV$3QjNiWnE#(@$4RMM~l(>rHXX@Bwt5Z zZvFr3KJ1EFn<|nKVICC%K$57Lz#C+dYs&oi`xAQDrr0a?ojnI_XN?D&?_*=q_ereI z!Dq?QO{>@z_P#Q@K!p^LaM|hUN%_49Hnz+G@J$!3)z|kJQKk7W0bPuVwf@20K4W%R z(ILR<$NNJ}DmrT21IIw(M5Egv100-+D38j$VO%ykzT2sK27K;eHr>Jlbg(mXe-lCO zZLgh9aeGFVJV-#3^QGARC!=!VuZ*EpXWE&@&d_AjJIu+60i&c-=$W2Er_@7I>g0gY z!g3Gum9J!+Uv{N*BYY5P(1{8Q^a-c?YW16~02qW{vNX8PB#V{8(UyVHY`RdoAAGF!m z&38*GZCg5fz};tv(^Asl%VI4kZ+Fqq(*?t+s7C;)NuP3O%G*Sl#Bkc~0W-^0E5Muz zC>9ohJFn`%5AC9UVF@_FCGl9= zNN|AMlu$mjZJG#3TrhEk@lq~aLCWTYTjS<1fP{UF4bZJjZq=`3(^0S;p#wEvT-;wI zJ@b1_7V`Pvg0bF)JjP@`*5CUKz)rlmZlx~Lf{(?u9}Qy%J9X$;#5U-$`FW{aKFIp% zetUrX0TrQ^kc@(>~HWVT;b)PPX=ehJelwwN$Zvar_aY0rA#IJ8aJUL#% z02M7A#a$;G%7HfQdyvc1BZWAHfqq#4!hnzYoOjYOK$Tkl5o|ie0F2*jYO5RpAV^eu zA56KeRoBQb%3r?-g?0BrfYqVGT7nYqGDtw3 z_{SMgkJ8@W4lDpKf&MZGHG4ffIy>v=>=dEbk&{CM+>!oze>@T%tC%MI1KMaYB^ubP zfM5Ld1M#=@ar4M8Z1Y`B{qxmAat_K!+Hj+QI?VpP@`Cab+q7hF9tT1`gP5R!{~k5s znORymyi6S;=s%niNH4g6#C)7R7An78O0?8hnNjBFZ=Y3Cg7lR&=8m&d_gu6}TgZoi zl6x03V5H^p*KDY7HalX@`TCl;hux0Aby_L1siUqgvINKMIfd*HOrzbad=@>6T~oFBX76 z#T-%5N$)Km-j9tPot~}&>h^QT4=e%!kEBNT8+2S;@ssrdgX8_Brc~f17;S1&4c=?| z2%te_aS~Z%On6K)U=wi|4Y}R@8hk<3{L9L=#he&Bl>P_^U(MHl+6=fu!eL4FU}&P3 z(&2XhIS*a^7s8a_h|6UF?XcYzhcAZTt@Qz$s)gXvf8onKPmb}F|B_SeD~p*nYS2C8 z6C41kUiQQ_?!4z^JTf0q*I7Y{Ta}q_|3zeCyoj9@%p^*3{NX<60w?`X2BMrA?=O|& zkE;}lU%8n<44}l}u-G@gIx_MSc({#Z((4>9P#LiMLQG7Yl$;D$>D6cz?V5)*ouhj2jWxPXlH-}3Y)1f z_UhVi`!!ygK8dTQt<*0on_k(KCVYFt!)B! zgpE-|ElY&xlf(}q6Ai(kv6?00TV>++L(Orc5xTmhgTEceNIjM+VtQ;Fg~YFpMit{y z1EB|w6O)ZU(hq0~j9+IEu#^CW{G-}|JYuh4apkt;&M7qR>HAZkF&N1^W4>Q=-0At* z(k9kuGip_0;?<{`I&%z)lDzEfuT@l3wv2$+1DFy5LYta6KL78cmHka<7$!bSb8e4E zx%q)_Z8kfIbU=l4L5JeDPpYlfyYFt9u&H|cma&#P?6$c*0S2O?E%=$2B}lt-ZnwQo zrqJ~Nt*9VZHbmRI0&>bffRijzTT4m!Ke4J(#vXv>M5%I?x}VKxuns9l!cI1EH4aCo zO>iK*#I(ZnAIdCR^R6hZu2Bp};ZUSC?OMP_10KG#g&`h;Op2Gn&H_N_ z`T`XI(A_p?NJPAGfD5tt)BFV3AKE|~!{M+X0BYe!gH+~<#9Nx#C!N&>rn_1VZ~%&d zPUO9?Qt-}{?i1sSFuxnBABZObfe563ZK!~4Oh1#n8zQu%+Qw6NYT}J=6Zn-jC9#ru zGzYNLTW#(xkhy!!`$t~6YVtP76?a)2BlF2@XbX;vPDV>q9ZW|zyW{ute9FlZp6l|H z-**?#VaSCyQJSCAuPLopG*tQdFF5{fzujMQm&oaO3K%r*jHP-XP2*4gmn@#%-p@XK zfIcv%6QQHGULLJH=^h%|SP2za2b_|SPLl-#b7^U59Jf7<>qW0cyUWqCFz^ZKkA4&s zyjoARJUlxyX!Auz*qN!aOl745RuLc$0L|DxIXPK&Hb?Bsy;dFxO}bA!mP)H>`{OKt z%mKq%kuZ_BPdqh9$#p)`c9>5C(c&94nfuWb+{4RbWSA`F!OE67Kl98AR*0O=F#W7~ zz;E8|Y=;ztxjs=nHDy5FA;arbj|q& z5zyyj;EOtf&HzZ;h>vyy5CAMDqi^RI7P#!UG11V_%w|eocrMgALMyAQ-(zD{l6R8$ zT-gtr9{7QC2Lyq*-e!e8k$?vQDk>@~8(YuN5G6Ue@VdzHXTF2R8~Ujtt+xLDpw`xp zD1_YYATJ%AoU8zI(Ffpen1j^EU5Wu{MBpH8bZ4nqhqbnZgw3_Q@nlMK{{)a>7isd! z*qBl2E#70gLPjz`{s-onCjsBbGy4iPPF*tgEWa$il;GiL9lQ-_kZ`2wmEbzM2|XoX z4L7XymC_AOH$P7isXMX7M6?u_djbP|8}|470t;^F!QA|Oph?j+Gzq*o>{;C~1Utz` z54O^pdX+O{=`y$F;N88sc5YmCd_3;PP^uAl3&?JFIvf<;S77DB!_k0)t^RCM16a^d zK{8ohS&8Ryq<^$;#4&mI#WK(qj8qFf$wDPR3=1eP>Ihp-k{^F|$l+?{< zo~5(#=~5i1VejtVRDB(5?3@d(Ic%>jW3hbtXLlwPyfqvC-Xcc(c>8AdRT|CzRpz)? z*){2R2HHgtV?R33x?rAV#K`bgbu{*o<2mWK>3T2k*I+IIju^OJ}9=T8XA$&(ZWq0cQ}lnVX)~nKLhvK zqdxtpSx;~PhnSt+Dqoey-8C8!(O_pVzPOm!&+5ygP|rvTsn+J^_w);0IqNUf0O$KH z$FIVj66V}oOB#?zAk9D0AP^s2z%w4@XMZN|?yYJnQ7nwN@QzM8JA_gMJ^>X2c#)zo zvBDhaVgSD^ezJ{UnTwVdxIs-v4H&M7Z}kMN_x$|__d0B9_+R~Yv>MQR)(*#j5Yj&X zi67}gW@c>oWYsX+TK_=AhS^dM^f+=~h=9w~3c&K|+SB&-ap*W;qte<=6f`md9($sS z-PQ=lHo1klKkEylZtEPy>Iph$GA;yvdNrA^ZAZf$+m_|!Qsv~Aegk5#ZtFqAJCBeH z_Xio?rc_SrZ=0LOz`mt@;`8$5Xr2P)^~FJGL$yIN9|C^2xIBfNUgwJ+n*i;G zhlk&u&sjpJn#N~BjbiY3RprLV&HUz|@w=emCdUUD#B~5nrWds3!z7_V7 zdgCP%99UT(A(IOfrSv(bUiGeR30xD-RyGNg=EWC1iQMq$SYIo0%v!E=d7o^-kn2lsM(VYY<+v8@wq+L zG5oM6eHAE%GGfDFhwD?V#d_EDLBdgcd2tb4?fsO|99!<6LT7x z@SEta4tS6utsNZJGeY^7&!N4!_O7lnw<{ZuyE7HwXAP~rzN=cQvRIJcjb5FURCH23 zeIfIgdf*p!nZQGU#1~3aL$lXwdUI)rAw>qwJIay4p}s7oKkqI ziuKHw0xD7VfrZHCLB!0sbvJ7c9%xqIH)Y>``c&??cWpalhHC(rj>v23zt;so*mm_p=G^ z)PvQY$kVMcKj7c{ySn=JSJ&iZ%+H@BHDSHjI&LjMItT~}=^Pn3x~lib)FjqzdF%C_ zNLVH)cw!XW44Kf`E41bV@%BUpGiI1)a-=4J5akNP@rEHCfv4S)wA zzCu?(0~#ASCubas(I7Be27zY>$VUH9vzOh$A|V^w3{y^LXXou<8!8eGqo+44Y6NhA z9R6*?74WE!E1`y7!Qu5I5@S46nHZbh)ztb60V{Ye1}Vk=qCfoG%{_4IinS|rwzmt_ z3jl56A8q4*N*DjTTH%rUrOo%K6W@~e>|}LggDhNZy4pIU`rChs8>~o7?Z2OFZf^R2 zfxQ1wM*gI3wAf3x2aAz7-8=8MQcp}wB=I8Fs2C^k=FO7; zp^u+G|7=}(bcD~An=qRINC({D4*T=s+S){qcG}hMaNvlx0SR2Rvz_>zimIxAQN@IW>4mGg<`;L_Ev0}bY798i#IrOg08p~!xFRU_83vGDGQVC2oeT>w&)&I;}tTI&4p+p{Aw| zBIJ1uAjP+D->9gle*XRqh5h;S*+5&V#3d#5S6iU#Z|xf1aJ41t#v18e5~S#W<+|KR;MR==Hni(NT1ziCW9d?Uj`_V2zXn zwNOq;Nf;Qj;4vs3-5bFDhgoR?8c`=FC$YKJ_4Q5_9e1UJVKJ@y?d^C#P@qYh$fu{L zdnP1r5sS#F>*4abumV%^89j%7_p9>qa{W<2plyNYeDdT8!rbca?mLyx^zw}t!hz5d zI70AHO_>rM?Nd=vk@Ws)Zb8Ay*49ksM!}GSIqLCY$T{k4Tx=|5qyz8~L*-JB@p9SZ z3&4s>v36E&uGqdR03*QIevDjS)#olO>@#2T;|BsT@;yxa{s`b+%%;d~4L%zIMpu$M4j0*tDoqoXMS?83srJ*zqUHxRa|oph=Vw-Nuk># zSTO47UmlLX5=43+x3jZrAAS6d(?5c-&@J&gKz?S6_3VM&8j8x}u-n|-4d)5mE6E@~J)Y+PCq9fv(qF)U_DC{`Gn~tI9UPC?d^v&q z3J*r5Ta)}sOZEb0=lRP{;RMpj)p?f!QrUp;Z(a?|rbT^sR)p4NNiwqA3 zG6*gg7uRSjxD>#K?$4}jYv#&O9#7WAYNju6Db!C?e4x|6f>V`45XD+AY2L8B3Nl)s~K z0T44d1@zcjhO2#$)zKjae-0M%KAK?_B$Ah39cZ=}>Z({5dU^sT3RG-2hu=IdVQg%y zBo`pi`0p?EOq#%%oyW65>}J!=Ad`c}9qVzLh3c(A&Vil{SD326Y)u-290ZEB#L3$F z`lpWE$ug}nL*(M7du|wjFFGbBD&*{Ss;!>9mqvOpr`N8BBdJot_Y4k3&JYRK1qsjX zWPpQtt`ZrSStxtxt53b_#Xj(P_|s~E4Y=rJu~7Tsu$^$7*uxpNd)MM%Wo2x$mW74o z$uKlF=9=9Y1`dAwG=xhh-QC@Vp`xRUMzaRiGM_5|1HklSsMNkc{B|7L*>2iK3}%|y zdfD%R2+8mLKzsbfqHAcZwhKH428MF6wiHO%8Qbja>@n+*F6Dx2z~v#A=@=*liS?mG zZZ1w?p!dw<1O=-_fM&VEdfj#d8l0$+d~ElW3rU!nBkXr3|AGT*Kd@*o&!%+nl^o6Q zBPnJ0nToTsDPTam9LWn>7mT@^l#vJS!-LHL1$`WT-;-IUhW8l zM?}m3MxFF@Qc^N9=ZCustV$&f4SYgELg^GV?FmFrToywskRy&yP5>79 zd%V^MJ+}Iu)+?O>v??U8Zh8Jj0W+W8*RQ>~av9((*as;oWI8%JNhztVxvJv+)hIB5 zA|V8zwU@}WwgP92fNAHkZ(}j+50mcAvs?gJb9bqUSV~Gt+j$KOoKKQfQi=|d2E0P} zx{{pSmyvW~fL*|2KjwRYM%Lp=D(((8C=E02u^44nY8N zgK*j$PJ0GA(5R5!?!G=ffQBwFFBwfI-^KUP0fbTrY1W{-y1Ihc8EExElv7qNvR$YE zFvsd|>x)NfM+dqSmX}B8b2)A9>ywa^9puW*nKDX%<(7M~;GpMhA?EgkDJSIU z0h$S__2P%sJ7jhnHX}?=TLhizx2IOsXEZOR=LbU`IhT$SA3}!({%Lc{~DbB^%MQ;Xo3!PM1?`Rf|;qgx~wmYA|LBq zUR(59c_a7yrLfJ7G(DddAl&N=mwtPH|y?pbDMmQq_T3^YM2MS>%04(s0*!l){+ zF4f#WGoUQ$$f{aAdh)j?Q#Ej{^pvBG!7rZG)(mH5Xf@nq(6jST8}Vrpa=P$GD5Qp!oqL)ay|emb0P`{}H7Z|J<;y*8$6%;@P7 zb~y6yFQXFcxgSj9%W3nfX7F+P;TRloTS6OLl5ut1L@h?{)`G^EZQ$BYRw9&Ht}rYQq%n_GIy;{eSKW7?ZO}2n^K$F^l%oMG%~gY+~44No}J_@ zPgk;Sf6d3linXC-NzBH{J%EA1+!hytJ}64SQ=`sHBE&aM5<7M|NaBv9D$@l4cXnEC zW>h!rl#}I}!#Od}P!!rC%zSU}m-{M#FH5yAh$V4_>n5|sJll7+3a4vR!5blMjpT`& z7aE)m3I^>@#XmE>Wn>@DsLqUHL1TJ1TOC`$18wwOP-LXL3E14MA2y!ujfO+72hK)D z6>|#fzeOeD7G5906nOA9uXh}zXXo1-yp(IMFRqkV*X}VIdq72{#J4MFqo$`L0|7RE zTKMu}Ch(g-5J*vnXIc_CM4ZM(yJ4`f49eNqaK^_7Zzk#B>XL@vZu~A`Y-t;LNr!A7 z6&*D^GTA=aniUs3>ro~em%wy(OBHl379EjOd(vMl?pO;p4vUMS0P zuM*6nLe2`M_NlCp{fX(RAL zl-Uts6tu@z!X3k$@dn%%DlB;MdX+8}>rD!-mXp6}tYJ;(ne^qPzSJ`z4{d)OBsuhN>|V2lGBv zKZZ4fgPD=R$mU62!Q^)w%w*a#<#i0ck4jhu>a0^awy+x6L7PLwMxCrW%BD`t(ty*Mum{pyCpFMJizdjIT26OGqt(QB6qy$Cd zJ%RO?7K<*(Xt1Y+p>Kc7KQj40r%*rBaUigY?H*QKvO(CynG3+NRqWTcH185*IPSjr zln@P8DhKn&dZnP8|I+wva)72AQKX=({XyIW*Sd#8bp?|B6922|1-kVb4Ja>BDvGjl zYQpOc)&nr}`0$(i#)1-p5aI3QZTC?amCZ2%usvp$7Xser1imh*d(pFO)J1Ez@QLc# z%9C^q1!`)#jLh<&xXhhGkMDG$=|$|55n%InHi%Y7#|sJzlRNte6L8@VUN?wtZRrNC zJrhJS^)pUs!V#4dr;b)qT3yAmx;$WPJbus`e9hrkiL>>!#HkG$BH$xd8$*p&!o-Yz z<;oV^G$<@~GFdhBXsU2}Y3*p%6{O;JxxUe)-$^%>o|Dx%ii<&nds8$ODykMx)rF)# z*t;jGe)+4vuc)de?w?OQcr4-_1U^|FCtC z&}?K(e&ufB-o`mr62Gq%*_8+(hjpc(CNjRlt*jsCQawAAkOV_IPbT%B!@eItwu@sd zM=e4z=Yp6*{HNbq7_5C>>ijk+U1?`qVtM*K8FmX=%;VePPv}jBbV!)@X_9y6n1B1x z5{2w>+OTWVKP;Q9R7b^qT8%CcqRjl6`L?BVG|7Vgyn4FggVNeP#dM|e`t9MC>*&vtw2oGIlnmFnh*El(`0fr?#vEIBbpOP90+H5SXxZ>n{uLaA$TyX#1I#X z%w`f26VlIMPWvG`G47hGEH}6}5g@@}?@G{SuC9WWBfY~*)j*fe{U>vS%AS5=O!*Tv z9d2g4K1qPsNAFkS`hD{^qHnQge1EUJYJ!FY!W)(x_Z)wn?dxdo5GoTe^@x^KR;EJ- z`$(?2935HfeyKqoi$e8$iFel21Y%-j7vpN*p4PtldTMUR@l|22kbGFE$7Y8ooZ?d> zrIyFso!+yL<0KsKF~|e`{Xc373B92wC4I2tE}qd{nL z{(=78<{21?q*7sF9zosSN9|eq)~pAt#0*XWDOx-WwsRy1*5P&1F6ZzR4C-ULm1&u$ zq=MR-%{!4@hwWtU6D{ED7zh*Puw#_V&Z(Kul(xXt1|QtlMx~d5Gqf&{Y*Cx&;*`BR zSs1lBLSrdF{qouGb3*R^!ZmyduYqWC!B6QVd*UG_K5=MqS|5cX+qOkfL^ZSs34v*p z=cn!6xb^U1i=6kzpxuy9`j%$Qay__aT0|kD8dDUOf`bf3I6Oww2MyQ6r+ZsV#x=2v zno_Vbj_cC6u;bG2dF_wX%g*k0f8pAlSxl`mC(2ii#iqy*MaK<>uTa86yQASxTD*|p zP}*lkhIN~02aaIg5e5XRHs4oc8q#Yl{i(=s&biu6B#!6z;2h#(${ZOM{bEfWIC&eq zP?ASi#8;$LHD0Kx?O{qMoV~QZ*w3TTKA5Y2{oLWpQQy#TXNNdX^heEh=9j)W0RgJ5 z$H;U3ysw6)3YLry@AJwwp!gayK0;p2_>1KOxXt+|8XBfHCy19z{)F`pSJEz*_N3#} zR-NaLq>Z|*dZ=aY9R*I+HJ@EOY-73F*99XZgyp6ZQm zez7~X>snlVt)RwrWYQH^VaBK7NceelGi~bz^FN7qet5sI|LpZdm5?1CTh$qQE(I4US5=R{J08SjI+>BXbo}a<7R|># zImyX`hl4}Von%C8bQUAl+e=%nw*Wlhe~&p#7*fvjo{N zfcRS0G6@NVu2c$)361O3z|=EZlE1&hbXbd?h*DCXVsHe@PYdh1rwIaU-LbJ66Q)af z{n<=T17&-boSM=ENju-Xrn=exsN6iGn##5~&H&;t3Wz9?E-(ZT1O=o_q%3JFgdj*0 zBuEKTLXi@NlIs|%f(%kab%=n{dkNhD(iuPqB~+z`A|Rn9@UHV_-kSH}z4hMxxYxR8 zpL6g1|Ni^jwNIK&k;kbpi7L$(aI#G^F;@?kbPG)V7RK&;MMecC>P?F>Wf~h-rW38K zzVLgxQ76jt3*36y=F52UR%TbQlidvufT;;pa`i~2-x+U(%AtOTs3r@ZNDBXn(K?fA zI(~S$kwRytwdGuQHTJ?0ybOFwD_CaRRw`nqdkz+&$HixeuZs%vt1al?u{c_K8%=m3W_zV7~g z^LwCefdVskr+D~hm~+x9%PT~cC2;d5JQlXa!HQ0{h__`jT$O&%;C42DeMu9`;9v6d zUAtwjs0B5Jj*rw<7JS2*$_DH>e0^=0m(KE1Y0t!o@g@-YH>UYMChhS;R#PSz(q z1)uT2%&Zez+@5XL&D>*vbv}`5D6E*UrySCQ8H}JJOX|m$P~8og%Kb*NY3gxbE>hW% ze2@I`dHP?;Mmgsob&YIcmky}bfE~j9{Ar#c>FbGuHF=t#I$8ZTO*ES*>B5|={YNG6 zMQTVyBw|2JswFv&{^hUfcwB7qY3#Hu>#2SFuREihBdo-ATaOS)*SVUh7nXN@DE=kay}9G+Q~n|x z$g)3BCe^0pw#tWOgyJ7nqJapc-dR={7`I}FJtCl?~79?{Cmk2VA=ad`7N6_ zPBPMsx5q-gssRx{3$nQS5oUEkM#gOto`+%5&Wa|29x3%&a9d#gWr_@z-Re76K3v{<`;@XNgCpxBtBHT@-`h zcv9;j1K8A5VW)^6fC}bxb>yw!KwkEh@gLuakh*5IEV%%-h~3vdL5Pa1kVPAA&5k_o z!~`SrY3V==)$r|LEVhw|&)`^o(tP|wkbQiBQ#&#MJs%&h*Nlb4AMi=G+D*ezV3^{pEyVAH# z&W@cB-}8_jnSjbo9KEOITzbaYghY!{NoD*dfv2lav*&j#m%?gX6NTJScTdPDOUC|W zKw3v4*XQ&89p-vpM=h_*EYDcH{gss7Aui5~U2Ov~i@%0(!jXrb7?mB=OX+cOI&CC) ztJsWou6P2L_R-<~T*I~1 z!2+zgADm;dId%~ta*`pT2>o)~QeO7Df{CR~clHgy0pq@UmCQ98d`H@|c&e>9CE<{a z)p(_S7sXj($WJQYo!oyi;~875PLwF8wNcZfIDp(DgTC&Cg_=?2#{~_Fx@*yQa}jnB z-e$TX!#5yl%`~jGQ)nYXyNjtX6~;#>QQ@Tdr^qGk^x%DVEzqH?hvh-*%;62SPsx(8 zb5Z(-saM^)en4cR4#Ls0Go>+H5V{59zI#|ZB&FgjPq$0~ zV0Du*^F4L&qO&9m_|Q9h@P9lXtiLb4z&IR3CpqWDI z0M-bF+062>)$YiHE5c|S@W5q-1h6e>?iux?ns^=-^(On3$zoG|oH0QpUXP1F$b->n z)hXTGQ3zN^p%ZnSNM!=!jdL1}kmc12bz!{6fXh2_N8-H6sk+m6F_Z@E2axU8 zD$7gOCG}ZYZ~zN_XYEtr^!YnhKZms+-PfNN!_;c1(+_4}JamtuM`@@N=YK{D2(GPr zf%$2k(-mb{?Pr}P2-@1O$=#aX%X^eabiGPme_K1qL}C}jJ`T8 ztSzz{6W=fUZ>Z+Cc1pGR6T1FK~2du4y3eW|R#SzZ9kMI+7TdOI% zj^EDYDm+jdv#$ImAWW_8v4#%ag)JyMK1J!|;d8@_(ZYh=Ewfs;f_&R&?EvkCba`o~ zjc$&%Hz=eZeswkV5PhHvAgGe-RsgfH0QFF)JfZirVfJ|W|1!_5_DJf)DJL4X%!NsLqtfJQ7JRHx#cHNCC` zmD>}9Sqt3UbkoktJT~N4j}|%tppqwsIIn`jeC7I$uHhx7fXW#h$gh};A~<72tV`dA z|LRPmfj$#wj-!%`fHpH@e>ujbaAu38KsjW}POw((Min;c!k=dSf(E<;nSE;i^GVaE zrAk@QDvYhnbj|!YoaG+Io^8pgbG23*8}9B8A4@p<+yHK)7E!bmf|e61%XPRSlSj-A ze?NbQ?tqjvP{F!DqeHwg-j1!Sa2?^uywZJUvymI1$l_8HKh$V4g8M{YBOq{RYB8?i zXq?l~X`yf02wntaNrds&Z);gQzqfF=!}!{xt_uK9Ci=m!>@HcH z&8tMMtVQ)&Zj1WN9Jvt&GBvRKH)?>%WojSs)G)p&fCKzb*c-68B_Qlt%Ll%WoCwpT zzRcVE&v!#hqOaBW4vQbE)ct|A~$z>GWj zBRHtB6@*_J%evZfgxtKG+8F4ER?Yid!4;Y>Q$7>GrnbRm3?^LtV;V4TvLpHVKWuPv zK-(lw(L6NPtrSlrP{#-2S2T-IqdNrtsk+C~DyEtS+yAv}XnLoC?kWTuo5!moEkLqkd>np4L|E-dU{I}8~tTyuh2xOmwaC86tmcIhfe+}|2 d5(lK7oMsYBo!5Kz{v#83-O)ADDZXX*>>n5o2R;A* delta 17178 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 Pi3&cH`k43OtK0tr-@rO= diff --git a/report/imgs/call_stack/call_stack.xcf b/report/imgs/call_stack/call_stack.xcf index 0521b0a9afe00f795992e1198c95459c583b654b..a9ea5058b5cefbc1d05b12e49b99854795d8f665 100644 GIT binary patch delta 6014 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 delta 3054 zcmYk;3s6*590u@vFH6HC$W=gH0m)quG#E#hK^7?ulwwes71J?9QhZ>EI*TGu@dzzy1FA+{5lU=iX)K zeN*pgQ_Va*Wq;8H-E~4!N9aWuodB(eU_uGBSHiRcn0XpzPlLJfuz>v*8p!3_psNqI z_bToLu~l-)*1Hb!82JE>-VVp?h4yJ`j{Cn* z8Bkw8S`QIvS+|VjDmB~5E$EY$L>+Vzb$VypmBRg!vH|6kt#l9NFexXQ&(oW<4~`9@ z7CM4DXf~Zi7b{)b*h&^Q(5-Y2ZJ{UWd3uxf!PFqiIZLf#-b8oOW~%n9OVd(2Sh!4k z=o9D&rO`BrzDTFg0$M_==q9?8Hq#^0MEP=buyC37&?hi0ltz2TXY}}a`cD~d80niu zTCOE1osWskAHX3Wp{~#2y5vTppKAYieGb=Ys*~5R^D}v$LE?=KHJ*+0KGF^6 zN@1CAaX1?>K*3yE0#)mMT8%<>@(DM?dn3przt&SS|5AuixK~UrwKxiYMR@`D!Ged# zs;!qTzgOW?)aNz81%94}(wqRJc(STDAfpYm8`Y}|kTejRz#owU5bOd~R7F@wc z$%=i*<@43dFI)BZb4JApvDj^KRN#@Txvrv%i|eb>dfD=mR&r)n?PtHm>Z#M^KK+cb zT2nXm>Tx*L-b(pUZokNUL*3Nx|BJZhS;~<=j7DDP-Fos^*8$xe#{CELU0BlvH`{3u ztmCBA&17B#x8y2a+LmQ3)W98Ow3^n!hL!Y7`WxK+9pxU_&F|OrIqFUK;hvXaa{yIS zDR1iLcoYtB1`dp4ehVJPC)ExYGV=qsr~x#sr3&?yZg|8^x6`lSkInEH$3K=Mv-hSx zJ_RR^7tj)TG6tS9Xn(n1;>FfoIbziLdU3QZ#?$smXSUJtNG?=q8_0%!x1%_qQI1pL9L&3)Dk= z9%a4&%|7vel5YM7^>7*yj2tmUD*uLV@xJjolBU5(4iL!;qk_E)?m2p`ZK@G-LoV`Q ztNy$Ved97IcBdYf&%8*ka=1$$hTW(S>qXsaqG6QdSnbRl&zi?vM9XM3t)-3hAZ?{x zUga!XyIJUkHWLk_HfpDtG>;b1GFnY*X(K&ITWOb6-qyOUn}uE&YocM)M(s3{=FuWr mMyqKpZKMZjEA7&>B>7g4?Pj4D#+hgswNd-mYm@a){r&?IJi40z diff --git a/report/report.tex b/report/report.tex index 7efced2..af70ddf 100644 --- a/report/report.tex +++ b/report/report.tex @@ -121,10 +121,24 @@ from the whole stack. Interpreting a frame in order to get the machine state \emph{before} this frame, and thus be able to decode the next frame recursively, is called -\emph{unwinding} a frame. For all the reasons above and more, it is often -necessary to have additional data to perform stack unwinding. This data is -often stored among the debugging informations of a program, and one common -format of debugging data is DWARF\@. +\emph{unwinding} a frame. + +Let us consider a stack with x86\_64 calling conventions, such as shown in +Figure~\ref{fig:call_stack}. Assuming the compiler decided here \emph{not} to +use \reg{rbp}, and assuming the function \eg{} allocates a buffer of 8 +integers, the area allocated for local variables should be at least $32$ bytes +long (for 4-bytes integers), and \reg{rip} will be pointing below this area. +Left apart analyzing the assembly code produced, there is no way to find where +the return address is stored, relatively to \reg{rsp}, at some arbitrary point +of the function. Even when \reg{rbp} is used, there is no easy way to guess +where each callee-saved register is stored in the stack frame, and worse, which +callee-saved registers were saved (since it is not necessary to save a register +that the function never touches). + +With this example, it seems pretty clear that it is often necessary to have +additional data to perform stack unwinding. This data is often stored among the +debugging informations of a program, and one common format of debugging data is +DWARF\@. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Unwinding usage and frequency} @@ -574,16 +588,24 @@ machine code on the x86\_64 platform. The rough idea of the compilation is to produce, out of the \ehframe{} section of a binary, C code that resembles the code shown in the DWARF semantics from Section~\ref{sec:semantics} above. This C code is then compiled by GCC, -providing for free all the optimisation passes of a modern compiler. This code -is compiled as a shared library, containing a single function, taking as -argument an instruction pointer and a memory context (\ie{} the value of the -various machine registers) as defined in Listing~\ref{lst:unw_ctx}. An -optionally enabled parameter can be used to pass a function pointer to a +providing for free all the optimization passes of a modern compiler. + +The generated code consists in a single monolithic function, taking as +arguments an instruction pointer and a memory context (\ie{} the value of the +various machine registers) as defined in Listing~\ref{lst:unw_ctx}. The +function will then return a fresh memory context, containing the values the +registers hold after unwinding this frame. + +The body of the function itself is mostly a huge switch, taking advantage of +the non-standard ---~yet widely implemented in C compilers~--- syntax for range +switches, in which each \lstc{case} can refer to a range. All the FDEs are +merged together into this switch, each row of a FDE being a switch case. The +cases then fill a context with unwound values, then return it. + +An optionally enabled parameter can be used to pass a function pointer to a dereferencing function, that conceptually does what the dereferencing \lstc{*} operator does on a pointer, and is used to unwind a process that is not the currently running process, and thus not sharing the same address space. A call -to this function returns a fresh memory context, containing the values the -registers hold after unwinding this frame. Unlike in the \ehframe, and unlike what should be done in a release, real-world-proof version of the \ehelfs, the choice was made to keep this @@ -614,9 +636,17 @@ options turned on or off, and it doesn't require to alter the base system by editing \eg{} \texttt{/usr/lib/libc-*.so}. Instead, when the \ehelf{} data is required, those files can simply be \lstc{dlopen}'d. -\todo{Talk about switch structure, considered and ignored registers, etc.} +\medskip -\todo{More details here? Is it necessary or just too technical?} +\lstinputlisting[language=C, caption={\ehelf{} for the previous example}, + label={lst:fib7_eh_elf_basic}] + {src/fib7/fib7.eh_elf_basic.c} + +\note{I did not put some ASM here, as I doubt the jury will read it anyway, }\\ +\qnote{and it takes way too much space} + +The C code in Listing~\ref{lst:fib7_eh_elf_basic} is a part of what was +generated for the C code in Listing~\ref{lst:ex1_c}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{First results} @@ -682,20 +712,29 @@ made in order to shrink the \ehelfs. \medskip -The major optimization that most reduced the output size was to use a more -flexible if/else if tree implementing a binary search on the program counter -relevant intervals, instead of a huge switch. In the process, we also -\emph{outline} a lot of code, that is, find out identical code blocks, move -them outside of the if/else tree, identify them by a label, and jump to them -using a \lstc{goto}, which de-duplicates a lot of code and contributes greatly -to the shrinking. In the process, we noticed that the vast majority of FDE rows -are actually taken among very few ``common'' FDE rows. +The major optimization that most reduced the output size was to use an if/else +tree implementing a binary search on the program counter relevant intervals, +instead of a huge switch. In the process, we also \emph{outline} a lot of code, +that is, find out identical code blocks, move them outside of the if/else tree, +identify them by a label, and jump to them using a \lstc{goto}, which +de-duplicates a lot of code and contributes greatly to the shrinking. In the +process, we noticed that the vast majority of FDE rows are actually taken among +very few ``common'' FDE rows. -This makes this optimisation really efficient, as seen later in +This makes this optimization really efficient, as seen later in Section~\ref{ssec:results_size}, but also makes it an interesting question --- not investigated during this internship --- to find out whether standard DWARF data could be efficiently compressed in this way. +\begin{minipage}{0.45\textwidth} + \lstinputlisting[language=C, caption={\ehelf{} for the previous example}, + label={lst:fib7_eh_elf_outline}, + lastline=18] + {src/fib7/fib7.eh_elf_outline.c} +\end{minipage} \hfill \begin{minipage}{0.45\textwidth} + \lstinputlisting[language=C, firstnumber=last, firstline=19] + {src/fib7/fib7.eh_elf_outline.c} +\end{minipage} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/report/src/fib7/fib7.eh_elf.c b/report/src/fib7/fib7.eh_elf_basic.c similarity index 50% rename from report/src/fib7/fib7.eh_elf.c rename to report/src/fib7/fib7.eh_elf_basic.c index 0a2e685..94e6536 100644 --- a/report/src/fib7/fib7.eh_elf.c +++ b/report/src/fib7/fib7.eh_elf_basic.c @@ -1,21 +1,13 @@ unwind_context_t _eh_elf(unwind_context_t ctx, uintptr_t pc) { unwind_context_t out_ctx; switch(pc) { + // [...] Previous FDEs redacted for brevity case 0x615 ... 0x618: out_ctx.rsp = ctx.rsp + (8); out_ctx.rip = *((uintptr_t*)(out_ctx.rsp + (-8))); out_ctx.flags = 3u; return out_ctx; - case 0x619 ... 0x658: - out_ctx.rsp = ctx.rsp + (48); - out_ctx.rip = *((uintptr_t*)(out_ctx.rsp + (-8))); - out_ctx.flags = 3u; - return out_ctx; - case 0x659 ... 0x659: - out_ctx.rsp = ctx.rsp + (8); - out_ctx.rip = *((uintptr_t*)(out_ctx.rsp + (-8))); - out_ctx.flags = 3u; - return out_ctx; + // [...] Further lines and FDEs redacted for brevity default: out_ctx.flags = 128u; return out_ctx; diff --git a/report/src/fib7/fib7.eh_elf_outline.c b/report/src/fib7/fib7.eh_elf_outline.c new file mode 100644 index 0000000..1d3adc5 --- /dev/null +++ b/report/src/fib7/fib7.eh_elf_outline.c @@ -0,0 +1,33 @@ +unwind_context_t _eh_elf(unwind_context_t ctx, uintptr_t pc) { + unwind_context_t out_ctx; + if(pc < 0x619) { + // IP=0x615 ... 0x618 + goto _factor_3; + } else { + if(pc < 0x659) { + // IP=0x619 ... 0x658 + goto _factor_4; + } else { + // IP=0x659 ... 0x659 + goto _factor_3; + } + } + + _factor_default: + out_ctx.flags = 128u; + return out_ctx; + + /* ===== LABELS ======== */ + + _factor_4: + out_ctx.rsp = ctx.rsp + (48); + out_ctx.rip = *((uintptr_t*)(out_ctx.rsp + (-8))); + out_ctx.flags = 3u; + return out_ctx; + + _factor_3: + out_ctx.rsp = ctx.rsp + (8); + out_ctx.rip = *((uintptr_t*)(out_ctx.rsp + (-8))); + out_ctx.flags = 3u; + return out_ctx; +}