From bbs@floyd.upol.czMon Jan 29 16:15:48 1996 Date: Wed, 6 Dec 1995 15:25:14 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: Princip #1-gcc (fwd) *** Forwarded file follows *** Posted By: kotelnik (kotelnik) on 'Linux' Title: Princip #1-gcc Date: Thu Nov 23 18:13:29 1995 u psani skolicky na bisona jsem si uvedomil jak je dulezity vedet jak to vevnitr funguje. Zaprvy kdyz se neco pokazi tak se clovek zamysli co a jak se asi deje a kde by to asi mohlo blbnout a hle ono to tam blbne. Zadruhy vetsina veci v unixu je krasne navrzena a clovek se z nich muze ucit. A tak jsem se rozhodl ze napisu jak vevnitr funguje gcc a doufam ze ostatni se ke me pripoji a napisou to i o jinych vecech.. takze tedy..Kdyz gcc kompiluje pouziva nekolik zakladnich prubehu: Lexikalni analyza-to je provedeno jak jsem popsal ve skolickach-proste za int se dosadi cislo aby se stim lepe pracovalo pusti se parser..ten se jmenuje jinak pro kazdy jazyk Parsing-preklad do mezikodu. Gcc pouziva mezikod ktery se jmenuje RTL. Tento mezikod je nazacatku nezavisly na architekture takze kdyz predelate tyhle prvni dva prubehy mate razem z cecka pascal nebo jinej bastl. RTL byl inspirovan v lispovskych listech takze kdo zna alespon trochu lisp tak si v nem pocte. Neni to kod pro cloveka ale je krasny. V distribuci kcc jsou knihovny na generovani a praci s rtl protoze to neni jazyk z textovyma prikazama tak je prace rychla a jednoducha. Jsou tu switche ktery vypisou rtl do souboru v ruznych stavech kompilace. Je to velmi poucny.Je to taky zajimavy tim ze pozdeji jsou tam jak assemblerove instrukce tak popis co delaji v rtl. RTL-Register transfer language. pouziva uz pouze expresions,integers,wide integers,strings,vectors takze je mnohem mnohem jednodussi nez c/assembler a je idealni na optimalizaci tyto parsery jsou jeste napsany v C ale pro C++/objective c jsou uz v bisonovi vlastni parsing je jeste rozdelen na generovani struktury kodu-toplevel/funkce atd a potom prekladani vlastnich statementu a generovani RTL prepne se do dalsiho programu-tusim cc1 ted nastava magicka cast=optimalizace 1)Jump Optimalizations-snazi se zjednodusit skoky-skoky na skoky,koky za skoky vyhodi nepouzitej kod nebo nepouzivana navesti..proste snazi se vymazat zakladni prasarny co tam clovek nadelal 2)Register scan-v rtl jsou vsechny promeny registry tahle optimalizace projde program a kdyz treba pouzivate dva inty ale jeden na zacatku funkce a druhej na konci tak je spoji 3)Jump Threading-tomu muc nerozumim...vola se jen ze switchem 4)Common subexpresion elimination-snazi se natlouct konstanty vsude kde to jenom trochu jde-u kazdeho registru si oznaci kde je konstatni a vsechny expresion jenom z cisly proste vyresi potom se znova vola Jump Optimilazitions 5)Loop optimalization-vyhazije vsechno ce se da provedst mimo smycku ven taky smycky co jsou kratky rozroluje-proste ten prikaz napise x krat a smycku zrusi 6)kdyz date -frerun-cse-after-loop znova nahaze konstanty 7)stupid register alocations-proste registry rtl da do registru procesoru a kdyz se tam nevejdou tak do zasobniku 8)Data flow analysis- zjisti kde se ktery pseudo register pouziva-rozdeli program podle toho do bloku 9)Instructions combination - spojuje instrukce 10)Instruction sheduling- pro riskovy stroje nebo pentia srivna instrukce tak aby bezely co nejrychleji 11)Register class preferencing - urcije ktery registr je nejlepsi pro ten ci onen pseudo-registr 12-13)Local/Global register allocation - prideli lepe registryso pseudo registru 14)Reloading-tady se davaji pseudo registry do registru procesoru naalokuje se zasobnik opakuje se Instruction sheduling a jump optimalization 17)Delay branch sheduling-vpodstate pro multiprocesoring nebo kdyz procesor umi provadet jinou instrukci pritom kdyz prvni dela neco pomalu-treba koprocesor takze ty intrukce da tak aby se co nejlepe davaly do kodu 18)Jeste jedna konverse registru-casto pouzivane se daji ze zasobniku do registru a je optimalizovano! zde se z rtl dela assembler-je to velmi snadne-proste se uberou rtlkovy struktury..taky se delaj jeste nejaky pridavny optimalizace proassembler.. tad se ulozi debbuging info a je hotovo nyni se dostava k reci assembler a linker. pokud by snad nekdo nevedel jak pracuji muzu dat dalsi post a ted vystup: main() { int x,y,z; for(z=0;z<9999999;z++) x+=y,y=2*x; printf("%i\n",x); } kod: .text _main: call ____main /*inicializace -volani zdilene kdihovny*/ xor %eax,%eax /*registr eax=x-nuluje*/ movl $1,%ecx /*y*/ movl $999998,%edx /*otocil smycku-jede od zhora dolu aby to bylo rychlejsi*/ .align 2,0x90 L5: /*zacatek smycky*/ addl %ecx,%eax movl %eax,%ecx addl %eax,%ecx /*tady si trochu zapotimalizoval z myho vyrazu udelal y+=x,x=y,y+=x a tam usetril jedno add*/ decl %edx jns L5 /*konec smycky*/ pushl %eax /*volani printfu*/ pushl $LCO /* "%i\n" */ call _printf addl $8,%esp /*srovnani zasobniku*/ ret no reknete..napsali by jste to lip? je videt ze to neni borlandi bastl..nekdy si to zkuste na borlandu.. na stranku se vam to urcite nevejde..proto jsou linuxacky binace kratsi nez zdrojaky! tak se mejte.. doufam ze me nekdo bude nasledovat Kotelnik ......a ten nejkotlivejsi......