123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267 |
- @c Copyright (C) 1988-2015 Free Software Foundation, Inc.
- @c This is part of the GCC manual.
- @c For copying conditions, see the file gcc.texi.
- @ignore
- @c man begin INCLUDE
- @include gcc-vers.texi
- @c man end
- @c man begin COPYRIGHT
- Copyright @copyright{} 1988-2015 Free Software Foundation, Inc.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3 or
- any later version published by the Free Software Foundation; with the
- Invariant Sections being ``GNU General Public License'' and ``Funding
- Free Software'', the Front-Cover texts being (a) (see below), and with
- the Back-Cover Texts being (b) (see below). A copy of the license is
- included in the gfdl(7) man page.
- (a) The FSF's Front-Cover Text is:
- A GNU Manual
- (b) The FSF's Back-Cover Text is:
- You have freedom to copy and modify this GNU Manual, like GNU
- software. Copies published by the Free Software Foundation raise
- funds for GNU development.
- @c man end
- @c Set file name and title for the man page.
- @setfilename gcc
- @settitle GNU project C and C++ compiler
- @c man begin SYNOPSIS
- gcc [@option{-c}|@option{-S}|@option{-E}] [@option{-std=}@var{standard}]
- [@option{-g}] [@option{-pg}] [@option{-O}@var{level}]
- [@option{-W}@var{warn}@dots{}] [@option{-Wpedantic}]
- [@option{-I}@var{dir}@dots{}] [@option{-L}@var{dir}@dots{}]
- [@option{-D}@var{macro}[=@var{defn}]@dots{}] [@option{-U}@var{macro}]
- [@option{-f}@var{option}@dots{}] [@option{-m}@var{machine-option}@dots{}]
- [@option{-o} @var{outfile}] [@@@var{file}] @var{infile}@dots{}
- Only the most useful options are listed here; see below for the
- remainder. @command{g++} accepts mostly the same options as @command{gcc}.
- @c man end
- @c man begin SEEALSO
- gpl(7), gfdl(7), fsf-funding(7),
- cpp(1), gcov(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1)
- and the Info entries for @file{gcc}, @file{cpp}, @file{as},
- @file{ld}, @file{binutils} and @file{gdb}.
- @c man end
- @c man begin BUGS
- For instructions on reporting bugs, see
- @w{@value{BUGURL}}.
- @c man end
- @c man begin AUTHOR
- See the Info entry for @command{gcc}, or
- @w{@uref{http://gcc.gnu.org/onlinedocs/gcc/Contributors.html}},
- for contributors to GCC@.
- @c man end
- @end ignore
- @node Invoking GCC
- @chapter GCC Command Options
- @cindex GCC command options
- @cindex command options
- @cindex options, GCC command
- @c man begin DESCRIPTION
- When you invoke GCC, it normally does preprocessing, compilation,
- assembly and linking. The ``overall options'' allow you to stop this
- process at an intermediate stage. For example, the @option{-c} option
- says not to run the linker. Then the output consists of object files
- output by the assembler.
- Other options are passed on to one stage of processing. Some options
- control the preprocessor and others the compiler itself. Yet other
- options control the assembler and linker; most of these are not
- documented here, since you rarely need to use any of them.
- @cindex C compilation options
- Most of the command-line options that you can use with GCC are useful
- for C programs; when an option is only useful with another language
- (usually C++), the explanation says so explicitly. If the description
- for a particular option does not mention a source language, you can use
- that option with all supported languages.
- @cindex C++ compilation options
- @xref{Invoking G++,,Compiling C++ Programs}, for a summary of special
- options for compiling C++ programs.
- @cindex grouping options
- @cindex options, grouping
- The @command{gcc} program accepts options and file names as operands. Many
- options have multi-letter names; therefore multiple single-letter options
- may @emph{not} be grouped: @option{-dv} is very different from @w{@samp{-d
- -v}}.
- @cindex order of options
- @cindex options, order
- You can mix options and other arguments. For the most part, the order
- you use doesn't matter. Order does matter when you use several
- options of the same kind; for example, if you specify @option{-L} more
- than once, the directories are searched in the order specified. Also,
- the placement of the @option{-l} option is significant.
- Many options have long names starting with @samp{-f} or with
- @samp{-W}---for example,
- @option{-fmove-loop-invariants}, @option{-Wformat} and so on. Most of
- these have both positive and negative forms; the negative form of
- @option{-ffoo} is @option{-fno-foo}. This manual documents
- only one of these two forms, whichever one is not the default.
- @c man end
- @xref{Option Index}, for an index to GCC's options.
- @menu
- * Option Summary:: Brief list of all options, without explanations.
- * Overall Options:: Controlling the kind of output:
- an executable, object files, assembler files,
- or preprocessed source.
- * Invoking G++:: Compiling C++ programs.
- * C Dialect Options:: Controlling the variant of C language compiled.
- * C++ Dialect Options:: Variations on C++.
- * Objective-C and Objective-C++ Dialect Options:: Variations on Objective-C
- and Objective-C++.
- * Language Independent Options:: Controlling how diagnostics should be
- formatted.
- * Warning Options:: How picky should the compiler be?
- * Debugging Options:: Symbol tables, measurements, and debugging dumps.
- * Optimize Options:: How much optimization?
- * Preprocessor Options:: Controlling header files and macro definitions.
- Also, getting dependency information for Make.
- * Assembler Options:: Passing options to the assembler.
- * Link Options:: Specifying libraries and so on.
- * Directory Options:: Where to find header files and libraries.
- Where to find the compiler executable files.
- * Spec Files:: How to pass switches to sub-processes.
- * Target Options:: Running a cross-compiler, or an old version of GCC.
- * Submodel Options:: Specifying minor hardware or convention variations,
- such as 68010 vs 68020.
- * Code Gen Options:: Specifying conventions for function calls, data layout
- and register usage.
- * Environment Variables:: Env vars that affect GCC.
- * Precompiled Headers:: Compiling a header once, and using it many times.
- @end menu
- @c man begin OPTIONS
- @node Option Summary
- @section Option Summary
- Here is a summary of all the options, grouped by type. Explanations are
- in the following sections.
- @table @emph
- @item Overall Options
- @xref{Overall Options,,Options Controlling the Kind of Output}.
- @gccoptlist{-c -S -E -o @var{file} -no-canonical-prefixes @gol
- -pipe -pass-exit-codes @gol
- -x @var{language} -v -### --help@r{[}=@var{class}@r{[},@dots{}@r{]]} --target-help @gol
- --version -wrapper @@@var{file} -fplugin=@var{file} -fplugin-arg-@var{name}=@var{arg} @gol
- -fdump-ada-spec@r{[}-slim@r{]} -fada-spec-parent=@var{unit} -fdump-go-spec=@var{file}}
- @item C Language Options
- @xref{C Dialect Options,,Options Controlling C Dialect}.
- @gccoptlist{-ansi -std=@var{standard} -fgnu89-inline @gol
- -aux-info @var{filename} -fallow-parameterless-variadic-functions @gol
- -fno-asm -fno-builtin -fno-builtin-@var{function} @gol
- -fhosted -ffreestanding -fopenacc -fopenmp -fopenmp-simd @gol
- -fms-extensions -fplan9-extensions -trigraphs -traditional -traditional-cpp @gol
- -fallow-single-precision -fcond-mismatch -flax-vector-conversions @gol
- -fsigned-bitfields -fsigned-char @gol
- -funsigned-bitfields -funsigned-char}
- @item C++ Language Options
- @xref{C++ Dialect Options,,Options Controlling C++ Dialect}.
- @gccoptlist{-fabi-version=@var{n} -fno-access-control -fcheck-new @gol
- -fconstexpr-depth=@var{n} -ffriend-injection @gol
- -fno-elide-constructors @gol
- -fno-enforce-eh-specs @gol
- -ffor-scope -fno-for-scope -fno-gnu-keywords @gol
- -fno-implicit-templates @gol
- -fno-implicit-inline-templates @gol
- -fno-implement-inlines -fms-extensions @gol
- -fno-nonansi-builtins -fnothrow-opt -fno-operator-names @gol
- -fno-optional-diags -fpermissive @gol
- -fno-pretty-templates @gol
- -frepo -fno-rtti -fsized-deallocation @gol
- -fstats -ftemplate-backtrace-limit=@var{n} @gol
- -ftemplate-depth=@var{n} @gol
- -fno-threadsafe-statics -fuse-cxa-atexit @gol
- -fno-weak -nostdinc++ @gol
- -fvisibility-inlines-hidden @gol
- -fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]} @gol
- -fvtv-counts -fvtv-debug @gol
- -fvisibility-ms-compat @gol
- -fext-numeric-literals @gol
- -Wabi=@var{n} -Wabi-tag -Wconversion-null -Wctor-dtor-privacy @gol
- -Wdelete-non-virtual-dtor -Wliteral-suffix -Wnarrowing @gol
- -Wnoexcept -Wnon-virtual-dtor -Wreorder @gol
- -Weffc++ -Wstrict-null-sentinel @gol
- -Wno-non-template-friend -Wold-style-cast @gol
- -Woverloaded-virtual -Wno-pmf-conversions @gol
- -Wsign-promo}
- @item Objective-C and Objective-C++ Language Options
- @xref{Objective-C and Objective-C++ Dialect Options,,Options Controlling
- Objective-C and Objective-C++ Dialects}.
- @gccoptlist{-fconstant-string-class=@var{class-name} @gol
- -fgnu-runtime -fnext-runtime @gol
- -fno-nil-receivers @gol
- -fobjc-abi-version=@var{n} @gol
- -fobjc-call-cxx-cdtors @gol
- -fobjc-direct-dispatch @gol
- -fobjc-exceptions @gol
- -fobjc-gc @gol
- -fobjc-nilcheck @gol
- -fobjc-std=objc1 @gol
- -fno-local-ivars @gol
- -fivar-visibility=@r{[}public@r{|}protected@r{|}private@r{|}package@r{]} @gol
- -freplace-objc-classes @gol
- -fzero-link @gol
- -gen-decls @gol
- -Wassign-intercept @gol
- -Wno-protocol -Wselector @gol
- -Wstrict-selector-match @gol
- -Wundeclared-selector}
- @item Language Independent Options
- @xref{Language Independent Options,,Options to Control Diagnostic Messages Formatting}.
- @gccoptlist{-fmessage-length=@var{n} @gol
- -fdiagnostics-show-location=@r{[}once@r{|}every-line@r{]} @gol
- -fdiagnostics-color=@r{[}auto@r{|}never@r{|}always@r{]} @gol
- -fno-diagnostics-show-option -fno-diagnostics-show-caret}
- @item Warning Options
- @xref{Warning Options,,Options to Request or Suppress Warnings}.
- @gccoptlist{-fsyntax-only -fmax-errors=@var{n} -Wpedantic @gol
- -pedantic-errors @gol
- -w -Wextra -Wall -Waddress -Waggregate-return @gol
- -Waggressive-loop-optimizations -Warray-bounds -Warray-bounds=@var{n} @gol
- -Wbool-compare @gol
- -Wno-attributes -Wno-builtin-macro-redefined @gol
- -Wc90-c99-compat -Wc99-c11-compat @gol
- -Wc++-compat -Wc++11-compat -Wc++14-compat -Wcast-align -Wcast-qual @gol
- -Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported @gol
- -Wconversion -Wcoverage-mismatch -Wdate-time -Wdelete-incomplete -Wno-cpp @gol
- -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init @gol
- -Wdisabled-optimization @gol
- -Wno-discarded-qualifiers -Wno-discarded-array-qualifiers @gol
- -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol
- -Wno-endif-labels -Werror -Werror=* @gol
- -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol
- -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral @gol
- -Wformat-security -Wformat-signedness -Wformat-y2k @gol
- -Wframe-larger-than=@var{len} -Wno-free-nonheap-object -Wjump-misses-init @gol
- -Wignored-qualifiers -Wincompatible-pointer-types @gol
- -Wimplicit -Wimplicit-function-declaration -Wimplicit-int @gol
- -Winit-self -Winline -Wno-int-conversion @gol
- -Wno-int-to-pointer-cast -Wno-invalid-offsetof @gol
- -Winvalid-pch -Wlarger-than=@var{len} -Wunsafe-loop-optimizations @gol
- -Wlogical-op -Wlogical-not-parentheses -Wlong-long @gol
- -Wmain -Wmaybe-uninitialized -Wmemset-transposed-args -Wmissing-braces @gol
- -Wmissing-field-initializers -Wmissing-include-dirs @gol
- -Wno-multichar -Wnonnull -Wnormalized=@r{[}none@r{|}id@r{|}nfc@r{|}nfkc@r{]} @gol
- -Wodr -Wno-overflow -Wopenmp-simd @gol
- -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol
- -Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
- -Wpointer-arith -Wno-pointer-to-int-cast @gol
- -Wredundant-decls -Wno-return-local-addr @gol
- -Wreturn-type -Wsequence-point -Wshadow -Wno-shadow-ivar @gol
- -Wshift-count-negative -Wshift-count-overflow @gol
- -Wsign-compare -Wsign-conversion -Wfloat-conversion @gol
- -Wsizeof-pointer-memaccess -Wsizeof-array-argument @gol
- -Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol
- -Wstrict-aliasing=n @gol -Wstrict-overflow -Wstrict-overflow=@var{n} @gol
- -Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{|}format@r{]} @gol
- -Wsuggest-final-types @gol -Wsuggest-final-methods @gol -Wsuggest-override @gol
- -Wmissing-format-attribute @gol
- -Wswitch -Wswitch-default -Wswitch-enum -Wswitch-bool -Wsync-nand @gol
- -Wsystem-headers -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef @gol
- -Wuninitialized -Wunknown-pragmas -Wno-pragmas @gol
- -Wunsuffixed-float-constants -Wunused -Wunused-function @gol
- -Wunused-label -Wunused-local-typedefs -Wunused-parameter @gol
- -Wno-unused-result -Wunused-value @gol -Wunused-variable @gol
- -Wunused-but-set-parameter -Wunused-but-set-variable @gol
- -Wuseless-cast -Wvariadic-macros -Wvector-operation-performance @gol
- -Wvla -Wvolatile-register-var -Wwrite-strings @gol
- -Wzero-as-null-pointer-constant}
- @item C and Objective-C-only Warning Options
- @gccoptlist{-Wbad-function-cast -Wmissing-declarations @gol
- -Wmissing-parameter-type -Wmissing-prototypes -Wnested-externs @gol
- -Wold-style-declaration -Wold-style-definition @gol
- -Wstrict-prototypes -Wtraditional -Wtraditional-conversion @gol
- -Wdeclaration-after-statement -Wpointer-sign}
- @item Debugging Options
- @xref{Debugging Options,,Options for Debugging Your Program or GCC}.
- @gccoptlist{-d@var{letters} -dumpspecs -dumpmachine -dumpversion @gol
- -fsanitize=@var{style} -fsanitize-recover -fsanitize-recover=@var{style} @gol
- -fasan-shadow-offset=@var{number} -fsanitize-undefined-trap-on-error @gol
- -fcheck-pointer-bounds -fchkp-check-incomplete-type @gol
- -fchkp-first-field-has-own-bounds -fchkp-narrow-bounds @gol
- -fchkp-narrow-to-innermost-array -fchkp-optimize @gol
- -fchkp-use-fast-string-functions -fchkp-use-nochk-string-functions @gol
- -fchkp-use-static-bounds -fchkp-use-static-const-bounds @gol
- -fchkp-treat-zero-dynamic-size-as-infinite -fchkp-check-read @gol
- -fchkp-check-read -fchkp-check-write -fchkp-store-bounds @gol
- -fchkp-instrument-calls -fchkp-instrument-marked-only @gol
- -fchkp-use-wrappers @gol
- -fdbg-cnt-list -fdbg-cnt=@var{counter-value-list} @gol
- -fdisable-ipa-@var{pass_name} @gol
- -fdisable-rtl-@var{pass_name} @gol
- -fdisable-rtl-@var{pass-name}=@var{range-list} @gol
- -fdisable-tree-@var{pass_name} @gol
- -fdisable-tree-@var{pass-name}=@var{range-list} @gol
- -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links @gol
- -fdump-translation-unit@r{[}-@var{n}@r{]} @gol
- -fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol
- -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol
- -fdump-passes @gol
- -fdump-statistics @gol
- -fdump-tree-all @gol
- -fdump-tree-original@r{[}-@var{n}@r{]} @gol
- -fdump-tree-optimized@r{[}-@var{n}@r{]} @gol
- -fdump-tree-cfg -fdump-tree-alias @gol
- -fdump-tree-ch @gol
- -fdump-tree-ssa@r{[}-@var{n}@r{]} -fdump-tree-pre@r{[}-@var{n}@r{]} @gol
- -fdump-tree-ccp@r{[}-@var{n}@r{]} -fdump-tree-dce@r{[}-@var{n}@r{]} @gol
- -fdump-tree-gimple@r{[}-raw@r{]} @gol
- -fdump-tree-dom@r{[}-@var{n}@r{]} @gol
- -fdump-tree-dse@r{[}-@var{n}@r{]} @gol
- -fdump-tree-phiprop@r{[}-@var{n}@r{]} @gol
- -fdump-tree-phiopt@r{[}-@var{n}@r{]} @gol
- -fdump-tree-forwprop@r{[}-@var{n}@r{]} @gol
- -fdump-tree-copyrename@r{[}-@var{n}@r{]} @gol
- -fdump-tree-nrv -fdump-tree-vect @gol
- -fdump-tree-sink @gol
- -fdump-tree-sra@r{[}-@var{n}@r{]} @gol
- -fdump-tree-forwprop@r{[}-@var{n}@r{]} @gol
- -fdump-tree-fre@r{[}-@var{n}@r{]} @gol
- -fdump-tree-vtable-verify @gol
- -fdump-tree-vrp@r{[}-@var{n}@r{]} @gol
- -fdump-tree-storeccp@r{[}-@var{n}@r{]} @gol
- -fdump-final-insns=@var{file} @gol
- -fcompare-debug@r{[}=@var{opts}@r{]} -fcompare-debug-second @gol
- -feliminate-dwarf2-dups -fno-eliminate-unused-debug-types @gol
- -feliminate-unused-debug-symbols -femit-class-debug-always @gol
- -fenable-@var{kind}-@var{pass} @gol
- -fenable-@var{kind}-@var{pass}=@var{range-list} @gol
- -fdebug-types-section -fmem-report-wpa @gol
- -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fprofile-arcs @gol
- -fopt-info @gol
- -fopt-info-@var{options}@r{[}=@var{file}@r{]} @gol
- -frandom-seed=@var{number} -fsched-verbose=@var{n} @gol
- -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose @gol
- -fstack-usage -ftest-coverage -ftime-report -fvar-tracking @gol
- -fvar-tracking-assignments -fvar-tracking-assignments-toggle @gol
- -g -g@var{level} -gtoggle -gcoff -gdwarf-@var{version} @gol
- -ggdb -grecord-gcc-switches -gno-record-gcc-switches @gol
- -gstabs -gstabs+ -gstrict-dwarf -gno-strict-dwarf @gol
- -gvms -gxcoff -gxcoff+ -gz@r{[}=@var{type}@r{]} @gol
- -fno-merge-debug-strings -fno-dwarf2-cfi-asm @gol
- -fdebug-prefix-map=@var{old}=@var{new} @gol
- -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol
- -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]} @gol
- -p -pg -print-file-name=@var{library} -print-libgcc-file-name @gol
- -print-multi-directory -print-multi-lib -print-multi-os-directory @gol
- -print-prog-name=@var{program} -print-search-dirs -Q @gol
- -print-sysroot -print-sysroot-headers-suffix @gol
- -save-temps -save-temps=cwd -save-temps=obj -time@r{[}=@var{file}@r{]}}
- @item Optimization Options
- @xref{Optimize Options,,Options that Control Optimization}.
- @gccoptlist{-faggressive-loop-optimizations -falign-functions[=@var{n}] @gol
- -falign-jumps[=@var{n}] @gol
- -falign-labels[=@var{n}] -falign-loops[=@var{n}] @gol
- -fassociative-math -fauto-profile -fauto-profile[=@var{path}] @gol
- -fauto-inc-dec -fbranch-probabilities @gol
- -fbranch-target-load-optimize -fbranch-target-load-optimize2 @gol
- -fbtr-bb-exclusive -fcaller-saves @gol
- -fcheck-data-deps -fcombine-stack-adjustments -fconserve-stack @gol
- -fcompare-elim -fcprop-registers -fcrossjumping @gol
- -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules @gol
- -fcx-limited-range @gol
- -fdata-sections -fdce -fdelayed-branch @gol
- -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively @gol
- -fdevirtualize-at-ltrans -fdse @gol
- -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects @gol
- -ffast-math -ffinite-math-only -ffloat-store -fexcess-precision=@var{style} @gol
- -fforward-propagate -ffp-contract=@var{style} -ffunction-sections @gol
- -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity @gol
- -fgcse-sm -fhoist-adjacent-loads -fif-conversion @gol
- -fif-conversion2 -findirect-inlining @gol
- -finline-functions -finline-functions-called-once -finline-limit=@var{n} @gol
- -finline-small-functions -fipa-cp -fipa-cp-clone -fipa-cp-alignment @gol
- -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-icf @gol
- -fira-algorithm=@var{algorithm} @gol
- -fira-region=@var{region} -fira-hoist-pressure @gol
- -fira-loop-pressure -fno-ira-share-save-slots @gol
- -fno-ira-share-spill-slots -fira-verbose=@var{n} @gol
- -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute @gol
- -fivopts -fkeep-inline-functions -fkeep-static-consts @gol
- -flive-range-shrinkage @gol
- -floop-block -floop-interchange -floop-strip-mine @gol
- -floop-unroll-and-jam -floop-nest-optimize @gol
- -floop-parallelize-all -flra-remat -flto -flto-compression-level @gol
- -flto-partition=@var{alg} -flto-report -flto-report-wpa -fmerge-all-constants @gol
- -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves @gol
- -fmove-loop-invariants -fno-branch-count-reg @gol
- -fno-defer-pop -fno-function-cse -fno-guess-branch-probability @gol
- -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 @gol
- -fno-sched-interblock -fno-sched-spec -fno-signed-zeros @gol
- -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss @gol
- -fomit-frame-pointer -foptimize-sibling-calls @gol
- -fpartial-inlining -fpeel-loops -fpredictive-commoning @gol
- -fprefetch-loop-arrays -fprofile-report @gol
- -fprofile-correction -fprofile-dir=@var{path} -fprofile-generate @gol
- -fprofile-generate=@var{path} @gol
- -fprofile-use -fprofile-use=@var{path} -fprofile-values @gol
- -fprofile-reorder-functions @gol
- -freciprocal-math -free -frename-registers -freorder-blocks @gol
- -freorder-blocks-and-partition -freorder-functions @gol
- -frerun-cse-after-loop -freschedule-modulo-scheduled-loops @gol
- -frounding-math -fsched2-use-superblocks -fsched-pressure @gol
- -fsched-spec-load -fsched-spec-load-dangerous @gol
- -fsched-stalled-insns-dep[=@var{n}] -fsched-stalled-insns[=@var{n}] @gol
- -fsched-group-heuristic -fsched-critical-path-heuristic @gol
- -fsched-spec-insn-heuristic -fsched-rank-heuristic @gol
- -fsched-last-insn-heuristic -fsched-dep-count-heuristic @gol
- -fschedule-fusion @gol
- -fschedule-insns -fschedule-insns2 -fsection-anchors @gol
- -fselective-scheduling -fselective-scheduling2 @gol
- -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops @gol
- -fsemantic-interposition @gol
- -fshrink-wrap -fsignaling-nans -fsingle-precision-constant @gol
- -fsplit-ivs-in-unroller -fsplit-wide-types -fssa-phiopt @gol
- -fstack-protector -fstack-protector-all -fstack-protector-strong @gol
- -fstack-protector-explicit -fstdarg-opt -fstrict-aliasing @gol
- -fstrict-overflow -fthread-jumps -ftracer -ftree-bit-ccp @gol
- -ftree-builtin-call-dce -ftree-ccp -ftree-ch @gol
- -ftree-coalesce-inline-vars -ftree-coalesce-vars -ftree-copy-prop @gol
- -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse @gol
- -ftree-forwprop -ftree-fre -ftree-loop-if-convert @gol
- -ftree-loop-if-convert-stores -ftree-loop-im @gol
- -ftree-phiprop -ftree-loop-distribution -ftree-loop-distribute-patterns @gol
- -ftree-loop-ivcanon -ftree-loop-linear -ftree-loop-optimize @gol
- -ftree-loop-vectorize @gol
- -ftree-parallelize-loops=@var{n} -ftree-pre -ftree-partial-pre -ftree-pta @gol
- -ftree-reassoc -ftree-sink -ftree-slsr -ftree-sra @gol
- -ftree-switch-conversion -ftree-tail-merge -ftree-ter @gol
- -ftree-vectorize -ftree-vrp @gol
- -funit-at-a-time -funroll-all-loops -funroll-loops @gol
- -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops @gol
- -fipa-ra -fvariable-expansion-in-unroller -fvect-cost-model -fvpt @gol
- -fweb -fwhole-program -fwpa -fuse-linker-plugin @gol
- --param @var{name}=@var{value}
- -O -O0 -O1 -O2 -O3 -Os -Ofast -Og}
- @item Preprocessor Options
- @xref{Preprocessor Options,,Options Controlling the Preprocessor}.
- @gccoptlist{-A@var{question}=@var{answer} @gol
- -A-@var{question}@r{[}=@var{answer}@r{]} @gol
- -C -dD -dI -dM -dN @gol
- -D@var{macro}@r{[}=@var{defn}@r{]} -E -H @gol
- -idirafter @var{dir} @gol
- -include @var{file} -imacros @var{file} @gol
- -iprefix @var{file} -iwithprefix @var{dir} @gol
- -iwithprefixbefore @var{dir} -isystem @var{dir} @gol
- -imultilib @var{dir} -isysroot @var{dir} @gol
- -M -MM -MF -MG -MP -MQ -MT -nostdinc @gol
- -P -fdebug-cpp -ftrack-macro-expansion -fworking-directory @gol
- -remap -trigraphs -undef -U@var{macro} @gol
- -Wp,@var{option} -Xpreprocessor @var{option} -no-integrated-cpp}
- @item Assembler Option
- @xref{Assembler Options,,Passing Options to the Assembler}.
- @gccoptlist{-Wa,@var{option} -Xassembler @var{option}}
- @item Linker Options
- @xref{Link Options,,Options for Linking}.
- @gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} -l@var{library} @gol
- -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic @gol
- -s -static -static-libgcc -static-libstdc++ @gol
- -static-libasan -static-libtsan -static-liblsan -static-libubsan @gol
- -static-libmpx -static-libmpxwrappers @gol
- -shared -shared-libgcc -symbolic @gol
- -T @var{script} -Wl,@var{option} -Xlinker @var{option} @gol
- -u @var{symbol} -z @var{keyword}}
- @item Directory Options
- @xref{Directory Options,,Options for Directory Search}.
- @gccoptlist{-B@var{prefix} -I@var{dir} -iplugindir=@var{dir} @gol
- -iquote@var{dir} -L@var{dir} -specs=@var{file} -I- @gol
- --sysroot=@var{dir} --no-sysroot-suffix}
- @item Machine Dependent Options
- @xref{Submodel Options,,Hardware Models and Configurations}.
- @c This list is ordered alphanumerically by subsection name.
- @c Try and put the significant identifier (CPU or system) first,
- @c so users have a clue at guessing where the ones they want will be.
- @emph{AArch64 Options}
- @gccoptlist{-mabi=@var{name} -mbig-endian -mlittle-endian @gol
- -mgeneral-regs-only @gol
- -mcmodel=tiny -mcmodel=small -mcmodel=large @gol
- -mstrict-align @gol
- -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer @gol
- -mtls-dialect=desc -mtls-dialect=traditional @gol
- -mfix-cortex-a53-835769 -mno-fix-cortex-a53-835769 @gol
- -mfix-cortex-a53-843419 -mno-fix-cortex-a53-843419 @gol
- -march=@var{name} -mcpu=@var{name} -mtune=@var{name}}
- @emph{Adapteva Epiphany Options}
- @gccoptlist{-mhalf-reg-file -mprefer-short-insn-regs @gol
- -mbranch-cost=@var{num} -mcmove -mnops=@var{num} -msoft-cmpsf @gol
- -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=@var{num} @gol
- -mround-nearest -mlong-calls -mshort-calls -msmall16 @gol
- -mfp-mode=@var{mode} -mvect-double -max-vect-align=@var{num} @gol
- -msplit-vecmove-early -m1reg-@var{reg}}
- @emph{ARC Options}
- @gccoptlist{-mbarrel-shifter @gol
- -mcpu=@var{cpu} -mA6 -mARC600 -mA7 -mARC700 @gol
- -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr @gol
- -mea -mno-mpy -mmul32x16 -mmul64 @gol
- -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap @gol
- -mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape @gol
- -mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof @gol
- -mepilogue-cfi -mlong-calls -mmedium-calls -msdata @gol
- -mucb-mcount -mvolatile-cache @gol
- -malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc @gol
- -mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi @gol
- -mexpand-adddi -mindexed-loads -mlra -mlra-priority-none @gol
- -mlra-priority-compact mlra-priority-noncompact -mno-millicode @gol
- -mmixed-code -mq-class -mRcq -mRcw -msize-level=@var{level} @gol
- -mtune=@var{cpu} -mmultcost=@var{num} -munalign-prob-threshold=@var{probability}}
- @emph{ARM Options}
- @gccoptlist{-mapcs-frame -mno-apcs-frame @gol
- -mabi=@var{name} @gol
- -mapcs-stack-check -mno-apcs-stack-check @gol
- -mapcs-float -mno-apcs-float @gol
- -mapcs-reentrant -mno-apcs-reentrant @gol
- -msched-prolog -mno-sched-prolog @gol
- -mlittle-endian -mbig-endian @gol
- -mfloat-abi=@var{name} @gol
- -mfp16-format=@var{name}
- -mthumb-interwork -mno-thumb-interwork @gol
- -mcpu=@var{name} -march=@var{name} -mfpu=@var{name} @gol
- -mtune=@var{name} -mprint-tune-info @gol
- -mstructure-size-boundary=@var{n} @gol
- -mabort-on-noreturn @gol
- -mlong-calls -mno-long-calls @gol
- -msingle-pic-base -mno-single-pic-base @gol
- -mpic-register=@var{reg} @gol
- -mnop-fun-dllimport @gol
- -mpoke-function-name @gol
- -mthumb -marm @gol
- -mtpcs-frame -mtpcs-leaf-frame @gol
- -mcaller-super-interworking -mcallee-super-interworking @gol
- -mtp=@var{name} -mtls-dialect=@var{dialect} @gol
- -mword-relocations @gol
- -mfix-cortex-m3-ldrd @gol
- -munaligned-access @gol
- -mneon-for-64bits @gol
- -mslow-flash-data @gol
- -masm-syntax-unified @gol
- -mrestrict-it}
- @emph{AVR Options}
- @gccoptlist{-mmcu=@var{mcu} -maccumulate-args -mbranch-cost=@var{cost} @gol
- -mcall-prologues -mint8 -mn_flash=@var{size} -mno-interrupts @gol
- -mrelax -mrmw -mstrict-X -mtiny-stack -nodevicelib -Waddr-space-convert}
- @emph{Blackfin Options}
- @gccoptlist{-mcpu=@var{cpu}@r{[}-@var{sirevision}@r{]} @gol
- -msim -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer @gol
- -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly @gol
- -mlow-64k -mno-low64k -mstack-check-l1 -mid-shared-library @gol
- -mno-id-shared-library -mshared-library-id=@var{n} @gol
- -mleaf-id-shared-library -mno-leaf-id-shared-library @gol
- -msep-data -mno-sep-data -mlong-calls -mno-long-calls @gol
- -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram @gol
- -micplb}
- @emph{C6X Options}
- @gccoptlist{-mbig-endian -mlittle-endian -march=@var{cpu} @gol
- -msim -msdata=@var{sdata-type}}
- @emph{CRIS Options}
- @gccoptlist{-mcpu=@var{cpu} -march=@var{cpu} -mtune=@var{cpu} @gol
- -mmax-stack-frame=@var{n} -melinux-stacksize=@var{n} @gol
- -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects @gol
- -mstack-align -mdata-align -mconst-align @gol
- -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mno-gotplt @gol
- -melf -maout -melinux -mlinux -sim -sim2 @gol
- -mmul-bug-workaround -mno-mul-bug-workaround}
- @emph{CR16 Options}
- @gccoptlist{-mmac @gol
- -mcr16cplus -mcr16c @gol
- -msim -mint32 -mbit-ops
- -mdata-model=@var{model}}
- @emph{Darwin Options}
- @gccoptlist{-all_load -allowable_client -arch -arch_errors_fatal @gol
- -arch_only -bind_at_load -bundle -bundle_loader @gol
- -client_name -compatibility_version -current_version @gol
- -dead_strip @gol
- -dependency-file -dylib_file -dylinker_install_name @gol
- -dynamic -dynamiclib -exported_symbols_list @gol
- -filelist -flat_namespace -force_cpusubtype_ALL @gol
- -force_flat_namespace -headerpad_max_install_names @gol
- -iframework @gol
- -image_base -init -install_name -keep_private_externs @gol
- -multi_module -multiply_defined -multiply_defined_unused @gol
- -noall_load -no_dead_strip_inits_and_terms @gol
- -nofixprebinding -nomultidefs -noprebind -noseglinkedit @gol
- -pagezero_size -prebind -prebind_all_twolevel_modules @gol
- -private_bundle -read_only_relocs -sectalign @gol
- -sectobjectsymbols -whyload -seg1addr @gol
- -sectcreate -sectobjectsymbols -sectorder @gol
- -segaddr -segs_read_only_addr -segs_read_write_addr @gol
- -seg_addr_table -seg_addr_table_filename -seglinkedit @gol
- -segprot -segs_read_only_addr -segs_read_write_addr @gol
- -single_module -static -sub_library -sub_umbrella @gol
- -twolevel_namespace -umbrella -undefined @gol
- -unexported_symbols_list -weak_reference_mismatches @gol
- -whatsloaded -F -gused -gfull -mmacosx-version-min=@var{version} @gol
- -mkernel -mone-byte-bool}
- @emph{DEC Alpha Options}
- @gccoptlist{-mno-fp-regs -msoft-float @gol
- -mieee -mieee-with-inexact -mieee-conformant @gol
- -mfp-trap-mode=@var{mode} -mfp-rounding-mode=@var{mode} @gol
- -mtrap-precision=@var{mode} -mbuild-constants @gol
- -mcpu=@var{cpu-type} -mtune=@var{cpu-type} @gol
- -mbwx -mmax -mfix -mcix @gol
- -mfloat-vax -mfloat-ieee @gol
- -mexplicit-relocs -msmall-data -mlarge-data @gol
- -msmall-text -mlarge-text @gol
- -mmemory-latency=@var{time}}
- @emph{FR30 Options}
- @gccoptlist{-msmall-model -mno-lsim}
- @emph{FRV Options}
- @gccoptlist{-mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 @gol
- -mhard-float -msoft-float @gol
- -malloc-cc -mfixed-cc -mdword -mno-dword @gol
- -mdouble -mno-double @gol
- -mmedia -mno-media -mmuladd -mno-muladd @gol
- -mfdpic -minline-plt -mgprel-ro -multilib-library-pic @gol
- -mlinked-fp -mlong-calls -malign-labels @gol
- -mlibrary-pic -macc-4 -macc-8 @gol
- -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move @gol
- -moptimize-membar -mno-optimize-membar @gol
- -mscc -mno-scc -mcond-exec -mno-cond-exec @gol
- -mvliw-branch -mno-vliw-branch @gol
- -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec @gol
- -mno-nested-cond-exec -mtomcat-stats @gol
- -mTLS -mtls @gol
- -mcpu=@var{cpu}}
- @emph{GNU/Linux Options}
- @gccoptlist{-mglibc -muclibc -mbionic -mandroid @gol
- -tno-android-cc -tno-android-ld}
- @emph{H8/300 Options}
- @gccoptlist{-mrelax -mh -ms -mn -mexr -mno-exr -mint32 -malign-300}
- @emph{HPPA Options}
- @gccoptlist{-march=@var{architecture-type} @gol
- -mdisable-fpregs -mdisable-indexing @gol
- -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld @gol
- -mfixed-range=@var{register-range} @gol
- -mjump-in-delay -mlinker-opt -mlong-calls @gol
- -mlong-load-store -mno-disable-fpregs @gol
- -mno-disable-indexing -mno-fast-indirect-calls -mno-gas @gol
- -mno-jump-in-delay -mno-long-load-store @gol
- -mno-portable-runtime -mno-soft-float @gol
- -mno-space-regs -msoft-float -mpa-risc-1-0 @gol
- -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime @gol
- -mschedule=@var{cpu-type} -mspace-regs -msio -mwsio @gol
- -munix=@var{unix-std} -nolibdld -static -threads}
- @emph{IA-64 Options}
- @gccoptlist{-mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic @gol
- -mvolatile-asm-stop -mregister-names -msdata -mno-sdata @gol
- -mconstant-gp -mauto-pic -mfused-madd @gol
- -minline-float-divide-min-latency @gol
- -minline-float-divide-max-throughput @gol
- -mno-inline-float-divide @gol
- -minline-int-divide-min-latency @gol
- -minline-int-divide-max-throughput @gol
- -mno-inline-int-divide @gol
- -minline-sqrt-min-latency -minline-sqrt-max-throughput @gol
- -mno-inline-sqrt @gol
- -mdwarf2-asm -mearly-stop-bits @gol
- -mfixed-range=@var{register-range} -mtls-size=@var{tls-size} @gol
- -mtune=@var{cpu-type} -milp32 -mlp64 @gol
- -msched-br-data-spec -msched-ar-data-spec -msched-control-spec @gol
- -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec @gol
- -msched-spec-ldc -msched-spec-control-ldc @gol
- -msched-prefer-non-data-spec-insns -msched-prefer-non-control-spec-insns @gol
- -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path @gol
- -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost @gol
- -msched-max-memory-insns-hard-limit -msched-max-memory-insns=@var{max-insns}}
- @emph{LM32 Options}
- @gccoptlist{-mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled @gol
- -msign-extend-enabled -muser-enabled}
- @emph{M32R/D Options}
- @gccoptlist{-m32r2 -m32rx -m32r @gol
- -mdebug @gol
- -malign-loops -mno-align-loops @gol
- -missue-rate=@var{number} @gol
- -mbranch-cost=@var{number} @gol
- -mmodel=@var{code-size-model-type} @gol
- -msdata=@var{sdata-type} @gol
- -mno-flush-func -mflush-func=@var{name} @gol
- -mno-flush-trap -mflush-trap=@var{number} @gol
- -G @var{num}}
- @emph{M32C Options}
- @gccoptlist{-mcpu=@var{cpu} -msim -memregs=@var{number}}
- @emph{M680x0 Options}
- @gccoptlist{-march=@var{arch} -mcpu=@var{cpu} -mtune=@var{tune} @gol
- -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 @gol
- -m68060 -mcpu32 -m5200 -m5206e -m528x -m5307 -m5407 @gol
- -mcfv4e -mbitfield -mno-bitfield -mc68000 -mc68020 @gol
- -mnobitfield -mrtd -mno-rtd -mdiv -mno-div -mshort @gol
- -mno-short -mhard-float -m68881 -msoft-float -mpcrel @gol
- -malign-int -mstrict-align -msep-data -mno-sep-data @gol
- -mshared-library-id=n -mid-shared-library -mno-id-shared-library @gol
- -mxgot -mno-xgot}
- @emph{MCore Options}
- @gccoptlist{-mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates @gol
- -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields @gol
- -m4byte-functions -mno-4byte-functions -mcallgraph-data @gol
- -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim @gol
- -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment}
- @emph{MeP Options}
- @gccoptlist{-mabsdiff -mall-opts -maverage -mbased=@var{n} -mbitops @gol
- -mc=@var{n} -mclip -mconfig=@var{name} -mcop -mcop32 -mcop64 -mivc2 @gol
- -mdc -mdiv -meb -mel -mio-volatile -ml -mleadz -mm -mminmax @gol
- -mmult -mno-opts -mrepeat -ms -msatur -msdram -msim -msimnovec -mtf @gol
- -mtiny=@var{n}}
- @emph{MicroBlaze Options}
- @gccoptlist{-msoft-float -mhard-float -msmall-divides -mcpu=@var{cpu} @gol
- -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift @gol
- -mxl-pattern-compare -mxl-stack-check -mxl-gp-opt -mno-clearbss @gol
- -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt @gol
- -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-@var{app-model}}
- @emph{MIPS Options}
- @gccoptlist{-EL -EB -march=@var{arch} -mtune=@var{arch} @gol
- -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 @gol
- -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 @gol
- -mips16 -mno-mips16 -mflip-mips16 @gol
- -minterlink-compressed -mno-interlink-compressed @gol
- -minterlink-mips16 -mno-interlink-mips16 @gol
- -mabi=@var{abi} -mabicalls -mno-abicalls @gol
- -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot @gol
- -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float @gol
- -mno-float -msingle-float -mdouble-float @gol
- -modd-spreg -mno-odd-spreg @gol
- -mabs=@var{mode} -mnan=@var{encoding} @gol
- -mdsp -mno-dsp -mdspr2 -mno-dspr2 @gol
- -mmcu -mmno-mcu @gol
- -meva -mno-eva @gol
- -mvirt -mno-virt @gol
- -mxpa -mno-xpa @gol
- -mmicromips -mno-micromips @gol
- -mfpu=@var{fpu-type} @gol
- -msmartmips -mno-smartmips @gol
- -mpaired-single -mno-paired-single -mdmx -mno-mdmx @gol
- -mips3d -mno-mips3d -mmt -mno-mt -mllsc -mno-llsc @gol
- -mlong64 -mlong32 -msym32 -mno-sym32 @gol
- -G@var{num} -mlocal-sdata -mno-local-sdata @gol
- -mextern-sdata -mno-extern-sdata -mgpopt -mno-gopt @gol
- -membedded-data -mno-embedded-data @gol
- -muninit-const-in-rodata -mno-uninit-const-in-rodata @gol
- -mcode-readable=@var{setting} @gol
- -msplit-addresses -mno-split-addresses @gol
- -mexplicit-relocs -mno-explicit-relocs @gol
- -mcheck-zero-division -mno-check-zero-division @gol
- -mdivide-traps -mdivide-breaks @gol
- -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls @gol
- -mmad -mno-mad -mimadd -mno-imadd -mfused-madd -mno-fused-madd -nocpp @gol
- -mfix-24k -mno-fix-24k @gol
- -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 @gol
- -mfix-r10000 -mno-fix-r10000 -mfix-rm7000 -mno-fix-rm7000 @gol
- -mfix-vr4120 -mno-fix-vr4120 @gol
- -mfix-vr4130 -mno-fix-vr4130 -mfix-sb1 -mno-fix-sb1 @gol
- -mflush-func=@var{func} -mno-flush-func @gol
- -mbranch-cost=@var{num} -mbranch-likely -mno-branch-likely @gol
- -mfp-exceptions -mno-fp-exceptions @gol
- -mvr4130-align -mno-vr4130-align -msynci -mno-synci @gol
- -mrelax-pic-calls -mno-relax-pic-calls -mmcount-ra-address}
- @emph{MMIX Options}
- @gccoptlist{-mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu @gol
- -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols @gol
- -melf -mbranch-predict -mno-branch-predict -mbase-addresses @gol
- -mno-base-addresses -msingle-exit -mno-single-exit}
- @emph{MN10300 Options}
- @gccoptlist{-mmult-bug -mno-mult-bug @gol
- -mno-am33 -mam33 -mam33-2 -mam34 @gol
- -mtune=@var{cpu-type} @gol
- -mreturn-pointer-on-d0 @gol
- -mno-crt0 -mrelax -mliw -msetlb}
- @emph{Moxie Options}
- @gccoptlist{-meb -mel -mmul.x -mno-crt0}
- @emph{MSP430 Options}
- @gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax @gol
- -mhwmult= -minrt}
- @emph{NDS32 Options}
- @gccoptlist{-mbig-endian -mlittle-endian @gol
- -mreduced-regs -mfull-regs @gol
- -mcmov -mno-cmov @gol
- -mperf-ext -mno-perf-ext @gol
- -mv3push -mno-v3push @gol
- -m16bit -mno-16bit @gol
- -misr-vector-size=@var{num} @gol
- -mcache-block-size=@var{num} @gol
- -march=@var{arch} @gol
- -mcmodel=@var{code-model} @gol
- -mctor-dtor -mrelax}
- @emph{Nios II Options}
- @gccoptlist{-G @var{num} -mgpopt=@var{option} -mgpopt -mno-gpopt @gol
- -mel -meb @gol
- -mno-bypass-cache -mbypass-cache @gol
- -mno-cache-volatile -mcache-volatile @gol
- -mno-fast-sw-div -mfast-sw-div @gol
- -mhw-mul -mno-hw-mul -mhw-mulx -mno-hw-mulx -mno-hw-div -mhw-div @gol
- -mcustom-@var{insn}=@var{N} -mno-custom-@var{insn} @gol
- -mcustom-fpu-cfg=@var{name} @gol
- -mhal -msmallc -msys-crt0=@var{name} -msys-lib=@var{name}}
- @emph{Nvidia PTX Options}
- @gccoptlist{-m32 -m64 -mmainkernel}
- @emph{PDP-11 Options}
- @gccoptlist{-mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 @gol
- -mbcopy -mbcopy-builtin -mint32 -mno-int16 @gol
- -mint16 -mno-int32 -mfloat32 -mno-float64 @gol
- -mfloat64 -mno-float32 -mabshi -mno-abshi @gol
- -mbranch-expensive -mbranch-cheap @gol
- -munix-asm -mdec-asm}
- @emph{picoChip Options}
- @gccoptlist{-mae=@var{ae_type} -mvliw-lookahead=@var{N} @gol
- -msymbol-as-address -mno-inefficient-warnings}
- @emph{PowerPC Options}
- See RS/6000 and PowerPC Options.
- @emph{RL78 Options}
- @gccoptlist{-msim -mmul=none -mmul=g13 -mmul=rl78 @gol
- -m64bit-doubles -m32bit-doubles}
- @emph{RS/6000 and PowerPC Options}
- @gccoptlist{-mcpu=@var{cpu-type} @gol
- -mtune=@var{cpu-type} @gol
- -mcmodel=@var{code-model} @gol
- -mpowerpc64 @gol
- -maltivec -mno-altivec @gol
- -mpowerpc-gpopt -mno-powerpc-gpopt @gol
- -mpowerpc-gfxopt -mno-powerpc-gfxopt @gol
- -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mpopcntd -mno-popcntd @gol
- -mfprnd -mno-fprnd @gol
- -mcmpb -mno-cmpb -mmfpgpr -mno-mfpgpr -mhard-dfp -mno-hard-dfp @gol
- -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc @gol
- -m64 -m32 -mxl-compat -mno-xl-compat -mpe @gol
- -malign-power -malign-natural @gol
- -msoft-float -mhard-float -mmultiple -mno-multiple @gol
- -msingle-float -mdouble-float -msimple-fpu @gol
- -mstring -mno-string -mupdate -mno-update @gol
- -mavoid-indexed-addresses -mno-avoid-indexed-addresses @gol
- -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align @gol
- -mstrict-align -mno-strict-align -mrelocatable @gol
- -mno-relocatable -mrelocatable-lib -mno-relocatable-lib @gol
- -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian @gol
- -mdynamic-no-pic -maltivec -mswdiv -msingle-pic-base @gol
- -mprioritize-restricted-insns=@var{priority} @gol
- -msched-costly-dep=@var{dependence_type} @gol
- -minsert-sched-nops=@var{scheme} @gol
- -mcall-sysv -mcall-netbsd @gol
- -maix-struct-return -msvr4-struct-return @gol
- -mabi=@var{abi-type} -msecure-plt -mbss-plt @gol
- -mblock-move-inline-limit=@var{num} @gol
- -misel -mno-isel @gol
- -misel=yes -misel=no @gol
- -mspe -mno-spe @gol
- -mspe=yes -mspe=no @gol
- -mpaired @gol
- -mgen-cell-microcode -mwarn-cell-microcode @gol
- -mvrsave -mno-vrsave @gol
- -mmulhw -mno-mulhw @gol
- -mdlmzb -mno-dlmzb @gol
- -mfloat-gprs=yes -mfloat-gprs=no -mfloat-gprs=single -mfloat-gprs=double @gol
- -mprototype -mno-prototype @gol
- -msim -mmvme -mads -myellowknife -memb -msdata @gol
- -msdata=@var{opt} -mvxworks -G @var{num} -pthread @gol
- -mrecip -mrecip=@var{opt} -mno-recip -mrecip-precision @gol
- -mno-recip-precision @gol
- -mveclibabi=@var{type} -mfriz -mno-friz @gol
- -mpointers-to-nested-functions -mno-pointers-to-nested-functions @gol
- -msave-toc-indirect -mno-save-toc-indirect @gol
- -mpower8-fusion -mno-mpower8-fusion -mpower8-vector -mno-power8-vector @gol
- -mcrypto -mno-crypto -mdirect-move -mno-direct-move @gol
- -mquad-memory -mno-quad-memory @gol
- -mquad-memory-atomic -mno-quad-memory-atomic @gol
- -mcompat-align-parm -mno-compat-align-parm @gol
- -mupper-regs-df -mno-upper-regs-df -mupper-regs-sf -mno-upper-regs-sf @gol
- -mupper-regs -mno-upper-regs}
- @emph{RX Options}
- @gccoptlist{-m64bit-doubles -m32bit-doubles -fpu -nofpu@gol
- -mcpu=@gol
- -mbig-endian-data -mlittle-endian-data @gol
- -msmall-data @gol
- -msim -mno-sim@gol
- -mas100-syntax -mno-as100-syntax@gol
- -mrelax@gol
- -mmax-constant-size=@gol
- -mint-register=@gol
- -mpid@gol
- -mno-warn-multiple-fast-interrupts@gol
- -msave-acc-in-interrupts}
- @emph{S/390 and zSeries Options}
- @gccoptlist{-mtune=@var{cpu-type} -march=@var{cpu-type} @gol
- -mhard-float -msoft-float -mhard-dfp -mno-hard-dfp @gol
- -mlong-double-64 -mlong-double-128 @gol
- -mbackchain -mno-backchain -mpacked-stack -mno-packed-stack @gol
- -msmall-exec -mno-small-exec -mmvcle -mno-mvcle @gol
- -m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol
- -mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol
- -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard @gol
- -mhotpatch=@var{halfwords},@var{halfwords}}
- @emph{Score Options}
- @gccoptlist{-meb -mel @gol
- -mnhwloop @gol
- -muls @gol
- -mmac @gol
- -mscore5 -mscore5u -mscore7 -mscore7d}
- @emph{SH Options}
- @gccoptlist{-m1 -m2 -m2e @gol
- -m2a-nofpu -m2a-single-only -m2a-single -m2a @gol
- -m3 -m3e @gol
- -m4-nofpu -m4-single-only -m4-single -m4 @gol
- -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al @gol
- -m5-64media -m5-64media-nofpu @gol
- -m5-32media -m5-32media-nofpu @gol
- -m5-compact -m5-compact-nofpu @gol
- -mb -ml -mdalign -mrelax @gol
- -mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave @gol
- -mieee -mno-ieee -mbitops -misize -minline-ic_invalidate -mpadstruct @gol
- -mspace -mprefergot -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
- -mdivsi3_libfunc=@var{name} -mfixed-range=@var{register-range} @gol
- -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
- -maccumulate-outgoing-args -minvalid-symbols @gol
- -matomic-model=@var{atomic-model} @gol
- -mbranch-cost=@var{num} -mzdcbranch -mno-zdcbranch @gol
- -mcbranch-force-delay-slot @gol
- -mfused-madd -mno-fused-madd -mfsca -mno-fsca -mfsrra -mno-fsrra @gol
- -mpretend-cmove -mtas}
- @emph{Solaris 2 Options}
- @gccoptlist{-mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text @gol
- -pthreads -pthread}
- @emph{SPARC Options}
- @gccoptlist{-mcpu=@var{cpu-type} @gol
- -mtune=@var{cpu-type} @gol
- -mcmodel=@var{code-model} @gol
- -mmemory-model=@var{mem-model} @gol
- -m32 -m64 -mapp-regs -mno-app-regs @gol
- -mfaster-structs -mno-faster-structs -mflat -mno-flat @gol
- -mfpu -mno-fpu -mhard-float -msoft-float @gol
- -mhard-quad-float -msoft-quad-float @gol
- -mstack-bias -mno-stack-bias @gol
- -munaligned-doubles -mno-unaligned-doubles @gol
- -muser-mode -mno-user-mode @gol
- -mv8plus -mno-v8plus -mvis -mno-vis @gol
- -mvis2 -mno-vis2 -mvis3 -mno-vis3 @gol
- -mcbcond -mno-cbcond @gol
- -mfmaf -mno-fmaf -mpopc -mno-popc @gol
- -mfix-at697f -mfix-ut699}
- @emph{SPU Options}
- @gccoptlist{-mwarn-reloc -merror-reloc @gol
- -msafe-dma -munsafe-dma @gol
- -mbranch-hints @gol
- -msmall-mem -mlarge-mem -mstdmain @gol
- -mfixed-range=@var{register-range} @gol
- -mea32 -mea64 @gol
- -maddress-space-conversion -mno-address-space-conversion @gol
- -mcache-size=@var{cache-size} @gol
- -matomic-updates -mno-atomic-updates}
- @emph{System V Options}
- @gccoptlist{-Qy -Qn -YP,@var{paths} -Ym,@var{dir}}
- @emph{TILE-Gx Options}
- @gccoptlist{-mcpu=CPU -m32 -m64 -mbig-endian -mlittle-endian @gol
- -mcmodel=@var{code-model}}
- @emph{TILEPro Options}
- @gccoptlist{-mcpu=@var{cpu} -m32}
- @emph{V850 Options}
- @gccoptlist{-mlong-calls -mno-long-calls -mep -mno-ep @gol
- -mprolog-function -mno-prolog-function -mspace @gol
- -mtda=@var{n} -msda=@var{n} -mzda=@var{n} @gol
- -mapp-regs -mno-app-regs @gol
- -mdisable-callt -mno-disable-callt @gol
- -mv850e2v3 -mv850e2 -mv850e1 -mv850es @gol
- -mv850e -mv850 -mv850e3v5 @gol
- -mloop @gol
- -mrelax @gol
- -mlong-jumps @gol
- -msoft-float @gol
- -mhard-float @gol
- -mgcc-abi @gol
- -mrh850-abi @gol
- -mbig-switch}
- @emph{VAX Options}
- @gccoptlist{-mg -mgnu -munix}
- @emph{Visium Options}
- @gccoptlist{-mdebug -msim -mfpu -mno-fpu -mhard-float -msoft-float @gol
- -mcpu=@var{cpu-type} -mtune=@var{cpu-type} -msv-mode -muser-mode}
- @emph{VMS Options}
- @gccoptlist{-mvms-return-codes -mdebug-main=@var{prefix} -mmalloc64 @gol
- -mpointer-size=@var{size}}
- @emph{VxWorks Options}
- @gccoptlist{-mrtp -non-static -Bstatic -Bdynamic @gol
- -Xbind-lazy -Xbind-now}
- @emph{x86 Options}
- @gccoptlist{-mtune=@var{cpu-type} -march=@var{cpu-type} @gol
- -mtune-ctrl=@var{feature-list} -mdump-tune-features -mno-default @gol
- -mfpmath=@var{unit} @gol
- -masm=@var{dialect} -mno-fancy-math-387 @gol
- -mno-fp-ret-in-387 -msoft-float @gol
- -mno-wide-multiply -mrtd -malign-double @gol
- -mpreferred-stack-boundary=@var{num} @gol
- -mincoming-stack-boundary=@var{num} @gol
- -mcld -mcx16 -msahf -mmovbe -mcrc32 @gol
- -mrecip -mrecip=@var{opt} @gol
- -mvzeroupper -mprefer-avx128 @gol
- -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx @gol
- -mavx2 -mavx512f -mavx512pf -mavx512er -mavx512cd -msha @gol
- -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mprefetchwt1 @gol
- -mclflushopt -mxsavec -mxsaves @gol
- -msse4a -m3dnow -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -mlzcnt @gol
- -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mmpx -mmwaitx -mthreads @gol
- -mno-align-stringops -minline-all-stringops @gol
- -minline-stringops-dynamically -mstringop-strategy=@var{alg} @gol
- -mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy} @gol
- -mpush-args -maccumulate-outgoing-args -m128bit-long-double @gol
- -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 @gol
- -mregparm=@var{num} -msseregparm @gol
- -mveclibabi=@var{type} -mvect8-ret-in-mem @gol
- -mpc32 -mpc64 -mpc80 -mstackrealign @gol
- -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs @gol
- -mcmodel=@var{code-model} -mabi=@var{name} -maddress-mode=@var{mode} @gol
- -m32 -m64 -mx32 -m16 -mlarge-data-threshold=@var{num} @gol
- -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol
- -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
- -malign-data=@var{type} -mstack-protector-guard=@var{guard}}
- @emph{x86 Windows Options}
- @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
- -mnop-fun-dllimport -mthread @gol
- -municode -mwin32 -mwindows -fno-set-stack-executable}
- @emph{Xstormy16 Options}
- @gccoptlist{-msim}
- @emph{Xtensa Options}
- @gccoptlist{-mconst16 -mno-const16 @gol
- -mfused-madd -mno-fused-madd @gol
- -mforce-no-pic @gol
- -mserialize-volatile -mno-serialize-volatile @gol
- -mtext-section-literals -mno-text-section-literals @gol
- -mtarget-align -mno-target-align @gol
- -mlongcalls -mno-longcalls}
- @emph{zSeries Options}
- See S/390 and zSeries Options.
- @item Code Generation Options
- @xref{Code Gen Options,,Options for Code Generation Conventions}.
- @gccoptlist{-fcall-saved-@var{reg} -fcall-used-@var{reg} @gol
- -ffixed-@var{reg} -fexceptions @gol
- -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol
- -fasynchronous-unwind-tables @gol
- -fno-gnu-unique @gol
- -finhibit-size-directive -finstrument-functions @gol
- -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol
- -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} @gol
- -fno-common -fno-ident @gol
- -fpcc-struct-return -fpic -fPIC -fpie -fPIE @gol
- -fno-jump-tables @gol
- -frecord-gcc-switches @gol
- -freg-struct-return -fshort-enums @gol
- -fshort-double -fshort-wchar @gol
- -fverbose-asm -fpack-struct[=@var{n}] -fstack-check @gol
- -fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol
- -fno-stack-limit -fsplit-stack @gol
- -fleading-underscore -ftls-model=@var{model} @gol
- -fstack-reuse=@var{reuse_level} @gol
- -ftrapv -fwrapv -fbounds-check @gol
- -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]} @gol
- -fstrict-volatile-bitfields -fsync-libcalls}
- @end table
- @node Overall Options
- @section Options Controlling the Kind of Output
- Compilation can involve up to four stages: preprocessing, compilation
- proper, assembly and linking, always in that order. GCC is capable of
- preprocessing and compiling several files either into several
- assembler input files, or into one assembler input file; then each
- assembler input file produces an object file, and linking combines all
- the object files (those newly compiled, and those specified as input)
- into an executable file.
- @cindex file name suffix
- For any given input file, the file name suffix determines what kind of
- compilation is done:
- @table @gcctabopt
- @item @var{file}.c
- C source code that must be preprocessed.
- @item @var{file}.i
- C source code that should not be preprocessed.
- @item @var{file}.ii
- C++ source code that should not be preprocessed.
- @item @var{file}.m
- Objective-C source code. Note that you must link with the @file{libobjc}
- library to make an Objective-C program work.
- @item @var{file}.mi
- Objective-C source code that should not be preprocessed.
- @item @var{file}.mm
- @itemx @var{file}.M
- Objective-C++ source code. Note that you must link with the @file{libobjc}
- library to make an Objective-C++ program work. Note that @samp{.M} refers
- to a literal capital M@.
- @item @var{file}.mii
- Objective-C++ source code that should not be preprocessed.
- @item @var{file}.h
- C, C++, Objective-C or Objective-C++ header file to be turned into a
- precompiled header (default), or C, C++ header file to be turned into an
- Ada spec (via the @option{-fdump-ada-spec} switch).
- @item @var{file}.cc
- @itemx @var{file}.cp
- @itemx @var{file}.cxx
- @itemx @var{file}.cpp
- @itemx @var{file}.CPP
- @itemx @var{file}.c++
- @itemx @var{file}.C
- C++ source code that must be preprocessed. Note that in @samp{.cxx},
- the last two letters must both be literally @samp{x}. Likewise,
- @samp{.C} refers to a literal capital C@.
- @item @var{file}.mm
- @itemx @var{file}.M
- Objective-C++ source code that must be preprocessed.
- @item @var{file}.mii
- Objective-C++ source code that should not be preprocessed.
- @item @var{file}.hh
- @itemx @var{file}.H
- @itemx @var{file}.hp
- @itemx @var{file}.hxx
- @itemx @var{file}.hpp
- @itemx @var{file}.HPP
- @itemx @var{file}.h++
- @itemx @var{file}.tcc
- C++ header file to be turned into a precompiled header or Ada spec.
- @item @var{file}.f
- @itemx @var{file}.for
- @itemx @var{file}.ftn
- Fixed form Fortran source code that should not be preprocessed.
- @item @var{file}.F
- @itemx @var{file}.FOR
- @itemx @var{file}.fpp
- @itemx @var{file}.FPP
- @itemx @var{file}.FTN
- Fixed form Fortran source code that must be preprocessed (with the traditional
- preprocessor).
- @item @var{file}.f90
- @itemx @var{file}.f95
- @itemx @var{file}.f03
- @itemx @var{file}.f08
- Free form Fortran source code that should not be preprocessed.
- @item @var{file}.F90
- @itemx @var{file}.F95
- @itemx @var{file}.F03
- @itemx @var{file}.F08
- Free form Fortran source code that must be preprocessed (with the
- traditional preprocessor).
- @item @var{file}.go
- Go source code.
- @c FIXME: Descriptions of Java file types.
- @c @var{file}.java
- @c @var{file}.class
- @c @var{file}.zip
- @c @var{file}.jar
- @item @var{file}.ads
- Ada source code file that contains a library unit declaration (a
- declaration of a package, subprogram, or generic, or a generic
- instantiation), or a library unit renaming declaration (a package,
- generic, or subprogram renaming declaration). Such files are also
- called @dfn{specs}.
- @item @var{file}.adb
- Ada source code file containing a library unit body (a subprogram or
- package body). Such files are also called @dfn{bodies}.
- @c GCC also knows about some suffixes for languages not yet included:
- @c Pascal:
- @c @var{file}.p
- @c @var{file}.pas
- @c Ratfor:
- @c @var{file}.r
- @item @var{file}.s
- Assembler code.
- @item @var{file}.S
- @itemx @var{file}.sx
- Assembler code that must be preprocessed.
- @item @var{other}
- An object file to be fed straight into linking.
- Any file name with no recognized suffix is treated this way.
- @end table
- @opindex x
- You can specify the input language explicitly with the @option{-x} option:
- @table @gcctabopt
- @item -x @var{language}
- Specify explicitly the @var{language} for the following input files
- (rather than letting the compiler choose a default based on the file
- name suffix). This option applies to all following input files until
- the next @option{-x} option. Possible values for @var{language} are:
- @smallexample
- c c-header cpp-output
- c++ c++-header c++-cpp-output
- objective-c objective-c-header objective-c-cpp-output
- objective-c++ objective-c++-header objective-c++-cpp-output
- assembler assembler-with-cpp
- ada
- f77 f77-cpp-input f95 f95-cpp-input
- go
- java
- @end smallexample
- @item -x none
- Turn off any specification of a language, so that subsequent files are
- handled according to their file name suffixes (as they are if @option{-x}
- has not been used at all).
- @item -pass-exit-codes
- @opindex pass-exit-codes
- Normally the @command{gcc} program exits with the code of 1 if any
- phase of the compiler returns a non-success return code. If you specify
- @option{-pass-exit-codes}, the @command{gcc} program instead returns with
- the numerically highest error produced by any phase returning an error
- indication. The C, C++, and Fortran front ends return 4 if an internal
- compiler error is encountered.
- @end table
- If you only want some of the stages of compilation, you can use
- @option{-x} (or filename suffixes) to tell @command{gcc} where to start, and
- one of the options @option{-c}, @option{-S}, or @option{-E} to say where
- @command{gcc} is to stop. Note that some combinations (for example,
- @samp{-x cpp-output -E}) instruct @command{gcc} to do nothing at all.
- @table @gcctabopt
- @item -c
- @opindex c
- Compile or assemble the source files, but do not link. The linking
- stage simply is not done. The ultimate output is in the form of an
- object file for each source file.
- By default, the object file name for a source file is made by replacing
- the suffix @samp{.c}, @samp{.i}, @samp{.s}, etc., with @samp{.o}.
- Unrecognized input files, not requiring compilation or assembly, are
- ignored.
- @item -S
- @opindex S
- Stop after the stage of compilation proper; do not assemble. The output
- is in the form of an assembler code file for each non-assembler input
- file specified.
- By default, the assembler file name for a source file is made by
- replacing the suffix @samp{.c}, @samp{.i}, etc., with @samp{.s}.
- Input files that don't require compilation are ignored.
- @item -E
- @opindex E
- Stop after the preprocessing stage; do not run the compiler proper. The
- output is in the form of preprocessed source code, which is sent to the
- standard output.
- Input files that don't require preprocessing are ignored.
- @cindex output file option
- @item -o @var{file}
- @opindex o
- Place output in file @var{file}. This applies to whatever
- sort of output is being produced, whether it be an executable file,
- an object file, an assembler file or preprocessed C code.
- If @option{-o} is not specified, the default is to put an executable
- file in @file{a.out}, the object file for
- @file{@var{source}.@var{suffix}} in @file{@var{source}.o}, its
- assembler file in @file{@var{source}.s}, a precompiled header file in
- @file{@var{source}.@var{suffix}.gch}, and all preprocessed C source on
- standard output.
- @item -v
- @opindex v
- Print (on standard error output) the commands executed to run the stages
- of compilation. Also print the version number of the compiler driver
- program and of the preprocessor and the compiler proper.
- @item -###
- @opindex ###
- Like @option{-v} except the commands are not executed and arguments
- are quoted unless they contain only alphanumeric characters or @code{./-_}.
- This is useful for shell scripts to capture the driver-generated command lines.
- @item -pipe
- @opindex pipe
- Use pipes rather than temporary files for communication between the
- various stages of compilation. This fails to work on some systems where
- the assembler is unable to read from a pipe; but the GNU assembler has
- no trouble.
- @item --help
- @opindex help
- Print (on the standard output) a description of the command-line options
- understood by @command{gcc}. If the @option{-v} option is also specified
- then @option{--help} is also passed on to the various processes
- invoked by @command{gcc}, so that they can display the command-line options
- they accept. If the @option{-Wextra} option has also been specified
- (prior to the @option{--help} option), then command-line options that
- have no documentation associated with them are also displayed.
- @item --target-help
- @opindex target-help
- Print (on the standard output) a description of target-specific command-line
- options for each tool. For some targets extra target-specific
- information may also be printed.
- @item --help=@{@var{class}@r{|[}^@r{]}@var{qualifier}@}@r{[},@dots{}@r{]}
- Print (on the standard output) a description of the command-line
- options understood by the compiler that fit into all specified classes
- and qualifiers. These are the supported classes:
- @table @asis
- @item @samp{optimizers}
- Display all of the optimization options supported by the
- compiler.
- @item @samp{warnings}
- Display all of the options controlling warning messages
- produced by the compiler.
- @item @samp{target}
- Display target-specific options. Unlike the
- @option{--target-help} option however, target-specific options of the
- linker and assembler are not displayed. This is because those
- tools do not currently support the extended @option{--help=} syntax.
- @item @samp{params}
- Display the values recognized by the @option{--param}
- option.
- @item @var{language}
- Display the options supported for @var{language}, where
- @var{language} is the name of one of the languages supported in this
- version of GCC@.
- @item @samp{common}
- Display the options that are common to all languages.
- @end table
- These are the supported qualifiers:
- @table @asis
- @item @samp{undocumented}
- Display only those options that are undocumented.
- @item @samp{joined}
- Display options taking an argument that appears after an equal
- sign in the same continuous piece of text, such as:
- @samp{--help=target}.
- @item @samp{separate}
- Display options taking an argument that appears as a separate word
- following the original option, such as: @samp{-o output-file}.
- @end table
- Thus for example to display all the undocumented target-specific
- switches supported by the compiler, use:
- @smallexample
- --help=target,undocumented
- @end smallexample
- The sense of a qualifier can be inverted by prefixing it with the
- @samp{^} character, so for example to display all binary warning
- options (i.e., ones that are either on or off and that do not take an
- argument) that have a description, use:
- @smallexample
- --help=warnings,^joined,^undocumented
- @end smallexample
- The argument to @option{--help=} should not consist solely of inverted
- qualifiers.
- Combining several classes is possible, although this usually
- restricts the output so much that there is nothing to display. One
- case where it does work, however, is when one of the classes is
- @var{target}. For example, to display all the target-specific
- optimization options, use:
- @smallexample
- --help=target,optimizers
- @end smallexample
- The @option{--help=} option can be repeated on the command line. Each
- successive use displays its requested class of options, skipping
- those that have already been displayed.
- If the @option{-Q} option appears on the command line before the
- @option{--help=} option, then the descriptive text displayed by
- @option{--help=} is changed. Instead of describing the displayed
- options, an indication is given as to whether the option is enabled,
- disabled or set to a specific value (assuming that the compiler
- knows this at the point where the @option{--help=} option is used).
- Here is a truncated example from the ARM port of @command{gcc}:
- @smallexample
- % gcc -Q -mabi=2 --help=target -c
- The following options are target specific:
- -mabi= 2
- -mabort-on-noreturn [disabled]
- -mapcs [disabled]
- @end smallexample
- The output is sensitive to the effects of previous command-line
- options, so for example it is possible to find out which optimizations
- are enabled at @option{-O2} by using:
- @smallexample
- -Q -O2 --help=optimizers
- @end smallexample
- Alternatively you can discover which binary optimizations are enabled
- by @option{-O3} by using:
- @smallexample
- gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
- gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
- diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- @end smallexample
- @item -no-canonical-prefixes
- @opindex no-canonical-prefixes
- Do not expand any symbolic links, resolve references to @samp{/../}
- or @samp{/./}, or make the path absolute when generating a relative
- prefix.
- @item --version
- @opindex version
- Display the version number and copyrights of the invoked GCC@.
- @item -wrapper
- @opindex wrapper
- Invoke all subcommands under a wrapper program. The name of the
- wrapper program and its parameters are passed as a comma separated
- list.
- @smallexample
- gcc -c t.c -wrapper gdb,--args
- @end smallexample
- @noindent
- This invokes all subprograms of @command{gcc} under
- @samp{gdb --args}, thus the invocation of @command{cc1} is
- @samp{gdb --args cc1 @dots{}}.
- @item -fplugin=@var{name}.so
- @opindex fplugin
- Load the plugin code in file @var{name}.so, assumed to be a
- shared object to be dlopen'd by the compiler. The base name of
- the shared object file is used to identify the plugin for the
- purposes of argument parsing (See
- @option{-fplugin-arg-@var{name}-@var{key}=@var{value}} below).
- Each plugin should define the callback functions specified in the
- Plugins API.
- @item -fplugin-arg-@var{name}-@var{key}=@var{value}
- @opindex fplugin-arg
- Define an argument called @var{key} with a value of @var{value}
- for the plugin called @var{name}.
- @item -fdump-ada-spec@r{[}-slim@r{]}
- @opindex fdump-ada-spec
- For C and C++ source and include files, generate corresponding Ada specs.
- @xref{Generating Ada Bindings for C and C++ headers,,, gnat_ugn,
- GNAT User's Guide}, which provides detailed documentation on this feature.
- @item -fada-spec-parent=@var{unit}
- @opindex fada-spec-parent
- In conjunction with @option{-fdump-ada-spec@r{[}-slim@r{]}} above, generate
- Ada specs as child units of parent @var{unit}.
- @item -fdump-go-spec=@var{file}
- @opindex fdump-go-spec
- For input files in any language, generate corresponding Go
- declarations in @var{file}. This generates Go @code{const},
- @code{type}, @code{var}, and @code{func} declarations which may be a
- useful way to start writing a Go interface to code written in some
- other language.
- @include @value{srcdir}/../libiberty/at-file.texi
- @end table
- @node Invoking G++
- @section Compiling C++ Programs
- @cindex suffixes for C++ source
- @cindex C++ source file suffixes
- C++ source files conventionally use one of the suffixes @samp{.C},
- @samp{.cc}, @samp{.cpp}, @samp{.CPP}, @samp{.c++}, @samp{.cp}, or
- @samp{.cxx}; C++ header files often use @samp{.hh}, @samp{.hpp},
- @samp{.H}, or (for shared template code) @samp{.tcc}; and
- preprocessed C++ files use the suffix @samp{.ii}. GCC recognizes
- files with these names and compiles them as C++ programs even if you
- call the compiler the same way as for compiling C programs (usually
- with the name @command{gcc}).
- @findex g++
- @findex c++
- However, the use of @command{gcc} does not add the C++ library.
- @command{g++} is a program that calls GCC and automatically specifies linking
- against the C++ library. It treats @samp{.c},
- @samp{.h} and @samp{.i} files as C++ source files instead of C source
- files unless @option{-x} is used. This program is also useful when
- precompiling a C header file with a @samp{.h} extension for use in C++
- compilations. On many systems, @command{g++} is also installed with
- the name @command{c++}.
- @cindex invoking @command{g++}
- When you compile C++ programs, you may specify many of the same
- command-line options that you use for compiling programs in any
- language; or command-line options meaningful for C and related
- languages; or options that are meaningful only for C++ programs.
- @xref{C Dialect Options,,Options Controlling C Dialect}, for
- explanations of options for languages related to C@.
- @xref{C++ Dialect Options,,Options Controlling C++ Dialect}, for
- explanations of options that are meaningful only for C++ programs.
- @node C Dialect Options
- @section Options Controlling C Dialect
- @cindex dialect options
- @cindex language dialect options
- @cindex options, dialect
- The following options control the dialect of C (or languages derived
- from C, such as C++, Objective-C and Objective-C++) that the compiler
- accepts:
- @table @gcctabopt
- @cindex ANSI support
- @cindex ISO support
- @item -ansi
- @opindex ansi
- In C mode, this is equivalent to @option{-std=c90}. In C++ mode, it is
- equivalent to @option{-std=c++98}.
- This turns off certain features of GCC that are incompatible with ISO
- C90 (when compiling C code), or of standard C++ (when compiling C++ code),
- such as the @code{asm} and @code{typeof} keywords, and
- predefined macros such as @code{unix} and @code{vax} that identify the
- type of system you are using. It also enables the undesirable and
- rarely used ISO trigraph feature. For the C compiler,
- it disables recognition of C++ style @samp{//} comments as well as
- the @code{inline} keyword.
- The alternate keywords @code{__asm__}, @code{__extension__},
- @code{__inline__} and @code{__typeof__} continue to work despite
- @option{-ansi}. You would not want to use them in an ISO C program, of
- course, but it is useful to put them in header files that might be included
- in compilations done with @option{-ansi}. Alternate predefined macros
- such as @code{__unix__} and @code{__vax__} are also available, with or
- without @option{-ansi}.
- The @option{-ansi} option does not cause non-ISO programs to be
- rejected gratuitously. For that, @option{-Wpedantic} is required in
- addition to @option{-ansi}. @xref{Warning Options}.
- The macro @code{__STRICT_ANSI__} is predefined when the @option{-ansi}
- option is used. Some header files may notice this macro and refrain
- from declaring certain functions or defining certain macros that the
- ISO standard doesn't call for; this is to avoid interfering with any
- programs that might use these names for other things.
- Functions that are normally built in but do not have semantics
- defined by ISO C (such as @code{alloca} and @code{ffs}) are not built-in
- functions when @option{-ansi} is used. @xref{Other Builtins,,Other
- built-in functions provided by GCC}, for details of the functions
- affected.
- @item -std=
- @opindex std
- Determine the language standard. @xref{Standards,,Language Standards
- Supported by GCC}, for details of these standard versions. This option
- is currently only supported when compiling C or C++.
- The compiler can accept several base standards, such as @samp{c90} or
- @samp{c++98}, and GNU dialects of those standards, such as
- @samp{gnu90} or @samp{gnu++98}. When a base standard is specified, the
- compiler accepts all programs following that standard plus those
- using GNU extensions that do not contradict it. For example,
- @option{-std=c90} turns off certain features of GCC that are
- incompatible with ISO C90, such as the @code{asm} and @code{typeof}
- keywords, but not other GNU extensions that do not have a meaning in
- ISO C90, such as omitting the middle term of a @code{?:}
- expression. On the other hand, when a GNU dialect of a standard is
- specified, all features supported by the compiler are enabled, even when
- those features change the meaning of the base standard. As a result, some
- strict-conforming programs may be rejected. The particular standard
- is used by @option{-Wpedantic} to identify which features are GNU
- extensions given that version of the standard. For example
- @option{-std=gnu90 -Wpedantic} warns about C++ style @samp{//}
- comments, while @option{-std=gnu99 -Wpedantic} does not.
- A value for this option must be provided; possible values are
- @table @samp
- @item c90
- @itemx c89
- @itemx iso9899:1990
- Support all ISO C90 programs (certain GNU extensions that conflict
- with ISO C90 are disabled). Same as @option{-ansi} for C code.
- @item iso9899:199409
- ISO C90 as modified in amendment 1.
- @item c99
- @itemx c9x
- @itemx iso9899:1999
- @itemx iso9899:199x
- ISO C99. This standard is substantially completely supported, modulo
- bugs and floating-point issues
- (mainly but not entirely relating to optional C99 features from
- Annexes F and G). See
- @w{@uref{http://gcc.gnu.org/c99status.html}} for more information. The
- names @samp{c9x} and @samp{iso9899:199x} are deprecated.
- @item c11
- @itemx c1x
- @itemx iso9899:2011
- ISO C11, the 2011 revision of the ISO C standard. This standard is
- substantially completely supported, modulo bugs, floating-point issues
- (mainly but not entirely relating to optional C11 features from
- Annexes F and G) and the optional Annexes K (Bounds-checking
- interfaces) and L (Analyzability). The name @samp{c1x} is deprecated.
- @item gnu90
- @itemx gnu89
- GNU dialect of ISO C90 (including some C99 features).
- @item gnu99
- @itemx gnu9x
- GNU dialect of ISO C99. The name @samp{gnu9x} is deprecated.
- @item gnu11
- @itemx gnu1x
- GNU dialect of ISO C11. This is the default for C code.
- The name @samp{gnu1x} is deprecated.
- @item c++98
- @itemx c++03
- The 1998 ISO C++ standard plus the 2003 technical corrigendum and some
- additional defect reports. Same as @option{-ansi} for C++ code.
- @item gnu++98
- @itemx gnu++03
- GNU dialect of @option{-std=c++98}. This is the default for
- C++ code.
- @item c++11
- @itemx c++0x
- The 2011 ISO C++ standard plus amendments.
- The name @samp{c++0x} is deprecated.
- @item gnu++11
- @itemx gnu++0x
- GNU dialect of @option{-std=c++11}.
- The name @samp{gnu++0x} is deprecated.
- @item c++14
- @itemx c++1y
- The 2014 ISO C++ standard plus amendments.
- The name @samp{c++1y} is deprecated.
- @item gnu++14
- @itemx gnu++1y
- GNU dialect of @option{-std=c++14}.
- The name @samp{gnu++1y} is deprecated.
- @item c++1z
- The next revision of the ISO C++ standard, tentatively planned for
- 2017. Support is highly experimental, and will almost certainly
- change in incompatible ways in future releases.
- @item gnu++1z
- GNU dialect of @option{-std=c++1z}. Support is highly experimental,
- and will almost certainly change in incompatible ways in future
- releases.
- @end table
- @item -fgnu89-inline
- @opindex fgnu89-inline
- The option @option{-fgnu89-inline} tells GCC to use the traditional
- GNU semantics for @code{inline} functions when in C99 mode.
- @xref{Inline,,An Inline Function is As Fast As a Macro}.
- Using this option is roughly equivalent to adding the
- @code{gnu_inline} function attribute to all inline functions
- (@pxref{Function Attributes}).
- The option @option{-fno-gnu89-inline} explicitly tells GCC to use the
- C99 semantics for @code{inline} when in C99 or gnu99 mode (i.e., it
- specifies the default behavior).
- This option is not supported in @option{-std=c90} or
- @option{-std=gnu90} mode.
- The preprocessor macros @code{__GNUC_GNU_INLINE__} and
- @code{__GNUC_STDC_INLINE__} may be used to check which semantics are
- in effect for @code{inline} functions. @xref{Common Predefined
- Macros,,,cpp,The C Preprocessor}.
- @item -aux-info @var{filename}
- @opindex aux-info
- Output to the given filename prototyped declarations for all functions
- declared and/or defined in a translation unit, including those in header
- files. This option is silently ignored in any language other than C@.
- Besides declarations, the file indicates, in comments, the origin of
- each declaration (source file and line), whether the declaration was
- implicit, prototyped or unprototyped (@samp{I}, @samp{N} for new or
- @samp{O} for old, respectively, in the first character after the line
- number and the colon), and whether it came from a declaration or a
- definition (@samp{C} or @samp{F}, respectively, in the following
- character). In the case of function definitions, a K&R-style list of
- arguments followed by their declarations is also provided, inside
- comments, after the declaration.
- @item -fallow-parameterless-variadic-functions
- @opindex fallow-parameterless-variadic-functions
- Accept variadic functions without named parameters.
- Although it is possible to define such a function, this is not very
- useful as it is not possible to read the arguments. This is only
- supported for C as this construct is allowed by C++.
- @item -fno-asm
- @opindex fno-asm
- Do not recognize @code{asm}, @code{inline} or @code{typeof} as a
- keyword, so that code can use these words as identifiers. You can use
- the keywords @code{__asm__}, @code{__inline__} and @code{__typeof__}
- instead. @option{-ansi} implies @option{-fno-asm}.
- In C++, this switch only affects the @code{typeof} keyword, since
- @code{asm} and @code{inline} are standard keywords. You may want to
- use the @option{-fno-gnu-keywords} flag instead, which has the same
- effect. In C99 mode (@option{-std=c99} or @option{-std=gnu99}), this
- switch only affects the @code{asm} and @code{typeof} keywords, since
- @code{inline} is a standard keyword in ISO C99.
- @item -fno-builtin
- @itemx -fno-builtin-@var{function}
- @opindex fno-builtin
- @cindex built-in functions
- Don't recognize built-in functions that do not begin with
- @samp{__builtin_} as prefix. @xref{Other Builtins,,Other built-in
- functions provided by GCC}, for details of the functions affected,
- including those which are not built-in functions when @option{-ansi} or
- @option{-std} options for strict ISO C conformance are used because they
- do not have an ISO standard meaning.
- GCC normally generates special code to handle certain built-in functions
- more efficiently; for instance, calls to @code{alloca} may become single
- instructions which adjust the stack directly, and calls to @code{memcpy}
- may become inline copy loops. The resulting code is often both smaller
- and faster, but since the function calls no longer appear as such, you
- cannot set a breakpoint on those calls, nor can you change the behavior
- of the functions by linking with a different library. In addition,
- when a function is recognized as a built-in function, GCC may use
- information about that function to warn about problems with calls to
- that function, or to generate more efficient code, even if the
- resulting code still contains calls to that function. For example,
- warnings are given with @option{-Wformat} for bad calls to
- @code{printf} when @code{printf} is built in and @code{strlen} is
- known not to modify global memory.
- With the @option{-fno-builtin-@var{function}} option
- only the built-in function @var{function} is
- disabled. @var{function} must not begin with @samp{__builtin_}. If a
- function is named that is not built-in in this version of GCC, this
- option is ignored. There is no corresponding
- @option{-fbuiltin-@var{function}} option; if you wish to enable
- built-in functions selectively when using @option{-fno-builtin} or
- @option{-ffreestanding}, you may define macros such as:
- @smallexample
- #define abs(n) __builtin_abs ((n))
- #define strcpy(d, s) __builtin_strcpy ((d), (s))
- @end smallexample
- @item -fhosted
- @opindex fhosted
- @cindex hosted environment
- Assert that compilation targets a hosted environment. This implies
- @option{-fbuiltin}. A hosted environment is one in which the
- entire standard library is available, and in which @code{main} has a return
- type of @code{int}. Examples are nearly everything except a kernel.
- This is equivalent to @option{-fno-freestanding}.
- @item -ffreestanding
- @opindex ffreestanding
- @cindex hosted environment
- Assert that compilation targets a freestanding environment. This
- implies @option{-fno-builtin}. A freestanding environment
- is one in which the standard library may not exist, and program startup may
- not necessarily be at @code{main}. The most obvious example is an OS kernel.
- This is equivalent to @option{-fno-hosted}.
- @xref{Standards,,Language Standards Supported by GCC}, for details of
- freestanding and hosted environments.
- @item -fopenacc
- @opindex fopenacc
- @cindex OpenACC accelerator programming
- Enable handling of OpenACC directives @code{#pragma acc} in C/C++ and
- @code{!$acc} in Fortran. When @option{-fopenacc} is specified, the
- compiler generates accelerated code according to the OpenACC Application
- Programming Interface v2.0 @w{@uref{http://www.openacc.org/}}. This option
- implies @option{-pthread}, and thus is only supported on targets that
- have support for @option{-pthread}.
- Note that this is an experimental feature, incomplete, and subject to
- change in future versions of GCC. See
- @w{@uref{https://gcc.gnu.org/wiki/OpenACC}} for more information.
- @item -fopenmp
- @opindex fopenmp
- @cindex OpenMP parallel
- Enable handling of OpenMP directives @code{#pragma omp} in C/C++ and
- @code{!$omp} in Fortran. When @option{-fopenmp} is specified, the
- compiler generates parallel code according to the OpenMP Application
- Program Interface v4.0 @w{@uref{http://www.openmp.org/}}. This option
- implies @option{-pthread}, and thus is only supported on targets that
- have support for @option{-pthread}. @option{-fopenmp} implies
- @option{-fopenmp-simd}.
- @item -fopenmp-simd
- @opindex fopenmp-simd
- @cindex OpenMP SIMD
- @cindex SIMD
- Enable handling of OpenMP's SIMD directives with @code{#pragma omp}
- in C/C++ and @code{!$omp} in Fortran. Other OpenMP directives
- are ignored.
- @item -fcilkplus
- @opindex fcilkplus
- @cindex Enable Cilk Plus
- Enable the usage of Cilk Plus language extension features for C/C++.
- When the option @option{-fcilkplus} is specified, enable the usage of
- the Cilk Plus Language extension features for C/C++. The present
- implementation follows ABI version 1.2. This is an experimental
- feature that is only partially complete, and whose interface may
- change in future versions of GCC as the official specification
- changes. Currently, all features but @code{_Cilk_for} have been
- implemented.
- @item -fgnu-tm
- @opindex fgnu-tm
- When the option @option{-fgnu-tm} is specified, the compiler
- generates code for the Linux variant of Intel's current Transactional
- Memory ABI specification document (Revision 1.1, May 6 2009). This is
- an experimental feature whose interface may change in future versions
- of GCC, as the official specification changes. Please note that not
- all architectures are supported for this feature.
- For more information on GCC's support for transactional memory,
- @xref{Enabling libitm,,The GNU Transactional Memory Library,libitm,GNU
- Transactional Memory Library}.
- Note that the transactional memory feature is not supported with
- non-call exceptions (@option{-fnon-call-exceptions}).
- @item -fms-extensions
- @opindex fms-extensions
- Accept some non-standard constructs used in Microsoft header files.
- In C++ code, this allows member names in structures to be similar
- to previous types declarations.
- @smallexample
- typedef int UOW;
- struct ABC @{
- UOW UOW;
- @};
- @end smallexample
- Some cases of unnamed fields in structures and unions are only
- accepted with this option. @xref{Unnamed Fields,,Unnamed struct/union
- fields within structs/unions}, for details.
- Note that this option is off for all targets but x86
- targets using ms-abi.
- @item -fplan9-extensions
- @opindex fplan9-extensions
- Accept some non-standard constructs used in Plan 9 code.
- This enables @option{-fms-extensions}, permits passing pointers to
- structures with anonymous fields to functions that expect pointers to
- elements of the type of the field, and permits referring to anonymous
- fields declared using a typedef. @xref{Unnamed Fields,,Unnamed
- struct/union fields within structs/unions}, for details. This is only
- supported for C, not C++.
- @item -trigraphs
- @opindex trigraphs
- Support ISO C trigraphs. The @option{-ansi} option (and @option{-std}
- options for strict ISO C conformance) implies @option{-trigraphs}.
- @cindex traditional C language
- @cindex C language, traditional
- @item -traditional
- @itemx -traditional-cpp
- @opindex traditional-cpp
- @opindex traditional
- Formerly, these options caused GCC to attempt to emulate a pre-standard
- C compiler. They are now only supported with the @option{-E} switch.
- The preprocessor continues to support a pre-standard mode. See the GNU
- CPP manual for details.
- @item -fcond-mismatch
- @opindex fcond-mismatch
- Allow conditional expressions with mismatched types in the second and
- third arguments. The value of such an expression is void. This option
- is not supported for C++.
- @item -flax-vector-conversions
- @opindex flax-vector-conversions
- Allow implicit conversions between vectors with differing numbers of
- elements and/or incompatible element types. This option should not be
- used for new code.
- @item -funsigned-char
- @opindex funsigned-char
- Let the type @code{char} be unsigned, like @code{unsigned char}.
- Each kind of machine has a default for what @code{char} should
- be. It is either like @code{unsigned char} by default or like
- @code{signed char} by default.
- Ideally, a portable program should always use @code{signed char} or
- @code{unsigned char} when it depends on the signedness of an object.
- But many programs have been written to use plain @code{char} and
- expect it to be signed, or expect it to be unsigned, depending on the
- machines they were written for. This option, and its inverse, let you
- make such a program work with the opposite default.
- The type @code{char} is always a distinct type from each of
- @code{signed char} or @code{unsigned char}, even though its behavior
- is always just like one of those two.
- @item -fsigned-char
- @opindex fsigned-char
- Let the type @code{char} be signed, like @code{signed char}.
- Note that this is equivalent to @option{-fno-unsigned-char}, which is
- the negative form of @option{-funsigned-char}. Likewise, the option
- @option{-fno-signed-char} is equivalent to @option{-funsigned-char}.
- @item -fsigned-bitfields
- @itemx -funsigned-bitfields
- @itemx -fno-signed-bitfields
- @itemx -fno-unsigned-bitfields
- @opindex fsigned-bitfields
- @opindex funsigned-bitfields
- @opindex fno-signed-bitfields
- @opindex fno-unsigned-bitfields
- These options control whether a bit-field is signed or unsigned, when the
- declaration does not use either @code{signed} or @code{unsigned}. By
- default, such a bit-field is signed, because this is consistent: the
- basic integer types such as @code{int} are signed types.
- @end table
- @node C++ Dialect Options
- @section Options Controlling C++ Dialect
- @cindex compiler options, C++
- @cindex C++ options, command-line
- @cindex options, C++
- This section describes the command-line options that are only meaningful
- for C++ programs. You can also use most of the GNU compiler options
- regardless of what language your program is in. For example, you
- might compile a file @file{firstClass.C} like this:
- @smallexample
- g++ -g -frepo -O -c firstClass.C
- @end smallexample
- @noindent
- In this example, only @option{-frepo} is an option meant
- only for C++ programs; you can use the other options with any
- language supported by GCC@.
- Here is a list of options that are @emph{only} for compiling C++ programs:
- @table @gcctabopt
- @item -fabi-version=@var{n}
- @opindex fabi-version
- Use version @var{n} of the C++ ABI@. The default is version 0.
- Version 0 refers to the version conforming most closely to
- the C++ ABI specification. Therefore, the ABI obtained using version 0
- will change in different versions of G++ as ABI bugs are fixed.
- Version 1 is the version of the C++ ABI that first appeared in G++ 3.2.
- Version 2 is the version of the C++ ABI that first appeared in G++
- 3.4, and was the default through G++ 4.9.
- Version 3 corrects an error in mangling a constant address as a
- template argument.
- Version 4, which first appeared in G++ 4.5, implements a standard
- mangling for vector types.
- Version 5, which first appeared in G++ 4.6, corrects the mangling of
- attribute const/volatile on function pointer types, decltype of a
- plain decl, and use of a function parameter in the declaration of
- another parameter.
- Version 6, which first appeared in G++ 4.7, corrects the promotion
- behavior of C++11 scoped enums and the mangling of template argument
- packs, const/static_cast, prefix ++ and --, and a class scope function
- used as a template argument.
- Version 7, which first appeared in G++ 4.8, that treats nullptr_t as a
- builtin type and corrects the mangling of lambdas in default argument
- scope.
- Version 8, which first appeared in G++ 4.9, corrects the substitution
- behavior of function types with function-cv-qualifiers.
- See also @option{-Wabi}.
- @item -fabi-compat-version=@var{n}
- @opindex fabi-compat-version
- On targets that support strong aliases, G++
- works around mangling changes by creating an alias with the correct
- mangled name when defining a symbol with an incorrect mangled name.
- This switch specifies which ABI version to use for the alias.
- With @option{-fabi-version=0} (the default), this defaults to 2. If
- another ABI version is explicitly selected, this defaults to 0.
- The compatibility version is also set by @option{-Wabi=@var{n}}.
- @item -fno-access-control
- @opindex fno-access-control
- Turn off all access checking. This switch is mainly useful for working
- around bugs in the access control code.
- @item -fcheck-new
- @opindex fcheck-new
- Check that the pointer returned by @code{operator new} is non-null
- before attempting to modify the storage allocated. This check is
- normally unnecessary because the C++ standard specifies that
- @code{operator new} only returns @code{0} if it is declared
- @code{throw()}, in which case the compiler always checks the
- return value even without this option. In all other cases, when
- @code{operator new} has a non-empty exception specification, memory
- exhaustion is signalled by throwing @code{std::bad_alloc}. See also
- @samp{new (nothrow)}.
- @item -fconstexpr-depth=@var{n}
- @opindex fconstexpr-depth
- Set the maximum nested evaluation depth for C++11 constexpr functions
- to @var{n}. A limit is needed to detect endless recursion during
- constant expression evaluation. The minimum specified by the standard
- is 512.
- @item -fdeduce-init-list
- @opindex fdeduce-init-list
- Enable deduction of a template type parameter as
- @code{std::initializer_list} from a brace-enclosed initializer list, i.e.@:
- @smallexample
- template <class T> auto forward(T t) -> decltype (realfn (t))
- @{
- return realfn (t);
- @}
- void f()
- @{
- forward(@{1,2@}); // call forward<std::initializer_list<int>>
- @}
- @end smallexample
- This deduction was implemented as a possible extension to the
- originally proposed semantics for the C++11 standard, but was not part
- of the final standard, so it is disabled by default. This option is
- deprecated, and may be removed in a future version of G++.
- @item -ffriend-injection
- @opindex ffriend-injection
- Inject friend functions into the enclosing namespace, so that they are
- visible outside the scope of the class in which they are declared.
- Friend functions were documented to work this way in the old Annotated
- C++ Reference Manual.
- However, in ISO C++ a friend function that is not declared
- in an enclosing scope can only be found using argument dependent
- lookup. GCC defaults to the standard behavior.
- This option is for compatibility, and may be removed in a future
- release of G++.
- @item -fno-elide-constructors
- @opindex fno-elide-constructors
- The C++ standard allows an implementation to omit creating a temporary
- that is only used to initialize another object of the same type.
- Specifying this option disables that optimization, and forces G++ to
- call the copy constructor in all cases.
- @item -fno-enforce-eh-specs
- @opindex fno-enforce-eh-specs
- Don't generate code to check for violation of exception specifications
- at run time. This option violates the C++ standard, but may be useful
- for reducing code size in production builds, much like defining
- @code{NDEBUG}. This does not give user code permission to throw
- exceptions in violation of the exception specifications; the compiler
- still optimizes based on the specifications, so throwing an
- unexpected exception results in undefined behavior at run time.
- @item -fextern-tls-init
- @itemx -fno-extern-tls-init
- @opindex fextern-tls-init
- @opindex fno-extern-tls-init
- The C++11 and OpenMP standards allow @code{thread_local} and
- @code{threadprivate} variables to have dynamic (runtime)
- initialization. To support this, any use of such a variable goes
- through a wrapper function that performs any necessary initialization.
- When the use and definition of the variable are in the same
- translation unit, this overhead can be optimized away, but when the
- use is in a different translation unit there is significant overhead
- even if the variable doesn't actually need dynamic initialization. If
- the programmer can be sure that no use of the variable in a
- non-defining TU needs to trigger dynamic initialization (either
- because the variable is statically initialized, or a use of the
- variable in the defining TU will be executed before any uses in
- another TU), they can avoid this overhead with the
- @option{-fno-extern-tls-init} option.
- On targets that support symbol aliases, the default is
- @option{-fextern-tls-init}. On targets that do not support symbol
- aliases, the default is @option{-fno-extern-tls-init}.
- @item -ffor-scope
- @itemx -fno-for-scope
- @opindex ffor-scope
- @opindex fno-for-scope
- If @option{-ffor-scope} is specified, the scope of variables declared in
- a @i{for-init-statement} is limited to the @code{for} loop itself,
- as specified by the C++ standard.
- If @option{-fno-for-scope} is specified, the scope of variables declared in
- a @i{for-init-statement} extends to the end of the enclosing scope,
- as was the case in old versions of G++, and other (traditional)
- implementations of C++.
- If neither flag is given, the default is to follow the standard,
- but to allow and give a warning for old-style code that would
- otherwise be invalid, or have different behavior.
- @item -fno-gnu-keywords
- @opindex fno-gnu-keywords
- Do not recognize @code{typeof} as a keyword, so that code can use this
- word as an identifier. You can use the keyword @code{__typeof__} instead.
- @option{-ansi} implies @option{-fno-gnu-keywords}.
- @item -fno-implicit-templates
- @opindex fno-implicit-templates
- Never emit code for non-inline templates that are instantiated
- implicitly (i.e.@: by use); only emit code for explicit instantiations.
- @xref{Template Instantiation}, for more information.
- @item -fno-implicit-inline-templates
- @opindex fno-implicit-inline-templates
- Don't emit code for implicit instantiations of inline templates, either.
- The default is to handle inlines differently so that compiles with and
- without optimization need the same set of explicit instantiations.
- @item -fno-implement-inlines
- @opindex fno-implement-inlines
- To save space, do not emit out-of-line copies of inline functions
- controlled by @code{#pragma implementation}. This causes linker
- errors if these functions are not inlined everywhere they are called.
- @item -fms-extensions
- @opindex fms-extensions
- Disable Wpedantic warnings about constructs used in MFC, such as implicit
- int and getting a pointer to member function via non-standard syntax.
- @item -fno-nonansi-builtins
- @opindex fno-nonansi-builtins
- Disable built-in declarations of functions that are not mandated by
- ANSI/ISO C@. These include @code{ffs}, @code{alloca}, @code{_exit},
- @code{index}, @code{bzero}, @code{conjf}, and other related functions.
- @item -fnothrow-opt
- @opindex fnothrow-opt
- Treat a @code{throw()} exception specification as if it were a
- @code{noexcept} specification to reduce or eliminate the text size
- overhead relative to a function with no exception specification. If
- the function has local variables of types with non-trivial
- destructors, the exception specification actually makes the
- function smaller because the EH cleanups for those variables can be
- optimized away. The semantic effect is that an exception thrown out of
- a function with such an exception specification results in a call
- to @code{terminate} rather than @code{unexpected}.
- @item -fno-operator-names
- @opindex fno-operator-names
- Do not treat the operator name keywords @code{and}, @code{bitand},
- @code{bitor}, @code{compl}, @code{not}, @code{or} and @code{xor} as
- synonyms as keywords.
- @item -fno-optional-diags
- @opindex fno-optional-diags
- Disable diagnostics that the standard says a compiler does not need to
- issue. Currently, the only such diagnostic issued by G++ is the one for
- a name having multiple meanings within a class.
- @item -fpermissive
- @opindex fpermissive
- Downgrade some diagnostics about nonconformant code from errors to
- warnings. Thus, using @option{-fpermissive} allows some
- nonconforming code to compile.
- @item -fno-pretty-templates
- @opindex fno-pretty-templates
- When an error message refers to a specialization of a function
- template, the compiler normally prints the signature of the
- template followed by the template arguments and any typedefs or
- typenames in the signature (e.g. @code{void f(T) [with T = int]}
- rather than @code{void f(int)}) so that it's clear which template is
- involved. When an error message refers to a specialization of a class
- template, the compiler omits any template arguments that match
- the default template arguments for that template. If either of these
- behaviors make it harder to understand the error message rather than
- easier, you can use @option{-fno-pretty-templates} to disable them.
- @item -frepo
- @opindex frepo
- Enable automatic template instantiation at link time. This option also
- implies @option{-fno-implicit-templates}. @xref{Template
- Instantiation}, for more information.
- @item -fno-rtti
- @opindex fno-rtti
- Disable generation of information about every class with virtual
- functions for use by the C++ run-time type identification features
- (@code{dynamic_cast} and @code{typeid}). If you don't use those parts
- of the language, you can save some space by using this flag. Note that
- exception handling uses the same information, but G++ generates it as
- needed. The @code{dynamic_cast} operator can still be used for casts that
- do not require run-time type information, i.e.@: casts to @code{void *} or to
- unambiguous base classes.
- @item -fsized-deallocation
- @opindex fsized-deallocation
- Enable the built-in global declarations
- @smallexample
- void operator delete (void *, std::size_t) noexcept;
- void operator delete[] (void *, std::size_t) noexcept;
- @end smallexample
- as introduced in C++14. This is useful for user-defined replacement
- deallocation functions that, for example, use the size of the object
- to make deallocation faster. Enabled by default under
- @option{-std=c++14} and above. The flag @option{-Wsized-deallocation}
- warns about places that might want to add a definition.
- @item -fstats
- @opindex fstats
- Emit statistics about front-end processing at the end of the compilation.
- This information is generally only useful to the G++ development team.
- @item -fstrict-enums
- @opindex fstrict-enums
- Allow the compiler to optimize using the assumption that a value of
- enumerated type can only be one of the values of the enumeration (as
- defined in the C++ standard; basically, a value that can be
- represented in the minimum number of bits needed to represent all the
- enumerators). This assumption may not be valid if the program uses a
- cast to convert an arbitrary integer value to the enumerated type.
- @item -ftemplate-backtrace-limit=@var{n}
- @opindex ftemplate-backtrace-limit
- Set the maximum number of template instantiation notes for a single
- warning or error to @var{n}. The default value is 10.
- @item -ftemplate-depth=@var{n}
- @opindex ftemplate-depth
- Set the maximum instantiation depth for template classes to @var{n}.
- A limit on the template instantiation depth is needed to detect
- endless recursions during template class instantiation. ANSI/ISO C++
- conforming programs must not rely on a maximum depth greater than 17
- (changed to 1024 in C++11). The default value is 900, as the compiler
- can run out of stack space before hitting 1024 in some situations.
- @item -fno-threadsafe-statics
- @opindex fno-threadsafe-statics
- Do not emit the extra code to use the routines specified in the C++
- ABI for thread-safe initialization of local statics. You can use this
- option to reduce code size slightly in code that doesn't need to be
- thread-safe.
- @item -fuse-cxa-atexit
- @opindex fuse-cxa-atexit
- Register destructors for objects with static storage duration with the
- @code{__cxa_atexit} function rather than the @code{atexit} function.
- This option is required for fully standards-compliant handling of static
- destructors, but only works if your C library supports
- @code{__cxa_atexit}.
- @item -fno-use-cxa-get-exception-ptr
- @opindex fno-use-cxa-get-exception-ptr
- Don't use the @code{__cxa_get_exception_ptr} runtime routine. This
- causes @code{std::uncaught_exception} to be incorrect, but is necessary
- if the runtime routine is not available.
- @item -fvisibility-inlines-hidden
- @opindex fvisibility-inlines-hidden
- This switch declares that the user does not attempt to compare
- pointers to inline functions or methods where the addresses of the two functions
- are taken in different shared objects.
- The effect of this is that GCC may, effectively, mark inline methods with
- @code{__attribute__ ((visibility ("hidden")))} so that they do not
- appear in the export table of a DSO and do not require a PLT indirection
- when used within the DSO@. Enabling this option can have a dramatic effect
- on load and link times of a DSO as it massively reduces the size of the
- dynamic export table when the library makes heavy use of templates.
- The behavior of this switch is not quite the same as marking the
- methods as hidden directly, because it does not affect static variables
- local to the function or cause the compiler to deduce that
- the function is defined in only one shared object.
- You may mark a method as having a visibility explicitly to negate the
- effect of the switch for that method. For example, if you do want to
- compare pointers to a particular inline method, you might mark it as
- having default visibility. Marking the enclosing class with explicit
- visibility has no effect.
- Explicitly instantiated inline methods are unaffected by this option
- as their linkage might otherwise cross a shared library boundary.
- @xref{Template Instantiation}.
- @item -fvisibility-ms-compat
- @opindex fvisibility-ms-compat
- This flag attempts to use visibility settings to make GCC's C++
- linkage model compatible with that of Microsoft Visual Studio.
- The flag makes these changes to GCC's linkage model:
- @enumerate
- @item
- It sets the default visibility to @code{hidden}, like
- @option{-fvisibility=hidden}.
- @item
- Types, but not their members, are not hidden by default.
- @item
- The One Definition Rule is relaxed for types without explicit
- visibility specifications that are defined in more than one
- shared object: those declarations are permitted if they are
- permitted when this option is not used.
- @end enumerate
- In new code it is better to use @option{-fvisibility=hidden} and
- export those classes that are intended to be externally visible.
- Unfortunately it is possible for code to rely, perhaps accidentally,
- on the Visual Studio behavior.
- Among the consequences of these changes are that static data members
- of the same type with the same name but defined in different shared
- objects are different, so changing one does not change the other;
- and that pointers to function members defined in different shared
- objects may not compare equal. When this flag is given, it is a
- violation of the ODR to define types with the same name differently.
- @item -fvtable-verify=@r{[}std@r{|}preinit@r{|}none@r{]}
- @opindex fvtable-verify
- Turn on (or off, if using @option{-fvtable-verify=none}) the security
- feature that verifies at run time, for every virtual call, that
- the vtable pointer through which the call is made is valid for the type of
- the object, and has not been corrupted or overwritten. If an invalid vtable
- pointer is detected at run time, an error is reported and execution of the
- program is immediately halted.
- This option causes run-time data structures to be built at program startup,
- which are used for verifying the vtable pointers.
- The options @samp{std} and @samp{preinit}
- control the timing of when these data structures are built. In both cases the
- data structures are built before execution reaches @code{main}. Using
- @option{-fvtable-verify=std} causes the data structures to be built after
- shared libraries have been loaded and initialized.
- @option{-fvtable-verify=preinit} causes them to be built before shared
- libraries have been loaded and initialized.
- If this option appears multiple times in the command line with different
- values specified, @samp{none} takes highest priority over both @samp{std} and
- @samp{preinit}; @samp{preinit} takes priority over @samp{std}.
- @item -fvtv-debug
- @opindex fvtv-debug
- When used in conjunction with @option{-fvtable-verify=std} or
- @option{-fvtable-verify=preinit}, causes debug versions of the
- runtime functions for the vtable verification feature to be called.
- This flag also causes the compiler to log information about which
- vtable pointers it finds for each class.
- This information is written to a file named @file{vtv_set_ptr_data.log}
- in the directory named by the environment variable @env{VTV_LOGS_DIR}
- if that is defined or the current working directory otherwise.
- Note: This feature @emph{appends} data to the log file. If you want a fresh log
- file, be sure to delete any existing one.
- @item -fvtv-counts
- @opindex fvtv-counts
- This is a debugging flag. When used in conjunction with
- @option{-fvtable-verify=std} or @option{-fvtable-verify=preinit}, this
- causes the compiler to keep track of the total number of virtual calls
- it encounters and the number of verifications it inserts. It also
- counts the number of calls to certain run-time library functions
- that it inserts and logs this information for each compilation unit.
- The compiler writes this information to a file named
- @file{vtv_count_data.log} in the directory named by the environment
- variable @env{VTV_LOGS_DIR} if that is defined or the current working
- directory otherwise. It also counts the size of the vtable pointer sets
- for each class, and writes this information to @file{vtv_class_set_sizes.log}
- in the same directory.
- Note: This feature @emph{appends} data to the log files. To get fresh log
- files, be sure to delete any existing ones.
- @item -fno-weak
- @opindex fno-weak
- Do not use weak symbol support, even if it is provided by the linker.
- By default, G++ uses weak symbols if they are available. This
- option exists only for testing, and should not be used by end-users;
- it results in inferior code and has no benefits. This option may
- be removed in a future release of G++.
- @item -nostdinc++
- @opindex nostdinc++
- Do not search for header files in the standard directories specific to
- C++, but do still search the other standard directories. (This option
- is used when building the C++ library.)
- @end table
- In addition, these optimization, warning, and code generation options
- have meanings only for C++ programs:
- @table @gcctabopt
- @item -Wabi @r{(C, Objective-C, C++ and Objective-C++ only)}
- @opindex Wabi
- @opindex Wno-abi
- When an explicit @option{-fabi-version=@var{n}} option is used, causes
- G++ to warn when it generates code that is probably not compatible with the
- vendor-neutral C++ ABI@. Since G++ now defaults to
- @option{-fabi-version=0}, @option{-Wabi} has no effect unless either
- an older ABI version is selected (with @option{-fabi-version=@var{n}})
- or an older compatibility version is selected (with
- @option{-Wabi=@var{n}} or @option{-fabi-compat-version=@var{n}}).
- Although an effort has been made to warn about
- all such cases, there are probably some cases that are not warned about,
- even though G++ is generating incompatible code. There may also be
- cases where warnings are emitted even though the code that is generated
- is compatible.
- You should rewrite your code to avoid these warnings if you are
- concerned about the fact that code generated by G++ may not be binary
- compatible with code generated by other compilers.
- @option{-Wabi} can also be used with an explicit version number to
- warn about compatibility with a particular @option{-fabi-version}
- level, e.g. @option{-Wabi=2} to warn about changes relative to
- @option{-fabi-version=2}. Specifying a version number also sets
- @option{-fabi-compat-version=@var{n}}.
- The known incompatibilities in @option{-fabi-version=2} (which was the
- default from GCC 3.4 to 4.9) include:
- @itemize @bullet
- @item
- A template with a non-type template parameter of reference type was
- mangled incorrectly:
- @smallexample
- extern int N;
- template <int &> struct S @{@};
- void n (S<N>) @{2@}
- @end smallexample
- This was fixed in @option{-fabi-version=3}.
- @item
- SIMD vector types declared using @code{__attribute ((vector_size))} were
- mangled in a non-standard way that does not allow for overloading of
- functions taking vectors of different sizes.
- The mangling was changed in @option{-fabi-version=4}.
- @item
- @code{__attribute ((const))} and @code{noreturn} were mangled as type
- qualifiers, and @code{decltype} of a plain declaration was folded away.
- These mangling issues were fixed in @option{-fabi-version=5}.
- @item
- Scoped enumerators passed as arguments to a variadic function are
- promoted like unscoped enumerators, causing @code{va_arg} to complain.
- On most targets this does not actually affect the parameter passing
- ABI, as there is no way to pass an argument smaller than @code{int}.
- Also, the ABI changed the mangling of template argument packs,
- @code{const_cast}, @code{static_cast}, prefix increment/decrement, and
- a class scope function used as a template argument.
- These issues were corrected in @option{-fabi-version=6}.
- @item
- Lambdas in default argument scope were mangled incorrectly, and the
- ABI changed the mangling of @code{nullptr_t}.
- These issues were corrected in @option{-fabi-version=7}.
- @item
- When mangling a function type with function-cv-qualifiers, the
- un-qualified function type was incorrectly treated as a substitution
- candidate.
- This was fixed in @option{-fabi-version=8}.
- @end itemize
- It also warns about psABI-related changes. The known psABI changes at this
- point include:
- @itemize @bullet
- @item
- For SysV/x86-64, unions with @code{long double} members are
- passed in memory as specified in psABI. For example:
- @smallexample
- union U @{
- long double ld;
- int i;
- @};
- @end smallexample
- @noindent
- @code{union U} is always passed in memory.
- @end itemize
- @item -Wabi-tag @r{(C++ and Objective-C++ only)}
- @opindex Wabi-tag
- @opindex -Wabi-tag
- Warn when a type with an ABI tag is used in a context that does not
- have that ABI tag. See @ref{C++ Attributes} for more information
- about ABI tags.
- @item -Wctor-dtor-privacy @r{(C++ and Objective-C++ only)}
- @opindex Wctor-dtor-privacy
- @opindex Wno-ctor-dtor-privacy
- Warn when a class seems unusable because all the constructors or
- destructors in that class are private, and it has neither friends nor
- public static member functions. Also warn if there are no non-private
- methods, and there's at least one private member function that isn't
- a constructor or destructor.
- @item -Wdelete-non-virtual-dtor @r{(C++ and Objective-C++ only)}
- @opindex Wdelete-non-virtual-dtor
- @opindex Wno-delete-non-virtual-dtor
- Warn when @code{delete} is used to destroy an instance of a class that
- has virtual functions and non-virtual destructor. It is unsafe to delete
- an instance of a derived class through a pointer to a base class if the
- base class does not have a virtual destructor. This warning is enabled
- by @option{-Wall}.
- @item -Wliteral-suffix @r{(C++ and Objective-C++ only)}
- @opindex Wliteral-suffix
- @opindex Wno-literal-suffix
- Warn when a string or character literal is followed by a ud-suffix which does
- not begin with an underscore. As a conforming extension, GCC treats such
- suffixes as separate preprocessing tokens in order to maintain backwards
- compatibility with code that uses formatting macros from @code{<inttypes.h>}.
- For example:
- @smallexample
- #define __STDC_FORMAT_MACROS
- #include <inttypes.h>
- #include <stdio.h>
- int main() @{
- int64_t i64 = 123;
- printf("My int64: %"PRId64"\n", i64);
- @}
- @end smallexample
- In this case, @code{PRId64} is treated as a separate preprocessing token.
- This warning is enabled by default.
- @item -Wnarrowing @r{(C++ and Objective-C++ only)}
- @opindex Wnarrowing
- @opindex Wno-narrowing
- Warn when a narrowing conversion prohibited by C++11 occurs within
- @samp{@{ @}}, e.g.
- @smallexample
- int i = @{ 2.2 @}; // error: narrowing from double to int
- @end smallexample
- This flag is included in @option{-Wall} and @option{-Wc++11-compat}.
- With @option{-std=c++11}, @option{-Wno-narrowing} suppresses the diagnostic
- required by the standard. Note that this does not affect the meaning
- of well-formed code; narrowing conversions are still considered
- ill-formed in SFINAE context.
- @item -Wnoexcept @r{(C++ and Objective-C++ only)}
- @opindex Wnoexcept
- @opindex Wno-noexcept
- Warn when a noexcept-expression evaluates to false because of a call
- to a function that does not have a non-throwing exception
- specification (i.e. @code{throw()} or @code{noexcept}) but is known by
- the compiler to never throw an exception.
- @item -Wnon-virtual-dtor @r{(C++ and Objective-C++ only)}
- @opindex Wnon-virtual-dtor
- @opindex Wno-non-virtual-dtor
- Warn when a class has virtual functions and an accessible non-virtual
- destructor itself or in an accessible polymorphic base class, in which
- case it is possible but unsafe to delete an instance of a derived
- class through a pointer to the class itself or base class. This
- warning is automatically enabled if @option{-Weffc++} is specified.
- @item -Wreorder @r{(C++ and Objective-C++ only)}
- @opindex Wreorder
- @opindex Wno-reorder
- @cindex reordering, warning
- @cindex warning for reordering of member initializers
- Warn when the order of member initializers given in the code does not
- match the order in which they must be executed. For instance:
- @smallexample
- struct A @{
- int i;
- int j;
- A(): j (0), i (1) @{ @}
- @};
- @end smallexample
- @noindent
- The compiler rearranges the member initializers for @code{i}
- and @code{j} to match the declaration order of the members, emitting
- a warning to that effect. This warning is enabled by @option{-Wall}.
- @item -fext-numeric-literals @r{(C++ and Objective-C++ only)}
- @opindex fext-numeric-literals
- @opindex fno-ext-numeric-literals
- Accept imaginary, fixed-point, or machine-defined
- literal number suffixes as GNU extensions.
- When this option is turned off these suffixes are treated
- as C++11 user-defined literal numeric suffixes.
- This is on by default for all pre-C++11 dialects and all GNU dialects:
- @option{-std=c++98}, @option{-std=gnu++98}, @option{-std=gnu++11},
- @option{-std=gnu++14}.
- This option is off by default
- for ISO C++11 onwards (@option{-std=c++11}, ...).
- @end table
- The following @option{-W@dots{}} options are not affected by @option{-Wall}.
- @table @gcctabopt
- @item -Weffc++ @r{(C++ and Objective-C++ only)}
- @opindex Weffc++
- @opindex Wno-effc++
- Warn about violations of the following style guidelines from Scott Meyers'
- @cite{Effective C++} series of books:
- @itemize @bullet
- @item
- Define a copy constructor and an assignment operator for classes
- with dynamically-allocated memory.
- @item
- Prefer initialization to assignment in constructors.
- @item
- Have @code{operator=} return a reference to @code{*this}.
- @item
- Don't try to return a reference when you must return an object.
- @item
- Distinguish between prefix and postfix forms of increment and
- decrement operators.
- @item
- Never overload @code{&&}, @code{||}, or @code{,}.
- @end itemize
- This option also enables @option{-Wnon-virtual-dtor}, which is also
- one of the effective C++ recommendations. However, the check is
- extended to warn about the lack of virtual destructor in accessible
- non-polymorphic bases classes too.
- When selecting this option, be aware that the standard library
- headers do not obey all of these guidelines; use @samp{grep -v}
- to filter out those warnings.
- @item -Wstrict-null-sentinel @r{(C++ and Objective-C++ only)}
- @opindex Wstrict-null-sentinel
- @opindex Wno-strict-null-sentinel
- Warn about the use of an uncasted @code{NULL} as sentinel. When
- compiling only with GCC this is a valid sentinel, as @code{NULL} is defined
- to @code{__null}. Although it is a null pointer constant rather than a
- null pointer, it is guaranteed to be of the same size as a pointer.
- But this use is not portable across different compilers.
- @item -Wno-non-template-friend @r{(C++ and Objective-C++ only)}
- @opindex Wno-non-template-friend
- @opindex Wnon-template-friend
- Disable warnings when non-templatized friend functions are declared
- within a template. Since the advent of explicit template specification
- support in G++, if the name of the friend is an unqualified-id (i.e.,
- @samp{friend foo(int)}), the C++ language specification demands that the
- friend declare or define an ordinary, nontemplate function. (Section
- 14.5.3). Before G++ implemented explicit specification, unqualified-ids
- could be interpreted as a particular specialization of a templatized
- function. Because this non-conforming behavior is no longer the default
- behavior for G++, @option{-Wnon-template-friend} allows the compiler to
- check existing code for potential trouble spots and is on by default.
- This new compiler behavior can be turned off with
- @option{-Wno-non-template-friend}, which keeps the conformant compiler code
- but disables the helpful warning.
- @item -Wold-style-cast @r{(C++ and Objective-C++ only)}
- @opindex Wold-style-cast
- @opindex Wno-old-style-cast
- Warn if an old-style (C-style) cast to a non-void type is used within
- a C++ program. The new-style casts (@code{dynamic_cast},
- @code{static_cast}, @code{reinterpret_cast}, and @code{const_cast}) are
- less vulnerable to unintended effects and much easier to search for.
- @item -Woverloaded-virtual @r{(C++ and Objective-C++ only)}
- @opindex Woverloaded-virtual
- @opindex Wno-overloaded-virtual
- @cindex overloaded virtual function, warning
- @cindex warning for overloaded virtual function
- Warn when a function declaration hides virtual functions from a
- base class. For example, in:
- @smallexample
- struct A @{
- virtual void f();
- @};
- struct B: public A @{
- void f(int);
- @};
- @end smallexample
- the @code{A} class version of @code{f} is hidden in @code{B}, and code
- like:
- @smallexample
- B* b;
- b->f();
- @end smallexample
- @noindent
- fails to compile.
- @item -Wno-pmf-conversions @r{(C++ and Objective-C++ only)}
- @opindex Wno-pmf-conversions
- @opindex Wpmf-conversions
- Disable the diagnostic for converting a bound pointer to member function
- to a plain pointer.
- @item -Wsign-promo @r{(C++ and Objective-C++ only)}
- @opindex Wsign-promo
- @opindex Wno-sign-promo
- Warn when overload resolution chooses a promotion from unsigned or
- enumerated type to a signed type, over a conversion to an unsigned type of
- the same size. Previous versions of G++ tried to preserve
- unsignedness, but the standard mandates the current behavior.
- @end table
- @node Objective-C and Objective-C++ Dialect Options
- @section Options Controlling Objective-C and Objective-C++ Dialects
- @cindex compiler options, Objective-C and Objective-C++
- @cindex Objective-C and Objective-C++ options, command-line
- @cindex options, Objective-C and Objective-C++
- (NOTE: This manual does not describe the Objective-C and Objective-C++
- languages themselves. @xref{Standards,,Language Standards
- Supported by GCC}, for references.)
- This section describes the command-line options that are only meaningful
- for Objective-C and Objective-C++ programs. You can also use most of
- the language-independent GNU compiler options.
- For example, you might compile a file @file{some_class.m} like this:
- @smallexample
- gcc -g -fgnu-runtime -O -c some_class.m
- @end smallexample
- @noindent
- In this example, @option{-fgnu-runtime} is an option meant only for
- Objective-C and Objective-C++ programs; you can use the other options with
- any language supported by GCC@.
- Note that since Objective-C is an extension of the C language, Objective-C
- compilations may also use options specific to the C front-end (e.g.,
- @option{-Wtraditional}). Similarly, Objective-C++ compilations may use
- C++-specific options (e.g., @option{-Wabi}).
- Here is a list of options that are @emph{only} for compiling Objective-C
- and Objective-C++ programs:
- @table @gcctabopt
- @item -fconstant-string-class=@var{class-name}
- @opindex fconstant-string-class
- Use @var{class-name} as the name of the class to instantiate for each
- literal string specified with the syntax @code{@@"@dots{}"}. The default
- class name is @code{NXConstantString} if the GNU runtime is being used, and
- @code{NSConstantString} if the NeXT runtime is being used (see below). The
- @option{-fconstant-cfstrings} option, if also present, overrides the
- @option{-fconstant-string-class} setting and cause @code{@@"@dots{}"} literals
- to be laid out as constant CoreFoundation strings.
- @item -fgnu-runtime
- @opindex fgnu-runtime
- Generate object code compatible with the standard GNU Objective-C
- runtime. This is the default for most types of systems.
- @item -fnext-runtime
- @opindex fnext-runtime
- Generate output compatible with the NeXT runtime. This is the default
- for NeXT-based systems, including Darwin and Mac OS X@. The macro
- @code{__NEXT_RUNTIME__} is predefined if (and only if) this option is
- used.
- @item -fno-nil-receivers
- @opindex fno-nil-receivers
- Assume that all Objective-C message dispatches (@code{[receiver
- message:arg]}) in this translation unit ensure that the receiver is
- not @code{nil}. This allows for more efficient entry points in the
- runtime to be used. This option is only available in conjunction with
- the NeXT runtime and ABI version 0 or 1.
- @item -fobjc-abi-version=@var{n}
- @opindex fobjc-abi-version
- Use version @var{n} of the Objective-C ABI for the selected runtime.
- This option is currently supported only for the NeXT runtime. In that
- case, Version 0 is the traditional (32-bit) ABI without support for
- properties and other Objective-C 2.0 additions. Version 1 is the
- traditional (32-bit) ABI with support for properties and other
- Objective-C 2.0 additions. Version 2 is the modern (64-bit) ABI. If
- nothing is specified, the default is Version 0 on 32-bit target
- machines, and Version 2 on 64-bit target machines.
- @item -fobjc-call-cxx-cdtors
- @opindex fobjc-call-cxx-cdtors
- For each Objective-C class, check if any of its instance variables is a
- C++ object with a non-trivial default constructor. If so, synthesize a
- special @code{- (id) .cxx_construct} instance method which runs
- non-trivial default constructors on any such instance variables, in order,
- and then return @code{self}. Similarly, check if any instance variable
- is a C++ object with a non-trivial destructor, and if so, synthesize a
- special @code{- (void) .cxx_destruct} method which runs
- all such default destructors, in reverse order.
- The @code{- (id) .cxx_construct} and @code{- (void) .cxx_destruct}
- methods thusly generated only operate on instance variables
- declared in the current Objective-C class, and not those inherited
- from superclasses. It is the responsibility of the Objective-C
- runtime to invoke all such methods in an object's inheritance
- hierarchy. The @code{- (id) .cxx_construct} methods are invoked
- by the runtime immediately after a new object instance is allocated;
- the @code{- (void) .cxx_destruct} methods are invoked immediately
- before the runtime deallocates an object instance.
- As of this writing, only the NeXT runtime on Mac OS X 10.4 and later has
- support for invoking the @code{- (id) .cxx_construct} and
- @code{- (void) .cxx_destruct} methods.
- @item -fobjc-direct-dispatch
- @opindex fobjc-direct-dispatch
- Allow fast jumps to the message dispatcher. On Darwin this is
- accomplished via the comm page.
- @item -fobjc-exceptions
- @opindex fobjc-exceptions
- Enable syntactic support for structured exception handling in
- Objective-C, similar to what is offered by C++ and Java. This option
- is required to use the Objective-C keywords @code{@@try},
- @code{@@throw}, @code{@@catch}, @code{@@finally} and
- @code{@@synchronized}. This option is available with both the GNU
- runtime and the NeXT runtime (but not available in conjunction with
- the NeXT runtime on Mac OS X 10.2 and earlier).
- @item -fobjc-gc
- @opindex fobjc-gc
- Enable garbage collection (GC) in Objective-C and Objective-C++
- programs. This option is only available with the NeXT runtime; the
- GNU runtime has a different garbage collection implementation that
- does not require special compiler flags.
- @item -fobjc-nilcheck
- @opindex fobjc-nilcheck
- For the NeXT runtime with version 2 of the ABI, check for a nil
- receiver in method invocations before doing the actual method call.
- This is the default and can be disabled using
- @option{-fno-objc-nilcheck}. Class methods and super calls are never
- checked for nil in this way no matter what this flag is set to.
- Currently this flag does nothing when the GNU runtime, or an older
- version of the NeXT runtime ABI, is used.
- @item -fobjc-std=objc1
- @opindex fobjc-std
- Conform to the language syntax of Objective-C 1.0, the language
- recognized by GCC 4.0. This only affects the Objective-C additions to
- the C/C++ language; it does not affect conformance to C/C++ standards,
- which is controlled by the separate C/C++ dialect option flags. When
- this option is used with the Objective-C or Objective-C++ compiler,
- any Objective-C syntax that is not recognized by GCC 4.0 is rejected.
- This is useful if you need to make sure that your Objective-C code can
- be compiled with older versions of GCC@.
- @item -freplace-objc-classes
- @opindex freplace-objc-classes
- Emit a special marker instructing @command{ld(1)} not to statically link in
- the resulting object file, and allow @command{dyld(1)} to load it in at
- run time instead. This is used in conjunction with the Fix-and-Continue
- debugging mode, where the object file in question may be recompiled and
- dynamically reloaded in the course of program execution, without the need
- to restart the program itself. Currently, Fix-and-Continue functionality
- is only available in conjunction with the NeXT runtime on Mac OS X 10.3
- and later.
- @item -fzero-link
- @opindex fzero-link
- When compiling for the NeXT runtime, the compiler ordinarily replaces calls
- to @code{objc_getClass("@dots{}")} (when the name of the class is known at
- compile time) with static class references that get initialized at load time,
- which improves run-time performance. Specifying the @option{-fzero-link} flag
- suppresses this behavior and causes calls to @code{objc_getClass("@dots{}")}
- to be retained. This is useful in Zero-Link debugging mode, since it allows
- for individual class implementations to be modified during program execution.
- The GNU runtime currently always retains calls to @code{objc_get_class("@dots{}")}
- regardless of command-line options.
- @item -fno-local-ivars
- @opindex fno-local-ivars
- @opindex flocal-ivars
- By default instance variables in Objective-C can be accessed as if
- they were local variables from within the methods of the class they're
- declared in. This can lead to shadowing between instance variables
- and other variables declared either locally inside a class method or
- globally with the same name. Specifying the @option{-fno-local-ivars}
- flag disables this behavior thus avoiding variable shadowing issues.
- @item -fivar-visibility=@r{[}public@r{|}protected@r{|}private@r{|}package@r{]}
- @opindex fivar-visibility
- Set the default instance variable visibility to the specified option
- so that instance variables declared outside the scope of any access
- modifier directives default to the specified visibility.
- @item -gen-decls
- @opindex gen-decls
- Dump interface declarations for all classes seen in the source file to a
- file named @file{@var{sourcename}.decl}.
- @item -Wassign-intercept @r{(Objective-C and Objective-C++ only)}
- @opindex Wassign-intercept
- @opindex Wno-assign-intercept
- Warn whenever an Objective-C assignment is being intercepted by the
- garbage collector.
- @item -Wno-protocol @r{(Objective-C and Objective-C++ only)}
- @opindex Wno-protocol
- @opindex Wprotocol
- If a class is declared to implement a protocol, a warning is issued for
- every method in the protocol that is not implemented by the class. The
- default behavior is to issue a warning for every method not explicitly
- implemented in the class, even if a method implementation is inherited
- from the superclass. If you use the @option{-Wno-protocol} option, then
- methods inherited from the superclass are considered to be implemented,
- and no warning is issued for them.
- @item -Wselector @r{(Objective-C and Objective-C++ only)}
- @opindex Wselector
- @opindex Wno-selector
- Warn if multiple methods of different types for the same selector are
- found during compilation. The check is performed on the list of methods
- in the final stage of compilation. Additionally, a check is performed
- for each selector appearing in a @code{@@selector(@dots{})}
- expression, and a corresponding method for that selector has been found
- during compilation. Because these checks scan the method table only at
- the end of compilation, these warnings are not produced if the final
- stage of compilation is not reached, for example because an error is
- found during compilation, or because the @option{-fsyntax-only} option is
- being used.
- @item -Wstrict-selector-match @r{(Objective-C and Objective-C++ only)}
- @opindex Wstrict-selector-match
- @opindex Wno-strict-selector-match
- Warn if multiple methods with differing argument and/or return types are
- found for a given selector when attempting to send a message using this
- selector to a receiver of type @code{id} or @code{Class}. When this flag
- is off (which is the default behavior), the compiler omits such warnings
- if any differences found are confined to types that share the same size
- and alignment.
- @item -Wundeclared-selector @r{(Objective-C and Objective-C++ only)}
- @opindex Wundeclared-selector
- @opindex Wno-undeclared-selector
- Warn if a @code{@@selector(@dots{})} expression referring to an
- undeclared selector is found. A selector is considered undeclared if no
- method with that name has been declared before the
- @code{@@selector(@dots{})} expression, either explicitly in an
- @code{@@interface} or @code{@@protocol} declaration, or implicitly in
- an @code{@@implementation} section. This option always performs its
- checks as soon as a @code{@@selector(@dots{})} expression is found,
- while @option{-Wselector} only performs its checks in the final stage of
- compilation. This also enforces the coding style convention
- that methods and selectors must be declared before being used.
- @item -print-objc-runtime-info
- @opindex print-objc-runtime-info
- Generate C header describing the largest structure that is passed by
- value, if any.
- @end table
- @node Language Independent Options
- @section Options to Control Diagnostic Messages Formatting
- @cindex options to control diagnostics formatting
- @cindex diagnostic messages
- @cindex message formatting
- Traditionally, diagnostic messages have been formatted irrespective of
- the output device's aspect (e.g.@: its width, @dots{}). You can use the
- options described below
- to control the formatting algorithm for diagnostic messages,
- e.g.@: how many characters per line, how often source location
- information should be reported. Note that some language front ends may not
- honor these options.
- @table @gcctabopt
- @item -fmessage-length=@var{n}
- @opindex fmessage-length
- Try to format error messages so that they fit on lines of about
- @var{n} characters. If @var{n} is zero, then no line-wrapping is
- done; each error message appears on a single line. This is the
- default for all front ends.
- @item -fdiagnostics-show-location=once
- @opindex fdiagnostics-show-location
- Only meaningful in line-wrapping mode. Instructs the diagnostic messages
- reporter to emit source location information @emph{once}; that is, in
- case the message is too long to fit on a single physical line and has to
- be wrapped, the source location won't be emitted (as prefix) again,
- over and over, in subsequent continuation lines. This is the default
- behavior.
- @item -fdiagnostics-show-location=every-line
- Only meaningful in line-wrapping mode. Instructs the diagnostic
- messages reporter to emit the same source location information (as
- prefix) for physical lines that result from the process of breaking
- a message which is too long to fit on a single line.
- @item -fdiagnostics-color[=@var{WHEN}]
- @itemx -fno-diagnostics-color
- @opindex fdiagnostics-color
- @cindex highlight, color, colour
- @vindex GCC_COLORS @r{environment variable}
- Use color in diagnostics. @var{WHEN} is @samp{never}, @samp{always},
- or @samp{auto}. The default depends on how the compiler has been configured,
- it can be any of the above @var{WHEN} options or also @samp{never}
- if @env{GCC_COLORS} environment variable isn't present in the environment,
- and @samp{auto} otherwise.
- @samp{auto} means to use color only when the standard error is a terminal.
- The forms @option{-fdiagnostics-color} and @option{-fno-diagnostics-color} are
- aliases for @option{-fdiagnostics-color=always} and
- @option{-fdiagnostics-color=never}, respectively.
- The colors are defined by the environment variable @env{GCC_COLORS}.
- Its value is a colon-separated list of capabilities and Select Graphic
- Rendition (SGR) substrings. SGR commands are interpreted by the
- terminal or terminal emulator. (See the section in the documentation
- of your text terminal for permitted values and their meanings as
- character attributes.) These substring values are integers in decimal
- representation and can be concatenated with semicolons.
- Common values to concatenate include
- @samp{1} for bold,
- @samp{4} for underline,
- @samp{5} for blink,
- @samp{7} for inverse,
- @samp{39} for default foreground color,
- @samp{30} to @samp{37} for foreground colors,
- @samp{90} to @samp{97} for 16-color mode foreground colors,
- @samp{38;5;0} to @samp{38;5;255}
- for 88-color and 256-color modes foreground colors,
- @samp{49} for default background color,
- @samp{40} to @samp{47} for background colors,
- @samp{100} to @samp{107} for 16-color mode background colors,
- and @samp{48;5;0} to @samp{48;5;255}
- for 88-color and 256-color modes background colors.
- The default @env{GCC_COLORS} is
- @smallexample
- error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01
- @end smallexample
- @noindent
- where @samp{01;31} is bold red, @samp{01;35} is bold magenta,
- @samp{01;36} is bold cyan, @samp{01;32} is bold green and
- @samp{01} is bold. Setting @env{GCC_COLORS} to the empty
- string disables colors.
- Supported capabilities are as follows.
- @table @code
- @item error=
- @vindex error GCC_COLORS @r{capability}
- SGR substring for error: markers.
- @item warning=
- @vindex warning GCC_COLORS @r{capability}
- SGR substring for warning: markers.
- @item note=
- @vindex note GCC_COLORS @r{capability}
- SGR substring for note: markers.
- @item caret=
- @vindex caret GCC_COLORS @r{capability}
- SGR substring for caret line.
- @item locus=
- @vindex locus GCC_COLORS @r{capability}
- SGR substring for location information, @samp{file:line} or
- @samp{file:line:column} etc.
- @item quote=
- @vindex quote GCC_COLORS @r{capability}
- SGR substring for information printed within quotes.
- @end table
- @item -fno-diagnostics-show-option
- @opindex fno-diagnostics-show-option
- @opindex fdiagnostics-show-option
- By default, each diagnostic emitted includes text indicating the
- command-line option that directly controls the diagnostic (if such an
- option is known to the diagnostic machinery). Specifying the
- @option{-fno-diagnostics-show-option} flag suppresses that behavior.
- @item -fno-diagnostics-show-caret
- @opindex fno-diagnostics-show-caret
- @opindex fdiagnostics-show-caret
- By default, each diagnostic emitted includes the original source line
- and a caret '^' indicating the column. This option suppresses this
- information. The source line is truncated to @var{n} characters, if
- the @option{-fmessage-length=n} option is given. When the output is done
- to the terminal, the width is limited to the width given by the
- @env{COLUMNS} environment variable or, if not set, to the terminal width.
- @end table
- @node Warning Options
- @section Options to Request or Suppress Warnings
- @cindex options to control warnings
- @cindex warning messages
- @cindex messages, warning
- @cindex suppressing warnings
- Warnings are diagnostic messages that report constructions that
- are not inherently erroneous but that are risky or suggest there
- may have been an error.
- The following language-independent options do not enable specific
- warnings but control the kinds of diagnostics produced by GCC@.
- @table @gcctabopt
- @cindex syntax checking
- @item -fsyntax-only
- @opindex fsyntax-only
- Check the code for syntax errors, but don't do anything beyond that.
- @item -fmax-errors=@var{n}
- @opindex fmax-errors
- Limits the maximum number of error messages to @var{n}, at which point
- GCC bails out rather than attempting to continue processing the source
- code. If @var{n} is 0 (the default), there is no limit on the number
- of error messages produced. If @option{-Wfatal-errors} is also
- specified, then @option{-Wfatal-errors} takes precedence over this
- option.
- @item -w
- @opindex w
- Inhibit all warning messages.
- @item -Werror
- @opindex Werror
- @opindex Wno-error
- Make all warnings into errors.
- @item -Werror=
- @opindex Werror=
- @opindex Wno-error=
- Make the specified warning into an error. The specifier for a warning
- is appended; for example @option{-Werror=switch} turns the warnings
- controlled by @option{-Wswitch} into errors. This switch takes a
- negative form, to be used to negate @option{-Werror} for specific
- warnings; for example @option{-Wno-error=switch} makes
- @option{-Wswitch} warnings not be errors, even when @option{-Werror}
- is in effect.
- The warning message for each controllable warning includes the
- option that controls the warning. That option can then be used with
- @option{-Werror=} and @option{-Wno-error=} as described above.
- (Printing of the option in the warning message can be disabled using the
- @option{-fno-diagnostics-show-option} flag.)
- Note that specifying @option{-Werror=}@var{foo} automatically implies
- @option{-W}@var{foo}. However, @option{-Wno-error=}@var{foo} does not
- imply anything.
- @item -Wfatal-errors
- @opindex Wfatal-errors
- @opindex Wno-fatal-errors
- This option causes the compiler to abort compilation on the first error
- occurred rather than trying to keep going and printing further error
- messages.
- @end table
- You can request many specific warnings with options beginning with
- @samp{-W}, for example @option{-Wimplicit} to request warnings on
- implicit declarations. Each of these specific warning options also
- has a negative form beginning @samp{-Wno-} to turn off warnings; for
- example, @option{-Wno-implicit}. This manual lists only one of the
- two forms, whichever is not the default. For further
- language-specific options also refer to @ref{C++ Dialect Options} and
- @ref{Objective-C and Objective-C++ Dialect Options}.
- Some options, such as @option{-Wall} and @option{-Wextra}, turn on other
- options, such as @option{-Wunused}, which may turn on further options,
- such as @option{-Wunused-value}. The combined effect of positive and
- negative forms is that more specific options have priority over less
- specific ones, independently of their position in the command-line. For
- options of the same specificity, the last one takes effect. Options
- enabled or disabled via pragmas (@pxref{Diagnostic Pragmas}) take effect
- as if they appeared at the end of the command-line.
- When an unrecognized warning option is requested (e.g.,
- @option{-Wunknown-warning}), GCC emits a diagnostic stating
- that the option is not recognized. However, if the @option{-Wno-} form
- is used, the behavior is slightly different: no diagnostic is
- produced for @option{-Wno-unknown-warning} unless other diagnostics
- are being produced. This allows the use of new @option{-Wno-} options
- with old compilers, but if something goes wrong, the compiler
- warns that an unrecognized option is present.
- @table @gcctabopt
- @item -Wpedantic
- @itemx -pedantic
- @opindex pedantic
- @opindex Wpedantic
- Issue all the warnings demanded by strict ISO C and ISO C++;
- reject all programs that use forbidden extensions, and some other
- programs that do not follow ISO C and ISO C++. For ISO C, follows the
- version of the ISO C standard specified by any @option{-std} option used.
- Valid ISO C and ISO C++ programs should compile properly with or without
- this option (though a rare few require @option{-ansi} or a
- @option{-std} option specifying the required version of ISO C)@. However,
- without this option, certain GNU extensions and traditional C and C++
- features are supported as well. With this option, they are rejected.
- @option{-Wpedantic} does not cause warning messages for use of the
- alternate keywords whose names begin and end with @samp{__}. Pedantic
- warnings are also disabled in the expression that follows
- @code{__extension__}. However, only system header files should use
- these escape routes; application programs should avoid them.
- @xref{Alternate Keywords}.
- Some users try to use @option{-Wpedantic} to check programs for strict ISO
- C conformance. They soon find that it does not do quite what they want:
- it finds some non-ISO practices, but not all---only those for which
- ISO C @emph{requires} a diagnostic, and some others for which
- diagnostics have been added.
- A feature to report any failure to conform to ISO C might be useful in
- some instances, but would require considerable additional work and would
- be quite different from @option{-Wpedantic}. We don't have plans to
- support such a feature in the near future.
- Where the standard specified with @option{-std} represents a GNU
- extended dialect of C, such as @samp{gnu90} or @samp{gnu99}, there is a
- corresponding @dfn{base standard}, the version of ISO C on which the GNU
- extended dialect is based. Warnings from @option{-Wpedantic} are given
- where they are required by the base standard. (It does not make sense
- for such warnings to be given only for features not in the specified GNU
- C dialect, since by definition the GNU dialects of C include all
- features the compiler supports with the given option, and there would be
- nothing to warn about.)
- @item -pedantic-errors
- @opindex pedantic-errors
- Give an error whenever the @dfn{base standard} (see @option{-Wpedantic})
- requires a diagnostic, in some cases where there is undefined behavior
- at compile-time and in some other cases that do not prevent compilation
- of programs that are valid according to the standard. This is not
- equivalent to @option{-Werror=pedantic}, since there are errors enabled
- by this option and not enabled by the latter and vice versa.
- @item -Wall
- @opindex Wall
- @opindex Wno-all
- This enables all the warnings about constructions that some users
- consider questionable, and that are easy to avoid (or modify to
- prevent the warning), even in conjunction with macros. This also
- enables some language-specific warnings described in @ref{C++ Dialect
- Options} and @ref{Objective-C and Objective-C++ Dialect Options}.
- @option{-Wall} turns on the following warning flags:
- @gccoptlist{-Waddress @gol
- -Warray-bounds=1 @r{(only with} @option{-O2}@r{)} @gol
- -Wc++11-compat -Wc++14-compat@gol
- -Wchar-subscripts @gol
- -Wenum-compare @r{(in C/ObjC; this is on by default in C++)} @gol
- -Wimplicit-int @r{(C and Objective-C only)} @gol
- -Wimplicit-function-declaration @r{(C and Objective-C only)} @gol
- -Wcomment @gol
- -Wformat @gol
- -Wmain @r{(only for C/ObjC and unless} @option{-ffreestanding}@r{)} @gol
- -Wmaybe-uninitialized @gol
- -Wmissing-braces @r{(only for C/ObjC)} @gol
- -Wnonnull @gol
- -Wopenmp-simd @gol
- -Wparentheses @gol
- -Wpointer-sign @gol
- -Wreorder @gol
- -Wreturn-type @gol
- -Wsequence-point @gol
- -Wsign-compare @r{(only in C++)} @gol
- -Wstrict-aliasing @gol
- -Wstrict-overflow=1 @gol
- -Wswitch @gol
- -Wtrigraphs @gol
- -Wuninitialized @gol
- -Wunknown-pragmas @gol
- -Wunused-function @gol
- -Wunused-label @gol
- -Wunused-value @gol
- -Wunused-variable @gol
- -Wvolatile-register-var @gol
- }
- Note that some warning flags are not implied by @option{-Wall}. Some of
- them warn about constructions that users generally do not consider
- questionable, but which occasionally you might wish to check for;
- others warn about constructions that are necessary or hard to avoid in
- some cases, and there is no simple way to modify the code to suppress
- the warning. Some of them are enabled by @option{-Wextra} but many of
- them must be enabled individually.
- @item -Wextra
- @opindex W
- @opindex Wextra
- @opindex Wno-extra
- This enables some extra warning flags that are not enabled by
- @option{-Wall}. (This option used to be called @option{-W}. The older
- name is still supported, but the newer name is more descriptive.)
- @gccoptlist{-Wclobbered @gol
- -Wempty-body @gol
- -Wignored-qualifiers @gol
- -Wmissing-field-initializers @gol
- -Wmissing-parameter-type @r{(C only)} @gol
- -Wold-style-declaration @r{(C only)} @gol
- -Woverride-init @gol
- -Wsign-compare @gol
- -Wtype-limits @gol
- -Wuninitialized @gol
- -Wunused-parameter @r{(only with} @option{-Wunused} @r{or} @option{-Wall}@r{)} @gol
- -Wunused-but-set-parameter @r{(only with} @option{-Wunused} @r{or} @option{-Wall}@r{)} @gol
- }
- The option @option{-Wextra} also prints warning messages for the
- following cases:
- @itemize @bullet
- @item
- A pointer is compared against integer zero with @code{<}, @code{<=},
- @code{>}, or @code{>=}.
- @item
- (C++ only) An enumerator and a non-enumerator both appear in a
- conditional expression.
- @item
- (C++ only) Ambiguous virtual bases.
- @item
- (C++ only) Subscripting an array that has been declared @code{register}.
- @item
- (C++ only) Taking the address of a variable that has been declared
- @code{register}.
- @item
- (C++ only) A base class is not initialized in a derived class's copy
- constructor.
- @end itemize
- @item -Wchar-subscripts
- @opindex Wchar-subscripts
- @opindex Wno-char-subscripts
- Warn if an array subscript has type @code{char}. This is a common cause
- of error, as programmers often forget that this type is signed on some
- machines.
- This warning is enabled by @option{-Wall}.
- @item -Wcomment
- @opindex Wcomment
- @opindex Wno-comment
- Warn whenever a comment-start sequence @samp{/*} appears in a @samp{/*}
- comment, or whenever a Backslash-Newline appears in a @samp{//} comment.
- This warning is enabled by @option{-Wall}.
- @item -Wno-coverage-mismatch
- @opindex Wno-coverage-mismatch
- Warn if feedback profiles do not match when using the
- @option{-fprofile-use} option.
- If a source file is changed between compiling with @option{-fprofile-gen} and
- with @option{-fprofile-use}, the files with the profile feedback can fail
- to match the source file and GCC cannot use the profile feedback
- information. By default, this warning is enabled and is treated as an
- error. @option{-Wno-coverage-mismatch} can be used to disable the
- warning or @option{-Wno-error=coverage-mismatch} can be used to
- disable the error. Disabling the error for this warning can result in
- poorly optimized code and is useful only in the
- case of very minor changes such as bug fixes to an existing code-base.
- Completely disabling the warning is not recommended.
- @item -Wno-cpp
- @r{(C, Objective-C, C++, Objective-C++ and Fortran only)}
- Suppress warning messages emitted by @code{#warning} directives.
- @item -Wdouble-promotion @r{(C, C++, Objective-C and Objective-C++ only)}
- @opindex Wdouble-promotion
- @opindex Wno-double-promotion
- Give a warning when a value of type @code{float} is implicitly
- promoted to @code{double}. CPUs with a 32-bit ``single-precision''
- floating-point unit implement @code{float} in hardware, but emulate
- @code{double} in software. On such a machine, doing computations
- using @code{double} values is much more expensive because of the
- overhead required for software emulation.
- It is easy to accidentally do computations with @code{double} because
- floating-point literals are implicitly of type @code{double}. For
- example, in:
- @smallexample
- @group
- float area(float radius)
- @{
- return 3.14159 * radius * radius;
- @}
- @end group
- @end smallexample
- the compiler performs the entire computation with @code{double}
- because the floating-point literal is a @code{double}.
- @item -Wformat
- @itemx -Wformat=@var{n}
- @opindex Wformat
- @opindex Wno-format
- @opindex ffreestanding
- @opindex fno-builtin
- @opindex Wformat=
- Check calls to @code{printf} and @code{scanf}, etc., to make sure that
- the arguments supplied have types appropriate to the format string
- specified, and that the conversions specified in the format string make
- sense. This includes standard functions, and others specified by format
- attributes (@pxref{Function Attributes}), in the @code{printf},
- @code{scanf}, @code{strftime} and @code{strfmon} (an X/Open extension,
- not in the C standard) families (or other target-specific families).
- Which functions are checked without format attributes having been
- specified depends on the standard version selected, and such checks of
- functions without the attribute specified are disabled by
- @option{-ffreestanding} or @option{-fno-builtin}.
- The formats are checked against the format features supported by GNU
- libc version 2.2. These include all ISO C90 and C99 features, as well
- as features from the Single Unix Specification and some BSD and GNU
- extensions. Other library implementations may not support all these
- features; GCC does not support warning about features that go beyond a
- particular library's limitations. However, if @option{-Wpedantic} is used
- with @option{-Wformat}, warnings are given about format features not
- in the selected standard version (but not for @code{strfmon} formats,
- since those are not in any version of the C standard). @xref{C Dialect
- Options,,Options Controlling C Dialect}.
- @table @gcctabopt
- @item -Wformat=1
- @itemx -Wformat
- @opindex Wformat
- @opindex Wformat=1
- Option @option{-Wformat} is equivalent to @option{-Wformat=1}, and
- @option{-Wno-format} is equivalent to @option{-Wformat=0}. Since
- @option{-Wformat} also checks for null format arguments for several
- functions, @option{-Wformat} also implies @option{-Wnonnull}. Some
- aspects of this level of format checking can be disabled by the
- options: @option{-Wno-format-contains-nul},
- @option{-Wno-format-extra-args}, and @option{-Wno-format-zero-length}.
- @option{-Wformat} is enabled by @option{-Wall}.
- @item -Wno-format-contains-nul
- @opindex Wno-format-contains-nul
- @opindex Wformat-contains-nul
- If @option{-Wformat} is specified, do not warn about format strings that
- contain NUL bytes.
- @item -Wno-format-extra-args
- @opindex Wno-format-extra-args
- @opindex Wformat-extra-args
- If @option{-Wformat} is specified, do not warn about excess arguments to a
- @code{printf} or @code{scanf} format function. The C standard specifies
- that such arguments are ignored.
- Where the unused arguments lie between used arguments that are
- specified with @samp{$} operand number specifications, normally
- warnings are still given, since the implementation could not know what
- type to pass to @code{va_arg} to skip the unused arguments. However,
- in the case of @code{scanf} formats, this option suppresses the
- warning if the unused arguments are all pointers, since the Single
- Unix Specification says that such unused arguments are allowed.
- @item -Wno-format-zero-length
- @opindex Wno-format-zero-length
- @opindex Wformat-zero-length
- If @option{-Wformat} is specified, do not warn about zero-length formats.
- The C standard specifies that zero-length formats are allowed.
- @item -Wformat=2
- @opindex Wformat=2
- Enable @option{-Wformat} plus additional format checks. Currently
- equivalent to @option{-Wformat -Wformat-nonliteral -Wformat-security
- -Wformat-y2k}.
- @item -Wformat-nonliteral
- @opindex Wformat-nonliteral
- @opindex Wno-format-nonliteral
- If @option{-Wformat} is specified, also warn if the format string is not a
- string literal and so cannot be checked, unless the format function
- takes its format arguments as a @code{va_list}.
- @item -Wformat-security
- @opindex Wformat-security
- @opindex Wno-format-security
- If @option{-Wformat} is specified, also warn about uses of format
- functions that represent possible security problems. At present, this
- warns about calls to @code{printf} and @code{scanf} functions where the
- format string is not a string literal and there are no format arguments,
- as in @code{printf (foo);}. This may be a security hole if the format
- string came from untrusted input and contains @samp{%n}. (This is
- currently a subset of what @option{-Wformat-nonliteral} warns about, but
- in future warnings may be added to @option{-Wformat-security} that are not
- included in @option{-Wformat-nonliteral}.)
- @item -Wformat-signedness
- @opindex Wformat-signedness
- @opindex Wno-format-signedness
- If @option{-Wformat} is specified, also warn if the format string
- requires an unsigned argument and the argument is signed and vice versa.
- @item -Wformat-y2k
- @opindex Wformat-y2k
- @opindex Wno-format-y2k
- If @option{-Wformat} is specified, also warn about @code{strftime}
- formats that may yield only a two-digit year.
- @end table
- @item -Wnonnull
- @opindex Wnonnull
- @opindex Wno-nonnull
- Warn about passing a null pointer for arguments marked as
- requiring a non-null value by the @code{nonnull} function attribute.
- @option{-Wnonnull} is included in @option{-Wall} and @option{-Wformat}. It
- can be disabled with the @option{-Wno-nonnull} option.
- @item -Winit-self @r{(C, C++, Objective-C and Objective-C++ only)}
- @opindex Winit-self
- @opindex Wno-init-self
- Warn about uninitialized variables that are initialized with themselves.
- Note this option can only be used with the @option{-Wuninitialized} option.
- For example, GCC warns about @code{i} being uninitialized in the
- following snippet only when @option{-Winit-self} has been specified:
- @smallexample
- @group
- int f()
- @{
- int i = i;
- return i;
- @}
- @end group
- @end smallexample
- This warning is enabled by @option{-Wall} in C++.
- @item -Wimplicit-int @r{(C and Objective-C only)}
- @opindex Wimplicit-int
- @opindex Wno-implicit-int
- Warn when a declaration does not specify a type.
- This warning is enabled by @option{-Wall}.
- @item -Wimplicit-function-declaration @r{(C and Objective-C only)}
- @opindex Wimplicit-function-declaration
- @opindex Wno-implicit-function-declaration
- Give a warning whenever a function is used before being declared. In
- C99 mode (@option{-std=c99} or @option{-std=gnu99}), this warning is
- enabled by default and it is made into an error by
- @option{-pedantic-errors}. This warning is also enabled by
- @option{-Wall}.
- @item -Wimplicit @r{(C and Objective-C only)}
- @opindex Wimplicit
- @opindex Wno-implicit
- Same as @option{-Wimplicit-int} and @option{-Wimplicit-function-declaration}.
- This warning is enabled by @option{-Wall}.
- @item -Wignored-qualifiers @r{(C and C++ only)}
- @opindex Wignored-qualifiers
- @opindex Wno-ignored-qualifiers
- Warn if the return type of a function has a type qualifier
- such as @code{const}. For ISO C such a type qualifier has no effect,
- since the value returned by a function is not an lvalue.
- For C++, the warning is only emitted for scalar types or @code{void}.
- ISO C prohibits qualified @code{void} return types on function
- definitions, so such return types always receive a warning
- even without this option.
- This warning is also enabled by @option{-Wextra}.
- @item -Wmain
- @opindex Wmain
- @opindex Wno-main
- Warn if the type of @code{main} is suspicious. @code{main} should be
- a function with external linkage, returning int, taking either zero
- arguments, two, or three arguments of appropriate types. This warning
- is enabled by default in C++ and is enabled by either @option{-Wall}
- or @option{-Wpedantic}.
- @item -Wmissing-braces
- @opindex Wmissing-braces
- @opindex Wno-missing-braces
- Warn if an aggregate or union initializer is not fully bracketed. In
- the following example, the initializer for @code{a} is not fully
- bracketed, but that for @code{b} is fully bracketed. This warning is
- enabled by @option{-Wall} in C.
- @smallexample
- int a[2][2] = @{ 0, 1, 2, 3 @};
- int b[2][2] = @{ @{ 0, 1 @}, @{ 2, 3 @} @};
- @end smallexample
- This warning is enabled by @option{-Wall}.
- @item -Wmissing-include-dirs @r{(C, C++, Objective-C and Objective-C++ only)}
- @opindex Wmissing-include-dirs
- @opindex Wno-missing-include-dirs
- Warn if a user-supplied include directory does not exist.
- @item -Wparentheses
- @opindex Wparentheses
- @opindex Wno-parentheses
- Warn if parentheses are omitted in certain contexts, such
- as when there is an assignment in a context where a truth value
- is expected, or when operators are nested whose precedence people
- often get confused about.
- Also warn if a comparison like @code{x<=y<=z} appears; this is
- equivalent to @code{(x<=y ? 1 : 0) <= z}, which is a different
- interpretation from that of ordinary mathematical notation.
- Also warn about constructions where there may be confusion to which
- @code{if} statement an @code{else} branch belongs. Here is an example of
- such a case:
- @smallexample
- @group
- @{
- if (a)
- if (b)
- foo ();
- else
- bar ();
- @}
- @end group
- @end smallexample
- In C/C++, every @code{else} branch belongs to the innermost possible
- @code{if} statement, which in this example is @code{if (b)}. This is
- often not what the programmer expected, as illustrated in the above
- example by indentation the programmer chose. When there is the
- potential for this confusion, GCC issues a warning when this flag
- is specified. To eliminate the warning, add explicit braces around
- the innermost @code{if} statement so there is no way the @code{else}
- can belong to the enclosing @code{if}. The resulting code
- looks like this:
- @smallexample
- @group
- @{
- if (a)
- @{
- if (b)
- foo ();
- else
- bar ();
- @}
- @}
- @end group
- @end smallexample
- Also warn for dangerous uses of the GNU extension to
- @code{?:} with omitted middle operand. When the condition
- in the @code{?}: operator is a boolean expression, the omitted value is
- always 1. Often programmers expect it to be a value computed
- inside the conditional expression instead.
- This warning is enabled by @option{-Wall}.
- @item -Wsequence-point
- @opindex Wsequence-point
- @opindex Wno-sequence-point
- Warn about code that may have undefined semantics because of violations
- of sequence point rules in the C and C++ standards.
- The C and C++ standards define the order in which expressions in a C/C++
- program are evaluated in terms of @dfn{sequence points}, which represent
- a partial ordering between the execution of parts of the program: those
- executed before the sequence point, and those executed after it. These
- occur after the evaluation of a full expression (one which is not part
- of a larger expression), after the evaluation of the first operand of a
- @code{&&}, @code{||}, @code{? :} or @code{,} (comma) operator, before a
- function is called (but after the evaluation of its arguments and the
- expression denoting the called function), and in certain other places.
- Other than as expressed by the sequence point rules, the order of
- evaluation of subexpressions of an expression is not specified. All
- these rules describe only a partial order rather than a total order,
- since, for example, if two functions are called within one expression
- with no sequence point between them, the order in which the functions
- are called is not specified. However, the standards committee have
- ruled that function calls do not overlap.
- It is not specified when between sequence points modifications to the
- values of objects take effect. Programs whose behavior depends on this
- have undefined behavior; the C and C++ standards specify that ``Between
- the previous and next sequence point an object shall have its stored
- value modified at most once by the evaluation of an expression.
- Furthermore, the prior value shall be read only to determine the value
- to be stored.''. If a program breaks these rules, the results on any
- particular implementation are entirely unpredictable.
- Examples of code with undefined behavior are @code{a = a++;}, @code{a[n]
- = b[n++]} and @code{a[i++] = i;}. Some more complicated cases are not
- diagnosed by this option, and it may give an occasional false positive
- result, but in general it has been found fairly effective at detecting
- this sort of problem in programs.
- The standard is worded confusingly, therefore there is some debate
- over the precise meaning of the sequence point rules in subtle cases.
- Links to discussions of the problem, including proposed formal
- definitions, may be found on the GCC readings page, at
- @uref{http://gcc.gnu.org/@/readings.html}.
- This warning is enabled by @option{-Wall} for C and C++.
- @item -Wno-return-local-addr
- @opindex Wno-return-local-addr
- @opindex Wreturn-local-addr
- Do not warn about returning a pointer (or in C++, a reference) to a
- variable that goes out of scope after the function returns.
- @item -Wreturn-type
- @opindex Wreturn-type
- @opindex Wno-return-type
- Warn whenever a function is defined with a return type that defaults
- to @code{int}. Also warn about any @code{return} statement with no
- return value in a function whose return type is not @code{void}
- (falling off the end of the function body is considered returning
- without a value), and about a @code{return} statement with an
- expression in a function whose return type is @code{void}.
- For C++, a function without return type always produces a diagnostic
- message, even when @option{-Wno-return-type} is specified. The only
- exceptions are @code{main} and functions defined in system headers.
- This warning is enabled by @option{-Wall}.
- @item -Wshift-count-negative
- @opindex Wshift-count-negative
- @opindex Wno-shift-count-negative
- Warn if shift count is negative. This warning is enabled by default.
- @item -Wshift-count-overflow
- @opindex Wshift-count-overflow
- @opindex Wno-shift-count-overflow
- Warn if shift count >= width of type. This warning is enabled by default.
- @item -Wswitch
- @opindex Wswitch
- @opindex Wno-switch
- Warn whenever a @code{switch} statement has an index of enumerated type
- and lacks a @code{case} for one or more of the named codes of that
- enumeration. (The presence of a @code{default} label prevents this
- warning.) @code{case} labels outside the enumeration range also
- provoke warnings when this option is used (even if there is a
- @code{default} label).
- This warning is enabled by @option{-Wall}.
- @item -Wswitch-default
- @opindex Wswitch-default
- @opindex Wno-switch-default
- Warn whenever a @code{switch} statement does not have a @code{default}
- case.
- @item -Wswitch-enum
- @opindex Wswitch-enum
- @opindex Wno-switch-enum
- Warn whenever a @code{switch} statement has an index of enumerated type
- and lacks a @code{case} for one or more of the named codes of that
- enumeration. @code{case} labels outside the enumeration range also
- provoke warnings when this option is used. The only difference
- between @option{-Wswitch} and this option is that this option gives a
- warning about an omitted enumeration code even if there is a
- @code{default} label.
- @item -Wswitch-bool
- @opindex Wswitch-bool
- @opindex Wno-switch-bool
- Warn whenever a @code{switch} statement has an index of boolean type.
- It is possible to suppress this warning by casting the controlling
- expression to a type other than @code{bool}. For example:
- @smallexample
- @group
- switch ((int) (a == 4))
- @{
- @dots{}
- @}
- @end group
- @end smallexample
- This warning is enabled by default for C and C++ programs.
- @item -Wsync-nand @r{(C and C++ only)}
- @opindex Wsync-nand
- @opindex Wno-sync-nand
- Warn when @code{__sync_fetch_and_nand} and @code{__sync_nand_and_fetch}
- built-in functions are used. These functions changed semantics in GCC 4.4.
- @item -Wtrigraphs
- @opindex Wtrigraphs
- @opindex Wno-trigraphs
- Warn if any trigraphs are encountered that might change the meaning of
- the program (trigraphs within comments are not warned about).
- This warning is enabled by @option{-Wall}.
- @item -Wunused-but-set-parameter
- @opindex Wunused-but-set-parameter
- @opindex Wno-unused-but-set-parameter
- Warn whenever a function parameter is assigned to, but otherwise unused
- (aside from its declaration).
- To suppress this warning use the @code{unused} attribute
- (@pxref{Variable Attributes}).
- This warning is also enabled by @option{-Wunused} together with
- @option{-Wextra}.
- @item -Wunused-but-set-variable
- @opindex Wunused-but-set-variable
- @opindex Wno-unused-but-set-variable
- Warn whenever a local variable is assigned to, but otherwise unused
- (aside from its declaration).
- This warning is enabled by @option{-Wall}.
- To suppress this warning use the @code{unused} attribute
- (@pxref{Variable Attributes}).
- This warning is also enabled by @option{-Wunused}, which is enabled
- by @option{-Wall}.
- @item -Wunused-function
- @opindex Wunused-function
- @opindex Wno-unused-function
- Warn whenever a static function is declared but not defined or a
- non-inline static function is unused.
- This warning is enabled by @option{-Wall}.
- @item -Wunused-label
- @opindex Wunused-label
- @opindex Wno-unused-label
- Warn whenever a label is declared but not used.
- This warning is enabled by @option{-Wall}.
- To suppress this warning use the @code{unused} attribute
- (@pxref{Variable Attributes}).
- @item -Wunused-local-typedefs @r{(C, Objective-C, C++ and Objective-C++ only)}
- @opindex Wunused-local-typedefs
- Warn when a typedef locally defined in a function is not used.
- This warning is enabled by @option{-Wall}.
- @item -Wunused-parameter
- @opindex Wunused-parameter
- @opindex Wno-unused-parameter
- Warn whenever a function parameter is unused aside from its declaration.
- To suppress this warning use the @code{unused} attribute
- (@pxref{Variable Attributes}).
- @item -Wno-unused-result
- @opindex Wunused-result
- @opindex Wno-unused-result
- Do not warn if a caller of a function marked with attribute
- @code{warn_unused_result} (@pxref{Function Attributes}) does not use
- its return value. The default is @option{-Wunused-result}.
- @item -Wunused-variable
- @opindex Wunused-variable
- @opindex Wno-unused-variable
- Warn whenever a local variable or non-constant static variable is unused
- aside from its declaration.
- This warning is enabled by @option{-Wall}.
- To suppress this warning use the @code{unused} attribute
- (@pxref{Variable Attributes}).
- @item -Wunused-value
- @opindex Wunused-value
- @opindex Wno-unused-value
- Warn whenever a statement computes a result that is explicitly not
- used. To suppress this warning cast the unused expression to
- @code{void}. This includes an expression-statement or the left-hand
- side of a comma expression that contains no side effects. For example,
- an expression such as @code{x[i,j]} causes a warning, while
- @code{x[(void)i,j]} does not.
- This warning is enabled by @option{-Wall}.
- @item -Wunused
- @opindex Wunused
- @opindex Wno-unused
- All the above @option{-Wunused} options combined.
- In order to get a warning about an unused function parameter, you must
- either specify @option{-Wextra -Wunused} (note that @option{-Wall} implies
- @option{-Wunused}), or separately specify @option{-Wunused-parameter}.
- @item -Wuninitialized
- @opindex Wuninitialized
- @opindex Wno-uninitialized
- Warn if an automatic variable is used without first being initialized
- or if a variable may be clobbered by a @code{setjmp} call. In C++,
- warn if a non-static reference or non-static @code{const} member
- appears in a class without constructors.
- If you want to warn about code that uses the uninitialized value of the
- variable in its own initializer, use the @option{-Winit-self} option.
- These warnings occur for individual uninitialized or clobbered
- elements of structure, union or array variables as well as for
- variables that are uninitialized or clobbered as a whole. They do
- not occur for variables or elements declared @code{volatile}. Because
- these warnings depend on optimization, the exact variables or elements
- for which there are warnings depends on the precise optimization
- options and version of GCC used.
- Note that there may be no warning about a variable that is used only
- to compute a value that itself is never used, because such
- computations may be deleted by data flow analysis before the warnings
- are printed.
- @item -Wmaybe-uninitialized
- @opindex Wmaybe-uninitialized
- @opindex Wno-maybe-uninitialized
- For an automatic variable, if there exists a path from the function
- entry to a use of the variable that is initialized, but there exist
- some other paths for which the variable is not initialized, the compiler
- emits a warning if it cannot prove the uninitialized paths are not
- executed at run time. These warnings are made optional because GCC is
- not smart enough to see all the reasons why the code might be correct
- in spite of appearing to have an error. Here is one example of how
- this can happen:
- @smallexample
- @group
- @{
- int x;
- switch (y)
- @{
- case 1: x = 1;
- break;
- case 2: x = 4;
- break;
- case 3: x = 5;
- @}
- foo (x);
- @}
- @end group
- @end smallexample
- @noindent
- If the value of @code{y} is always 1, 2 or 3, then @code{x} is
- always initialized, but GCC doesn't know this. To suppress the
- warning, you need to provide a default case with assert(0) or
- similar code.
- @cindex @code{longjmp} warnings
- This option also warns when a non-volatile automatic variable might be
- changed by a call to @code{longjmp}. These warnings as well are possible
- only in optimizing compilation.
- The compiler sees only the calls to @code{setjmp}. It cannot know
- where @code{longjmp} will be called; in fact, a signal handler could
- call it at any point in the code. As a result, you may get a warning
- even when there is in fact no problem because @code{longjmp} cannot
- in fact be called at the place that would cause a problem.
- Some spurious warnings can be avoided if you declare all the functions
- you use that never return as @code{noreturn}. @xref{Function
- Attributes}.
- This warning is enabled by @option{-Wall} or @option{-Wextra}.
- @item -Wunknown-pragmas
- @opindex Wunknown-pragmas
- @opindex Wno-unknown-pragmas
- @cindex warning for unknown pragmas
- @cindex unknown pragmas, warning
- @cindex pragmas, warning of unknown
- Warn when a @code{#pragma} directive is encountered that is not understood by
- GCC@. If this command-line option is used, warnings are even issued
- for unknown pragmas in system header files. This is not the case if
- the warnings are only enabled by the @option{-Wall} command-line option.
- @item -Wno-pragmas
- @opindex Wno-pragmas
- @opindex Wpragmas
- Do not warn about misuses of pragmas, such as incorrect parameters,
- invalid syntax, or conflicts between pragmas. See also
- @option{-Wunknown-pragmas}.
- @item -Wstrict-aliasing
- @opindex Wstrict-aliasing
- @opindex Wno-strict-aliasing
- This option is only active when @option{-fstrict-aliasing} is active.
- It warns about code that might break the strict aliasing rules that the
- compiler is using for optimization. The warning does not catch all
- cases, but does attempt to catch the more common pitfalls. It is
- included in @option{-Wall}.
- It is equivalent to @option{-Wstrict-aliasing=3}
- @item -Wstrict-aliasing=n
- @opindex Wstrict-aliasing=n
- This option is only active when @option{-fstrict-aliasing} is active.
- It warns about code that might break the strict aliasing rules that the
- compiler is using for optimization.
- Higher levels correspond to higher accuracy (fewer false positives).
- Higher levels also correspond to more effort, similar to the way @option{-O}
- works.
- @option{-Wstrict-aliasing} is equivalent to @option{-Wstrict-aliasing=3}.
- Level 1: Most aggressive, quick, least accurate.
- Possibly useful when higher levels
- do not warn but @option{-fstrict-aliasing} still breaks the code, as it has very few
- false negatives. However, it has many false positives.
- Warns for all pointer conversions between possibly incompatible types,
- even if never dereferenced. Runs in the front end only.
- Level 2: Aggressive, quick, not too precise.
- May still have many false positives (not as many as level 1 though),
- and few false negatives (but possibly more than level 1).
- Unlike level 1, it only warns when an address is taken. Warns about
- incomplete types. Runs in the front end only.
- Level 3 (default for @option{-Wstrict-aliasing}):
- Should have very few false positives and few false
- negatives. Slightly slower than levels 1 or 2 when optimization is enabled.
- Takes care of the common pun+dereference pattern in the front end:
- @code{*(int*)&some_float}.
- If optimization is enabled, it also runs in the back end, where it deals
- with multiple statement cases using flow-sensitive points-to information.
- Only warns when the converted pointer is dereferenced.
- Does not warn about incomplete types.
- @item -Wstrict-overflow
- @itemx -Wstrict-overflow=@var{n}
- @opindex Wstrict-overflow
- @opindex Wno-strict-overflow
- This option is only active when @option{-fstrict-overflow} is active.
- It warns about cases where the compiler optimizes based on the
- assumption that signed overflow does not occur. Note that it does not
- warn about all cases where the code might overflow: it only warns
- about cases where the compiler implements some optimization. Thus
- this warning depends on the optimization level.
- An optimization that assumes that signed overflow does not occur is
- perfectly safe if the values of the variables involved are such that
- overflow never does, in fact, occur. Therefore this warning can
- easily give a false positive: a warning about code that is not
- actually a problem. To help focus on important issues, several
- warning levels are defined. No warnings are issued for the use of
- undefined signed overflow when estimating how many iterations a loop
- requires, in particular when determining whether a loop will be
- executed at all.
- @table @gcctabopt
- @item -Wstrict-overflow=1
- Warn about cases that are both questionable and easy to avoid. For
- example, with @option{-fstrict-overflow}, the compiler simplifies
- @code{x + 1 > x} to @code{1}. This level of
- @option{-Wstrict-overflow} is enabled by @option{-Wall}; higher levels
- are not, and must be explicitly requested.
- @item -Wstrict-overflow=2
- Also warn about other cases where a comparison is simplified to a
- constant. For example: @code{abs (x) >= 0}. This can only be
- simplified when @option{-fstrict-overflow} is in effect, because
- @code{abs (INT_MIN)} overflows to @code{INT_MIN}, which is less than
- zero. @option{-Wstrict-overflow} (with no level) is the same as
- @option{-Wstrict-overflow=2}.
- @item -Wstrict-overflow=3
- Also warn about other cases where a comparison is simplified. For
- example: @code{x + 1 > 1} is simplified to @code{x > 0}.
- @item -Wstrict-overflow=4
- Also warn about other simplifications not covered by the above cases.
- For example: @code{(x * 10) / 5} is simplified to @code{x * 2}.
- @item -Wstrict-overflow=5
- Also warn about cases where the compiler reduces the magnitude of a
- constant involved in a comparison. For example: @code{x + 2 > y} is
- simplified to @code{x + 1 >= y}. This is reported only at the
- highest warning level because this simplification applies to many
- comparisons, so this warning level gives a very large number of
- false positives.
- @end table
- @item -Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{|}format@r{]}
- @opindex Wsuggest-attribute=
- @opindex Wno-suggest-attribute=
- Warn for cases where adding an attribute may be beneficial. The
- attributes currently supported are listed below.
- @table @gcctabopt
- @item -Wsuggest-attribute=pure
- @itemx -Wsuggest-attribute=const
- @itemx -Wsuggest-attribute=noreturn
- @opindex Wsuggest-attribute=pure
- @opindex Wno-suggest-attribute=pure
- @opindex Wsuggest-attribute=const
- @opindex Wno-suggest-attribute=const
- @opindex Wsuggest-attribute=noreturn
- @opindex Wno-suggest-attribute=noreturn
- Warn about functions that might be candidates for attributes
- @code{pure}, @code{const} or @code{noreturn}. The compiler only warns for
- functions visible in other compilation units or (in the case of @code{pure} and
- @code{const}) if it cannot prove that the function returns normally. A function
- returns normally if it doesn't contain an infinite loop or return abnormally
- by throwing, calling @code{abort} or trapping. This analysis requires option
- @option{-fipa-pure-const}, which is enabled by default at @option{-O} and
- higher. Higher optimization levels improve the accuracy of the analysis.
- @item -Wsuggest-attribute=format
- @itemx -Wmissing-format-attribute
- @opindex Wsuggest-attribute=format
- @opindex Wmissing-format-attribute
- @opindex Wno-suggest-attribute=format
- @opindex Wno-missing-format-attribute
- @opindex Wformat
- @opindex Wno-format
- Warn about function pointers that might be candidates for @code{format}
- attributes. Note these are only possible candidates, not absolute ones.
- GCC guesses that function pointers with @code{format} attributes that
- are used in assignment, initialization, parameter passing or return
- statements should have a corresponding @code{format} attribute in the
- resulting type. I.e.@: the left-hand side of the assignment or
- initialization, the type of the parameter variable, or the return type
- of the containing function respectively should also have a @code{format}
- attribute to avoid the warning.
- GCC also warns about function definitions that might be
- candidates for @code{format} attributes. Again, these are only
- possible candidates. GCC guesses that @code{format} attributes
- might be appropriate for any function that calls a function like
- @code{vprintf} or @code{vscanf}, but this might not always be the
- case, and some functions for which @code{format} attributes are
- appropriate may not be detected.
- @end table
- @item -Wsuggest-final-types
- @opindex Wno-suggest-final-types
- @opindex Wsuggest-final-types
- Warn about types with virtual methods where code quality would be improved
- if the type were declared with the C++11 @code{final} specifier,
- or, if possible,
- declared in an anonymous namespace. This allows GCC to more aggressively
- devirtualize the polymorphic calls. This warning is more effective with link
- time optimization, where the information about the class hierarchy graph is
- more complete.
- @item -Wsuggest-final-methods
- @opindex Wno-suggest-final-methods
- @opindex Wsuggest-final-methods
- Warn about virtual methods where code quality would be improved if the method
- were declared with the C++11 @code{final} specifier,
- or, if possible, its type were
- declared in an anonymous namespace or with the @code{final} specifier.
- This warning is
- more effective with link time optimization, where the information about the
- class hierarchy graph is more complete. It is recommended to first consider
- suggestions of @option{-Wsuggest-final-types} and then rebuild with new
- annotations.
- @item -Wsuggest-override
- Warn about overriding virtual functions that are not marked with the override
- keyword.
- @item -Warray-bounds
- @itemx -Warray-bounds=@var{n}
- @opindex Wno-array-bounds
- @opindex Warray-bounds
- This option is only active when @option{-ftree-vrp} is active
- (default for @option{-O2} and above). It warns about subscripts to arrays
- that are always out of bounds. This warning is enabled by @option{-Wall}.
- @table @gcctabopt
- @item -Warray-bounds=1
- This is the warning level of @option{-Warray-bounds} and is enabled
- by @option{-Wall}; higher levels are not, and must be explicitly requested.
- @item -Warray-bounds=2
- This warning level also warns about out of bounds access for
- arrays at the end of a struct and for arrays accessed through
- pointers. This warning level may give a larger number of
- false positives and is deactivated by default.
- @end table
- @item -Wbool-compare
- @opindex Wno-bool-compare
- @opindex Wbool-compare
- Warn about boolean expression compared with an integer value different from
- @code{true}/@code{false}. For instance, the following comparison is
- always false:
- @smallexample
- int n = 5;
- @dots{}
- if ((n > 1) == 2) @{ @dots{} @}
- @end smallexample
- This warning is enabled by @option{-Wall}.
- @item -Wno-discarded-qualifiers @r{(C and Objective-C only)}
- @opindex Wno-discarded-qualifiers
- @opindex Wdiscarded-qualifiers
- Do not warn if type qualifiers on pointers are being discarded.
- Typically, the compiler warns if a @code{const char *} variable is
- passed to a function that takes a @code{char *} parameter. This option
- can be used to suppress such a warning.
- @item -Wno-discarded-array-qualifiers @r{(C and Objective-C only)}
- @opindex Wno-discarded-array-qualifiers
- @opindex Wdiscarded-array-qualifiers
- Do not warn if type qualifiers on arrays which are pointer targets
- are being discarded. Typically, the compiler warns if a
- @code{const int (*)[]} variable is passed to a function that
- takes a @code{int (*)[]} parameter. This option can be used to
- suppress such a warning.
- @item -Wno-incompatible-pointer-types @r{(C and Objective-C only)}
- @opindex Wno-incompatible-pointer-types
- @opindex Wincompatible-pointer-types
- Do not warn when there is a conversion between pointers that have incompatible
- types. This warning is for cases not covered by @option{-Wno-pointer-sign},
- which warns for pointer argument passing or assignment with different
- signedness.
- @item -Wno-int-conversion @r{(C and Objective-C only)}
- @opindex Wno-int-conversion
- @opindex Wint-conversion
- Do not warn about incompatible integer to pointer and pointer to integer
- conversions. This warning is about implicit conversions; for explicit
- conversions the warnings @option{-Wno-int-to-pointer-cast} and
- @option{-Wno-pointer-to-int-cast} may be used.
- @item -Wno-div-by-zero
- @opindex Wno-div-by-zero
- @opindex Wdiv-by-zero
- Do not warn about compile-time integer division by zero. Floating-point
- division by zero is not warned about, as it can be a legitimate way of
- obtaining infinities and NaNs.
- @item -Wsystem-headers
- @opindex Wsystem-headers
- @opindex Wno-system-headers
- @cindex warnings from system headers
- @cindex system headers, warnings from
- Print warning messages for constructs found in system header files.
- Warnings from system headers are normally suppressed, on the assumption
- that they usually do not indicate real problems and would only make the
- compiler output harder to read. Using this command-line option tells
- GCC to emit warnings from system headers as if they occurred in user
- code. However, note that using @option{-Wall} in conjunction with this
- option does @emph{not} warn about unknown pragmas in system
- headers---for that, @option{-Wunknown-pragmas} must also be used.
- @item -Wtrampolines
- @opindex Wtrampolines
- @opindex Wno-trampolines
- Warn about trampolines generated for pointers to nested functions.
- A trampoline is a small piece of data or code that is created at run
- time on the stack when the address of a nested function is taken, and is
- used to call the nested function indirectly. For some targets, it is
- made up of data only and thus requires no special treatment. But, for
- most targets, it is made up of code and thus requires the stack to be
- made executable in order for the program to work properly.
- @item -Wfloat-equal
- @opindex Wfloat-equal
- @opindex Wno-float-equal
- Warn if floating-point values are used in equality comparisons.
- The idea behind this is that sometimes it is convenient (for the
- programmer) to consider floating-point values as approximations to
- infinitely precise real numbers. If you are doing this, then you need
- to compute (by analyzing the code, or in some other way) the maximum or
- likely maximum error that the computation introduces, and allow for it
- when performing comparisons (and when producing output, but that's a
- different problem). In particular, instead of testing for equality, you
- should check to see whether the two values have ranges that overlap; and
- this is done with the relational operators, so equality comparisons are
- probably mistaken.
- @item -Wtraditional @r{(C and Objective-C only)}
- @opindex Wtraditional
- @opindex Wno-traditional
- Warn about certain constructs that behave differently in traditional and
- ISO C@. Also warn about ISO C constructs that have no traditional C
- equivalent, and/or problematic constructs that should be avoided.
- @itemize @bullet
- @item
- Macro parameters that appear within string literals in the macro body.
- In traditional C macro replacement takes place within string literals,
- but in ISO C it does not.
- @item
- In traditional C, some preprocessor directives did not exist.
- Traditional preprocessors only considered a line to be a directive
- if the @samp{#} appeared in column 1 on the line. Therefore
- @option{-Wtraditional} warns about directives that traditional C
- understands but ignores because the @samp{#} does not appear as the
- first character on the line. It also suggests you hide directives like
- @code{#pragma} not understood by traditional C by indenting them. Some
- traditional implementations do not recognize @code{#elif}, so this option
- suggests avoiding it altogether.
- @item
- A function-like macro that appears without arguments.
- @item
- The unary plus operator.
- @item
- The @samp{U} integer constant suffix, or the @samp{F} or @samp{L} floating-point
- constant suffixes. (Traditional C does support the @samp{L} suffix on integer
- constants.) Note, these suffixes appear in macros defined in the system
- headers of most modern systems, e.g.@: the @samp{_MIN}/@samp{_MAX} macros in @code{<limits.h>}.
- Use of these macros in user code might normally lead to spurious
- warnings, however GCC's integrated preprocessor has enough context to
- avoid warning in these cases.
- @item
- A function declared external in one block and then used after the end of
- the block.
- @item
- A @code{switch} statement has an operand of type @code{long}.
- @item
- A non-@code{static} function declaration follows a @code{static} one.
- This construct is not accepted by some traditional C compilers.
- @item
- The ISO type of an integer constant has a different width or
- signedness from its traditional type. This warning is only issued if
- the base of the constant is ten. I.e.@: hexadecimal or octal values, which
- typically represent bit patterns, are not warned about.
- @item
- Usage of ISO string concatenation is detected.
- @item
- Initialization of automatic aggregates.
- @item
- Identifier conflicts with labels. Traditional C lacks a separate
- namespace for labels.
- @item
- Initialization of unions. If the initializer is zero, the warning is
- omitted. This is done under the assumption that the zero initializer in
- user code appears conditioned on e.g.@: @code{__STDC__} to avoid missing
- initializer warnings and relies on default initialization to zero in the
- traditional C case.
- @item
- Conversions by prototypes between fixed/floating-point values and vice
- versa. The absence of these prototypes when compiling with traditional
- C causes serious problems. This is a subset of the possible
- conversion warnings; for the full set use @option{-Wtraditional-conversion}.
- @item
- Use of ISO C style function definitions. This warning intentionally is
- @emph{not} issued for prototype declarations or variadic functions
- because these ISO C features appear in your code when using
- libiberty's traditional C compatibility macros, @code{PARAMS} and
- @code{VPARAMS}. This warning is also bypassed for nested functions
- because that feature is already a GCC extension and thus not relevant to
- traditional C compatibility.
- @end itemize
- @item -Wtraditional-conversion @r{(C and Objective-C only)}
- @opindex Wtraditional-conversion
- @opindex Wno-traditional-conversion
- Warn if a prototype causes a type conversion that is different from what
- would happen to the same argument in the absence of a prototype. This
- includes conversions of fixed point to floating and vice versa, and
- conversions changing the width or signedness of a fixed-point argument
- except when the same as the default promotion.
- @item -Wdeclaration-after-statement @r{(C and Objective-C only)}
- @opindex Wdeclaration-after-statement
- @opindex Wno-declaration-after-statement
- Warn when a declaration is found after a statement in a block. This
- construct, known from C++, was introduced with ISO C99 and is by default
- allowed in GCC@. It is not supported by ISO C90. @xref{Mixed Declarations}.
- @item -Wundef
- @opindex Wundef
- @opindex Wno-undef
- Warn if an undefined identifier is evaluated in an @code{#if} directive.
- @item -Wno-endif-labels
- @opindex Wno-endif-labels
- @opindex Wendif-labels
- Do not warn whenever an @code{#else} or an @code{#endif} are followed by text.
- @item -Wshadow
- @opindex Wshadow
- @opindex Wno-shadow
- Warn whenever a local variable or type declaration shadows another
- variable, parameter, type, class member (in C++), or instance variable
- (in Objective-C) or whenever a built-in function is shadowed. Note
- that in C++, the compiler warns if a local variable shadows an
- explicit typedef, but not if it shadows a struct/class/enum.
- @item -Wno-shadow-ivar @r{(Objective-C only)}
- @opindex Wno-shadow-ivar
- @opindex Wshadow-ivar
- Do not warn whenever a local variable shadows an instance variable in an
- Objective-C method.
- @item -Wlarger-than=@var{len}
- @opindex Wlarger-than=@var{len}
- @opindex Wlarger-than-@var{len}
- Warn whenever an object of larger than @var{len} bytes is defined.
- @item -Wframe-larger-than=@var{len}
- @opindex Wframe-larger-than
- Warn if the size of a function frame is larger than @var{len} bytes.
- The computation done to determine the stack frame size is approximate
- and not conservative.
- The actual requirements may be somewhat greater than @var{len}
- even if you do not get a warning. In addition, any space allocated
- via @code{alloca}, variable-length arrays, or related constructs
- is not included by the compiler when determining
- whether or not to issue a warning.
- @item -Wno-free-nonheap-object
- @opindex Wno-free-nonheap-object
- @opindex Wfree-nonheap-object
- Do not warn when attempting to free an object that was not allocated
- on the heap.
- @item -Wstack-usage=@var{len}
- @opindex Wstack-usage
- Warn if the stack usage of a function might be larger than @var{len} bytes.
- The computation done to determine the stack usage is conservative.
- Any space allocated via @code{alloca}, variable-length arrays, or related
- constructs is included by the compiler when determining whether or not to
- issue a warning.
- The message is in keeping with the output of @option{-fstack-usage}.
- @itemize
- @item
- If the stack usage is fully static but exceeds the specified amount, it's:
- @smallexample
- warning: stack usage is 1120 bytes
- @end smallexample
- @item
- If the stack usage is (partly) dynamic but bounded, it's:
- @smallexample
- warning: stack usage might be 1648 bytes
- @end smallexample
- @item
- If the stack usage is (partly) dynamic and not bounded, it's:
- @smallexample
- warning: stack usage might be unbounded
- @end smallexample
- @end itemize
- @item -Wunsafe-loop-optimizations
- @opindex Wunsafe-loop-optimizations
- @opindex Wno-unsafe-loop-optimizations
- Warn if the loop cannot be optimized because the compiler cannot
- assume anything on the bounds of the loop indices. With
- @option{-funsafe-loop-optimizations} warn if the compiler makes
- such assumptions.
- @item -Wno-pedantic-ms-format @r{(MinGW targets only)}
- @opindex Wno-pedantic-ms-format
- @opindex Wpedantic-ms-format
- When used in combination with @option{-Wformat}
- and @option{-pedantic} without GNU extensions, this option
- disables the warnings about non-ISO @code{printf} / @code{scanf} format
- width specifiers @code{I32}, @code{I64}, and @code{I} used on Windows targets,
- which depend on the MS runtime.
- @item -Wpointer-arith
- @opindex Wpointer-arith
- @opindex Wno-pointer-arith
- Warn about anything that depends on the ``size of'' a function type or
- of @code{void}. GNU C assigns these types a size of 1, for
- convenience in calculations with @code{void *} pointers and pointers
- to functions. In C++, warn also when an arithmetic operation involves
- @code{NULL}. This warning is also enabled by @option{-Wpedantic}.
- @item -Wtype-limits
- @opindex Wtype-limits
- @opindex Wno-type-limits
- Warn if a comparison is always true or always false due to the limited
- range of the data type, but do not warn for constant expressions. For
- example, warn if an unsigned variable is compared against zero with
- @code{<} or @code{>=}. This warning is also enabled by
- @option{-Wextra}.
- @item -Wbad-function-cast @r{(C and Objective-C only)}
- @opindex Wbad-function-cast
- @opindex Wno-bad-function-cast
- Warn when a function call is cast to a non-matching type.
- For example, warn if a call to a function returning an integer type
- is cast to a pointer type.
- @item -Wc90-c99-compat @r{(C and Objective-C only)}
- @opindex Wc90-c99-compat
- @opindex Wno-c90-c99-compat
- Warn about features not present in ISO C90, but present in ISO C99.
- For instance, warn about use of variable length arrays, @code{long long}
- type, @code{bool} type, compound literals, designated initializers, and so
- on. This option is independent of the standards mode. Warnings are disabled
- in the expression that follows @code{__extension__}.
- @item -Wc99-c11-compat @r{(C and Objective-C only)}
- @opindex Wc99-c11-compat
- @opindex Wno-c99-c11-compat
- Warn about features not present in ISO C99, but present in ISO C11.
- For instance, warn about use of anonymous structures and unions,
- @code{_Atomic} type qualifier, @code{_Thread_local} storage-class specifier,
- @code{_Alignas} specifier, @code{Alignof} operator, @code{_Generic} keyword,
- and so on. This option is independent of the standards mode. Warnings are
- disabled in the expression that follows @code{__extension__}.
- @item -Wc++-compat @r{(C and Objective-C only)}
- @opindex Wc++-compat
- Warn about ISO C constructs that are outside of the common subset of
- ISO C and ISO C++, e.g.@: request for implicit conversion from
- @code{void *} to a pointer to non-@code{void} type.
- @item -Wc++11-compat @r{(C++ and Objective-C++ only)}
- @opindex Wc++11-compat
- Warn about C++ constructs whose meaning differs between ISO C++ 1998
- and ISO C++ 2011, e.g., identifiers in ISO C++ 1998 that are keywords
- in ISO C++ 2011. This warning turns on @option{-Wnarrowing} and is
- enabled by @option{-Wall}.
- @item -Wc++14-compat @r{(C++ and Objective-C++ only)}
- @opindex Wc++14-compat
- Warn about C++ constructs whose meaning differs between ISO C++ 2011
- and ISO C++ 2014. This warning is enabled by @option{-Wall}.
- @item -Wcast-qual
- @opindex Wcast-qual
- @opindex Wno-cast-qual
- Warn whenever a pointer is cast so as to remove a type qualifier from
- the target type. For example, warn if a @code{const char *} is cast
- to an ordinary @code{char *}.
- Also warn when making a cast that introduces a type qualifier in an
- unsafe way. For example, casting @code{char **} to @code{const char **}
- is unsafe, as in this example:
- @smallexample
- /* p is char ** value. */
- const char **q = (const char **) p;
- /* Assignment of readonly string to const char * is OK. */
- *q = "string";
- /* Now char** pointer points to read-only memory. */
- **p = 'b';
- @end smallexample
- @item -Wcast-align
- @opindex Wcast-align
- @opindex Wno-cast-align
- Warn whenever a pointer is cast such that the required alignment of the
- target is increased. For example, warn if a @code{char *} is cast to
- an @code{int *} on machines where integers can only be accessed at
- two- or four-byte boundaries.
- @item -Wwrite-strings
- @opindex Wwrite-strings
- @opindex Wno-write-strings
- When compiling C, give string constants the type @code{const
- char[@var{length}]} so that copying the address of one into a
- non-@code{const} @code{char *} pointer produces a warning. These
- warnings help you find at compile time code that can try to write
- into a string constant, but only if you have been very careful about
- using @code{const} in declarations and prototypes. Otherwise, it is
- just a nuisance. This is why we did not make @option{-Wall} request
- these warnings.
- When compiling C++, warn about the deprecated conversion from string
- literals to @code{char *}. This warning is enabled by default for C++
- programs.
- @item -Wclobbered
- @opindex Wclobbered
- @opindex Wno-clobbered
- Warn for variables that might be changed by @code{longjmp} or
- @code{vfork}. This warning is also enabled by @option{-Wextra}.
- @item -Wconditionally-supported @r{(C++ and Objective-C++ only)}
- @opindex Wconditionally-supported
- @opindex Wno-conditionally-supported
- Warn for conditionally-supported (C++11 [intro.defs]) constructs.
- @item -Wconversion
- @opindex Wconversion
- @opindex Wno-conversion
- Warn for implicit conversions that may alter a value. This includes
- conversions between real and integer, like @code{abs (x)} when
- @code{x} is @code{double}; conversions between signed and unsigned,
- like @code{unsigned ui = -1}; and conversions to smaller types, like
- @code{sqrtf (M_PI)}. Do not warn for explicit casts like @code{abs
- ((int) x)} and @code{ui = (unsigned) -1}, or if the value is not
- changed by the conversion like in @code{abs (2.0)}. Warnings about
- conversions between signed and unsigned integers can be disabled by
- using @option{-Wno-sign-conversion}.
- For C++, also warn for confusing overload resolution for user-defined
- conversions; and conversions that never use a type conversion
- operator: conversions to @code{void}, the same type, a base class or a
- reference to them. Warnings about conversions between signed and
- unsigned integers are disabled by default in C++ unless
- @option{-Wsign-conversion} is explicitly enabled.
- @item -Wno-conversion-null @r{(C++ and Objective-C++ only)}
- @opindex Wconversion-null
- @opindex Wno-conversion-null
- Do not warn for conversions between @code{NULL} and non-pointer
- types. @option{-Wconversion-null} is enabled by default.
- @item -Wzero-as-null-pointer-constant @r{(C++ and Objective-C++ only)}
- @opindex Wzero-as-null-pointer-constant
- @opindex Wno-zero-as-null-pointer-constant
- Warn when a literal '0' is used as null pointer constant. This can
- be useful to facilitate the conversion to @code{nullptr} in C++11.
- @item -Wdate-time
- @opindex Wdate-time
- @opindex Wno-date-time
- Warn when macros @code{__TIME__}, @code{__DATE__} or @code{__TIMESTAMP__}
- are encountered as they might prevent bit-wise-identical reproducible
- compilations.
- @item -Wdelete-incomplete @r{(C++ and Objective-C++ only)}
- @opindex Wdelete-incomplete
- @opindex Wno-delete-incomplete
- Warn when deleting a pointer to incomplete type, which may cause
- undefined behavior at runtime. This warning is enabled by default.
- @item -Wuseless-cast @r{(C++ and Objective-C++ only)}
- @opindex Wuseless-cast
- @opindex Wno-useless-cast
- Warn when an expression is casted to its own type.
- @item -Wempty-body
- @opindex Wempty-body
- @opindex Wno-empty-body
- Warn if an empty body occurs in an @code{if}, @code{else} or @code{do
- while} statement. This warning is also enabled by @option{-Wextra}.
- @item -Wenum-compare
- @opindex Wenum-compare
- @opindex Wno-enum-compare
- Warn about a comparison between values of different enumerated types.
- In C++ enumeral mismatches in conditional expressions are also
- diagnosed and the warning is enabled by default. In C this warning is
- enabled by @option{-Wall}.
- @item -Wjump-misses-init @r{(C, Objective-C only)}
- @opindex Wjump-misses-init
- @opindex Wno-jump-misses-init
- Warn if a @code{goto} statement or a @code{switch} statement jumps
- forward across the initialization of a variable, or jumps backward to a
- label after the variable has been initialized. This only warns about
- variables that are initialized when they are declared. This warning is
- only supported for C and Objective-C; in C++ this sort of branch is an
- error in any case.
- @option{-Wjump-misses-init} is included in @option{-Wc++-compat}. It
- can be disabled with the @option{-Wno-jump-misses-init} option.
- @item -Wsign-compare
- @opindex Wsign-compare
- @opindex Wno-sign-compare
- @cindex warning for comparison of signed and unsigned values
- @cindex comparison of signed and unsigned values, warning
- @cindex signed and unsigned values, comparison warning
- Warn when a comparison between signed and unsigned values could produce
- an incorrect result when the signed value is converted to unsigned.
- This warning is also enabled by @option{-Wextra}; to get the other warnings
- of @option{-Wextra} without this warning, use @option{-Wextra -Wno-sign-compare}.
- @item -Wsign-conversion
- @opindex Wsign-conversion
- @opindex Wno-sign-conversion
- Warn for implicit conversions that may change the sign of an integer
- value, like assigning a signed integer expression to an unsigned
- integer variable. An explicit cast silences the warning. In C, this
- option is enabled also by @option{-Wconversion}.
- @item -Wfloat-conversion
- @opindex Wfloat-conversion
- @opindex Wno-float-conversion
- Warn for implicit conversions that reduce the precision of a real value.
- This includes conversions from real to integer, and from higher precision
- real to lower precision real values. This option is also enabled by
- @option{-Wconversion}.
- @item -Wsized-deallocation @r{(C++ and Objective-C++ only)}
- @opindex Wsized-deallocation
- @opindex Wno-sized-deallocation
- Warn about a definition of an unsized deallocation function
- @smallexample
- void operator delete (void *) noexcept;
- void operator delete[] (void *) noexcept;
- @end smallexample
- without a definition of the corresponding sized deallocation function
- @smallexample
- void operator delete (void *, std::size_t) noexcept;
- void operator delete[] (void *, std::size_t) noexcept;
- @end smallexample
- or vice versa. Enabled by @option{-Wextra} along with
- @option{-fsized-deallocation}.
- @item -Wsizeof-pointer-memaccess
- @opindex Wsizeof-pointer-memaccess
- @opindex Wno-sizeof-pointer-memaccess
- Warn for suspicious length parameters to certain string and memory built-in
- functions if the argument uses @code{sizeof}. This warning warns e.g.@:
- about @code{memset (ptr, 0, sizeof (ptr));} if @code{ptr} is not an array,
- but a pointer, and suggests a possible fix, or about
- @code{memcpy (&foo, ptr, sizeof (&foo));}. This warning is enabled by
- @option{-Wall}.
- @item -Wsizeof-array-argument
- @opindex Wsizeof-array-argument
- @opindex Wno-sizeof-array-argument
- Warn when the @code{sizeof} operator is applied to a parameter that is
- declared as an array in a function definition. This warning is enabled by
- default for C and C++ programs.
- @item -Wmemset-transposed-args
- @opindex Wmemset-transposed-args
- @opindex Wno-memset-transposed-args
- Warn for suspicious calls to the @code{memset} built-in function, if the
- second argument is not zero and the third argument is zero. This warns e.g.@
- about @code{memset (buf, sizeof buf, 0)} where most probably
- @code{memset (buf, 0, sizeof buf)} was meant instead. The diagnostics
- is only emitted if the third argument is literal zero. If it is some
- expression that is folded to zero, a cast of zero to some type, etc.,
- it is far less likely that the user has mistakenly exchanged the arguments
- and no warning is emitted. This warning is enabled by @option{-Wall}.
- @item -Waddress
- @opindex Waddress
- @opindex Wno-address
- Warn about suspicious uses of memory addresses. These include using
- the address of a function in a conditional expression, such as
- @code{void func(void); if (func)}, and comparisons against the memory
- address of a string literal, such as @code{if (x == "abc")}. Such
- uses typically indicate a programmer error: the address of a function
- always evaluates to true, so their use in a conditional usually
- indicate that the programmer forgot the parentheses in a function
- call; and comparisons against string literals result in unspecified
- behavior and are not portable in C, so they usually indicate that the
- programmer intended to use @code{strcmp}. This warning is enabled by
- @option{-Wall}.
- @item -Wlogical-op
- @opindex Wlogical-op
- @opindex Wno-logical-op
- Warn about suspicious uses of logical operators in expressions.
- This includes using logical operators in contexts where a
- bit-wise operator is likely to be expected.
- @item -Wlogical-not-parentheses
- @opindex Wlogical-not-parentheses
- @opindex Wno-logical-not-parentheses
- Warn about logical not used on the left hand side operand of a comparison.
- This option does not warn if the RHS operand is of a boolean type. Its
- purpose is to detect suspicious code like the following:
- @smallexample
- int a;
- @dots{}
- if (!a > 1) @{ @dots{} @}
- @end smallexample
- It is possible to suppress the warning by wrapping the LHS into
- parentheses:
- @smallexample
- if ((!a) > 1) @{ @dots{} @}
- @end smallexample
- This warning is enabled by @option{-Wall}.
- @item -Waggregate-return
- @opindex Waggregate-return
- @opindex Wno-aggregate-return
- Warn if any functions that return structures or unions are defined or
- called. (In languages where you can return an array, this also elicits
- a warning.)
- @item -Wno-aggressive-loop-optimizations
- @opindex Wno-aggressive-loop-optimizations
- @opindex Waggressive-loop-optimizations
- Warn if in a loop with constant number of iterations the compiler detects
- undefined behavior in some statement during one or more of the iterations.
- @item -Wno-attributes
- @opindex Wno-attributes
- @opindex Wattributes
- Do not warn if an unexpected @code{__attribute__} is used, such as
- unrecognized attributes, function attributes applied to variables,
- etc. This does not stop errors for incorrect use of supported
- attributes.
- @item -Wno-builtin-macro-redefined
- @opindex Wno-builtin-macro-redefined
- @opindex Wbuiltin-macro-redefined
- Do not warn if certain built-in macros are redefined. This suppresses
- warnings for redefinition of @code{__TIMESTAMP__}, @code{__TIME__},
- @code{__DATE__}, @code{__FILE__}, and @code{__BASE_FILE__}.
- @item -Wstrict-prototypes @r{(C and Objective-C only)}
- @opindex Wstrict-prototypes
- @opindex Wno-strict-prototypes
- Warn if a function is declared or defined without specifying the
- argument types. (An old-style function definition is permitted without
- a warning if preceded by a declaration that specifies the argument
- types.)
- @item -Wold-style-declaration @r{(C and Objective-C only)}
- @opindex Wold-style-declaration
- @opindex Wno-old-style-declaration
- Warn for obsolescent usages, according to the C Standard, in a
- declaration. For example, warn if storage-class specifiers like
- @code{static} are not the first things in a declaration. This warning
- is also enabled by @option{-Wextra}.
- @item -Wold-style-definition @r{(C and Objective-C only)}
- @opindex Wold-style-definition
- @opindex Wno-old-style-definition
- Warn if an old-style function definition is used. A warning is given
- even if there is a previous prototype.
- @item -Wmissing-parameter-type @r{(C and Objective-C only)}
- @opindex Wmissing-parameter-type
- @opindex Wno-missing-parameter-type
- A function parameter is declared without a type specifier in K&R-style
- functions:
- @smallexample
- void foo(bar) @{ @}
- @end smallexample
- This warning is also enabled by @option{-Wextra}.
- @item -Wmissing-prototypes @r{(C and Objective-C only)}
- @opindex Wmissing-prototypes
- @opindex Wno-missing-prototypes
- Warn if a global function is defined without a previous prototype
- declaration. This warning is issued even if the definition itself
- provides a prototype. Use this option to detect global functions
- that do not have a matching prototype declaration in a header file.
- This option is not valid for C++ because all function declarations
- provide prototypes and a non-matching declaration declares an
- overload rather than conflict with an earlier declaration.
- Use @option{-Wmissing-declarations} to detect missing declarations in C++.
- @item -Wmissing-declarations
- @opindex Wmissing-declarations
- @opindex Wno-missing-declarations
- Warn if a global function is defined without a previous declaration.
- Do so even if the definition itself provides a prototype.
- Use this option to detect global functions that are not declared in
- header files. In C, no warnings are issued for functions with previous
- non-prototype declarations; use @option{-Wmissing-prototypes} to detect
- missing prototypes. In C++, no warnings are issued for function templates,
- or for inline functions, or for functions in anonymous namespaces.
- @item -Wmissing-field-initializers
- @opindex Wmissing-field-initializers
- @opindex Wno-missing-field-initializers
- @opindex W
- @opindex Wextra
- @opindex Wno-extra
- Warn if a structure's initializer has some fields missing. For
- example, the following code causes such a warning, because
- @code{x.h} is implicitly zero:
- @smallexample
- struct s @{ int f, g, h; @};
- struct s x = @{ 3, 4 @};
- @end smallexample
- This option does not warn about designated initializers, so the following
- modification does not trigger a warning:
- @smallexample
- struct s @{ int f, g, h; @};
- struct s x = @{ .f = 3, .g = 4 @};
- @end smallexample
- In C++ this option does not warn either about the empty @{ @}
- initializer, for example:
- @smallexample
- struct s @{ int f, g, h; @};
- s x = @{ @};
- @end smallexample
- This warning is included in @option{-Wextra}. To get other @option{-Wextra}
- warnings without this one, use @option{-Wextra -Wno-missing-field-initializers}.
- @item -Wno-multichar
- @opindex Wno-multichar
- @opindex Wmultichar
- Do not warn if a multicharacter constant (@samp{'FOOF'}) is used.
- Usually they indicate a typo in the user's code, as they have
- implementation-defined values, and should not be used in portable code.
- @item -Wnormalized@r{[}=@r{<}none@r{|}id@r{|}nfc@r{|}nfkc@r{>]}
- @opindex Wnormalized=
- @opindex Wnormalized
- @opindex Wno-normalized
- @cindex NFC
- @cindex NFKC
- @cindex character set, input normalization
- In ISO C and ISO C++, two identifiers are different if they are
- different sequences of characters. However, sometimes when characters
- outside the basic ASCII character set are used, you can have two
- different character sequences that look the same. To avoid confusion,
- the ISO 10646 standard sets out some @dfn{normalization rules} which
- when applied ensure that two sequences that look the same are turned into
- the same sequence. GCC can warn you if you are using identifiers that
- have not been normalized; this option controls that warning.
- There are four levels of warning supported by GCC@. The default is
- @option{-Wnormalized=nfc}, which warns about any identifier that is
- not in the ISO 10646 ``C'' normalized form, @dfn{NFC}. NFC is the
- recommended form for most uses. It is equivalent to
- @option{-Wnormalized}.
- Unfortunately, there are some characters allowed in identifiers by
- ISO C and ISO C++ that, when turned into NFC, are not allowed in
- identifiers. That is, there's no way to use these symbols in portable
- ISO C or C++ and have all your identifiers in NFC@.
- @option{-Wnormalized=id} suppresses the warning for these characters.
- It is hoped that future versions of the standards involved will correct
- this, which is why this option is not the default.
- You can switch the warning off for all characters by writing
- @option{-Wnormalized=none} or @option{-Wno-normalized}. You should
- only do this if you are using some other normalization scheme (like
- ``D''), because otherwise you can easily create bugs that are
- literally impossible to see.
- Some characters in ISO 10646 have distinct meanings but look identical
- in some fonts or display methodologies, especially once formatting has
- been applied. For instance @code{\u207F}, ``SUPERSCRIPT LATIN SMALL
- LETTER N'', displays just like a regular @code{n} that has been
- placed in a superscript. ISO 10646 defines the @dfn{NFKC}
- normalization scheme to convert all these into a standard form as
- well, and GCC warns if your code is not in NFKC if you use
- @option{-Wnormalized=nfkc}. This warning is comparable to warning
- about every identifier that contains the letter O because it might be
- confused with the digit 0, and so is not the default, but may be
- useful as a local coding convention if the programming environment
- cannot be fixed to display these characters distinctly.
- @item -Wno-deprecated
- @opindex Wno-deprecated
- @opindex Wdeprecated
- Do not warn about usage of deprecated features. @xref{Deprecated Features}.
- @item -Wno-deprecated-declarations
- @opindex Wno-deprecated-declarations
- @opindex Wdeprecated-declarations
- Do not warn about uses of functions (@pxref{Function Attributes}),
- variables (@pxref{Variable Attributes}), and types (@pxref{Type
- Attributes}) marked as deprecated by using the @code{deprecated}
- attribute.
- @item -Wno-overflow
- @opindex Wno-overflow
- @opindex Woverflow
- Do not warn about compile-time overflow in constant expressions.
- @item -Wno-odr
- @opindex Wno-odr
- @opindex Wodr
- Warn about One Definition Rule violations during link-time optimization.
- Requires @option{-flto-odr-type-merging} to be enabled. Enabled by default.
- @item -Wopenmp-simd
- @opindex Wopenm-simd
- Warn if the vectorizer cost model overrides the OpenMP or the Cilk Plus
- simd directive set by user. The @option{-fsimd-cost-model=unlimited}
- option can be used to relax the cost model.
- @item -Woverride-init @r{(C and Objective-C only)}
- @opindex Woverride-init
- @opindex Wno-override-init
- @opindex W
- @opindex Wextra
- @opindex Wno-extra
- Warn if an initialized field without side effects is overridden when
- using designated initializers (@pxref{Designated Inits, , Designated
- Initializers}).
- This warning is included in @option{-Wextra}. To get other
- @option{-Wextra} warnings without this one, use @option{-Wextra
- -Wno-override-init}.
- @item -Wpacked
- @opindex Wpacked
- @opindex Wno-packed
- Warn if a structure is given the packed attribute, but the packed
- attribute has no effect on the layout or size of the structure.
- Such structures may be mis-aligned for little benefit. For
- instance, in this code, the variable @code{f.x} in @code{struct bar}
- is misaligned even though @code{struct bar} does not itself
- have the packed attribute:
- @smallexample
- @group
- struct foo @{
- int x;
- char a, b, c, d;
- @} __attribute__((packed));
- struct bar @{
- char z;
- struct foo f;
- @};
- @end group
- @end smallexample
- @item -Wpacked-bitfield-compat
- @opindex Wpacked-bitfield-compat
- @opindex Wno-packed-bitfield-compat
- The 4.1, 4.2 and 4.3 series of GCC ignore the @code{packed} attribute
- on bit-fields of type @code{char}. This has been fixed in GCC 4.4 but
- the change can lead to differences in the structure layout. GCC
- informs you when the offset of such a field has changed in GCC 4.4.
- For example there is no longer a 4-bit padding between field @code{a}
- and @code{b} in this structure:
- @smallexample
- struct foo
- @{
- char a:4;
- char b:8;
- @} __attribute__ ((packed));
- @end smallexample
- This warning is enabled by default. Use
- @option{-Wno-packed-bitfield-compat} to disable this warning.
- @item -Wpadded
- @opindex Wpadded
- @opindex Wno-padded
- Warn if padding is included in a structure, either to align an element
- of the structure or to align the whole structure. Sometimes when this
- happens it is possible to rearrange the fields of the structure to
- reduce the padding and so make the structure smaller.
- @item -Wredundant-decls
- @opindex Wredundant-decls
- @opindex Wno-redundant-decls
- Warn if anything is declared more than once in the same scope, even in
- cases where multiple declaration is valid and changes nothing.
- @item -Wnested-externs @r{(C and Objective-C only)}
- @opindex Wnested-externs
- @opindex Wno-nested-externs
- Warn if an @code{extern} declaration is encountered within a function.
- @item -Wno-inherited-variadic-ctor
- @opindex Winherited-variadic-ctor
- @opindex Wno-inherited-variadic-ctor
- Suppress warnings about use of C++11 inheriting constructors when the
- base class inherited from has a C variadic constructor; the warning is
- on by default because the ellipsis is not inherited.
- @item -Winline
- @opindex Winline
- @opindex Wno-inline
- Warn if a function that is declared as inline cannot be inlined.
- Even with this option, the compiler does not warn about failures to
- inline functions declared in system headers.
- The compiler uses a variety of heuristics to determine whether or not
- to inline a function. For example, the compiler takes into account
- the size of the function being inlined and the amount of inlining
- that has already been done in the current function. Therefore,
- seemingly insignificant changes in the source program can cause the
- warnings produced by @option{-Winline} to appear or disappear.
- @item -Wno-invalid-offsetof @r{(C++ and Objective-C++ only)}
- @opindex Wno-invalid-offsetof
- @opindex Winvalid-offsetof
- Suppress warnings from applying the @code{offsetof} macro to a non-POD
- type. According to the 2014 ISO C++ standard, applying @code{offsetof}
- to a non-standard-layout type is undefined. In existing C++ implementations,
- however, @code{offsetof} typically gives meaningful results.
- This flag is for users who are aware that they are
- writing nonportable code and who have deliberately chosen to ignore the
- warning about it.
- The restrictions on @code{offsetof} may be relaxed in a future version
- of the C++ standard.
- @item -Wno-int-to-pointer-cast
- @opindex Wno-int-to-pointer-cast
- @opindex Wint-to-pointer-cast
- Suppress warnings from casts to pointer type of an integer of a
- different size. In C++, casting to a pointer type of smaller size is
- an error. @option{Wint-to-pointer-cast} is enabled by default.
- @item -Wno-pointer-to-int-cast @r{(C and Objective-C only)}
- @opindex Wno-pointer-to-int-cast
- @opindex Wpointer-to-int-cast
- Suppress warnings from casts from a pointer to an integer type of a
- different size.
- @item -Winvalid-pch
- @opindex Winvalid-pch
- @opindex Wno-invalid-pch
- Warn if a precompiled header (@pxref{Precompiled Headers}) is found in
- the search path but can't be used.
- @item -Wlong-long
- @opindex Wlong-long
- @opindex Wno-long-long
- Warn if @code{long long} type is used. This is enabled by either
- @option{-Wpedantic} or @option{-Wtraditional} in ISO C90 and C++98
- modes. To inhibit the warning messages, use @option{-Wno-long-long}.
- @item -Wvariadic-macros
- @opindex Wvariadic-macros
- @opindex Wno-variadic-macros
- Warn if variadic macros are used in ISO C90 mode, or if the GNU
- alternate syntax is used in ISO C99 mode. This is enabled by either
- @option{-Wpedantic} or @option{-Wtraditional}. To inhibit the warning
- messages, use @option{-Wno-variadic-macros}.
- @item -Wvarargs
- @opindex Wvarargs
- @opindex Wno-varargs
- Warn upon questionable usage of the macros used to handle variable
- arguments like @code{va_start}. This is default. To inhibit the
- warning messages, use @option{-Wno-varargs}.
- @item -Wvector-operation-performance
- @opindex Wvector-operation-performance
- @opindex Wno-vector-operation-performance
- Warn if vector operation is not implemented via SIMD capabilities of the
- architecture. Mainly useful for the performance tuning.
- Vector operation can be implemented @code{piecewise}, which means that the
- scalar operation is performed on every vector element;
- @code{in parallel}, which means that the vector operation is implemented
- using scalars of wider type, which normally is more performance efficient;
- and @code{as a single scalar}, which means that vector fits into a
- scalar type.
- @item -Wno-virtual-move-assign
- @opindex Wvirtual-move-assign
- @opindex Wno-virtual-move-assign
- Suppress warnings about inheriting from a virtual base with a
- non-trivial C++11 move assignment operator. This is dangerous because
- if the virtual base is reachable along more than one path, it is
- moved multiple times, which can mean both objects end up in the
- moved-from state. If the move assignment operator is written to avoid
- moving from a moved-from object, this warning can be disabled.
- @item -Wvla
- @opindex Wvla
- @opindex Wno-vla
- Warn if variable length array is used in the code.
- @option{-Wno-vla} prevents the @option{-Wpedantic} warning of
- the variable length array.
- @item -Wvolatile-register-var
- @opindex Wvolatile-register-var
- @opindex Wno-volatile-register-var
- Warn if a register variable is declared volatile. The volatile
- modifier does not inhibit all optimizations that may eliminate reads
- and/or writes to register variables. This warning is enabled by
- @option{-Wall}.
- @item -Wdisabled-optimization
- @opindex Wdisabled-optimization
- @opindex Wno-disabled-optimization
- Warn if a requested optimization pass is disabled. This warning does
- not generally indicate that there is anything wrong with your code; it
- merely indicates that GCC's optimizers are unable to handle the code
- effectively. Often, the problem is that your code is too big or too
- complex; GCC refuses to optimize programs when the optimization
- itself is likely to take inordinate amounts of time.
- @item -Wpointer-sign @r{(C and Objective-C only)}
- @opindex Wpointer-sign
- @opindex Wno-pointer-sign
- Warn for pointer argument passing or assignment with different signedness.
- This option is only supported for C and Objective-C@. It is implied by
- @option{-Wall} and by @option{-Wpedantic}, which can be disabled with
- @option{-Wno-pointer-sign}.
- @item -Wstack-protector
- @opindex Wstack-protector
- @opindex Wno-stack-protector
- This option is only active when @option{-fstack-protector} is active. It
- warns about functions that are not protected against stack smashing.
- @item -Woverlength-strings
- @opindex Woverlength-strings
- @opindex Wno-overlength-strings
- Warn about string constants that are longer than the ``minimum
- maximum'' length specified in the C standard. Modern compilers
- generally allow string constants that are much longer than the
- standard's minimum limit, but very portable programs should avoid
- using longer strings.
- The limit applies @emph{after} string constant concatenation, and does
- not count the trailing NUL@. In C90, the limit was 509 characters; in
- C99, it was raised to 4095. C++98 does not specify a normative
- minimum maximum, so we do not diagnose overlength strings in C++@.
- This option is implied by @option{-Wpedantic}, and can be disabled with
- @option{-Wno-overlength-strings}.
- @item -Wunsuffixed-float-constants @r{(C and Objective-C only)}
- @opindex Wunsuffixed-float-constants
- Issue a warning for any floating constant that does not have
- a suffix. When used together with @option{-Wsystem-headers} it
- warns about such constants in system header files. This can be useful
- when preparing code to use with the @code{FLOAT_CONST_DECIMAL64} pragma
- from the decimal floating-point extension to C99.
- @item -Wno-designated-init @r{(C and Objective-C only)}
- Suppress warnings when a positional initializer is used to initialize
- a structure that has been marked with the @code{designated_init}
- attribute.
- @end table
- @node Debugging Options
- @section Options for Debugging Your Program or GCC
- @cindex options, debugging
- @cindex debugging information options
- GCC has various special options that are used for debugging
- either your program or GCC:
- @table @gcctabopt
- @item -g
- @opindex g
- Produce debugging information in the operating system's native format
- (stabs, COFF, XCOFF, or DWARF 2)@. GDB can work with this debugging
- information.
- On most systems that use stabs format, @option{-g} enables use of extra
- debugging information that only GDB can use; this extra information
- makes debugging work better in GDB but probably makes other debuggers
- crash or
- refuse to read the program. If you want to control for certain whether
- to generate the extra information, use @option{-gstabs+}, @option{-gstabs},
- @option{-gxcoff+}, @option{-gxcoff}, or @option{-gvms} (see below).
- GCC allows you to use @option{-g} with
- @option{-O}. The shortcuts taken by optimized code may occasionally
- produce surprising results: some variables you declared may not exist
- at all; flow of control may briefly move where you did not expect it;
- some statements may not be executed because they compute constant
- results or their values are already at hand; some statements may
- execute in different places because they have been moved out of loops.
- Nevertheless it proves possible to debug optimized output. This makes
- it reasonable to use the optimizer for programs that might have bugs.
- The following options are useful when GCC is generated with the
- capability for more than one debugging format.
- @item -gsplit-dwarf
- @opindex gsplit-dwarf
- Separate as much dwarf debugging information as possible into a
- separate output file with the extension .dwo. This option allows
- the build system to avoid linking files with debug information. To
- be useful, this option requires a debugger capable of reading .dwo
- files.
- @item -ggdb
- @opindex ggdb
- Produce debugging information for use by GDB@. This means to use the
- most expressive format available (DWARF 2, stabs, or the native format
- if neither of those are supported), including GDB extensions if at all
- possible.
- @item -gpubnames
- @opindex gpubnames
- Generate dwarf .debug_pubnames and .debug_pubtypes sections.
- @item -ggnu-pubnames
- @opindex ggnu-pubnames
- Generate .debug_pubnames and .debug_pubtypes sections in a format
- suitable for conversion into a GDB@ index. This option is only useful
- with a linker that can produce GDB@ index version 7.
- @item -gstabs
- @opindex gstabs
- Produce debugging information in stabs format (if that is supported),
- without GDB extensions. This is the format used by DBX on most BSD
- systems. On MIPS, Alpha and System V Release 4 systems this option
- produces stabs debugging output that is not understood by DBX or SDB@.
- On System V Release 4 systems this option requires the GNU assembler.
- @item -feliminate-unused-debug-symbols
- @opindex feliminate-unused-debug-symbols
- Produce debugging information in stabs format (if that is supported),
- for only symbols that are actually used.
- @item -femit-class-debug-always
- @opindex femit-class-debug-always
- Instead of emitting debugging information for a C++ class in only one
- object file, emit it in all object files using the class. This option
- should be used only with debuggers that are unable to handle the way GCC
- normally emits debugging information for classes because using this
- option increases the size of debugging information by as much as a
- factor of two.
- @item -fdebug-types-section
- @opindex fdebug-types-section
- @opindex fno-debug-types-section
- When using DWARF Version 4 or higher, type DIEs can be put into
- their own @code{.debug_types} section instead of making them part of the
- @code{.debug_info} section. It is more efficient to put them in a separate
- comdat sections since the linker can then remove duplicates.
- But not all DWARF consumers support @code{.debug_types} sections yet
- and on some objects @code{.debug_types} produces larger instead of smaller
- debugging information.
- @item -gstabs+
- @opindex gstabs+
- Produce debugging information in stabs format (if that is supported),
- using GNU extensions understood only by the GNU debugger (GDB)@. The
- use of these extensions is likely to make other debuggers crash or
- refuse to read the program.
- @item -gcoff
- @opindex gcoff
- Produce debugging information in COFF format (if that is supported).
- This is the format used by SDB on most System V systems prior to
- System V Release 4.
- @item -gxcoff
- @opindex gxcoff
- Produce debugging information in XCOFF format (if that is supported).
- This is the format used by the DBX debugger on IBM RS/6000 systems.
- @item -gxcoff+
- @opindex gxcoff+
- Produce debugging information in XCOFF format (if that is supported),
- using GNU extensions understood only by the GNU debugger (GDB)@. The
- use of these extensions is likely to make other debuggers crash or
- refuse to read the program, and may cause assemblers other than the GNU
- assembler (GAS) to fail with an error.
- @item -gdwarf-@var{version}
- @opindex gdwarf-@var{version}
- Produce debugging information in DWARF format (if that is supported).
- The value of @var{version} may be either 2, 3, 4 or 5; the default version
- for most targets is 4. DWARF Version 5 is only experimental.
- Note that with DWARF Version 2, some ports require and always
- use some non-conflicting DWARF 3 extensions in the unwind tables.
- Version 4 may require GDB 7.0 and @option{-fvar-tracking-assignments}
- for maximum benefit.
- @item -grecord-gcc-switches
- @opindex grecord-gcc-switches
- This switch causes the command-line options used to invoke the
- compiler that may affect code generation to be appended to the
- DW_AT_producer attribute in DWARF debugging information. The options
- are concatenated with spaces separating them from each other and from
- the compiler version. See also @option{-frecord-gcc-switches} for another
- way of storing compiler options into the object file. This is the default.
- @item -gno-record-gcc-switches
- @opindex gno-record-gcc-switches
- Disallow appending command-line options to the DW_AT_producer attribute
- in DWARF debugging information.
- @item -gstrict-dwarf
- @opindex gstrict-dwarf
- Disallow using extensions of later DWARF standard version than selected
- with @option{-gdwarf-@var{version}}. On most targets using non-conflicting
- DWARF extensions from later standard versions is allowed.
- @item -gno-strict-dwarf
- @opindex gno-strict-dwarf
- Allow using extensions of later DWARF standard version than selected with
- @option{-gdwarf-@var{version}}.
- @item -gz@r{[}=@var{type}@r{]}
- @opindex gz
- Produce compressed debug sections in DWARF format, if that is supported.
- If @var{type} is not given, the default type depends on the capabilities
- of the assembler and linker used. @var{type} may be one of
- @samp{none} (don't compress debug sections), @samp{zlib} (use zlib
- compression in ELF gABI format), or @samp{zlib-gnu} (use zlib
- compression in traditional GNU format). If the linker doesn't support
- writing compressed debug sections, the option is rejected. Otherwise,
- if the assembler does not support them, @option{-gz} is silently ignored
- when producing object files.
- @item -gvms
- @opindex gvms
- Produce debugging information in Alpha/VMS debug format (if that is
- supported). This is the format used by DEBUG on Alpha/VMS systems.
- @item -g@var{level}
- @itemx -ggdb@var{level}
- @itemx -gstabs@var{level}
- @itemx -gcoff@var{level}
- @itemx -gxcoff@var{level}
- @itemx -gvms@var{level}
- Request debugging information and also use @var{level} to specify how
- much information. The default level is 2.
- Level 0 produces no debug information at all. Thus, @option{-g0} negates
- @option{-g}.
- Level 1 produces minimal information, enough for making backtraces in
- parts of the program that you don't plan to debug. This includes
- descriptions of functions and external variables, and line number
- tables, but no information about local variables.
- Level 3 includes extra information, such as all the macro definitions
- present in the program. Some debuggers support macro expansion when
- you use @option{-g3}.
- @option{-gdwarf-2} does not accept a concatenated debug level, because
- GCC used to support an option @option{-gdwarf} that meant to generate
- debug information in version 1 of the DWARF format (which is very
- different from version 2), and it would have been too confusing. That
- debug format is long obsolete, but the option cannot be changed now.
- Instead use an additional @option{-g@var{level}} option to change the
- debug level for DWARF.
- @item -gtoggle
- @opindex gtoggle
- Turn off generation of debug info, if leaving out this option
- generates it, or turn it on at level 2 otherwise. The position of this
- argument in the command line does not matter; it takes effect after all
- other options are processed, and it does so only once, no matter how
- many times it is given. This is mainly intended to be used with
- @option{-fcompare-debug}.
- @item -fsanitize=address
- @opindex fsanitize=address
- Enable AddressSanitizer, a fast memory error detector.
- Memory access instructions are instrumented to detect
- out-of-bounds and use-after-free bugs.
- See @uref{http://code.google.com/p/address-sanitizer/} for
- more details. The run-time behavior can be influenced using the
- @env{ASAN_OPTIONS} environment variable; see
- @url{https://code.google.com/p/address-sanitizer/wiki/Flags#Run-time_flags} for
- a list of supported options.
- @item -fsanitize=kernel-address
- @opindex fsanitize=kernel-address
- Enable AddressSanitizer for Linux kernel.
- See @uref{http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerForKernel} for more details.
- @item -fsanitize=thread
- @opindex fsanitize=thread
- Enable ThreadSanitizer, a fast data race detector.
- Memory access instructions are instrumented to detect
- data race bugs. See @uref{http://code.google.com/p/thread-sanitizer/} for more
- details. The run-time behavior can be influenced using the @env{TSAN_OPTIONS}
- environment variable; see
- @url{https://code.google.com/p/thread-sanitizer/wiki/Flags} for a list of
- supported options.
- @item -fsanitize=leak
- @opindex fsanitize=leak
- Enable LeakSanitizer, a memory leak detector.
- This option only matters for linking of executables and if neither
- @option{-fsanitize=address} nor @option{-fsanitize=thread} is used. In that
- case the executable is linked against a library that overrides @code{malloc}
- and other allocator functions. See
- @uref{https://code.google.com/p/address-sanitizer/wiki/LeakSanitizer} for more
- details. The run-time behavior can be influenced using the
- @env{LSAN_OPTIONS} environment variable.
- @item -fsanitize=undefined
- @opindex fsanitize=undefined
- Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector.
- Various computations are instrumented to detect undefined behavior
- at runtime. Current suboptions are:
- @table @gcctabopt
- @item -fsanitize=shift
- @opindex fsanitize=shift
- This option enables checking that the result of a shift operation is
- not undefined. Note that what exactly is considered undefined differs
- slightly between C and C++, as well as between ISO C90 and C99, etc.
- @item -fsanitize=integer-divide-by-zero
- @opindex fsanitize=integer-divide-by-zero
- Detect integer division by zero as well as @code{INT_MIN / -1} division.
- @item -fsanitize=unreachable
- @opindex fsanitize=unreachable
- With this option, the compiler turns the @code{__builtin_unreachable}
- call into a diagnostics message call instead. When reaching the
- @code{__builtin_unreachable} call, the behavior is undefined.
- @item -fsanitize=vla-bound
- @opindex fsanitize=vla-bound
- This option instructs the compiler to check that the size of a variable
- length array is positive.
- @item -fsanitize=null
- @opindex fsanitize=null
- This option enables pointer checking. Particularly, the application
- built with this option turned on will issue an error message when it
- tries to dereference a NULL pointer, or if a reference (possibly an
- rvalue reference) is bound to a NULL pointer, or if a method is invoked
- on an object pointed by a NULL pointer.
- @item -fsanitize=return
- @opindex fsanitize=return
- This option enables return statement checking. Programs
- built with this option turned on will issue an error message
- when the end of a non-void function is reached without actually
- returning a value. This option works in C++ only.
- @item -fsanitize=signed-integer-overflow
- @opindex fsanitize=signed-integer-overflow
- This option enables signed integer overflow checking. We check that
- the result of @code{+}, @code{*}, and both unary and binary @code{-}
- does not overflow in the signed arithmetics. Note, integer promotion
- rules must be taken into account. That is, the following is not an
- overflow:
- @smallexample
- signed char a = SCHAR_MAX;
- a++;
- @end smallexample
- @item -fsanitize=bounds
- @opindex fsanitize=bounds
- This option enables instrumentation of array bounds. Various out of bounds
- accesses are detected. Flexible array members, flexible array member-like
- arrays, and initializers of variables with static storage are not instrumented.
- @item -fsanitize=alignment
- @opindex fsanitize=alignment
- This option enables checking of alignment of pointers when they are
- dereferenced, or when a reference is bound to insufficiently aligned target,
- or when a method or constructor is invoked on insufficiently aligned object.
- @item -fsanitize=object-size
- @opindex fsanitize=object-size
- This option enables instrumentation of memory references using the
- @code{__builtin_object_size} function. Various out of bounds pointer
- accesses are detected.
- @item -fsanitize=float-divide-by-zero
- @opindex fsanitize=float-divide-by-zero
- Detect floating-point division by zero. Unlike other similar options,
- @option{-fsanitize=float-divide-by-zero} is not enabled by
- @option{-fsanitize=undefined}, since floating-point division by zero can
- be a legitimate way of obtaining infinities and NaNs.
- @item -fsanitize=float-cast-overflow
- @opindex fsanitize=float-cast-overflow
- This option enables floating-point type to integer conversion checking.
- We check that the result of the conversion does not overflow.
- Unlike other similar options, @option{-fsanitize=float-cast-overflow} is
- not enabled by @option{-fsanitize=undefined}.
- This option does not work well with @code{FE_INVALID} exceptions enabled.
- @item -fsanitize=nonnull-attribute
- @opindex fsanitize=nonnull-attribute
- This option enables instrumentation of calls, checking whether null values
- are not passed to arguments marked as requiring a non-null value by the
- @code{nonnull} function attribute.
- @item -fsanitize=returns-nonnull-attribute
- @opindex fsanitize=returns-nonnull-attribute
- This option enables instrumentation of return statements in functions
- marked with @code{returns_nonnull} function attribute, to detect returning
- of null values from such functions.
- @item -fsanitize=bool
- @opindex fsanitize=bool
- This option enables instrumentation of loads from bool. If a value other
- than 0/1 is loaded, a run-time error is issued.
- @item -fsanitize=enum
- @opindex fsanitize=enum
- This option enables instrumentation of loads from an enum type. If
- a value outside the range of values for the enum type is loaded,
- a run-time error is issued.
- @item -fsanitize=vptr
- @opindex fsanitize=vptr
- This option enables instrumentation of C++ member function calls, member
- accesses and some conversions between pointers to base and derived classes,
- to verify the referenced object has the correct dynamic type.
- @end table
- While @option{-ftrapv} causes traps for signed overflows to be emitted,
- @option{-fsanitize=undefined} gives a diagnostic message.
- This currently works only for the C family of languages.
- @item -fno-sanitize=all
- @opindex fno-sanitize=all
- This option disables all previously enabled sanitizers.
- @option{-fsanitize=all} is not allowed, as some sanitizers cannot be used
- together.
- @item -fasan-shadow-offset=@var{number}
- @opindex fasan-shadow-offset
- This option forces GCC to use custom shadow offset in AddressSanitizer checks.
- It is useful for experimenting with different shadow memory layouts in
- Kernel AddressSanitizer.
- @item -fsanitize-recover@r{[}=@var{opts}@r{]}
- @opindex fsanitize-recover
- @opindex fno-sanitize-recover
- @option{-fsanitize-recover=} controls error recovery mode for sanitizers
- mentioned in comma-separated list of @var{opts}. Enabling this option
- for a sanitizer component causes it to attempt to continue
- running the program as if no error happened. This means multiple
- runtime errors can be reported in a single program run, and the exit
- code of the program may indicate success even when errors
- have been reported. The @option{-fno-sanitize-recover=} option
- can be used to alter
- this behavior: only the first detected error is reported
- and program then exits with a non-zero exit code.
- Currently this feature only works for @option{-fsanitize=undefined} (and its suboptions
- except for @option{-fsanitize=unreachable} and @option{-fsanitize=return}),
- @option{-fsanitize=float-cast-overflow}, @option{-fsanitize=float-divide-by-zero} and
- @option{-fsanitize=kernel-address}. For these sanitizers error recovery is turned on by default.
- @option{-fsanitize-recover=all} and @option{-fno-sanitize-recover=all} is also
- accepted, the former enables recovery for all sanitizers that support it,
- the latter disables recovery for all sanitizers that support it.
- Syntax without explicit @var{opts} parameter is deprecated. It is equivalent to
- @smallexample
- -fsanitize-recover=undefined,float-cast-overflow,float-divide-by-zero
- @end smallexample
- @noindent
- Similarly @option{-fno-sanitize-recover} is equivalent to
- @smallexample
- -fno-sanitize-recover=undefined,float-cast-overflow,float-divide-by-zero
- @end smallexample
- @item -fsanitize-undefined-trap-on-error
- @opindex fsanitize-undefined-trap-on-error
- The @option{-fsanitize-undefined-trap-on-error} option instructs the compiler to
- report undefined behavior using @code{__builtin_trap} rather than
- a @code{libubsan} library routine. The advantage of this is that the
- @code{libubsan} library is not needed and is not linked in, so this
- is usable even in freestanding environments.
- @item -fcheck-pointer-bounds
- @opindex fcheck-pointer-bounds
- @opindex fno-check-pointer-bounds
- @cindex Pointer Bounds Checker options
- Enable Pointer Bounds Checker instrumentation. Each memory reference
- is instrumented with checks of the pointer used for memory access against
- bounds associated with that pointer.
- Currently there
- is only an implementation for Intel MPX available, thus x86 target
- and @option{-mmpx} are required to enable this feature.
- MPX-based instrumentation requires
- a runtime library to enable MPX in hardware and handle bounds
- violation signals. By default when @option{-fcheck-pointer-bounds}
- and @option{-mmpx} options are used to link a program, the GCC driver
- links against the @file{libmpx} runtime library and @file{libmpxwrappers}
- library. It also passes '-z bndplt' to a linker in case it supports this
- option (which is checked on libmpx configuration). Note that old versions
- of linker may ignore option. Gold linker doesn't support '-z bndplt'
- option. With no '-z bndplt' support in linker all calls to dynamic libraries
- lose passed bounds reducing overall protection level. It's highly
- recommended to use linker with '-z bndplt' support. In case such linker
- is not available it is adviced to always use @option{-static-libmpxwrappers}
- for better protection level or use @option{-static} to completely avoid
- external calls to dynamic libraries. MPX-based instrumentation
- may be used for debugging and also may be included in production code
- to increase program security. Depending on usage, you may
- have different requirements for the runtime library. The current version
- of the MPX runtime library is more oriented for use as a debugging
- tool. MPX runtime library usage implies @option{-lpthread}. See
- also @option{-static-libmpx}. The runtime library behavior can be
- influenced using various @env{CHKP_RT_*} environment variables. See
- @uref{https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler}
- for more details.
- Generated instrumentation may be controlled by various
- @option{-fchkp-*} options and by the @code{bnd_variable_size}
- structure field attribute (@pxref{Type Attributes}) and
- @code{bnd_legacy}, and @code{bnd_instrument} function attributes
- (@pxref{Function Attributes}). GCC also provides a number of built-in
- functions for controlling the Pointer Bounds Checker. @xref{Pointer
- Bounds Checker builtins}, for more information.
- @item -fchkp-check-incomplete-type
- @opindex fchkp-check-incomplete-type
- @opindex fno-chkp-check-incomplete-type
- Generate pointer bounds checks for variables with incomplete type.
- Enabled by default.
- @item -fchkp-narrow-bounds
- @opindex fchkp-narrow-bounds
- @opindex fno-chkp-narrow-bounds
- Controls bounds used by Pointer Bounds Checker for pointers to object
- fields. If narrowing is enabled then field bounds are used. Otherwise
- object bounds are used. See also @option{-fchkp-narrow-to-innermost-array}
- and @option{-fchkp-first-field-has-own-bounds}. Enabled by default.
- @item -fchkp-first-field-has-own-bounds
- @opindex fchkp-first-field-has-own-bounds
- @opindex fno-chkp-first-field-has-own-bounds
- Forces Pointer Bounds Checker to use narrowed bounds for the address of the
- first field in the structure. By default a pointer to the first field has
- the same bounds as a pointer to the whole structure.
- @item -fchkp-narrow-to-innermost-array
- @opindex fchkp-narrow-to-innermost-array
- @opindex fno-chkp-narrow-to-innermost-array
- Forces Pointer Bounds Checker to use bounds of the innermost arrays in
- case of nested static array access. By default this option is disabled and
- bounds of the outermost array are used.
- @item -fchkp-optimize
- @opindex fchkp-optimize
- @opindex fno-chkp-optimize
- Enables Pointer Bounds Checker optimizations. Enabled by default at
- optimization levels @option{-O}, @option{-O2}, @option{-O3}.
- @item -fchkp-use-fast-string-functions
- @opindex fchkp-use-fast-string-functions
- @opindex fno-chkp-use-fast-string-functions
- Enables use of @code{*_nobnd} versions of string functions (not copying bounds)
- by Pointer Bounds Checker. Disabled by default.
- @item -fchkp-use-nochk-string-functions
- @opindex fchkp-use-nochk-string-functions
- @opindex fno-chkp-use-nochk-string-functions
- Enables use of @code{*_nochk} versions of string functions (not checking bounds)
- by Pointer Bounds Checker. Disabled by default.
- @item -fchkp-use-static-bounds
- @opindex fchkp-use-static-bounds
- @opindex fno-chkp-use-static-bounds
- Allow Pointer Bounds Checker to generate static bounds holding
- bounds of static variables. Enabled by default.
- @item -fchkp-use-static-const-bounds
- @opindex fchkp-use-static-const-bounds
- @opindex fno-chkp-use-static-const-bounds
- Use statically-initialized bounds for constant bounds instead of
- generating them each time they are required. By default enabled when
- @option{-fchkp-use-static-bounds} is enabled.
- @item -fchkp-treat-zero-dynamic-size-as-infinite
- @opindex fchkp-treat-zero-dynamic-size-as-infinite
- @opindex fno-chkp-treat-zero-dynamic-size-as-infinite
- With this option, objects with incomplete type whose
- dynamically-obtained size is zero are treated as having infinite size
- instead by Pointer Bounds
- Checker. This option may be helpful if a program is linked with a library
- missing size information for some symbols. Disabled by default.
- @item -fchkp-check-read
- @opindex fchkp-check-read
- @opindex fno-chkp-check-read
- Instructs Pointer Bounds Checker to generate checks for all read
- accesses to memory. Enabled by default.
- @item -fchkp-check-write
- @opindex fchkp-check-write
- @opindex fno-chkp-check-write
- Instructs Pointer Bounds Checker to generate checks for all write
- accesses to memory. Enabled by default.
- @item -fchkp-store-bounds
- @opindex fchkp-store-bounds
- @opindex fno-chkp-store-bounds
- Instructs Pointer Bounds Checker to generate bounds stores for
- pointer writes. Enabled by default.
- @item -fchkp-instrument-calls
- @opindex fchkp-instrument-calls
- @opindex fno-chkp-instrument-calls
- Instructs Pointer Bounds Checker to pass pointer bounds to calls.
- Enabled by default.
- @item -fchkp-instrument-marked-only
- @opindex fchkp-instrument-marked-only
- @opindex fno-chkp-instrument-marked-only
- Instructs Pointer Bounds Checker to instrument only functions
- marked with the @code{bnd_instrument} attribute
- (@pxref{Function Attributes}). Disabled by default.
- @item -fchkp-use-wrappers
- @opindex fchkp-use-wrappers
- @opindex fno-chkp-use-wrappers
- Allows Pointer Bounds Checker to replace calls to built-in functions
- with calls to wrapper functions. When @option{-fchkp-use-wrappers}
- is used to link a program, the GCC driver automatically links
- against @file{libmpxwrappers}. See also @option{-static-libmpxwrappers}.
- Enabled by default.
- @item -fdump-final-insns@r{[}=@var{file}@r{]}
- @opindex fdump-final-insns
- Dump the final internal representation (RTL) to @var{file}. If the
- optional argument is omitted (or if @var{file} is @code{.}), the name
- of the dump file is determined by appending @code{.gkd} to the
- compilation output file name.
- @item -fcompare-debug@r{[}=@var{opts}@r{]}
- @opindex fcompare-debug
- @opindex fno-compare-debug
- If no error occurs during compilation, run the compiler a second time,
- adding @var{opts} and @option{-fcompare-debug-second} to the arguments
- passed to the second compilation. Dump the final internal
- representation in both compilations, and print an error if they differ.
- If the equal sign is omitted, the default @option{-gtoggle} is used.
- The environment variable @env{GCC_COMPARE_DEBUG}, if defined, non-empty
- and nonzero, implicitly enables @option{-fcompare-debug}. If
- @env{GCC_COMPARE_DEBUG} is defined to a string starting with a dash,
- then it is used for @var{opts}, otherwise the default @option{-gtoggle}
- is used.
- @option{-fcompare-debug=}, with the equal sign but without @var{opts},
- is equivalent to @option{-fno-compare-debug}, which disables the dumping
- of the final representation and the second compilation, preventing even
- @env{GCC_COMPARE_DEBUG} from taking effect.
- To verify full coverage during @option{-fcompare-debug} testing, set
- @env{GCC_COMPARE_DEBUG} to say @option{-fcompare-debug-not-overridden},
- which GCC rejects as an invalid option in any actual compilation
- (rather than preprocessing, assembly or linking). To get just a
- warning, setting @env{GCC_COMPARE_DEBUG} to @samp{-w%n-fcompare-debug
- not overridden} will do.
- @item -fcompare-debug-second
- @opindex fcompare-debug-second
- This option is implicitly passed to the compiler for the second
- compilation requested by @option{-fcompare-debug}, along with options to
- silence warnings, and omitting other options that would cause
- side-effect compiler outputs to files or to the standard output. Dump
- files and preserved temporary files are renamed so as to contain the
- @code{.gk} additional extension during the second compilation, to avoid
- overwriting those generated by the first.
- When this option is passed to the compiler driver, it causes the
- @emph{first} compilation to be skipped, which makes it useful for little
- other than debugging the compiler proper.
- @item -feliminate-dwarf2-dups
- @opindex feliminate-dwarf2-dups
- Compress DWARF 2 debugging information by eliminating duplicated
- information about each symbol. This option only makes sense when
- generating DWARF 2 debugging information with @option{-gdwarf-2}.
- @item -femit-struct-debug-baseonly
- @opindex femit-struct-debug-baseonly
- Emit debug information for struct-like types
- only when the base name of the compilation source file
- matches the base name of file in which the struct is defined.
- This option substantially reduces the size of debugging information,
- but at significant potential loss in type information to the debugger.
- See @option{-femit-struct-debug-reduced} for a less aggressive option.
- See @option{-femit-struct-debug-detailed} for more detailed control.
- This option works only with DWARF 2.
- @item -femit-struct-debug-reduced
- @opindex femit-struct-debug-reduced
- Emit debug information for struct-like types
- only when the base name of the compilation source file
- matches the base name of file in which the type is defined,
- unless the struct is a template or defined in a system header.
- This option significantly reduces the size of debugging information,
- with some potential loss in type information to the debugger.
- See @option{-femit-struct-debug-baseonly} for a more aggressive option.
- See @option{-femit-struct-debug-detailed} for more detailed control.
- This option works only with DWARF 2.
- @item -femit-struct-debug-detailed@r{[}=@var{spec-list}@r{]}
- @opindex femit-struct-debug-detailed
- Specify the struct-like types
- for which the compiler generates debug information.
- The intent is to reduce duplicate struct debug information
- between different object files within the same program.
- This option is a detailed version of
- @option{-femit-struct-debug-reduced} and @option{-femit-struct-debug-baseonly},
- which serves for most needs.
- A specification has the syntax@*
- [@samp{dir:}|@samp{ind:}][@samp{ord:}|@samp{gen:}](@samp{any}|@samp{sys}|@samp{base}|@samp{none})
- The optional first word limits the specification to
- structs that are used directly (@samp{dir:}) or used indirectly (@samp{ind:}).
- A struct type is used directly when it is the type of a variable, member.
- Indirect uses arise through pointers to structs.
- That is, when use of an incomplete struct is valid, the use is indirect.
- An example is
- @samp{struct one direct; struct two * indirect;}.
- The optional second word limits the specification to
- ordinary structs (@samp{ord:}) or generic structs (@samp{gen:}).
- Generic structs are a bit complicated to explain.
- For C++, these are non-explicit specializations of template classes,
- or non-template classes within the above.
- Other programming languages have generics,
- but @option{-femit-struct-debug-detailed} does not yet implement them.
- The third word specifies the source files for those
- structs for which the compiler should emit debug information.
- The values @samp{none} and @samp{any} have the normal meaning.
- The value @samp{base} means that
- the base of name of the file in which the type declaration appears
- must match the base of the name of the main compilation file.
- In practice, this means that when compiling @file{foo.c}, debug information
- is generated for types declared in that file and @file{foo.h},
- but not other header files.
- The value @samp{sys} means those types satisfying @samp{base}
- or declared in system or compiler headers.
- You may need to experiment to determine the best settings for your application.
- The default is @option{-femit-struct-debug-detailed=all}.
- This option works only with DWARF 2.
- @item -fno-merge-debug-strings
- @opindex fmerge-debug-strings
- @opindex fno-merge-debug-strings
- Direct the linker to not merge together strings in the debugging
- information that are identical in different object files. Merging is
- not supported by all assemblers or linkers. Merging decreases the size
- of the debug information in the output file at the cost of increasing
- link processing time. Merging is enabled by default.
- @item -fdebug-prefix-map=@var{old}=@var{new}
- @opindex fdebug-prefix-map
- When compiling files in directory @file{@var{old}}, record debugging
- information describing them as in @file{@var{new}} instead.
- @item -fno-dwarf2-cfi-asm
- @opindex fdwarf2-cfi-asm
- @opindex fno-dwarf2-cfi-asm
- Emit DWARF 2 unwind info as compiler generated @code{.eh_frame} section
- instead of using GAS @code{.cfi_*} directives.
- @cindex @command{prof}
- @item -p
- @opindex p
- Generate extra code to write profile information suitable for the
- analysis program @command{prof}. You must use this option when compiling
- the source files you want data about, and you must also use it when
- linking.
- @cindex @command{gprof}
- @item -pg
- @opindex pg
- Generate extra code to write profile information suitable for the
- analysis program @command{gprof}. You must use this option when compiling
- the source files you want data about, and you must also use it when
- linking.
- @item -Q
- @opindex Q
- Makes the compiler print out each function name as it is compiled, and
- print some statistics about each pass when it finishes.
- @item -ftime-report
- @opindex ftime-report
- Makes the compiler print some statistics about the time consumed by each
- pass when it finishes.
- @item -fmem-report
- @opindex fmem-report
- Makes the compiler print some statistics about permanent memory
- allocation when it finishes.
- @item -fmem-report-wpa
- @opindex fmem-report-wpa
- Makes the compiler print some statistics about permanent memory
- allocation for the WPA phase only.
- @item -fpre-ipa-mem-report
- @opindex fpre-ipa-mem-report
- @item -fpost-ipa-mem-report
- @opindex fpost-ipa-mem-report
- Makes the compiler print some statistics about permanent memory
- allocation before or after interprocedural optimization.
- @item -fprofile-report
- @opindex fprofile-report
- Makes the compiler print some statistics about consistency of the
- (estimated) profile and effect of individual passes.
- @item -fstack-usage
- @opindex fstack-usage
- Makes the compiler output stack usage information for the program, on a
- per-function basis. The filename for the dump is made by appending
- @file{.su} to the @var{auxname}. @var{auxname} is generated from the name of
- the output file, if explicitly specified and it is not an executable,
- otherwise it is the basename of the source file. An entry is made up
- of three fields:
- @itemize
- @item
- The name of the function.
- @item
- A number of bytes.
- @item
- One or more qualifiers: @code{static}, @code{dynamic}, @code{bounded}.
- @end itemize
- The qualifier @code{static} means that the function manipulates the stack
- statically: a fixed number of bytes are allocated for the frame on function
- entry and released on function exit; no stack adjustments are otherwise made
- in the function. The second field is this fixed number of bytes.
- The qualifier @code{dynamic} means that the function manipulates the stack
- dynamically: in addition to the static allocation described above, stack
- adjustments are made in the body of the function, for example to push/pop
- arguments around function calls. If the qualifier @code{bounded} is also
- present, the amount of these adjustments is bounded at compile time and
- the second field is an upper bound of the total amount of stack used by
- the function. If it is not present, the amount of these adjustments is
- not bounded at compile time and the second field only represents the
- bounded part.
- @item -fprofile-arcs
- @opindex fprofile-arcs
- Add code so that program flow @dfn{arcs} are instrumented. During
- execution the program records how many times each branch and call is
- executed and how many times it is taken or returns. When the compiled
- program exits it saves this data to a file called
- @file{@var{auxname}.gcda} for each source file. The data may be used for
- profile-directed optimizations (@option{-fbranch-probabilities}), or for
- test coverage analysis (@option{-ftest-coverage}). Each object file's
- @var{auxname} is generated from the name of the output file, if
- explicitly specified and it is not the final executable, otherwise it is
- the basename of the source file. In both cases any suffix is removed
- (e.g.@: @file{foo.gcda} for input file @file{dir/foo.c}, or
- @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}).
- @xref{Cross-profiling}.
- @cindex @command{gcov}
- @item --coverage
- @opindex coverage
- This option is used to compile and link code instrumented for coverage
- analysis. The option is a synonym for @option{-fprofile-arcs}
- @option{-ftest-coverage} (when compiling) and @option{-lgcov} (when
- linking). See the documentation for those options for more details.
- @itemize
- @item
- Compile the source files with @option{-fprofile-arcs} plus optimization
- and code generation options. For test coverage analysis, use the
- additional @option{-ftest-coverage} option. You do not need to profile
- every source file in a program.
- @item
- Link your object files with @option{-lgcov} or @option{-fprofile-arcs}
- (the latter implies the former).
- @item
- Run the program on a representative workload to generate the arc profile
- information. This may be repeated any number of times. You can run
- concurrent instances of your program, and provided that the file system
- supports locking, the data files will be correctly updated. Also
- @code{fork} calls are detected and correctly handled (double counting
- will not happen).
- @item
- For profile-directed optimizations, compile the source files again with
- the same optimization and code generation options plus
- @option{-fbranch-probabilities} (@pxref{Optimize Options,,Options that
- Control Optimization}).
- @item
- For test coverage analysis, use @command{gcov} to produce human readable
- information from the @file{.gcno} and @file{.gcda} files. Refer to the
- @command{gcov} documentation for further information.
- @end itemize
- With @option{-fprofile-arcs}, for each function of your program GCC
- creates a program flow graph, then finds a spanning tree for the graph.
- Only arcs that are not on the spanning tree have to be instrumented: the
- compiler adds code to count the number of times that these arcs are
- executed. When an arc is the only exit or only entrance to a block, the
- instrumentation code can be added to the block; otherwise, a new basic
- block must be created to hold the instrumentation code.
- @need 2000
- @item -ftest-coverage
- @opindex ftest-coverage
- Produce a notes file that the @command{gcov} code-coverage utility
- (@pxref{Gcov,, @command{gcov}---a Test Coverage Program}) can use to
- show program coverage. Each source file's note file is called
- @file{@var{auxname}.gcno}. Refer to the @option{-fprofile-arcs} option
- above for a description of @var{auxname} and instructions on how to
- generate test coverage data. Coverage data matches the source files
- more closely if you do not optimize.
- @item -fdbg-cnt-list
- @opindex fdbg-cnt-list
- Print the name and the counter upper bound for all debug counters.
- @item -fdbg-cnt=@var{counter-value-list}
- @opindex fdbg-cnt
- Set the internal debug counter upper bound. @var{counter-value-list}
- is a comma-separated list of @var{name}:@var{value} pairs
- which sets the upper bound of each debug counter @var{name} to @var{value}.
- All debug counters have the initial upper bound of @code{UINT_MAX};
- thus @code{dbg_cnt} returns true always unless the upper bound
- is set by this option.
- For example, with @option{-fdbg-cnt=dce:10,tail_call:0},
- @code{dbg_cnt(dce)} returns true only for first 10 invocations.
- @item -fenable-@var{kind}-@var{pass}
- @itemx -fdisable-@var{kind}-@var{pass}=@var{range-list}
- @opindex fdisable-
- @opindex fenable-
- This is a set of options that are used to explicitly disable/enable
- optimization passes. These options are intended for use for debugging GCC.
- Compiler users should use regular options for enabling/disabling
- passes instead.
- @table @gcctabopt
- @item -fdisable-ipa-@var{pass}
- Disable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is
- statically invoked in the compiler multiple times, the pass name should be
- appended with a sequential number starting from 1.
- @item -fdisable-rtl-@var{pass}
- @itemx -fdisable-rtl-@var{pass}=@var{range-list}
- Disable RTL pass @var{pass}. @var{pass} is the pass name. If the same pass is
- statically invoked in the compiler multiple times, the pass name should be
- appended with a sequential number starting from 1. @var{range-list} is a
- comma-separated list of function ranges or assembler names. Each range is a number
- pair separated by a colon. The range is inclusive in both ends. If the range
- is trivial, the number pair can be simplified as a single number. If the
- function's call graph node's @var{uid} falls within one of the specified ranges,
- the @var{pass} is disabled for that function. The @var{uid} is shown in the
- function header of a dump file, and the pass names can be dumped by using
- option @option{-fdump-passes}.
- @item -fdisable-tree-@var{pass}
- @itemx -fdisable-tree-@var{pass}=@var{range-list}
- Disable tree pass @var{pass}. See @option{-fdisable-rtl} for the description of
- option arguments.
- @item -fenable-ipa-@var{pass}
- Enable IPA pass @var{pass}. @var{pass} is the pass name. If the same pass is
- statically invoked in the compiler multiple times, the pass name should be
- appended with a sequential number starting from 1.
- @item -fenable-rtl-@var{pass}
- @itemx -fenable-rtl-@var{pass}=@var{range-list}
- Enable RTL pass @var{pass}. See @option{-fdisable-rtl} for option argument
- description and examples.
- @item -fenable-tree-@var{pass}
- @itemx -fenable-tree-@var{pass}=@var{range-list}
- Enable tree pass @var{pass}. See @option{-fdisable-rtl} for the description
- of option arguments.
- @end table
- Here are some examples showing uses of these options.
- @smallexample
- # disable ccp1 for all functions
- -fdisable-tree-ccp1
- # disable complete unroll for function whose cgraph node uid is 1
- -fenable-tree-cunroll=1
- # disable gcse2 for functions at the following ranges [1,1],
- # [300,400], and [400,1000]
- # disable gcse2 for functions foo and foo2
- -fdisable-rtl-gcse2=foo,foo2
- # disable early inlining
- -fdisable-tree-einline
- # disable ipa inlining
- -fdisable-ipa-inline
- # enable tree full unroll
- -fenable-tree-unroll
- @end smallexample
- @item -d@var{letters}
- @itemx -fdump-rtl-@var{pass}
- @itemx -fdump-rtl-@var{pass}=@var{filename}
- @opindex d
- @opindex fdump-rtl-@var{pass}
- Says to make debugging dumps during compilation at times specified by
- @var{letters}. This is used for debugging the RTL-based passes of the
- compiler. The file names for most of the dumps are made by appending
- a pass number and a word to the @var{dumpname}, and the files are
- created in the directory of the output file. In case of
- @option{=@var{filename}} option, the dump is output on the given file
- instead of the pass numbered dump files. Note that the pass number is
- computed statically as passes get registered into the pass manager.
- Thus the numbering is not related to the dynamic order of execution of
- passes. In particular, a pass installed by a plugin could have a
- number over 200 even if it executed quite early. @var{dumpname} is
- generated from the name of the output file, if explicitly specified
- and it is not an executable, otherwise it is the basename of the
- source file. These switches may have different effects when
- @option{-E} is used for preprocessing.
- Debug dumps can be enabled with a @option{-fdump-rtl} switch or some
- @option{-d} option @var{letters}. Here are the possible
- letters for use in @var{pass} and @var{letters}, and their meanings:
- @table @gcctabopt
- @item -fdump-rtl-alignments
- @opindex fdump-rtl-alignments
- Dump after branch alignments have been computed.
- @item -fdump-rtl-asmcons
- @opindex fdump-rtl-asmcons
- Dump after fixing rtl statements that have unsatisfied in/out constraints.
- @item -fdump-rtl-auto_inc_dec
- @opindex fdump-rtl-auto_inc_dec
- Dump after auto-inc-dec discovery. This pass is only run on
- architectures that have auto inc or auto dec instructions.
- @item -fdump-rtl-barriers
- @opindex fdump-rtl-barriers
- Dump after cleaning up the barrier instructions.
- @item -fdump-rtl-bbpart
- @opindex fdump-rtl-bbpart
- Dump after partitioning hot and cold basic blocks.
- @item -fdump-rtl-bbro
- @opindex fdump-rtl-bbro
- Dump after block reordering.
- @item -fdump-rtl-btl1
- @itemx -fdump-rtl-btl2
- @opindex fdump-rtl-btl2
- @opindex fdump-rtl-btl2
- @option{-fdump-rtl-btl1} and @option{-fdump-rtl-btl2} enable dumping
- after the two branch
- target load optimization passes.
- @item -fdump-rtl-bypass
- @opindex fdump-rtl-bypass
- Dump after jump bypassing and control flow optimizations.
- @item -fdump-rtl-combine
- @opindex fdump-rtl-combine
- Dump after the RTL instruction combination pass.
- @item -fdump-rtl-compgotos
- @opindex fdump-rtl-compgotos
- Dump after duplicating the computed gotos.
- @item -fdump-rtl-ce1
- @itemx -fdump-rtl-ce2
- @itemx -fdump-rtl-ce3
- @opindex fdump-rtl-ce1
- @opindex fdump-rtl-ce2
- @opindex fdump-rtl-ce3
- @option{-fdump-rtl-ce1}, @option{-fdump-rtl-ce2}, and
- @option{-fdump-rtl-ce3} enable dumping after the three
- if conversion passes.
- @item -fdump-rtl-cprop_hardreg
- @opindex fdump-rtl-cprop_hardreg
- Dump after hard register copy propagation.
- @item -fdump-rtl-csa
- @opindex fdump-rtl-csa
- Dump after combining stack adjustments.
- @item -fdump-rtl-cse1
- @itemx -fdump-rtl-cse2
- @opindex fdump-rtl-cse1
- @opindex fdump-rtl-cse2
- @option{-fdump-rtl-cse1} and @option{-fdump-rtl-cse2} enable dumping after
- the two common subexpression elimination passes.
- @item -fdump-rtl-dce
- @opindex fdump-rtl-dce
- Dump after the standalone dead code elimination passes.
- @item -fdump-rtl-dbr
- @opindex fdump-rtl-dbr
- Dump after delayed branch scheduling.
- @item -fdump-rtl-dce1
- @itemx -fdump-rtl-dce2
- @opindex fdump-rtl-dce1
- @opindex fdump-rtl-dce2
- @option{-fdump-rtl-dce1} and @option{-fdump-rtl-dce2} enable dumping after
- the two dead store elimination passes.
- @item -fdump-rtl-eh
- @opindex fdump-rtl-eh
- Dump after finalization of EH handling code.
- @item -fdump-rtl-eh_ranges
- @opindex fdump-rtl-eh_ranges
- Dump after conversion of EH handling range regions.
- @item -fdump-rtl-expand
- @opindex fdump-rtl-expand
- Dump after RTL generation.
- @item -fdump-rtl-fwprop1
- @itemx -fdump-rtl-fwprop2
- @opindex fdump-rtl-fwprop1
- @opindex fdump-rtl-fwprop2
- @option{-fdump-rtl-fwprop1} and @option{-fdump-rtl-fwprop2} enable
- dumping after the two forward propagation passes.
- @item -fdump-rtl-gcse1
- @itemx -fdump-rtl-gcse2
- @opindex fdump-rtl-gcse1
- @opindex fdump-rtl-gcse2
- @option{-fdump-rtl-gcse1} and @option{-fdump-rtl-gcse2} enable dumping
- after global common subexpression elimination.
- @item -fdump-rtl-init-regs
- @opindex fdump-rtl-init-regs
- Dump after the initialization of the registers.
- @item -fdump-rtl-initvals
- @opindex fdump-rtl-initvals
- Dump after the computation of the initial value sets.
- @item -fdump-rtl-into_cfglayout
- @opindex fdump-rtl-into_cfglayout
- Dump after converting to cfglayout mode.
- @item -fdump-rtl-ira
- @opindex fdump-rtl-ira
- Dump after iterated register allocation.
- @item -fdump-rtl-jump
- @opindex fdump-rtl-jump
- Dump after the second jump optimization.
- @item -fdump-rtl-loop2
- @opindex fdump-rtl-loop2
- @option{-fdump-rtl-loop2} enables dumping after the rtl
- loop optimization passes.
- @item -fdump-rtl-mach
- @opindex fdump-rtl-mach
- Dump after performing the machine dependent reorganization pass, if that
- pass exists.
- @item -fdump-rtl-mode_sw
- @opindex fdump-rtl-mode_sw
- Dump after removing redundant mode switches.
- @item -fdump-rtl-rnreg
- @opindex fdump-rtl-rnreg
- Dump after register renumbering.
- @item -fdump-rtl-outof_cfglayout
- @opindex fdump-rtl-outof_cfglayout
- Dump after converting from cfglayout mode.
- @item -fdump-rtl-peephole2
- @opindex fdump-rtl-peephole2
- Dump after the peephole pass.
- @item -fdump-rtl-postreload
- @opindex fdump-rtl-postreload
- Dump after post-reload optimizations.
- @item -fdump-rtl-pro_and_epilogue
- @opindex fdump-rtl-pro_and_epilogue
- Dump after generating the function prologues and epilogues.
- @item -fdump-rtl-sched1
- @itemx -fdump-rtl-sched2
- @opindex fdump-rtl-sched1
- @opindex fdump-rtl-sched2
- @option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2} enable dumping
- after the basic block scheduling passes.
- @item -fdump-rtl-ree
- @opindex fdump-rtl-ree
- Dump after sign/zero extension elimination.
- @item -fdump-rtl-seqabstr
- @opindex fdump-rtl-seqabstr
- Dump after common sequence discovery.
- @item -fdump-rtl-shorten
- @opindex fdump-rtl-shorten
- Dump after shortening branches.
- @item -fdump-rtl-sibling
- @opindex fdump-rtl-sibling
- Dump after sibling call optimizations.
- @item -fdump-rtl-split1
- @itemx -fdump-rtl-split2
- @itemx -fdump-rtl-split3
- @itemx -fdump-rtl-split4
- @itemx -fdump-rtl-split5
- @opindex fdump-rtl-split1
- @opindex fdump-rtl-split2
- @opindex fdump-rtl-split3
- @opindex fdump-rtl-split4
- @opindex fdump-rtl-split5
- These options enable dumping after five rounds of
- instruction splitting.
- @item -fdump-rtl-sms
- @opindex fdump-rtl-sms
- Dump after modulo scheduling. This pass is only run on some
- architectures.
- @item -fdump-rtl-stack
- @opindex fdump-rtl-stack
- Dump after conversion from GCC's ``flat register file'' registers to the
- x87's stack-like registers. This pass is only run on x86 variants.
- @item -fdump-rtl-subreg1
- @itemx -fdump-rtl-subreg2
- @opindex fdump-rtl-subreg1
- @opindex fdump-rtl-subreg2
- @option{-fdump-rtl-subreg1} and @option{-fdump-rtl-subreg2} enable dumping after
- the two subreg expansion passes.
- @item -fdump-rtl-unshare
- @opindex fdump-rtl-unshare
- Dump after all rtl has been unshared.
- @item -fdump-rtl-vartrack
- @opindex fdump-rtl-vartrack
- Dump after variable tracking.
- @item -fdump-rtl-vregs
- @opindex fdump-rtl-vregs
- Dump after converting virtual registers to hard registers.
- @item -fdump-rtl-web
- @opindex fdump-rtl-web
- Dump after live range splitting.
- @item -fdump-rtl-regclass
- @itemx -fdump-rtl-subregs_of_mode_init
- @itemx -fdump-rtl-subregs_of_mode_finish
- @itemx -fdump-rtl-dfinit
- @itemx -fdump-rtl-dfinish
- @opindex fdump-rtl-regclass
- @opindex fdump-rtl-subregs_of_mode_init
- @opindex fdump-rtl-subregs_of_mode_finish
- @opindex fdump-rtl-dfinit
- @opindex fdump-rtl-dfinish
- These dumps are defined but always produce empty files.
- @item -da
- @itemx -fdump-rtl-all
- @opindex da
- @opindex fdump-rtl-all
- Produce all the dumps listed above.
- @item -dA
- @opindex dA
- Annotate the assembler output with miscellaneous debugging information.
- @item -dD
- @opindex dD
- Dump all macro definitions, at the end of preprocessing, in addition to
- normal output.
- @item -dH
- @opindex dH
- Produce a core dump whenever an error occurs.
- @item -dp
- @opindex dp
- Annotate the assembler output with a comment indicating which
- pattern and alternative is used. The length of each instruction is
- also printed.
- @item -dP
- @opindex dP
- Dump the RTL in the assembler output as a comment before each instruction.
- Also turns on @option{-dp} annotation.
- @item -dx
- @opindex dx
- Just generate RTL for a function instead of compiling it. Usually used
- with @option{-fdump-rtl-expand}.
- @end table
- @item -fdump-noaddr
- @opindex fdump-noaddr
- When doing debugging dumps, suppress address output. This makes it more
- feasible to use diff on debugging dumps for compiler invocations with
- different compiler binaries and/or different
- text / bss / data / heap / stack / dso start locations.
- @item -freport-bug
- @opindex freport-bug
- Collect and dump debug information into temporary file if ICE in C/C++
- compiler occured.
- @item -fdump-unnumbered
- @opindex fdump-unnumbered
- When doing debugging dumps, suppress instruction numbers and address output.
- This makes it more feasible to use diff on debugging dumps for compiler
- invocations with different options, in particular with and without
- @option{-g}.
- @item -fdump-unnumbered-links
- @opindex fdump-unnumbered-links
- When doing debugging dumps (see @option{-d} option above), suppress
- instruction numbers for the links to the previous and next instructions
- in a sequence.
- @item -fdump-translation-unit @r{(C++ only)}
- @itemx -fdump-translation-unit-@var{options} @r{(C++ only)}
- @opindex fdump-translation-unit
- Dump a representation of the tree structure for the entire translation
- unit to a file. The file name is made by appending @file{.tu} to the
- source file name, and the file is created in the same directory as the
- output file. If the @samp{-@var{options}} form is used, @var{options}
- controls the details of the dump as described for the
- @option{-fdump-tree} options.
- @item -fdump-class-hierarchy @r{(C++ only)}
- @itemx -fdump-class-hierarchy-@var{options} @r{(C++ only)}
- @opindex fdump-class-hierarchy
- Dump a representation of each class's hierarchy and virtual function
- table layout to a file. The file name is made by appending
- @file{.class} to the source file name, and the file is created in the
- same directory as the output file. If the @samp{-@var{options}} form
- is used, @var{options} controls the details of the dump as described
- for the @option{-fdump-tree} options.
- @item -fdump-ipa-@var{switch}
- @opindex fdump-ipa
- Control the dumping at various stages of inter-procedural analysis
- language tree to a file. The file name is generated by appending a
- switch specific suffix to the source file name, and the file is created
- in the same directory as the output file. The following dumps are
- possible:
- @table @samp
- @item all
- Enables all inter-procedural analysis dumps.
- @item cgraph
- Dumps information about call-graph optimization, unused function removal,
- and inlining decisions.
- @item inline
- Dump after function inlining.
- @end table
- @item -fdump-passes
- @opindex fdump-passes
- Dump the list of optimization passes that are turned on and off by
- the current command-line options.
- @item -fdump-statistics-@var{option}
- @opindex fdump-statistics
- Enable and control dumping of pass statistics in a separate file. The
- file name is generated by appending a suffix ending in
- @samp{.statistics} to the source file name, and the file is created in
- the same directory as the output file. If the @samp{-@var{option}}
- form is used, @samp{-stats} causes counters to be summed over the
- whole compilation unit while @samp{-details} dumps every event as
- the passes generate them. The default with no option is to sum
- counters for each function compiled.
- @item -fdump-tree-@var{switch}
- @itemx -fdump-tree-@var{switch}-@var{options}
- @itemx -fdump-tree-@var{switch}-@var{options}=@var{filename}
- @opindex fdump-tree
- Control the dumping at various stages of processing the intermediate
- language tree to a file. The file name is generated by appending a
- switch-specific suffix to the source file name, and the file is
- created in the same directory as the output file. In case of
- @option{=@var{filename}} option, the dump is output on the given file
- instead of the auto named dump files. If the @samp{-@var{options}}
- form is used, @var{options} is a list of @samp{-} separated options
- which control the details of the dump. Not all options are applicable
- to all dumps; those that are not meaningful are ignored. The
- following options are available
- @table @samp
- @item address
- Print the address of each node. Usually this is not meaningful as it
- changes according to the environment and source file. Its primary use
- is for tying up a dump file with a debug environment.
- @item asmname
- If @code{DECL_ASSEMBLER_NAME} has been set for a given decl, use that
- in the dump instead of @code{DECL_NAME}. Its primary use is ease of
- use working backward from mangled names in the assembly file.
- @item slim
- When dumping front-end intermediate representations, inhibit dumping
- of members of a scope or body of a function merely because that scope
- has been reached. Only dump such items when they are directly reachable
- by some other path.
- When dumping pretty-printed trees, this option inhibits dumping the
- bodies of control structures.
- When dumping RTL, print the RTL in slim (condensed) form instead of
- the default LISP-like representation.
- @item raw
- Print a raw representation of the tree. By default, trees are
- pretty-printed into a C-like representation.
- @item details
- Enable more detailed dumps (not honored by every dump option). Also
- include information from the optimization passes.
- @item stats
- Enable dumping various statistics about the pass (not honored by every dump
- option).
- @item blocks
- Enable showing basic block boundaries (disabled in raw dumps).
- @item graph
- For each of the other indicated dump files (@option{-fdump-rtl-@var{pass}}),
- dump a representation of the control flow graph suitable for viewing with
- GraphViz to @file{@var{file}.@var{passid}.@var{pass}.dot}. Each function in
- the file is pretty-printed as a subgraph, so that GraphViz can render them
- all in a single plot.
- This option currently only works for RTL dumps, and the RTL is always
- dumped in slim form.
- @item vops
- Enable showing virtual operands for every statement.
- @item lineno
- Enable showing line numbers for statements.
- @item uid
- Enable showing the unique ID (@code{DECL_UID}) for each variable.
- @item verbose
- Enable showing the tree dump for each statement.
- @item eh
- Enable showing the EH region number holding each statement.
- @item scev
- Enable showing scalar evolution analysis details.
- @item optimized
- Enable showing optimization information (only available in certain
- passes).
- @item missed
- Enable showing missed optimization information (only available in certain
- passes).
- @item note
- Enable other detailed optimization information (only available in
- certain passes).
- @item =@var{filename}
- Instead of an auto named dump file, output into the given file
- name. The file names @file{stdout} and @file{stderr} are treated
- specially and are considered already open standard streams. For
- example,
- @smallexample
- gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump
- -fdump-tree-pre=stderr file.c
- @end smallexample
- outputs vectorizer dump into @file{foo.dump}, while the PRE dump is
- output on to @file{stderr}. If two conflicting dump filenames are
- given for the same pass, then the latter option overrides the earlier
- one.
- @item all
- Turn on all options, except @option{raw}, @option{slim}, @option{verbose}
- and @option{lineno}.
- @item optall
- Turn on all optimization options, i.e., @option{optimized},
- @option{missed}, and @option{note}.
- @end table
- The following tree dumps are possible:
- @table @samp
- @item original
- @opindex fdump-tree-original
- Dump before any tree based optimization, to @file{@var{file}.original}.
- @item optimized
- @opindex fdump-tree-optimized
- Dump after all tree based optimization, to @file{@var{file}.optimized}.
- @item gimple
- @opindex fdump-tree-gimple
- Dump each function before and after the gimplification pass to a file. The
- file name is made by appending @file{.gimple} to the source file name.
- @item cfg
- @opindex fdump-tree-cfg
- Dump the control flow graph of each function to a file. The file name is
- made by appending @file{.cfg} to the source file name.
- @item ch
- @opindex fdump-tree-ch
- Dump each function after copying loop headers. The file name is made by
- appending @file{.ch} to the source file name.
- @item ssa
- @opindex fdump-tree-ssa
- Dump SSA related information to a file. The file name is made by appending
- @file{.ssa} to the source file name.
- @item alias
- @opindex fdump-tree-alias
- Dump aliasing information for each function. The file name is made by
- appending @file{.alias} to the source file name.
- @item ccp
- @opindex fdump-tree-ccp
- Dump each function after CCP@. The file name is made by appending
- @file{.ccp} to the source file name.
- @item storeccp
- @opindex fdump-tree-storeccp
- Dump each function after STORE-CCP@. The file name is made by appending
- @file{.storeccp} to the source file name.
- @item pre
- @opindex fdump-tree-pre
- Dump trees after partial redundancy elimination. The file name is made
- by appending @file{.pre} to the source file name.
- @item fre
- @opindex fdump-tree-fre
- Dump trees after full redundancy elimination. The file name is made
- by appending @file{.fre} to the source file name.
- @item copyprop
- @opindex fdump-tree-copyprop
- Dump trees after copy propagation. The file name is made
- by appending @file{.copyprop} to the source file name.
- @item store_copyprop
- @opindex fdump-tree-store_copyprop
- Dump trees after store copy-propagation. The file name is made
- by appending @file{.store_copyprop} to the source file name.
- @item dce
- @opindex fdump-tree-dce
- Dump each function after dead code elimination. The file name is made by
- appending @file{.dce} to the source file name.
- @item sra
- @opindex fdump-tree-sra
- Dump each function after performing scalar replacement of aggregates. The
- file name is made by appending @file{.sra} to the source file name.
- @item sink
- @opindex fdump-tree-sink
- Dump each function after performing code sinking. The file name is made
- by appending @file{.sink} to the source file name.
- @item dom
- @opindex fdump-tree-dom
- Dump each function after applying dominator tree optimizations. The file
- name is made by appending @file{.dom} to the source file name.
- @item dse
- @opindex fdump-tree-dse
- Dump each function after applying dead store elimination. The file
- name is made by appending @file{.dse} to the source file name.
- @item phiopt
- @opindex fdump-tree-phiopt
- Dump each function after optimizing PHI nodes into straightline code. The file
- name is made by appending @file{.phiopt} to the source file name.
- @item forwprop
- @opindex fdump-tree-forwprop
- Dump each function after forward propagating single use variables. The file
- name is made by appending @file{.forwprop} to the source file name.
- @item copyrename
- @opindex fdump-tree-copyrename
- Dump each function after applying the copy rename optimization. The file
- name is made by appending @file{.copyrename} to the source file name.
- @item nrv
- @opindex fdump-tree-nrv
- Dump each function after applying the named return value optimization on
- generic trees. The file name is made by appending @file{.nrv} to the source
- file name.
- @item vect
- @opindex fdump-tree-vect
- Dump each function after applying vectorization of loops. The file name is
- made by appending @file{.vect} to the source file name.
- @item slp
- @opindex fdump-tree-slp
- Dump each function after applying vectorization of basic blocks. The file name
- is made by appending @file{.slp} to the source file name.
- @item vrp
- @opindex fdump-tree-vrp
- Dump each function after Value Range Propagation (VRP). The file name
- is made by appending @file{.vrp} to the source file name.
- @item all
- @opindex fdump-tree-all
- Enable all the available tree dumps with the flags provided in this option.
- @end table
- @item -fopt-info
- @itemx -fopt-info-@var{options}
- @itemx -fopt-info-@var{options}=@var{filename}
- @opindex fopt-info
- Controls optimization dumps from various optimization passes. If the
- @samp{-@var{options}} form is used, @var{options} is a list of
- @samp{-} separated option keywords to select the dump details and
- optimizations.
- The @var{options} can be divided into two groups: options describing the
- verbosity of the dump, and options describing which optimizations
- should be included. The options from both the groups can be freely
- mixed as they are non-overlapping. However, in case of any conflicts,
- the later options override the earlier options on the command
- line.
- The following options control the dump verbosity:
- @table @samp
- @item optimized
- Print information when an optimization is successfully applied. It is
- up to a pass to decide which information is relevant. For example, the
- vectorizer passes print the source location of loops which are
- successfully vectorized.
- @item missed
- Print information about missed optimizations. Individual passes
- control which information to include in the output.
- @item note
- Print verbose information about optimizations, such as certain
- transformations, more detailed messages about decisions etc.
- @item all
- Print detailed optimization information. This includes
- @samp{optimized}, @samp{missed}, and @samp{note}.
- @end table
- One or more of the following option keywords can be used to describe a
- group of optimizations:
- @table @samp
- @item ipa
- Enable dumps from all interprocedural optimizations.
- @item loop
- Enable dumps from all loop optimizations.
- @item inline
- Enable dumps from all inlining optimizations.
- @item vec
- Enable dumps from all vectorization optimizations.
- @item optall
- Enable dumps from all optimizations. This is a superset of
- the optimization groups listed above.
- @end table
- If @var{options} is
- omitted, it defaults to @samp{optimized-optall}, which means to dump all
- info about successful optimizations from all the passes.
- If the @var{filename} is provided, then the dumps from all the
- applicable optimizations are concatenated into the @var{filename}.
- Otherwise the dump is output onto @file{stderr}. Though multiple
- @option{-fopt-info} options are accepted, only one of them can include
- a @var{filename}. If other filenames are provided then all but the
- first such option are ignored.
- Note that the output @var{filename} is overwritten
- in case of multiple translation units. If a combined output from
- multiple translation units is desired, @file{stderr} should be used
- instead.
- In the following example, the optimization info is output to
- @file{stderr}:
- @smallexample
- gcc -O3 -fopt-info
- @end smallexample
- This example:
- @smallexample
- gcc -O3 -fopt-info-missed=missed.all
- @end smallexample
- @noindent
- outputs missed optimization report from all the passes into
- @file{missed.all}, and this one:
- @smallexample
- gcc -O2 -ftree-vectorize -fopt-info-vec-missed
- @end smallexample
- @noindent
- prints information about missed optimization opportunities from
- vectorization passes on @file{stderr}.
- Note that @option{-fopt-info-vec-missed} is equivalent to
- @option{-fopt-info-missed-vec}.
- As another example,
- @smallexample
- gcc -O3 -fopt-info-inline-optimized-missed=inline.txt
- @end smallexample
- @noindent
- outputs information about missed optimizations as well as
- optimized locations from all the inlining passes into
- @file{inline.txt}.
- Finally, consider:
- @smallexample
- gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt
- @end smallexample
- @noindent
- Here the two output filenames @file{vec.miss} and @file{loop.opt} are
- in conflict since only one output file is allowed. In this case, only
- the first option takes effect and the subsequent options are
- ignored. Thus only @file{vec.miss} is produced which contains
- dumps from the vectorizer about missed opportunities.
- @item -frandom-seed=@var{number}
- @opindex frandom-seed
- This option provides a seed that GCC uses in place of
- random numbers in generating certain symbol names
- that have to be different in every compiled file. It is also used to
- place unique stamps in coverage data files and the object files that
- produce them. You can use the @option{-frandom-seed} option to produce
- reproducibly identical object files.
- The @var{number} should be different for every file you compile.
- @item -fsched-verbose=@var{n}
- @opindex fsched-verbose
- On targets that use instruction scheduling, this option controls the
- amount of debugging output the scheduler prints. This information is
- written to standard error, unless @option{-fdump-rtl-sched1} or
- @option{-fdump-rtl-sched2} is specified, in which case it is output
- to the usual dump listing file, @file{.sched1} or @file{.sched2}
- respectively. However for @var{n} greater than nine, the output is
- always printed to standard error.
- For @var{n} greater than zero, @option{-fsched-verbose} outputs the
- same information as @option{-fdump-rtl-sched1} and @option{-fdump-rtl-sched2}.
- For @var{n} greater than one, it also output basic block probabilities,
- detailed ready list information and unit/insn info. For @var{n} greater
- than two, it includes RTL at abort point, control-flow and regions info.
- And for @var{n} over four, @option{-fsched-verbose} also includes
- dependence info.
- @item -save-temps
- @itemx -save-temps=cwd
- @opindex save-temps
- Store the usual ``temporary'' intermediate files permanently; place them
- in the current directory and name them based on the source file. Thus,
- compiling @file{foo.c} with @option{-c -save-temps} produces files
- @file{foo.i} and @file{foo.s}, as well as @file{foo.o}. This creates a
- preprocessed @file{foo.i} output file even though the compiler now
- normally uses an integrated preprocessor.
- When used in combination with the @option{-x} command-line option,
- @option{-save-temps} is sensible enough to avoid over writing an
- input source file with the same extension as an intermediate file.
- The corresponding intermediate file may be obtained by renaming the
- source file before using @option{-save-temps}.
- If you invoke GCC in parallel, compiling several different source
- files that share a common base name in different subdirectories or the
- same source file compiled for multiple output destinations, it is
- likely that the different parallel compilers will interfere with each
- other, and overwrite the temporary files. For instance:
- @smallexample
- gcc -save-temps -o outdir1/foo.o indir1/foo.c&
- gcc -save-temps -o outdir2/foo.o indir2/foo.c&
- @end smallexample
- may result in @file{foo.i} and @file{foo.o} being written to
- simultaneously by both compilers.
- @item -save-temps=obj
- @opindex save-temps=obj
- Store the usual ``temporary'' intermediate files permanently. If the
- @option{-o} option is used, the temporary files are based on the
- object file. If the @option{-o} option is not used, the
- @option{-save-temps=obj} switch behaves like @option{-save-temps}.
- For example:
- @smallexample
- gcc -save-temps=obj -c foo.c
- gcc -save-temps=obj -c bar.c -o dir/xbar.o
- gcc -save-temps=obj foobar.c -o dir2/yfoobar
- @end smallexample
- @noindent
- creates @file{foo.i}, @file{foo.s}, @file{dir/xbar.i},
- @file{dir/xbar.s}, @file{dir2/yfoobar.i}, @file{dir2/yfoobar.s}, and
- @file{dir2/yfoobar.o}.
- @item -time@r{[}=@var{file}@r{]}
- @opindex time
- Report the CPU time taken by each subprocess in the compilation
- sequence. For C source files, this is the compiler proper and assembler
- (plus the linker if linking is done).
- Without the specification of an output file, the output looks like this:
- @smallexample
- # cc1 0.12 0.01
- # as 0.00 0.01
- @end smallexample
- The first number on each line is the ``user time'', that is time spent
- executing the program itself. The second number is ``system time'',
- time spent executing operating system routines on behalf of the program.
- Both numbers are in seconds.
- With the specification of an output file, the output is appended to the
- named file, and it looks like this:
- @smallexample
- 0.12 0.01 cc1 @var{options}
- 0.00 0.01 as @var{options}
- @end smallexample
- The ``user time'' and the ``system time'' are moved before the program
- name, and the options passed to the program are displayed, so that one
- can later tell what file was being compiled, and with which options.
- @item -fvar-tracking
- @opindex fvar-tracking
- Run variable tracking pass. It computes where variables are stored at each
- position in code. Better debugging information is then generated
- (if the debugging information format supports this information).
- It is enabled by default when compiling with optimization (@option{-Os},
- @option{-O}, @option{-O2}, @dots{}), debugging information (@option{-g}) and
- the debug info format supports it.
- @item -fvar-tracking-assignments
- @opindex fvar-tracking-assignments
- @opindex fno-var-tracking-assignments
- Annotate assignments to user variables early in the compilation and
- attempt to carry the annotations over throughout the compilation all the
- way to the end, in an attempt to improve debug information while
- optimizing. Use of @option{-gdwarf-4} is recommended along with it.
- It can be enabled even if var-tracking is disabled, in which case
- annotations are created and maintained, but discarded at the end.
- By default, this flag is enabled together with @option{-fvar-tracking},
- except when selective scheduling is enabled.
- @item -fvar-tracking-assignments-toggle
- @opindex fvar-tracking-assignments-toggle
- @opindex fno-var-tracking-assignments-toggle
- Toggle @option{-fvar-tracking-assignments}, in the same way that
- @option{-gtoggle} toggles @option{-g}.
- @item -print-file-name=@var{library}
- @opindex print-file-name
- Print the full absolute name of the library file @var{library} that
- would be used when linking---and don't do anything else. With this
- option, GCC does not compile or link anything; it just prints the
- file name.
- @item -print-multi-directory
- @opindex print-multi-directory
- Print the directory name corresponding to the multilib selected by any
- other switches present in the command line. This directory is supposed
- to exist in @env{GCC_EXEC_PREFIX}.
- @item -print-multi-lib
- @opindex print-multi-lib
- Print the mapping from multilib directory names to compiler switches
- that enable them. The directory name is separated from the switches by
- @samp{;}, and each switch starts with an @samp{@@} instead of the
- @samp{-}, without spaces between multiple switches. This is supposed to
- ease shell processing.
- @item -print-multi-os-directory
- @opindex print-multi-os-directory
- Print the path to OS libraries for the selected
- multilib, relative to some @file{lib} subdirectory. If OS libraries are
- present in the @file{lib} subdirectory and no multilibs are used, this is
- usually just @file{.}, if OS libraries are present in @file{lib@var{suffix}}
- sibling directories this prints e.g.@: @file{../lib64}, @file{../lib} or
- @file{../lib32}, or if OS libraries are present in @file{lib/@var{subdir}}
- subdirectories it prints e.g.@: @file{amd64}, @file{sparcv9} or @file{ev6}.
- @item -print-multiarch
- @opindex print-multiarch
- Print the path to OS libraries for the selected multiarch,
- relative to some @file{lib} subdirectory.
- @item -print-prog-name=@var{program}
- @opindex print-prog-name
- Like @option{-print-file-name}, but searches for a program such as @command{cpp}.
- @item -print-libgcc-file-name
- @opindex print-libgcc-file-name
- Same as @option{-print-file-name=libgcc.a}.
- This is useful when you use @option{-nostdlib} or @option{-nodefaultlibs}
- but you do want to link with @file{libgcc.a}. You can do:
- @smallexample
- gcc -nostdlib @var{files}@dots{} `gcc -print-libgcc-file-name`
- @end smallexample
- @item -print-search-dirs
- @opindex print-search-dirs
- Print the name of the configured installation directory and a list of
- program and library directories @command{gcc} searches---and don't do anything else.
- This is useful when @command{gcc} prints the error message
- @samp{installation problem, cannot exec cpp0: No such file or directory}.
- To resolve this you either need to put @file{cpp0} and the other compiler
- components where @command{gcc} expects to find them, or you can set the environment
- variable @env{GCC_EXEC_PREFIX} to the directory where you installed them.
- Don't forget the trailing @samp{/}.
- @xref{Environment Variables}.
- @item -print-sysroot
- @opindex print-sysroot
- Print the target sysroot directory that is used during
- compilation. This is the target sysroot specified either at configure
- time or using the @option{--sysroot} option, possibly with an extra
- suffix that depends on compilation options. If no target sysroot is
- specified, the option prints nothing.
- @item -print-sysroot-headers-suffix
- @opindex print-sysroot-headers-suffix
- Print the suffix added to the target sysroot when searching for
- headers, or give an error if the compiler is not configured with such
- a suffix---and don't do anything else.
- @item -dumpmachine
- @opindex dumpmachine
- Print the compiler's target machine (for example,
- @samp{i686-pc-linux-gnu})---and don't do anything else.
- @item -dumpversion
- @opindex dumpversion
- Print the compiler version (for example, @code{3.0})---and don't do
- anything else.
- @item -dumpspecs
- @opindex dumpspecs
- Print the compiler's built-in specs---and don't do anything else. (This
- is used when GCC itself is being built.) @xref{Spec Files}.
- @item -fno-eliminate-unused-debug-types
- @opindex feliminate-unused-debug-types
- @opindex fno-eliminate-unused-debug-types
- Normally, when producing DWARF 2 output, GCC avoids producing debug symbol
- output for types that are nowhere used in the source file being compiled.
- Sometimes it is useful to have GCC emit debugging
- information for all types declared in a compilation
- unit, regardless of whether or not they are actually used
- in that compilation unit, for example
- if, in the debugger, you want to cast a value to a type that is
- not actually used in your program (but is declared). More often,
- however, this results in a significant amount of wasted space.
- @end table
- @node Optimize Options
- @section Options That Control Optimization
- @cindex optimize options
- @cindex options, optimization
- These options control various sorts of optimizations.
- Without any optimization option, the compiler's goal is to reduce the
- cost of compilation and to make debugging produce the expected
- results. Statements are independent: if you stop the program with a
- breakpoint between statements, you can then assign a new value to any
- variable or change the program counter to any other statement in the
- function and get exactly the results you expect from the source
- code.
- Turning on optimization flags makes the compiler attempt to improve
- the performance and/or code size at the expense of compilation time
- and possibly the ability to debug the program.
- The compiler performs optimization based on the knowledge it has of the
- program. Compiling multiple files at once to a single output file mode allows
- the compiler to use information gained from all of the files when compiling
- each of them.
- Not all optimizations are controlled directly by a flag. Only
- optimizations that have a flag are listed in this section.
- Most optimizations are only enabled if an @option{-O} level is set on
- the command line. Otherwise they are disabled, even if individual
- optimization flags are specified.
- Depending on the target and how GCC was configured, a slightly different
- set of optimizations may be enabled at each @option{-O} level than
- those listed here. You can invoke GCC with @option{-Q --help=optimizers}
- to find out the exact set of optimizations that are enabled at each level.
- @xref{Overall Options}, for examples.
- @table @gcctabopt
- @item -O
- @itemx -O1
- @opindex O
- @opindex O1
- Optimize. Optimizing compilation takes somewhat more time, and a lot
- more memory for a large function.
- With @option{-O}, the compiler tries to reduce code size and execution
- time, without performing any optimizations that take a great deal of
- compilation time.
- @option{-O} turns on the following optimization flags:
- @gccoptlist{
- -fauto-inc-dec @gol
- -fbranch-count-reg @gol
- -fcombine-stack-adjustments @gol
- -fcompare-elim @gol
- -fcprop-registers @gol
- -fdce @gol
- -fdefer-pop @gol
- -fdelayed-branch @gol
- -fdse @gol
- -fforward-propagate @gol
- -fguess-branch-probability @gol
- -fif-conversion2 @gol
- -fif-conversion @gol
- -finline-functions-called-once @gol
- -fipa-pure-const @gol
- -fipa-profile @gol
- -fipa-reference @gol
- -fmerge-constants @gol
- -fmove-loop-invariants @gol
- -fshrink-wrap @gol
- -fsplit-wide-types @gol
- -ftree-bit-ccp @gol
- -ftree-ccp @gol
- -fssa-phiopt @gol
- -ftree-ch @gol
- -ftree-copy-prop @gol
- -ftree-copyrename @gol
- -ftree-dce @gol
- -ftree-dominator-opts @gol
- -ftree-dse @gol
- -ftree-forwprop @gol
- -ftree-fre @gol
- -ftree-phiprop @gol
- -ftree-sink @gol
- -ftree-slsr @gol
- -ftree-sra @gol
- -ftree-pta @gol
- -ftree-ter @gol
- -funit-at-a-time}
- @option{-O} also turns on @option{-fomit-frame-pointer} on machines
- where doing so does not interfere with debugging.
- @item -O2
- @opindex O2
- Optimize even more. GCC performs nearly all supported optimizations
- that do not involve a space-speed tradeoff.
- As compared to @option{-O}, this option increases both compilation time
- and the performance of the generated code.
- @option{-O2} turns on all optimization flags specified by @option{-O}. It
- also turns on the following optimization flags:
- @gccoptlist{-fthread-jumps @gol
- -falign-functions -falign-jumps @gol
- -falign-loops -falign-labels @gol
- -fcaller-saves @gol
- -fcrossjumping @gol
- -fcse-follow-jumps -fcse-skip-blocks @gol
- -fdelete-null-pointer-checks @gol
- -fdevirtualize -fdevirtualize-speculatively @gol
- -fexpensive-optimizations @gol
- -fgcse -fgcse-lm @gol
- -fhoist-adjacent-loads @gol
- -finline-small-functions @gol
- -findirect-inlining @gol
- -fipa-cp @gol
- -fipa-cp-alignment @gol
- -fipa-sra @gol
- -fipa-icf @gol
- -fisolate-erroneous-paths-dereference @gol
- -flra-remat @gol
- -foptimize-sibling-calls @gol
- -foptimize-strlen @gol
- -fpartial-inlining @gol
- -fpeephole2 @gol
- -freorder-blocks -freorder-blocks-and-partition -freorder-functions @gol
- -frerun-cse-after-loop @gol
- -fsched-interblock -fsched-spec @gol
- -fschedule-insns -fschedule-insns2 @gol
- -fstrict-aliasing -fstrict-overflow @gol
- -ftree-builtin-call-dce @gol
- -ftree-switch-conversion -ftree-tail-merge @gol
- -ftree-pre @gol
- -ftree-vrp @gol
- -fipa-ra}
- Please note the warning under @option{-fgcse} about
- invoking @option{-O2} on programs that use computed gotos.
- @item -O3
- @opindex O3
- Optimize yet more. @option{-O3} turns on all optimizations specified
- by @option{-O2} and also turns on the @option{-finline-functions},
- @option{-funswitch-loops}, @option{-fpredictive-commoning},
- @option{-fgcse-after-reload}, @option{-ftree-loop-vectorize},
- @option{-ftree-loop-distribute-patterns},
- @option{-ftree-slp-vectorize}, @option{-fvect-cost-model},
- @option{-ftree-partial-pre} and @option{-fipa-cp-clone} options.
- @item -O0
- @opindex O0
- Reduce compilation time and make debugging produce the expected
- results. This is the default.
- @item -Os
- @opindex Os
- Optimize for size. @option{-Os} enables all @option{-O2} optimizations that
- do not typically increase code size. It also performs further
- optimizations designed to reduce code size.
- @option{-Os} disables the following optimization flags:
- @gccoptlist{-falign-functions -falign-jumps -falign-loops @gol
- -falign-labels -freorder-blocks -freorder-blocks-and-partition @gol
- -fprefetch-loop-arrays}
- @item -Ofast
- @opindex Ofast
- Disregard strict standards compliance. @option{-Ofast} enables all
- @option{-O3} optimizations. It also enables optimizations that are not
- valid for all standard-compliant programs.
- It turns on @option{-ffast-math} and the Fortran-specific
- @option{-fno-protect-parens} and @option{-fstack-arrays}.
- @item -Og
- @opindex Og
- Optimize debugging experience. @option{-Og} enables optimizations
- that do not interfere with debugging. It should be the optimization
- level of choice for the standard edit-compile-debug cycle, offering
- a reasonable level of optimization while maintaining fast compilation
- and a good debugging experience.
- If you use multiple @option{-O} options, with or without level numbers,
- the last such option is the one that is effective.
- @end table
- Options of the form @option{-f@var{flag}} specify machine-independent
- flags. Most flags have both positive and negative forms; the negative
- form of @option{-ffoo} is @option{-fno-foo}. In the table
- below, only one of the forms is listed---the one you typically
- use. You can figure out the other form by either removing @samp{no-}
- or adding it.
- The following options control specific optimizations. They are either
- activated by @option{-O} options or are related to ones that are. You
- can use the following flags in the rare cases when ``fine-tuning'' of
- optimizations to be performed is desired.
- @table @gcctabopt
- @item -fno-defer-pop
- @opindex fno-defer-pop
- Always pop the arguments to each function call as soon as that function
- returns. For machines that must pop arguments after a function call,
- the compiler normally lets arguments accumulate on the stack for several
- function calls and pops them all at once.
- Disabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fforward-propagate
- @opindex fforward-propagate
- Perform a forward propagation pass on RTL@. The pass tries to combine two
- instructions and checks if the result can be simplified. If loop unrolling
- is active, two passes are performed and the second is scheduled after
- loop unrolling.
- This option is enabled by default at optimization levels @option{-O},
- @option{-O2}, @option{-O3}, @option{-Os}.
- @item -ffp-contract=@var{style}
- @opindex ffp-contract
- @option{-ffp-contract=off} disables floating-point expression contraction.
- @option{-ffp-contract=fast} enables floating-point expression contraction
- such as forming of fused multiply-add operations if the target has
- native support for them.
- @option{-ffp-contract=on} enables floating-point expression contraction
- if allowed by the language standard. This is currently not implemented
- and treated equal to @option{-ffp-contract=off}.
- The default is @option{-ffp-contract=fast}.
- @item -fomit-frame-pointer
- @opindex fomit-frame-pointer
- Don't keep the frame pointer in a register for functions that
- don't need one. This avoids the instructions to save, set up and
- restore frame pointers; it also makes an extra register available
- in many functions. @strong{It also makes debugging impossible on
- some machines.}
- On some machines, such as the VAX, this flag has no effect, because
- the standard calling sequence automatically handles the frame pointer
- and nothing is saved by pretending it doesn't exist. The
- machine-description macro @code{FRAME_POINTER_REQUIRED} controls
- whether a target machine supports this flag. @xref{Registers,,Register
- Usage, gccint, GNU Compiler Collection (GCC) Internals}.
- The default setting (when not optimizing for
- size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 targets is
- @option{-fomit-frame-pointer}. You can configure GCC with the
- @option{--enable-frame-pointer} configure option to change the default.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -foptimize-sibling-calls
- @opindex foptimize-sibling-calls
- Optimize sibling and tail recursive calls.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -foptimize-strlen
- @opindex foptimize-strlen
- Optimize various standard C string functions (e.g. @code{strlen},
- @code{strchr} or @code{strcpy}) and
- their @code{_FORTIFY_SOURCE} counterparts into faster alternatives.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -fno-inline
- @opindex fno-inline
- Do not expand any functions inline apart from those marked with
- the @code{always_inline} attribute. This is the default when not
- optimizing.
- Single functions can be exempted from inlining by marking them
- with the @code{noinline} attribute.
- @item -finline-small-functions
- @opindex finline-small-functions
- Integrate functions into their callers when their body is smaller than expected
- function call code (so overall size of program gets smaller). The compiler
- heuristically decides which functions are simple enough to be worth integrating
- in this way. This inlining applies to all functions, even those not declared
- inline.
- Enabled at level @option{-O2}.
- @item -findirect-inlining
- @opindex findirect-inlining
- Inline also indirect calls that are discovered to be known at compile
- time thanks to previous inlining. This option has any effect only
- when inlining itself is turned on by the @option{-finline-functions}
- or @option{-finline-small-functions} options.
- Enabled at level @option{-O2}.
- @item -finline-functions
- @opindex finline-functions
- Consider all functions for inlining, even if they are not declared inline.
- The compiler heuristically decides which functions are worth integrating
- in this way.
- If all calls to a given function are integrated, and the function is
- declared @code{static}, then the function is normally not output as
- assembler code in its own right.
- Enabled at level @option{-O3}.
- @item -finline-functions-called-once
- @opindex finline-functions-called-once
- Consider all @code{static} functions called once for inlining into their
- caller even if they are not marked @code{inline}. If a call to a given
- function is integrated, then the function is not output as assembler code
- in its own right.
- Enabled at levels @option{-O1}, @option{-O2}, @option{-O3} and @option{-Os}.
- @item -fearly-inlining
- @opindex fearly-inlining
- Inline functions marked by @code{always_inline} and functions whose body seems
- smaller than the function call overhead early before doing
- @option{-fprofile-generate} instrumentation and real inlining pass. Doing so
- makes profiling significantly cheaper and usually inlining faster on programs
- having large chains of nested wrapper functions.
- Enabled by default.
- @item -fipa-sra
- @opindex fipa-sra
- Perform interprocedural scalar replacement of aggregates, removal of
- unused parameters and replacement of parameters passed by reference
- by parameters passed by value.
- Enabled at levels @option{-O2}, @option{-O3} and @option{-Os}.
- @item -finline-limit=@var{n}
- @opindex finline-limit
- By default, GCC limits the size of functions that can be inlined. This flag
- allows coarse control of this limit. @var{n} is the size of functions that
- can be inlined in number of pseudo instructions.
- Inlining is actually controlled by a number of parameters, which may be
- specified individually by using @option{--param @var{name}=@var{value}}.
- The @option{-finline-limit=@var{n}} option sets some of these parameters
- as follows:
- @table @gcctabopt
- @item max-inline-insns-single
- is set to @var{n}/2.
- @item max-inline-insns-auto
- is set to @var{n}/2.
- @end table
- See below for a documentation of the individual
- parameters controlling inlining and for the defaults of these parameters.
- @emph{Note:} there may be no value to @option{-finline-limit} that results
- in default behavior.
- @emph{Note:} pseudo instruction represents, in this particular context, an
- abstract measurement of function's size. In no way does it represent a count
- of assembly instructions and as such its exact meaning might change from one
- release to an another.
- @item -fno-keep-inline-dllexport
- @opindex fno-keep-inline-dllexport
- This is a more fine-grained version of @option{-fkeep-inline-functions},
- which applies only to functions that are declared using the @code{dllexport}
- attribute or declspec (@xref{Function Attributes,,Declaring Attributes of
- Functions}.)
- @item -fkeep-inline-functions
- @opindex fkeep-inline-functions
- In C, emit @code{static} functions that are declared @code{inline}
- into the object file, even if the function has been inlined into all
- of its callers. This switch does not affect functions using the
- @code{extern inline} extension in GNU C90@. In C++, emit any and all
- inline functions into the object file.
- @item -fkeep-static-consts
- @opindex fkeep-static-consts
- Emit variables declared @code{static const} when optimization isn't turned
- on, even if the variables aren't referenced.
- GCC enables this option by default. If you want to force the compiler to
- check if a variable is referenced, regardless of whether or not
- optimization is turned on, use the @option{-fno-keep-static-consts} option.
- @item -fmerge-constants
- @opindex fmerge-constants
- Attempt to merge identical constants (string constants and floating-point
- constants) across compilation units.
- This option is the default for optimized compilation if the assembler and
- linker support it. Use @option{-fno-merge-constants} to inhibit this
- behavior.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fmerge-all-constants
- @opindex fmerge-all-constants
- Attempt to merge identical constants and identical variables.
- This option implies @option{-fmerge-constants}. In addition to
- @option{-fmerge-constants} this considers e.g.@: even constant initialized
- arrays or initialized constant variables with integral or floating-point
- types. Languages like C or C++ require each variable, including multiple
- instances of the same variable in recursive calls, to have distinct locations,
- so using this option results in non-conforming
- behavior.
- @item -fmodulo-sched
- @opindex fmodulo-sched
- Perform swing modulo scheduling immediately before the first scheduling
- pass. This pass looks at innermost loops and reorders their
- instructions by overlapping different iterations.
- @item -fmodulo-sched-allow-regmoves
- @opindex fmodulo-sched-allow-regmoves
- Perform more aggressive SMS-based modulo scheduling with register moves
- allowed. By setting this flag certain anti-dependences edges are
- deleted, which triggers the generation of reg-moves based on the
- life-range analysis. This option is effective only with
- @option{-fmodulo-sched} enabled.
- @item -fno-branch-count-reg
- @opindex fno-branch-count-reg
- Do not use ``decrement and branch'' instructions on a count register,
- but instead generate a sequence of instructions that decrement a
- register, compare it against zero, then branch based upon the result.
- This option is only meaningful on architectures that support such
- instructions, which include x86, PowerPC, IA-64 and S/390.
- Enabled by default at @option{-O1} and higher.
- The default is @option{-fbranch-count-reg}.
- @item -fno-function-cse
- @opindex fno-function-cse
- Do not put function addresses in registers; make each instruction that
- calls a constant function contain the function's address explicitly.
- This option results in less efficient code, but some strange hacks
- that alter the assembler output may be confused by the optimizations
- performed when this option is not used.
- The default is @option{-ffunction-cse}
- @item -fno-zero-initialized-in-bss
- @opindex fno-zero-initialized-in-bss
- If the target supports a BSS section, GCC by default puts variables that
- are initialized to zero into BSS@. This can save space in the resulting
- code.
- This option turns off this behavior because some programs explicitly
- rely on variables going to the data section---e.g., so that the
- resulting executable can find the beginning of that section and/or make
- assumptions based on that.
- The default is @option{-fzero-initialized-in-bss}.
- @item -fthread-jumps
- @opindex fthread-jumps
- Perform optimizations that check to see if a jump branches to a
- location where another comparison subsumed by the first is found. If
- so, the first branch is redirected to either the destination of the
- second branch or a point immediately following it, depending on whether
- the condition is known to be true or false.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fsplit-wide-types
- @opindex fsplit-wide-types
- When using a type that occupies multiple registers, such as @code{long
- long} on a 32-bit system, split the registers apart and allocate them
- independently. This normally generates better code for those types,
- but may make debugging more difficult.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3},
- @option{-Os}.
- @item -fcse-follow-jumps
- @opindex fcse-follow-jumps
- In common subexpression elimination (CSE), scan through jump instructions
- when the target of the jump is not reached by any other path. For
- example, when CSE encounters an @code{if} statement with an
- @code{else} clause, CSE follows the jump when the condition
- tested is false.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fcse-skip-blocks
- @opindex fcse-skip-blocks
- This is similar to @option{-fcse-follow-jumps}, but causes CSE to
- follow jumps that conditionally skip over blocks. When CSE
- encounters a simple @code{if} statement with no else clause,
- @option{-fcse-skip-blocks} causes CSE to follow the jump around the
- body of the @code{if}.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -frerun-cse-after-loop
- @opindex frerun-cse-after-loop
- Re-run common subexpression elimination after loop optimizations are
- performed.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fgcse
- @opindex fgcse
- Perform a global common subexpression elimination pass.
- This pass also performs global constant and copy propagation.
- @emph{Note:} When compiling a program using computed gotos, a GCC
- extension, you may get better run-time performance if you disable
- the global common subexpression elimination pass by adding
- @option{-fno-gcse} to the command line.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fgcse-lm
- @opindex fgcse-lm
- When @option{-fgcse-lm} is enabled, global common subexpression elimination
- attempts to move loads that are only killed by stores into themselves. This
- allows a loop containing a load/store sequence to be changed to a load outside
- the loop, and a copy/store within the loop.
- Enabled by default when @option{-fgcse} is enabled.
- @item -fgcse-sm
- @opindex fgcse-sm
- When @option{-fgcse-sm} is enabled, a store motion pass is run after
- global common subexpression elimination. This pass attempts to move
- stores out of loops. When used in conjunction with @option{-fgcse-lm},
- loops containing a load/store sequence can be changed to a load before
- the loop and a store after the loop.
- Not enabled at any optimization level.
- @item -fgcse-las
- @opindex fgcse-las
- When @option{-fgcse-las} is enabled, the global common subexpression
- elimination pass eliminates redundant loads that come after stores to the
- same memory location (both partial and full redundancies).
- Not enabled at any optimization level.
- @item -fgcse-after-reload
- @opindex fgcse-after-reload
- When @option{-fgcse-after-reload} is enabled, a redundant load elimination
- pass is performed after reload. The purpose of this pass is to clean up
- redundant spilling.
- @item -faggressive-loop-optimizations
- @opindex faggressive-loop-optimizations
- This option tells the loop optimizer to use language constraints to
- derive bounds for the number of iterations of a loop. This assumes that
- loop code does not invoke undefined behavior by for example causing signed
- integer overflows or out-of-bound array accesses. The bounds for the
- number of iterations of a loop are used to guide loop unrolling and peeling
- and loop exit test optimizations.
- This option is enabled by default.
- @item -funsafe-loop-optimizations
- @opindex funsafe-loop-optimizations
- This option tells the loop optimizer to assume that loop indices do not
- overflow, and that loops with nontrivial exit condition are not
- infinite. This enables a wider range of loop optimizations even if
- the loop optimizer itself cannot prove that these assumptions are valid.
- If you use @option{-Wunsafe-loop-optimizations}, the compiler warns you
- if it finds this kind of loop.
- @item -fcrossjumping
- @opindex fcrossjumping
- Perform cross-jumping transformation.
- This transformation unifies equivalent code and saves code size. The
- resulting code may or may not perform better than without cross-jumping.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fauto-inc-dec
- @opindex fauto-inc-dec
- Combine increments or decrements of addresses with memory accesses.
- This pass is always skipped on architectures that do not have
- instructions to support this. Enabled by default at @option{-O} and
- higher on architectures that support this.
- @item -fdce
- @opindex fdce
- Perform dead code elimination (DCE) on RTL@.
- Enabled by default at @option{-O} and higher.
- @item -fdse
- @opindex fdse
- Perform dead store elimination (DSE) on RTL@.
- Enabled by default at @option{-O} and higher.
- @item -fif-conversion
- @opindex fif-conversion
- Attempt to transform conditional jumps into branch-less equivalents. This
- includes use of conditional moves, min, max, set flags and abs instructions, and
- some tricks doable by standard arithmetics. The use of conditional execution
- on chips where it is available is controlled by @option{-fif-conversion2}.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fif-conversion2
- @opindex fif-conversion2
- Use conditional execution (where available) to transform conditional jumps into
- branch-less equivalents.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fdeclone-ctor-dtor
- @opindex fdeclone-ctor-dtor
- The C++ ABI requires multiple entry points for constructors and
- destructors: one for a base subobject, one for a complete object, and
- one for a virtual destructor that calls operator delete afterwards.
- For a hierarchy with virtual bases, the base and complete variants are
- clones, which means two copies of the function. With this option, the
- base and complete variants are changed to be thunks that call a common
- implementation.
- Enabled by @option{-Os}.
- @item -fdelete-null-pointer-checks
- @opindex fdelete-null-pointer-checks
- Assume that programs cannot safely dereference null pointers, and that
- no code or data element resides there. This enables simple constant
- folding optimizations at all optimization levels. In addition, other
- optimization passes in GCC use this flag to control global dataflow
- analyses that eliminate useless checks for null pointers; these assume
- that if a pointer is checked after it has already been dereferenced,
- it cannot be null.
- Note however that in some environments this assumption is not true.
- Use @option{-fno-delete-null-pointer-checks} to disable this optimization
- for programs that depend on that behavior.
- Some targets, especially embedded ones, disable this option at all levels.
- Otherwise it is enabled at all levels: @option{-O0}, @option{-O1},
- @option{-O2}, @option{-O3}, @option{-Os}. Passes that use the information
- are enabled independently at different optimization levels.
- @item -fdevirtualize
- @opindex fdevirtualize
- Attempt to convert calls to virtual functions to direct calls. This
- is done both within a procedure and interprocedurally as part of
- indirect inlining (@option{-findirect-inlining}) and interprocedural constant
- propagation (@option{-fipa-cp}).
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fdevirtualize-speculatively
- @opindex fdevirtualize-speculatively
- Attempt to convert calls to virtual functions to speculative direct calls.
- Based on the analysis of the type inheritance graph, determine for a given call
- the set of likely targets. If the set is small, preferably of size 1, change
- the call into a conditional deciding between direct and indirect calls. The
- speculative calls enable more optimizations, such as inlining. When they seem
- useless after further optimization, they are converted back into original form.
- @item -fdevirtualize-at-ltrans
- @opindex fdevirtualize-at-ltrans
- Stream extra information needed for aggressive devirtualization when running
- the link-time optimizer in local transformation mode.
- This option enables more devirtualization but
- significantly increases the size of streamed data. For this reason it is
- disabled by default.
- @item -fexpensive-optimizations
- @opindex fexpensive-optimizations
- Perform a number of minor optimizations that are relatively expensive.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -free
- @opindex free
- Attempt to remove redundant extension instructions. This is especially
- helpful for the x86-64 architecture, which implicitly zero-extends in 64-bit
- registers after writing to their lower 32-bit half.
- Enabled for Alpha, AArch64 and x86 at levels @option{-O2},
- @option{-O3}, @option{-Os}.
- @item -fno-lifetime-dse
- @opindex fno-lifetime-dse
- In C++ the value of an object is only affected by changes within its
- lifetime: when the constructor begins, the object has an indeterminate
- value, and any changes during the lifetime of the object are dead when
- the object is destroyed. Normally dead store elimination will take
- advantage of this; if your code relies on the value of the object
- storage persisting beyond the lifetime of the object, you can use this
- flag to disable this optimization.
- @item -flive-range-shrinkage
- @opindex flive-range-shrinkage
- Attempt to decrease register pressure through register live range
- shrinkage. This is helpful for fast processors with small or moderate
- size register sets.
- @item -fira-algorithm=@var{algorithm}
- @opindex fira-algorithm
- Use the specified coloring algorithm for the integrated register
- allocator. The @var{algorithm} argument can be @samp{priority}, which
- specifies Chow's priority coloring, or @samp{CB}, which specifies
- Chaitin-Briggs coloring. Chaitin-Briggs coloring is not implemented
- for all architectures, but for those targets that do support it, it is
- the default because it generates better code.
- @item -fira-region=@var{region}
- @opindex fira-region
- Use specified regions for the integrated register allocator. The
- @var{region} argument should be one of the following:
- @table @samp
- @item all
- Use all loops as register allocation regions.
- This can give the best results for machines with a small and/or
- irregular register set.
- @item mixed
- Use all loops except for loops with small register pressure
- as the regions. This value usually gives
- the best results in most cases and for most architectures,
- and is enabled by default when compiling with optimization for speed
- (@option{-O}, @option{-O2}, @dots{}).
- @item one
- Use all functions as a single region.
- This typically results in the smallest code size, and is enabled by default for
- @option{-Os} or @option{-O0}.
- @end table
- @item -fira-hoist-pressure
- @opindex fira-hoist-pressure
- Use IRA to evaluate register pressure in the code hoisting pass for
- decisions to hoist expressions. This option usually results in smaller
- code, but it can slow the compiler down.
- This option is enabled at level @option{-Os} for all targets.
- @item -fira-loop-pressure
- @opindex fira-loop-pressure
- Use IRA to evaluate register pressure in loops for decisions to move
- loop invariants. This option usually results in generation
- of faster and smaller code on machines with large register files (>= 32
- registers), but it can slow the compiler down.
- This option is enabled at level @option{-O3} for some targets.
- @item -fno-ira-share-save-slots
- @opindex fno-ira-share-save-slots
- Disable sharing of stack slots used for saving call-used hard
- registers living through a call. Each hard register gets a
- separate stack slot, and as a result function stack frames are
- larger.
- @item -fno-ira-share-spill-slots
- @opindex fno-ira-share-spill-slots
- Disable sharing of stack slots allocated for pseudo-registers. Each
- pseudo-register that does not get a hard register gets a separate
- stack slot, and as a result function stack frames are larger.
- @item -fira-verbose=@var{n}
- @opindex fira-verbose
- Control the verbosity of the dump file for the integrated register allocator.
- The default value is 5. If the value @var{n} is greater or equal to 10,
- the dump output is sent to stderr using the same format as @var{n} minus 10.
- @item -flra-remat
- @opindex flra-remat
- Enable CFG-sensitive rematerialization in LRA. Instead of loading
- values of spilled pseudos, LRA tries to rematerialize (recalculate)
- values if it is profitable.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fdelayed-branch
- @opindex fdelayed-branch
- If supported for the target machine, attempt to reorder instructions
- to exploit instruction slots available after delayed branch
- instructions.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fschedule-insns
- @opindex fschedule-insns
- If supported for the target machine, attempt to reorder instructions to
- eliminate execution stalls due to required data being unavailable. This
- helps machines that have slow floating point or memory load instructions
- by allowing other instructions to be issued until the result of the load
- or floating-point instruction is required.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -fschedule-insns2
- @opindex fschedule-insns2
- Similar to @option{-fschedule-insns}, but requests an additional pass of
- instruction scheduling after register allocation has been done. This is
- especially useful on machines with a relatively small number of
- registers and where memory load instructions take more than one cycle.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fno-sched-interblock
- @opindex fno-sched-interblock
- Don't schedule instructions across basic blocks. This is normally
- enabled by default when scheduling before register allocation, i.e.@:
- with @option{-fschedule-insns} or at @option{-O2} or higher.
- @item -fno-sched-spec
- @opindex fno-sched-spec
- Don't allow speculative motion of non-load instructions. This is normally
- enabled by default when scheduling before register allocation, i.e.@:
- with @option{-fschedule-insns} or at @option{-O2} or higher.
- @item -fsched-pressure
- @opindex fsched-pressure
- Enable register pressure sensitive insn scheduling before register
- allocation. This only makes sense when scheduling before register
- allocation is enabled, i.e.@: with @option{-fschedule-insns} or at
- @option{-O2} or higher. Usage of this option can improve the
- generated code and decrease its size by preventing register pressure
- increase above the number of available hard registers and subsequent
- spills in register allocation.
- @item -fsched-spec-load
- @opindex fsched-spec-load
- Allow speculative motion of some load instructions. This only makes
- sense when scheduling before register allocation, i.e.@: with
- @option{-fschedule-insns} or at @option{-O2} or higher.
- @item -fsched-spec-load-dangerous
- @opindex fsched-spec-load-dangerous
- Allow speculative motion of more load instructions. This only makes
- sense when scheduling before register allocation, i.e.@: with
- @option{-fschedule-insns} or at @option{-O2} or higher.
- @item -fsched-stalled-insns
- @itemx -fsched-stalled-insns=@var{n}
- @opindex fsched-stalled-insns
- Define how many insns (if any) can be moved prematurely from the queue
- of stalled insns into the ready list during the second scheduling pass.
- @option{-fno-sched-stalled-insns} means that no insns are moved
- prematurely, @option{-fsched-stalled-insns=0} means there is no limit
- on how many queued insns can be moved prematurely.
- @option{-fsched-stalled-insns} without a value is equivalent to
- @option{-fsched-stalled-insns=1}.
- @item -fsched-stalled-insns-dep
- @itemx -fsched-stalled-insns-dep=@var{n}
- @opindex fsched-stalled-insns-dep
- Define how many insn groups (cycles) are examined for a dependency
- on a stalled insn that is a candidate for premature removal from the queue
- of stalled insns. This has an effect only during the second scheduling pass,
- and only if @option{-fsched-stalled-insns} is used.
- @option{-fno-sched-stalled-insns-dep} is equivalent to
- @option{-fsched-stalled-insns-dep=0}.
- @option{-fsched-stalled-insns-dep} without a value is equivalent to
- @option{-fsched-stalled-insns-dep=1}.
- @item -fsched2-use-superblocks
- @opindex fsched2-use-superblocks
- When scheduling after register allocation, use superblock scheduling.
- This allows motion across basic block boundaries,
- resulting in faster schedules. This option is experimental, as not all machine
- descriptions used by GCC model the CPU closely enough to avoid unreliable
- results from the algorithm.
- This only makes sense when scheduling after register allocation, i.e.@: with
- @option{-fschedule-insns2} or at @option{-O2} or higher.
- @item -fsched-group-heuristic
- @opindex fsched-group-heuristic
- Enable the group heuristic in the scheduler. This heuristic favors
- the instruction that belongs to a schedule group. This is enabled
- by default when scheduling is enabled, i.e.@: with @option{-fschedule-insns}
- or @option{-fschedule-insns2} or at @option{-O2} or higher.
- @item -fsched-critical-path-heuristic
- @opindex fsched-critical-path-heuristic
- Enable the critical-path heuristic in the scheduler. This heuristic favors
- instructions on the critical path. This is enabled by default when
- scheduling is enabled, i.e.@: with @option{-fschedule-insns}
- or @option{-fschedule-insns2} or at @option{-O2} or higher.
- @item -fsched-spec-insn-heuristic
- @opindex fsched-spec-insn-heuristic
- Enable the speculative instruction heuristic in the scheduler. This
- heuristic favors speculative instructions with greater dependency weakness.
- This is enabled by default when scheduling is enabled, i.e.@:
- with @option{-fschedule-insns} or @option{-fschedule-insns2}
- or at @option{-O2} or higher.
- @item -fsched-rank-heuristic
- @opindex fsched-rank-heuristic
- Enable the rank heuristic in the scheduler. This heuristic favors
- the instruction belonging to a basic block with greater size or frequency.
- This is enabled by default when scheduling is enabled, i.e.@:
- with @option{-fschedule-insns} or @option{-fschedule-insns2} or
- at @option{-O2} or higher.
- @item -fsched-last-insn-heuristic
- @opindex fsched-last-insn-heuristic
- Enable the last-instruction heuristic in the scheduler. This heuristic
- favors the instruction that is less dependent on the last instruction
- scheduled. This is enabled by default when scheduling is enabled,
- i.e.@: with @option{-fschedule-insns} or @option{-fschedule-insns2} or
- at @option{-O2} or higher.
- @item -fsched-dep-count-heuristic
- @opindex fsched-dep-count-heuristic
- Enable the dependent-count heuristic in the scheduler. This heuristic
- favors the instruction that has more instructions depending on it.
- This is enabled by default when scheduling is enabled, i.e.@:
- with @option{-fschedule-insns} or @option{-fschedule-insns2} or
- at @option{-O2} or higher.
- @item -freschedule-modulo-scheduled-loops
- @opindex freschedule-modulo-scheduled-loops
- Modulo scheduling is performed before traditional scheduling. If a loop
- is modulo scheduled, later scheduling passes may change its schedule.
- Use this option to control that behavior.
- @item -fselective-scheduling
- @opindex fselective-scheduling
- Schedule instructions using selective scheduling algorithm. Selective
- scheduling runs instead of the first scheduler pass.
- @item -fselective-scheduling2
- @opindex fselective-scheduling2
- Schedule instructions using selective scheduling algorithm. Selective
- scheduling runs instead of the second scheduler pass.
- @item -fsel-sched-pipelining
- @opindex fsel-sched-pipelining
- Enable software pipelining of innermost loops during selective scheduling.
- This option has no effect unless one of @option{-fselective-scheduling} or
- @option{-fselective-scheduling2} is turned on.
- @item -fsel-sched-pipelining-outer-loops
- @opindex fsel-sched-pipelining-outer-loops
- When pipelining loops during selective scheduling, also pipeline outer loops.
- This option has no effect unless @option{-fsel-sched-pipelining} is turned on.
- @item -fsemantic-interposition
- @opindex fsemantic-interposition
- Some object formats, like ELF, allow interposing of symbols by the
- dynamic linker.
- This means that for symbols exported from the DSO, the compiler cannot perform
- interprocedural propagation, inlining and other optimizations in anticipation
- that the function or variable in question may change. While this feature is
- useful, for example, to rewrite memory allocation functions by a debugging
- implementation, it is expensive in the terms of code quality.
- With @option{-fno-semantic-interposition} the compiler assumes that
- if interposition happens for functions the overwriting function will have
- precisely the same semantics (and side effects).
- Similarly if interposition happens
- for variables, the constructor of the variable will be the same. The flag
- has no effect for functions explicitly declared inline
- (where it is never allowed for interposition to change semantics)
- and for symbols explicitly declared weak.
- @item -fshrink-wrap
- @opindex fshrink-wrap
- Emit function prologues only before parts of the function that need it,
- rather than at the top of the function. This flag is enabled by default at
- @option{-O} and higher.
- @item -fcaller-saves
- @opindex fcaller-saves
- Enable allocation of values to registers that are clobbered by
- function calls, by emitting extra instructions to save and restore the
- registers around such calls. Such allocation is done only when it
- seems to result in better code.
- This option is always enabled by default on certain machines, usually
- those which have no call-preserved registers to use instead.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fcombine-stack-adjustments
- @opindex fcombine-stack-adjustments
- Tracks stack adjustments (pushes and pops) and stack memory references
- and then tries to find ways to combine them.
- Enabled by default at @option{-O1} and higher.
- @item -fipa-ra
- @opindex fipa-ra
- Use caller save registers for allocation if those registers are not used by
- any called function. In that case it is not necessary to save and restore
- them around calls. This is only possible if called functions are part of
- same compilation unit as current function and they are compiled before it.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fconserve-stack
- @opindex fconserve-stack
- Attempt to minimize stack usage. The compiler attempts to use less
- stack space, even if that makes the program slower. This option
- implies setting the @option{large-stack-frame} parameter to 100
- and the @option{large-stack-frame-growth} parameter to 400.
- @item -ftree-reassoc
- @opindex ftree-reassoc
- Perform reassociation on trees. This flag is enabled by default
- at @option{-O} and higher.
- @item -ftree-pre
- @opindex ftree-pre
- Perform partial redundancy elimination (PRE) on trees. This flag is
- enabled by default at @option{-O2} and @option{-O3}.
- @item -ftree-partial-pre
- @opindex ftree-partial-pre
- Make partial redundancy elimination (PRE) more aggressive. This flag is
- enabled by default at @option{-O3}.
- @item -ftree-forwprop
- @opindex ftree-forwprop
- Perform forward propagation on trees. This flag is enabled by default
- at @option{-O} and higher.
- @item -ftree-fre
- @opindex ftree-fre
- Perform full redundancy elimination (FRE) on trees. The difference
- between FRE and PRE is that FRE only considers expressions
- that are computed on all paths leading to the redundant computation.
- This analysis is faster than PRE, though it exposes fewer redundancies.
- This flag is enabled by default at @option{-O} and higher.
- @item -ftree-phiprop
- @opindex ftree-phiprop
- Perform hoisting of loads from conditional pointers on trees. This
- pass is enabled by default at @option{-O} and higher.
- @item -fhoist-adjacent-loads
- @opindex fhoist-adjacent-loads
- Speculatively hoist loads from both branches of an if-then-else if the
- loads are from adjacent locations in the same structure and the target
- architecture has a conditional move instruction. This flag is enabled
- by default at @option{-O2} and higher.
- @item -ftree-copy-prop
- @opindex ftree-copy-prop
- Perform copy propagation on trees. This pass eliminates unnecessary
- copy operations. This flag is enabled by default at @option{-O} and
- higher.
- @item -fipa-pure-const
- @opindex fipa-pure-const
- Discover which functions are pure or constant.
- Enabled by default at @option{-O} and higher.
- @item -fipa-reference
- @opindex fipa-reference
- Discover which static variables do not escape the
- compilation unit.
- Enabled by default at @option{-O} and higher.
- @item -fipa-pta
- @opindex fipa-pta
- Perform interprocedural pointer analysis and interprocedural modification
- and reference analysis. This option can cause excessive memory and
- compile-time usage on large compilation units. It is not enabled by
- default at any optimization level.
- @item -fipa-profile
- @opindex fipa-profile
- Perform interprocedural profile propagation. The functions called only from
- cold functions are marked as cold. Also functions executed once (such as
- @code{cold}, @code{noreturn}, static constructors or destructors) are identified. Cold
- functions and loop less parts of functions executed once are then optimized for
- size.
- Enabled by default at @option{-O} and higher.
- @item -fipa-cp
- @opindex fipa-cp
- Perform interprocedural constant propagation.
- This optimization analyzes the program to determine when values passed
- to functions are constants and then optimizes accordingly.
- This optimization can substantially increase performance
- if the application has constants passed to functions.
- This flag is enabled by default at @option{-O2}, @option{-Os} and @option{-O3}.
- @item -fipa-cp-clone
- @opindex fipa-cp-clone
- Perform function cloning to make interprocedural constant propagation stronger.
- When enabled, interprocedural constant propagation performs function cloning
- when externally visible function can be called with constant arguments.
- Because this optimization can create multiple copies of functions,
- it may significantly increase code size
- (see @option{--param ipcp-unit-growth=@var{value}}).
- This flag is enabled by default at @option{-O3}.
- @item -fipa-cp-alignment
- @opindex -fipa-cp-alignment
- When enabled, this optimization propagates alignment of function
- parameters to support better vectorization and string operations.
- This flag is enabled by default at @option{-O2} and @option{-Os}. It
- requires that @option{-fipa-cp} is enabled.
- @item -fipa-icf
- @opindex fipa-icf
- Perform Identical Code Folding for functions and read-only variables.
- The optimization reduces code size and may disturb unwind stacks by replacing
- a function by equivalent one with a different name. The optimization works
- more effectively with link time optimization enabled.
- Nevertheless the behavior is similar to Gold Linker ICF optimization, GCC ICF
- works on different levels and thus the optimizations are not same - there are
- equivalences that are found only by GCC and equivalences found only by Gold.
- This flag is enabled by default at @option{-O2} and @option{-Os}.
- @item -fisolate-erroneous-paths-dereference
- @opindex fisolate-erroneous-paths-dereference
- Detect paths that trigger erroneous or undefined behavior due to
- dereferencing a null pointer. Isolate those paths from the main control
- flow and turn the statement with erroneous or undefined behavior into a trap.
- This flag is enabled by default at @option{-O2} and higher.
- @item -fisolate-erroneous-paths-attribute
- @opindex fisolate-erroneous-paths-attribute
- Detect paths that trigger erroneous or undefined behavior due a null value
- being used in a way forbidden by a @code{returns_nonnull} or @code{nonnull}
- attribute. Isolate those paths from the main control flow and turn the
- statement with erroneous or undefined behavior into a trap. This is not
- currently enabled, but may be enabled by @option{-O2} in the future.
- @item -ftree-sink
- @opindex ftree-sink
- Perform forward store motion on trees. This flag is
- enabled by default at @option{-O} and higher.
- @item -ftree-bit-ccp
- @opindex ftree-bit-ccp
- Perform sparse conditional bit constant propagation on trees and propagate
- pointer alignment information.
- This pass only operates on local scalar variables and is enabled by default
- at @option{-O} and higher. It requires that @option{-ftree-ccp} is enabled.
- @item -ftree-ccp
- @opindex ftree-ccp
- Perform sparse conditional constant propagation (CCP) on trees. This
- pass only operates on local scalar variables and is enabled by default
- at @option{-O} and higher.
- @item -fssa-phiopt
- @opindex fssa-phiopt
- Perform pattern matching on SSA PHI nodes to optimize conditional
- code. This pass is enabled by default at @option{-O} and higher.
- @item -ftree-switch-conversion
- @opindex ftree-switch-conversion
- Perform conversion of simple initializations in a switch to
- initializations from a scalar array. This flag is enabled by default
- at @option{-O2} and higher.
- @item -ftree-tail-merge
- @opindex ftree-tail-merge
- Look for identical code sequences. When found, replace one with a jump to the
- other. This optimization is known as tail merging or cross jumping. This flag
- is enabled by default at @option{-O2} and higher. The compilation time
- in this pass can
- be limited using @option{max-tail-merge-comparisons} parameter and
- @option{max-tail-merge-iterations} parameter.
- @item -ftree-dce
- @opindex ftree-dce
- Perform dead code elimination (DCE) on trees. This flag is enabled by
- default at @option{-O} and higher.
- @item -ftree-builtin-call-dce
- @opindex ftree-builtin-call-dce
- Perform conditional dead code elimination (DCE) for calls to built-in functions
- that may set @code{errno} but are otherwise side-effect free. This flag is
- enabled by default at @option{-O2} and higher if @option{-Os} is not also
- specified.
- @item -ftree-dominator-opts
- @opindex ftree-dominator-opts
- Perform a variety of simple scalar cleanups (constant/copy
- propagation, redundancy elimination, range propagation and expression
- simplification) based on a dominator tree traversal. This also
- performs jump threading (to reduce jumps to jumps). This flag is
- enabled by default at @option{-O} and higher.
- @item -ftree-dse
- @opindex ftree-dse
- Perform dead store elimination (DSE) on trees. A dead store is a store into
- a memory location that is later overwritten by another store without
- any intervening loads. In this case the earlier store can be deleted. This
- flag is enabled by default at @option{-O} and higher.
- @item -ftree-ch
- @opindex ftree-ch
- Perform loop header copying on trees. This is beneficial since it increases
- effectiveness of code motion optimizations. It also saves one jump. This flag
- is enabled by default at @option{-O} and higher. It is not enabled
- for @option{-Os}, since it usually increases code size.
- @item -ftree-loop-optimize
- @opindex ftree-loop-optimize
- Perform loop optimizations on trees. This flag is enabled by default
- at @option{-O} and higher.
- @item -ftree-loop-linear
- @opindex ftree-loop-linear
- Perform loop interchange transformations on tree. Same as
- @option{-floop-interchange}. To use this code transformation, GCC has
- to be configured with @option{--with-isl} to enable the Graphite loop
- transformation infrastructure.
- @item -floop-interchange
- @opindex floop-interchange
- Perform loop interchange transformations on loops. Interchanging two
- nested loops switches the inner and outer loops. For example, given a
- loop like:
- @smallexample
- DO J = 1, M
- DO I = 1, N
- A(J, I) = A(J, I) * C
- ENDDO
- ENDDO
- @end smallexample
- @noindent
- loop interchange transforms the loop as if it were written:
- @smallexample
- DO I = 1, N
- DO J = 1, M
- A(J, I) = A(J, I) * C
- ENDDO
- ENDDO
- @end smallexample
- which can be beneficial when @code{N} is larger than the caches,
- because in Fortran, the elements of an array are stored in memory
- contiguously by column, and the original loop iterates over rows,
- potentially creating at each access a cache miss. This optimization
- applies to all the languages supported by GCC and is not limited to
- Fortran. To use this code transformation, GCC has to be configured
- with @option{--with-isl} to enable the Graphite loop transformation
- infrastructure.
- @item -floop-strip-mine
- @opindex floop-strip-mine
- Perform loop strip mining transformations on loops. Strip mining
- splits a loop into two nested loops. The outer loop has strides
- equal to the strip size and the inner loop has strides of the
- original loop within a strip. The strip length can be changed
- using the @option{loop-block-tile-size} parameter. For example,
- given a loop like:
- @smallexample
- DO I = 1, N
- A(I) = A(I) + C
- ENDDO
- @end smallexample
- @noindent
- loop strip mining transforms the loop as if it were written:
- @smallexample
- DO II = 1, N, 51
- DO I = II, min (II + 50, N)
- A(I) = A(I) + C
- ENDDO
- ENDDO
- @end smallexample
- This optimization applies to all the languages supported by GCC and is
- not limited to Fortran. To use this code transformation, GCC has to
- be configured with @option{--with-isl} to enable the Graphite loop
- transformation infrastructure.
- @item -floop-block
- @opindex floop-block
- Perform loop blocking transformations on loops. Blocking strip mines
- each loop in the loop nest such that the memory accesses of the
- element loops fit inside caches. The strip length can be changed
- using the @option{loop-block-tile-size} parameter. For example, given
- a loop like:
- @smallexample
- DO I = 1, N
- DO J = 1, M
- A(J, I) = B(I) + C(J)
- ENDDO
- ENDDO
- @end smallexample
- @noindent
- loop blocking transforms the loop as if it were written:
- @smallexample
- DO II = 1, N, 51
- DO JJ = 1, M, 51
- DO I = II, min (II + 50, N)
- DO J = JJ, min (JJ + 50, M)
- A(J, I) = B(I) + C(J)
- ENDDO
- ENDDO
- ENDDO
- ENDDO
- @end smallexample
- which can be beneficial when @code{M} is larger than the caches,
- because the innermost loop iterates over a smaller amount of data
- which can be kept in the caches. This optimization applies to all the
- languages supported by GCC and is not limited to Fortran. To use this
- code transformation, GCC has to be configured with @option{--with-isl}
- to enable the Graphite loop transformation infrastructure.
- @item -fgraphite-identity
- @opindex fgraphite-identity
- Enable the identity transformation for graphite. For every SCoP we generate
- the polyhedral representation and transform it back to gimple. Using
- @option{-fgraphite-identity} we can check the costs or benefits of the
- GIMPLE -> GRAPHITE -> GIMPLE transformation. Some minimal optimizations
- are also performed by the code generator ISL, like index splitting and
- dead code elimination in loops.
- @item -floop-nest-optimize
- @opindex floop-nest-optimize
- Enable the ISL based loop nest optimizer. This is a generic loop nest
- optimizer based on the Pluto optimization algorithms. It calculates a loop
- structure optimized for data-locality and parallelism. This option
- is experimental.
- @item -floop-unroll-and-jam
- @opindex floop-unroll-and-jam
- Enable unroll and jam for the ISL based loop nest optimizer. The unroll
- factor can be changed using the @option{loop-unroll-jam-size} parameter.
- The unrolled dimension (counting from the most inner one) can be changed
- using the @option{loop-unroll-jam-depth} parameter. .
- @item -floop-parallelize-all
- @opindex floop-parallelize-all
- Use the Graphite data dependence analysis to identify loops that can
- be parallelized. Parallelize all the loops that can be analyzed to
- not contain loop carried dependences without checking that it is
- profitable to parallelize the loops.
- @item -fcheck-data-deps
- @opindex fcheck-data-deps
- Compare the results of several data dependence analyzers. This option
- is used for debugging the data dependence analyzers.
- @item -ftree-loop-if-convert
- @opindex ftree-loop-if-convert
- Attempt to transform conditional jumps in the innermost loops to
- branch-less equivalents. The intent is to remove control-flow from
- the innermost loops in order to improve the ability of the
- vectorization pass to handle these loops. This is enabled by default
- if vectorization is enabled.
- @item -ftree-loop-if-convert-stores
- @opindex ftree-loop-if-convert-stores
- Attempt to also if-convert conditional jumps containing memory writes.
- This transformation can be unsafe for multi-threaded programs as it
- transforms conditional memory writes into unconditional memory writes.
- For example,
- @smallexample
- for (i = 0; i < N; i++)
- if (cond)
- A[i] = expr;
- @end smallexample
- is transformed to
- @smallexample
- for (i = 0; i < N; i++)
- A[i] = cond ? expr : A[i];
- @end smallexample
- potentially producing data races.
- @item -ftree-loop-distribution
- @opindex ftree-loop-distribution
- Perform loop distribution. This flag can improve cache performance on
- big loop bodies and allow further loop optimizations, like
- parallelization or vectorization, to take place. For example, the loop
- @smallexample
- DO I = 1, N
- A(I) = B(I) + C
- D(I) = E(I) * F
- ENDDO
- @end smallexample
- is transformed to
- @smallexample
- DO I = 1, N
- A(I) = B(I) + C
- ENDDO
- DO I = 1, N
- D(I) = E(I) * F
- ENDDO
- @end smallexample
- @item -ftree-loop-distribute-patterns
- @opindex ftree-loop-distribute-patterns
- Perform loop distribution of patterns that can be code generated with
- calls to a library. This flag is enabled by default at @option{-O3}.
- This pass distributes the initialization loops and generates a call to
- memset zero. For example, the loop
- @smallexample
- DO I = 1, N
- A(I) = 0
- B(I) = A(I) + I
- ENDDO
- @end smallexample
- is transformed to
- @smallexample
- DO I = 1, N
- A(I) = 0
- ENDDO
- DO I = 1, N
- B(I) = A(I) + I
- ENDDO
- @end smallexample
- and the initialization loop is transformed into a call to memset zero.
- @item -ftree-loop-im
- @opindex ftree-loop-im
- Perform loop invariant motion on trees. This pass moves only invariants that
- are hard to handle at RTL level (function calls, operations that expand to
- nontrivial sequences of insns). With @option{-funswitch-loops} it also moves
- operands of conditions that are invariant out of the loop, so that we can use
- just trivial invariantness analysis in loop unswitching. The pass also includes
- store motion.
- @item -ftree-loop-ivcanon
- @opindex ftree-loop-ivcanon
- Create a canonical counter for number of iterations in loops for which
- determining number of iterations requires complicated analysis. Later
- optimizations then may determine the number easily. Useful especially
- in connection with unrolling.
- @item -fivopts
- @opindex fivopts
- Perform induction variable optimizations (strength reduction, induction
- variable merging and induction variable elimination) on trees.
- @item -ftree-parallelize-loops=n
- @opindex ftree-parallelize-loops
- Parallelize loops, i.e., split their iteration space to run in n threads.
- This is only possible for loops whose iterations are independent
- and can be arbitrarily reordered. The optimization is only
- profitable on multiprocessor machines, for loops that are CPU-intensive,
- rather than constrained e.g.@: by memory bandwidth. This option
- implies @option{-pthread}, and thus is only supported on targets
- that have support for @option{-pthread}.
- @item -ftree-pta
- @opindex ftree-pta
- Perform function-local points-to analysis on trees. This flag is
- enabled by default at @option{-O} and higher.
- @item -ftree-sra
- @opindex ftree-sra
- Perform scalar replacement of aggregates. This pass replaces structure
- references with scalars to prevent committing structures to memory too
- early. This flag is enabled by default at @option{-O} and higher.
- @item -ftree-copyrename
- @opindex ftree-copyrename
- Perform copy renaming on trees. This pass attempts to rename compiler
- temporaries to other variables at copy locations, usually resulting in
- variable names which more closely resemble the original variables. This flag
- is enabled by default at @option{-O} and higher.
- @item -ftree-coalesce-inlined-vars
- @opindex ftree-coalesce-inlined-vars
- Tell the copyrename pass (see @option{-ftree-copyrename}) to attempt to
- combine small user-defined variables too, but only if they are inlined
- from other functions. It is a more limited form of
- @option{-ftree-coalesce-vars}. This may harm debug information of such
- inlined variables, but it keeps variables of the inlined-into
- function apart from each other, such that they are more likely to
- contain the expected values in a debugging session.
- @item -ftree-coalesce-vars
- @opindex ftree-coalesce-vars
- Tell the copyrename pass (see @option{-ftree-copyrename}) to attempt to
- combine small user-defined variables too, instead of just compiler
- temporaries. This may severely limit the ability to debug an optimized
- program compiled with @option{-fno-var-tracking-assignments}. In the
- negated form, this flag prevents SSA coalescing of user variables,
- including inlined ones. This option is enabled by default.
- @item -ftree-ter
- @opindex ftree-ter
- Perform temporary expression replacement during the SSA->normal phase. Single
- use/single def temporaries are replaced at their use location with their
- defining expression. This results in non-GIMPLE code, but gives the expanders
- much more complex trees to work on resulting in better RTL generation. This is
- enabled by default at @option{-O} and higher.
- @item -ftree-slsr
- @opindex ftree-slsr
- Perform straight-line strength reduction on trees. This recognizes related
- expressions involving multiplications and replaces them by less expensive
- calculations when possible. This is enabled by default at @option{-O} and
- higher.
- @item -ftree-vectorize
- @opindex ftree-vectorize
- Perform vectorization on trees. This flag enables @option{-ftree-loop-vectorize}
- and @option{-ftree-slp-vectorize} if not explicitly specified.
- @item -ftree-loop-vectorize
- @opindex ftree-loop-vectorize
- Perform loop vectorization on trees. This flag is enabled by default at
- @option{-O3} and when @option{-ftree-vectorize} is enabled.
- @item -ftree-slp-vectorize
- @opindex ftree-slp-vectorize
- Perform basic block vectorization on trees. This flag is enabled by default at
- @option{-O3} and when @option{-ftree-vectorize} is enabled.
- @item -fvect-cost-model=@var{model}
- @opindex fvect-cost-model
- Alter the cost model used for vectorization. The @var{model} argument
- should be one of @samp{unlimited}, @samp{dynamic} or @samp{cheap}.
- With the @samp{unlimited} model the vectorized code-path is assumed
- to be profitable while with the @samp{dynamic} model a runtime check
- guards the vectorized code-path to enable it only for iteration
- counts that will likely execute faster than when executing the original
- scalar loop. The @samp{cheap} model disables vectorization of
- loops where doing so would be cost prohibitive for example due to
- required runtime checks for data dependence or alignment but otherwise
- is equal to the @samp{dynamic} model.
- The default cost model depends on other optimization flags and is
- either @samp{dynamic} or @samp{cheap}.
- @item -fsimd-cost-model=@var{model}
- @opindex fsimd-cost-model
- Alter the cost model used for vectorization of loops marked with the OpenMP
- or Cilk Plus simd directive. The @var{model} argument should be one of
- @samp{unlimited}, @samp{dynamic}, @samp{cheap}. All values of @var{model}
- have the same meaning as described in @option{-fvect-cost-model} and by
- default a cost model defined with @option{-fvect-cost-model} is used.
- @item -ftree-vrp
- @opindex ftree-vrp
- Perform Value Range Propagation on trees. This is similar to the
- constant propagation pass, but instead of values, ranges of values are
- propagated. This allows the optimizers to remove unnecessary range
- checks like array bound checks and null pointer checks. This is
- enabled by default at @option{-O2} and higher. Null pointer check
- elimination is only done if @option{-fdelete-null-pointer-checks} is
- enabled.
- @item -fsplit-ivs-in-unroller
- @opindex fsplit-ivs-in-unroller
- Enables expression of values of induction variables in later iterations
- of the unrolled loop using the value in the first iteration. This breaks
- long dependency chains, thus improving efficiency of the scheduling passes.
- A combination of @option{-fweb} and CSE is often sufficient to obtain the
- same effect. However, that is not reliable in cases where the loop body
- is more complicated than a single basic block. It also does not work at all
- on some architectures due to restrictions in the CSE pass.
- This optimization is enabled by default.
- @item -fvariable-expansion-in-unroller
- @opindex fvariable-expansion-in-unroller
- With this option, the compiler creates multiple copies of some
- local variables when unrolling a loop, which can result in superior code.
- @item -fpartial-inlining
- @opindex fpartial-inlining
- Inline parts of functions. This option has any effect only
- when inlining itself is turned on by the @option{-finline-functions}
- or @option{-finline-small-functions} options.
- Enabled at level @option{-O2}.
- @item -fpredictive-commoning
- @opindex fpredictive-commoning
- Perform predictive commoning optimization, i.e., reusing computations
- (especially memory loads and stores) performed in previous
- iterations of loops.
- This option is enabled at level @option{-O3}.
- @item -fprefetch-loop-arrays
- @opindex fprefetch-loop-arrays
- If supported by the target machine, generate instructions to prefetch
- memory to improve the performance of loops that access large arrays.
- This option may generate better or worse code; results are highly
- dependent on the structure of loops within the source code.
- Disabled at level @option{-Os}.
- @item -fno-peephole
- @itemx -fno-peephole2
- @opindex fno-peephole
- @opindex fno-peephole2
- Disable any machine-specific peephole optimizations. The difference
- between @option{-fno-peephole} and @option{-fno-peephole2} is in how they
- are implemented in the compiler; some targets use one, some use the
- other, a few use both.
- @option{-fpeephole} is enabled by default.
- @option{-fpeephole2} enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fno-guess-branch-probability
- @opindex fno-guess-branch-probability
- Do not guess branch probabilities using heuristics.
- GCC uses heuristics to guess branch probabilities if they are
- not provided by profiling feedback (@option{-fprofile-arcs}). These
- heuristics are based on the control flow graph. If some branch probabilities
- are specified by @code{__builtin_expect}, then the heuristics are
- used to guess branch probabilities for the rest of the control flow graph,
- taking the @code{__builtin_expect} info into account. The interactions
- between the heuristics and @code{__builtin_expect} can be complex, and in
- some cases, it may be useful to disable the heuristics so that the effects
- of @code{__builtin_expect} are easier to understand.
- The default is @option{-fguess-branch-probability} at levels
- @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -freorder-blocks
- @opindex freorder-blocks
- Reorder basic blocks in the compiled function in order to reduce number of
- taken branches and improve code locality.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -freorder-blocks-and-partition
- @opindex freorder-blocks-and-partition
- In addition to reordering basic blocks in the compiled function, in order
- to reduce number of taken branches, partitions hot and cold basic blocks
- into separate sections of the assembly and .o files, to improve
- paging and cache locality performance.
- This optimization is automatically turned off in the presence of
- exception handling, for linkonce sections, for functions with a user-defined
- section attribute and on any architecture that does not support named
- sections.
- Enabled for x86 at levels @option{-O2}, @option{-O3}.
- @item -freorder-functions
- @opindex freorder-functions
- Reorder functions in the object file in order to
- improve code locality. This is implemented by using special
- subsections @code{.text.hot} for most frequently executed functions and
- @code{.text.unlikely} for unlikely executed functions. Reordering is done by
- the linker so object file format must support named sections and linker must
- place them in a reasonable way.
- Also profile feedback must be available to make this option effective. See
- @option{-fprofile-arcs} for details.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fstrict-aliasing
- @opindex fstrict-aliasing
- Allow the compiler to assume the strictest aliasing rules applicable to
- the language being compiled. For C (and C++), this activates
- optimizations based on the type of expressions. In particular, an
- object of one type is assumed never to reside at the same address as an
- object of a different type, unless the types are almost the same. For
- example, an @code{unsigned int} can alias an @code{int}, but not a
- @code{void*} or a @code{double}. A character type may alias any other
- type.
- @anchor{Type-punning}Pay special attention to code like this:
- @smallexample
- union a_union @{
- int i;
- double d;
- @};
- int f() @{
- union a_union t;
- t.d = 3.0;
- return t.i;
- @}
- @end smallexample
- The practice of reading from a different union member than the one most
- recently written to (called ``type-punning'') is common. Even with
- @option{-fstrict-aliasing}, type-punning is allowed, provided the memory
- is accessed through the union type. So, the code above works as
- expected. @xref{Structures unions enumerations and bit-fields
- implementation}. However, this code might not:
- @smallexample
- int f() @{
- union a_union t;
- int* ip;
- t.d = 3.0;
- ip = &t.i;
- return *ip;
- @}
- @end smallexample
- Similarly, access by taking the address, casting the resulting pointer
- and dereferencing the result has undefined behavior, even if the cast
- uses a union type, e.g.:
- @smallexample
- int f() @{
- double d = 3.0;
- return ((union a_union *) &d)->i;
- @}
- @end smallexample
- The @option{-fstrict-aliasing} option is enabled at levels
- @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fstrict-overflow
- @opindex fstrict-overflow
- Allow the compiler to assume strict signed overflow rules, depending
- on the language being compiled. For C (and C++) this means that
- overflow when doing arithmetic with signed numbers is undefined, which
- means that the compiler may assume that it does not happen. This
- permits various optimizations. For example, the compiler assumes
- that an expression like @code{i + 10 > i} is always true for
- signed @code{i}. This assumption is only valid if signed overflow is
- undefined, as the expression is false if @code{i + 10} overflows when
- using twos complement arithmetic. When this option is in effect any
- attempt to determine whether an operation on signed numbers
- overflows must be written carefully to not actually involve overflow.
- This option also allows the compiler to assume strict pointer
- semantics: given a pointer to an object, if adding an offset to that
- pointer does not produce a pointer to the same object, the addition is
- undefined. This permits the compiler to conclude that @code{p + u >
- p} is always true for a pointer @code{p} and unsigned integer
- @code{u}. This assumption is only valid because pointer wraparound is
- undefined, as the expression is false if @code{p + u} overflows using
- twos complement arithmetic.
- See also the @option{-fwrapv} option. Using @option{-fwrapv} means
- that integer signed overflow is fully defined: it wraps. When
- @option{-fwrapv} is used, there is no difference between
- @option{-fstrict-overflow} and @option{-fno-strict-overflow} for
- integers. With @option{-fwrapv} certain types of overflow are
- permitted. For example, if the compiler gets an overflow when doing
- arithmetic on constants, the overflowed value can still be used with
- @option{-fwrapv}, but not otherwise.
- The @option{-fstrict-overflow} option is enabled at levels
- @option{-O2}, @option{-O3}, @option{-Os}.
- @item -falign-functions
- @itemx -falign-functions=@var{n}
- @opindex falign-functions
- Align the start of functions to the next power-of-two greater than
- @var{n}, skipping up to @var{n} bytes. For instance,
- @option{-falign-functions=32} aligns functions to the next 32-byte
- boundary, but @option{-falign-functions=24} aligns to the next
- 32-byte boundary only if this can be done by skipping 23 bytes or less.
- @option{-fno-align-functions} and @option{-falign-functions=1} are
- equivalent and mean that functions are not aligned.
- Some assemblers only support this flag when @var{n} is a power of two;
- in that case, it is rounded up.
- If @var{n} is not specified or is zero, use a machine-dependent default.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -falign-labels
- @itemx -falign-labels=@var{n}
- @opindex falign-labels
- Align all branch targets to a power-of-two boundary, skipping up to
- @var{n} bytes like @option{-falign-functions}. This option can easily
- make code slower, because it must insert dummy operations for when the
- branch target is reached in the usual flow of the code.
- @option{-fno-align-labels} and @option{-falign-labels=1} are
- equivalent and mean that labels are not aligned.
- If @option{-falign-loops} or @option{-falign-jumps} are applicable and
- are greater than this value, then their values are used instead.
- If @var{n} is not specified or is zero, use a machine-dependent default
- which is very likely to be @samp{1}, meaning no alignment.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -falign-loops
- @itemx -falign-loops=@var{n}
- @opindex falign-loops
- Align loops to a power-of-two boundary, skipping up to @var{n} bytes
- like @option{-falign-functions}. If the loops are
- executed many times, this makes up for any execution of the dummy
- operations.
- @option{-fno-align-loops} and @option{-falign-loops=1} are
- equivalent and mean that loops are not aligned.
- If @var{n} is not specified or is zero, use a machine-dependent default.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -falign-jumps
- @itemx -falign-jumps=@var{n}
- @opindex falign-jumps
- Align branch targets to a power-of-two boundary, for branch targets
- where the targets can only be reached by jumping, skipping up to @var{n}
- bytes like @option{-falign-functions}. In this case, no dummy operations
- need be executed.
- @option{-fno-align-jumps} and @option{-falign-jumps=1} are
- equivalent and mean that loops are not aligned.
- If @var{n} is not specified or is zero, use a machine-dependent default.
- Enabled at levels @option{-O2}, @option{-O3}.
- @item -funit-at-a-time
- @opindex funit-at-a-time
- This option is left for compatibility reasons. @option{-funit-at-a-time}
- has no effect, while @option{-fno-unit-at-a-time} implies
- @option{-fno-toplevel-reorder} and @option{-fno-section-anchors}.
- Enabled by default.
- @item -fno-toplevel-reorder
- @opindex fno-toplevel-reorder
- Do not reorder top-level functions, variables, and @code{asm}
- statements. Output them in the same order that they appear in the
- input file. When this option is used, unreferenced static variables
- are not removed. This option is intended to support existing code
- that relies on a particular ordering. For new code, it is better to
- use attributes when possible.
- Enabled at level @option{-O0}. When disabled explicitly, it also implies
- @option{-fno-section-anchors}, which is otherwise enabled at @option{-O0} on some
- targets.
- @item -fweb
- @opindex fweb
- Constructs webs as commonly used for register allocation purposes and assign
- each web individual pseudo register. This allows the register allocation pass
- to operate on pseudos directly, but also strengthens several other optimization
- passes, such as CSE, loop optimizer and trivial dead code remover. It can,
- however, make debugging impossible, since variables no longer stay in a
- ``home register''.
- Enabled by default with @option{-funroll-loops}.
- @item -fwhole-program
- @opindex fwhole-program
- Assume that the current compilation unit represents the whole program being
- compiled. All public functions and variables with the exception of @code{main}
- and those merged by attribute @code{externally_visible} become static functions
- and in effect are optimized more aggressively by interprocedural optimizers.
- This option should not be used in combination with @option{-flto}.
- Instead relying on a linker plugin should provide safer and more precise
- information.
- @item -flto[=@var{n}]
- @opindex flto
- This option runs the standard link-time optimizer. When invoked
- with source code, it generates GIMPLE (one of GCC's internal
- representations) and writes it to special ELF sections in the object
- file. When the object files are linked together, all the function
- bodies are read from these ELF sections and instantiated as if they
- had been part of the same translation unit.
- To use the link-time optimizer, @option{-flto} and optimization
- options should be specified at compile time and during the final link.
- For example:
- @smallexample
- gcc -c -O2 -flto foo.c
- gcc -c -O2 -flto bar.c
- gcc -o myprog -flto -O2 foo.o bar.o
- @end smallexample
- The first two invocations to GCC save a bytecode representation
- of GIMPLE into special ELF sections inside @file{foo.o} and
- @file{bar.o}. The final invocation reads the GIMPLE bytecode from
- @file{foo.o} and @file{bar.o}, merges the two files into a single
- internal image, and compiles the result as usual. Since both
- @file{foo.o} and @file{bar.o} are merged into a single image, this
- causes all the interprocedural analyses and optimizations in GCC to
- work across the two files as if they were a single one. This means,
- for example, that the inliner is able to inline functions in
- @file{bar.o} into functions in @file{foo.o} and vice-versa.
- Another (simpler) way to enable link-time optimization is:
- @smallexample
- gcc -o myprog -flto -O2 foo.c bar.c
- @end smallexample
- The above generates bytecode for @file{foo.c} and @file{bar.c},
- merges them together into a single GIMPLE representation and optimizes
- them as usual to produce @file{myprog}.
- The only important thing to keep in mind is that to enable link-time
- optimizations you need to use the GCC driver to perform the link-step.
- GCC then automatically performs link-time optimization if any of the
- objects involved were compiled with the @option{-flto} command-line option.
- You generally
- should specify the optimization options to be used for link-time
- optimization though GCC tries to be clever at guessing an
- optimization level to use from the options used at compile-time
- if you fail to specify one at link-time. You can always override
- the automatic decision to do link-time optimization at link-time
- by passing @option{-fno-lto} to the link command.
- To make whole program optimization effective, it is necessary to make
- certain whole program assumptions. The compiler needs to know
- what functions and variables can be accessed by libraries and runtime
- outside of the link-time optimized unit. When supported by the linker,
- the linker plugin (see @option{-fuse-linker-plugin}) passes information
- to the compiler about used and externally visible symbols. When
- the linker plugin is not available, @option{-fwhole-program} should be
- used to allow the compiler to make these assumptions, which leads
- to more aggressive optimization decisions.
- When @option{-fuse-linker-plugin} is not enabled then, when a file is
- compiled with @option{-flto}, the generated object file is larger than
- a regular object file because it contains GIMPLE bytecodes and the usual
- final code (see @option{-ffat-lto-objects}. This means that
- object files with LTO information can be linked as normal object
- files; if @option{-fno-lto} is passed to the linker, no
- interprocedural optimizations are applied. Note that when
- @option{-fno-fat-lto-objects} is enabled the compile-stage is faster
- but you cannot perform a regular, non-LTO link on them.
- Additionally, the optimization flags used to compile individual files
- are not necessarily related to those used at link time. For instance,
- @smallexample
- gcc -c -O0 -ffat-lto-objects -flto foo.c
- gcc -c -O0 -ffat-lto-objects -flto bar.c
- gcc -o myprog -O3 foo.o bar.o
- @end smallexample
- This produces individual object files with unoptimized assembler
- code, but the resulting binary @file{myprog} is optimized at
- @option{-O3}. If, instead, the final binary is generated with
- @option{-fno-lto}, then @file{myprog} is not optimized.
- When producing the final binary, GCC only
- applies link-time optimizations to those files that contain bytecode.
- Therefore, you can mix and match object files and libraries with
- GIMPLE bytecodes and final object code. GCC automatically selects
- which files to optimize in LTO mode and which files to link without
- further processing.
- There are some code generation flags preserved by GCC when
- generating bytecodes, as they need to be used during the final link
- stage. Generally options specified at link-time override those
- specified at compile-time.
- If you do not specify an optimization level option @option{-O} at
- link-time then GCC computes one based on the optimization levels
- used when compiling the object files. The highest optimization
- level wins here.
- Currently, the following options and their setting are take from
- the first object file that explicitely specified it:
- @option{-fPIC}, @option{-fpic}, @option{-fpie}, @option{-fcommon},
- @option{-fexceptions}, @option{-fnon-call-exceptions}, @option{-fgnu-tm}
- and all the @option{-m} target flags.
- Certain ABI changing flags are required to match in all compilation-units
- and trying to override this at link-time with a conflicting value
- is ignored. This includes options such as @option{-freg-struct-return}
- and @option{-fpcc-struct-return}.
- Other options such as @option{-ffp-contract}, @option{-fno-strict-overflow},
- @option{-fwrapv}, @option{-fno-trapv} or @option{-fno-strict-aliasing}
- are passed through to the link stage and merged conservatively for
- conflicting translation units. Specifically
- @option{-fno-strict-overflow}, @option{-fwrapv} and @option{-fno-trapv} take
- precedence and for example @option{-ffp-contract=off} takes precedence
- over @option{-ffp-contract=fast}. You can override them at linke-time.
- It is recommended that you compile all the files participating in the
- same link with the same options and also specify those options at
- link time.
- If LTO encounters objects with C linkage declared with incompatible
- types in separate translation units to be linked together (undefined
- behavior according to ISO C99 6.2.7), a non-fatal diagnostic may be
- issued. The behavior is still undefined at run time. Similar
- diagnostics may be raised for other languages.
- Another feature of LTO is that it is possible to apply interprocedural
- optimizations on files written in different languages:
- @smallexample
- gcc -c -flto foo.c
- g++ -c -flto bar.cc
- gfortran -c -flto baz.f90
- g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
- @end smallexample
- Notice that the final link is done with @command{g++} to get the C++
- runtime libraries and @option{-lgfortran} is added to get the Fortran
- runtime libraries. In general, when mixing languages in LTO mode, you
- should use the same link command options as when mixing languages in a
- regular (non-LTO) compilation.
- If object files containing GIMPLE bytecode are stored in a library archive, say
- @file{libfoo.a}, it is possible to extract and use them in an LTO link if you
- are using a linker with plugin support. To create static libraries suitable
- for LTO, use @command{gcc-ar} and @command{gcc-ranlib} instead of @command{ar}
- and @command{ranlib};
- to show the symbols of object files with GIMPLE bytecode, use
- @command{gcc-nm}. Those commands require that @command{ar}, @command{ranlib}
- and @command{nm} have been compiled with plugin support. At link time, use the the
- flag @option{-fuse-linker-plugin} to ensure that the library participates in
- the LTO optimization process:
- @smallexample
- gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
- @end smallexample
- With the linker plugin enabled, the linker extracts the needed
- GIMPLE files from @file{libfoo.a} and passes them on to the running GCC
- to make them part of the aggregated GIMPLE image to be optimized.
- If you are not using a linker with plugin support and/or do not
- enable the linker plugin, then the objects inside @file{libfoo.a}
- are extracted and linked as usual, but they do not participate
- in the LTO optimization process. In order to make a static library suitable
- for both LTO optimization and usual linkage, compile its object files with
- @option{-flto} @option{-ffat-lto-objects}.
- Link-time optimizations do not require the presence of the whole program to
- operate. If the program does not require any symbols to be exported, it is
- possible to combine @option{-flto} and @option{-fwhole-program} to allow
- the interprocedural optimizers to use more aggressive assumptions which may
- lead to improved optimization opportunities.
- Use of @option{-fwhole-program} is not needed when linker plugin is
- active (see @option{-fuse-linker-plugin}).
- The current implementation of LTO makes no
- attempt to generate bytecode that is portable between different
- types of hosts. The bytecode files are versioned and there is a
- strict version check, so bytecode files generated in one version of
- GCC do not work with an older or newer version of GCC.
- Link-time optimization does not work well with generation of debugging
- information. Combining @option{-flto} with
- @option{-g} is currently experimental and expected to produce unexpected
- results.
- If you specify the optional @var{n}, the optimization and code
- generation done at link time is executed in parallel using @var{n}
- parallel jobs by utilizing an installed @command{make} program. The
- environment variable @env{MAKE} may be used to override the program
- used. The default value for @var{n} is 1.
- You can also specify @option{-flto=jobserver} to use GNU make's
- job server mode to determine the number of parallel jobs. This
- is useful when the Makefile calling GCC is already executing in parallel.
- You must prepend a @samp{+} to the command recipe in the parent Makefile
- for this to work. This option likely only works if @env{MAKE} is
- GNU make.
- @item -flto-partition=@var{alg}
- @opindex flto-partition
- Specify the partitioning algorithm used by the link-time optimizer.
- The value is either @samp{1to1} to specify a partitioning mirroring
- the original source files or @samp{balanced} to specify partitioning
- into equally sized chunks (whenever possible) or @samp{max} to create
- new partition for every symbol where possible. Specifying @samp{none}
- as an algorithm disables partitioning and streaming completely.
- The default value is @samp{balanced}. While @samp{1to1} can be used
- as an workaround for various code ordering issues, the @samp{max}
- partitioning is intended for internal testing only.
- The value @samp{one} specifies that exactly one partition should be
- used while the value @samp{none} bypasses partitioning and executes
- the link-time optimization step directly from the WPA phase.
- @item -flto-odr-type-merging
- @opindex flto-odr-type-merging
- Enable streaming of mangled types names of C++ types and their unification
- at linktime. This increases size of LTO object files, but enable
- diagnostics about One Definition Rule violations.
- @item -flto-compression-level=@var{n}
- @opindex flto-compression-level
- This option specifies the level of compression used for intermediate
- language written to LTO object files, and is only meaningful in
- conjunction with LTO mode (@option{-flto}). Valid
- values are 0 (no compression) to 9 (maximum compression). Values
- outside this range are clamped to either 0 or 9. If the option is not
- given, a default balanced compression setting is used.
- @item -flto-report
- @opindex flto-report
- Prints a report with internal details on the workings of the link-time
- optimizer. The contents of this report vary from version to version.
- It is meant to be useful to GCC developers when processing object
- files in LTO mode (via @option{-flto}).
- Disabled by default.
- @item -flto-report-wpa
- @opindex flto-report-wpa
- Like @option{-flto-report}, but only print for the WPA phase of Link
- Time Optimization.
- @item -fuse-linker-plugin
- @opindex fuse-linker-plugin
- Enables the use of a linker plugin during link-time optimization. This
- option relies on plugin support in the linker, which is available in gold
- or in GNU ld 2.21 or newer.
- This option enables the extraction of object files with GIMPLE bytecode out
- of library archives. This improves the quality of optimization by exposing
- more code to the link-time optimizer. This information specifies what
- symbols can be accessed externally (by non-LTO object or during dynamic
- linking). Resulting code quality improvements on binaries (and shared
- libraries that use hidden visibility) are similar to @option{-fwhole-program}.
- See @option{-flto} for a description of the effect of this flag and how to
- use it.
- This option is enabled by default when LTO support in GCC is enabled
- and GCC was configured for use with
- a linker supporting plugins (GNU ld 2.21 or newer or gold).
- @item -ffat-lto-objects
- @opindex ffat-lto-objects
- Fat LTO objects are object files that contain both the intermediate language
- and the object code. This makes them usable for both LTO linking and normal
- linking. This option is effective only when compiling with @option{-flto}
- and is ignored at link time.
- @option{-fno-fat-lto-objects} improves compilation time over plain LTO, but
- requires the complete toolchain to be aware of LTO. It requires a linker with
- linker plugin support for basic functionality. Additionally,
- @command{nm}, @command{ar} and @command{ranlib}
- need to support linker plugins to allow a full-featured build environment
- (capable of building static libraries etc). GCC provides the @command{gcc-ar},
- @command{gcc-nm}, @command{gcc-ranlib} wrappers to pass the right options
- to these tools. With non fat LTO makefiles need to be modified to use them.
- The default is @option{-fno-fat-lto-objects} on targets with linker plugin
- support.
- @item -fcompare-elim
- @opindex fcompare-elim
- After register allocation and post-register allocation instruction splitting,
- identify arithmetic instructions that compute processor flags similar to a
- comparison operation based on that arithmetic. If possible, eliminate the
- explicit comparison operation.
- This pass only applies to certain targets that cannot explicitly represent
- the comparison operation before register allocation is complete.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fcprop-registers
- @opindex fcprop-registers
- After register allocation and post-register allocation instruction splitting,
- perform a copy-propagation pass to try to reduce scheduling dependencies
- and occasionally eliminate the copy.
- Enabled at levels @option{-O}, @option{-O2}, @option{-O3}, @option{-Os}.
- @item -fprofile-correction
- @opindex fprofile-correction
- Profiles collected using an instrumented binary for multi-threaded programs may
- be inconsistent due to missed counter updates. When this option is specified,
- GCC uses heuristics to correct or smooth out such inconsistencies. By
- default, GCC emits an error message when an inconsistent profile is detected.
- @item -fprofile-dir=@var{path}
- @opindex fprofile-dir
- Set the directory to search for the profile data files in to @var{path}.
- This option affects only the profile data generated by
- @option{-fprofile-generate}, @option{-ftest-coverage}, @option{-fprofile-arcs}
- and used by @option{-fprofile-use} and @option{-fbranch-probabilities}
- and its related options. Both absolute and relative paths can be used.
- By default, GCC uses the current directory as @var{path}, thus the
- profile data file appears in the same directory as the object file.
- @item -fprofile-generate
- @itemx -fprofile-generate=@var{path}
- @opindex fprofile-generate
- Enable options usually used for instrumenting application to produce
- profile useful for later recompilation with profile feedback based
- optimization. You must use @option{-fprofile-generate} both when
- compiling and when linking your program.
- The following options are enabled: @option{-fprofile-arcs}, @option{-fprofile-values}, @option{-fvpt}.
- If @var{path} is specified, GCC looks at the @var{path} to find
- the profile feedback data files. See @option{-fprofile-dir}.
- @item -fprofile-use
- @itemx -fprofile-use=@var{path}
- @opindex fprofile-use
- Enable profile feedback-directed optimizations,
- and the following optimizations
- which are generally profitable only with profile feedback available:
- @option{-fbranch-probabilities}, @option{-fvpt},
- @option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer},
- @option{-ftree-vectorize}, and @option{ftree-loop-distribute-patterns}.
- By default, GCC emits an error message if the feedback profiles do not
- match the source code. This error can be turned into a warning by using
- @option{-Wcoverage-mismatch}. Note this may result in poorly optimized
- code.
- If @var{path} is specified, GCC looks at the @var{path} to find
- the profile feedback data files. See @option{-fprofile-dir}.
- @item -fauto-profile
- @itemx -fauto-profile=@var{path}
- @opindex fauto-profile
- Enable sampling-based feedback-directed optimizations,
- and the following optimizations
- which are generally profitable only with profile feedback available:
- @option{-fbranch-probabilities}, @option{-fvpt},
- @option{-funroll-loops}, @option{-fpeel-loops}, @option{-ftracer},
- @option{-ftree-vectorize},
- @option{-finline-functions}, @option{-fipa-cp}, @option{-fipa-cp-clone},
- @option{-fpredictive-commoning}, @option{-funswitch-loops},
- @option{-fgcse-after-reload}, and @option{-ftree-loop-distribute-patterns}.
- @var{path} is the name of a file containing AutoFDO profile information.
- If omitted, it defaults to @file{fbdata.afdo} in the current directory.
- Producing an AutoFDO profile data file requires running your program
- with the @command{perf} utility on a supported GNU/Linux target system.
- For more information, see @uref{https://perf.wiki.kernel.org/}.
- E.g.
- @smallexample
- perf record -e br_inst_retired:near_taken -b -o perf.data \
- -- your_program
- @end smallexample
- Then use the @command{create_gcov} tool to convert the raw profile data
- to a format that can be used by GCC.@ You must also supply the
- unstripped binary for your program to this tool.
- See @uref{https://github.com/google/autofdo}.
- E.g.
- @smallexample
- create_gcov --binary=your_program.unstripped --profile=perf.data \
- --gcov=profile.afdo
- @end smallexample
- @end table
- The following options control compiler behavior regarding floating-point
- arithmetic. These options trade off between speed and
- correctness. All must be specifically enabled.
- @table @gcctabopt
- @item -ffloat-store
- @opindex ffloat-store
- Do not store floating-point variables in registers, and inhibit other
- options that might change whether a floating-point value is taken from a
- register or memory.
- @cindex floating-point precision
- This option prevents undesirable excess precision on machines such as
- the 68000 where the floating registers (of the 68881) keep more
- precision than a @code{double} is supposed to have. Similarly for the
- x86 architecture. For most programs, the excess precision does only
- good, but a few programs rely on the precise definition of IEEE floating
- point. Use @option{-ffloat-store} for such programs, after modifying
- them to store all pertinent intermediate computations into variables.
- @item -fexcess-precision=@var{style}
- @opindex fexcess-precision
- This option allows further control over excess precision on machines
- where floating-point registers have more precision than the IEEE
- @code{float} and @code{double} types and the processor does not
- support operations rounding to those types. By default,
- @option{-fexcess-precision=fast} is in effect; this means that
- operations are carried out in the precision of the registers and that
- it is unpredictable when rounding to the types specified in the source
- code takes place. When compiling C, if
- @option{-fexcess-precision=standard} is specified then excess
- precision follows the rules specified in ISO C99; in particular,
- both casts and assignments cause values to be rounded to their
- semantic types (whereas @option{-ffloat-store} only affects
- assignments). This option is enabled by default for C if a strict
- conformance option such as @option{-std=c99} is used.
- @opindex mfpmath
- @option{-fexcess-precision=standard} is not implemented for languages
- other than C, and has no effect if
- @option{-funsafe-math-optimizations} or @option{-ffast-math} is
- specified. On the x86, it also has no effect if @option{-mfpmath=sse}
- or @option{-mfpmath=sse+387} is specified; in the former case, IEEE
- semantics apply without excess precision, and in the latter, rounding
- is unpredictable.
- @item -ffast-math
- @opindex ffast-math
- Sets the options @option{-fno-math-errno}, @option{-funsafe-math-optimizations},
- @option{-ffinite-math-only}, @option{-fno-rounding-math},
- @option{-fno-signaling-nans} and @option{-fcx-limited-range}.
- This option causes the preprocessor macro @code{__FAST_MATH__} to be defined.
- This option is not turned on by any @option{-O} option besides
- @option{-Ofast} since it can result in incorrect output for programs
- that depend on an exact implementation of IEEE or ISO rules/specifications
- for math functions. It may, however, yield faster code for programs
- that do not require the guarantees of these specifications.
- @item -fno-math-errno
- @opindex fno-math-errno
- Do not set @code{errno} after calling math functions that are executed
- with a single instruction, e.g., @code{sqrt}. A program that relies on
- IEEE exceptions for math error handling may want to use this flag
- for speed while maintaining IEEE arithmetic compatibility.
- This option is not turned on by any @option{-O} option since
- it can result in incorrect output for programs that depend on
- an exact implementation of IEEE or ISO rules/specifications for
- math functions. It may, however, yield faster code for programs
- that do not require the guarantees of these specifications.
- The default is @option{-fmath-errno}.
- On Darwin systems, the math library never sets @code{errno}. There is
- therefore no reason for the compiler to consider the possibility that
- it might, and @option{-fno-math-errno} is the default.
- @item -funsafe-math-optimizations
- @opindex funsafe-math-optimizations
- Allow optimizations for floating-point arithmetic that (a) assume
- that arguments and results are valid and (b) may violate IEEE or
- ANSI standards. When used at link-time, it may include libraries
- or startup files that change the default FPU control word or other
- similar optimizations.
- This option is not turned on by any @option{-O} option since
- it can result in incorrect output for programs that depend on
- an exact implementation of IEEE or ISO rules/specifications for
- math functions. It may, however, yield faster code for programs
- that do not require the guarantees of these specifications.
- Enables @option{-fno-signed-zeros}, @option{-fno-trapping-math},
- @option{-fassociative-math} and @option{-freciprocal-math}.
- The default is @option{-fno-unsafe-math-optimizations}.
- @item -fassociative-math
- @opindex fassociative-math
- Allow re-association of operands in series of floating-point operations.
- This violates the ISO C and C++ language standard by possibly changing
- computation result. NOTE: re-ordering may change the sign of zero as
- well as ignore NaNs and inhibit or create underflow or overflow (and
- thus cannot be used on code that relies on rounding behavior like
- @code{(x + 2**52) - 2**52}. May also reorder floating-point comparisons
- and thus may not be used when ordered comparisons are required.
- This option requires that both @option{-fno-signed-zeros} and
- @option{-fno-trapping-math} be in effect. Moreover, it doesn't make
- much sense with @option{-frounding-math}. For Fortran the option
- is automatically enabled when both @option{-fno-signed-zeros} and
- @option{-fno-trapping-math} are in effect.
- The default is @option{-fno-associative-math}.
- @item -freciprocal-math
- @opindex freciprocal-math
- Allow the reciprocal of a value to be used instead of dividing by
- the value if this enables optimizations. For example @code{x / y}
- can be replaced with @code{x * (1/y)}, which is useful if @code{(1/y)}
- is subject to common subexpression elimination. Note that this loses
- precision and increases the number of flops operating on the value.
- The default is @option{-fno-reciprocal-math}.
- @item -ffinite-math-only
- @opindex ffinite-math-only
- Allow optimizations for floating-point arithmetic that assume
- that arguments and results are not NaNs or +-Infs.
- This option is not turned on by any @option{-O} option since
- it can result in incorrect output for programs that depend on
- an exact implementation of IEEE or ISO rules/specifications for
- math functions. It may, however, yield faster code for programs
- that do not require the guarantees of these specifications.
- The default is @option{-fno-finite-math-only}.
- @item -fno-signed-zeros
- @opindex fno-signed-zeros
- Allow optimizations for floating-point arithmetic that ignore the
- signedness of zero. IEEE arithmetic specifies the behavior of
- distinct +0.0 and @minus{}0.0 values, which then prohibits simplification
- of expressions such as x+0.0 or 0.0*x (even with @option{-ffinite-math-only}).
- This option implies that the sign of a zero result isn't significant.
- The default is @option{-fsigned-zeros}.
- @item -fno-trapping-math
- @opindex fno-trapping-math
- Compile code assuming that floating-point operations cannot generate
- user-visible traps. These traps include division by zero, overflow,
- underflow, inexact result and invalid operation. This option requires
- that @option{-fno-signaling-nans} be in effect. Setting this option may
- allow faster code if one relies on ``non-stop'' IEEE arithmetic, for example.
- This option should never be turned on by any @option{-O} option since
- it can result in incorrect output for programs that depend on
- an exact implementation of IEEE or ISO rules/specifications for
- math functions.
- The default is @option{-ftrapping-math}.
- @item -frounding-math
- @opindex frounding-math
- Disable transformations and optimizations that assume default floating-point
- rounding behavior. This is round-to-zero for all floating point
- to integer conversions, and round-to-nearest for all other arithmetic
- truncations. This option should be specified for programs that change
- the FP rounding mode dynamically, or that may be executed with a
- non-default rounding mode. This option disables constant folding of
- floating-point expressions at compile time (which may be affected by
- rounding mode) and arithmetic transformations that are unsafe in the
- presence of sign-dependent rounding modes.
- The default is @option{-fno-rounding-math}.
- This option is experimental and does not currently guarantee to
- disable all GCC optimizations that are affected by rounding mode.
- Future versions of GCC may provide finer control of this setting
- using C99's @code{FENV_ACCESS} pragma. This command-line option
- will be used to specify the default state for @code{FENV_ACCESS}.
- @item -fsignaling-nans
- @opindex fsignaling-nans
- Compile code assuming that IEEE signaling NaNs may generate user-visible
- traps during floating-point operations. Setting this option disables
- optimizations that may change the number of exceptions visible with
- signaling NaNs. This option implies @option{-ftrapping-math}.
- This option causes the preprocessor macro @code{__SUPPORT_SNAN__} to
- be defined.
- The default is @option{-fno-signaling-nans}.
- This option is experimental and does not currently guarantee to
- disable all GCC optimizations that affect signaling NaN behavior.
- @item -fsingle-precision-constant
- @opindex fsingle-precision-constant
- Treat floating-point constants as single precision instead of
- implicitly converting them to double-precision constants.
- @item -fcx-limited-range
- @opindex fcx-limited-range
- When enabled, this option states that a range reduction step is not
- needed when performing complex division. Also, there is no checking
- whether the result of a complex multiplication or division is @code{NaN
- + I*NaN}, with an attempt to rescue the situation in that case. The
- default is @option{-fno-cx-limited-range}, but is enabled by
- @option{-ffast-math}.
- This option controls the default setting of the ISO C99
- @code{CX_LIMITED_RANGE} pragma. Nevertheless, the option applies to
- all languages.
- @item -fcx-fortran-rules
- @opindex fcx-fortran-rules
- Complex multiplication and division follow Fortran rules. Range
- reduction is done as part of complex division, but there is no checking
- whether the result of a complex multiplication or division is @code{NaN
- + I*NaN}, with an attempt to rescue the situation in that case.
- The default is @option{-fno-cx-fortran-rules}.
- @end table
- The following options control optimizations that may improve
- performance, but are not enabled by any @option{-O} options. This
- section includes experimental options that may produce broken code.
- @table @gcctabopt
- @item -fbranch-probabilities
- @opindex fbranch-probabilities
- After running a program compiled with @option{-fprofile-arcs}
- (@pxref{Debugging Options,, Options for Debugging Your Program or
- @command{gcc}}), you can compile it a second time using
- @option{-fbranch-probabilities}, to improve optimizations based on
- the number of times each branch was taken. When a program
- compiled with @option{-fprofile-arcs} exits, it saves arc execution
- counts to a file called @file{@var{sourcename}.gcda} for each source
- file. The information in this data file is very dependent on the
- structure of the generated code, so you must use the same source code
- and the same optimization options for both compilations.
- With @option{-fbranch-probabilities}, GCC puts a
- @samp{REG_BR_PROB} note on each @samp{JUMP_INSN} and @samp{CALL_INSN}.
- These can be used to improve optimization. Currently, they are only
- used in one place: in @file{reorg.c}, instead of guessing which path a
- branch is most likely to take, the @samp{REG_BR_PROB} values are used to
- exactly determine which path is taken more often.
- @item -fprofile-values
- @opindex fprofile-values
- If combined with @option{-fprofile-arcs}, it adds code so that some
- data about values of expressions in the program is gathered.
- With @option{-fbranch-probabilities}, it reads back the data gathered
- from profiling values of expressions for usage in optimizations.
- Enabled with @option{-fprofile-generate} and @option{-fprofile-use}.
- @item -fprofile-reorder-functions
- @opindex fprofile-reorder-functions
- Function reordering based on profile instrumentation collects
- first time of execution of a function and orders these functions
- in ascending order.
- Enabled with @option{-fprofile-use}.
- @item -fvpt
- @opindex fvpt
- If combined with @option{-fprofile-arcs}, this option instructs the compiler
- to add code to gather information about values of expressions.
- With @option{-fbranch-probabilities}, it reads back the data gathered
- and actually performs the optimizations based on them.
- Currently the optimizations include specialization of division operations
- using the knowledge about the value of the denominator.
- @item -frename-registers
- @opindex frename-registers
- Attempt to avoid false dependencies in scheduled code by making use
- of registers left over after register allocation. This optimization
- most benefits processors with lots of registers. Depending on the
- debug information format adopted by the target, however, it can
- make debugging impossible, since variables no longer stay in
- a ``home register''.
- Enabled by default with @option{-funroll-loops} and @option{-fpeel-loops}.
- @item -fschedule-fusion
- @opindex fschedule-fusion
- Performs a target dependent pass over the instruction stream to schedule
- instructions of same type together because target machine can execute them
- more efficiently if they are adjacent to each other in the instruction flow.
- Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
- @item -ftracer
- @opindex ftracer
- Perform tail duplication to enlarge superblock size. This transformation
- simplifies the control flow of the function allowing other optimizations to do
- a better job.
- Enabled with @option{-fprofile-use}.
- @item -funroll-loops
- @opindex funroll-loops
- Unroll loops whose number of iterations can be determined at compile time or
- upon entry to the loop. @option{-funroll-loops} implies
- @option{-frerun-cse-after-loop}, @option{-fweb} and @option{-frename-registers}.
- It also turns on complete loop peeling (i.e.@: complete removal of loops with
- a small constant number of iterations). This option makes code larger, and may
- or may not make it run faster.
- Enabled with @option{-fprofile-use}.
- @item -funroll-all-loops
- @opindex funroll-all-loops
- Unroll all loops, even if their number of iterations is uncertain when
- the loop is entered. This usually makes programs run more slowly.
- @option{-funroll-all-loops} implies the same options as
- @option{-funroll-loops}.
- @item -fpeel-loops
- @opindex fpeel-loops
- Peels loops for which there is enough information that they do not
- roll much (from profile feedback). It also turns on complete loop peeling
- (i.e.@: complete removal of loops with small constant number of iterations).
- Enabled with @option{-fprofile-use}.
- @item -fmove-loop-invariants
- @opindex fmove-loop-invariants
- Enables the loop invariant motion pass in the RTL loop optimizer. Enabled
- at level @option{-O1}
- @item -funswitch-loops
- @opindex funswitch-loops
- Move branches with loop invariant conditions out of the loop, with duplicates
- of the loop on both branches (modified according to result of the condition).
- @item -ffunction-sections
- @itemx -fdata-sections
- @opindex ffunction-sections
- @opindex fdata-sections
- Place each function or data item into its own section in the output
- file if the target supports arbitrary sections. The name of the
- function or the name of the data item determines the section's name
- in the output file.
- Use these options on systems where the linker can perform optimizations
- to improve locality of reference in the instruction space. Most systems
- using the ELF object format and SPARC processors running Solaris 2 have
- linkers with such optimizations. AIX may have these optimizations in
- the future.
- Only use these options when there are significant benefits from doing
- so. When you specify these options, the assembler and linker
- create larger object and executable files and are also slower.
- You cannot use @command{gprof} on all systems if you
- specify this option, and you may have problems with debugging if
- you specify both this option and @option{-g}.
- @item -fbranch-target-load-optimize
- @opindex fbranch-target-load-optimize
- Perform branch target register load optimization before prologue / epilogue
- threading.
- The use of target registers can typically be exposed only during reload,
- thus hoisting loads out of loops and doing inter-block scheduling needs
- a separate optimization pass.
- @item -fbranch-target-load-optimize2
- @opindex fbranch-target-load-optimize2
- Perform branch target register load optimization after prologue / epilogue
- threading.
- @item -fbtr-bb-exclusive
- @opindex fbtr-bb-exclusive
- When performing branch target register load optimization, don't reuse
- branch target registers within any basic block.
- @item -fstack-protector
- @opindex fstack-protector
- Emit extra code to check for buffer overflows, such as stack smashing
- attacks. This is done by adding a guard variable to functions with
- vulnerable objects. This includes functions that call @code{alloca}, and
- functions with buffers larger than 8 bytes. The guards are initialized
- when a function is entered and then checked when the function exits.
- If a guard check fails, an error message is printed and the program exits.
- @item -fstack-protector-all
- @opindex fstack-protector-all
- Like @option{-fstack-protector} except that all functions are protected.
- @item -fstack-protector-strong
- @opindex fstack-protector-strong
- Like @option{-fstack-protector} but includes additional functions to
- be protected --- those that have local array definitions, or have
- references to local frame addresses.
- @item -fstack-protector-explicit
- @opindex fstack-protector-explicit
- Like @option{-fstack-protector} but only protects those functions which
- have the @code{stack_protect} attribute
- @item -fstdarg-opt
- @opindex fstdarg-opt
- Optimize the prologue of variadic argument functions with respect to usage of
- those arguments.
- @item -fsection-anchors
- @opindex fsection-anchors
- Try to reduce the number of symbolic address calculations by using
- shared ``anchor'' symbols to address nearby objects. This transformation
- can help to reduce the number of GOT entries and GOT accesses on some
- targets.
- For example, the implementation of the following function @code{foo}:
- @smallexample
- static int a, b, c;
- int foo (void) @{ return a + b + c; @}
- @end smallexample
- @noindent
- usually calculates the addresses of all three variables, but if you
- compile it with @option{-fsection-anchors}, it accesses the variables
- from a common anchor point instead. The effect is similar to the
- following pseudocode (which isn't valid C):
- @smallexample
- int foo (void)
- @{
- register int *xr = &x;
- return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
- @}
- @end smallexample
- Not all targets support this option.
- @item --param @var{name}=@var{value}
- @opindex param
- In some places, GCC uses various constants to control the amount of
- optimization that is done. For example, GCC does not inline functions
- that contain more than a certain number of instructions. You can
- control some of these constants on the command line using the
- @option{--param} option.
- The names of specific parameters, and the meaning of the values, are
- tied to the internals of the compiler, and are subject to change
- without notice in future releases.
- In each case, the @var{value} is an integer. The allowable choices for
- @var{name} are:
- @table @gcctabopt
- @item predictable-branch-outcome
- When branch is predicted to be taken with probability lower than this threshold
- (in percent), then it is considered well predictable. The default is 10.
- @item max-crossjump-edges
- The maximum number of incoming edges to consider for cross-jumping.
- The algorithm used by @option{-fcrossjumping} is @math{O(N^2)} in
- the number of edges incoming to each block. Increasing values mean
- more aggressive optimization, making the compilation time increase with
- probably small improvement in executable size.
- @item min-crossjump-insns
- The minimum number of instructions that must be matched at the end
- of two blocks before cross-jumping is performed on them. This
- value is ignored in the case where all instructions in the block being
- cross-jumped from are matched. The default value is 5.
- @item max-grow-copy-bb-insns
- The maximum code size expansion factor when copying basic blocks
- instead of jumping. The expansion is relative to a jump instruction.
- The default value is 8.
- @item max-goto-duplication-insns
- The maximum number of instructions to duplicate to a block that jumps
- to a computed goto. To avoid @math{O(N^2)} behavior in a number of
- passes, GCC factors computed gotos early in the compilation process,
- and unfactors them as late as possible. Only computed jumps at the
- end of a basic blocks with no more than max-goto-duplication-insns are
- unfactored. The default value is 8.
- @item max-delay-slot-insn-search
- The maximum number of instructions to consider when looking for an
- instruction to fill a delay slot. If more than this arbitrary number of
- instructions are searched, the time savings from filling the delay slot
- are minimal, so stop searching. Increasing values mean more
- aggressive optimization, making the compilation time increase with probably
- small improvement in execution time.
- @item max-delay-slot-live-search
- When trying to fill delay slots, the maximum number of instructions to
- consider when searching for a block with valid live register
- information. Increasing this arbitrarily chosen value means more
- aggressive optimization, increasing the compilation time. This parameter
- should be removed when the delay slot code is rewritten to maintain the
- control-flow graph.
- @item max-gcse-memory
- The approximate maximum amount of memory that can be allocated in
- order to perform the global common subexpression elimination
- optimization. If more memory than specified is required, the
- optimization is not done.
- @item max-gcse-insertion-ratio
- If the ratio of expression insertions to deletions is larger than this value
- for any expression, then RTL PRE inserts or removes the expression and thus
- leaves partially redundant computations in the instruction stream. The default value is 20.
- @item max-pending-list-length
- The maximum number of pending dependencies scheduling allows
- before flushing the current state and starting over. Large functions
- with few branches or calls can create excessively large lists which
- needlessly consume memory and resources.
- @item max-modulo-backtrack-attempts
- The maximum number of backtrack attempts the scheduler should make
- when modulo scheduling a loop. Larger values can exponentially increase
- compilation time.
- @item max-inline-insns-single
- Several parameters control the tree inliner used in GCC@.
- This number sets the maximum number of instructions (counted in GCC's
- internal representation) in a single function that the tree inliner
- considers for inlining. This only affects functions declared
- inline and methods implemented in a class declaration (C++).
- The default value is 400.
- @item max-inline-insns-auto
- When you use @option{-finline-functions} (included in @option{-O3}),
- a lot of functions that would otherwise not be considered for inlining
- by the compiler are investigated. To those functions, a different
- (more restrictive) limit compared to functions declared inline can
- be applied.
- The default value is 40.
- @item inline-min-speedup
- When estimated performance improvement of caller + callee runtime exceeds this
- threshold (in precent), the function can be inlined regardless the limit on
- @option{--param max-inline-insns-single} and @option{--param
- max-inline-insns-auto}.
- @item large-function-insns
- The limit specifying really large functions. For functions larger than this
- limit after inlining, inlining is constrained by
- @option{--param large-function-growth}. This parameter is useful primarily
- to avoid extreme compilation time caused by non-linear algorithms used by the
- back end.
- The default value is 2700.
- @item large-function-growth
- Specifies maximal growth of large function caused by inlining in percents.
- The default value is 100 which limits large function growth to 2.0 times
- the original size.
- @item large-unit-insns
- The limit specifying large translation unit. Growth caused by inlining of
- units larger than this limit is limited by @option{--param inline-unit-growth}.
- For small units this might be too tight.
- For example, consider a unit consisting of function A
- that is inline and B that just calls A three times. If B is small relative to
- A, the growth of unit is 300\% and yet such inlining is very sane. For very
- large units consisting of small inlineable functions, however, the overall unit
- growth limit is needed to avoid exponential explosion of code size. Thus for
- smaller units, the size is increased to @option{--param large-unit-insns}
- before applying @option{--param inline-unit-growth}. The default is 10000.
- @item inline-unit-growth
- Specifies maximal overall growth of the compilation unit caused by inlining.
- The default value is 20 which limits unit growth to 1.2 times the original
- size. Cold functions (either marked cold via an attribute or by profile
- feedback) are not accounted into the unit size.
- @item ipcp-unit-growth
- Specifies maximal overall growth of the compilation unit caused by
- interprocedural constant propagation. The default value is 10 which limits
- unit growth to 1.1 times the original size.
- @item large-stack-frame
- The limit specifying large stack frames. While inlining the algorithm is trying
- to not grow past this limit too much. The default value is 256 bytes.
- @item large-stack-frame-growth
- Specifies maximal growth of large stack frames caused by inlining in percents.
- The default value is 1000 which limits large stack frame growth to 11 times
- the original size.
- @item max-inline-insns-recursive
- @itemx max-inline-insns-recursive-auto
- Specifies the maximum number of instructions an out-of-line copy of a
- self-recursive inline
- function can grow into by performing recursive inlining.
- @option{--param max-inline-insns-recursive} applies to functions
- declared inline.
- For functions not declared inline, recursive inlining
- happens only when @option{-finline-functions} (included in @option{-O3}) is
- enabled; @option{--param max-inline-insns-recursive-auto} applies instead. The
- default value is 450.
- @item max-inline-recursive-depth
- @itemx max-inline-recursive-depth-auto
- Specifies the maximum recursion depth used for recursive inlining.
- @option{--param max-inline-recursive-depth} applies to functions
- declared inline. For functions not declared inline, recursive inlining
- happens only when @option{-finline-functions} (included in @option{-O3}) is
- enabled; @option{--param max-inline-recursive-depth-auto} applies instead. The
- default value is 8.
- @item min-inline-recursive-probability
- Recursive inlining is profitable only for function having deep recursion
- in average and can hurt for function having little recursion depth by
- increasing the prologue size or complexity of function body to other
- optimizers.
- When profile feedback is available (see @option{-fprofile-generate}) the actual
- recursion depth can be guessed from probability that function recurses via a
- given call expression. This parameter limits inlining only to call expressions
- whose probability exceeds the given threshold (in percents).
- The default value is 10.
- @item early-inlining-insns
- Specify growth that the early inliner can make. In effect it increases
- the amount of inlining for code having a large abstraction penalty.
- The default value is 14.
- @item max-early-inliner-iterations
- Limit of iterations of the early inliner. This basically bounds
- the number of nested indirect calls the early inliner can resolve.
- Deeper chains are still handled by late inlining.
- @item comdat-sharing-probability
- Probability (in percent) that C++ inline function with comdat visibility
- are shared across multiple compilation units. The default value is 20.
- @item profile-func-internal-id
- A parameter to control whether to use function internal id in profile
- database lookup. If the value is 0, the compiler uses an id that
- is based on function assembler name and filename, which makes old profile
- data more tolerant to source changes such as function reordering etc.
- The default value is 0.
- @item min-vect-loop-bound
- The minimum number of iterations under which loops are not vectorized
- when @option{-ftree-vectorize} is used. The number of iterations after
- vectorization needs to be greater than the value specified by this option
- to allow vectorization. The default value is 0.
- @item gcse-cost-distance-ratio
- Scaling factor in calculation of maximum distance an expression
- can be moved by GCSE optimizations. This is currently supported only in the
- code hoisting pass. The bigger the ratio, the more aggressive code hoisting
- is with simple expressions, i.e., the expressions that have cost
- less than @option{gcse-unrestricted-cost}. Specifying 0 disables
- hoisting of simple expressions. The default value is 10.
- @item gcse-unrestricted-cost
- Cost, roughly measured as the cost of a single typical machine
- instruction, at which GCSE optimizations do not constrain
- the distance an expression can travel. This is currently
- supported only in the code hoisting pass. The lesser the cost,
- the more aggressive code hoisting is. Specifying 0
- allows all expressions to travel unrestricted distances.
- The default value is 3.
- @item max-hoist-depth
- The depth of search in the dominator tree for expressions to hoist.
- This is used to avoid quadratic behavior in hoisting algorithm.
- The value of 0 does not limit on the search, but may slow down compilation
- of huge functions. The default value is 30.
- @item max-tail-merge-comparisons
- The maximum amount of similar bbs to compare a bb with. This is used to
- avoid quadratic behavior in tree tail merging. The default value is 10.
- @item max-tail-merge-iterations
- The maximum amount of iterations of the pass over the function. This is used to
- limit compilation time in tree tail merging. The default value is 2.
- @item max-unrolled-insns
- The maximum number of instructions that a loop may have to be unrolled.
- If a loop is unrolled, this parameter also determines how many times
- the loop code is unrolled.
- @item max-average-unrolled-insns
- The maximum number of instructions biased by probabilities of their execution
- that a loop may have to be unrolled. If a loop is unrolled,
- this parameter also determines how many times the loop code is unrolled.
- @item max-unroll-times
- The maximum number of unrollings of a single loop.
- @item max-peeled-insns
- The maximum number of instructions that a loop may have to be peeled.
- If a loop is peeled, this parameter also determines how many times
- the loop code is peeled.
- @item max-peel-times
- The maximum number of peelings of a single loop.
- @item max-peel-branches
- The maximum number of branches on the hot path through the peeled sequence.
- @item max-completely-peeled-insns
- The maximum number of insns of a completely peeled loop.
- @item max-completely-peel-times
- The maximum number of iterations of a loop to be suitable for complete peeling.
- @item max-completely-peel-loop-nest-depth
- The maximum depth of a loop nest suitable for complete peeling.
- @item max-unswitch-insns
- The maximum number of insns of an unswitched loop.
- @item max-unswitch-level
- The maximum number of branches unswitched in a single loop.
- @item lim-expensive
- The minimum cost of an expensive expression in the loop invariant motion.
- @item iv-consider-all-candidates-bound
- Bound on number of candidates for induction variables, below which
- all candidates are considered for each use in induction variable
- optimizations. If there are more candidates than this,
- only the most relevant ones are considered to avoid quadratic time complexity.
- @item iv-max-considered-uses
- The induction variable optimizations give up on loops that contain more
- induction variable uses.
- @item iv-always-prune-cand-set-bound
- If the number of candidates in the set is smaller than this value,
- always try to remove unnecessary ivs from the set
- when adding a new one.
- @item scev-max-expr-size
- Bound on size of expressions used in the scalar evolutions analyzer.
- Large expressions slow the analyzer.
- @item scev-max-expr-complexity
- Bound on the complexity of the expressions in the scalar evolutions analyzer.
- Complex expressions slow the analyzer.
- @item omega-max-vars
- The maximum number of variables in an Omega constraint system.
- The default value is 128.
- @item omega-max-geqs
- The maximum number of inequalities in an Omega constraint system.
- The default value is 256.
- @item omega-max-eqs
- The maximum number of equalities in an Omega constraint system.
- The default value is 128.
- @item omega-max-wild-cards
- The maximum number of wildcard variables that the Omega solver is
- able to insert. The default value is 18.
- @item omega-hash-table-size
- The size of the hash table in the Omega solver. The default value is
- 550.
- @item omega-max-keys
- The maximal number of keys used by the Omega solver. The default
- value is 500.
- @item omega-eliminate-redundant-constraints
- When set to 1, use expensive methods to eliminate all redundant
- constraints. The default value is 0.
- @item vect-max-version-for-alignment-checks
- The maximum number of run-time checks that can be performed when
- doing loop versioning for alignment in the vectorizer.
- @item vect-max-version-for-alias-checks
- The maximum number of run-time checks that can be performed when
- doing loop versioning for alias in the vectorizer.
- @item vect-max-peeling-for-alignment
- The maximum number of loop peels to enhance access alignment
- for vectorizer. Value -1 means 'no limit'.
- @item max-iterations-to-track
- The maximum number of iterations of a loop the brute-force algorithm
- for analysis of the number of iterations of the loop tries to evaluate.
- @item hot-bb-count-ws-permille
- A basic block profile count is considered hot if it contributes to
- the given permillage (i.e. 0...1000) of the entire profiled execution.
- @item hot-bb-frequency-fraction
- Select fraction of the entry block frequency of executions of basic block in
- function given basic block needs to have to be considered hot.
- @item max-predicted-iterations
- The maximum number of loop iterations we predict statically. This is useful
- in cases where a function contains a single loop with known bound and
- another loop with unknown bound.
- The known number of iterations is predicted correctly, while
- the unknown number of iterations average to roughly 10. This means that the
- loop without bounds appears artificially cold relative to the other one.
- @item builtin-expect-probability
- Control the probability of the expression having the specified value. This
- parameter takes a percentage (i.e. 0 ... 100) as input.
- The default probability of 90 is obtained empirically.
- @item align-threshold
- Select fraction of the maximal frequency of executions of a basic block in
- a function to align the basic block.
- @item align-loop-iterations
- A loop expected to iterate at least the selected number of iterations is
- aligned.
- @item tracer-dynamic-coverage
- @itemx tracer-dynamic-coverage-feedback
- This value is used to limit superblock formation once the given percentage of
- executed instructions is covered. This limits unnecessary code size
- expansion.
- The @option{tracer-dynamic-coverage-feedback} parameter
- is used only when profile
- feedback is available. The real profiles (as opposed to statically estimated
- ones) are much less balanced allowing the threshold to be larger value.
- @item tracer-max-code-growth
- Stop tail duplication once code growth has reached given percentage. This is
- a rather artificial limit, as most of the duplicates are eliminated later in
- cross jumping, so it may be set to much higher values than is the desired code
- growth.
- @item tracer-min-branch-ratio
- Stop reverse growth when the reverse probability of best edge is less than this
- threshold (in percent).
- @item tracer-min-branch-ratio
- @itemx tracer-min-branch-ratio-feedback
- Stop forward growth if the best edge has probability lower than this
- threshold.
- Similarly to @option{tracer-dynamic-coverage} two values are present, one for
- compilation for profile feedback and one for compilation without. The value
- for compilation with profile feedback needs to be more conservative (higher) in
- order to make tracer effective.
- @item max-cse-path-length
- The maximum number of basic blocks on path that CSE considers.
- The default is 10.
- @item max-cse-insns
- The maximum number of instructions CSE processes before flushing.
- The default is 1000.
- @item ggc-min-expand
- GCC uses a garbage collector to manage its own memory allocation. This
- parameter specifies the minimum percentage by which the garbage
- collector's heap should be allowed to expand between collections.
- Tuning this may improve compilation speed; it has no effect on code
- generation.
- The default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when
- RAM >= 1GB@. If @code{getrlimit} is available, the notion of ``RAM'' is
- the smallest of actual RAM and @code{RLIMIT_DATA} or @code{RLIMIT_AS}. If
- GCC is not able to calculate RAM on a particular platform, the lower
- bound of 30% is used. Setting this parameter and
- @option{ggc-min-heapsize} to zero causes a full collection to occur at
- every opportunity. This is extremely slow, but can be useful for
- debugging.
- @item ggc-min-heapsize
- Minimum size of the garbage collector's heap before it begins bothering
- to collect garbage. The first collection occurs after the heap expands
- by @option{ggc-min-expand}% beyond @option{ggc-min-heapsize}. Again,
- tuning this may improve compilation speed, and has no effect on code
- generation.
- The default is the smaller of RAM/8, RLIMIT_RSS, or a limit that
- tries to ensure that RLIMIT_DATA or RLIMIT_AS are not exceeded, but
- with a lower bound of 4096 (four megabytes) and an upper bound of
- 131072 (128 megabytes). If GCC is not able to calculate RAM on a
- particular platform, the lower bound is used. Setting this parameter
- very large effectively disables garbage collection. Setting this
- parameter and @option{ggc-min-expand} to zero causes a full collection
- to occur at every opportunity.
- @item max-reload-search-insns
- The maximum number of instruction reload should look backward for equivalent
- register. Increasing values mean more aggressive optimization, making the
- compilation time increase with probably slightly better performance.
- The default value is 100.
- @item max-cselib-memory-locations
- The maximum number of memory locations cselib should take into account.
- Increasing values mean more aggressive optimization, making the compilation time
- increase with probably slightly better performance. The default value is 500.
- @item reorder-blocks-duplicate
- @itemx reorder-blocks-duplicate-feedback
- Used by the basic block reordering pass to decide whether to use unconditional
- branch or duplicate the code on its destination. Code is duplicated when its
- estimated size is smaller than this value multiplied by the estimated size of
- unconditional jump in the hot spots of the program.
- The @option{reorder-block-duplicate-feedback} parameter
- is used only when profile
- feedback is available. It may be set to higher values than
- @option{reorder-block-duplicate} since information about the hot spots is more
- accurate.
- @item max-sched-ready-insns
- The maximum number of instructions ready to be issued the scheduler should
- consider at any given time during the first scheduling pass. Increasing
- values mean more thorough searches, making the compilation time increase
- with probably little benefit. The default value is 100.
- @item max-sched-region-blocks
- The maximum number of blocks in a region to be considered for
- interblock scheduling. The default value is 10.
- @item max-pipeline-region-blocks
- The maximum number of blocks in a region to be considered for
- pipelining in the selective scheduler. The default value is 15.
- @item max-sched-region-insns
- The maximum number of insns in a region to be considered for
- interblock scheduling. The default value is 100.
- @item max-pipeline-region-insns
- The maximum number of insns in a region to be considered for
- pipelining in the selective scheduler. The default value is 200.
- @item min-spec-prob
- The minimum probability (in percents) of reaching a source block
- for interblock speculative scheduling. The default value is 40.
- @item max-sched-extend-regions-iters
- The maximum number of iterations through CFG to extend regions.
- A value of 0 (the default) disables region extensions.
- @item max-sched-insn-conflict-delay
- The maximum conflict delay for an insn to be considered for speculative motion.
- The default value is 3.
- @item sched-spec-prob-cutoff
- The minimal probability of speculation success (in percents), so that
- speculative insns are scheduled.
- The default value is 40.
- @item sched-spec-state-edge-prob-cutoff
- The minimum probability an edge must have for the scheduler to save its
- state across it.
- The default value is 10.
- @item sched-mem-true-dep-cost
- Minimal distance (in CPU cycles) between store and load targeting same
- memory locations. The default value is 1.
- @item selsched-max-lookahead
- The maximum size of the lookahead window of selective scheduling. It is a
- depth of search for available instructions.
- The default value is 50.
- @item selsched-max-sched-times
- The maximum number of times that an instruction is scheduled during
- selective scheduling. This is the limit on the number of iterations
- through which the instruction may be pipelined. The default value is 2.
- @item selsched-max-insns-to-rename
- The maximum number of best instructions in the ready list that are considered
- for renaming in the selective scheduler. The default value is 2.
- @item sms-min-sc
- The minimum value of stage count that swing modulo scheduler
- generates. The default value is 2.
- @item max-last-value-rtl
- The maximum size measured as number of RTLs that can be recorded in an expression
- in combiner for a pseudo register as last known value of that register. The default
- is 10000.
- @item max-combine-insns
- The maximum number of instructions the RTL combiner tries to combine.
- The default value is 2 at @option{-Og} and 4 otherwise.
- @item integer-share-limit
- Small integer constants can use a shared data structure, reducing the
- compiler's memory usage and increasing its speed. This sets the maximum
- value of a shared integer constant. The default value is 256.
- @item ssp-buffer-size
- The minimum size of buffers (i.e.@: arrays) that receive stack smashing
- protection when @option{-fstack-protection} is used.
- @item min-size-for-stack-sharing
- The minimum size of variables taking part in stack slot sharing when not
- optimizing. The default value is 32.
- @item max-jump-thread-duplication-stmts
- Maximum number of statements allowed in a block that needs to be
- duplicated when threading jumps.
- @item max-fields-for-field-sensitive
- Maximum number of fields in a structure treated in
- a field sensitive manner during pointer analysis. The default is zero
- for @option{-O0} and @option{-O1},
- and 100 for @option{-Os}, @option{-O2}, and @option{-O3}.
- @item prefetch-latency
- Estimate on average number of instructions that are executed before
- prefetch finishes. The distance prefetched ahead is proportional
- to this constant. Increasing this number may also lead to less
- streams being prefetched (see @option{simultaneous-prefetches}).
- @item simultaneous-prefetches
- Maximum number of prefetches that can run at the same time.
- @item l1-cache-line-size
- The size of cache line in L1 cache, in bytes.
- @item l1-cache-size
- The size of L1 cache, in kilobytes.
- @item l2-cache-size
- The size of L2 cache, in kilobytes.
- @item min-insn-to-prefetch-ratio
- The minimum ratio between the number of instructions and the
- number of prefetches to enable prefetching in a loop.
- @item prefetch-min-insn-to-mem-ratio
- The minimum ratio between the number of instructions and the
- number of memory references to enable prefetching in a loop.
- @item use-canonical-types
- Whether the compiler should use the ``canonical'' type system. By
- default, this should always be 1, which uses a more efficient internal
- mechanism for comparing types in C++ and Objective-C++. However, if
- bugs in the canonical type system are causing compilation failures,
- set this value to 0 to disable canonical types.
- @item switch-conversion-max-branch-ratio
- Switch initialization conversion refuses to create arrays that are
- bigger than @option{switch-conversion-max-branch-ratio} times the number of
- branches in the switch.
- @item max-partial-antic-length
- Maximum length of the partial antic set computed during the tree
- partial redundancy elimination optimization (@option{-ftree-pre}) when
- optimizing at @option{-O3} and above. For some sorts of source code
- the enhanced partial redundancy elimination optimization can run away,
- consuming all of the memory available on the host machine. This
- parameter sets a limit on the length of the sets that are computed,
- which prevents the runaway behavior. Setting a value of 0 for
- this parameter allows an unlimited set length.
- @item sccvn-max-scc-size
- Maximum size of a strongly connected component (SCC) during SCCVN
- processing. If this limit is hit, SCCVN processing for the whole
- function is not done and optimizations depending on it are
- disabled. The default maximum SCC size is 10000.
- @item sccvn-max-alias-queries-per-access
- Maximum number of alias-oracle queries we perform when looking for
- redundancies for loads and stores. If this limit is hit the search
- is aborted and the load or store is not considered redundant. The
- number of queries is algorithmically limited to the number of
- stores on all paths from the load to the function entry.
- The default maxmimum number of queries is 1000.
- @item ira-max-loops-num
- IRA uses regional register allocation by default. If a function
- contains more loops than the number given by this parameter, only at most
- the given number of the most frequently-executed loops form regions
- for regional register allocation. The default value of the
- parameter is 100.
- @item ira-max-conflict-table-size
- Although IRA uses a sophisticated algorithm to compress the conflict
- table, the table can still require excessive amounts of memory for
- huge functions. If the conflict table for a function could be more
- than the size in MB given by this parameter, the register allocator
- instead uses a faster, simpler, and lower-quality
- algorithm that does not require building a pseudo-register conflict table.
- The default value of the parameter is 2000.
- @item ira-loop-reserved-regs
- IRA can be used to evaluate more accurate register pressure in loops
- for decisions to move loop invariants (see @option{-O3}). The number
- of available registers reserved for some other purposes is given
- by this parameter. The default value of the parameter is 2, which is
- the minimal number of registers needed by typical instructions.
- This value is the best found from numerous experiments.
- @item lra-inheritance-ebb-probability-cutoff
- LRA tries to reuse values reloaded in registers in subsequent insns.
- This optimization is called inheritance. EBB is used as a region to
- do this optimization. The parameter defines a minimal fall-through
- edge probability in percentage used to add BB to inheritance EBB in
- LRA. The default value of the parameter is 40. The value was chosen
- from numerous runs of SPEC2000 on x86-64.
- @item loop-invariant-max-bbs-in-loop
- Loop invariant motion can be very expensive, both in compilation time and
- in amount of needed compile-time memory, with very large loops. Loops
- with more basic blocks than this parameter won't have loop invariant
- motion optimization performed on them. The default value of the
- parameter is 1000 for @option{-O1} and 10000 for @option{-O2} and above.
- @item loop-max-datarefs-for-datadeps
- Building data dapendencies is expensive for very large loops. This
- parameter limits the number of data references in loops that are
- considered for data dependence analysis. These large loops are no
- handled by the optimizations using loop data dependencies.
- The default value is 1000.
- @item max-vartrack-size
- Sets a maximum number of hash table slots to use during variable
- tracking dataflow analysis of any function. If this limit is exceeded
- with variable tracking at assignments enabled, analysis for that
- function is retried without it, after removing all debug insns from
- the function. If the limit is exceeded even without debug insns, var
- tracking analysis is completely disabled for the function. Setting
- the parameter to zero makes it unlimited.
- @item max-vartrack-expr-depth
- Sets a maximum number of recursion levels when attempting to map
- variable names or debug temporaries to value expressions. This trades
- compilation time for more complete debug information. If this is set too
- low, value expressions that are available and could be represented in
- debug information may end up not being used; setting this higher may
- enable the compiler to find more complex debug expressions, but compile
- time and memory use may grow. The default is 12.
- @item min-nondebug-insn-uid
- Use uids starting at this parameter for nondebug insns. The range below
- the parameter is reserved exclusively for debug insns created by
- @option{-fvar-tracking-assignments}, but debug insns may get
- (non-overlapping) uids above it if the reserved range is exhausted.
- @item ipa-sra-ptr-growth-factor
- IPA-SRA replaces a pointer to an aggregate with one or more new
- parameters only when their cumulative size is less or equal to
- @option{ipa-sra-ptr-growth-factor} times the size of the original
- pointer parameter.
- @item sra-max-scalarization-size-Ospeed
- @item sra-max-scalarization-size-Osize
- The two Scalar Reduction of Aggregates passes (SRA and IPA-SRA) aim to
- replace scalar parts of aggregates with uses of independent scalar
- variables. These parameters control the maximum size, in storage units,
- of aggregate which is considered for replacement when compiling for
- speed
- (@option{sra-max-scalarization-size-Ospeed}) or size
- (@option{sra-max-scalarization-size-Osize}) respectively.
- @item tm-max-aggregate-size
- When making copies of thread-local variables in a transaction, this
- parameter specifies the size in bytes after which variables are
- saved with the logging functions as opposed to save/restore code
- sequence pairs. This option only applies when using
- @option{-fgnu-tm}.
- @item graphite-max-nb-scop-params
- To avoid exponential effects in the Graphite loop transforms, the
- number of parameters in a Static Control Part (SCoP) is bounded. The
- default value is 10 parameters. A variable whose value is unknown at
- compilation time and defined outside a SCoP is a parameter of the SCoP.
- @item graphite-max-bbs-per-function
- To avoid exponential effects in the detection of SCoPs, the size of
- the functions analyzed by Graphite is bounded. The default value is
- 100 basic blocks.
- @item loop-block-tile-size
- Loop blocking or strip mining transforms, enabled with
- @option{-floop-block} or @option{-floop-strip-mine}, strip mine each
- loop in the loop nest by a given number of iterations. The strip
- length can be changed using the @option{loop-block-tile-size}
- parameter. The default value is 51 iterations.
- @item loop-unroll-jam-size
- Specify the unroll factor for the @option{-floop-unroll-and-jam} option. The
- default value is 4.
- @item loop-unroll-jam-depth
- Specify the dimension to be unrolled (counting from the most inner loop)
- for the @option{-floop-unroll-and-jam}. The default value is 2.
- @item ipa-cp-value-list-size
- IPA-CP attempts to track all possible values and types passed to a function's
- parameter in order to propagate them and perform devirtualization.
- @option{ipa-cp-value-list-size} is the maximum number of values and types it
- stores per one formal parameter of a function.
- @item ipa-cp-eval-threshold
- IPA-CP calculates its own score of cloning profitability heuristics
- and performs those cloning opportunities with scores that exceed
- @option{ipa-cp-eval-threshold}.
- @item ipa-cp-recursion-penalty
- Percentage penalty the recursive functions will receive when they
- are evaluated for cloning.
- @item ipa-cp-single-call-penalty
- Percentage penalty functions containg a single call to another
- function will receive when they are evaluated for cloning.
- @item ipa-max-agg-items
- IPA-CP is also capable to propagate a number of scalar values passed
- in an aggregate. @option{ipa-max-agg-items} controls the maximum
- number of such values per one parameter.
- @item ipa-cp-loop-hint-bonus
- When IPA-CP determines that a cloning candidate would make the number
- of iterations of a loop known, it adds a bonus of
- @option{ipa-cp-loop-hint-bonus} to the profitability score of
- the candidate.
- @item ipa-cp-array-index-hint-bonus
- When IPA-CP determines that a cloning candidate would make the index of
- an array access known, it adds a bonus of
- @option{ipa-cp-array-index-hint-bonus} to the profitability
- score of the candidate.
- @item ipa-max-aa-steps
- During its analysis of function bodies, IPA-CP employs alias analysis
- in order to track values pointed to by function parameters. In order
- not spend too much time analyzing huge functions, it gives up and
- consider all memory clobbered after examining
- @option{ipa-max-aa-steps} statements modifying memory.
- @item lto-partitions
- Specify desired number of partitions produced during WHOPR compilation.
- The number of partitions should exceed the number of CPUs used for compilation.
- The default value is 32.
- @item lto-minpartition
- Size of minimal partition for WHOPR (in estimated instructions).
- This prevents expenses of splitting very small programs into too many
- partitions.
- @item cxx-max-namespaces-for-diagnostic-help
- The maximum number of namespaces to consult for suggestions when C++
- name lookup fails for an identifier. The default is 1000.
- @item sink-frequency-threshold
- The maximum relative execution frequency (in percents) of the target block
- relative to a statement's original block to allow statement sinking of a
- statement. Larger numbers result in more aggressive statement sinking.
- The default value is 75. A small positive adjustment is applied for
- statements with memory operands as those are even more profitable so sink.
- @item max-stores-to-sink
- The maximum number of conditional stores paires that can be sunk. Set to 0
- if either vectorization (@option{-ftree-vectorize}) or if-conversion
- (@option{-ftree-loop-if-convert}) is disabled. The default is 2.
- @item allow-store-data-races
- Allow optimizers to introduce new data races on stores.
- Set to 1 to allow, otherwise to 0. This option is enabled by default
- at optimization level @option{-Ofast}.
- @item case-values-threshold
- The smallest number of different values for which it is best to use a
- jump-table instead of a tree of conditional branches. If the value is
- 0, use the default for the machine. The default is 0.
- @item tree-reassoc-width
- Set the maximum number of instructions executed in parallel in
- reassociated tree. This parameter overrides target dependent
- heuristics used by default if has non zero value.
- @item sched-pressure-algorithm
- Choose between the two available implementations of
- @option{-fsched-pressure}. Algorithm 1 is the original implementation
- and is the more likely to prevent instructions from being reordered.
- Algorithm 2 was designed to be a compromise between the relatively
- conservative approach taken by algorithm 1 and the rather aggressive
- approach taken by the default scheduler. It relies more heavily on
- having a regular register file and accurate register pressure classes.
- See @file{haifa-sched.c} in the GCC sources for more details.
- The default choice depends on the target.
- @item max-slsr-cand-scan
- Set the maximum number of existing candidates that are considered when
- seeking a basis for a new straight-line strength reduction candidate.
- @item asan-globals
- Enable buffer overflow detection for global objects. This kind
- of protection is enabled by default if you are using
- @option{-fsanitize=address} option.
- To disable global objects protection use @option{--param asan-globals=0}.
- @item asan-stack
- Enable buffer overflow detection for stack objects. This kind of
- protection is enabled by default when using@option{-fsanitize=address}.
- To disable stack protection use @option{--param asan-stack=0} option.
- @item asan-instrument-reads
- Enable buffer overflow detection for memory reads. This kind of
- protection is enabled by default when using @option{-fsanitize=address}.
- To disable memory reads protection use
- @option{--param asan-instrument-reads=0}.
- @item asan-instrument-writes
- Enable buffer overflow detection for memory writes. This kind of
- protection is enabled by default when using @option{-fsanitize=address}.
- To disable memory writes protection use
- @option{--param asan-instrument-writes=0} option.
- @item asan-memintrin
- Enable detection for built-in functions. This kind of protection
- is enabled by default when using @option{-fsanitize=address}.
- To disable built-in functions protection use
- @option{--param asan-memintrin=0}.
- @item asan-use-after-return
- Enable detection of use-after-return. This kind of protection
- is enabled by default when using @option{-fsanitize=address} option.
- To disable use-after-return detection use
- @option{--param asan-use-after-return=0}.
- @item asan-instrumentation-with-call-threshold
- If number of memory accesses in function being instrumented
- is greater or equal to this number, use callbacks instead of inline checks.
- E.g. to disable inline code use
- @option{--param asan-instrumentation-with-call-threshold=0}.
- @item chkp-max-ctor-size
- Static constructors generated by Pointer Bounds Checker may become very
- large and significantly increase compile time at optimization level
- @option{-O1} and higher. This parameter is a maximum nubmer of statements
- in a single generated constructor. Default value is 5000.
- @item max-fsm-thread-path-insns
- Maximum number of instructions to copy when duplicating blocks on a
- finite state automaton jump thread path. The default is 100.
- @item max-fsm-thread-length
- Maximum number of basic blocks on a finite state automaton jump thread
- path. The default is 10.
- @item max-fsm-thread-paths
- Maximum number of new jump thread paths to create for a finite state
- automaton. The default is 50.
- @end table
- @end table
- @node Preprocessor Options
- @section Options Controlling the Preprocessor
- @cindex preprocessor options
- @cindex options, preprocessor
- These options control the C preprocessor, which is run on each C source
- file before actual compilation.
- If you use the @option{-E} option, nothing is done except preprocessing.
- Some of these options make sense only together with @option{-E} because
- they cause the preprocessor output to be unsuitable for actual
- compilation.
- @table @gcctabopt
- @item -Wp,@var{option}
- @opindex Wp
- You can use @option{-Wp,@var{option}} to bypass the compiler driver
- and pass @var{option} directly through to the preprocessor. If
- @var{option} contains commas, it is split into multiple options at the
- commas. However, many options are modified, translated or interpreted
- by the compiler driver before being passed to the preprocessor, and
- @option{-Wp} forcibly bypasses this phase. The preprocessor's direct
- interface is undocumented and subject to change, so whenever possible
- you should avoid using @option{-Wp} and let the driver handle the
- options instead.
- @item -Xpreprocessor @var{option}
- @opindex Xpreprocessor
- Pass @var{option} as an option to the preprocessor. You can use this to
- supply system-specific preprocessor options that GCC does not
- recognize.
- If you want to pass an option that takes an argument, you must use
- @option{-Xpreprocessor} twice, once for the option and once for the argument.
- @item -no-integrated-cpp
- @opindex no-integrated-cpp
- Perform preprocessing as a separate pass before compilation.
- By default, GCC performs preprocessing as an integrated part of
- input tokenization and parsing.
- If this option is provided, the appropriate language front end
- (@command{cc1}, @command{cc1plus}, or @command{cc1obj} for C, C++,
- and Objective-C, respectively) is instead invoked twice,
- once for preprocessing only and once for actual compilation
- of the preprocessed input.
- This option may be useful in conjunction with the @option{-B} or
- @option{-wrapper} options to specify an alternate preprocessor or
- perform additional processing of the program source between
- normal preprocessing and compilation.
- @end table
- @include cppopts.texi
- @node Assembler Options
- @section Passing Options to the Assembler
- @c prevent bad page break with this line
- You can pass options to the assembler.
- @table @gcctabopt
- @item -Wa,@var{option}
- @opindex Wa
- Pass @var{option} as an option to the assembler. If @var{option}
- contains commas, it is split into multiple options at the commas.
- @item -Xassembler @var{option}
- @opindex Xassembler
- Pass @var{option} as an option to the assembler. You can use this to
- supply system-specific assembler options that GCC does not
- recognize.
- If you want to pass an option that takes an argument, you must use
- @option{-Xassembler} twice, once for the option and once for the argument.
- @end table
- @node Link Options
- @section Options for Linking
- @cindex link options
- @cindex options, linking
- These options come into play when the compiler links object files into
- an executable output file. They are meaningless if the compiler is
- not doing a link step.
- @table @gcctabopt
- @cindex file names
- @item @var{object-file-name}
- A file name that does not end in a special recognized suffix is
- considered to name an object file or library. (Object files are
- distinguished from libraries by the linker according to the file
- contents.) If linking is done, these object files are used as input
- to the linker.
- @item -c
- @itemx -S
- @itemx -E
- @opindex c
- @opindex S
- @opindex E
- If any of these options is used, then the linker is not run, and
- object file names should not be used as arguments. @xref{Overall
- Options}.
- @item -fuse-ld=bfd
- @opindex fuse-ld=bfd
- Use the @command{bfd} linker instead of the default linker.
- @item -fuse-ld=gold
- @opindex fuse-ld=gold
- Use the @command{gold} linker instead of the default linker.
- @cindex Libraries
- @item -l@var{library}
- @itemx -l @var{library}
- @opindex l
- Search the library named @var{library} when linking. (The second
- alternative with the library as a separate argument is only for
- POSIX compliance and is not recommended.)
- It makes a difference where in the command you write this option; the
- linker searches and processes libraries and object files in the order they
- are specified. Thus, @samp{foo.o -lz bar.o} searches library @samp{z}
- after file @file{foo.o} but before @file{bar.o}. If @file{bar.o} refers
- to functions in @samp{z}, those functions may not be loaded.
- The linker searches a standard list of directories for the library,
- which is actually a file named @file{lib@var{library}.a}. The linker
- then uses this file as if it had been specified precisely by name.
- The directories searched include several standard system directories
- plus any that you specify with @option{-L}.
- Normally the files found this way are library files---archive files
- whose members are object files. The linker handles an archive file by
- scanning through it for members which define symbols that have so far
- been referenced but not defined. But if the file that is found is an
- ordinary object file, it is linked in the usual fashion. The only
- difference between using an @option{-l} option and specifying a file name
- is that @option{-l} surrounds @var{library} with @samp{lib} and @samp{.a}
- and searches several directories.
- @item -lobjc
- @opindex lobjc
- You need this special case of the @option{-l} option in order to
- link an Objective-C or Objective-C++ program.
- @item -nostartfiles
- @opindex nostartfiles
- Do not use the standard system startup files when linking.
- The standard system libraries are used normally, unless @option{-nostdlib}
- or @option{-nodefaultlibs} is used.
- @item -nodefaultlibs
- @opindex nodefaultlibs
- Do not use the standard system libraries when linking.
- Only the libraries you specify are passed to the linker, and options
- specifying linkage of the system libraries, such as @option{-static-libgcc}
- or @option{-shared-libgcc}, are ignored.
- The standard startup files are used normally, unless @option{-nostartfiles}
- is used.
- The compiler may generate calls to @code{memcmp},
- @code{memset}, @code{memcpy} and @code{memmove}.
- These entries are usually resolved by entries in
- libc. These entry points should be supplied through some other
- mechanism when this option is specified.
- @item -nostdlib
- @opindex nostdlib
- Do not use the standard system startup files or libraries when linking.
- No startup files and only the libraries you specify are passed to
- the linker, and options specifying linkage of the system libraries, such as
- @option{-static-libgcc} or @option{-shared-libgcc}, are ignored.
- The compiler may generate calls to @code{memcmp}, @code{memset},
- @code{memcpy} and @code{memmove}.
- These entries are usually resolved by entries in
- libc. These entry points should be supplied through some other
- mechanism when this option is specified.
- @cindex @option{-lgcc}, use with @option{-nostdlib}
- @cindex @option{-nostdlib} and unresolved references
- @cindex unresolved references and @option{-nostdlib}
- @cindex @option{-lgcc}, use with @option{-nodefaultlibs}
- @cindex @option{-nodefaultlibs} and unresolved references
- @cindex unresolved references and @option{-nodefaultlibs}
- One of the standard libraries bypassed by @option{-nostdlib} and
- @option{-nodefaultlibs} is @file{libgcc.a}, a library of internal subroutines
- which GCC uses to overcome shortcomings of particular machines, or special
- needs for some languages.
- (@xref{Interface,,Interfacing to GCC Output,gccint,GNU Compiler
- Collection (GCC) Internals},
- for more discussion of @file{libgcc.a}.)
- In most cases, you need @file{libgcc.a} even when you want to avoid
- other standard libraries. In other words, when you specify @option{-nostdlib}
- or @option{-nodefaultlibs} you should usually specify @option{-lgcc} as well.
- This ensures that you have no unresolved references to internal GCC
- library subroutines.
- (An example of such an internal subroutine is @code{__main}, used to ensure C++
- constructors are called; @pxref{Collect2,,@code{collect2}, gccint,
- GNU Compiler Collection (GCC) Internals}.)
- @item -pie
- @opindex pie
- Produce a position independent executable on targets that support it.
- For predictable results, you must also specify the same set of options
- used for compilation (@option{-fpie}, @option{-fPIE},
- or model suboptions) when you specify this linker option.
- @item -rdynamic
- @opindex rdynamic
- Pass the flag @option{-export-dynamic} to the ELF linker, on targets
- that support it. This instructs the linker to add all symbols, not
- only used ones, to the dynamic symbol table. This option is needed
- for some uses of @code{dlopen} or to allow obtaining backtraces
- from within a program.
- @item -s
- @opindex s
- Remove all symbol table and relocation information from the executable.
- @item -static
- @opindex static
- On systems that support dynamic linking, this prevents linking with the shared
- libraries. On other systems, this option has no effect.
- @item -shared
- @opindex shared
- Produce a shared object which can then be linked with other objects to
- form an executable. Not all systems support this option. For predictable
- results, you must also specify the same set of options used for compilation
- (@option{-fpic}, @option{-fPIC}, or model suboptions) when
- you specify this linker option.@footnote{On some systems, @samp{gcc -shared}
- needs to build supplementary stub code for constructors to work. On
- multi-libbed systems, @samp{gcc -shared} must select the correct support
- libraries to link against. Failing to supply the correct flags may lead
- to subtle defects. Supplying them in cases where they are not necessary
- is innocuous.}
- @item -shared-libgcc
- @itemx -static-libgcc
- @opindex shared-libgcc
- @opindex static-libgcc
- On systems that provide @file{libgcc} as a shared library, these options
- force the use of either the shared or static version, respectively.
- If no shared version of @file{libgcc} was built when the compiler was
- configured, these options have no effect.
- There are several situations in which an application should use the
- shared @file{libgcc} instead of the static version. The most common
- of these is when the application wishes to throw and catch exceptions
- across different shared libraries. In that case, each of the libraries
- as well as the application itself should use the shared @file{libgcc}.
- Therefore, the G++ and GCJ drivers automatically add
- @option{-shared-libgcc} whenever you build a shared library or a main
- executable, because C++ and Java programs typically use exceptions, so
- this is the right thing to do.
- If, instead, you use the GCC driver to create shared libraries, you may
- find that they are not always linked with the shared @file{libgcc}.
- If GCC finds, at its configuration time, that you have a non-GNU linker
- or a GNU linker that does not support option @option{--eh-frame-hdr},
- it links the shared version of @file{libgcc} into shared libraries
- by default. Otherwise, it takes advantage of the linker and optimizes
- away the linking with the shared version of @file{libgcc}, linking with
- the static version of libgcc by default. This allows exceptions to
- propagate through such shared libraries, without incurring relocation
- costs at library load time.
- However, if a library or main executable is supposed to throw or catch
- exceptions, you must link it using the G++ or GCJ driver, as appropriate
- for the languages used in the program, or using the option
- @option{-shared-libgcc}, such that it is linked with the shared
- @file{libgcc}.
- @item -static-libasan
- @opindex static-libasan
- When the @option{-fsanitize=address} option is used to link a program,
- the GCC driver automatically links against @option{libasan}. If
- @file{libasan} is available as a shared library, and the @option{-static}
- option is not used, then this links against the shared version of
- @file{libasan}. The @option{-static-libasan} option directs the GCC
- driver to link @file{libasan} statically, without necessarily linking
- other libraries statically.
- @item -static-libtsan
- @opindex static-libtsan
- When the @option{-fsanitize=thread} option is used to link a program,
- the GCC driver automatically links against @option{libtsan}. If
- @file{libtsan} is available as a shared library, and the @option{-static}
- option is not used, then this links against the shared version of
- @file{libtsan}. The @option{-static-libtsan} option directs the GCC
- driver to link @file{libtsan} statically, without necessarily linking
- other libraries statically.
- @item -static-liblsan
- @opindex static-liblsan
- When the @option{-fsanitize=leak} option is used to link a program,
- the GCC driver automatically links against @option{liblsan}. If
- @file{liblsan} is available as a shared library, and the @option{-static}
- option is not used, then this links against the shared version of
- @file{liblsan}. The @option{-static-liblsan} option directs the GCC
- driver to link @file{liblsan} statically, without necessarily linking
- other libraries statically.
- @item -static-libubsan
- @opindex static-libubsan
- When the @option{-fsanitize=undefined} option is used to link a program,
- the GCC driver automatically links against @option{libubsan}. If
- @file{libubsan} is available as a shared library, and the @option{-static}
- option is not used, then this links against the shared version of
- @file{libubsan}. The @option{-static-libubsan} option directs the GCC
- driver to link @file{libubsan} statically, without necessarily linking
- other libraries statically.
- @item -static-libmpx
- @opindex static-libmpx
- When the @option{-fcheck-pointer bounds} and @option{-mmpx} options are
- used to link a program, the GCC driver automatically links against
- @file{libmpx}. If @file{libmpx} is available as a shared library,
- and the @option{-static} option is not used, then this links against
- the shared version of @file{libmpx}. The @option{-static-libmpx}
- option directs the GCC driver to link @file{libmpx} statically,
- without necessarily linking other libraries statically.
- @item -static-libmpxwrappers
- @opindex static-libmpxwrappers
- When the @option{-fcheck-pointer bounds} and @option{-mmpx} options are used
- to link a program without also using @option{-fno-chkp-use-wrappers}, the
- GCC driver automatically links against @file{libmpxwrappers}. If
- @file{libmpxwrappers} is available as a shared library, and the
- @option{-static} option is not used, then this links against the shared
- version of @file{libmpxwrappers}. The @option{-static-libmpxwrappers}
- option directs the GCC driver to link @file{libmpxwrappers} statically,
- without necessarily linking other libraries statically.
- @item -static-libstdc++
- @opindex static-libstdc++
- When the @command{g++} program is used to link a C++ program, it
- normally automatically links against @option{libstdc++}. If
- @file{libstdc++} is available as a shared library, and the
- @option{-static} option is not used, then this links against the
- shared version of @file{libstdc++}. That is normally fine. However, it
- is sometimes useful to freeze the version of @file{libstdc++} used by
- the program without going all the way to a fully static link. The
- @option{-static-libstdc++} option directs the @command{g++} driver to
- link @file{libstdc++} statically, without necessarily linking other
- libraries statically.
- @item -symbolic
- @opindex symbolic
- Bind references to global symbols when building a shared object. Warn
- about any unresolved references (unless overridden by the link editor
- option @option{-Xlinker -z -Xlinker defs}). Only a few systems support
- this option.
- @item -T @var{script}
- @opindex T
- @cindex linker script
- Use @var{script} as the linker script. This option is supported by most
- systems using the GNU linker. On some targets, such as bare-board
- targets without an operating system, the @option{-T} option may be required
- when linking to avoid references to undefined symbols.
- @item -Xlinker @var{option}
- @opindex Xlinker
- Pass @var{option} as an option to the linker. You can use this to
- supply system-specific linker options that GCC does not recognize.
- If you want to pass an option that takes a separate argument, you must use
- @option{-Xlinker} twice, once for the option and once for the argument.
- For example, to pass @option{-assert definitions}, you must write
- @option{-Xlinker -assert -Xlinker definitions}. It does not work to write
- @option{-Xlinker "-assert definitions"}, because this passes the entire
- string as a single argument, which is not what the linker expects.
- When using the GNU linker, it is usually more convenient to pass
- arguments to linker options using the @option{@var{option}=@var{value}}
- syntax than as separate arguments. For example, you can specify
- @option{-Xlinker -Map=output.map} rather than
- @option{-Xlinker -Map -Xlinker output.map}. Other linkers may not support
- this syntax for command-line options.
- @item -Wl,@var{option}
- @opindex Wl
- Pass @var{option} as an option to the linker. If @var{option} contains
- commas, it is split into multiple options at the commas. You can use this
- syntax to pass an argument to the option.
- For example, @option{-Wl,-Map,output.map} passes @option{-Map output.map} to the
- linker. When using the GNU linker, you can also get the same effect with
- @option{-Wl,-Map=output.map}.
- @item -u @var{symbol}
- @opindex u
- Pretend the symbol @var{symbol} is undefined, to force linking of
- library modules to define it. You can use @option{-u} multiple times with
- different symbols to force loading of additional library modules.
- @item -z @var{keyword}
- @opindex z
- @option{-z} is passed directly on to the linker along with the keyword
- @var{keyword}. See the section in the documentation of your linker for
- permitted values and their meanings.
- @end table
- @node Directory Options
- @section Options for Directory Search
- @cindex directory options
- @cindex options, directory search
- @cindex search path
- These options specify directories to search for header files, for
- libraries and for parts of the compiler:
- @table @gcctabopt
- @item -I@var{dir}
- @opindex I
- Add the directory @var{dir} to the head of the list of directories to be
- searched for header files. This can be used to override a system header
- file, substituting your own version, since these directories are
- searched before the system header file directories. However, you should
- not use this option to add directories that contain vendor-supplied
- system header files (use @option{-isystem} for that). If you use more than
- one @option{-I} option, the directories are scanned in left-to-right
- order; the standard system directories come after.
- If a standard system include directory, or a directory specified with
- @option{-isystem}, is also specified with @option{-I}, the @option{-I}
- option is ignored. The directory is still searched but as a
- system directory at its normal position in the system include chain.
- This is to ensure that GCC's procedure to fix buggy system headers and
- the ordering for the @code{include_next} directive are not inadvertently changed.
- If you really need to change the search order for system directories,
- use the @option{-nostdinc} and/or @option{-isystem} options.
- @item -iplugindir=@var{dir}
- @opindex iplugindir=
- Set the directory to search for plugins that are passed
- by @option{-fplugin=@var{name}} instead of
- @option{-fplugin=@var{path}/@var{name}.so}. This option is not meant
- to be used by the user, but only passed by the driver.
- @item -iquote@var{dir}
- @opindex iquote
- Add the directory @var{dir} to the head of the list of directories to
- be searched for header files only for the case of @code{#include
- "@var{file}"}; they are not searched for @code{#include <@var{file}>},
- otherwise just like @option{-I}.
- @item -L@var{dir}
- @opindex L
- Add directory @var{dir} to the list of directories to be searched
- for @option{-l}.
- @item -B@var{prefix}
- @opindex B
- This option specifies where to find the executables, libraries,
- include files, and data files of the compiler itself.
- The compiler driver program runs one or more of the subprograms
- @command{cpp}, @command{cc1}, @command{as} and @command{ld}. It tries
- @var{prefix} as a prefix for each program it tries to run, both with and
- without @samp{@var{machine}/@var{version}/} (@pxref{Target Options}).
- For each subprogram to be run, the compiler driver first tries the
- @option{-B} prefix, if any. If that name is not found, or if @option{-B}
- is not specified, the driver tries two standard prefixes,
- @file{/usr/lib/gcc/} and @file{/usr/local/lib/gcc/}. If neither of
- those results in a file name that is found, the unmodified program
- name is searched for using the directories specified in your
- @env{PATH} environment variable.
- The compiler checks to see if the path provided by @option{-B}
- refers to a directory, and if necessary it adds a directory
- separator character at the end of the path.
- @option{-B} prefixes that effectively specify directory names also apply
- to libraries in the linker, because the compiler translates these
- options into @option{-L} options for the linker. They also apply to
- include files in the preprocessor, because the compiler translates these
- options into @option{-isystem} options for the preprocessor. In this case,
- the compiler appends @samp{include} to the prefix.
- The runtime support file @file{libgcc.a} can also be searched for using
- the @option{-B} prefix, if needed. If it is not found there, the two
- standard prefixes above are tried, and that is all. The file is left
- out of the link if it is not found by those means.
- Another way to specify a prefix much like the @option{-B} prefix is to use
- the environment variable @env{GCC_EXEC_PREFIX}. @xref{Environment
- Variables}.
- As a special kludge, if the path provided by @option{-B} is
- @file{[dir/]stage@var{N}/}, where @var{N} is a number in the range 0 to
- 9, then it is replaced by @file{[dir/]include}. This is to help
- with boot-strapping the compiler.
- @item -specs=@var{file}
- @opindex specs
- Process @var{file} after the compiler reads in the standard @file{specs}
- file, in order to override the defaults which the @command{gcc} driver
- program uses when determining what switches to pass to @command{cc1},
- @command{cc1plus}, @command{as}, @command{ld}, etc. More than one
- @option{-specs=@var{file}} can be specified on the command line, and they
- are processed in order, from left to right.
- @item --sysroot=@var{dir}
- @opindex sysroot
- Use @var{dir} as the logical root directory for headers and libraries.
- For example, if the compiler normally searches for headers in
- @file{/usr/include} and libraries in @file{/usr/lib}, it instead
- searches @file{@var{dir}/usr/include} and @file{@var{dir}/usr/lib}.
- If you use both this option and the @option{-isysroot} option, then
- the @option{--sysroot} option applies to libraries, but the
- @option{-isysroot} option applies to header files.
- The GNU linker (beginning with version 2.16) has the necessary support
- for this option. If your linker does not support this option, the
- header file aspect of @option{--sysroot} still works, but the
- library aspect does not.
- @item --no-sysroot-suffix
- @opindex no-sysroot-suffix
- For some targets, a suffix is added to the root directory specified
- with @option{--sysroot}, depending on the other options used, so that
- headers may for example be found in
- @file{@var{dir}/@var{suffix}/usr/include} instead of
- @file{@var{dir}/usr/include}. This option disables the addition of
- such a suffix.
- @item -I-
- @opindex I-
- This option has been deprecated. Please use @option{-iquote} instead for
- @option{-I} directories before the @option{-I-} and remove the @option{-I-}
- option.
- Any directories you specify with @option{-I} options before the @option{-I-}
- option are searched only for the case of @code{#include "@var{file}"};
- they are not searched for @code{#include <@var{file}>}.
- If additional directories are specified with @option{-I} options after
- the @option{-I-} option, these directories are searched for all @code{#include}
- directives. (Ordinarily @emph{all} @option{-I} directories are used
- this way.)
- In addition, the @option{-I-} option inhibits the use of the current
- directory (where the current input file came from) as the first search
- directory for @code{#include "@var{file}"}. There is no way to
- override this effect of @option{-I-}. With @option{-I.} you can specify
- searching the directory that is current when the compiler is
- invoked. That is not exactly the same as what the preprocessor does
- by default, but it is often satisfactory.
- @option{-I-} does not inhibit the use of the standard system directories
- for header files. Thus, @option{-I-} and @option{-nostdinc} are
- independent.
- @end table
- @c man end
- @node Spec Files
- @section Specifying Subprocesses and the Switches to Pass to Them
- @cindex Spec Files
- @command{gcc} is a driver program. It performs its job by invoking a
- sequence of other programs to do the work of compiling, assembling and
- linking. GCC interprets its command-line parameters and uses these to
- deduce which programs it should invoke, and which command-line options
- it ought to place on their command lines. This behavior is controlled
- by @dfn{spec strings}. In most cases there is one spec string for each
- program that GCC can invoke, but a few programs have multiple spec
- strings to control their behavior. The spec strings built into GCC can
- be overridden by using the @option{-specs=} command-line switch to specify
- a spec file.
- @dfn{Spec files} are plaintext files that are used to construct spec
- strings. They consist of a sequence of directives separated by blank
- lines. The type of directive is determined by the first non-whitespace
- character on the line, which can be one of the following:
- @table @code
- @item %@var{command}
- Issues a @var{command} to the spec file processor. The commands that can
- appear here are:
- @table @code
- @item %include <@var{file}>
- @cindex @code{%include}
- Search for @var{file} and insert its text at the current point in the
- specs file.
- @item %include_noerr <@var{file}>
- @cindex @code{%include_noerr}
- Just like @samp{%include}, but do not generate an error message if the include
- file cannot be found.
- @item %rename @var{old_name} @var{new_name}
- @cindex @code{%rename}
- Rename the spec string @var{old_name} to @var{new_name}.
- @end table
- @item *[@var{spec_name}]:
- This tells the compiler to create, override or delete the named spec
- string. All lines after this directive up to the next directive or
- blank line are considered to be the text for the spec string. If this
- results in an empty string then the spec is deleted. (Or, if the
- spec did not exist, then nothing happens.) Otherwise, if the spec
- does not currently exist a new spec is created. If the spec does
- exist then its contents are overridden by the text of this
- directive, unless the first character of that text is the @samp{+}
- character, in which case the text is appended to the spec.
- @item [@var{suffix}]:
- Creates a new @samp{[@var{suffix}] spec} pair. All lines after this directive
- and up to the next directive or blank line are considered to make up the
- spec string for the indicated suffix. When the compiler encounters an
- input file with the named suffix, it processes the spec string in
- order to work out how to compile that file. For example:
- @smallexample
- .ZZ:
- z-compile -input %i
- @end smallexample
- This says that any input file whose name ends in @samp{.ZZ} should be
- passed to the program @samp{z-compile}, which should be invoked with the
- command-line switch @option{-input} and with the result of performing the
- @samp{%i} substitution. (See below.)
- As an alternative to providing a spec string, the text following a
- suffix directive can be one of the following:
- @table @code
- @item @@@var{language}
- This says that the suffix is an alias for a known @var{language}. This is
- similar to using the @option{-x} command-line switch to GCC to specify a
- language explicitly. For example:
- @smallexample
- .ZZ:
- @@c++
- @end smallexample
- Says that .ZZ files are, in fact, C++ source files.
- @item #@var{name}
- This causes an error messages saying:
- @smallexample
- @var{name} compiler not installed on this system.
- @end smallexample
- @end table
- GCC already has an extensive list of suffixes built into it.
- This directive adds an entry to the end of the list of suffixes, but
- since the list is searched from the end backwards, it is effectively
- possible to override earlier entries using this technique.
- @end table
- GCC has the following spec strings built into it. Spec files can
- override these strings or create their own. Note that individual
- targets can also add their own spec strings to this list.
- @smallexample
- asm Options to pass to the assembler
- asm_final Options to pass to the assembler post-processor
- cpp Options to pass to the C preprocessor
- cc1 Options to pass to the C compiler
- cc1plus Options to pass to the C++ compiler
- endfile Object files to include at the end of the link
- link Options to pass to the linker
- lib Libraries to include on the command line to the linker
- libgcc Decides which GCC support library to pass to the linker
- linker Sets the name of the linker
- predefines Defines to be passed to the C preprocessor
- signed_char Defines to pass to CPP to say whether @code{char} is signed
- by default
- startfile Object files to include at the start of the link
- @end smallexample
- Here is a small example of a spec file:
- @smallexample
- %rename lib old_lib
- *lib:
- --start-group -lgcc -lc -leval1 --end-group %(old_lib)
- @end smallexample
- This example renames the spec called @samp{lib} to @samp{old_lib} and
- then overrides the previous definition of @samp{lib} with a new one.
- The new definition adds in some extra command-line options before
- including the text of the old definition.
- @dfn{Spec strings} are a list of command-line options to be passed to their
- corresponding program. In addition, the spec strings can contain
- @samp{%}-prefixed sequences to substitute variable text or to
- conditionally insert text into the command line. Using these constructs
- it is possible to generate quite complex command lines.
- Here is a table of all defined @samp{%}-sequences for spec
- strings. Note that spaces are not generated automatically around the
- results of expanding these sequences. Therefore you can concatenate them
- together or combine them with constant text in a single argument.
- @table @code
- @item %%
- Substitute one @samp{%} into the program name or argument.
- @item %i
- Substitute the name of the input file being processed.
- @item %b
- Substitute the basename of the input file being processed.
- This is the substring up to (and not including) the last period
- and not including the directory.
- @item %B
- This is the same as @samp{%b}, but include the file suffix (text after
- the last period).
- @item %d
- Marks the argument containing or following the @samp{%d} as a
- temporary file name, so that that file is deleted if GCC exits
- successfully. Unlike @samp{%g}, this contributes no text to the
- argument.
- @item %g@var{suffix}
- Substitute a file name that has suffix @var{suffix} and is chosen
- once per compilation, and mark the argument in the same way as
- @samp{%d}. To reduce exposure to denial-of-service attacks, the file
- name is now chosen in a way that is hard to predict even when previously
- chosen file names are known. For example, @samp{%g.s @dots{} %g.o @dots{} %g.s}
- might turn into @samp{ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s}. @var{suffix} matches
- the regexp @samp{[.A-Za-z]*} or the special string @samp{%O}, which is
- treated exactly as if @samp{%O} had been preprocessed. Previously, @samp{%g}
- was simply substituted with a file name chosen once per compilation,
- without regard to any appended suffix (which was therefore treated
- just like ordinary text), making such attacks more likely to succeed.
- @item %u@var{suffix}
- Like @samp{%g}, but generates a new temporary file name
- each time it appears instead of once per compilation.
- @item %U@var{suffix}
- Substitutes the last file name generated with @samp{%u@var{suffix}}, generating a
- new one if there is no such last file name. In the absence of any
- @samp{%u@var{suffix}}, this is just like @samp{%g@var{suffix}}, except they don't share
- the same suffix @emph{space}, so @samp{%g.s @dots{} %U.s @dots{} %g.s @dots{} %U.s}
- involves the generation of two distinct file names, one
- for each @samp{%g.s} and another for each @samp{%U.s}. Previously, @samp{%U} was
- simply substituted with a file name chosen for the previous @samp{%u},
- without regard to any appended suffix.
- @item %j@var{suffix}
- Substitutes the name of the @code{HOST_BIT_BUCKET}, if any, and if it is
- writable, and if @option{-save-temps} is not used;
- otherwise, substitute the name
- of a temporary file, just like @samp{%u}. This temporary file is not
- meant for communication between processes, but rather as a junk
- disposal mechanism.
- @item %|@var{suffix}
- @itemx %m@var{suffix}
- Like @samp{%g}, except if @option{-pipe} is in effect. In that case
- @samp{%|} substitutes a single dash and @samp{%m} substitutes nothing at
- all. These are the two most common ways to instruct a program that it
- should read from standard input or write to standard output. If you
- need something more elaborate you can use an @samp{%@{pipe:@code{X}@}}
- construct: see for example @file{f/lang-specs.h}.
- @item %.@var{SUFFIX}
- Substitutes @var{.SUFFIX} for the suffixes of a matched switch's args
- when it is subsequently output with @samp{%*}. @var{SUFFIX} is
- terminated by the next space or %.
- @item %w
- Marks the argument containing or following the @samp{%w} as the
- designated output file of this compilation. This puts the argument
- into the sequence of arguments that @samp{%o} substitutes.
- @item %o
- Substitutes the names of all the output files, with spaces
- automatically placed around them. You should write spaces
- around the @samp{%o} as well or the results are undefined.
- @samp{%o} is for use in the specs for running the linker.
- Input files whose names have no recognized suffix are not compiled
- at all, but they are included among the output files, so they are
- linked.
- @item %O
- Substitutes the suffix for object files. Note that this is
- handled specially when it immediately follows @samp{%g, %u, or %U},
- because of the need for those to form complete file names. The
- handling is such that @samp{%O} is treated exactly as if it had already
- been substituted, except that @samp{%g, %u, and %U} do not currently
- support additional @var{suffix} characters following @samp{%O} as they do
- following, for example, @samp{.o}.
- @item %p
- Substitutes the standard macro predefinitions for the
- current target machine. Use this when running @command{cpp}.
- @item %P
- Like @samp{%p}, but puts @samp{__} before and after the name of each
- predefined macro, except for macros that start with @samp{__} or with
- @samp{_@var{L}}, where @var{L} is an uppercase letter. This is for ISO
- C@.
- @item %I
- Substitute any of @option{-iprefix} (made from @env{GCC_EXEC_PREFIX}),
- @option{-isysroot} (made from @env{TARGET_SYSTEM_ROOT}),
- @option{-isystem} (made from @env{COMPILER_PATH} and @option{-B} options)
- and @option{-imultilib} as necessary.
- @item %s
- Current argument is the name of a library or startup file of some sort.
- Search for that file in a standard list of directories and substitute
- the full name found. The current working directory is included in the
- list of directories scanned.
- @item %T
- Current argument is the name of a linker script. Search for that file
- in the current list of directories to scan for libraries. If the file
- is located insert a @option{--script} option into the command line
- followed by the full path name found. If the file is not found then
- generate an error message. Note: the current working directory is not
- searched.
- @item %e@var{str}
- Print @var{str} as an error message. @var{str} is terminated by a newline.
- Use this when inconsistent options are detected.
- @item %(@var{name})
- Substitute the contents of spec string @var{name} at this point.
- @item %x@{@var{option}@}
- Accumulate an option for @samp{%X}.
- @item %X
- Output the accumulated linker options specified by @option{-Wl} or a @samp{%x}
- spec string.
- @item %Y
- Output the accumulated assembler options specified by @option{-Wa}.
- @item %Z
- Output the accumulated preprocessor options specified by @option{-Wp}.
- @item %a
- Process the @code{asm} spec. This is used to compute the
- switches to be passed to the assembler.
- @item %A
- Process the @code{asm_final} spec. This is a spec string for
- passing switches to an assembler post-processor, if such a program is
- needed.
- @item %l
- Process the @code{link} spec. This is the spec for computing the
- command line passed to the linker. Typically it makes use of the
- @samp{%L %G %S %D and %E} sequences.
- @item %D
- Dump out a @option{-L} option for each directory that GCC believes might
- contain startup files. If the target supports multilibs then the
- current multilib directory is prepended to each of these paths.
- @item %L
- Process the @code{lib} spec. This is a spec string for deciding which
- libraries are included on the command line to the linker.
- @item %G
- Process the @code{libgcc} spec. This is a spec string for deciding
- which GCC support library is included on the command line to the linker.
- @item %S
- Process the @code{startfile} spec. This is a spec for deciding which
- object files are the first ones passed to the linker. Typically
- this might be a file named @file{crt0.o}.
- @item %E
- Process the @code{endfile} spec. This is a spec string that specifies
- the last object files that are passed to the linker.
- @item %C
- Process the @code{cpp} spec. This is used to construct the arguments
- to be passed to the C preprocessor.
- @item %1
- Process the @code{cc1} spec. This is used to construct the options to be
- passed to the actual C compiler (@command{cc1}).
- @item %2
- Process the @code{cc1plus} spec. This is used to construct the options to be
- passed to the actual C++ compiler (@command{cc1plus}).
- @item %*
- Substitute the variable part of a matched option. See below.
- Note that each comma in the substituted string is replaced by
- a single space.
- @item %<@code{S}
- Remove all occurrences of @code{-S} from the command line. Note---this
- command is position dependent. @samp{%} commands in the spec string
- before this one see @code{-S}, @samp{%} commands in the spec string
- after this one do not.
- @item %:@var{function}(@var{args})
- Call the named function @var{function}, passing it @var{args}.
- @var{args} is first processed as a nested spec string, then split
- into an argument vector in the usual fashion. The function returns
- a string which is processed as if it had appeared literally as part
- of the current spec.
- The following built-in spec functions are provided:
- @table @code
- @item @code{getenv}
- The @code{getenv} spec function takes two arguments: an environment
- variable name and a string. If the environment variable is not
- defined, a fatal error is issued. Otherwise, the return value is the
- value of the environment variable concatenated with the string. For
- example, if @env{TOPDIR} is defined as @file{/path/to/top}, then:
- @smallexample
- %:getenv(TOPDIR /include)
- @end smallexample
- expands to @file{/path/to/top/include}.
- @item @code{if-exists}
- The @code{if-exists} spec function takes one argument, an absolute
- pathname to a file. If the file exists, @code{if-exists} returns the
- pathname. Here is a small example of its usage:
- @smallexample
- *startfile:
- crt0%O%s %:if-exists(crti%O%s) crtbegin%O%s
- @end smallexample
- @item @code{if-exists-else}
- The @code{if-exists-else} spec function is similar to the @code{if-exists}
- spec function, except that it takes two arguments. The first argument is
- an absolute pathname to a file. If the file exists, @code{if-exists-else}
- returns the pathname. If it does not exist, it returns the second argument.
- This way, @code{if-exists-else} can be used to select one file or another,
- based on the existence of the first. Here is a small example of its usage:
- @smallexample
- *startfile:
- crt0%O%s %:if-exists(crti%O%s) \
- %:if-exists-else(crtbeginT%O%s crtbegin%O%s)
- @end smallexample
- @item @code{replace-outfile}
- The @code{replace-outfile} spec function takes two arguments. It looks for the
- first argument in the outfiles array and replaces it with the second argument. Here
- is a small example of its usage:
- @smallexample
- %@{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)@}
- @end smallexample
- @item @code{remove-outfile}
- The @code{remove-outfile} spec function takes one argument. It looks for the
- first argument in the outfiles array and removes it. Here is a small example
- its usage:
- @smallexample
- %:remove-outfile(-lm)
- @end smallexample
- @item @code{pass-through-libs}
- The @code{pass-through-libs} spec function takes any number of arguments. It
- finds any @option{-l} options and any non-options ending in @file{.a} (which it
- assumes are the names of linker input library archive files) and returns a
- result containing all the found arguments each prepended by
- @option{-plugin-opt=-pass-through=} and joined by spaces. This list is
- intended to be passed to the LTO linker plugin.
- @smallexample
- %:pass-through-libs(%G %L %G)
- @end smallexample
- @item @code{print-asm-header}
- The @code{print-asm-header} function takes no arguments and simply
- prints a banner like:
- @smallexample
- Assembler options
- =================
- Use "-Wa,OPTION" to pass "OPTION" to the assembler.
- @end smallexample
- It is used to separate compiler options from assembler options
- in the @option{--target-help} output.
- @end table
- @item %@{@code{S}@}
- Substitutes the @code{-S} switch, if that switch is given to GCC@.
- If that switch is not specified, this substitutes nothing. Note that
- the leading dash is omitted when specifying this option, and it is
- automatically inserted if the substitution is performed. Thus the spec
- string @samp{%@{foo@}} matches the command-line option @option{-foo}
- and outputs the command-line option @option{-foo}.
- @item %W@{@code{S}@}
- Like %@{@code{S}@} but mark last argument supplied within as a file to be
- deleted on failure.
- @item %@{@code{S}*@}
- Substitutes all the switches specified to GCC whose names start
- with @code{-S}, but which also take an argument. This is used for
- switches like @option{-o}, @option{-D}, @option{-I}, etc.
- GCC considers @option{-o foo} as being
- one switch whose name starts with @samp{o}. %@{o*@} substitutes this
- text, including the space. Thus two arguments are generated.
- @item %@{@code{S}*&@code{T}*@}
- Like %@{@code{S}*@}, but preserve order of @code{S} and @code{T} options
- (the order of @code{S} and @code{T} in the spec is not significant).
- There can be any number of ampersand-separated variables; for each the
- wild card is optional. Useful for CPP as @samp{%@{D*&U*&A*@}}.
- @item %@{@code{S}:@code{X}@}
- Substitutes @code{X}, if the @option{-S} switch is given to GCC@.
- @item %@{!@code{S}:@code{X}@}
- Substitutes @code{X}, if the @option{-S} switch is @emph{not} given to GCC@.
- @item %@{@code{S}*:@code{X}@}
- Substitutes @code{X} if one or more switches whose names start with
- @code{-S} are specified to GCC@. Normally @code{X} is substituted only
- once, no matter how many such switches appeared. However, if @code{%*}
- appears somewhere in @code{X}, then @code{X} is substituted once
- for each matching switch, with the @code{%*} replaced by the part of
- that switch matching the @code{*}.
- If @code{%*} appears as the last part of a spec sequence then a space
- is added after the end of the last substitution. If there is more
- text in the sequence, however, then a space is not generated. This
- allows the @code{%*} substitution to be used as part of a larger
- string. For example, a spec string like this:
- @smallexample
- %@{mcu=*:--script=%*/memory.ld@}
- @end smallexample
- @noindent
- when matching an option like @option{-mcu=newchip} produces:
- @smallexample
- --script=newchip/memory.ld
- @end smallexample
- @item %@{.@code{S}:@code{X}@}
- Substitutes @code{X}, if processing a file with suffix @code{S}.
- @item %@{!.@code{S}:@code{X}@}
- Substitutes @code{X}, if @emph{not} processing a file with suffix @code{S}.
- @item %@{,@code{S}:@code{X}@}
- Substitutes @code{X}, if processing a file for language @code{S}.
- @item %@{!,@code{S}:@code{X}@}
- Substitutes @code{X}, if not processing a file for language @code{S}.
- @item %@{@code{S}|@code{P}:@code{X}@}
- Substitutes @code{X} if either @code{-S} or @code{-P} is given to
- GCC@. This may be combined with @samp{!}, @samp{.}, @samp{,}, and
- @code{*} sequences as well, although they have a stronger binding than
- the @samp{|}. If @code{%*} appears in @code{X}, all of the
- alternatives must be starred, and only the first matching alternative
- is substituted.
- For example, a spec string like this:
- @smallexample
- %@{.c:-foo@} %@{!.c:-bar@} %@{.c|d:-baz@} %@{!.c|d:-boggle@}
- @end smallexample
- @noindent
- outputs the following command-line options from the following input
- command-line options:
- @smallexample
- fred.c -foo -baz
- jim.d -bar -boggle
- -d fred.c -foo -baz -boggle
- -d jim.d -bar -baz -boggle
- @end smallexample
- @item %@{S:X; T:Y; :D@}
- If @code{S} is given to GCC, substitutes @code{X}; else if @code{T} is
- given to GCC, substitutes @code{Y}; else substitutes @code{D}. There can
- be as many clauses as you need. This may be combined with @code{.},
- @code{,}, @code{!}, @code{|}, and @code{*} as needed.
- @end table
- The conditional text @code{X} in a %@{@code{S}:@code{X}@} or similar
- construct may contain other nested @samp{%} constructs or spaces, or
- even newlines. They are processed as usual, as described above.
- Trailing white space in @code{X} is ignored. White space may also
- appear anywhere on the left side of the colon in these constructs,
- except between @code{.} or @code{*} and the corresponding word.
- The @option{-O}, @option{-f}, @option{-m}, and @option{-W} switches are
- handled specifically in these constructs. If another value of
- @option{-O} or the negated form of a @option{-f}, @option{-m}, or
- @option{-W} switch is found later in the command line, the earlier
- switch value is ignored, except with @{@code{S}*@} where @code{S} is
- just one letter, which passes all matching options.
- The character @samp{|} at the beginning of the predicate text is used to
- indicate that a command should be piped to the following command, but
- only if @option{-pipe} is specified.
- It is built into GCC which switches take arguments and which do not.
- (You might think it would be useful to generalize this to allow each
- compiler's spec to say which switches take arguments. But this cannot
- be done in a consistent fashion. GCC cannot even decide which input
- files have been specified without knowing which switches take arguments,
- and it must know which input files to compile in order to tell which
- compilers to run).
- GCC also knows implicitly that arguments starting in @option{-l} are to be
- treated as compiler output files, and passed to the linker in their
- proper position among the other output files.
- @c man begin OPTIONS
- @node Target Options
- @section Specifying Target Machine and Compiler Version
- @cindex target options
- @cindex cross compiling
- @cindex specifying machine version
- @cindex specifying compiler version and target machine
- @cindex compiler version, specifying
- @cindex target machine, specifying
- The usual way to run GCC is to run the executable called @command{gcc}, or
- @command{@var{machine}-gcc} when cross-compiling, or
- @command{@var{machine}-gcc-@var{version}} to run a version other than the
- one that was installed last.
- @node Submodel Options
- @section Hardware Models and Configurations
- @cindex submodel options
- @cindex specifying hardware config
- @cindex hardware models and configurations, specifying
- @cindex machine dependent options
- Each target machine types can have its own
- special options, starting with @samp{-m}, to choose among various
- hardware models or configurations---for example, 68010 vs 68020,
- floating coprocessor or none. A single installed version of the
- compiler can compile for any model or configuration, according to the
- options specified.
- Some configurations of the compiler also support additional special
- options, usually for compatibility with other compilers on the same
- platform.
- @c This list is ordered alphanumerically by subsection name.
- @c It should be the same order and spelling as these options are listed
- @c in Machine Dependent Options
- @menu
- * AArch64 Options::
- * Adapteva Epiphany Options::
- * ARC Options::
- * ARM Options::
- * AVR Options::
- * Blackfin Options::
- * C6X Options::
- * CRIS Options::
- * CR16 Options::
- * Darwin Options::
- * DEC Alpha Options::
- * FR30 Options::
- * FRV Options::
- * GNU/Linux Options::
- * H8/300 Options::
- * HPPA Options::
- * IA-64 Options::
- * LM32 Options::
- * M32C Options::
- * M32R/D Options::
- * M680x0 Options::
- * MCore Options::
- * MeP Options::
- * MicroBlaze Options::
- * MIPS Options::
- * MMIX Options::
- * MN10300 Options::
- * Moxie Options::
- * MSP430 Options::
- * NDS32 Options::
- * Nios II Options::
- * Nvidia PTX Options::
- * PDP-11 Options::
- * picoChip Options::
- * PowerPC Options::
- * RL78 Options::
- * RS/6000 and PowerPC Options::
- * RX Options::
- * S/390 and zSeries Options::
- * Score Options::
- * SH Options::
- * Solaris 2 Options::
- * SPARC Options::
- * SPU Options::
- * System V Options::
- * TILE-Gx Options::
- * TILEPro Options::
- * V850 Options::
- * VAX Options::
- * Visium Options::
- * VMS Options::
- * VxWorks Options::
- * x86 Options::
- * x86 Windows Options::
- * Xstormy16 Options::
- * Xtensa Options::
- * zSeries Options::
- @end menu
- @node AArch64 Options
- @subsection AArch64 Options
- @cindex AArch64 Options
- These options are defined for AArch64 implementations:
- @table @gcctabopt
- @item -mabi=@var{name}
- @opindex mabi
- Generate code for the specified data model. Permissible values
- are @samp{ilp32} for SysV-like data model where int, long int and pointer
- are 32-bit, and @samp{lp64} for SysV-like data model where int is 32-bit,
- but long int and pointer are 64-bit.
- The default depends on the specific target configuration. Note that
- the LP64 and ILP32 ABIs are not link-compatible; you must compile your
- entire program with the same ABI, and link with a compatible set of libraries.
- @item -mbig-endian
- @opindex mbig-endian
- Generate big-endian code. This is the default when GCC is configured for an
- @samp{aarch64_be-*-*} target.
- @item -mgeneral-regs-only
- @opindex mgeneral-regs-only
- Generate code which uses only the general registers.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate little-endian code. This is the default when GCC is configured for an
- @samp{aarch64-*-*} but not an @samp{aarch64_be-*-*} target.
- @item -mcmodel=tiny
- @opindex mcmodel=tiny
- Generate code for the tiny code model. The program and its statically defined
- symbols must be within 1GB of each other. Pointers are 64 bits. Programs can
- be statically or dynamically linked. This model is not fully implemented and
- mostly treated as @samp{small}.
- @item -mcmodel=small
- @opindex mcmodel=small
- Generate code for the small code model. The program and its statically defined
- symbols must be within 4GB of each other. Pointers are 64 bits. Programs can
- be statically or dynamically linked. This is the default code model.
- @item -mcmodel=large
- @opindex mcmodel=large
- Generate code for the large code model. This makes no assumptions about
- addresses and sizes of sections. Pointers are 64 bits. Programs can be
- statically linked only.
- @item -mstrict-align
- @opindex mstrict-align
- Do not assume that unaligned memory references are handled by the system.
- @item -momit-leaf-frame-pointer
- @itemx -mno-omit-leaf-frame-pointer
- @opindex momit-leaf-frame-pointer
- @opindex mno-omit-leaf-frame-pointer
- Omit or keep the frame pointer in leaf functions. The former behaviour is the
- default.
- @item -mtls-dialect=desc
- @opindex mtls-dialect=desc
- Use TLS descriptors as the thread-local storage mechanism for dynamic accesses
- of TLS variables. This is the default.
- @item -mtls-dialect=traditional
- @opindex mtls-dialect=traditional
- Use traditional TLS as the thread-local storage mechanism for dynamic accesses
- of TLS variables.
- @item -mfix-cortex-a53-835769
- @itemx -mno-fix-cortex-a53-835769
- @opindex mfix-cortex-a53-835769
- @opindex mno-fix-cortex-a53-835769
- Enable or disable the workaround for the ARM Cortex-A53 erratum number 835769.
- This involves inserting a NOP instruction between memory instructions and
- 64-bit integer multiply-accumulate instructions.
- @item -mfix-cortex-a53-843419
- @itemx -mno-fix-cortex-a53-843419
- @opindex mfix-cortex-a53-843419
- @opindex mno-fix-cortex-a53-843419
- Enable or disable the workaround for the ARM Cortex-A53 erratum number 843419.
- This erratum workaround is made at link time and this will only pass the
- corresponding flag to the linker.
- @item -march=@var{name}
- @opindex march
- Specify the name of the target architecture, optionally suffixed by one or
- more feature modifiers. This option has the form
- @option{-march=@var{arch}@r{@{}+@r{[}no@r{]}@var{feature}@r{@}*}}, where the
- only permissible value for @var{arch} is @samp{armv8-a}. The permissible
- values for @var{feature} are documented in the sub-section below.
- Where conflicting feature modifiers are specified, the right-most feature is
- used.
- GCC uses this name to determine what kind of instructions it can emit when
- generating assembly code.
- Where @option{-march} is specified without either of @option{-mtune}
- or @option{-mcpu} also being specified, the code is tuned to perform
- well across a range of target processors implementing the target
- architecture.
- @item -mtune=@var{name}
- @opindex mtune
- Specify the name of the target processor for which GCC should tune the
- performance of the code. Permissible values for this option are:
- @samp{generic}, @samp{cortex-a53}, @samp{cortex-a57}, @samp{cortex-a72},
- @samp{exynos-m1}, @samp{thunderx}, @samp{xgene1}.
- Additionally, this option can specify that GCC should tune the performance
- of the code for a big.LITTLE system. Permissible values for this
- option are: @samp{cortex-a57.cortex-a53}, @samp{cortex-a72.cortex-a53}.
- Where none of @option{-mtune=}, @option{-mcpu=} or @option{-march=}
- are specified, the code is tuned to perform well across a range
- of target processors.
- This option cannot be suffixed by feature modifiers.
- @item -mcpu=@var{name}
- @opindex mcpu
- Specify the name of the target processor, optionally suffixed by one or more
- feature modifiers. This option has the form
- @option{-mcpu=@var{cpu}@r{@{}+@r{[}no@r{]}@var{feature}@r{@}*}}, where the
- permissible values for @var{cpu} are the same as those available for
- @option{-mtune}.
- The permissible values for @var{feature} are documented in the sub-section
- below.
- Where conflicting feature modifiers are specified, the right-most feature is
- used.
- GCC uses this name to determine what kind of instructions it can emit when
- generating assembly code (as if by @option{-march}) and to determine
- the target processor for which to tune for performance (as if
- by @option{-mtune}). Where this option is used in conjunction
- with @option{-march} or @option{-mtune}, those options take precedence
- over the appropriate part of this option.
- @end table
- @subsubsection @option{-march} and @option{-mcpu} Feature Modifiers
- @cindex @option{-march} feature modifiers
- @cindex @option{-mcpu} feature modifiers
- Feature modifiers used with @option{-march} and @option{-mcpu} can be one
- the following:
- @table @samp
- @item crc
- Enable CRC extension.
- @item crypto
- Enable Crypto extension. This implies Advanced SIMD is enabled.
- @item fp
- Enable floating-point instructions.
- @item simd
- Enable Advanced SIMD instructions. This implies floating-point instructions
- are enabled. This is the default for all current possible values for options
- @option{-march} and @option{-mcpu=}.
- @end table
- @node Adapteva Epiphany Options
- @subsection Adapteva Epiphany Options
- These @samp{-m} options are defined for Adapteva Epiphany:
- @table @gcctabopt
- @item -mhalf-reg-file
- @opindex mhalf-reg-file
- Don't allocate any register in the range @code{r32}@dots{}@code{r63}.
- That allows code to run on hardware variants that lack these registers.
- @item -mprefer-short-insn-regs
- @opindex mprefer-short-insn-regs
- Preferrentially allocate registers that allow short instruction generation.
- This can result in increased instruction count, so this may either reduce or
- increase overall code size.
- @item -mbranch-cost=@var{num}
- @opindex mbranch-cost
- Set the cost of branches to roughly @var{num} ``simple'' instructions.
- This cost is only a heuristic and is not guaranteed to produce
- consistent results across releases.
- @item -mcmove
- @opindex mcmove
- Enable the generation of conditional moves.
- @item -mnops=@var{num}
- @opindex mnops
- Emit @var{num} NOPs before every other generated instruction.
- @item -mno-soft-cmpsf
- @opindex mno-soft-cmpsf
- For single-precision floating-point comparisons, emit an @code{fsub} instruction
- and test the flags. This is faster than a software comparison, but can
- get incorrect results in the presence of NaNs, or when two different small
- numbers are compared such that their difference is calculated as zero.
- The default is @option{-msoft-cmpsf}, which uses slower, but IEEE-compliant,
- software comparisons.
- @item -mstack-offset=@var{num}
- @opindex mstack-offset
- Set the offset between the top of the stack and the stack pointer.
- E.g., a value of 8 means that the eight bytes in the range @code{sp+0@dots{}sp+7}
- can be used by leaf functions without stack allocation.
- Values other than @samp{8} or @samp{16} are untested and unlikely to work.
- Note also that this option changes the ABI; compiling a program with a
- different stack offset than the libraries have been compiled with
- generally does not work.
- This option can be useful if you want to evaluate if a different stack
- offset would give you better code, but to actually use a different stack
- offset to build working programs, it is recommended to configure the
- toolchain with the appropriate @option{--with-stack-offset=@var{num}} option.
- @item -mno-round-nearest
- @opindex mno-round-nearest
- Make the scheduler assume that the rounding mode has been set to
- truncating. The default is @option{-mround-nearest}.
- @item -mlong-calls
- @opindex mlong-calls
- If not otherwise specified by an attribute, assume all calls might be beyond
- the offset range of the @code{b} / @code{bl} instructions, and therefore load the
- function address into a register before performing a (otherwise direct) call.
- This is the default.
- @item -mshort-calls
- @opindex short-calls
- If not otherwise specified by an attribute, assume all direct calls are
- in the range of the @code{b} / @code{bl} instructions, so use these instructions
- for direct calls. The default is @option{-mlong-calls}.
- @item -msmall16
- @opindex msmall16
- Assume addresses can be loaded as 16-bit unsigned values. This does not
- apply to function addresses for which @option{-mlong-calls} semantics
- are in effect.
- @item -mfp-mode=@var{mode}
- @opindex mfp-mode
- Set the prevailing mode of the floating-point unit.
- This determines the floating-point mode that is provided and expected
- at function call and return time. Making this mode match the mode you
- predominantly need at function start can make your programs smaller and
- faster by avoiding unnecessary mode switches.
- @var{mode} can be set to one the following values:
- @table @samp
- @item caller
- Any mode at function entry is valid, and retained or restored when
- the function returns, and when it calls other functions.
- This mode is useful for compiling libraries or other compilation units
- you might want to incorporate into different programs with different
- prevailing FPU modes, and the convenience of being able to use a single
- object file outweighs the size and speed overhead for any extra
- mode switching that might be needed, compared with what would be needed
- with a more specific choice of prevailing FPU mode.
- @item truncate
- This is the mode used for floating-point calculations with
- truncating (i.e.@: round towards zero) rounding mode. That includes
- conversion from floating point to integer.
- @item round-nearest
- This is the mode used for floating-point calculations with
- round-to-nearest-or-even rounding mode.
- @item int
- This is the mode used to perform integer calculations in the FPU, e.g.@:
- integer multiply, or integer multiply-and-accumulate.
- @end table
- The default is @option{-mfp-mode=caller}
- @item -mnosplit-lohi
- @itemx -mno-postinc
- @itemx -mno-postmodify
- @opindex mnosplit-lohi
- @opindex mno-postinc
- @opindex mno-postmodify
- Code generation tweaks that disable, respectively, splitting of 32-bit
- loads, generation of post-increment addresses, and generation of
- post-modify addresses. The defaults are @option{msplit-lohi},
- @option{-mpost-inc}, and @option{-mpost-modify}.
- @item -mnovect-double
- @opindex mno-vect-double
- Change the preferred SIMD mode to SImode. The default is
- @option{-mvect-double}, which uses DImode as preferred SIMD mode.
- @item -max-vect-align=@var{num}
- @opindex max-vect-align
- The maximum alignment for SIMD vector mode types.
- @var{num} may be 4 or 8. The default is 8.
- Note that this is an ABI change, even though many library function
- interfaces are unaffected if they don't use SIMD vector modes
- in places that affect size and/or alignment of relevant types.
- @item -msplit-vecmove-early
- @opindex msplit-vecmove-early
- Split vector moves into single word moves before reload. In theory this
- can give better register allocation, but so far the reverse seems to be
- generally the case.
- @item -m1reg-@var{reg}
- @opindex m1reg-
- Specify a register to hold the constant @minus{}1, which makes loading small negative
- constants and certain bitmasks faster.
- Allowable values for @var{reg} are @samp{r43} and @samp{r63},
- which specify use of that register as a fixed register,
- and @samp{none}, which means that no register is used for this
- purpose. The default is @option{-m1reg-none}.
- @end table
- @node ARC Options
- @subsection ARC Options
- @cindex ARC options
- The following options control the architecture variant for which code
- is being compiled:
- @c architecture variants
- @table @gcctabopt
- @item -mbarrel-shifter
- @opindex mbarrel-shifter
- Generate instructions supported by barrel shifter. This is the default
- unless @option{-mcpu=ARC601} is in effect.
- @item -mcpu=@var{cpu}
- @opindex mcpu
- Set architecture type, register usage, and instruction scheduling
- parameters for @var{cpu}. There are also shortcut alias options
- available for backward compatibility and convenience. Supported
- values for @var{cpu} are
- @table @samp
- @opindex mA6
- @opindex mARC600
- @item ARC600
- Compile for ARC600. Aliases: @option{-mA6}, @option{-mARC600}.
- @item ARC601
- @opindex mARC601
- Compile for ARC601. Alias: @option{-mARC601}.
- @item ARC700
- @opindex mA7
- @opindex mARC700
- Compile for ARC700. Aliases: @option{-mA7}, @option{-mARC700}.
- This is the default when configured with @option{--with-cpu=arc700}@.
- @end table
- @item -mdpfp
- @opindex mdpfp
- @itemx -mdpfp-compact
- @opindex mdpfp-compact
- FPX: Generate Double Precision FPX instructions, tuned for the compact
- implementation.
- @item -mdpfp-fast
- @opindex mdpfp-fast
- FPX: Generate Double Precision FPX instructions, tuned for the fast
- implementation.
- @item -mno-dpfp-lrsr
- @opindex mno-dpfp-lrsr
- Disable LR and SR instructions from using FPX extension aux registers.
- @item -mea
- @opindex mea
- Generate Extended arithmetic instructions. Currently only
- @code{divaw}, @code{adds}, @code{subs}, and @code{sat16} are
- supported. This is always enabled for @option{-mcpu=ARC700}.
- @item -mno-mpy
- @opindex mno-mpy
- Do not generate mpy instructions for ARC700.
- @item -mmul32x16
- @opindex mmul32x16
- Generate 32x16 bit multiply and mac instructions.
- @item -mmul64
- @opindex mmul64
- Generate mul64 and mulu64 instructions. Only valid for @option{-mcpu=ARC600}.
- @item -mnorm
- @opindex mnorm
- Generate norm instruction. This is the default if @option{-mcpu=ARC700}
- is in effect.
- @item -mspfp
- @opindex mspfp
- @itemx -mspfp-compact
- @opindex mspfp-compact
- FPX: Generate Single Precision FPX instructions, tuned for the compact
- implementation.
- @item -mspfp-fast
- @opindex mspfp-fast
- FPX: Generate Single Precision FPX instructions, tuned for the fast
- implementation.
- @item -msimd
- @opindex msimd
- Enable generation of ARC SIMD instructions via target-specific
- builtins. Only valid for @option{-mcpu=ARC700}.
- @item -msoft-float
- @opindex msoft-float
- This option ignored; it is provided for compatibility purposes only.
- Software floating point code is emitted by default, and this default
- can overridden by FPX options; @samp{mspfp}, @samp{mspfp-compact}, or
- @samp{mspfp-fast} for single precision, and @samp{mdpfp},
- @samp{mdpfp-compact}, or @samp{mdpfp-fast} for double precision.
- @item -mswap
- @opindex mswap
- Generate swap instructions.
- @end table
- The following options are passed through to the assembler, and also
- define preprocessor macro symbols.
- @c Flags used by the assembler, but for which we define preprocessor
- @c macro symbols as well.
- @table @gcctabopt
- @item -mdsp-packa
- @opindex mdsp-packa
- Passed down to the assembler to enable the DSP Pack A extensions.
- Also sets the preprocessor symbol @code{__Xdsp_packa}.
- @item -mdvbf
- @opindex mdvbf
- Passed down to the assembler to enable the dual viterbi butterfly
- extension. Also sets the preprocessor symbol @code{__Xdvbf}.
- @c ARC700 4.10 extension instruction
- @item -mlock
- @opindex mlock
- Passed down to the assembler to enable the Locked Load/Store
- Conditional extension. Also sets the preprocessor symbol
- @code{__Xlock}.
- @item -mmac-d16
- @opindex mmac-d16
- Passed down to the assembler. Also sets the preprocessor symbol
- @code{__Xxmac_d16}.
- @item -mmac-24
- @opindex mmac-24
- Passed down to the assembler. Also sets the preprocessor symbol
- @code{__Xxmac_24}.
- @c ARC700 4.10 extension instruction
- @item -mrtsc
- @opindex mrtsc
- Passed down to the assembler to enable the 64-bit Time-Stamp Counter
- extension instruction. Also sets the preprocessor symbol
- @code{__Xrtsc}.
- @c ARC700 4.10 extension instruction
- @item -mswape
- @opindex mswape
- Passed down to the assembler to enable the swap byte ordering
- extension instruction. Also sets the preprocessor symbol
- @code{__Xswape}.
- @item -mtelephony
- @opindex mtelephony
- Passed down to the assembler to enable dual and single operand
- instructions for telephony. Also sets the preprocessor symbol
- @code{__Xtelephony}.
- @item -mxy
- @opindex mxy
- Passed down to the assembler to enable the XY Memory extension. Also
- sets the preprocessor symbol @code{__Xxy}.
- @end table
- The following options control how the assembly code is annotated:
- @c Assembly annotation options
- @table @gcctabopt
- @item -misize
- @opindex misize
- Annotate assembler instructions with estimated addresses.
- @item -mannotate-align
- @opindex mannotate-align
- Explain what alignment considerations lead to the decision to make an
- instruction short or long.
- @end table
- The following options are passed through to the linker:
- @c options passed through to the linker
- @table @gcctabopt
- @item -marclinux
- @opindex marclinux
- Passed through to the linker, to specify use of the @code{arclinux} emulation.
- This option is enabled by default in tool chains built for
- @w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}} targets
- when profiling is not requested.
- @item -marclinux_prof
- @opindex marclinux_prof
- Passed through to the linker, to specify use of the
- @code{arclinux_prof} emulation. This option is enabled by default in
- tool chains built for @w{@code{arc-linux-uclibc}} and
- @w{@code{arceb-linux-uclibc}} targets when profiling is requested.
- @end table
- The following options control the semantics of generated code:
- @c semantically relevant code generation options
- @table @gcctabopt
- @item -mepilogue-cfi
- @opindex mepilogue-cfi
- Enable generation of call frame information for epilogues.
- @item -mno-epilogue-cfi
- @opindex mno-epilogue-cfi
- Disable generation of call frame information for epilogues.
- @item -mlong-calls
- @opindex mlong-calls
- Generate call insns as register indirect calls, thus providing access
- to the full 32-bit address range.
- @item -mmedium-calls
- @opindex mmedium-calls
- Don't use less than 25 bit addressing range for calls, which is the
- offset available for an unconditional branch-and-link
- instruction. Conditional execution of function calls is suppressed, to
- allow use of the 25-bit range, rather than the 21-bit range with
- conditional branch-and-link. This is the default for tool chains built
- for @w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}} targets.
- @item -mno-sdata
- @opindex mno-sdata
- Do not generate sdata references. This is the default for tool chains
- built for @w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}}
- targets.
- @item -mucb-mcount
- @opindex mucb-mcount
- Instrument with mcount calls as used in UCB code. I.e. do the
- counting in the callee, not the caller. By default ARC instrumentation
- counts in the caller.
- @item -mvolatile-cache
- @opindex mvolatile-cache
- Use ordinarily cached memory accesses for volatile references. This is the
- default.
- @item -mno-volatile-cache
- @opindex mno-volatile-cache
- Enable cache bypass for volatile references.
- @end table
- The following options fine tune code generation:
- @c code generation tuning options
- @table @gcctabopt
- @item -malign-call
- @opindex malign-call
- Do alignment optimizations for call instructions.
- @item -mauto-modify-reg
- @opindex mauto-modify-reg
- Enable the use of pre/post modify with register displacement.
- @item -mbbit-peephole
- @opindex mbbit-peephole
- Enable bbit peephole2.
- @item -mno-brcc
- @opindex mno-brcc
- This option disables a target-specific pass in @file{arc_reorg} to
- generate @code{BRcc} instructions. It has no effect on @code{BRcc}
- generation driven by the combiner pass.
- @item -mcase-vector-pcrel
- @opindex mcase-vector-pcrel
- Use pc-relative switch case tables - this enables case table shortening.
- This is the default for @option{-Os}.
- @item -mcompact-casesi
- @opindex mcompact-casesi
- Enable compact casesi pattern.
- This is the default for @option{-Os}.
- @item -mno-cond-exec
- @opindex mno-cond-exec
- Disable ARCompact specific pass to generate conditional execution instructions.
- Due to delay slot scheduling and interactions between operand numbers,
- literal sizes, instruction lengths, and the support for conditional execution,
- the target-independent pass to generate conditional execution is often lacking,
- so the ARC port has kept a special pass around that tries to find more
- conditional execution generating opportunities after register allocation,
- branch shortening, and delay slot scheduling have been done. This pass
- generally, but not always, improves performance and code size, at the cost of
- extra compilation time, which is why there is an option to switch it off.
- If you have a problem with call instructions exceeding their allowable
- offset range because they are conditionalized, you should consider using
- @option{-mmedium-calls} instead.
- @item -mearly-cbranchsi
- @opindex mearly-cbranchsi
- Enable pre-reload use of the cbranchsi pattern.
- @item -mexpand-adddi
- @opindex mexpand-adddi
- Expand @code{adddi3} and @code{subdi3} at rtl generation time into
- @code{add.f}, @code{adc} etc.
- @item -mindexed-loads
- @opindex mindexed-loads
- Enable the use of indexed loads. This can be problematic because some
- optimizers then assume that indexed stores exist, which is not
- the case.
- @item -mlra
- @opindex mlra
- Enable Local Register Allocation. This is still experimental for ARC,
- so by default the compiler uses standard reload
- (i.e. @option{-mno-lra}).
- @item -mlra-priority-none
- @opindex mlra-priority-none
- Don't indicate any priority for target registers.
- @item -mlra-priority-compact
- @opindex mlra-priority-compact
- Indicate target register priority for r0..r3 / r12..r15.
- @item -mlra-priority-noncompact
- @opindex mlra-priority-noncompact
- Reduce target regsiter priority for r0..r3 / r12..r15.
- @item -mno-millicode
- @opindex mno-millicode
- When optimizing for size (using @option{-Os}), prologues and epilogues
- that have to save or restore a large number of registers are often
- shortened by using call to a special function in libgcc; this is
- referred to as a @emph{millicode} call. As these calls can pose
- performance issues, and/or cause linking issues when linking in a
- nonstandard way, this option is provided to turn off millicode call
- generation.
- @item -mmixed-code
- @opindex mmixed-code
- Tweak register allocation to help 16-bit instruction generation.
- This generally has the effect of decreasing the average instruction size
- while increasing the instruction count.
- @item -mq-class
- @opindex mq-class
- Enable 'q' instruction alternatives.
- This is the default for @option{-Os}.
- @item -mRcq
- @opindex mRcq
- Enable Rcq constraint handling - most short code generation depends on this.
- This is the default.
- @item -mRcw
- @opindex mRcw
- Enable Rcw constraint handling - ccfsm condexec mostly depends on this.
- This is the default.
- @item -msize-level=@var{level}
- @opindex msize-level
- Fine-tune size optimization with regards to instruction lengths and alignment.
- The recognized values for @var{level} are:
- @table @samp
- @item 0
- No size optimization. This level is deprecated and treated like @samp{1}.
- @item 1
- Short instructions are used opportunistically.
- @item 2
- In addition, alignment of loops and of code after barriers are dropped.
- @item 3
- In addition, optional data alignment is dropped, and the option @option{Os} is enabled.
- @end table
- This defaults to @samp{3} when @option{-Os} is in effect. Otherwise,
- the behavior when this is not set is equivalent to level @samp{1}.
- @item -mtune=@var{cpu}
- @opindex mtune
- Set instruction scheduling parameters for @var{cpu}, overriding any implied
- by @option{-mcpu=}.
- Supported values for @var{cpu} are
- @table @samp
- @item ARC600
- Tune for ARC600 cpu.
- @item ARC601
- Tune for ARC601 cpu.
- @item ARC700
- Tune for ARC700 cpu with standard multiplier block.
- @item ARC700-xmac
- Tune for ARC700 cpu with XMAC block.
- @item ARC725D
- Tune for ARC725D cpu.
- @item ARC750D
- Tune for ARC750D cpu.
- @end table
- @item -mmultcost=@var{num}
- @opindex mmultcost
- Cost to assume for a multiply instruction, with @samp{4} being equal to a
- normal instruction.
- @item -munalign-prob-threshold=@var{probability}
- @opindex munalign-prob-threshold
- Set probability threshold for unaligning branches.
- When tuning for @samp{ARC700} and optimizing for speed, branches without
- filled delay slot are preferably emitted unaligned and long, unless
- profiling indicates that the probability for the branch to be taken
- is below @var{probability}. @xref{Cross-profiling}.
- The default is (REG_BR_PROB_BASE/2), i.e.@: 5000.
- @end table
- The following options are maintained for backward compatibility, but
- are now deprecated and will be removed in a future release:
- @c Deprecated options
- @table @gcctabopt
- @item -margonaut
- @opindex margonaut
- Obsolete FPX.
- @item -mbig-endian
- @opindex mbig-endian
- @itemx -EB
- @opindex EB
- Compile code for big endian targets. Use of these options is now
- deprecated. Users wanting big-endian code, should use the
- @w{@code{arceb-elf32}} and @w{@code{arceb-linux-uclibc}} targets when
- building the tool chain, for which big-endian is the default.
- @item -mlittle-endian
- @opindex mlittle-endian
- @itemx -EL
- @opindex EL
- Compile code for little endian targets. Use of these options is now
- deprecated. Users wanting little-endian code should use the
- @w{@code{arc-elf32}} and @w{@code{arc-linux-uclibc}} targets when
- building the tool chain, for which little-endian is the default.
- @item -mbarrel_shifter
- @opindex mbarrel_shifter
- Replaced by @option{-mbarrel-shifter}.
- @item -mdpfp_compact
- @opindex mdpfp_compact
- Replaced by @option{-mdpfp-compact}.
- @item -mdpfp_fast
- @opindex mdpfp_fast
- Replaced by @option{-mdpfp-fast}.
- @item -mdsp_packa
- @opindex mdsp_packa
- Replaced by @option{-mdsp-packa}.
- @item -mEA
- @opindex mEA
- Replaced by @option{-mea}.
- @item -mmac_24
- @opindex mmac_24
- Replaced by @option{-mmac-24}.
- @item -mmac_d16
- @opindex mmac_d16
- Replaced by @option{-mmac-d16}.
- @item -mspfp_compact
- @opindex mspfp_compact
- Replaced by @option{-mspfp-compact}.
- @item -mspfp_fast
- @opindex mspfp_fast
- Replaced by @option{-mspfp-fast}.
- @item -mtune=@var{cpu}
- @opindex mtune
- Values @samp{arc600}, @samp{arc601}, @samp{arc700} and
- @samp{arc700-xmac} for @var{cpu} are replaced by @samp{ARC600},
- @samp{ARC601}, @samp{ARC700} and @samp{ARC700-xmac} respectively
- @item -multcost=@var{num}
- @opindex multcost
- Replaced by @option{-mmultcost}.
- @end table
- @node ARM Options
- @subsection ARM Options
- @cindex ARM options
- These @samp{-m} options are defined for the ARM port:
- @table @gcctabopt
- @item -mabi=@var{name}
- @opindex mabi
- Generate code for the specified ABI@. Permissible values are: @samp{apcs-gnu},
- @samp{atpcs}, @samp{aapcs}, @samp{aapcs-linux} and @samp{iwmmxt}.
- @item -mapcs-frame
- @opindex mapcs-frame
- Generate a stack frame that is compliant with the ARM Procedure Call
- Standard for all functions, even if this is not strictly necessary for
- correct execution of the code. Specifying @option{-fomit-frame-pointer}
- with this option causes the stack frames not to be generated for
- leaf functions. The default is @option{-mno-apcs-frame}.
- This option is deprecated.
- @item -mapcs
- @opindex mapcs
- This is a synonym for @option{-mapcs-frame} and is deprecated.
- @ignore
- @c not currently implemented
- @item -mapcs-stack-check
- @opindex mapcs-stack-check
- Generate code to check the amount of stack space available upon entry to
- every function (that actually uses some stack space). If there is
- insufficient space available then either the function
- @code{__rt_stkovf_split_small} or @code{__rt_stkovf_split_big} is
- called, depending upon the amount of stack space required. The runtime
- system is required to provide these functions. The default is
- @option{-mno-apcs-stack-check}, since this produces smaller code.
- @c not currently implemented
- @item -mapcs-float
- @opindex mapcs-float
- Pass floating-point arguments using the floating-point registers. This is
- one of the variants of the APCS@. This option is recommended if the
- target hardware has a floating-point unit or if a lot of floating-point
- arithmetic is going to be performed by the code. The default is
- @option{-mno-apcs-float}, since the size of integer-only code is
- slightly increased if @option{-mapcs-float} is used.
- @c not currently implemented
- @item -mapcs-reentrant
- @opindex mapcs-reentrant
- Generate reentrant, position-independent code. The default is
- @option{-mno-apcs-reentrant}.
- @end ignore
- @item -mthumb-interwork
- @opindex mthumb-interwork
- Generate code that supports calling between the ARM and Thumb
- instruction sets. Without this option, on pre-v5 architectures, the
- two instruction sets cannot be reliably used inside one program. The
- default is @option{-mno-thumb-interwork}, since slightly larger code
- is generated when @option{-mthumb-interwork} is specified. In AAPCS
- configurations this option is meaningless.
- @item -mno-sched-prolog
- @opindex mno-sched-prolog
- Prevent the reordering of instructions in the function prologue, or the
- merging of those instruction with the instructions in the function's
- body. This means that all functions start with a recognizable set
- of instructions (or in fact one of a choice from a small set of
- different function prologues), and this information can be used to
- locate the start of functions inside an executable piece of code. The
- default is @option{-msched-prolog}.
- @item -mfloat-abi=@var{name}
- @opindex mfloat-abi
- Specifies which floating-point ABI to use. Permissible values
- are: @samp{soft}, @samp{softfp} and @samp{hard}.
- Specifying @samp{soft} causes GCC to generate output containing
- library calls for floating-point operations.
- @samp{softfp} allows the generation of code using hardware floating-point
- instructions, but still uses the soft-float calling conventions.
- @samp{hard} allows generation of floating-point instructions
- and uses FPU-specific calling conventions.
- The default depends on the specific target configuration. Note that
- the hard-float and soft-float ABIs are not link-compatible; you must
- compile your entire program with the same ABI, and link with a
- compatible set of libraries.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate code for a processor running in little-endian mode. This is
- the default for all standard configurations.
- @item -mbig-endian
- @opindex mbig-endian
- Generate code for a processor running in big-endian mode; the default is
- to compile code for a little-endian processor.
- @item -march=@var{name}
- @opindex march
- This specifies the name of the target ARM architecture. GCC uses this
- name to determine what kind of instructions it can emit when generating
- assembly code. This option can be used in conjunction with or instead
- of the @option{-mcpu=} option. Permissible names are: @samp{armv2},
- @samp{armv2a}, @samp{armv3}, @samp{armv3m}, @samp{armv4}, @samp{armv4t},
- @samp{armv5}, @samp{armv5t}, @samp{armv5e}, @samp{armv5te},
- @samp{armv6}, @samp{armv6j},
- @samp{armv6t2}, @samp{armv6z}, @samp{armv6zk}, @samp{armv6-m},
- @samp{armv7}, @samp{armv7-a}, @samp{armv7-r}, @samp{armv7-m}, @samp{armv7e-m},
- @samp{armv7ve}, @samp{armv8-a}, @samp{armv8-a+crc},
- @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312}.
- @option{-march=armv7ve} is the armv7-a architecture with virtualization
- extensions.
- @option{-march=armv8-a+crc} enables code generation for the ARMv8-A
- architecture together with the optional CRC32 extensions.
- @option{-march=native} causes the compiler to auto-detect the architecture
- of the build computer. At present, this feature is only supported on
- GNU/Linux, and not all architectures are recognized. If the auto-detect
- is unsuccessful the option has no effect.
- @item -mtune=@var{name}
- @opindex mtune
- This option specifies the name of the target ARM processor for
- which GCC should tune the performance of the code.
- For some ARM implementations better performance can be obtained by using
- this option.
- Permissible names are: @samp{arm2}, @samp{arm250},
- @samp{arm3}, @samp{arm6}, @samp{arm60}, @samp{arm600}, @samp{arm610},
- @samp{arm620}, @samp{arm7}, @samp{arm7m}, @samp{arm7d}, @samp{arm7dm},
- @samp{arm7di}, @samp{arm7dmi}, @samp{arm70}, @samp{arm700},
- @samp{arm700i}, @samp{arm710}, @samp{arm710c}, @samp{arm7100},
- @samp{arm720},
- @samp{arm7500}, @samp{arm7500fe}, @samp{arm7tdmi}, @samp{arm7tdmi-s},
- @samp{arm710t}, @samp{arm720t}, @samp{arm740t},
- @samp{strongarm}, @samp{strongarm110}, @samp{strongarm1100},
- @samp{strongarm1110},
- @samp{arm8}, @samp{arm810}, @samp{arm9}, @samp{arm9e}, @samp{arm920},
- @samp{arm920t}, @samp{arm922t}, @samp{arm946e-s}, @samp{arm966e-s},
- @samp{arm968e-s}, @samp{arm926ej-s}, @samp{arm940t}, @samp{arm9tdmi},
- @samp{arm10tdmi}, @samp{arm1020t}, @samp{arm1026ej-s},
- @samp{arm10e}, @samp{arm1020e}, @samp{arm1022e},
- @samp{arm1136j-s}, @samp{arm1136jf-s}, @samp{mpcore}, @samp{mpcorenovfp},
- @samp{arm1156t2-s}, @samp{arm1156t2f-s}, @samp{arm1176jz-s}, @samp{arm1176jzf-s},
- @samp{cortex-a5}, @samp{cortex-a7}, @samp{cortex-a8}, @samp{cortex-a9},
- @samp{cortex-a12}, @samp{cortex-a15}, @samp{cortex-a53},
- @samp{cortex-a57}, @samp{cortex-a72},
- @samp{cortex-r4},
- @samp{cortex-r4f}, @samp{cortex-r5}, @samp{cortex-r7}, @samp{cortex-m7},
- @samp{cortex-m4},
- @samp{cortex-m3},
- @samp{cortex-m1},
- @samp{cortex-m0},
- @samp{cortex-m0plus},
- @samp{cortex-m1.small-multiply},
- @samp{cortex-m0.small-multiply},
- @samp{cortex-m0plus.small-multiply},
- @samp{exynos-m1},
- @samp{marvell-pj4},
- @samp{xscale}, @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312},
- @samp{fa526}, @samp{fa626},
- @samp{fa606te}, @samp{fa626te}, @samp{fmp626}, @samp{fa726te},
- @samp{xgene1}.
- Additionally, this option can specify that GCC should tune the performance
- of the code for a big.LITTLE system. Permissible names are:
- @samp{cortex-a15.cortex-a7}, @samp{cortex-a57.cortex-a53},
- @samp{cortex-a72.cortex-a53}.
- @option{-mtune=generic-@var{arch}} specifies that GCC should tune the
- performance for a blend of processors within architecture @var{arch}.
- The aim is to generate code that run well on the current most popular
- processors, balancing between optimizations that benefit some CPUs in the
- range, and avoiding performance pitfalls of other CPUs. The effects of
- this option may change in future GCC versions as CPU models come and go.
- @option{-mtune=native} causes the compiler to auto-detect the CPU
- of the build computer. At present, this feature is only supported on
- GNU/Linux, and not all architectures are recognized. If the auto-detect is
- unsuccessful the option has no effect.
- @item -mcpu=@var{name}
- @opindex mcpu
- This specifies the name of the target ARM processor. GCC uses this name
- to derive the name of the target ARM architecture (as if specified
- by @option{-march}) and the ARM processor type for which to tune for
- performance (as if specified by @option{-mtune}). Where this option
- is used in conjunction with @option{-march} or @option{-mtune},
- those options take precedence over the appropriate part of this option.
- Permissible names for this option are the same as those for
- @option{-mtune}.
- @option{-mcpu=generic-@var{arch}} is also permissible, and is
- equivalent to @option{-march=@var{arch} -mtune=generic-@var{arch}}.
- See @option{-mtune} for more information.
- @option{-mcpu=native} causes the compiler to auto-detect the CPU
- of the build computer. At present, this feature is only supported on
- GNU/Linux, and not all architectures are recognized. If the auto-detect
- is unsuccessful the option has no effect.
- @item -mfpu=@var{name}
- @opindex mfpu
- This specifies what floating-point hardware (or hardware emulation) is
- available on the target. Permissible names are: @samp{vfp}, @samp{vfpv3},
- @samp{vfpv3-fp16}, @samp{vfpv3-d16}, @samp{vfpv3-d16-fp16}, @samp{vfpv3xd},
- @samp{vfpv3xd-fp16}, @samp{neon}, @samp{neon-fp16}, @samp{vfpv4},
- @samp{vfpv4-d16}, @samp{fpv4-sp-d16}, @samp{neon-vfpv4},
- @samp{fpv5-d16}, @samp{fpv5-sp-d16},
- @samp{fp-armv8}, @samp{neon-fp-armv8}, and @samp{crypto-neon-fp-armv8}.
- If @option{-msoft-float} is specified this specifies the format of
- floating-point values.
- If the selected floating-point hardware includes the NEON extension
- (e.g. @option{-mfpu}=@samp{neon}), note that floating-point
- operations are not generated by GCC's auto-vectorization pass unless
- @option{-funsafe-math-optimizations} is also specified. This is
- because NEON hardware does not fully implement the IEEE 754 standard for
- floating-point arithmetic (in particular denormal values are treated as
- zero), so the use of NEON instructions may lead to a loss of precision.
- @item -mfp16-format=@var{name}
- @opindex mfp16-format
- Specify the format of the @code{__fp16} half-precision floating-point type.
- Permissible names are @samp{none}, @samp{ieee}, and @samp{alternative};
- the default is @samp{none}, in which case the @code{__fp16} type is not
- defined. @xref{Half-Precision}, for more information.
- @item -mstructure-size-boundary=@var{n}
- @opindex mstructure-size-boundary
- The sizes of all structures and unions are rounded up to a multiple
- of the number of bits set by this option. Permissible values are 8, 32
- and 64. The default value varies for different toolchains. For the COFF
- targeted toolchain the default value is 8. A value of 64 is only allowed
- if the underlying ABI supports it.
- Specifying a larger number can produce faster, more efficient code, but
- can also increase the size of the program. Different values are potentially
- incompatible. Code compiled with one value cannot necessarily expect to
- work with code or libraries compiled with another value, if they exchange
- information using structures or unions.
- @item -mabort-on-noreturn
- @opindex mabort-on-noreturn
- Generate a call to the function @code{abort} at the end of a
- @code{noreturn} function. It is executed if the function tries to
- return.
- @item -mlong-calls
- @itemx -mno-long-calls
- @opindex mlong-calls
- @opindex mno-long-calls
- Tells the compiler to perform function calls by first loading the
- address of the function into a register and then performing a subroutine
- call on this register. This switch is needed if the target function
- lies outside of the 64-megabyte addressing range of the offset-based
- version of subroutine call instruction.
- Even if this switch is enabled, not all function calls are turned
- into long calls. The heuristic is that static functions, functions
- that have the @code{short_call} attribute, functions that are inside
- the scope of a @code{#pragma no_long_calls} directive, and functions whose
- definitions have already been compiled within the current compilation
- unit are not turned into long calls. The exceptions to this rule are
- that weak function definitions, functions with the @code{long_call}
- attribute or the @code{section} attribute, and functions that are within
- the scope of a @code{#pragma long_calls} directive are always
- turned into long calls.
- This feature is not enabled by default. Specifying
- @option{-mno-long-calls} restores the default behavior, as does
- placing the function calls within the scope of a @code{#pragma
- long_calls_off} directive. Note these switches have no effect on how
- the compiler generates code to handle function calls via function
- pointers.
- @item -msingle-pic-base
- @opindex msingle-pic-base
- Treat the register used for PIC addressing as read-only, rather than
- loading it in the prologue for each function. The runtime system is
- responsible for initializing this register with an appropriate value
- before execution begins.
- @item -mpic-register=@var{reg}
- @opindex mpic-register
- Specify the register to be used for PIC addressing.
- For standard PIC base case, the default is any suitable register
- determined by compiler. For single PIC base case, the default is
- @samp{R9} if target is EABI based or stack-checking is enabled,
- otherwise the default is @samp{R10}.
- @item -mpic-data-is-text-relative
- @opindex mpic-data-is-text-relative
- Assume that each data segments are relative to text segment at load time.
- Therefore, it permits addressing data using PC-relative operations.
- This option is on by default for targets other than VxWorks RTP.
- @item -mpoke-function-name
- @opindex mpoke-function-name
- Write the name of each function into the text section, directly
- preceding the function prologue. The generated code is similar to this:
- @smallexample
- t0
- .ascii "arm_poke_function_name", 0
- .align
- t1
- .word 0xff000000 + (t1 - t0)
- arm_poke_function_name
- mov ip, sp
- stmfd sp!, @{fp, ip, lr, pc@}
- sub fp, ip, #4
- @end smallexample
- When performing a stack backtrace, code can inspect the value of
- @code{pc} stored at @code{fp + 0}. If the trace function then looks at
- location @code{pc - 12} and the top 8 bits are set, then we know that
- there is a function name embedded immediately preceding this location
- and has length @code{((pc[-3]) & 0xff000000)}.
- @item -mthumb
- @itemx -marm
- @opindex marm
- @opindex mthumb
- Select between generating code that executes in ARM and Thumb
- states. The default for most configurations is to generate code
- that executes in ARM state, but the default can be changed by
- configuring GCC with the @option{--with-mode=}@var{state}
- configure option.
- @item -mtpcs-frame
- @opindex mtpcs-frame
- Generate a stack frame that is compliant with the Thumb Procedure Call
- Standard for all non-leaf functions. (A leaf function is one that does
- not call any other functions.) The default is @option{-mno-tpcs-frame}.
- @item -mtpcs-leaf-frame
- @opindex mtpcs-leaf-frame
- Generate a stack frame that is compliant with the Thumb Procedure Call
- Standard for all leaf functions. (A leaf function is one that does
- not call any other functions.) The default is @option{-mno-apcs-leaf-frame}.
- @item -mcallee-super-interworking
- @opindex mcallee-super-interworking
- Gives all externally visible functions in the file being compiled an ARM
- instruction set header which switches to Thumb mode before executing the
- rest of the function. This allows these functions to be called from
- non-interworking code. This option is not valid in AAPCS configurations
- because interworking is enabled by default.
- @item -mcaller-super-interworking
- @opindex mcaller-super-interworking
- Allows calls via function pointers (including virtual functions) to
- execute correctly regardless of whether the target code has been
- compiled for interworking or not. There is a small overhead in the cost
- of executing a function pointer if this option is enabled. This option
- is not valid in AAPCS configurations because interworking is enabled
- by default.
- @item -mtp=@var{name}
- @opindex mtp
- Specify the access model for the thread local storage pointer. The valid
- models are @samp{soft}, which generates calls to @code{__aeabi_read_tp},
- @samp{cp15}, which fetches the thread pointer from @code{cp15} directly
- (supported in the arm6k architecture), and @samp{auto}, which uses the
- best available method for the selected processor. The default setting is
- @samp{auto}.
- @item -mtls-dialect=@var{dialect}
- @opindex mtls-dialect
- Specify the dialect to use for accessing thread local storage. Two
- @var{dialect}s are supported---@samp{gnu} and @samp{gnu2}. The
- @samp{gnu} dialect selects the original GNU scheme for supporting
- local and global dynamic TLS models. The @samp{gnu2} dialect
- selects the GNU descriptor scheme, which provides better performance
- for shared libraries. The GNU descriptor scheme is compatible with
- the original scheme, but does require new assembler, linker and
- library support. Initial and local exec TLS models are unaffected by
- this option and always use the original scheme.
- @item -mword-relocations
- @opindex mword-relocations
- Only generate absolute relocations on word-sized values (i.e. R_ARM_ABS32).
- This is enabled by default on targets (uClinux, SymbianOS) where the runtime
- loader imposes this restriction, and when @option{-fpic} or @option{-fPIC}
- is specified.
- @item -mfix-cortex-m3-ldrd
- @opindex mfix-cortex-m3-ldrd
- Some Cortex-M3 cores can cause data corruption when @code{ldrd} instructions
- with overlapping destination and base registers are used. This option avoids
- generating these instructions. This option is enabled by default when
- @option{-mcpu=cortex-m3} is specified.
- @item -munaligned-access
- @itemx -mno-unaligned-access
- @opindex munaligned-access
- @opindex mno-unaligned-access
- Enables (or disables) reading and writing of 16- and 32- bit values
- from addresses that are not 16- or 32- bit aligned. By default
- unaligned access is disabled for all pre-ARMv6 and all ARMv6-M
- architectures, and enabled for all other architectures. If unaligned
- access is not enabled then words in packed data structures are
- accessed a byte at a time.
- The ARM attribute @code{Tag_CPU_unaligned_access} is set in the
- generated object file to either true or false, depending upon the
- setting of this option. If unaligned access is enabled then the
- preprocessor symbol @code{__ARM_FEATURE_UNALIGNED} is also
- defined.
- @item -mneon-for-64bits
- @opindex mneon-for-64bits
- Enables using Neon to handle scalar 64-bits operations. This is
- disabled by default since the cost of moving data from core registers
- to Neon is high.
- @item -mslow-flash-data
- @opindex mslow-flash-data
- Assume loading data from flash is slower than fetching instruction.
- Therefore literal load is minimized for better performance.
- This option is only supported when compiling for ARMv7 M-profile and
- off by default.
- @item -masm-syntax-unified
- @opindex masm-syntax-unified
- Assume inline assembler is using unified asm syntax. The default is
- currently off which implies divided syntax. Currently this option is
- available only for Thumb1 and has no effect on ARM state and Thumb2.
- However, this may change in future releases of GCC. Divided syntax
- should be considered deprecated.
- @item -mrestrict-it
- @opindex mrestrict-it
- Restricts generation of IT blocks to conform to the rules of ARMv8.
- IT blocks can only contain a single 16-bit instruction from a select
- set of instructions. This option is on by default for ARMv8 Thumb mode.
- @item -mprint-tune-info
- @opindex mprint-tune-info
- Print CPU tuning information as comment in assembler file. This is
- an option used only for regression testing of the compiler and not
- intended for ordinary use in compiling code. This option is disabled
- by default.
- @end table
- @node AVR Options
- @subsection AVR Options
- @cindex AVR Options
- These options are defined for AVR implementations:
- @table @gcctabopt
- @item -mmcu=@var{mcu}
- @opindex mmcu
- Specify Atmel AVR instruction set architectures (ISA) or MCU type.
- The default for this option is@tie{}@samp{avr2}.
- GCC supports the following AVR devices and ISAs:
- @include avr-mmcu.texi
- @item -maccumulate-args
- @opindex maccumulate-args
- Accumulate outgoing function arguments and acquire/release the needed
- stack space for outgoing function arguments once in function
- prologue/epilogue. Without this option, outgoing arguments are pushed
- before calling a function and popped afterwards.
- Popping the arguments after the function call can be expensive on
- AVR so that accumulating the stack space might lead to smaller
- executables because arguments need not to be removed from the
- stack after such a function call.
- This option can lead to reduced code size for functions that perform
- several calls to functions that get their arguments on the stack like
- calls to printf-like functions.
- @item -mbranch-cost=@var{cost}
- @opindex mbranch-cost
- Set the branch costs for conditional branch instructions to
- @var{cost}. Reasonable values for @var{cost} are small, non-negative
- integers. The default branch cost is 0.
- @item -mcall-prologues
- @opindex mcall-prologues
- Functions prologues/epilogues are expanded as calls to appropriate
- subroutines. Code size is smaller.
- @item -mint8
- @opindex mint8
- Assume @code{int} to be 8-bit integer. This affects the sizes of all types: a
- @code{char} is 1 byte, an @code{int} is 1 byte, a @code{long} is 2 bytes,
- and @code{long long} is 4 bytes. Please note that this option does not
- conform to the C standards, but it results in smaller code
- size.
- @item -mn-flash=@var{num}
- @opindex mn-flash
- Assume that the flash memory has a size of
- @var{num} times 64@tie{}KiB.
- @item -mno-interrupts
- @opindex mno-interrupts
- Generated code is not compatible with hardware interrupts.
- Code size is smaller.
- @item -mrelax
- @opindex mrelax
- Try to replace @code{CALL} resp.@: @code{JMP} instruction by the shorter
- @code{RCALL} resp.@: @code{RJMP} instruction if applicable.
- Setting @option{-mrelax} just adds the @option{--mlink-relax} option to
- the assembler's command line and the @option{--relax} option to the
- linker's command line.
- Jump relaxing is performed by the linker because jump offsets are not
- known before code is located. Therefore, the assembler code generated by the
- compiler is the same, but the instructions in the executable may
- differ from instructions in the assembler code.
- Relaxing must be turned on if linker stubs are needed, see the
- section on @code{EIND} and linker stubs below.
- @item -mrmw
- @opindex mrmw
- Assume that the device supports the Read-Modify-Write
- instructions @code{XCH}, @code{LAC}, @code{LAS} and @code{LAT}.
- @item -msp8
- @opindex msp8
- Treat the stack pointer register as an 8-bit register,
- i.e.@: assume the high byte of the stack pointer is zero.
- In general, you don't need to set this option by hand.
- This option is used internally by the compiler to select and
- build multilibs for architectures @code{avr2} and @code{avr25}.
- These architectures mix devices with and without @code{SPH}.
- For any setting other than @option{-mmcu=avr2} or @option{-mmcu=avr25}
- the compiler driver adds or removes this option from the compiler
- proper's command line, because the compiler then knows if the device
- or architecture has an 8-bit stack pointer and thus no @code{SPH}
- register or not.
- @item -mstrict-X
- @opindex mstrict-X
- Use address register @code{X} in a way proposed by the hardware. This means
- that @code{X} is only used in indirect, post-increment or
- pre-decrement addressing.
- Without this option, the @code{X} register may be used in the same way
- as @code{Y} or @code{Z} which then is emulated by additional
- instructions.
- For example, loading a value with @code{X+const} addressing with a
- small non-negative @code{const < 64} to a register @var{Rn} is
- performed as
- @example
- adiw r26, const ; X += const
- ld @var{Rn}, X ; @var{Rn} = *X
- sbiw r26, const ; X -= const
- @end example
- @item -mtiny-stack
- @opindex mtiny-stack
- Only change the lower 8@tie{}bits of the stack pointer.
- @item -nodevicelib
- @opindex nodevicelib
- Don't link against AVR-LibC's device specific library @code{libdev.a}.
- @item -Waddr-space-convert
- @opindex Waddr-space-convert
- Warn about conversions between address spaces in the case where the
- resulting address space is not contained in the incoming address space.
- @end table
- @subsubsection @code{EIND} and Devices with More Than 128 Ki Bytes of Flash
- @cindex @code{EIND}
- Pointers in the implementation are 16@tie{}bits wide.
- The address of a function or label is represented as word address so
- that indirect jumps and calls can target any code address in the
- range of 64@tie{}Ki words.
- In order to facilitate indirect jump on devices with more than 128@tie{}Ki
- bytes of program memory space, there is a special function register called
- @code{EIND} that serves as most significant part of the target address
- when @code{EICALL} or @code{EIJMP} instructions are used.
- Indirect jumps and calls on these devices are handled as follows by
- the compiler and are subject to some limitations:
- @itemize @bullet
- @item
- The compiler never sets @code{EIND}.
- @item
- The compiler uses @code{EIND} implicitely in @code{EICALL}/@code{EIJMP}
- instructions or might read @code{EIND} directly in order to emulate an
- indirect call/jump by means of a @code{RET} instruction.
- @item
- The compiler assumes that @code{EIND} never changes during the startup
- code or during the application. In particular, @code{EIND} is not
- saved/restored in function or interrupt service routine
- prologue/epilogue.
- @item
- For indirect calls to functions and computed goto, the linker
- generates @emph{stubs}. Stubs are jump pads sometimes also called
- @emph{trampolines}. Thus, the indirect call/jump jumps to such a stub.
- The stub contains a direct jump to the desired address.
- @item
- Linker relaxation must be turned on so that the linker generates
- the stubs correctly in all situations. See the compiler option
- @option{-mrelax} and the linker option @option{--relax}.
- There are corner cases where the linker is supposed to generate stubs
- but aborts without relaxation and without a helpful error message.
- @item
- The default linker script is arranged for code with @code{EIND = 0}.
- If code is supposed to work for a setup with @code{EIND != 0}, a custom
- linker script has to be used in order to place the sections whose
- name start with @code{.trampolines} into the segment where @code{EIND}
- points to.
- @item
- The startup code from libgcc never sets @code{EIND}.
- Notice that startup code is a blend of code from libgcc and AVR-LibC.
- For the impact of AVR-LibC on @code{EIND}, see the
- @w{@uref{http://nongnu.org/avr-libc/user-manual/,AVR-LibC user manual}}.
- @item
- It is legitimate for user-specific startup code to set up @code{EIND}
- early, for example by means of initialization code located in
- section @code{.init3}. Such code runs prior to general startup code
- that initializes RAM and calls constructors, but after the bit
- of startup code from AVR-LibC that sets @code{EIND} to the segment
- where the vector table is located.
- @example
- #include <avr/io.h>
- static void
- __attribute__((section(".init3"),naked,used,no_instrument_function))
- init3_set_eind (void)
- @{
- __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t"
- "out %i0,r24" :: "n" (&EIND) : "r24","memory");
- @}
- @end example
- @noindent
- The @code{__trampolines_start} symbol is defined in the linker script.
- @item
- Stubs are generated automatically by the linker if
- the following two conditions are met:
- @itemize @minus
- @item The address of a label is taken by means of the @code{gs} modifier
- (short for @emph{generate stubs}) like so:
- @example
- LDI r24, lo8(gs(@var{func}))
- LDI r25, hi8(gs(@var{func}))
- @end example
- @item The final location of that label is in a code segment
- @emph{outside} the segment where the stubs are located.
- @end itemize
- @item
- The compiler emits such @code{gs} modifiers for code labels in the
- following situations:
- @itemize @minus
- @item Taking address of a function or code label.
- @item Computed goto.
- @item If prologue-save function is used, see @option{-mcall-prologues}
- command-line option.
- @item Switch/case dispatch tables. If you do not want such dispatch
- tables you can specify the @option{-fno-jump-tables} command-line option.
- @item C and C++ constructors/destructors called during startup/shutdown.
- @item If the tools hit a @code{gs()} modifier explained above.
- @end itemize
- @item
- Jumping to non-symbolic addresses like so is @emph{not} supported:
- @example
- int main (void)
- @{
- /* Call function at word address 0x2 */
- return ((int(*)(void)) 0x2)();
- @}
- @end example
- Instead, a stub has to be set up, i.e.@: the function has to be called
- through a symbol (@code{func_4} in the example):
- @example
- int main (void)
- @{
- extern int func_4 (void);
- /* Call function at byte address 0x4 */
- return func_4();
- @}
- @end example
- and the application be linked with @option{-Wl,--defsym,func_4=0x4}.
- Alternatively, @code{func_4} can be defined in the linker script.
- @end itemize
- @subsubsection Handling of the @code{RAMPD}, @code{RAMPX}, @code{RAMPY} and @code{RAMPZ} Special Function Registers
- @cindex @code{RAMPD}
- @cindex @code{RAMPX}
- @cindex @code{RAMPY}
- @cindex @code{RAMPZ}
- Some AVR devices support memories larger than the 64@tie{}KiB range
- that can be accessed with 16-bit pointers. To access memory locations
- outside this 64@tie{}KiB range, the contentent of a @code{RAMP}
- register is used as high part of the address:
- The @code{X}, @code{Y}, @code{Z} address register is concatenated
- with the @code{RAMPX}, @code{RAMPY}, @code{RAMPZ} special function
- register, respectively, to get a wide address. Similarly,
- @code{RAMPD} is used together with direct addressing.
- @itemize
- @item
- The startup code initializes the @code{RAMP} special function
- registers with zero.
- @item
- If a @ref{AVR Named Address Spaces,named address space} other than
- generic or @code{__flash} is used, then @code{RAMPZ} is set
- as needed before the operation.
- @item
- If the device supports RAM larger than 64@tie{}KiB and the compiler
- needs to change @code{RAMPZ} to accomplish an operation, @code{RAMPZ}
- is reset to zero after the operation.
- @item
- If the device comes with a specific @code{RAMP} register, the ISR
- prologue/epilogue saves/restores that SFR and initializes it with
- zero in case the ISR code might (implicitly) use it.
- @item
- RAM larger than 64@tie{}KiB is not supported by GCC for AVR targets.
- If you use inline assembler to read from locations outside the
- 16-bit address range and change one of the @code{RAMP} registers,
- you must reset it to zero after the access.
- @end itemize
- @subsubsection AVR Built-in Macros
- GCC defines several built-in macros so that the user code can test
- for the presence or absence of features. Almost any of the following
- built-in macros are deduced from device capabilities and thus
- triggered by the @option{-mmcu=} command-line option.
- For even more AVR-specific built-in macros see
- @ref{AVR Named Address Spaces} and @ref{AVR Built-in Functions}.
- @table @code
- @item __AVR_ARCH__
- Build-in macro that resolves to a decimal number that identifies the
- architecture and depends on the @option{-mmcu=@var{mcu}} option.
- Possible values are:
- @code{2}, @code{25}, @code{3}, @code{31}, @code{35},
- @code{4}, @code{5}, @code{51}, @code{6}
- for @var{mcu}=@code{avr2}, @code{avr25}, @code{avr3}, @code{avr31},
- @code{avr35}, @code{avr4}, @code{avr5}, @code{avr51}, @code{avr6},
- respectively and
- @code{100}, @code{102}, @code{104},
- @code{105}, @code{106}, @code{107}
- for @var{mcu}=@code{avrtiny}, @code{avrxmega2}, @code{avrxmega4},
- @code{avrxmega5}, @code{avrxmega6}, @code{avrxmega7}, respectively.
- If @var{mcu} specifies a device, this built-in macro is set
- accordingly. For example, with @option{-mmcu=atmega8} the macro is
- defined to @code{4}.
- @item __AVR_@var{Device}__
- Setting @option{-mmcu=@var{device}} defines this built-in macro which reflects
- the device's name. For example, @option{-mmcu=atmega8} defines the
- built-in macro @code{__AVR_ATmega8__}, @option{-mmcu=attiny261a} defines
- @code{__AVR_ATtiny261A__}, etc.
- The built-in macros' names follow
- the scheme @code{__AVR_@var{Device}__} where @var{Device} is
- the device name as from the AVR user manual. The difference between
- @var{Device} in the built-in macro and @var{device} in
- @option{-mmcu=@var{device}} is that the latter is always lowercase.
- If @var{device} is not a device but only a core architecture like
- @samp{avr51}, this macro is not defined.
- @item __AVR_DEVICE_NAME__
- Setting @option{-mmcu=@var{device}} defines this built-in macro to
- the device's name. For example, with @option{-mmcu=atmega8} the macro
- is defined to @code{atmega8}.
- If @var{device} is not a device but only a core architecture like
- @samp{avr51}, this macro is not defined.
- @item __AVR_XMEGA__
- The device / architecture belongs to the XMEGA family of devices.
- @item __AVR_HAVE_ELPM__
- The device has the the @code{ELPM} instruction.
- @item __AVR_HAVE_ELPMX__
- The device has the @code{ELPM R@var{n},Z} and @code{ELPM
- R@var{n},Z+} instructions.
- @item __AVR_HAVE_MOVW__
- The device has the @code{MOVW} instruction to perform 16-bit
- register-register moves.
- @item __AVR_HAVE_LPMX__
- The device has the @code{LPM R@var{n},Z} and
- @code{LPM R@var{n},Z+} instructions.
- @item __AVR_HAVE_MUL__
- The device has a hardware multiplier.
- @item __AVR_HAVE_JMP_CALL__
- The device has the @code{JMP} and @code{CALL} instructions.
- This is the case for devices with at least 16@tie{}KiB of program
- memory.
- @item __AVR_HAVE_EIJMP_EICALL__
- @itemx __AVR_3_BYTE_PC__
- The device has the @code{EIJMP} and @code{EICALL} instructions.
- This is the case for devices with more than 128@tie{}KiB of program memory.
- This also means that the program counter
- (PC) is 3@tie{}bytes wide.
- @item __AVR_2_BYTE_PC__
- The program counter (PC) is 2@tie{}bytes wide. This is the case for devices
- with up to 128@tie{}KiB of program memory.
- @item __AVR_HAVE_8BIT_SP__
- @itemx __AVR_HAVE_16BIT_SP__
- The stack pointer (SP) register is treated as 8-bit respectively
- 16-bit register by the compiler.
- The definition of these macros is affected by @option{-mtiny-stack}.
- @item __AVR_HAVE_SPH__
- @itemx __AVR_SP8__
- The device has the SPH (high part of stack pointer) special function
- register or has an 8-bit stack pointer, respectively.
- The definition of these macros is affected by @option{-mmcu=} and
- in the cases of @option{-mmcu=avr2} and @option{-mmcu=avr25} also
- by @option{-msp8}.
- @item __AVR_HAVE_RAMPD__
- @itemx __AVR_HAVE_RAMPX__
- @itemx __AVR_HAVE_RAMPY__
- @itemx __AVR_HAVE_RAMPZ__
- The device has the @code{RAMPD}, @code{RAMPX}, @code{RAMPY},
- @code{RAMPZ} special function register, respectively.
- @item __NO_INTERRUPTS__
- This macro reflects the @option{-mno-interrupts} command-line option.
- @item __AVR_ERRATA_SKIP__
- @itemx __AVR_ERRATA_SKIP_JMP_CALL__
- Some AVR devices (AT90S8515, ATmega103) must not skip 32-bit
- instructions because of a hardware erratum. Skip instructions are
- @code{SBRS}, @code{SBRC}, @code{SBIS}, @code{SBIC} and @code{CPSE}.
- The second macro is only defined if @code{__AVR_HAVE_JMP_CALL__} is also
- set.
- @item __AVR_ISA_RMW__
- The device has Read-Modify-Write instructions (XCH, LAC, LAS and LAT).
- @item __AVR_SFR_OFFSET__=@var{offset}
- Instructions that can address I/O special function registers directly
- like @code{IN}, @code{OUT}, @code{SBI}, etc.@: may use a different
- address as if addressed by an instruction to access RAM like @code{LD}
- or @code{STS}. This offset depends on the device architecture and has
- to be subtracted from the RAM address in order to get the
- respective I/O@tie{}address.
- @item __WITH_AVRLIBC__
- The compiler is configured to be used together with AVR-Libc.
- See the @option{--with-avrlibc} configure option.
- @end table
- @node Blackfin Options
- @subsection Blackfin Options
- @cindex Blackfin Options
- @table @gcctabopt
- @item -mcpu=@var{cpu}@r{[}-@var{sirevision}@r{]}
- @opindex mcpu=
- Specifies the name of the target Blackfin processor. Currently, @var{cpu}
- can be one of @samp{bf512}, @samp{bf514}, @samp{bf516}, @samp{bf518},
- @samp{bf522}, @samp{bf523}, @samp{bf524}, @samp{bf525}, @samp{bf526},
- @samp{bf527}, @samp{bf531}, @samp{bf532}, @samp{bf533},
- @samp{bf534}, @samp{bf536}, @samp{bf537}, @samp{bf538}, @samp{bf539},
- @samp{bf542}, @samp{bf544}, @samp{bf547}, @samp{bf548}, @samp{bf549},
- @samp{bf542m}, @samp{bf544m}, @samp{bf547m}, @samp{bf548m}, @samp{bf549m},
- @samp{bf561}, @samp{bf592}.
- The optional @var{sirevision} specifies the silicon revision of the target
- Blackfin processor. Any workarounds available for the targeted silicon revision
- are enabled. If @var{sirevision} is @samp{none}, no workarounds are enabled.
- If @var{sirevision} is @samp{any}, all workarounds for the targeted processor
- are enabled. The @code{__SILICON_REVISION__} macro is defined to two
- hexadecimal digits representing the major and minor numbers in the silicon
- revision. If @var{sirevision} is @samp{none}, the @code{__SILICON_REVISION__}
- is not defined. If @var{sirevision} is @samp{any}, the
- @code{__SILICON_REVISION__} is defined to be @code{0xffff}.
- If this optional @var{sirevision} is not used, GCC assumes the latest known
- silicon revision of the targeted Blackfin processor.
- GCC defines a preprocessor macro for the specified @var{cpu}.
- For the @samp{bfin-elf} toolchain, this option causes the hardware BSP
- provided by libgloss to be linked in if @option{-msim} is not given.
- Without this option, @samp{bf532} is used as the processor by default.
- Note that support for @samp{bf561} is incomplete. For @samp{bf561},
- only the preprocessor macro is defined.
- @item -msim
- @opindex msim
- Specifies that the program will be run on the simulator. This causes
- the simulator BSP provided by libgloss to be linked in. This option
- has effect only for @samp{bfin-elf} toolchain.
- Certain other options, such as @option{-mid-shared-library} and
- @option{-mfdpic}, imply @option{-msim}.
- @item -momit-leaf-frame-pointer
- @opindex momit-leaf-frame-pointer
- Don't keep the frame pointer in a register for leaf functions. This
- avoids the instructions to save, set up and restore frame pointers and
- makes an extra register available in leaf functions. The option
- @option{-fomit-frame-pointer} removes the frame pointer for all functions,
- which might make debugging harder.
- @item -mspecld-anomaly
- @opindex mspecld-anomaly
- When enabled, the compiler ensures that the generated code does not
- contain speculative loads after jump instructions. If this option is used,
- @code{__WORKAROUND_SPECULATIVE_LOADS} is defined.
- @item -mno-specld-anomaly
- @opindex mno-specld-anomaly
- Don't generate extra code to prevent speculative loads from occurring.
- @item -mcsync-anomaly
- @opindex mcsync-anomaly
- When enabled, the compiler ensures that the generated code does not
- contain CSYNC or SSYNC instructions too soon after conditional branches.
- If this option is used, @code{__WORKAROUND_SPECULATIVE_SYNCS} is defined.
- @item -mno-csync-anomaly
- @opindex mno-csync-anomaly
- Don't generate extra code to prevent CSYNC or SSYNC instructions from
- occurring too soon after a conditional branch.
- @item -mlow-64k
- @opindex mlow-64k
- When enabled, the compiler is free to take advantage of the knowledge that
- the entire program fits into the low 64k of memory.
- @item -mno-low-64k
- @opindex mno-low-64k
- Assume that the program is arbitrarily large. This is the default.
- @item -mstack-check-l1
- @opindex mstack-check-l1
- Do stack checking using information placed into L1 scratchpad memory by the
- uClinux kernel.
- @item -mid-shared-library
- @opindex mid-shared-library
- Generate code that supports shared libraries via the library ID method.
- This allows for execute in place and shared libraries in an environment
- without virtual memory management. This option implies @option{-fPIC}.
- With a @samp{bfin-elf} target, this option implies @option{-msim}.
- @item -mno-id-shared-library
- @opindex mno-id-shared-library
- Generate code that doesn't assume ID-based shared libraries are being used.
- This is the default.
- @item -mleaf-id-shared-library
- @opindex mleaf-id-shared-library
- Generate code that supports shared libraries via the library ID method,
- but assumes that this library or executable won't link against any other
- ID shared libraries. That allows the compiler to use faster code for jumps
- and calls.
- @item -mno-leaf-id-shared-library
- @opindex mno-leaf-id-shared-library
- Do not assume that the code being compiled won't link against any ID shared
- libraries. Slower code is generated for jump and call insns.
- @item -mshared-library-id=n
- @opindex mshared-library-id
- Specifies the identification number of the ID-based shared library being
- compiled. Specifying a value of 0 generates more compact code; specifying
- other values forces the allocation of that number to the current
- library but is no more space- or time-efficient than omitting this option.
- @item -msep-data
- @opindex msep-data
- Generate code that allows the data segment to be located in a different
- area of memory from the text segment. This allows for execute in place in
- an environment without virtual memory management by eliminating relocations
- against the text section.
- @item -mno-sep-data
- @opindex mno-sep-data
- Generate code that assumes that the data segment follows the text segment.
- This is the default.
- @item -mlong-calls
- @itemx -mno-long-calls
- @opindex mlong-calls
- @opindex mno-long-calls
- Tells the compiler to perform function calls by first loading the
- address of the function into a register and then performing a subroutine
- call on this register. This switch is needed if the target function
- lies outside of the 24-bit addressing range of the offset-based
- version of subroutine call instruction.
- This feature is not enabled by default. Specifying
- @option{-mno-long-calls} restores the default behavior. Note these
- switches have no effect on how the compiler generates code to handle
- function calls via function pointers.
- @item -mfast-fp
- @opindex mfast-fp
- Link with the fast floating-point library. This library relaxes some of
- the IEEE floating-point standard's rules for checking inputs against
- Not-a-Number (NAN), in the interest of performance.
- @item -minline-plt
- @opindex minline-plt
- Enable inlining of PLT entries in function calls to functions that are
- not known to bind locally. It has no effect without @option{-mfdpic}.
- @item -mmulticore
- @opindex mmulticore
- Build a standalone application for multicore Blackfin processors.
- This option causes proper start files and link scripts supporting
- multicore to be used, and defines the macro @code{__BFIN_MULTICORE}.
- It can only be used with @option{-mcpu=bf561@r{[}-@var{sirevision}@r{]}}.
- This option can be used with @option{-mcorea} or @option{-mcoreb}, which
- selects the one-application-per-core programming model. Without
- @option{-mcorea} or @option{-mcoreb}, the single-application/dual-core
- programming model is used. In this model, the main function of Core B
- should be named as @code{coreb_main}.
- If this option is not used, the single-core application programming
- model is used.
- @item -mcorea
- @opindex mcorea
- Build a standalone application for Core A of BF561 when using
- the one-application-per-core programming model. Proper start files
- and link scripts are used to support Core A, and the macro
- @code{__BFIN_COREA} is defined.
- This option can only be used in conjunction with @option{-mmulticore}.
- @item -mcoreb
- @opindex mcoreb
- Build a standalone application for Core B of BF561 when using
- the one-application-per-core programming model. Proper start files
- and link scripts are used to support Core B, and the macro
- @code{__BFIN_COREB} is defined. When this option is used, @code{coreb_main}
- should be used instead of @code{main}.
- This option can only be used in conjunction with @option{-mmulticore}.
- @item -msdram
- @opindex msdram
- Build a standalone application for SDRAM. Proper start files and
- link scripts are used to put the application into SDRAM, and the macro
- @code{__BFIN_SDRAM} is defined.
- The loader should initialize SDRAM before loading the application.
- @item -micplb
- @opindex micplb
- Assume that ICPLBs are enabled at run time. This has an effect on certain
- anomaly workarounds. For Linux targets, the default is to assume ICPLBs
- are enabled; for standalone applications the default is off.
- @end table
- @node C6X Options
- @subsection C6X Options
- @cindex C6X Options
- @table @gcctabopt
- @item -march=@var{name}
- @opindex march
- This specifies the name of the target architecture. GCC uses this
- name to determine what kind of instructions it can emit when generating
- assembly code. Permissible names are: @samp{c62x},
- @samp{c64x}, @samp{c64x+}, @samp{c67x}, @samp{c67x+}, @samp{c674x}.
- @item -mbig-endian
- @opindex mbig-endian
- Generate code for a big-endian target.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate code for a little-endian target. This is the default.
- @item -msim
- @opindex msim
- Choose startup files and linker script suitable for the simulator.
- @item -msdata=default
- @opindex msdata=default
- Put small global and static data in the @code{.neardata} section,
- which is pointed to by register @code{B14}. Put small uninitialized
- global and static data in the @code{.bss} section, which is adjacent
- to the @code{.neardata} section. Put small read-only data into the
- @code{.rodata} section. The corresponding sections used for large
- pieces of data are @code{.fardata}, @code{.far} and @code{.const}.
- @item -msdata=all
- @opindex msdata=all
- Put all data, not just small objects, into the sections reserved for
- small data, and use addressing relative to the @code{B14} register to
- access them.
- @item -msdata=none
- @opindex msdata=none
- Make no use of the sections reserved for small data, and use absolute
- addresses to access all data. Put all initialized global and static
- data in the @code{.fardata} section, and all uninitialized data in the
- @code{.far} section. Put all constant data into the @code{.const}
- section.
- @end table
- @node CRIS Options
- @subsection CRIS Options
- @cindex CRIS Options
- These options are defined specifically for the CRIS ports.
- @table @gcctabopt
- @item -march=@var{architecture-type}
- @itemx -mcpu=@var{architecture-type}
- @opindex march
- @opindex mcpu
- Generate code for the specified architecture. The choices for
- @var{architecture-type} are @samp{v3}, @samp{v8} and @samp{v10} for
- respectively ETRAX@w{ }4, ETRAX@w{ }100, and ETRAX@w{ }100@w{ }LX@.
- Default is @samp{v0} except for cris-axis-linux-gnu, where the default is
- @samp{v10}.
- @item -mtune=@var{architecture-type}
- @opindex mtune
- Tune to @var{architecture-type} everything applicable about the generated
- code, except for the ABI and the set of available instructions. The
- choices for @var{architecture-type} are the same as for
- @option{-march=@var{architecture-type}}.
- @item -mmax-stack-frame=@var{n}
- @opindex mmax-stack-frame
- Warn when the stack frame of a function exceeds @var{n} bytes.
- @item -metrax4
- @itemx -metrax100
- @opindex metrax4
- @opindex metrax100
- The options @option{-metrax4} and @option{-metrax100} are synonyms for
- @option{-march=v3} and @option{-march=v8} respectively.
- @item -mmul-bug-workaround
- @itemx -mno-mul-bug-workaround
- @opindex mmul-bug-workaround
- @opindex mno-mul-bug-workaround
- Work around a bug in the @code{muls} and @code{mulu} instructions for CPU
- models where it applies. This option is active by default.
- @item -mpdebug
- @opindex mpdebug
- Enable CRIS-specific verbose debug-related information in the assembly
- code. This option also has the effect of turning off the @samp{#NO_APP}
- formatted-code indicator to the assembler at the beginning of the
- assembly file.
- @item -mcc-init
- @opindex mcc-init
- Do not use condition-code results from previous instruction; always emit
- compare and test instructions before use of condition codes.
- @item -mno-side-effects
- @opindex mno-side-effects
- Do not emit instructions with side effects in addressing modes other than
- post-increment.
- @item -mstack-align
- @itemx -mno-stack-align
- @itemx -mdata-align
- @itemx -mno-data-align
- @itemx -mconst-align
- @itemx -mno-const-align
- @opindex mstack-align
- @opindex mno-stack-align
- @opindex mdata-align
- @opindex mno-data-align
- @opindex mconst-align
- @opindex mno-const-align
- These options (@samp{no-} options) arrange (eliminate arrangements) for the
- stack frame, individual data and constants to be aligned for the maximum
- single data access size for the chosen CPU model. The default is to
- arrange for 32-bit alignment. ABI details such as structure layout are
- not affected by these options.
- @item -m32-bit
- @itemx -m16-bit
- @itemx -m8-bit
- @opindex m32-bit
- @opindex m16-bit
- @opindex m8-bit
- Similar to the stack- data- and const-align options above, these options
- arrange for stack frame, writable data and constants to all be 32-bit,
- 16-bit or 8-bit aligned. The default is 32-bit alignment.
- @item -mno-prologue-epilogue
- @itemx -mprologue-epilogue
- @opindex mno-prologue-epilogue
- @opindex mprologue-epilogue
- With @option{-mno-prologue-epilogue}, the normal function prologue and
- epilogue which set up the stack frame are omitted and no return
- instructions or return sequences are generated in the code. Use this
- option only together with visual inspection of the compiled code: no
- warnings or errors are generated when call-saved registers must be saved,
- or storage for local variables needs to be allocated.
- @item -mno-gotplt
- @itemx -mgotplt
- @opindex mno-gotplt
- @opindex mgotplt
- With @option{-fpic} and @option{-fPIC}, don't generate (do generate)
- instruction sequences that load addresses for functions from the PLT part
- of the GOT rather than (traditional on other architectures) calls to the
- PLT@. The default is @option{-mgotplt}.
- @item -melf
- @opindex melf
- Legacy no-op option only recognized with the cris-axis-elf and
- cris-axis-linux-gnu targets.
- @item -mlinux
- @opindex mlinux
- Legacy no-op option only recognized with the cris-axis-linux-gnu target.
- @item -sim
- @opindex sim
- This option, recognized for the cris-axis-elf, arranges
- to link with input-output functions from a simulator library. Code,
- initialized data and zero-initialized data are allocated consecutively.
- @item -sim2
- @opindex sim2
- Like @option{-sim}, but pass linker options to locate initialized data at
- 0x40000000 and zero-initialized data at 0x80000000.
- @end table
- @node CR16 Options
- @subsection CR16 Options
- @cindex CR16 Options
- These options are defined specifically for the CR16 ports.
- @table @gcctabopt
- @item -mmac
- @opindex mmac
- Enable the use of multiply-accumulate instructions. Disabled by default.
- @item -mcr16cplus
- @itemx -mcr16c
- @opindex mcr16cplus
- @opindex mcr16c
- Generate code for CR16C or CR16C+ architecture. CR16C+ architecture
- is default.
- @item -msim
- @opindex msim
- Links the library libsim.a which is in compatible with simulator. Applicable
- to ELF compiler only.
- @item -mint32
- @opindex mint32
- Choose integer type as 32-bit wide.
- @item -mbit-ops
- @opindex mbit-ops
- Generates @code{sbit}/@code{cbit} instructions for bit manipulations.
- @item -mdata-model=@var{model}
- @opindex mdata-model
- Choose a data model. The choices for @var{model} are @samp{near},
- @samp{far} or @samp{medium}. @samp{medium} is default.
- However, @samp{far} is not valid with @option{-mcr16c}, as the
- CR16C architecture does not support the far data model.
- @end table
- @node Darwin Options
- @subsection Darwin Options
- @cindex Darwin options
- These options are defined for all architectures running the Darwin operating
- system.
- FSF GCC on Darwin does not create ``fat'' object files; it creates
- an object file for the single architecture that GCC was built to
- target. Apple's GCC on Darwin does create ``fat'' files if multiple
- @option{-arch} options are used; it does so by running the compiler or
- linker multiple times and joining the results together with
- @file{lipo}.
- The subtype of the file created (like @samp{ppc7400} or @samp{ppc970} or
- @samp{i686}) is determined by the flags that specify the ISA
- that GCC is targeting, like @option{-mcpu} or @option{-march}. The
- @option{-force_cpusubtype_ALL} option can be used to override this.
- The Darwin tools vary in their behavior when presented with an ISA
- mismatch. The assembler, @file{as}, only permits instructions to
- be used that are valid for the subtype of the file it is generating,
- so you cannot put 64-bit instructions in a @samp{ppc750} object file.
- The linker for shared libraries, @file{/usr/bin/libtool}, fails
- and prints an error if asked to create a shared library with a less
- restrictive subtype than its input files (for instance, trying to put
- a @samp{ppc970} object file in a @samp{ppc7400} library). The linker
- for executables, @command{ld}, quietly gives the executable the most
- restrictive subtype of any of its input files.
- @table @gcctabopt
- @item -F@var{dir}
- @opindex F
- Add the framework directory @var{dir} to the head of the list of
- directories to be searched for header files. These directories are
- interleaved with those specified by @option{-I} options and are
- scanned in a left-to-right order.
- A framework directory is a directory with frameworks in it. A
- framework is a directory with a @file{Headers} and/or
- @file{PrivateHeaders} directory contained directly in it that ends
- in @file{.framework}. The name of a framework is the name of this
- directory excluding the @file{.framework}. Headers associated with
- the framework are found in one of those two directories, with
- @file{Headers} being searched first. A subframework is a framework
- directory that is in a framework's @file{Frameworks} directory.
- Includes of subframework headers can only appear in a header of a
- framework that contains the subframework, or in a sibling subframework
- header. Two subframeworks are siblings if they occur in the same
- framework. A subframework should not have the same name as a
- framework; a warning is issued if this is violated. Currently a
- subframework cannot have subframeworks; in the future, the mechanism
- may be extended to support this. The standard frameworks can be found
- in @file{/System/Library/Frameworks} and
- @file{/Library/Frameworks}. An example include looks like
- @code{#include <Framework/header.h>}, where @file{Framework} denotes
- the name of the framework and @file{header.h} is found in the
- @file{PrivateHeaders} or @file{Headers} directory.
- @item -iframework@var{dir}
- @opindex iframework
- Like @option{-F} except the directory is a treated as a system
- directory. The main difference between this @option{-iframework} and
- @option{-F} is that with @option{-iframework} the compiler does not
- warn about constructs contained within header files found via
- @var{dir}. This option is valid only for the C family of languages.
- @item -gused
- @opindex gused
- Emit debugging information for symbols that are used. For stabs
- debugging format, this enables @option{-feliminate-unused-debug-symbols}.
- This is by default ON@.
- @item -gfull
- @opindex gfull
- Emit debugging information for all symbols and types.
- @item -mmacosx-version-min=@var{version}
- The earliest version of MacOS X that this executable will run on
- is @var{version}. Typical values of @var{version} include @code{10.1},
- @code{10.2}, and @code{10.3.9}.
- If the compiler was built to use the system's headers by default,
- then the default for this option is the system version on which the
- compiler is running, otherwise the default is to make choices that
- are compatible with as many systems and code bases as possible.
- @item -mkernel
- @opindex mkernel
- Enable kernel development mode. The @option{-mkernel} option sets
- @option{-static}, @option{-fno-common}, @option{-fno-use-cxa-atexit},
- @option{-fno-exceptions}, @option{-fno-non-call-exceptions},
- @option{-fapple-kext}, @option{-fno-weak} and @option{-fno-rtti} where
- applicable. This mode also sets @option{-mno-altivec},
- @option{-msoft-float}, @option{-fno-builtin} and
- @option{-mlong-branch} for PowerPC targets.
- @item -mone-byte-bool
- @opindex mone-byte-bool
- Override the defaults for @code{bool} so that @code{sizeof(bool)==1}.
- By default @code{sizeof(bool)} is @code{4} when compiling for
- Darwin/PowerPC and @code{1} when compiling for Darwin/x86, so this
- option has no effect on x86.
- @strong{Warning:} The @option{-mone-byte-bool} switch causes GCC
- to generate code that is not binary compatible with code generated
- without that switch. Using this switch may require recompiling all
- other modules in a program, including system libraries. Use this
- switch to conform to a non-default data model.
- @item -mfix-and-continue
- @itemx -ffix-and-continue
- @itemx -findirect-data
- @opindex mfix-and-continue
- @opindex ffix-and-continue
- @opindex findirect-data
- Generate code suitable for fast turnaround development, such as to
- allow GDB to dynamically load @file{.o} files into already-running
- programs. @option{-findirect-data} and @option{-ffix-and-continue}
- are provided for backwards compatibility.
- @item -all_load
- @opindex all_load
- Loads all members of static archive libraries.
- See man ld(1) for more information.
- @item -arch_errors_fatal
- @opindex arch_errors_fatal
- Cause the errors having to do with files that have the wrong architecture
- to be fatal.
- @item -bind_at_load
- @opindex bind_at_load
- Causes the output file to be marked such that the dynamic linker will
- bind all undefined references when the file is loaded or launched.
- @item -bundle
- @opindex bundle
- Produce a Mach-o bundle format file.
- See man ld(1) for more information.
- @item -bundle_loader @var{executable}
- @opindex bundle_loader
- This option specifies the @var{executable} that will load the build
- output file being linked. See man ld(1) for more information.
- @item -dynamiclib
- @opindex dynamiclib
- When passed this option, GCC produces a dynamic library instead of
- an executable when linking, using the Darwin @file{libtool} command.
- @item -force_cpusubtype_ALL
- @opindex force_cpusubtype_ALL
- This causes GCC's output file to have the @samp{ALL} subtype, instead of
- one controlled by the @option{-mcpu} or @option{-march} option.
- @item -allowable_client @var{client_name}
- @itemx -client_name
- @itemx -compatibility_version
- @itemx -current_version
- @itemx -dead_strip
- @itemx -dependency-file
- @itemx -dylib_file
- @itemx -dylinker_install_name
- @itemx -dynamic
- @itemx -exported_symbols_list
- @itemx -filelist
- @need 800
- @itemx -flat_namespace
- @itemx -force_flat_namespace
- @itemx -headerpad_max_install_names
- @itemx -image_base
- @itemx -init
- @itemx -install_name
- @itemx -keep_private_externs
- @itemx -multi_module
- @itemx -multiply_defined
- @itemx -multiply_defined_unused
- @need 800
- @itemx -noall_load
- @itemx -no_dead_strip_inits_and_terms
- @itemx -nofixprebinding
- @itemx -nomultidefs
- @itemx -noprebind
- @itemx -noseglinkedit
- @itemx -pagezero_size
- @itemx -prebind
- @itemx -prebind_all_twolevel_modules
- @itemx -private_bundle
- @need 800
- @itemx -read_only_relocs
- @itemx -sectalign
- @itemx -sectobjectsymbols
- @itemx -whyload
- @itemx -seg1addr
- @itemx -sectcreate
- @itemx -sectobjectsymbols
- @itemx -sectorder
- @itemx -segaddr
- @itemx -segs_read_only_addr
- @need 800
- @itemx -segs_read_write_addr
- @itemx -seg_addr_table
- @itemx -seg_addr_table_filename
- @itemx -seglinkedit
- @itemx -segprot
- @itemx -segs_read_only_addr
- @itemx -segs_read_write_addr
- @itemx -single_module
- @itemx -static
- @itemx -sub_library
- @need 800
- @itemx -sub_umbrella
- @itemx -twolevel_namespace
- @itemx -umbrella
- @itemx -undefined
- @itemx -unexported_symbols_list
- @itemx -weak_reference_mismatches
- @itemx -whatsloaded
- @opindex allowable_client
- @opindex client_name
- @opindex compatibility_version
- @opindex current_version
- @opindex dead_strip
- @opindex dependency-file
- @opindex dylib_file
- @opindex dylinker_install_name
- @opindex dynamic
- @opindex exported_symbols_list
- @opindex filelist
- @opindex flat_namespace
- @opindex force_flat_namespace
- @opindex headerpad_max_install_names
- @opindex image_base
- @opindex init
- @opindex install_name
- @opindex keep_private_externs
- @opindex multi_module
- @opindex multiply_defined
- @opindex multiply_defined_unused
- @opindex noall_load
- @opindex no_dead_strip_inits_and_terms
- @opindex nofixprebinding
- @opindex nomultidefs
- @opindex noprebind
- @opindex noseglinkedit
- @opindex pagezero_size
- @opindex prebind
- @opindex prebind_all_twolevel_modules
- @opindex private_bundle
- @opindex read_only_relocs
- @opindex sectalign
- @opindex sectobjectsymbols
- @opindex whyload
- @opindex seg1addr
- @opindex sectcreate
- @opindex sectobjectsymbols
- @opindex sectorder
- @opindex segaddr
- @opindex segs_read_only_addr
- @opindex segs_read_write_addr
- @opindex seg_addr_table
- @opindex seg_addr_table_filename
- @opindex seglinkedit
- @opindex segprot
- @opindex segs_read_only_addr
- @opindex segs_read_write_addr
- @opindex single_module
- @opindex static
- @opindex sub_library
- @opindex sub_umbrella
- @opindex twolevel_namespace
- @opindex umbrella
- @opindex undefined
- @opindex unexported_symbols_list
- @opindex weak_reference_mismatches
- @opindex whatsloaded
- These options are passed to the Darwin linker. The Darwin linker man page
- describes them in detail.
- @end table
- @node DEC Alpha Options
- @subsection DEC Alpha Options
- These @samp{-m} options are defined for the DEC Alpha implementations:
- @table @gcctabopt
- @item -mno-soft-float
- @itemx -msoft-float
- @opindex mno-soft-float
- @opindex msoft-float
- Use (do not use) the hardware floating-point instructions for
- floating-point operations. When @option{-msoft-float} is specified,
- functions in @file{libgcc.a} are used to perform floating-point
- operations. Unless they are replaced by routines that emulate the
- floating-point operations, or compiled in such a way as to call such
- emulations routines, these routines issue floating-point
- operations. If you are compiling for an Alpha without floating-point
- operations, you must ensure that the library is built so as not to call
- them.
- Note that Alpha implementations without floating-point operations are
- required to have floating-point registers.
- @item -mfp-reg
- @itemx -mno-fp-regs
- @opindex mfp-reg
- @opindex mno-fp-regs
- Generate code that uses (does not use) the floating-point register set.
- @option{-mno-fp-regs} implies @option{-msoft-float}. If the floating-point
- register set is not used, floating-point operands are passed in integer
- registers as if they were integers and floating-point results are passed
- in @code{$0} instead of @code{$f0}. This is a non-standard calling sequence,
- so any function with a floating-point argument or return value called by code
- compiled with @option{-mno-fp-regs} must also be compiled with that
- option.
- A typical use of this option is building a kernel that does not use,
- and hence need not save and restore, any floating-point registers.
- @item -mieee
- @opindex mieee
- The Alpha architecture implements floating-point hardware optimized for
- maximum performance. It is mostly compliant with the IEEE floating-point
- standard. However, for full compliance, software assistance is
- required. This option generates code fully IEEE-compliant code
- @emph{except} that the @var{inexact-flag} is not maintained (see below).
- If this option is turned on, the preprocessor macro @code{_IEEE_FP} is
- defined during compilation. The resulting code is less efficient but is
- able to correctly support denormalized numbers and exceptional IEEE
- values such as not-a-number and plus/minus infinity. Other Alpha
- compilers call this option @option{-ieee_with_no_inexact}.
- @item -mieee-with-inexact
- @opindex mieee-with-inexact
- This is like @option{-mieee} except the generated code also maintains
- the IEEE @var{inexact-flag}. Turning on this option causes the
- generated code to implement fully-compliant IEEE math. In addition to
- @code{_IEEE_FP}, @code{_IEEE_FP_EXACT} is defined as a preprocessor
- macro. On some Alpha implementations the resulting code may execute
- significantly slower than the code generated by default. Since there is
- very little code that depends on the @var{inexact-flag}, you should
- normally not specify this option. Other Alpha compilers call this
- option @option{-ieee_with_inexact}.
- @item -mfp-trap-mode=@var{trap-mode}
- @opindex mfp-trap-mode
- This option controls what floating-point related traps are enabled.
- Other Alpha compilers call this option @option{-fptm @var{trap-mode}}.
- The trap mode can be set to one of four values:
- @table @samp
- @item n
- This is the default (normal) setting. The only traps that are enabled
- are the ones that cannot be disabled in software (e.g., division by zero
- trap).
- @item u
- In addition to the traps enabled by @samp{n}, underflow traps are enabled
- as well.
- @item su
- Like @samp{u}, but the instructions are marked to be safe for software
- completion (see Alpha architecture manual for details).
- @item sui
- Like @samp{su}, but inexact traps are enabled as well.
- @end table
- @item -mfp-rounding-mode=@var{rounding-mode}
- @opindex mfp-rounding-mode
- Selects the IEEE rounding mode. Other Alpha compilers call this option
- @option{-fprm @var{rounding-mode}}. The @var{rounding-mode} can be one
- of:
- @table @samp
- @item n
- Normal IEEE rounding mode. Floating-point numbers are rounded towards
- the nearest machine number or towards the even machine number in case
- of a tie.
- @item m
- Round towards minus infinity.
- @item c
- Chopped rounding mode. Floating-point numbers are rounded towards zero.
- @item d
- Dynamic rounding mode. A field in the floating-point control register
- (@var{fpcr}, see Alpha architecture reference manual) controls the
- rounding mode in effect. The C library initializes this register for
- rounding towards plus infinity. Thus, unless your program modifies the
- @var{fpcr}, @samp{d} corresponds to round towards plus infinity.
- @end table
- @item -mtrap-precision=@var{trap-precision}
- @opindex mtrap-precision
- In the Alpha architecture, floating-point traps are imprecise. This
- means without software assistance it is impossible to recover from a
- floating trap and program execution normally needs to be terminated.
- GCC can generate code that can assist operating system trap handlers
- in determining the exact location that caused a floating-point trap.
- Depending on the requirements of an application, different levels of
- precisions can be selected:
- @table @samp
- @item p
- Program precision. This option is the default and means a trap handler
- can only identify which program caused a floating-point exception.
- @item f
- Function precision. The trap handler can determine the function that
- caused a floating-point exception.
- @item i
- Instruction precision. The trap handler can determine the exact
- instruction that caused a floating-point exception.
- @end table
- Other Alpha compilers provide the equivalent options called
- @option{-scope_safe} and @option{-resumption_safe}.
- @item -mieee-conformant
- @opindex mieee-conformant
- This option marks the generated code as IEEE conformant. You must not
- use this option unless you also specify @option{-mtrap-precision=i} and either
- @option{-mfp-trap-mode=su} or @option{-mfp-trap-mode=sui}. Its only effect
- is to emit the line @samp{.eflag 48} in the function prologue of the
- generated assembly file.
- @item -mbuild-constants
- @opindex mbuild-constants
- Normally GCC examines a 32- or 64-bit integer constant to
- see if it can construct it from smaller constants in two or three
- instructions. If it cannot, it outputs the constant as a literal and
- generates code to load it from the data segment at run time.
- Use this option to require GCC to construct @emph{all} integer constants
- using code, even if it takes more instructions (the maximum is six).
- You typically use this option to build a shared library dynamic
- loader. Itself a shared library, it must relocate itself in memory
- before it can find the variables and constants in its own data segment.
- @item -mbwx
- @itemx -mno-bwx
- @itemx -mcix
- @itemx -mno-cix
- @itemx -mfix
- @itemx -mno-fix
- @itemx -mmax
- @itemx -mno-max
- @opindex mbwx
- @opindex mno-bwx
- @opindex mcix
- @opindex mno-cix
- @opindex mfix
- @opindex mno-fix
- @opindex mmax
- @opindex mno-max
- Indicate whether GCC should generate code to use the optional BWX,
- CIX, FIX and MAX instruction sets. The default is to use the instruction
- sets supported by the CPU type specified via @option{-mcpu=} option or that
- of the CPU on which GCC was built if none is specified.
- @item -mfloat-vax
- @itemx -mfloat-ieee
- @opindex mfloat-vax
- @opindex mfloat-ieee
- Generate code that uses (does not use) VAX F and G floating-point
- arithmetic instead of IEEE single and double precision.
- @item -mexplicit-relocs
- @itemx -mno-explicit-relocs
- @opindex mexplicit-relocs
- @opindex mno-explicit-relocs
- Older Alpha assemblers provided no way to generate symbol relocations
- except via assembler macros. Use of these macros does not allow
- optimal instruction scheduling. GNU binutils as of version 2.12
- supports a new syntax that allows the compiler to explicitly mark
- which relocations should apply to which instructions. This option
- is mostly useful for debugging, as GCC detects the capabilities of
- the assembler when it is built and sets the default accordingly.
- @item -msmall-data
- @itemx -mlarge-data
- @opindex msmall-data
- @opindex mlarge-data
- When @option{-mexplicit-relocs} is in effect, static data is
- accessed via @dfn{gp-relative} relocations. When @option{-msmall-data}
- is used, objects 8 bytes long or smaller are placed in a @dfn{small data area}
- (the @code{.sdata} and @code{.sbss} sections) and are accessed via
- 16-bit relocations off of the @code{$gp} register. This limits the
- size of the small data area to 64KB, but allows the variables to be
- directly accessed via a single instruction.
- The default is @option{-mlarge-data}. With this option the data area
- is limited to just below 2GB@. Programs that require more than 2GB of
- data must use @code{malloc} or @code{mmap} to allocate the data in the
- heap instead of in the program's data segment.
- When generating code for shared libraries, @option{-fpic} implies
- @option{-msmall-data} and @option{-fPIC} implies @option{-mlarge-data}.
- @item -msmall-text
- @itemx -mlarge-text
- @opindex msmall-text
- @opindex mlarge-text
- When @option{-msmall-text} is used, the compiler assumes that the
- code of the entire program (or shared library) fits in 4MB, and is
- thus reachable with a branch instruction. When @option{-msmall-data}
- is used, the compiler can assume that all local symbols share the
- same @code{$gp} value, and thus reduce the number of instructions
- required for a function call from 4 to 1.
- The default is @option{-mlarge-text}.
- @item -mcpu=@var{cpu_type}
- @opindex mcpu
- Set the instruction set and instruction scheduling parameters for
- machine type @var{cpu_type}. You can specify either the @samp{EV}
- style name or the corresponding chip number. GCC supports scheduling
- parameters for the EV4, EV5 and EV6 family of processors and
- chooses the default values for the instruction set from the processor
- you specify. If you do not specify a processor type, GCC defaults
- to the processor on which the compiler was built.
- Supported values for @var{cpu_type} are
- @table @samp
- @item ev4
- @itemx ev45
- @itemx 21064
- Schedules as an EV4 and has no instruction set extensions.
- @item ev5
- @itemx 21164
- Schedules as an EV5 and has no instruction set extensions.
- @item ev56
- @itemx 21164a
- Schedules as an EV5 and supports the BWX extension.
- @item pca56
- @itemx 21164pc
- @itemx 21164PC
- Schedules as an EV5 and supports the BWX and MAX extensions.
- @item ev6
- @itemx 21264
- Schedules as an EV6 and supports the BWX, FIX, and MAX extensions.
- @item ev67
- @itemx 21264a
- Schedules as an EV6 and supports the BWX, CIX, FIX, and MAX extensions.
- @end table
- Native toolchains also support the value @samp{native},
- which selects the best architecture option for the host processor.
- @option{-mcpu=native} has no effect if GCC does not recognize
- the processor.
- @item -mtune=@var{cpu_type}
- @opindex mtune
- Set only the instruction scheduling parameters for machine type
- @var{cpu_type}. The instruction set is not changed.
- Native toolchains also support the value @samp{native},
- which selects the best architecture option for the host processor.
- @option{-mtune=native} has no effect if GCC does not recognize
- the processor.
- @item -mmemory-latency=@var{time}
- @opindex mmemory-latency
- Sets the latency the scheduler should assume for typical memory
- references as seen by the application. This number is highly
- dependent on the memory access patterns used by the application
- and the size of the external cache on the machine.
- Valid options for @var{time} are
- @table @samp
- @item @var{number}
- A decimal number representing clock cycles.
- @item L1
- @itemx L2
- @itemx L3
- @itemx main
- The compiler contains estimates of the number of clock cycles for
- ``typical'' EV4 & EV5 hardware for the Level 1, 2 & 3 caches
- (also called Dcache, Scache, and Bcache), as well as to main memory.
- Note that L3 is only valid for EV5.
- @end table
- @end table
- @node FR30 Options
- @subsection FR30 Options
- @cindex FR30 Options
- These options are defined specifically for the FR30 port.
- @table @gcctabopt
- @item -msmall-model
- @opindex msmall-model
- Use the small address space model. This can produce smaller code, but
- it does assume that all symbolic values and addresses fit into a
- 20-bit range.
- @item -mno-lsim
- @opindex mno-lsim
- Assume that runtime support has been provided and so there is no need
- to include the simulator library (@file{libsim.a}) on the linker
- command line.
- @end table
- @node FRV Options
- @subsection FRV Options
- @cindex FRV Options
- @table @gcctabopt
- @item -mgpr-32
- @opindex mgpr-32
- Only use the first 32 general-purpose registers.
- @item -mgpr-64
- @opindex mgpr-64
- Use all 64 general-purpose registers.
- @item -mfpr-32
- @opindex mfpr-32
- Use only the first 32 floating-point registers.
- @item -mfpr-64
- @opindex mfpr-64
- Use all 64 floating-point registers.
- @item -mhard-float
- @opindex mhard-float
- Use hardware instructions for floating-point operations.
- @item -msoft-float
- @opindex msoft-float
- Use library routines for floating-point operations.
- @item -malloc-cc
- @opindex malloc-cc
- Dynamically allocate condition code registers.
- @item -mfixed-cc
- @opindex mfixed-cc
- Do not try to dynamically allocate condition code registers, only
- use @code{icc0} and @code{fcc0}.
- @item -mdword
- @opindex mdword
- Change ABI to use double word insns.
- @item -mno-dword
- @opindex mno-dword
- Do not use double word instructions.
- @item -mdouble
- @opindex mdouble
- Use floating-point double instructions.
- @item -mno-double
- @opindex mno-double
- Do not use floating-point double instructions.
- @item -mmedia
- @opindex mmedia
- Use media instructions.
- @item -mno-media
- @opindex mno-media
- Do not use media instructions.
- @item -mmuladd
- @opindex mmuladd
- Use multiply and add/subtract instructions.
- @item -mno-muladd
- @opindex mno-muladd
- Do not use multiply and add/subtract instructions.
- @item -mfdpic
- @opindex mfdpic
- Select the FDPIC ABI, which uses function descriptors to represent
- pointers to functions. Without any PIC/PIE-related options, it
- implies @option{-fPIE}. With @option{-fpic} or @option{-fpie}, it
- assumes GOT entries and small data are within a 12-bit range from the
- GOT base address; with @option{-fPIC} or @option{-fPIE}, GOT offsets
- are computed with 32 bits.
- With a @samp{bfin-elf} target, this option implies @option{-msim}.
- @item -minline-plt
- @opindex minline-plt
- Enable inlining of PLT entries in function calls to functions that are
- not known to bind locally. It has no effect without @option{-mfdpic}.
- It's enabled by default if optimizing for speed and compiling for
- shared libraries (i.e., @option{-fPIC} or @option{-fpic}), or when an
- optimization option such as @option{-O3} or above is present in the
- command line.
- @item -mTLS
- @opindex mTLS
- Assume a large TLS segment when generating thread-local code.
- @item -mtls
- @opindex mtls
- Do not assume a large TLS segment when generating thread-local code.
- @item -mgprel-ro
- @opindex mgprel-ro
- Enable the use of @code{GPREL} relocations in the FDPIC ABI for data
- that is known to be in read-only sections. It's enabled by default,
- except for @option{-fpic} or @option{-fpie}: even though it may help
- make the global offset table smaller, it trades 1 instruction for 4.
- With @option{-fPIC} or @option{-fPIE}, it trades 3 instructions for 4,
- one of which may be shared by multiple symbols, and it avoids the need
- for a GOT entry for the referenced symbol, so it's more likely to be a
- win. If it is not, @option{-mno-gprel-ro} can be used to disable it.
- @item -multilib-library-pic
- @opindex multilib-library-pic
- Link with the (library, not FD) pic libraries. It's implied by
- @option{-mlibrary-pic}, as well as by @option{-fPIC} and
- @option{-fpic} without @option{-mfdpic}. You should never have to use
- it explicitly.
- @item -mlinked-fp
- @opindex mlinked-fp
- Follow the EABI requirement of always creating a frame pointer whenever
- a stack frame is allocated. This option is enabled by default and can
- be disabled with @option{-mno-linked-fp}.
- @item -mlong-calls
- @opindex mlong-calls
- Use indirect addressing to call functions outside the current
- compilation unit. This allows the functions to be placed anywhere
- within the 32-bit address space.
- @item -malign-labels
- @opindex malign-labels
- Try to align labels to an 8-byte boundary by inserting NOPs into the
- previous packet. This option only has an effect when VLIW packing
- is enabled. It doesn't create new packets; it merely adds NOPs to
- existing ones.
- @item -mlibrary-pic
- @opindex mlibrary-pic
- Generate position-independent EABI code.
- @item -macc-4
- @opindex macc-4
- Use only the first four media accumulator registers.
- @item -macc-8
- @opindex macc-8
- Use all eight media accumulator registers.
- @item -mpack
- @opindex mpack
- Pack VLIW instructions.
- @item -mno-pack
- @opindex mno-pack
- Do not pack VLIW instructions.
- @item -mno-eflags
- @opindex mno-eflags
- Do not mark ABI switches in e_flags.
- @item -mcond-move
- @opindex mcond-move
- Enable the use of conditional-move instructions (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-cond-move
- @opindex mno-cond-move
- Disable the use of conditional-move instructions.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mscc
- @opindex mscc
- Enable the use of conditional set instructions (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-scc
- @opindex mno-scc
- Disable the use of conditional set instructions.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mcond-exec
- @opindex mcond-exec
- Enable the use of conditional execution (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-cond-exec
- @opindex mno-cond-exec
- Disable the use of conditional execution.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mvliw-branch
- @opindex mvliw-branch
- Run a pass to pack branches into VLIW instructions (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-vliw-branch
- @opindex mno-vliw-branch
- Do not run a pass to pack branches into VLIW instructions.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mmulti-cond-exec
- @opindex mmulti-cond-exec
- Enable optimization of @code{&&} and @code{||} in conditional execution
- (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-multi-cond-exec
- @opindex mno-multi-cond-exec
- Disable optimization of @code{&&} and @code{||} in conditional execution.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mnested-cond-exec
- @opindex mnested-cond-exec
- Enable nested conditional execution optimizations (default).
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -mno-nested-cond-exec
- @opindex mno-nested-cond-exec
- Disable nested conditional execution optimizations.
- This switch is mainly for debugging the compiler and will likely be removed
- in a future version.
- @item -moptimize-membar
- @opindex moptimize-membar
- This switch removes redundant @code{membar} instructions from the
- compiler-generated code. It is enabled by default.
- @item -mno-optimize-membar
- @opindex mno-optimize-membar
- This switch disables the automatic removal of redundant @code{membar}
- instructions from the generated code.
- @item -mtomcat-stats
- @opindex mtomcat-stats
- Cause gas to print out tomcat statistics.
- @item -mcpu=@var{cpu}
- @opindex mcpu
- Select the processor type for which to generate code. Possible values are
- @samp{frv}, @samp{fr550}, @samp{tomcat}, @samp{fr500}, @samp{fr450},
- @samp{fr405}, @samp{fr400}, @samp{fr300} and @samp{simple}.
- @end table
- @node GNU/Linux Options
- @subsection GNU/Linux Options
- These @samp{-m} options are defined for GNU/Linux targets:
- @table @gcctabopt
- @item -mglibc
- @opindex mglibc
- Use the GNU C library. This is the default except
- on @samp{*-*-linux-*uclibc*} and @samp{*-*-linux-*android*} targets.
- @item -muclibc
- @opindex muclibc
- Use uClibc C library. This is the default on
- @samp{*-*-linux-*uclibc*} targets.
- @item -mbionic
- @opindex mbionic
- Use Bionic C library. This is the default on
- @samp{*-*-linux-*android*} targets.
- @item -mandroid
- @opindex mandroid
- Compile code compatible with Android platform. This is the default on
- @samp{*-*-linux-*android*} targets.
- When compiling, this option enables @option{-mbionic}, @option{-fPIC},
- @option{-fno-exceptions} and @option{-fno-rtti} by default. When linking,
- this option makes the GCC driver pass Android-specific options to the linker.
- Finally, this option causes the preprocessor macro @code{__ANDROID__}
- to be defined.
- @item -tno-android-cc
- @opindex tno-android-cc
- Disable compilation effects of @option{-mandroid}, i.e., do not enable
- @option{-mbionic}, @option{-fPIC}, @option{-fno-exceptions} and
- @option{-fno-rtti} by default.
- @item -tno-android-ld
- @opindex tno-android-ld
- Disable linking effects of @option{-mandroid}, i.e., pass standard Linux
- linking options to the linker.
- @end table
- @node H8/300 Options
- @subsection H8/300 Options
- These @samp{-m} options are defined for the H8/300 implementations:
- @table @gcctabopt
- @item -mrelax
- @opindex mrelax
- Shorten some address references at link time, when possible; uses the
- linker option @option{-relax}. @xref{H8/300,, @code{ld} and the H8/300,
- ld, Using ld}, for a fuller description.
- @item -mh
- @opindex mh
- Generate code for the H8/300H@.
- @item -ms
- @opindex ms
- Generate code for the H8S@.
- @item -mn
- @opindex mn
- Generate code for the H8S and H8/300H in the normal mode. This switch
- must be used either with @option{-mh} or @option{-ms}.
- @item -ms2600
- @opindex ms2600
- Generate code for the H8S/2600. This switch must be used with @option{-ms}.
- @item -mexr
- @opindex mexr
- Extended registers are stored on stack before execution of function
- with monitor attribute. Default option is @option{-mexr}.
- This option is valid only for H8S targets.
- @item -mno-exr
- @opindex mno-exr
- Extended registers are not stored on stack before execution of function
- with monitor attribute. Default option is @option{-mno-exr}.
- This option is valid only for H8S targets.
- @item -mint32
- @opindex mint32
- Make @code{int} data 32 bits by default.
- @item -malign-300
- @opindex malign-300
- On the H8/300H and H8S, use the same alignment rules as for the H8/300.
- The default for the H8/300H and H8S is to align longs and floats on
- 4-byte boundaries.
- @option{-malign-300} causes them to be aligned on 2-byte boundaries.
- This option has no effect on the H8/300.
- @end table
- @node HPPA Options
- @subsection HPPA Options
- @cindex HPPA Options
- These @samp{-m} options are defined for the HPPA family of computers:
- @table @gcctabopt
- @item -march=@var{architecture-type}
- @opindex march
- Generate code for the specified architecture. The choices for
- @var{architecture-type} are @samp{1.0} for PA 1.0, @samp{1.1} for PA
- 1.1, and @samp{2.0} for PA 2.0 processors. Refer to
- @file{/usr/lib/sched.models} on an HP-UX system to determine the proper
- architecture option for your machine. Code compiled for lower numbered
- architectures runs on higher numbered architectures, but not the
- other way around.
- @item -mpa-risc-1-0
- @itemx -mpa-risc-1-1
- @itemx -mpa-risc-2-0
- @opindex mpa-risc-1-0
- @opindex mpa-risc-1-1
- @opindex mpa-risc-2-0
- Synonyms for @option{-march=1.0}, @option{-march=1.1}, and @option{-march=2.0} respectively.
- @item -mjump-in-delay
- @opindex mjump-in-delay
- This option is ignored and provided for compatibility purposes only.
- @item -mdisable-fpregs
- @opindex mdisable-fpregs
- Prevent floating-point registers from being used in any manner. This is
- necessary for compiling kernels that perform lazy context switching of
- floating-point registers. If you use this option and attempt to perform
- floating-point operations, the compiler aborts.
- @item -mdisable-indexing
- @opindex mdisable-indexing
- Prevent the compiler from using indexing address modes. This avoids some
- rather obscure problems when compiling MIG generated code under MACH@.
- @item -mno-space-regs
- @opindex mno-space-regs
- Generate code that assumes the target has no space registers. This allows
- GCC to generate faster indirect calls and use unscaled index address modes.
- Such code is suitable for level 0 PA systems and kernels.
- @item -mfast-indirect-calls
- @opindex mfast-indirect-calls
- Generate code that assumes calls never cross space boundaries. This
- allows GCC to emit code that performs faster indirect calls.
- This option does not work in the presence of shared libraries or nested
- functions.
- @item -mfixed-range=@var{register-range}
- @opindex mfixed-range
- Generate code treating the given register range as fixed registers.
- A fixed register is one that the register allocator cannot use. This is
- useful when compiling kernel code. A register range is specified as
- two registers separated by a dash. Multiple register ranges can be
- specified separated by a comma.
- @item -mlong-load-store
- @opindex mlong-load-store
- Generate 3-instruction load and store sequences as sometimes required by
- the HP-UX 10 linker. This is equivalent to the @samp{+k} option to
- the HP compilers.
- @item -mportable-runtime
- @opindex mportable-runtime
- Use the portable calling conventions proposed by HP for ELF systems.
- @item -mgas
- @opindex mgas
- Enable the use of assembler directives only GAS understands.
- @item -mschedule=@var{cpu-type}
- @opindex mschedule
- Schedule code according to the constraints for the machine type
- @var{cpu-type}. The choices for @var{cpu-type} are @samp{700}
- @samp{7100}, @samp{7100LC}, @samp{7200}, @samp{7300} and @samp{8000}. Refer
- to @file{/usr/lib/sched.models} on an HP-UX system to determine the
- proper scheduling option for your machine. The default scheduling is
- @samp{8000}.
- @item -mlinker-opt
- @opindex mlinker-opt
- Enable the optimization pass in the HP-UX linker. Note this makes symbolic
- debugging impossible. It also triggers a bug in the HP-UX 8 and HP-UX 9
- linkers in which they give bogus error messages when linking some programs.
- @item -msoft-float
- @opindex msoft-float
- Generate output containing library calls for floating point.
- @strong{Warning:} the requisite libraries are not available for all HPPA
- targets. Normally the facilities of the machine's usual C compiler are
- used, but this cannot be done directly in cross-compilation. You must make
- your own arrangements to provide suitable library functions for
- cross-compilation.
- @option{-msoft-float} changes the calling convention in the output file;
- therefore, it is only useful if you compile @emph{all} of a program with
- this option. In particular, you need to compile @file{libgcc.a}, the
- library that comes with GCC, with @option{-msoft-float} in order for
- this to work.
- @item -msio
- @opindex msio
- Generate the predefine, @code{_SIO}, for server IO@. The default is
- @option{-mwsio}. This generates the predefines, @code{__hp9000s700},
- @code{__hp9000s700__} and @code{_WSIO}, for workstation IO@. These
- options are available under HP-UX and HI-UX@.
- @item -mgnu-ld
- @opindex mgnu-ld
- Use options specific to GNU @command{ld}.
- This passes @option{-shared} to @command{ld} when
- building a shared library. It is the default when GCC is configured,
- explicitly or implicitly, with the GNU linker. This option does not
- affect which @command{ld} is called; it only changes what parameters
- are passed to that @command{ld}.
- The @command{ld} that is called is determined by the
- @option{--with-ld} configure option, GCC's program search path, and
- finally by the user's @env{PATH}. The linker used by GCC can be printed
- using @samp{which `gcc -print-prog-name=ld`}. This option is only available
- on the 64-bit HP-UX GCC, i.e.@: configured with @samp{hppa*64*-*-hpux*}.
- @item -mhp-ld
- @opindex mhp-ld
- Use options specific to HP @command{ld}.
- This passes @option{-b} to @command{ld} when building
- a shared library and passes @option{+Accept TypeMismatch} to @command{ld} on all
- links. It is the default when GCC is configured, explicitly or
- implicitly, with the HP linker. This option does not affect
- which @command{ld} is called; it only changes what parameters are passed to that
- @command{ld}.
- The @command{ld} that is called is determined by the @option{--with-ld}
- configure option, GCC's program search path, and finally by the user's
- @env{PATH}. The linker used by GCC can be printed using @samp{which
- `gcc -print-prog-name=ld`}. This option is only available on the 64-bit
- HP-UX GCC, i.e.@: configured with @samp{hppa*64*-*-hpux*}.
- @item -mlong-calls
- @opindex mno-long-calls
- Generate code that uses long call sequences. This ensures that a call
- is always able to reach linker generated stubs. The default is to generate
- long calls only when the distance from the call site to the beginning
- of the function or translation unit, as the case may be, exceeds a
- predefined limit set by the branch type being used. The limits for
- normal calls are 7,600,000 and 240,000 bytes, respectively for the
- PA 2.0 and PA 1.X architectures. Sibcalls are always limited at
- 240,000 bytes.
- Distances are measured from the beginning of functions when using the
- @option{-ffunction-sections} option, or when using the @option{-mgas}
- and @option{-mno-portable-runtime} options together under HP-UX with
- the SOM linker.
- It is normally not desirable to use this option as it degrades
- performance. However, it may be useful in large applications,
- particularly when partial linking is used to build the application.
- The types of long calls used depends on the capabilities of the
- assembler and linker, and the type of code being generated. The
- impact on systems that support long absolute calls, and long pic
- symbol-difference or pc-relative calls should be relatively small.
- However, an indirect call is used on 32-bit ELF systems in pic code
- and it is quite long.
- @item -munix=@var{unix-std}
- @opindex march
- Generate compiler predefines and select a startfile for the specified
- UNIX standard. The choices for @var{unix-std} are @samp{93}, @samp{95}
- and @samp{98}. @samp{93} is supported on all HP-UX versions. @samp{95}
- is available on HP-UX 10.10 and later. @samp{98} is available on HP-UX
- 11.11 and later. The default values are @samp{93} for HP-UX 10.00,
- @samp{95} for HP-UX 10.10 though to 11.00, and @samp{98} for HP-UX 11.11
- and later.
- @option{-munix=93} provides the same predefines as GCC 3.3 and 3.4.
- @option{-munix=95} provides additional predefines for @code{XOPEN_UNIX}
- and @code{_XOPEN_SOURCE_EXTENDED}, and the startfile @file{unix95.o}.
- @option{-munix=98} provides additional predefines for @code{_XOPEN_UNIX},
- @code{_XOPEN_SOURCE_EXTENDED}, @code{_INCLUDE__STDC_A1_SOURCE} and
- @code{_INCLUDE_XOPEN_SOURCE_500}, and the startfile @file{unix98.o}.
- It is @emph{important} to note that this option changes the interfaces
- for various library routines. It also affects the operational behavior
- of the C library. Thus, @emph{extreme} care is needed in using this
- option.
- Library code that is intended to operate with more than one UNIX
- standard must test, set and restore the variable @code{__xpg4_extended_mask}
- as appropriate. Most GNU software doesn't provide this capability.
- @item -nolibdld
- @opindex nolibdld
- Suppress the generation of link options to search libdld.sl when the
- @option{-static} option is specified on HP-UX 10 and later.
- @item -static
- @opindex static
- The HP-UX implementation of setlocale in libc has a dependency on
- libdld.sl. There isn't an archive version of libdld.sl. Thus,
- when the @option{-static} option is specified, special link options
- are needed to resolve this dependency.
- On HP-UX 10 and later, the GCC driver adds the necessary options to
- link with libdld.sl when the @option{-static} option is specified.
- This causes the resulting binary to be dynamic. On the 64-bit port,
- the linkers generate dynamic binaries by default in any case. The
- @option{-nolibdld} option can be used to prevent the GCC driver from
- adding these link options.
- @item -threads
- @opindex threads
- Add support for multithreading with the @dfn{dce thread} library
- under HP-UX@. This option sets flags for both the preprocessor and
- linker.
- @end table
- @node IA-64 Options
- @subsection IA-64 Options
- @cindex IA-64 Options
- These are the @samp{-m} options defined for the Intel IA-64 architecture.
- @table @gcctabopt
- @item -mbig-endian
- @opindex mbig-endian
- Generate code for a big-endian target. This is the default for HP-UX@.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate code for a little-endian target. This is the default for AIX5
- and GNU/Linux.
- @item -mgnu-as
- @itemx -mno-gnu-as
- @opindex mgnu-as
- @opindex mno-gnu-as
- Generate (or don't) code for the GNU assembler. This is the default.
- @c Also, this is the default if the configure option @option{--with-gnu-as}
- @c is used.
- @item -mgnu-ld
- @itemx -mno-gnu-ld
- @opindex mgnu-ld
- @opindex mno-gnu-ld
- Generate (or don't) code for the GNU linker. This is the default.
- @c Also, this is the default if the configure option @option{--with-gnu-ld}
- @c is used.
- @item -mno-pic
- @opindex mno-pic
- Generate code that does not use a global pointer register. The result
- is not position independent code, and violates the IA-64 ABI@.
- @item -mvolatile-asm-stop
- @itemx -mno-volatile-asm-stop
- @opindex mvolatile-asm-stop
- @opindex mno-volatile-asm-stop
- Generate (or don't) a stop bit immediately before and after volatile asm
- statements.
- @item -mregister-names
- @itemx -mno-register-names
- @opindex mregister-names
- @opindex mno-register-names
- Generate (or don't) @samp{in}, @samp{loc}, and @samp{out} register names for
- the stacked registers. This may make assembler output more readable.
- @item -mno-sdata
- @itemx -msdata
- @opindex mno-sdata
- @opindex msdata
- Disable (or enable) optimizations that use the small data section. This may
- be useful for working around optimizer bugs.
- @item -mconstant-gp
- @opindex mconstant-gp
- Generate code that uses a single constant global pointer value. This is
- useful when compiling kernel code.
- @item -mauto-pic
- @opindex mauto-pic
- Generate code that is self-relocatable. This implies @option{-mconstant-gp}.
- This is useful when compiling firmware code.
- @item -minline-float-divide-min-latency
- @opindex minline-float-divide-min-latency
- Generate code for inline divides of floating-point values
- using the minimum latency algorithm.
- @item -minline-float-divide-max-throughput
- @opindex minline-float-divide-max-throughput
- Generate code for inline divides of floating-point values
- using the maximum throughput algorithm.
- @item -mno-inline-float-divide
- @opindex mno-inline-float-divide
- Do not generate inline code for divides of floating-point values.
- @item -minline-int-divide-min-latency
- @opindex minline-int-divide-min-latency
- Generate code for inline divides of integer values
- using the minimum latency algorithm.
- @item -minline-int-divide-max-throughput
- @opindex minline-int-divide-max-throughput
- Generate code for inline divides of integer values
- using the maximum throughput algorithm.
- @item -mno-inline-int-divide
- @opindex mno-inline-int-divide
- Do not generate inline code for divides of integer values.
- @item -minline-sqrt-min-latency
- @opindex minline-sqrt-min-latency
- Generate code for inline square roots
- using the minimum latency algorithm.
- @item -minline-sqrt-max-throughput
- @opindex minline-sqrt-max-throughput
- Generate code for inline square roots
- using the maximum throughput algorithm.
- @item -mno-inline-sqrt
- @opindex mno-inline-sqrt
- Do not generate inline code for @code{sqrt}.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Do (don't) generate code that uses the fused multiply/add or multiply/subtract
- instructions. The default is to use these instructions.
- @item -mno-dwarf2-asm
- @itemx -mdwarf2-asm
- @opindex mno-dwarf2-asm
- @opindex mdwarf2-asm
- Don't (or do) generate assembler code for the DWARF 2 line number debugging
- info. This may be useful when not using the GNU assembler.
- @item -mearly-stop-bits
- @itemx -mno-early-stop-bits
- @opindex mearly-stop-bits
- @opindex mno-early-stop-bits
- Allow stop bits to be placed earlier than immediately preceding the
- instruction that triggered the stop bit. This can improve instruction
- scheduling, but does not always do so.
- @item -mfixed-range=@var{register-range}
- @opindex mfixed-range
- Generate code treating the given register range as fixed registers.
- A fixed register is one that the register allocator cannot use. This is
- useful when compiling kernel code. A register range is specified as
- two registers separated by a dash. Multiple register ranges can be
- specified separated by a comma.
- @item -mtls-size=@var{tls-size}
- @opindex mtls-size
- Specify bit size of immediate TLS offsets. Valid values are 14, 22, and
- 64.
- @item -mtune=@var{cpu-type}
- @opindex mtune
- Tune the instruction scheduling for a particular CPU, Valid values are
- @samp{itanium}, @samp{itanium1}, @samp{merced}, @samp{itanium2},
- and @samp{mckinley}.
- @item -milp32
- @itemx -mlp64
- @opindex milp32
- @opindex mlp64
- Generate code for a 32-bit or 64-bit environment.
- The 32-bit environment sets int, long and pointer to 32 bits.
- The 64-bit environment sets int to 32 bits and long and pointer
- to 64 bits. These are HP-UX specific flags.
- @item -mno-sched-br-data-spec
- @itemx -msched-br-data-spec
- @opindex mno-sched-br-data-spec
- @opindex msched-br-data-spec
- (Dis/En)able data speculative scheduling before reload.
- This results in generation of @code{ld.a} instructions and
- the corresponding check instructions (@code{ld.c} / @code{chk.a}).
- The default is 'disable'.
- @item -msched-ar-data-spec
- @itemx -mno-sched-ar-data-spec
- @opindex msched-ar-data-spec
- @opindex mno-sched-ar-data-spec
- (En/Dis)able data speculative scheduling after reload.
- This results in generation of @code{ld.a} instructions and
- the corresponding check instructions (@code{ld.c} / @code{chk.a}).
- The default is 'enable'.
- @item -mno-sched-control-spec
- @itemx -msched-control-spec
- @opindex mno-sched-control-spec
- @opindex msched-control-spec
- (Dis/En)able control speculative scheduling. This feature is
- available only during region scheduling (i.e.@: before reload).
- This results in generation of the @code{ld.s} instructions and
- the corresponding check instructions @code{chk.s}.
- The default is 'disable'.
- @item -msched-br-in-data-spec
- @itemx -mno-sched-br-in-data-spec
- @opindex msched-br-in-data-spec
- @opindex mno-sched-br-in-data-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the data speculative loads before reload.
- This is effective only with @option{-msched-br-data-spec} enabled.
- The default is 'enable'.
- @item -msched-ar-in-data-spec
- @itemx -mno-sched-ar-in-data-spec
- @opindex msched-ar-in-data-spec
- @opindex mno-sched-ar-in-data-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the data speculative loads after reload.
- This is effective only with @option{-msched-ar-data-spec} enabled.
- The default is 'enable'.
- @item -msched-in-control-spec
- @itemx -mno-sched-in-control-spec
- @opindex msched-in-control-spec
- @opindex mno-sched-in-control-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the control speculative loads.
- This is effective only with @option{-msched-control-spec} enabled.
- The default is 'enable'.
- @item -mno-sched-prefer-non-data-spec-insns
- @itemx -msched-prefer-non-data-spec-insns
- @opindex mno-sched-prefer-non-data-spec-insns
- @opindex msched-prefer-non-data-spec-insns
- If enabled, data-speculative instructions are chosen for schedule
- only if there are no other choices at the moment. This makes
- the use of the data speculation much more conservative.
- The default is 'disable'.
- @item -mno-sched-prefer-non-control-spec-insns
- @itemx -msched-prefer-non-control-spec-insns
- @opindex mno-sched-prefer-non-control-spec-insns
- @opindex msched-prefer-non-control-spec-insns
- If enabled, control-speculative instructions are chosen for schedule
- only if there are no other choices at the moment. This makes
- the use of the control speculation much more conservative.
- The default is 'disable'.
- @item -mno-sched-count-spec-in-critical-path
- @itemx -msched-count-spec-in-critical-path
- @opindex mno-sched-count-spec-in-critical-path
- @opindex msched-count-spec-in-critical-path
- If enabled, speculative dependencies are considered during
- computation of the instructions priorities. This makes the use of the
- speculation a bit more conservative.
- The default is 'disable'.
- @item -msched-spec-ldc
- @opindex msched-spec-ldc
- Use a simple data speculation check. This option is on by default.
- @item -msched-control-spec-ldc
- @opindex msched-spec-ldc
- Use a simple check for control speculation. This option is on by default.
- @item -msched-stop-bits-after-every-cycle
- @opindex msched-stop-bits-after-every-cycle
- Place a stop bit after every cycle when scheduling. This option is on
- by default.
- @item -msched-fp-mem-deps-zero-cost
- @opindex msched-fp-mem-deps-zero-cost
- Assume that floating-point stores and loads are not likely to cause a conflict
- when placed into the same instruction group. This option is disabled by
- default.
- @item -msel-sched-dont-check-control-spec
- @opindex msel-sched-dont-check-control-spec
- Generate checks for control speculation in selective scheduling.
- This flag is disabled by default.
- @item -msched-max-memory-insns=@var{max-insns}
- @opindex msched-max-memory-insns
- Limit on the number of memory insns per instruction group, giving lower
- priority to subsequent memory insns attempting to schedule in the same
- instruction group. Frequently useful to prevent cache bank conflicts.
- The default value is 1.
- @item -msched-max-memory-insns-hard-limit
- @opindex msched-max-memory-insns-hard-limit
- Makes the limit specified by @option{msched-max-memory-insns} a hard limit,
- disallowing more than that number in an instruction group.
- Otherwise, the limit is ``soft'', meaning that non-memory operations
- are preferred when the limit is reached, but memory operations may still
- be scheduled.
- @end table
- @node LM32 Options
- @subsection LM32 Options
- @cindex LM32 options
- These @option{-m} options are defined for the LatticeMico32 architecture:
- @table @gcctabopt
- @item -mbarrel-shift-enabled
- @opindex mbarrel-shift-enabled
- Enable barrel-shift instructions.
- @item -mdivide-enabled
- @opindex mdivide-enabled
- Enable divide and modulus instructions.
- @item -mmultiply-enabled
- @opindex multiply-enabled
- Enable multiply instructions.
- @item -msign-extend-enabled
- @opindex msign-extend-enabled
- Enable sign extend instructions.
- @item -muser-enabled
- @opindex muser-enabled
- Enable user-defined instructions.
- @end table
- @node M32C Options
- @subsection M32C Options
- @cindex M32C options
- @table @gcctabopt
- @item -mcpu=@var{name}
- @opindex mcpu=
- Select the CPU for which code is generated. @var{name} may be one of
- @samp{r8c} for the R8C/Tiny series, @samp{m16c} for the M16C (up to
- /60) series, @samp{m32cm} for the M16C/80 series, or @samp{m32c} for
- the M32C/80 series.
- @item -msim
- @opindex msim
- Specifies that the program will be run on the simulator. This causes
- an alternate runtime library to be linked in which supports, for
- example, file I/O@. You must not use this option when generating
- programs that will run on real hardware; you must provide your own
- runtime library for whatever I/O functions are needed.
- @item -memregs=@var{number}
- @opindex memregs=
- Specifies the number of memory-based pseudo-registers GCC uses
- during code generation. These pseudo-registers are used like real
- registers, so there is a tradeoff between GCC's ability to fit the
- code into available registers, and the performance penalty of using
- memory instead of registers. Note that all modules in a program must
- be compiled with the same value for this option. Because of that, you
- must not use this option with GCC's default runtime libraries.
- @end table
- @node M32R/D Options
- @subsection M32R/D Options
- @cindex M32R/D options
- These @option{-m} options are defined for Renesas M32R/D architectures:
- @table @gcctabopt
- @item -m32r2
- @opindex m32r2
- Generate code for the M32R/2@.
- @item -m32rx
- @opindex m32rx
- Generate code for the M32R/X@.
- @item -m32r
- @opindex m32r
- Generate code for the M32R@. This is the default.
- @item -mmodel=small
- @opindex mmodel=small
- Assume all objects live in the lower 16MB of memory (so that their addresses
- can be loaded with the @code{ld24} instruction), and assume all subroutines
- are reachable with the @code{bl} instruction.
- This is the default.
- The addressability of a particular object can be set with the
- @code{model} attribute.
- @item -mmodel=medium
- @opindex mmodel=medium
- Assume objects may be anywhere in the 32-bit address space (the compiler
- generates @code{seth/add3} instructions to load their addresses), and
- assume all subroutines are reachable with the @code{bl} instruction.
- @item -mmodel=large
- @opindex mmodel=large
- Assume objects may be anywhere in the 32-bit address space (the compiler
- generates @code{seth/add3} instructions to load their addresses), and
- assume subroutines may not be reachable with the @code{bl} instruction
- (the compiler generates the much slower @code{seth/add3/jl}
- instruction sequence).
- @item -msdata=none
- @opindex msdata=none
- Disable use of the small data area. Variables are put into
- one of @code{.data}, @code{.bss}, or @code{.rodata} (unless the
- @code{section} attribute has been specified).
- This is the default.
- The small data area consists of sections @code{.sdata} and @code{.sbss}.
- Objects may be explicitly put in the small data area with the
- @code{section} attribute using one of these sections.
- @item -msdata=sdata
- @opindex msdata=sdata
- Put small global and static data in the small data area, but do not
- generate special code to reference them.
- @item -msdata=use
- @opindex msdata=use
- Put small global and static data in the small data area, and generate
- special instructions to reference them.
- @item -G @var{num}
- @opindex G
- @cindex smaller data references
- Put global and static objects less than or equal to @var{num} bytes
- into the small data or BSS sections instead of the normal data or BSS
- sections. The default value of @var{num} is 8.
- The @option{-msdata} option must be set to one of @samp{sdata} or @samp{use}
- for this option to have any effect.
- All modules should be compiled with the same @option{-G @var{num}} value.
- Compiling with different values of @var{num} may or may not work; if it
- doesn't the linker gives an error message---incorrect code is not
- generated.
- @item -mdebug
- @opindex mdebug
- Makes the M32R-specific code in the compiler display some statistics
- that might help in debugging programs.
- @item -malign-loops
- @opindex malign-loops
- Align all loops to a 32-byte boundary.
- @item -mno-align-loops
- @opindex mno-align-loops
- Do not enforce a 32-byte alignment for loops. This is the default.
- @item -missue-rate=@var{number}
- @opindex missue-rate=@var{number}
- Issue @var{number} instructions per cycle. @var{number} can only be 1
- or 2.
- @item -mbranch-cost=@var{number}
- @opindex mbranch-cost=@var{number}
- @var{number} can only be 1 or 2. If it is 1 then branches are
- preferred over conditional code, if it is 2, then the opposite applies.
- @item -mflush-trap=@var{number}
- @opindex mflush-trap=@var{number}
- Specifies the trap number to use to flush the cache. The default is
- 12. Valid numbers are between 0 and 15 inclusive.
- @item -mno-flush-trap
- @opindex mno-flush-trap
- Specifies that the cache cannot be flushed by using a trap.
- @item -mflush-func=@var{name}
- @opindex mflush-func=@var{name}
- Specifies the name of the operating system function to call to flush
- the cache. The default is @samp{_flush_cache}, but a function call
- is only used if a trap is not available.
- @item -mno-flush-func
- @opindex mno-flush-func
- Indicates that there is no OS function for flushing the cache.
- @end table
- @node M680x0 Options
- @subsection M680x0 Options
- @cindex M680x0 options
- These are the @samp{-m} options defined for M680x0 and ColdFire processors.
- The default settings depend on which architecture was selected when
- the compiler was configured; the defaults for the most common choices
- are given below.
- @table @gcctabopt
- @item -march=@var{arch}
- @opindex march
- Generate code for a specific M680x0 or ColdFire instruction set
- architecture. Permissible values of @var{arch} for M680x0
- architectures are: @samp{68000}, @samp{68010}, @samp{68020},
- @samp{68030}, @samp{68040}, @samp{68060} and @samp{cpu32}. ColdFire
- architectures are selected according to Freescale's ISA classification
- and the permissible values are: @samp{isaa}, @samp{isaaplus},
- @samp{isab} and @samp{isac}.
- GCC defines a macro @code{__mcf@var{arch}__} whenever it is generating
- code for a ColdFire target. The @var{arch} in this macro is one of the
- @option{-march} arguments given above.
- When used together, @option{-march} and @option{-mtune} select code
- that runs on a family of similar processors but that is optimized
- for a particular microarchitecture.
- @item -mcpu=@var{cpu}
- @opindex mcpu
- Generate code for a specific M680x0 or ColdFire processor.
- The M680x0 @var{cpu}s are: @samp{68000}, @samp{68010}, @samp{68020},
- @samp{68030}, @samp{68040}, @samp{68060}, @samp{68302}, @samp{68332}
- and @samp{cpu32}. The ColdFire @var{cpu}s are given by the table
- below, which also classifies the CPUs into families:
- @multitable @columnfractions 0.20 0.80
- @item @strong{Family} @tab @strong{@samp{-mcpu} arguments}
- @item @samp{51} @tab @samp{51} @samp{51ac} @samp{51ag} @samp{51cn} @samp{51em} @samp{51je} @samp{51jf} @samp{51jg} @samp{51jm} @samp{51mm} @samp{51qe} @samp{51qm}
- @item @samp{5206} @tab @samp{5202} @samp{5204} @samp{5206}
- @item @samp{5206e} @tab @samp{5206e}
- @item @samp{5208} @tab @samp{5207} @samp{5208}
- @item @samp{5211a} @tab @samp{5210a} @samp{5211a}
- @item @samp{5213} @tab @samp{5211} @samp{5212} @samp{5213}
- @item @samp{5216} @tab @samp{5214} @samp{5216}
- @item @samp{52235} @tab @samp{52230} @samp{52231} @samp{52232} @samp{52233} @samp{52234} @samp{52235}
- @item @samp{5225} @tab @samp{5224} @samp{5225}
- @item @samp{52259} @tab @samp{52252} @samp{52254} @samp{52255} @samp{52256} @samp{52258} @samp{52259}
- @item @samp{5235} @tab @samp{5232} @samp{5233} @samp{5234} @samp{5235} @samp{523x}
- @item @samp{5249} @tab @samp{5249}
- @item @samp{5250} @tab @samp{5250}
- @item @samp{5271} @tab @samp{5270} @samp{5271}
- @item @samp{5272} @tab @samp{5272}
- @item @samp{5275} @tab @samp{5274} @samp{5275}
- @item @samp{5282} @tab @samp{5280} @samp{5281} @samp{5282} @samp{528x}
- @item @samp{53017} @tab @samp{53011} @samp{53012} @samp{53013} @samp{53014} @samp{53015} @samp{53016} @samp{53017}
- @item @samp{5307} @tab @samp{5307}
- @item @samp{5329} @tab @samp{5327} @samp{5328} @samp{5329} @samp{532x}
- @item @samp{5373} @tab @samp{5372} @samp{5373} @samp{537x}
- @item @samp{5407} @tab @samp{5407}
- @item @samp{5475} @tab @samp{5470} @samp{5471} @samp{5472} @samp{5473} @samp{5474} @samp{5475} @samp{547x} @samp{5480} @samp{5481} @samp{5482} @samp{5483} @samp{5484} @samp{5485}
- @end multitable
- @option{-mcpu=@var{cpu}} overrides @option{-march=@var{arch}} if
- @var{arch} is compatible with @var{cpu}. Other combinations of
- @option{-mcpu} and @option{-march} are rejected.
- GCC defines the macro @code{__mcf_cpu_@var{cpu}} when ColdFire target
- @var{cpu} is selected. It also defines @code{__mcf_family_@var{family}},
- where the value of @var{family} is given by the table above.
- @item -mtune=@var{tune}
- @opindex mtune
- Tune the code for a particular microarchitecture within the
- constraints set by @option{-march} and @option{-mcpu}.
- The M680x0 microarchitectures are: @samp{68000}, @samp{68010},
- @samp{68020}, @samp{68030}, @samp{68040}, @samp{68060}
- and @samp{cpu32}. The ColdFire microarchitectures
- are: @samp{cfv1}, @samp{cfv2}, @samp{cfv3}, @samp{cfv4} and @samp{cfv4e}.
- You can also use @option{-mtune=68020-40} for code that needs
- to run relatively well on 68020, 68030 and 68040 targets.
- @option{-mtune=68020-60} is similar but includes 68060 targets
- as well. These two options select the same tuning decisions as
- @option{-m68020-40} and @option{-m68020-60} respectively.
- GCC defines the macros @code{__mc@var{arch}} and @code{__mc@var{arch}__}
- when tuning for 680x0 architecture @var{arch}. It also defines
- @code{mc@var{arch}} unless either @option{-ansi} or a non-GNU @option{-std}
- option is used. If GCC is tuning for a range of architectures,
- as selected by @option{-mtune=68020-40} or @option{-mtune=68020-60},
- it defines the macros for every architecture in the range.
- GCC also defines the macro @code{__m@var{uarch}__} when tuning for
- ColdFire microarchitecture @var{uarch}, where @var{uarch} is one
- of the arguments given above.
- @item -m68000
- @itemx -mc68000
- @opindex m68000
- @opindex mc68000
- Generate output for a 68000. This is the default
- when the compiler is configured for 68000-based systems.
- It is equivalent to @option{-march=68000}.
- Use this option for microcontrollers with a 68000 or EC000 core,
- including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356.
- @item -m68010
- @opindex m68010
- Generate output for a 68010. This is the default
- when the compiler is configured for 68010-based systems.
- It is equivalent to @option{-march=68010}.
- @item -m68020
- @itemx -mc68020
- @opindex m68020
- @opindex mc68020
- Generate output for a 68020. This is the default
- when the compiler is configured for 68020-based systems.
- It is equivalent to @option{-march=68020}.
- @item -m68030
- @opindex m68030
- Generate output for a 68030. This is the default when the compiler is
- configured for 68030-based systems. It is equivalent to
- @option{-march=68030}.
- @item -m68040
- @opindex m68040
- Generate output for a 68040. This is the default when the compiler is
- configured for 68040-based systems. It is equivalent to
- @option{-march=68040}.
- This option inhibits the use of 68881/68882 instructions that have to be
- emulated by software on the 68040. Use this option if your 68040 does not
- have code to emulate those instructions.
- @item -m68060
- @opindex m68060
- Generate output for a 68060. This is the default when the compiler is
- configured for 68060-based systems. It is equivalent to
- @option{-march=68060}.
- This option inhibits the use of 68020 and 68881/68882 instructions that
- have to be emulated by software on the 68060. Use this option if your 68060
- does not have code to emulate those instructions.
- @item -mcpu32
- @opindex mcpu32
- Generate output for a CPU32. This is the default
- when the compiler is configured for CPU32-based systems.
- It is equivalent to @option{-march=cpu32}.
- Use this option for microcontrollers with a
- CPU32 or CPU32+ core, including the 68330, 68331, 68332, 68333, 68334,
- 68336, 68340, 68341, 68349 and 68360.
- @item -m5200
- @opindex m5200
- Generate output for a 520X ColdFire CPU@. This is the default
- when the compiler is configured for 520X-based systems.
- It is equivalent to @option{-mcpu=5206}, and is now deprecated
- in favor of that option.
- Use this option for microcontroller with a 5200 core, including
- the MCF5202, MCF5203, MCF5204 and MCF5206.
- @item -m5206e
- @opindex m5206e
- Generate output for a 5206e ColdFire CPU@. The option is now
- deprecated in favor of the equivalent @option{-mcpu=5206e}.
- @item -m528x
- @opindex m528x
- Generate output for a member of the ColdFire 528X family.
- The option is now deprecated in favor of the equivalent
- @option{-mcpu=528x}.
- @item -m5307
- @opindex m5307
- Generate output for a ColdFire 5307 CPU@. The option is now deprecated
- in favor of the equivalent @option{-mcpu=5307}.
- @item -m5407
- @opindex m5407
- Generate output for a ColdFire 5407 CPU@. The option is now deprecated
- in favor of the equivalent @option{-mcpu=5407}.
- @item -mcfv4e
- @opindex mcfv4e
- Generate output for a ColdFire V4e family CPU (e.g.@: 547x/548x).
- This includes use of hardware floating-point instructions.
- The option is equivalent to @option{-mcpu=547x}, and is now
- deprecated in favor of that option.
- @item -m68020-40
- @opindex m68020-40
- Generate output for a 68040, without using any of the new instructions.
- This results in code that can run relatively efficiently on either a
- 68020/68881 or a 68030 or a 68040. The generated code does use the
- 68881 instructions that are emulated on the 68040.
- The option is equivalent to @option{-march=68020} @option{-mtune=68020-40}.
- @item -m68020-60
- @opindex m68020-60
- Generate output for a 68060, without using any of the new instructions.
- This results in code that can run relatively efficiently on either a
- 68020/68881 or a 68030 or a 68040. The generated code does use the
- 68881 instructions that are emulated on the 68060.
- The option is equivalent to @option{-march=68020} @option{-mtune=68020-60}.
- @item -mhard-float
- @itemx -m68881
- @opindex mhard-float
- @opindex m68881
- Generate floating-point instructions. This is the default for 68020
- and above, and for ColdFire devices that have an FPU@. It defines the
- macro @code{__HAVE_68881__} on M680x0 targets and @code{__mcffpu__}
- on ColdFire targets.
- @item -msoft-float
- @opindex msoft-float
- Do not generate floating-point instructions; use library calls instead.
- This is the default for 68000, 68010, and 68832 targets. It is also
- the default for ColdFire devices that have no FPU.
- @item -mdiv
- @itemx -mno-div
- @opindex mdiv
- @opindex mno-div
- Generate (do not generate) ColdFire hardware divide and remainder
- instructions. If @option{-march} is used without @option{-mcpu},
- the default is ``on'' for ColdFire architectures and ``off'' for M680x0
- architectures. Otherwise, the default is taken from the target CPU
- (either the default CPU, or the one specified by @option{-mcpu}). For
- example, the default is ``off'' for @option{-mcpu=5206} and ``on'' for
- @option{-mcpu=5206e}.
- GCC defines the macro @code{__mcfhwdiv__} when this option is enabled.
- @item -mshort
- @opindex mshort
- Consider type @code{int} to be 16 bits wide, like @code{short int}.
- Additionally, parameters passed on the stack are also aligned to a
- 16-bit boundary even on targets whose API mandates promotion to 32-bit.
- @item -mno-short
- @opindex mno-short
- Do not consider type @code{int} to be 16 bits wide. This is the default.
- @item -mnobitfield
- @itemx -mno-bitfield
- @opindex mnobitfield
- @opindex mno-bitfield
- Do not use the bit-field instructions. The @option{-m68000}, @option{-mcpu32}
- and @option{-m5200} options imply @w{@option{-mnobitfield}}.
- @item -mbitfield
- @opindex mbitfield
- Do use the bit-field instructions. The @option{-m68020} option implies
- @option{-mbitfield}. This is the default if you use a configuration
- designed for a 68020.
- @item -mrtd
- @opindex mrtd
- Use a different function-calling convention, in which functions
- that take a fixed number of arguments return with the @code{rtd}
- instruction, which pops their arguments while returning. This
- saves one instruction in the caller since there is no need to pop
- the arguments there.
- This calling convention is incompatible with the one normally
- used on Unix, so you cannot use it if you need to call libraries
- compiled with the Unix compiler.
- Also, you must provide function prototypes for all functions that
- take variable numbers of arguments (including @code{printf});
- otherwise incorrect code is generated for calls to those
- functions.
- In addition, seriously incorrect code results if you call a
- function with too many arguments. (Normally, extra arguments are
- harmlessly ignored.)
- The @code{rtd} instruction is supported by the 68010, 68020, 68030,
- 68040, 68060 and CPU32 processors, but not by the 68000 or 5200.
- @item -mno-rtd
- @opindex mno-rtd
- Do not use the calling conventions selected by @option{-mrtd}.
- This is the default.
- @item -malign-int
- @itemx -mno-align-int
- @opindex malign-int
- @opindex mno-align-int
- Control whether GCC aligns @code{int}, @code{long}, @code{long long},
- @code{float}, @code{double}, and @code{long double} variables on a 32-bit
- boundary (@option{-malign-int}) or a 16-bit boundary (@option{-mno-align-int}).
- Aligning variables on 32-bit boundaries produces code that runs somewhat
- faster on processors with 32-bit busses at the expense of more memory.
- @strong{Warning:} if you use the @option{-malign-int} switch, GCC
- aligns structures containing the above types differently than
- most published application binary interface specifications for the m68k.
- @item -mpcrel
- @opindex mpcrel
- Use the pc-relative addressing mode of the 68000 directly, instead of
- using a global offset table. At present, this option implies @option{-fpic},
- allowing at most a 16-bit offset for pc-relative addressing. @option{-fPIC} is
- not presently supported with @option{-mpcrel}, though this could be supported for
- 68020 and higher processors.
- @item -mno-strict-align
- @itemx -mstrict-align
- @opindex mno-strict-align
- @opindex mstrict-align
- Do not (do) assume that unaligned memory references are handled by
- the system.
- @item -msep-data
- Generate code that allows the data segment to be located in a different
- area of memory from the text segment. This allows for execute-in-place in
- an environment without virtual memory management. This option implies
- @option{-fPIC}.
- @item -mno-sep-data
- Generate code that assumes that the data segment follows the text segment.
- This is the default.
- @item -mid-shared-library
- Generate code that supports shared libraries via the library ID method.
- This allows for execute-in-place and shared libraries in an environment
- without virtual memory management. This option implies @option{-fPIC}.
- @item -mno-id-shared-library
- Generate code that doesn't assume ID-based shared libraries are being used.
- This is the default.
- @item -mshared-library-id=n
- Specifies the identification number of the ID-based shared library being
- compiled. Specifying a value of 0 generates more compact code; specifying
- other values forces the allocation of that number to the current
- library, but is no more space- or time-efficient than omitting this option.
- @item -mxgot
- @itemx -mno-xgot
- @opindex mxgot
- @opindex mno-xgot
- When generating position-independent code for ColdFire, generate code
- that works if the GOT has more than 8192 entries. This code is
- larger and slower than code generated without this option. On M680x0
- processors, this option is not needed; @option{-fPIC} suffices.
- GCC normally uses a single instruction to load values from the GOT@.
- While this is relatively efficient, it only works if the GOT
- is smaller than about 64k. Anything larger causes the linker
- to report an error such as:
- @cindex relocation truncated to fit (ColdFire)
- @smallexample
- relocation truncated to fit: R_68K_GOT16O foobar
- @end smallexample
- If this happens, you should recompile your code with @option{-mxgot}.
- It should then work with very large GOTs. However, code generated with
- @option{-mxgot} is less efficient, since it takes 4 instructions to fetch
- the value of a global symbol.
- Note that some linkers, including newer versions of the GNU linker,
- can create multiple GOTs and sort GOT entries. If you have such a linker,
- you should only need to use @option{-mxgot} when compiling a single
- object file that accesses more than 8192 GOT entries. Very few do.
- These options have no effect unless GCC is generating
- position-independent code.
- @end table
- @node MCore Options
- @subsection MCore Options
- @cindex MCore options
- These are the @samp{-m} options defined for the Motorola M*Core
- processors.
- @table @gcctabopt
- @item -mhardlit
- @itemx -mno-hardlit
- @opindex mhardlit
- @opindex mno-hardlit
- Inline constants into the code stream if it can be done in two
- instructions or less.
- @item -mdiv
- @itemx -mno-div
- @opindex mdiv
- @opindex mno-div
- Use the divide instruction. (Enabled by default).
- @item -mrelax-immediate
- @itemx -mno-relax-immediate
- @opindex mrelax-immediate
- @opindex mno-relax-immediate
- Allow arbitrary-sized immediates in bit operations.
- @item -mwide-bitfields
- @itemx -mno-wide-bitfields
- @opindex mwide-bitfields
- @opindex mno-wide-bitfields
- Always treat bit-fields as @code{int}-sized.
- @item -m4byte-functions
- @itemx -mno-4byte-functions
- @opindex m4byte-functions
- @opindex mno-4byte-functions
- Force all functions to be aligned to a 4-byte boundary.
- @item -mcallgraph-data
- @itemx -mno-callgraph-data
- @opindex mcallgraph-data
- @opindex mno-callgraph-data
- Emit callgraph information.
- @item -mslow-bytes
- @itemx -mno-slow-bytes
- @opindex mslow-bytes
- @opindex mno-slow-bytes
- Prefer word access when reading byte quantities.
- @item -mlittle-endian
- @itemx -mbig-endian
- @opindex mlittle-endian
- @opindex mbig-endian
- Generate code for a little-endian target.
- @item -m210
- @itemx -m340
- @opindex m210
- @opindex m340
- Generate code for the 210 processor.
- @item -mno-lsim
- @opindex mno-lsim
- Assume that runtime support has been provided and so omit the
- simulator library (@file{libsim.a)} from the linker command line.
- @item -mstack-increment=@var{size}
- @opindex mstack-increment
- Set the maximum amount for a single stack increment operation. Large
- values can increase the speed of programs that contain functions
- that need a large amount of stack space, but they can also trigger a
- segmentation fault if the stack is extended too much. The default
- value is 0x1000.
- @end table
- @node MeP Options
- @subsection MeP Options
- @cindex MeP options
- @table @gcctabopt
- @item -mabsdiff
- @opindex mabsdiff
- Enables the @code{abs} instruction, which is the absolute difference
- between two registers.
- @item -mall-opts
- @opindex mall-opts
- Enables all the optional instructions---average, multiply, divide, bit
- operations, leading zero, absolute difference, min/max, clip, and
- saturation.
- @item -maverage
- @opindex maverage
- Enables the @code{ave} instruction, which computes the average of two
- registers.
- @item -mbased=@var{n}
- @opindex mbased=
- Variables of size @var{n} bytes or smaller are placed in the
- @code{.based} section by default. Based variables use the @code{$tp}
- register as a base register, and there is a 128-byte limit to the
- @code{.based} section.
- @item -mbitops
- @opindex mbitops
- Enables the bit operation instructions---bit test (@code{btstm}), set
- (@code{bsetm}), clear (@code{bclrm}), invert (@code{bnotm}), and
- test-and-set (@code{tas}).
- @item -mc=@var{name}
- @opindex mc=
- Selects which section constant data is placed in. @var{name} may
- be @samp{tiny}, @samp{near}, or @samp{far}.
- @item -mclip
- @opindex mclip
- Enables the @code{clip} instruction. Note that @option{-mclip} is not
- useful unless you also provide @option{-mminmax}.
- @item -mconfig=@var{name}
- @opindex mconfig=
- Selects one of the built-in core configurations. Each MeP chip has
- one or more modules in it; each module has a core CPU and a variety of
- coprocessors, optional instructions, and peripherals. The
- @code{MeP-Integrator} tool, not part of GCC, provides these
- configurations through this option; using this option is the same as
- using all the corresponding command-line options. The default
- configuration is @samp{default}.
- @item -mcop
- @opindex mcop
- Enables the coprocessor instructions. By default, this is a 32-bit
- coprocessor. Note that the coprocessor is normally enabled via the
- @option{-mconfig=} option.
- @item -mcop32
- @opindex mcop32
- Enables the 32-bit coprocessor's instructions.
- @item -mcop64
- @opindex mcop64
- Enables the 64-bit coprocessor's instructions.
- @item -mivc2
- @opindex mivc2
- Enables IVC2 scheduling. IVC2 is a 64-bit VLIW coprocessor.
- @item -mdc
- @opindex mdc
- Causes constant variables to be placed in the @code{.near} section.
- @item -mdiv
- @opindex mdiv
- Enables the @code{div} and @code{divu} instructions.
- @item -meb
- @opindex meb
- Generate big-endian code.
- @item -mel
- @opindex mel
- Generate little-endian code.
- @item -mio-volatile
- @opindex mio-volatile
- Tells the compiler that any variable marked with the @code{io}
- attribute is to be considered volatile.
- @item -ml
- @opindex ml
- Causes variables to be assigned to the @code{.far} section by default.
- @item -mleadz
- @opindex mleadz
- Enables the @code{leadz} (leading zero) instruction.
- @item -mm
- @opindex mm
- Causes variables to be assigned to the @code{.near} section by default.
- @item -mminmax
- @opindex mminmax
- Enables the @code{min} and @code{max} instructions.
- @item -mmult
- @opindex mmult
- Enables the multiplication and multiply-accumulate instructions.
- @item -mno-opts
- @opindex mno-opts
- Disables all the optional instructions enabled by @option{-mall-opts}.
- @item -mrepeat
- @opindex mrepeat
- Enables the @code{repeat} and @code{erepeat} instructions, used for
- low-overhead looping.
- @item -ms
- @opindex ms
- Causes all variables to default to the @code{.tiny} section. Note
- that there is a 65536-byte limit to this section. Accesses to these
- variables use the @code{%gp} base register.
- @item -msatur
- @opindex msatur
- Enables the saturation instructions. Note that the compiler does not
- currently generate these itself, but this option is included for
- compatibility with other tools, like @code{as}.
- @item -msdram
- @opindex msdram
- Link the SDRAM-based runtime instead of the default ROM-based runtime.
- @item -msim
- @opindex msim
- Link the simulator run-time libraries.
- @item -msimnovec
- @opindex msimnovec
- Link the simulator runtime libraries, excluding built-in support
- for reset and exception vectors and tables.
- @item -mtf
- @opindex mtf
- Causes all functions to default to the @code{.far} section. Without
- this option, functions default to the @code{.near} section.
- @item -mtiny=@var{n}
- @opindex mtiny=
- Variables that are @var{n} bytes or smaller are allocated to the
- @code{.tiny} section. These variables use the @code{$gp} base
- register. The default for this option is 4, but note that there's a
- 65536-byte limit to the @code{.tiny} section.
- @end table
- @node MicroBlaze Options
- @subsection MicroBlaze Options
- @cindex MicroBlaze Options
- @table @gcctabopt
- @item -msoft-float
- @opindex msoft-float
- Use software emulation for floating point (default).
- @item -mhard-float
- @opindex mhard-float
- Use hardware floating-point instructions.
- @item -mmemcpy
- @opindex mmemcpy
- Do not optimize block moves, use @code{memcpy}.
- @item -mno-clearbss
- @opindex mno-clearbss
- This option is deprecated. Use @option{-fno-zero-initialized-in-bss} instead.
- @item -mcpu=@var{cpu-type}
- @opindex mcpu=
- Use features of, and schedule code for, the given CPU.
- Supported values are in the format @samp{v@var{X}.@var{YY}.@var{Z}},
- where @var{X} is a major version, @var{YY} is the minor version, and
- @var{Z} is compatibility code. Example values are @samp{v3.00.a},
- @samp{v4.00.b}, @samp{v5.00.a}, @samp{v5.00.b}, @samp{v5.00.b}, @samp{v6.00.a}.
- @item -mxl-soft-mul
- @opindex mxl-soft-mul
- Use software multiply emulation (default).
- @item -mxl-soft-div
- @opindex mxl-soft-div
- Use software emulation for divides (default).
- @item -mxl-barrel-shift
- @opindex mxl-barrel-shift
- Use the hardware barrel shifter.
- @item -mxl-pattern-compare
- @opindex mxl-pattern-compare
- Use pattern compare instructions.
- @item -msmall-divides
- @opindex msmall-divides
- Use table lookup optimization for small signed integer divisions.
- @item -mxl-stack-check
- @opindex mxl-stack-check
- This option is deprecated. Use @option{-fstack-check} instead.
- @item -mxl-gp-opt
- @opindex mxl-gp-opt
- Use GP-relative @code{.sdata}/@code{.sbss} sections.
- @item -mxl-multiply-high
- @opindex mxl-multiply-high
- Use multiply high instructions for high part of 32x32 multiply.
- @item -mxl-float-convert
- @opindex mxl-float-convert
- Use hardware floating-point conversion instructions.
- @item -mxl-float-sqrt
- @opindex mxl-float-sqrt
- Use hardware floating-point square root instruction.
- @item -mbig-endian
- @opindex mbig-endian
- Generate code for a big-endian target.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate code for a little-endian target.
- @item -mxl-reorder
- @opindex mxl-reorder
- Use reorder instructions (swap and byte reversed load/store).
- @item -mxl-mode-@var{app-model}
- Select application model @var{app-model}. Valid models are
- @table @samp
- @item executable
- normal executable (default), uses startup code @file{crt0.o}.
- @item xmdstub
- for use with Xilinx Microprocessor Debugger (XMD) based
- software intrusive debug agent called xmdstub. This uses startup file
- @file{crt1.o} and sets the start address of the program to 0x800.
- @item bootstrap
- for applications that are loaded using a bootloader.
- This model uses startup file @file{crt2.o} which does not contain a processor
- reset vector handler. This is suitable for transferring control on a
- processor reset to the bootloader rather than the application.
- @item novectors
- for applications that do not require any of the
- MicroBlaze vectors. This option may be useful for applications running
- within a monitoring application. This model uses @file{crt3.o} as a startup file.
- @end table
- Option @option{-xl-mode-@var{app-model}} is a deprecated alias for
- @option{-mxl-mode-@var{app-model}}.
- @end table
- @node MIPS Options
- @subsection MIPS Options
- @cindex MIPS options
- @table @gcctabopt
- @item -EB
- @opindex EB
- Generate big-endian code.
- @item -EL
- @opindex EL
- Generate little-endian code. This is the default for @samp{mips*el-*-*}
- configurations.
- @item -march=@var{arch}
- @opindex march
- Generate code that runs on @var{arch}, which can be the name of a
- generic MIPS ISA, or the name of a particular processor.
- The ISA names are:
- @samp{mips1}, @samp{mips2}, @samp{mips3}, @samp{mips4},
- @samp{mips32}, @samp{mips32r2}, @samp{mips32r3}, @samp{mips32r5},
- @samp{mips32r6}, @samp{mips64}, @samp{mips64r2}, @samp{mips64r3},
- @samp{mips64r5} and @samp{mips64r6}.
- The processor names are:
- @samp{4kc}, @samp{4km}, @samp{4kp}, @samp{4ksc},
- @samp{4kec}, @samp{4kem}, @samp{4kep}, @samp{4ksd},
- @samp{5kc}, @samp{5kf},
- @samp{20kc},
- @samp{24kc}, @samp{24kf2_1}, @samp{24kf1_1},
- @samp{24kec}, @samp{24kef2_1}, @samp{24kef1_1},
- @samp{34kc}, @samp{34kf2_1}, @samp{34kf1_1}, @samp{34kn},
- @samp{74kc}, @samp{74kf2_1}, @samp{74kf1_1}, @samp{74kf3_2},
- @samp{1004kc}, @samp{1004kf2_1}, @samp{1004kf1_1},
- @samp{loongson2e}, @samp{loongson2f}, @samp{loongson3a},
- @samp{m4k},
- @samp{m14k}, @samp{m14kc}, @samp{m14ke}, @samp{m14kec},
- @samp{octeon}, @samp{octeon+}, @samp{octeon2}, @samp{octeon3},
- @samp{orion},
- @samp{p5600},
- @samp{r2000}, @samp{r3000}, @samp{r3900}, @samp{r4000}, @samp{r4400},
- @samp{r4600}, @samp{r4650}, @samp{r4700}, @samp{r6000}, @samp{r8000},
- @samp{rm7000}, @samp{rm9000},
- @samp{r10000}, @samp{r12000}, @samp{r14000}, @samp{r16000},
- @samp{sb1},
- @samp{sr71000},
- @samp{vr4100}, @samp{vr4111}, @samp{vr4120}, @samp{vr4130}, @samp{vr4300},
- @samp{vr5000}, @samp{vr5400}, @samp{vr5500},
- @samp{xlr} and @samp{xlp}.
- The special value @samp{from-abi} selects the
- most compatible architecture for the selected ABI (that is,
- @samp{mips1} for 32-bit ABIs and @samp{mips3} for 64-bit ABIs)@.
- The native Linux/GNU toolchain also supports the value @samp{native},
- which selects the best architecture option for the host processor.
- @option{-march=native} has no effect if GCC does not recognize
- the processor.
- In processor names, a final @samp{000} can be abbreviated as @samp{k}
- (for example, @option{-march=r2k}). Prefixes are optional, and
- @samp{vr} may be written @samp{r}.
- Names of the form @samp{@var{n}f2_1} refer to processors with
- FPUs clocked at half the rate of the core, names of the form
- @samp{@var{n}f1_1} refer to processors with FPUs clocked at the same
- rate as the core, and names of the form @samp{@var{n}f3_2} refer to
- processors with FPUs clocked a ratio of 3:2 with respect to the core.
- For compatibility reasons, @samp{@var{n}f} is accepted as a synonym
- for @samp{@var{n}f2_1} while @samp{@var{n}x} and @samp{@var{b}fx} are
- accepted as synonyms for @samp{@var{n}f1_1}.
- GCC defines two macros based on the value of this option. The first
- is @code{_MIPS_ARCH}, which gives the name of target architecture, as
- a string. The second has the form @code{_MIPS_ARCH_@var{foo}},
- where @var{foo} is the capitalized value of @code{_MIPS_ARCH}@.
- For example, @option{-march=r2000} sets @code{_MIPS_ARCH}
- to @code{"r2000"} and defines the macro @code{_MIPS_ARCH_R2000}.
- Note that the @code{_MIPS_ARCH} macro uses the processor names given
- above. In other words, it has the full prefix and does not
- abbreviate @samp{000} as @samp{k}. In the case of @samp{from-abi},
- the macro names the resolved architecture (either @code{"mips1"} or
- @code{"mips3"}). It names the default architecture when no
- @option{-march} option is given.
- @item -mtune=@var{arch}
- @opindex mtune
- Optimize for @var{arch}. Among other things, this option controls
- the way instructions are scheduled, and the perceived cost of arithmetic
- operations. The list of @var{arch} values is the same as for
- @option{-march}.
- When this option is not used, GCC optimizes for the processor
- specified by @option{-march}. By using @option{-march} and
- @option{-mtune} together, it is possible to generate code that
- runs on a family of processors, but optimize the code for one
- particular member of that family.
- @option{-mtune} defines the macros @code{_MIPS_TUNE} and
- @code{_MIPS_TUNE_@var{foo}}, which work in the same way as the
- @option{-march} ones described above.
- @item -mips1
- @opindex mips1
- Equivalent to @option{-march=mips1}.
- @item -mips2
- @opindex mips2
- Equivalent to @option{-march=mips2}.
- @item -mips3
- @opindex mips3
- Equivalent to @option{-march=mips3}.
- @item -mips4
- @opindex mips4
- Equivalent to @option{-march=mips4}.
- @item -mips32
- @opindex mips32
- Equivalent to @option{-march=mips32}.
- @item -mips32r3
- @opindex mips32r3
- Equivalent to @option{-march=mips32r3}.
- @item -mips32r5
- @opindex mips32r5
- Equivalent to @option{-march=mips32r5}.
- @item -mips32r6
- @opindex mips32r6
- Equivalent to @option{-march=mips32r6}.
- @item -mips64
- @opindex mips64
- Equivalent to @option{-march=mips64}.
- @item -mips64r2
- @opindex mips64r2
- Equivalent to @option{-march=mips64r2}.
- @item -mips64r3
- @opindex mips64r3
- Equivalent to @option{-march=mips64r3}.
- @item -mips64r5
- @opindex mips64r5
- Equivalent to @option{-march=mips64r5}.
- @item -mips64r6
- @opindex mips64r6
- Equivalent to @option{-march=mips64r6}.
- @item -mips16
- @itemx -mno-mips16
- @opindex mips16
- @opindex mno-mips16
- Generate (do not generate) MIPS16 code. If GCC is targeting a
- MIPS32 or MIPS64 architecture, it makes use of the MIPS16e ASE@.
- MIPS16 code generation can also be controlled on a per-function basis
- by means of @code{mips16} and @code{nomips16} attributes.
- @xref{Function Attributes}, for more information.
- @item -mflip-mips16
- @opindex mflip-mips16
- Generate MIPS16 code on alternating functions. This option is provided
- for regression testing of mixed MIPS16/non-MIPS16 code generation, and is
- not intended for ordinary use in compiling user code.
- @item -minterlink-compressed
- @item -mno-interlink-compressed
- @opindex minterlink-compressed
- @opindex mno-interlink-compressed
- Require (do not require) that code using the standard (uncompressed) MIPS ISA
- be link-compatible with MIPS16 and microMIPS code, and vice versa.
- For example, code using the standard ISA encoding cannot jump directly
- to MIPS16 or microMIPS code; it must either use a call or an indirect jump.
- @option{-minterlink-compressed} therefore disables direct jumps unless GCC
- knows that the target of the jump is not compressed.
- @item -minterlink-mips16
- @itemx -mno-interlink-mips16
- @opindex minterlink-mips16
- @opindex mno-interlink-mips16
- Aliases of @option{-minterlink-compressed} and
- @option{-mno-interlink-compressed}. These options predate the microMIPS ASE
- and are retained for backwards compatibility.
- @item -mabi=32
- @itemx -mabi=o64
- @itemx -mabi=n32
- @itemx -mabi=64
- @itemx -mabi=eabi
- @opindex mabi=32
- @opindex mabi=o64
- @opindex mabi=n32
- @opindex mabi=64
- @opindex mabi=eabi
- Generate code for the given ABI@.
- Note that the EABI has a 32-bit and a 64-bit variant. GCC normally
- generates 64-bit code when you select a 64-bit architecture, but you
- can use @option{-mgp32} to get 32-bit code instead.
- For information about the O64 ABI, see
- @uref{http://gcc.gnu.org/@/projects/@/mipso64-abi.html}.
- GCC supports a variant of the o32 ABI in which floating-point registers
- are 64 rather than 32 bits wide. You can select this combination with
- @option{-mabi=32} @option{-mfp64}. This ABI relies on the @code{mthc1}
- and @code{mfhc1} instructions and is therefore only supported for
- MIPS32R2, MIPS32R3 and MIPS32R5 processors.
- The register assignments for arguments and return values remain the
- same, but each scalar value is passed in a single 64-bit register
- rather than a pair of 32-bit registers. For example, scalar
- floating-point values are returned in @samp{$f0} only, not a
- @samp{$f0}/@samp{$f1} pair. The set of call-saved registers also
- remains the same in that the even-numbered double-precision registers
- are saved.
- Two additional variants of the o32 ABI are supported to enable
- a transition from 32-bit to 64-bit registers. These are FPXX
- (@option{-mfpxx}) and FP64A (@option{-mfp64} @option{-mno-odd-spreg}).
- The FPXX extension mandates that all code must execute correctly
- when run using 32-bit or 64-bit registers. The code can be interlinked
- with either FP32 or FP64, but not both.
- The FP64A extension is similar to the FP64 extension but forbids the
- use of odd-numbered single-precision registers. This can be used
- in conjunction with the @code{FRE} mode of FPUs in MIPS32R5
- processors and allows both FP32 and FP64A code to interlink and
- run in the same process without changing FPU modes.
- @item -mabicalls
- @itemx -mno-abicalls
- @opindex mabicalls
- @opindex mno-abicalls
- Generate (do not generate) code that is suitable for SVR4-style
- dynamic objects. @option{-mabicalls} is the default for SVR4-based
- systems.
- @item -mshared
- @itemx -mno-shared
- Generate (do not generate) code that is fully position-independent,
- and that can therefore be linked into shared libraries. This option
- only affects @option{-mabicalls}.
- All @option{-mabicalls} code has traditionally been position-independent,
- regardless of options like @option{-fPIC} and @option{-fpic}. However,
- as an extension, the GNU toolchain allows executables to use absolute
- accesses for locally-binding symbols. It can also use shorter GP
- initialization sequences and generate direct calls to locally-defined
- functions. This mode is selected by @option{-mno-shared}.
- @option{-mno-shared} depends on binutils 2.16 or higher and generates
- objects that can only be linked by the GNU linker. However, the option
- does not affect the ABI of the final executable; it only affects the ABI
- of relocatable objects. Using @option{-mno-shared} generally makes
- executables both smaller and quicker.
- @option{-mshared} is the default.
- @item -mplt
- @itemx -mno-plt
- @opindex mplt
- @opindex mno-plt
- Assume (do not assume) that the static and dynamic linkers
- support PLTs and copy relocations. This option only affects
- @option{-mno-shared -mabicalls}. For the n64 ABI, this option
- has no effect without @option{-msym32}.
- You can make @option{-mplt} the default by configuring
- GCC with @option{--with-mips-plt}. The default is
- @option{-mno-plt} otherwise.
- @item -mxgot
- @itemx -mno-xgot
- @opindex mxgot
- @opindex mno-xgot
- Lift (do not lift) the usual restrictions on the size of the global
- offset table.
- GCC normally uses a single instruction to load values from the GOT@.
- While this is relatively efficient, it only works if the GOT
- is smaller than about 64k. Anything larger causes the linker
- to report an error such as:
- @cindex relocation truncated to fit (MIPS)
- @smallexample
- relocation truncated to fit: R_MIPS_GOT16 foobar
- @end smallexample
- If this happens, you should recompile your code with @option{-mxgot}.
- This works with very large GOTs, although the code is also
- less efficient, since it takes three instructions to fetch the
- value of a global symbol.
- Note that some linkers can create multiple GOTs. If you have such a
- linker, you should only need to use @option{-mxgot} when a single object
- file accesses more than 64k's worth of GOT entries. Very few do.
- These options have no effect unless GCC is generating position
- independent code.
- @item -mgp32
- @opindex mgp32
- Assume that general-purpose registers are 32 bits wide.
- @item -mgp64
- @opindex mgp64
- Assume that general-purpose registers are 64 bits wide.
- @item -mfp32
- @opindex mfp32
- Assume that floating-point registers are 32 bits wide.
- @item -mfp64
- @opindex mfp64
- Assume that floating-point registers are 64 bits wide.
- @item -mfpxx
- @opindex mfpxx
- Do not assume the width of floating-point registers.
- @item -mhard-float
- @opindex mhard-float
- Use floating-point coprocessor instructions.
- @item -msoft-float
- @opindex msoft-float
- Do not use floating-point coprocessor instructions. Implement
- floating-point calculations using library calls instead.
- @item -mno-float
- @opindex mno-float
- Equivalent to @option{-msoft-float}, but additionally asserts that the
- program being compiled does not perform any floating-point operations.
- This option is presently supported only by some bare-metal MIPS
- configurations, where it may select a special set of libraries
- that lack all floating-point support (including, for example, the
- floating-point @code{printf} formats).
- If code compiled with @option{-mno-float} accidentally contains
- floating-point operations, it is likely to suffer a link-time
- or run-time failure.
- @item -msingle-float
- @opindex msingle-float
- Assume that the floating-point coprocessor only supports single-precision
- operations.
- @item -mdouble-float
- @opindex mdouble-float
- Assume that the floating-point coprocessor supports double-precision
- operations. This is the default.
- @item -modd-spreg
- @itemx -mno-odd-spreg
- @opindex modd-spreg
- @opindex mno-odd-spreg
- Enable the use of odd-numbered single-precision floating-point registers
- for the o32 ABI. This is the default for processors that are known to
- support these registers. When using the o32 FPXX ABI, @option{-mno-odd-spreg}
- is set by default.
- @item -mabs=2008
- @itemx -mabs=legacy
- @opindex mabs=2008
- @opindex mabs=legacy
- These options control the treatment of the special not-a-number (NaN)
- IEEE 754 floating-point data with the @code{abs.@i{fmt}} and
- @code{neg.@i{fmt}} machine instructions.
- By default or when @option{-mabs=legacy} is used the legacy
- treatment is selected. In this case these instructions are considered
- arithmetic and avoided where correct operation is required and the
- input operand might be a NaN. A longer sequence of instructions that
- manipulate the sign bit of floating-point datum manually is used
- instead unless the @option{-ffinite-math-only} option has also been
- specified.
- The @option{-mabs=2008} option selects the IEEE 754-2008 treatment. In
- this case these instructions are considered non-arithmetic and therefore
- operating correctly in all cases, including in particular where the
- input operand is a NaN. These instructions are therefore always used
- for the respective operations.
- @item -mnan=2008
- @itemx -mnan=legacy
- @opindex mnan=2008
- @opindex mnan=legacy
- These options control the encoding of the special not-a-number (NaN)
- IEEE 754 floating-point data.
- The @option{-mnan=legacy} option selects the legacy encoding. In this
- case quiet NaNs (qNaNs) are denoted by the first bit of their trailing
- significand field being 0, whereas signalling NaNs (sNaNs) are denoted
- by the first bit of their trailing significand field being 1.
- The @option{-mnan=2008} option selects the IEEE 754-2008 encoding. In
- this case qNaNs are denoted by the first bit of their trailing
- significand field being 1, whereas sNaNs are denoted by the first bit of
- their trailing significand field being 0.
- The default is @option{-mnan=legacy} unless GCC has been configured with
- @option{--with-nan=2008}.
- @item -mllsc
- @itemx -mno-llsc
- @opindex mllsc
- @opindex mno-llsc
- Use (do not use) @samp{ll}, @samp{sc}, and @samp{sync} instructions to
- implement atomic memory built-in functions. When neither option is
- specified, GCC uses the instructions if the target architecture
- supports them.
- @option{-mllsc} is useful if the runtime environment can emulate the
- instructions and @option{-mno-llsc} can be useful when compiling for
- nonstandard ISAs. You can make either option the default by
- configuring GCC with @option{--with-llsc} and @option{--without-llsc}
- respectively. @option{--with-llsc} is the default for some
- configurations; see the installation documentation for details.
- @item -mdsp
- @itemx -mno-dsp
- @opindex mdsp
- @opindex mno-dsp
- Use (do not use) revision 1 of the MIPS DSP ASE@.
- @xref{MIPS DSP Built-in Functions}. This option defines the
- preprocessor macro @code{__mips_dsp}. It also defines
- @code{__mips_dsp_rev} to 1.
- @item -mdspr2
- @itemx -mno-dspr2
- @opindex mdspr2
- @opindex mno-dspr2
- Use (do not use) revision 2 of the MIPS DSP ASE@.
- @xref{MIPS DSP Built-in Functions}. This option defines the
- preprocessor macros @code{__mips_dsp} and @code{__mips_dspr2}.
- It also defines @code{__mips_dsp_rev} to 2.
- @item -msmartmips
- @itemx -mno-smartmips
- @opindex msmartmips
- @opindex mno-smartmips
- Use (do not use) the MIPS SmartMIPS ASE.
- @item -mpaired-single
- @itemx -mno-paired-single
- @opindex mpaired-single
- @opindex mno-paired-single
- Use (do not use) paired-single floating-point instructions.
- @xref{MIPS Paired-Single Support}. This option requires
- hardware floating-point support to be enabled.
- @item -mdmx
- @itemx -mno-mdmx
- @opindex mdmx
- @opindex mno-mdmx
- Use (do not use) MIPS Digital Media Extension instructions.
- This option can only be used when generating 64-bit code and requires
- hardware floating-point support to be enabled.
- @item -mips3d
- @itemx -mno-mips3d
- @opindex mips3d
- @opindex mno-mips3d
- Use (do not use) the MIPS-3D ASE@. @xref{MIPS-3D Built-in Functions}.
- The option @option{-mips3d} implies @option{-mpaired-single}.
- @item -mmicromips
- @itemx -mno-micromips
- @opindex mmicromips
- @opindex mno-mmicromips
- Generate (do not generate) microMIPS code.
- MicroMIPS code generation can also be controlled on a per-function basis
- by means of @code{micromips} and @code{nomicromips} attributes.
- @xref{Function Attributes}, for more information.
- @item -mmt
- @itemx -mno-mt
- @opindex mmt
- @opindex mno-mt
- Use (do not use) MT Multithreading instructions.
- @item -mmcu
- @itemx -mno-mcu
- @opindex mmcu
- @opindex mno-mcu
- Use (do not use) the MIPS MCU ASE instructions.
- @item -meva
- @itemx -mno-eva
- @opindex meva
- @opindex mno-eva
- Use (do not use) the MIPS Enhanced Virtual Addressing instructions.
- @item -mvirt
- @itemx -mno-virt
- @opindex mvirt
- @opindex mno-virt
- Use (do not use) the MIPS Virtualization Application Specific instructions.
- @item -mxpa
- @itemx -mno-xpa
- @opindex mxpa
- @opindex mno-xpa
- Use (do not use) the MIPS eXtended Physical Address (XPA) instructions.
- @item -mlong64
- @opindex mlong64
- Force @code{long} types to be 64 bits wide. See @option{-mlong32} for
- an explanation of the default and the way that the pointer size is
- determined.
- @item -mlong32
- @opindex mlong32
- Force @code{long}, @code{int}, and pointer types to be 32 bits wide.
- The default size of @code{int}s, @code{long}s and pointers depends on
- the ABI@. All the supported ABIs use 32-bit @code{int}s. The n64 ABI
- uses 64-bit @code{long}s, as does the 64-bit EABI; the others use
- 32-bit @code{long}s. Pointers are the same size as @code{long}s,
- or the same size as integer registers, whichever is smaller.
- @item -msym32
- @itemx -mno-sym32
- @opindex msym32
- @opindex mno-sym32
- Assume (do not assume) that all symbols have 32-bit values, regardless
- of the selected ABI@. This option is useful in combination with
- @option{-mabi=64} and @option{-mno-abicalls} because it allows GCC
- to generate shorter and faster references to symbolic addresses.
- @item -G @var{num}
- @opindex G
- Put definitions of externally-visible data in a small data section
- if that data is no bigger than @var{num} bytes. GCC can then generate
- more efficient accesses to the data; see @option{-mgpopt} for details.
- The default @option{-G} option depends on the configuration.
- @item -mlocal-sdata
- @itemx -mno-local-sdata
- @opindex mlocal-sdata
- @opindex mno-local-sdata
- Extend (do not extend) the @option{-G} behavior to local data too,
- such as to static variables in C@. @option{-mlocal-sdata} is the
- default for all configurations.
- If the linker complains that an application is using too much small data,
- you might want to try rebuilding the less performance-critical parts with
- @option{-mno-local-sdata}. You might also want to build large
- libraries with @option{-mno-local-sdata}, so that the libraries leave
- more room for the main program.
- @item -mextern-sdata
- @itemx -mno-extern-sdata
- @opindex mextern-sdata
- @opindex mno-extern-sdata
- Assume (do not assume) that externally-defined data is in
- a small data section if the size of that data is within the @option{-G} limit.
- @option{-mextern-sdata} is the default for all configurations.
- If you compile a module @var{Mod} with @option{-mextern-sdata} @option{-G
- @var{num}} @option{-mgpopt}, and @var{Mod} references a variable @var{Var}
- that is no bigger than @var{num} bytes, you must make sure that @var{Var}
- is placed in a small data section. If @var{Var} is defined by another
- module, you must either compile that module with a high-enough
- @option{-G} setting or attach a @code{section} attribute to @var{Var}'s
- definition. If @var{Var} is common, you must link the application
- with a high-enough @option{-G} setting.
- The easiest way of satisfying these restrictions is to compile
- and link every module with the same @option{-G} option. However,
- you may wish to build a library that supports several different
- small data limits. You can do this by compiling the library with
- the highest supported @option{-G} setting and additionally using
- @option{-mno-extern-sdata} to stop the library from making assumptions
- about externally-defined data.
- @item -mgpopt
- @itemx -mno-gpopt
- @opindex mgpopt
- @opindex mno-gpopt
- Use (do not use) GP-relative accesses for symbols that are known to be
- in a small data section; see @option{-G}, @option{-mlocal-sdata} and
- @option{-mextern-sdata}. @option{-mgpopt} is the default for all
- configurations.
- @option{-mno-gpopt} is useful for cases where the @code{$gp} register
- might not hold the value of @code{_gp}. For example, if the code is
- part of a library that might be used in a boot monitor, programs that
- call boot monitor routines pass an unknown value in @code{$gp}.
- (In such situations, the boot monitor itself is usually compiled
- with @option{-G0}.)
- @option{-mno-gpopt} implies @option{-mno-local-sdata} and
- @option{-mno-extern-sdata}.
- @item -membedded-data
- @itemx -mno-embedded-data
- @opindex membedded-data
- @opindex mno-embedded-data
- Allocate variables to the read-only data section first if possible, then
- next in the small data section if possible, otherwise in data. This gives
- slightly slower code than the default, but reduces the amount of RAM required
- when executing, and thus may be preferred for some embedded systems.
- @item -muninit-const-in-rodata
- @itemx -mno-uninit-const-in-rodata
- @opindex muninit-const-in-rodata
- @opindex mno-uninit-const-in-rodata
- Put uninitialized @code{const} variables in the read-only data section.
- This option is only meaningful in conjunction with @option{-membedded-data}.
- @item -mcode-readable=@var{setting}
- @opindex mcode-readable
- Specify whether GCC may generate code that reads from executable sections.
- There are three possible settings:
- @table @gcctabopt
- @item -mcode-readable=yes
- Instructions may freely access executable sections. This is the
- default setting.
- @item -mcode-readable=pcrel
- MIPS16 PC-relative load instructions can access executable sections,
- but other instructions must not do so. This option is useful on 4KSc
- and 4KSd processors when the code TLBs have the Read Inhibit bit set.
- It is also useful on processors that can be configured to have a dual
- instruction/data SRAM interface and that, like the M4K, automatically
- redirect PC-relative loads to the instruction RAM.
- @item -mcode-readable=no
- Instructions must not access executable sections. This option can be
- useful on targets that are configured to have a dual instruction/data
- SRAM interface but that (unlike the M4K) do not automatically redirect
- PC-relative loads to the instruction RAM.
- @end table
- @item -msplit-addresses
- @itemx -mno-split-addresses
- @opindex msplit-addresses
- @opindex mno-split-addresses
- Enable (disable) use of the @code{%hi()} and @code{%lo()} assembler
- relocation operators. This option has been superseded by
- @option{-mexplicit-relocs} but is retained for backwards compatibility.
- @item -mexplicit-relocs
- @itemx -mno-explicit-relocs
- @opindex mexplicit-relocs
- @opindex mno-explicit-relocs
- Use (do not use) assembler relocation operators when dealing with symbolic
- addresses. The alternative, selected by @option{-mno-explicit-relocs},
- is to use assembler macros instead.
- @option{-mexplicit-relocs} is the default if GCC was configured
- to use an assembler that supports relocation operators.
- @item -mcheck-zero-division
- @itemx -mno-check-zero-division
- @opindex mcheck-zero-division
- @opindex mno-check-zero-division
- Trap (do not trap) on integer division by zero.
- The default is @option{-mcheck-zero-division}.
- @item -mdivide-traps
- @itemx -mdivide-breaks
- @opindex mdivide-traps
- @opindex mdivide-breaks
- MIPS systems check for division by zero by generating either a
- conditional trap or a break instruction. Using traps results in
- smaller code, but is only supported on MIPS II and later. Also, some
- versions of the Linux kernel have a bug that prevents trap from
- generating the proper signal (@code{SIGFPE}). Use @option{-mdivide-traps} to
- allow conditional traps on architectures that support them and
- @option{-mdivide-breaks} to force the use of breaks.
- The default is usually @option{-mdivide-traps}, but this can be
- overridden at configure time using @option{--with-divide=breaks}.
- Divide-by-zero checks can be completely disabled using
- @option{-mno-check-zero-division}.
- @item -mmemcpy
- @itemx -mno-memcpy
- @opindex mmemcpy
- @opindex mno-memcpy
- Force (do not force) the use of @code{memcpy} for non-trivial block
- moves. The default is @option{-mno-memcpy}, which allows GCC to inline
- most constant-sized copies.
- @item -mlong-calls
- @itemx -mno-long-calls
- @opindex mlong-calls
- @opindex mno-long-calls
- Disable (do not disable) use of the @code{jal} instruction. Calling
- functions using @code{jal} is more efficient but requires the caller
- and callee to be in the same 256 megabyte segment.
- This option has no effect on abicalls code. The default is
- @option{-mno-long-calls}.
- @item -mmad
- @itemx -mno-mad
- @opindex mmad
- @opindex mno-mad
- Enable (disable) use of the @code{mad}, @code{madu} and @code{mul}
- instructions, as provided by the R4650 ISA@.
- @item -mimadd
- @itemx -mno-imadd
- @opindex mimadd
- @opindex mno-imadd
- Enable (disable) use of the @code{madd} and @code{msub} integer
- instructions. The default is @option{-mimadd} on architectures
- that support @code{madd} and @code{msub} except for the 74k
- architecture where it was found to generate slower code.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Enable (disable) use of the floating-point multiply-accumulate
- instructions, when they are available. The default is
- @option{-mfused-madd}.
- On the R8000 CPU when multiply-accumulate instructions are used,
- the intermediate product is calculated to infinite precision
- and is not subject to the FCSR Flush to Zero bit. This may be
- undesirable in some circumstances. On other processors the result
- is numerically identical to the equivalent computation using
- separate multiply, add, subtract and negate instructions.
- @item -nocpp
- @opindex nocpp
- Tell the MIPS assembler to not run its preprocessor over user
- assembler files (with a @samp{.s} suffix) when assembling them.
- @item -mfix-24k
- @item -mno-fix-24k
- @opindex mfix-24k
- @opindex mno-fix-24k
- Work around the 24K E48 (lost data on stores during refill) errata.
- The workarounds are implemented by the assembler rather than by GCC@.
- @item -mfix-r4000
- @itemx -mno-fix-r4000
- @opindex mfix-r4000
- @opindex mno-fix-r4000
- Work around certain R4000 CPU errata:
- @itemize @minus
- @item
- A double-word or a variable shift may give an incorrect result if executed
- immediately after starting an integer division.
- @item
- A double-word or a variable shift may give an incorrect result if executed
- while an integer multiplication is in progress.
- @item
- An integer division may give an incorrect result if started in a delay slot
- of a taken branch or a jump.
- @end itemize
- @item -mfix-r4400
- @itemx -mno-fix-r4400
- @opindex mfix-r4400
- @opindex mno-fix-r4400
- Work around certain R4400 CPU errata:
- @itemize @minus
- @item
- A double-word or a variable shift may give an incorrect result if executed
- immediately after starting an integer division.
- @end itemize
- @item -mfix-r10000
- @itemx -mno-fix-r10000
- @opindex mfix-r10000
- @opindex mno-fix-r10000
- Work around certain R10000 errata:
- @itemize @minus
- @item
- @code{ll}/@code{sc} sequences may not behave atomically on revisions
- prior to 3.0. They may deadlock on revisions 2.6 and earlier.
- @end itemize
- This option can only be used if the target architecture supports
- branch-likely instructions. @option{-mfix-r10000} is the default when
- @option{-march=r10000} is used; @option{-mno-fix-r10000} is the default
- otherwise.
- @item -mfix-rm7000
- @itemx -mno-fix-rm7000
- @opindex mfix-rm7000
- Work around the RM7000 @code{dmult}/@code{dmultu} errata. The
- workarounds are implemented by the assembler rather than by GCC@.
- @item -mfix-vr4120
- @itemx -mno-fix-vr4120
- @opindex mfix-vr4120
- Work around certain VR4120 errata:
- @itemize @minus
- @item
- @code{dmultu} does not always produce the correct result.
- @item
- @code{div} and @code{ddiv} do not always produce the correct result if one
- of the operands is negative.
- @end itemize
- The workarounds for the division errata rely on special functions in
- @file{libgcc.a}. At present, these functions are only provided by
- the @code{mips64vr*-elf} configurations.
- Other VR4120 errata require a NOP to be inserted between certain pairs of
- instructions. These errata are handled by the assembler, not by GCC itself.
- @item -mfix-vr4130
- @opindex mfix-vr4130
- Work around the VR4130 @code{mflo}/@code{mfhi} errata. The
- workarounds are implemented by the assembler rather than by GCC,
- although GCC avoids using @code{mflo} and @code{mfhi} if the
- VR4130 @code{macc}, @code{macchi}, @code{dmacc} and @code{dmacchi}
- instructions are available instead.
- @item -mfix-sb1
- @itemx -mno-fix-sb1
- @opindex mfix-sb1
- Work around certain SB-1 CPU core errata.
- (This flag currently works around the SB-1 revision 2
- ``F1'' and ``F2'' floating-point errata.)
- @item -mr10k-cache-barrier=@var{setting}
- @opindex mr10k-cache-barrier
- Specify whether GCC should insert cache barriers to avoid the
- side-effects of speculation on R10K processors.
- In common with many processors, the R10K tries to predict the outcome
- of a conditional branch and speculatively executes instructions from
- the ``taken'' branch. It later aborts these instructions if the
- predicted outcome is wrong. However, on the R10K, even aborted
- instructions can have side effects.
- This problem only affects kernel stores and, depending on the system,
- kernel loads. As an example, a speculatively-executed store may load
- the target memory into cache and mark the cache line as dirty, even if
- the store itself is later aborted. If a DMA operation writes to the
- same area of memory before the ``dirty'' line is flushed, the cached
- data overwrites the DMA-ed data. See the R10K processor manual
- for a full description, including other potential problems.
- One workaround is to insert cache barrier instructions before every memory
- access that might be speculatively executed and that might have side
- effects even if aborted. @option{-mr10k-cache-barrier=@var{setting}}
- controls GCC's implementation of this workaround. It assumes that
- aborted accesses to any byte in the following regions does not have
- side effects:
- @enumerate
- @item
- the memory occupied by the current function's stack frame;
- @item
- the memory occupied by an incoming stack argument;
- @item
- the memory occupied by an object with a link-time-constant address.
- @end enumerate
- It is the kernel's responsibility to ensure that speculative
- accesses to these regions are indeed safe.
- If the input program contains a function declaration such as:
- @smallexample
- void foo (void);
- @end smallexample
- then the implementation of @code{foo} must allow @code{j foo} and
- @code{jal foo} to be executed speculatively. GCC honors this
- restriction for functions it compiles itself. It expects non-GCC
- functions (such as hand-written assembly code) to do the same.
- The option has three forms:
- @table @gcctabopt
- @item -mr10k-cache-barrier=load-store
- Insert a cache barrier before a load or store that might be
- speculatively executed and that might have side effects even
- if aborted.
- @item -mr10k-cache-barrier=store
- Insert a cache barrier before a store that might be speculatively
- executed and that might have side effects even if aborted.
- @item -mr10k-cache-barrier=none
- Disable the insertion of cache barriers. This is the default setting.
- @end table
- @item -mflush-func=@var{func}
- @itemx -mno-flush-func
- @opindex mflush-func
- Specifies the function to call to flush the I and D caches, or to not
- call any such function. If called, the function must take the same
- arguments as the common @code{_flush_func}, that is, the address of the
- memory range for which the cache is being flushed, the size of the
- memory range, and the number 3 (to flush both caches). The default
- depends on the target GCC was configured for, but commonly is either
- @code{_flush_func} or @code{__cpu_flush}.
- @item mbranch-cost=@var{num}
- @opindex mbranch-cost
- Set the cost of branches to roughly @var{num} ``simple'' instructions.
- This cost is only a heuristic and is not guaranteed to produce
- consistent results across releases. A zero cost redundantly selects
- the default, which is based on the @option{-mtune} setting.
- @item -mbranch-likely
- @itemx -mno-branch-likely
- @opindex mbranch-likely
- @opindex mno-branch-likely
- Enable or disable use of Branch Likely instructions, regardless of the
- default for the selected architecture. By default, Branch Likely
- instructions may be generated if they are supported by the selected
- architecture. An exception is for the MIPS32 and MIPS64 architectures
- and processors that implement those architectures; for those, Branch
- Likely instructions are not be generated by default because the MIPS32
- and MIPS64 architectures specifically deprecate their use.
- @item -mfp-exceptions
- @itemx -mno-fp-exceptions
- @opindex mfp-exceptions
- Specifies whether FP exceptions are enabled. This affects how
- FP instructions are scheduled for some processors.
- The default is that FP exceptions are
- enabled.
- For instance, on the SB-1, if FP exceptions are disabled, and we are emitting
- 64-bit code, then we can use both FP pipes. Otherwise, we can only use one
- FP pipe.
- @item -mvr4130-align
- @itemx -mno-vr4130-align
- @opindex mvr4130-align
- The VR4130 pipeline is two-way superscalar, but can only issue two
- instructions together if the first one is 8-byte aligned. When this
- option is enabled, GCC aligns pairs of instructions that it
- thinks should execute in parallel.
- This option only has an effect when optimizing for the VR4130.
- It normally makes code faster, but at the expense of making it bigger.
- It is enabled by default at optimization level @option{-O3}.
- @item -msynci
- @itemx -mno-synci
- @opindex msynci
- Enable (disable) generation of @code{synci} instructions on
- architectures that support it. The @code{synci} instructions (if
- enabled) are generated when @code{__builtin___clear_cache} is
- compiled.
- This option defaults to @option{-mno-synci}, but the default can be
- overridden by configuring GCC with @option{--with-synci}.
- When compiling code for single processor systems, it is generally safe
- to use @code{synci}. However, on many multi-core (SMP) systems, it
- does not invalidate the instruction caches on all cores and may lead
- to undefined behavior.
- @item -mrelax-pic-calls
- @itemx -mno-relax-pic-calls
- @opindex mrelax-pic-calls
- Try to turn PIC calls that are normally dispatched via register
- @code{$25} into direct calls. This is only possible if the linker can
- resolve the destination at link-time and if the destination is within
- range for a direct call.
- @option{-mrelax-pic-calls} is the default if GCC was configured to use
- an assembler and a linker that support the @code{.reloc} assembly
- directive and @option{-mexplicit-relocs} is in effect. With
- @option{-mno-explicit-relocs}, this optimization can be performed by the
- assembler and the linker alone without help from the compiler.
- @item -mmcount-ra-address
- @itemx -mno-mcount-ra-address
- @opindex mmcount-ra-address
- @opindex mno-mcount-ra-address
- Emit (do not emit) code that allows @code{_mcount} to modify the
- calling function's return address. When enabled, this option extends
- the usual @code{_mcount} interface with a new @var{ra-address}
- parameter, which has type @code{intptr_t *} and is passed in register
- @code{$12}. @code{_mcount} can then modify the return address by
- doing both of the following:
- @itemize
- @item
- Returning the new address in register @code{$31}.
- @item
- Storing the new address in @code{*@var{ra-address}},
- if @var{ra-address} is nonnull.
- @end itemize
- The default is @option{-mno-mcount-ra-address}.
- @end table
- @node MMIX Options
- @subsection MMIX Options
- @cindex MMIX Options
- These options are defined for the MMIX:
- @table @gcctabopt
- @item -mlibfuncs
- @itemx -mno-libfuncs
- @opindex mlibfuncs
- @opindex mno-libfuncs
- Specify that intrinsic library functions are being compiled, passing all
- values in registers, no matter the size.
- @item -mepsilon
- @itemx -mno-epsilon
- @opindex mepsilon
- @opindex mno-epsilon
- Generate floating-point comparison instructions that compare with respect
- to the @code{rE} epsilon register.
- @item -mabi=mmixware
- @itemx -mabi=gnu
- @opindex mabi=mmixware
- @opindex mabi=gnu
- Generate code that passes function parameters and return values that (in
- the called function) are seen as registers @code{$0} and up, as opposed to
- the GNU ABI which uses global registers @code{$231} and up.
- @item -mzero-extend
- @itemx -mno-zero-extend
- @opindex mzero-extend
- @opindex mno-zero-extend
- When reading data from memory in sizes shorter than 64 bits, use (do not
- use) zero-extending load instructions by default, rather than
- sign-extending ones.
- @item -mknuthdiv
- @itemx -mno-knuthdiv
- @opindex mknuthdiv
- @opindex mno-knuthdiv
- Make the result of a division yielding a remainder have the same sign as
- the divisor. With the default, @option{-mno-knuthdiv}, the sign of the
- remainder follows the sign of the dividend. Both methods are
- arithmetically valid, the latter being almost exclusively used.
- @item -mtoplevel-symbols
- @itemx -mno-toplevel-symbols
- @opindex mtoplevel-symbols
- @opindex mno-toplevel-symbols
- Prepend (do not prepend) a @samp{:} to all global symbols, so the assembly
- code can be used with the @code{PREFIX} assembly directive.
- @item -melf
- @opindex melf
- Generate an executable in the ELF format, rather than the default
- @samp{mmo} format used by the @command{mmix} simulator.
- @item -mbranch-predict
- @itemx -mno-branch-predict
- @opindex mbranch-predict
- @opindex mno-branch-predict
- Use (do not use) the probable-branch instructions, when static branch
- prediction indicates a probable branch.
- @item -mbase-addresses
- @itemx -mno-base-addresses
- @opindex mbase-addresses
- @opindex mno-base-addresses
- Generate (do not generate) code that uses @emph{base addresses}. Using a
- base address automatically generates a request (handled by the assembler
- and the linker) for a constant to be set up in a global register. The
- register is used for one or more base address requests within the range 0
- to 255 from the value held in the register. The generally leads to short
- and fast code, but the number of different data items that can be
- addressed is limited. This means that a program that uses lots of static
- data may require @option{-mno-base-addresses}.
- @item -msingle-exit
- @itemx -mno-single-exit
- @opindex msingle-exit
- @opindex mno-single-exit
- Force (do not force) generated code to have a single exit point in each
- function.
- @end table
- @node MN10300 Options
- @subsection MN10300 Options
- @cindex MN10300 options
- These @option{-m} options are defined for Matsushita MN10300 architectures:
- @table @gcctabopt
- @item -mmult-bug
- @opindex mmult-bug
- Generate code to avoid bugs in the multiply instructions for the MN10300
- processors. This is the default.
- @item -mno-mult-bug
- @opindex mno-mult-bug
- Do not generate code to avoid bugs in the multiply instructions for the
- MN10300 processors.
- @item -mam33
- @opindex mam33
- Generate code using features specific to the AM33 processor.
- @item -mno-am33
- @opindex mno-am33
- Do not generate code using features specific to the AM33 processor. This
- is the default.
- @item -mam33-2
- @opindex mam33-2
- Generate code using features specific to the AM33/2.0 processor.
- @item -mam34
- @opindex mam34
- Generate code using features specific to the AM34 processor.
- @item -mtune=@var{cpu-type}
- @opindex mtune
- Use the timing characteristics of the indicated CPU type when
- scheduling instructions. This does not change the targeted processor
- type. The CPU type must be one of @samp{mn10300}, @samp{am33},
- @samp{am33-2} or @samp{am34}.
- @item -mreturn-pointer-on-d0
- @opindex mreturn-pointer-on-d0
- When generating a function that returns a pointer, return the pointer
- in both @code{a0} and @code{d0}. Otherwise, the pointer is returned
- only in @code{a0}, and attempts to call such functions without a prototype
- result in errors. Note that this option is on by default; use
- @option{-mno-return-pointer-on-d0} to disable it.
- @item -mno-crt0
- @opindex mno-crt0
- Do not link in the C run-time initialization object file.
- @item -mrelax
- @opindex mrelax
- Indicate to the linker that it should perform a relaxation optimization pass
- to shorten branches, calls and absolute memory addresses. This option only
- has an effect when used on the command line for the final link step.
- This option makes symbolic debugging impossible.
- @item -mliw
- @opindex mliw
- Allow the compiler to generate @emph{Long Instruction Word}
- instructions if the target is the @samp{AM33} or later. This is the
- default. This option defines the preprocessor macro @code{__LIW__}.
- @item -mnoliw
- @opindex mnoliw
- Do not allow the compiler to generate @emph{Long Instruction Word}
- instructions. This option defines the preprocessor macro
- @code{__NO_LIW__}.
- @item -msetlb
- @opindex msetlb
- Allow the compiler to generate the @emph{SETLB} and @emph{Lcc}
- instructions if the target is the @samp{AM33} or later. This is the
- default. This option defines the preprocessor macro @code{__SETLB__}.
- @item -mnosetlb
- @opindex mnosetlb
- Do not allow the compiler to generate @emph{SETLB} or @emph{Lcc}
- instructions. This option defines the preprocessor macro
- @code{__NO_SETLB__}.
- @end table
- @node Moxie Options
- @subsection Moxie Options
- @cindex Moxie Options
- @table @gcctabopt
- @item -meb
- @opindex meb
- Generate big-endian code. This is the default for @samp{moxie-*-*}
- configurations.
- @item -mel
- @opindex mel
- Generate little-endian code.
- @item -mmul.x
- @opindex mmul.x
- Generate mul.x and umul.x instructions. This is the default for
- @samp{moxiebox-*-*} configurations.
- @item -mno-crt0
- @opindex mno-crt0
- Do not link in the C run-time initialization object file.
- @end table
- @node MSP430 Options
- @subsection MSP430 Options
- @cindex MSP430 Options
- These options are defined for the MSP430:
- @table @gcctabopt
- @item -masm-hex
- @opindex masm-hex
- Force assembly output to always use hex constants. Normally such
- constants are signed decimals, but this option is available for
- testsuite and/or aesthetic purposes.
- @item -mmcu=
- @opindex mmcu=
- Select the MCU to target. This is used to create a C preprocessor
- symbol based upon the MCU name, converted to upper case and pre- and
- post-fixed with @samp{__}. This in turn is used by the
- @file{msp430.h} header file to select an MCU-specific supplementary
- header file.
- The option also sets the ISA to use. If the MCU name is one that is
- known to only support the 430 ISA then that is selected, otherwise the
- 430X ISA is selected. A generic MCU name of @samp{msp430} can also be
- used to select the 430 ISA. Similarly the generic @samp{msp430x} MCU
- name selects the 430X ISA.
- In addition an MCU-specific linker script is added to the linker
- command line. The script's name is the name of the MCU with
- @file{.ld} appended. Thus specifying @option{-mmcu=xxx} on the @command{gcc}
- command line defines the C preprocessor symbol @code{__XXX__} and
- cause the linker to search for a script called @file{xxx.ld}.
- This option is also passed on to the assembler.
- @item -mcpu=
- @opindex mcpu=
- Specifies the ISA to use. Accepted values are @samp{msp430},
- @samp{msp430x} and @samp{msp430xv2}. This option is deprecated. The
- @option{-mmcu=} option should be used to select the ISA.
- @item -msim
- @opindex msim
- Link to the simulator runtime libraries and linker script. Overrides
- any scripts that would be selected by the @option{-mmcu=} option.
- @item -mlarge
- @opindex mlarge
- Use large-model addressing (20-bit pointers, 32-bit @code{size_t}).
- @item -msmall
- @opindex msmall
- Use small-model addressing (16-bit pointers, 16-bit @code{size_t}).
- @item -mrelax
- @opindex mrelax
- This option is passed to the assembler and linker, and allows the
- linker to perform certain optimizations that cannot be done until
- the final link.
- @item mhwmult=
- @opindex mhwmult=
- Describes the type of hardware multiply supported by the target.
- Accepted values are @samp{none} for no hardware multiply, @samp{16bit}
- for the original 16-bit-only multiply supported by early MCUs.
- @samp{32bit} for the 16/32-bit multiply supported by later MCUs and
- @samp{f5series} for the 16/32-bit multiply supported by F5-series MCUs.
- A value of @samp{auto} can also be given. This tells GCC to deduce
- the hardware multiply support based upon the MCU name provided by the
- @option{-mmcu} option. If no @option{-mmcu} option is specified then
- @samp{32bit} hardware multiply support is assumed. @samp{auto} is the
- default setting.
- Hardware multiplies are normally performed by calling a library
- routine. This saves space in the generated code. When compiling at
- @option{-O3} or higher however the hardware multiplier is invoked
- inline. This makes for bigger, but faster code.
- The hardware multiply routines disable interrupts whilst running and
- restore the previous interrupt state when they finish. This makes
- them safe to use inside interrupt handlers as well as in normal code.
- @item -minrt
- @opindex minrt
- Enable the use of a minimum runtime environment - no static
- initializers or constructors. This is intended for memory-constrained
- devices. The compiler includes special symbols in some objects
- that tell the linker and runtime which code fragments are required.
- @end table
- @node NDS32 Options
- @subsection NDS32 Options
- @cindex NDS32 Options
- These options are defined for NDS32 implementations:
- @table @gcctabopt
- @item -mbig-endian
- @opindex mbig-endian
- Generate code in big-endian mode.
- @item -mlittle-endian
- @opindex mlittle-endian
- Generate code in little-endian mode.
- @item -mreduced-regs
- @opindex mreduced-regs
- Use reduced-set registers for register allocation.
- @item -mfull-regs
- @opindex mfull-regs
- Use full-set registers for register allocation.
- @item -mcmov
- @opindex mcmov
- Generate conditional move instructions.
- @item -mno-cmov
- @opindex mno-cmov
- Do not generate conditional move instructions.
- @item -mperf-ext
- @opindex mperf-ext
- Generate performance extension instructions.
- @item -mno-perf-ext
- @opindex mno-perf-ext
- Do not generate performance extension instructions.
- @item -mv3push
- @opindex mv3push
- Generate v3 push25/pop25 instructions.
- @item -mno-v3push
- @opindex mno-v3push
- Do not generate v3 push25/pop25 instructions.
- @item -m16-bit
- @opindex m16-bit
- Generate 16-bit instructions.
- @item -mno-16-bit
- @opindex mno-16-bit
- Do not generate 16-bit instructions.
- @item -misr-vector-size=@var{num}
- @opindex misr-vector-size
- Specify the size of each interrupt vector, which must be 4 or 16.
- @item -mcache-block-size=@var{num}
- @opindex mcache-block-size
- Specify the size of each cache block,
- which must be a power of 2 between 4 and 512.
- @item -march=@var{arch}
- @opindex march
- Specify the name of the target architecture.
- @item -mcmodel=@var{code-model}
- @opindex mcmodel
- Set the code model to one of
- @table @asis
- @item @samp{small}
- All the data and read-only data segments must be within 512KB addressing space.
- The text segment must be within 16MB addressing space.
- @item @samp{medium}
- The data segment must be within 512KB while the read-only data segment can be
- within 4GB addressing space. The text segment should be still within 16MB
- addressing space.
- @item @samp{large}
- All the text and data segments can be within 4GB addressing space.
- @end table
- @item -mctor-dtor
- @opindex mctor-dtor
- Enable constructor/destructor feature.
- @item -mrelax
- @opindex mrelax
- Guide linker to relax instructions.
- @end table
- @node Nios II Options
- @subsection Nios II Options
- @cindex Nios II options
- @cindex Altera Nios II options
- These are the options defined for the Altera Nios II processor.
- @table @gcctabopt
- @item -G @var{num}
- @opindex G
- @cindex smaller data references
- Put global and static objects less than or equal to @var{num} bytes
- into the small data or BSS sections instead of the normal data or BSS
- sections. The default value of @var{num} is 8.
- @item -mgpopt=@var{option}
- @item -mgpopt
- @itemx -mno-gpopt
- @opindex mgpopt
- @opindex mno-gpopt
- Generate (do not generate) GP-relative accesses. The following
- @var{option} names are recognized:
- @table @samp
- @item none
- Do not generate GP-relative accesses.
- @item local
- Generate GP-relative accesses for small data objects that are not
- external or weak. Also use GP-relative addressing for objects that
- have been explicitly placed in a small data section via a @code{section}
- attribute.
- @item global
- As for @samp{local}, but also generate GP-relative accesses for
- small data objects that are external or weak. If you use this option,
- you must ensure that all parts of your program (including libraries) are
- compiled with the same @option{-G} setting.
- @item data
- Generate GP-relative accesses for all data objects in the program. If you
- use this option, the entire data and BSS segments
- of your program must fit in 64K of memory and you must use an appropriate
- linker script to allocate them within the addressible range of the
- global pointer.
- @item all
- Generate GP-relative addresses for function pointers as well as data
- pointers. If you use this option, the entire text, data, and BSS segments
- of your program must fit in 64K of memory and you must use an appropriate
- linker script to allocate them within the addressible range of the
- global pointer.
- @end table
- @option{-mgpopt} is equivalent to @option{-mgpopt=local}, and
- @option{-mno-gpopt} is equivalent to @option{-mgpopt=none}.
- The default is @option{-mgpopt} except when @option{-fpic} or
- @option{-fPIC} is specified to generate position-independent code.
- Note that the Nios II ABI does not permit GP-relative accesses from
- shared libraries.
- You may need to specify @option{-mno-gpopt} explicitly when building
- programs that include large amounts of small data, including large
- GOT data sections. In this case, the 16-bit offset for GP-relative
- addressing may not be large enough to allow access to the entire
- small data section.
- @item -mel
- @itemx -meb
- @opindex mel
- @opindex meb
- Generate little-endian (default) or big-endian (experimental) code,
- respectively.
- @item -mbypass-cache
- @itemx -mno-bypass-cache
- @opindex mno-bypass-cache
- @opindex mbypass-cache
- Force all load and store instructions to always bypass cache by
- using I/O variants of the instructions. The default is not to
- bypass the cache.
- @item -mno-cache-volatile
- @itemx -mcache-volatile
- @opindex mcache-volatile
- @opindex mno-cache-volatile
- Volatile memory access bypass the cache using the I/O variants of
- the load and store instructions. The default is not to bypass the cache.
- @item -mno-fast-sw-div
- @itemx -mfast-sw-div
- @opindex mno-fast-sw-div
- @opindex mfast-sw-div
- Do not use table-based fast divide for small numbers. The default
- is to use the fast divide at @option{-O3} and above.
- @item -mno-hw-mul
- @itemx -mhw-mul
- @itemx -mno-hw-mulx
- @itemx -mhw-mulx
- @itemx -mno-hw-div
- @itemx -mhw-div
- @opindex mno-hw-mul
- @opindex mhw-mul
- @opindex mno-hw-mulx
- @opindex mhw-mulx
- @opindex mno-hw-div
- @opindex mhw-div
- Enable or disable emitting @code{mul}, @code{mulx} and @code{div} family of
- instructions by the compiler. The default is to emit @code{mul}
- and not emit @code{div} and @code{mulx}.
- @item -mcustom-@var{insn}=@var{N}
- @itemx -mno-custom-@var{insn}
- @opindex mcustom-@var{insn}
- @opindex mno-custom-@var{insn}
- Each @option{-mcustom-@var{insn}=@var{N}} option enables use of a
- custom instruction with encoding @var{N} when generating code that uses
- @var{insn}. For example, @option{-mcustom-fadds=253} generates custom
- instruction 253 for single-precision floating-point add operations instead
- of the default behavior of using a library call.
- The following values of @var{insn} are supported. Except as otherwise
- noted, floating-point operations are expected to be implemented with
- normal IEEE 754 semantics and correspond directly to the C operators or the
- equivalent GCC built-in functions (@pxref{Other Builtins}).
- Single-precision floating point:
- @table @asis
- @item @samp{fadds}, @samp{fsubs}, @samp{fdivs}, @samp{fmuls}
- Binary arithmetic operations.
- @item @samp{fnegs}
- Unary negation.
- @item @samp{fabss}
- Unary absolute value.
- @item @samp{fcmpeqs}, @samp{fcmpges}, @samp{fcmpgts}, @samp{fcmples}, @samp{fcmplts}, @samp{fcmpnes}
- Comparison operations.
- @item @samp{fmins}, @samp{fmaxs}
- Floating-point minimum and maximum. These instructions are only
- generated if @option{-ffinite-math-only} is specified.
- @item @samp{fsqrts}
- Unary square root operation.
- @item @samp{fcoss}, @samp{fsins}, @samp{ftans}, @samp{fatans}, @samp{fexps}, @samp{flogs}
- Floating-point trigonometric and exponential functions. These instructions
- are only generated if @option{-funsafe-math-optimizations} is also specified.
- @end table
- Double-precision floating point:
- @table @asis
- @item @samp{faddd}, @samp{fsubd}, @samp{fdivd}, @samp{fmuld}
- Binary arithmetic operations.
- @item @samp{fnegd}
- Unary negation.
- @item @samp{fabsd}
- Unary absolute value.
- @item @samp{fcmpeqd}, @samp{fcmpged}, @samp{fcmpgtd}, @samp{fcmpled}, @samp{fcmpltd}, @samp{fcmpned}
- Comparison operations.
- @item @samp{fmind}, @samp{fmaxd}
- Double-precision minimum and maximum. These instructions are only
- generated if @option{-ffinite-math-only} is specified.
- @item @samp{fsqrtd}
- Unary square root operation.
- @item @samp{fcosd}, @samp{fsind}, @samp{ftand}, @samp{fatand}, @samp{fexpd}, @samp{flogd}
- Double-precision trigonometric and exponential functions. These instructions
- are only generated if @option{-funsafe-math-optimizations} is also specified.
- @end table
- Conversions:
- @table @asis
- @item @samp{fextsd}
- Conversion from single precision to double precision.
- @item @samp{ftruncds}
- Conversion from double precision to single precision.
- @item @samp{fixsi}, @samp{fixsu}, @samp{fixdi}, @samp{fixdu}
- Conversion from floating point to signed or unsigned integer types, with
- truncation towards zero.
- @item @samp{round}
- Conversion from single-precision floating point to signed integer,
- rounding to the nearest integer and ties away from zero.
- This corresponds to the @code{__builtin_lroundf} function when
- @option{-fno-math-errno} is used.
- @item @samp{floatis}, @samp{floatus}, @samp{floatid}, @samp{floatud}
- Conversion from signed or unsigned integer types to floating-point types.
- @end table
- In addition, all of the following transfer instructions for internal
- registers X and Y must be provided to use any of the double-precision
- floating-point instructions. Custom instructions taking two
- double-precision source operands expect the first operand in the
- 64-bit register X. The other operand (or only operand of a unary
- operation) is given to the custom arithmetic instruction with the
- least significant half in source register @var{src1} and the most
- significant half in @var{src2}. A custom instruction that returns a
- double-precision result returns the most significant 32 bits in the
- destination register and the other half in 32-bit register Y.
- GCC automatically generates the necessary code sequences to write
- register X and/or read register Y when double-precision floating-point
- instructions are used.
- @table @asis
- @item @samp{fwrx}
- Write @var{src1} into the least significant half of X and @var{src2} into
- the most significant half of X.
- @item @samp{fwry}
- Write @var{src1} into Y.
- @item @samp{frdxhi}, @samp{frdxlo}
- Read the most or least (respectively) significant half of X and store it in
- @var{dest}.
- @item @samp{frdy}
- Read the value of Y and store it into @var{dest}.
- @end table
- Note that you can gain more local control over generation of Nios II custom
- instructions by using the @code{target("custom-@var{insn}=@var{N}")}
- and @code{target("no-custom-@var{insn}")} function attributes
- (@pxref{Function Attributes})
- or pragmas (@pxref{Function Specific Option Pragmas}).
- @item -mcustom-fpu-cfg=@var{name}
- @opindex mcustom-fpu-cfg
- This option enables a predefined, named set of custom instruction encodings
- (see @option{-mcustom-@var{insn}} above).
- Currently, the following sets are defined:
- @option{-mcustom-fpu-cfg=60-1} is equivalent to:
- @gccoptlist{-mcustom-fmuls=252 @gol
- -mcustom-fadds=253 @gol
- -mcustom-fsubs=254 @gol
- -fsingle-precision-constant}
- @option{-mcustom-fpu-cfg=60-2} is equivalent to:
- @gccoptlist{-mcustom-fmuls=252 @gol
- -mcustom-fadds=253 @gol
- -mcustom-fsubs=254 @gol
- -mcustom-fdivs=255 @gol
- -fsingle-precision-constant}
- @option{-mcustom-fpu-cfg=72-3} is equivalent to:
- @gccoptlist{-mcustom-floatus=243 @gol
- -mcustom-fixsi=244 @gol
- -mcustom-floatis=245 @gol
- -mcustom-fcmpgts=246 @gol
- -mcustom-fcmples=249 @gol
- -mcustom-fcmpeqs=250 @gol
- -mcustom-fcmpnes=251 @gol
- -mcustom-fmuls=252 @gol
- -mcustom-fadds=253 @gol
- -mcustom-fsubs=254 @gol
- -mcustom-fdivs=255 @gol
- -fsingle-precision-constant}
- Custom instruction assignments given by individual
- @option{-mcustom-@var{insn}=} options override those given by
- @option{-mcustom-fpu-cfg=}, regardless of the
- order of the options on the command line.
- Note that you can gain more local control over selection of a FPU
- configuration by using the @code{target("custom-fpu-cfg=@var{name}")}
- function attribute (@pxref{Function Attributes})
- or pragma (@pxref{Function Specific Option Pragmas}).
- @end table
- These additional @samp{-m} options are available for the Altera Nios II
- ELF (bare-metal) target:
- @table @gcctabopt
- @item -mhal
- @opindex mhal
- Link with HAL BSP. This suppresses linking with the GCC-provided C runtime
- startup and termination code, and is typically used in conjunction with
- @option{-msys-crt0=} to specify the location of the alternate startup code
- provided by the HAL BSP.
- @item -msmallc
- @opindex msmallc
- Link with a limited version of the C library, @option{-lsmallc}, rather than
- Newlib.
- @item -msys-crt0=@var{startfile}
- @opindex msys-crt0
- @var{startfile} is the file name of the startfile (crt0) to use
- when linking. This option is only useful in conjunction with @option{-mhal}.
- @item -msys-lib=@var{systemlib}
- @opindex msys-lib
- @var{systemlib} is the library name of the library that provides
- low-level system calls required by the C library,
- e.g. @code{read} and @code{write}.
- This option is typically used to link with a library provided by a HAL BSP.
- @end table
- @node Nvidia PTX Options
- @subsection Nvidia PTX Options
- @cindex Nvidia PTX options
- @cindex nvptx options
- These options are defined for Nvidia PTX:
- @table @gcctabopt
- @item -m32
- @itemx -m64
- @opindex m32
- @opindex m64
- Generate code for 32-bit or 64-bit ABI.
- @item -mmainkernel
- @opindex mmainkernel
- Link in code for a __main kernel. This is for stand-alone instead of
- offloading execution.
- @end table
- @node PDP-11 Options
- @subsection PDP-11 Options
- @cindex PDP-11 Options
- These options are defined for the PDP-11:
- @table @gcctabopt
- @item -mfpu
- @opindex mfpu
- Use hardware FPP floating point. This is the default. (FIS floating
- point on the PDP-11/40 is not supported.)
- @item -msoft-float
- @opindex msoft-float
- Do not use hardware floating point.
- @item -mac0
- @opindex mac0
- Return floating-point results in ac0 (fr0 in Unix assembler syntax).
- @item -mno-ac0
- @opindex mno-ac0
- Return floating-point results in memory. This is the default.
- @item -m40
- @opindex m40
- Generate code for a PDP-11/40.
- @item -m45
- @opindex m45
- Generate code for a PDP-11/45. This is the default.
- @item -m10
- @opindex m10
- Generate code for a PDP-11/10.
- @item -mbcopy-builtin
- @opindex mbcopy-builtin
- Use inline @code{movmemhi} patterns for copying memory. This is the
- default.
- @item -mbcopy
- @opindex mbcopy
- Do not use inline @code{movmemhi} patterns for copying memory.
- @item -mint16
- @itemx -mno-int32
- @opindex mint16
- @opindex mno-int32
- Use 16-bit @code{int}. This is the default.
- @item -mint32
- @itemx -mno-int16
- @opindex mint32
- @opindex mno-int16
- Use 32-bit @code{int}.
- @item -mfloat64
- @itemx -mno-float32
- @opindex mfloat64
- @opindex mno-float32
- Use 64-bit @code{float}. This is the default.
- @item -mfloat32
- @itemx -mno-float64
- @opindex mfloat32
- @opindex mno-float64
- Use 32-bit @code{float}.
- @item -mabshi
- @opindex mabshi
- Use @code{abshi2} pattern. This is the default.
- @item -mno-abshi
- @opindex mno-abshi
- Do not use @code{abshi2} pattern.
- @item -mbranch-expensive
- @opindex mbranch-expensive
- Pretend that branches are expensive. This is for experimenting with
- code generation only.
- @item -mbranch-cheap
- @opindex mbranch-cheap
- Do not pretend that branches are expensive. This is the default.
- @item -munix-asm
- @opindex munix-asm
- Use Unix assembler syntax. This is the default when configured for
- @samp{pdp11-*-bsd}.
- @item -mdec-asm
- @opindex mdec-asm
- Use DEC assembler syntax. This is the default when configured for any
- PDP-11 target other than @samp{pdp11-*-bsd}.
- @end table
- @node picoChip Options
- @subsection picoChip Options
- @cindex picoChip options
- These @samp{-m} options are defined for picoChip implementations:
- @table @gcctabopt
- @item -mae=@var{ae_type}
- @opindex mcpu
- Set the instruction set, register set, and instruction scheduling
- parameters for array element type @var{ae_type}. Supported values
- for @var{ae_type} are @samp{ANY}, @samp{MUL}, and @samp{MAC}.
- @option{-mae=ANY} selects a completely generic AE type. Code
- generated with this option runs on any of the other AE types. The
- code is not as efficient as it would be if compiled for a specific
- AE type, and some types of operation (e.g., multiplication) do not
- work properly on all types of AE.
- @option{-mae=MUL} selects a MUL AE type. This is the most useful AE type
- for compiled code, and is the default.
- @option{-mae=MAC} selects a DSP-style MAC AE. Code compiled with this
- option may suffer from poor performance of byte (char) manipulation,
- since the DSP AE does not provide hardware support for byte load/stores.
- @item -msymbol-as-address
- Enable the compiler to directly use a symbol name as an address in a
- load/store instruction, without first loading it into a
- register. Typically, the use of this option generates larger
- programs, which run faster than when the option isn't used. However, the
- results vary from program to program, so it is left as a user option,
- rather than being permanently enabled.
- @item -mno-inefficient-warnings
- Disables warnings about the generation of inefficient code. These
- warnings can be generated, for example, when compiling code that
- performs byte-level memory operations on the MAC AE type. The MAC AE has
- no hardware support for byte-level memory operations, so all byte
- load/stores must be synthesized from word load/store operations. This is
- inefficient and a warning is generated to indicate
- that you should rewrite the code to avoid byte operations, or to target
- an AE type that has the necessary hardware support. This option disables
- these warnings.
- @end table
- @node PowerPC Options
- @subsection PowerPC Options
- @cindex PowerPC options
- These are listed under @xref{RS/6000 and PowerPC Options}.
- @node RL78 Options
- @subsection RL78 Options
- @cindex RL78 Options
- @table @gcctabopt
- @item -msim
- @opindex msim
- Links in additional target libraries to support operation within a
- simulator.
- @item -mmul=none
- @itemx -mmul=g13
- @itemx -mmul=rl78
- @opindex mmul
- Specifies the type of hardware multiplication support to be used. The
- default is @samp{none}, which uses software multiplication functions.
- The @samp{g13} option is for the hardware multiply/divide peripheral
- only on the RL78/G13 targets. The @samp{rl78} option is for the
- standard hardware multiplication defined in the RL78 software manual.
- @item -m64bit-doubles
- @itemx -m32bit-doubles
- @opindex m64bit-doubles
- @opindex m32bit-doubles
- Make the @code{double} data type be 64 bits (@option{-m64bit-doubles})
- or 32 bits (@option{-m32bit-doubles}) in size. The default is
- @option{-m32bit-doubles}.
- @end table
- @node RS/6000 and PowerPC Options
- @subsection IBM RS/6000 and PowerPC Options
- @cindex RS/6000 and PowerPC Options
- @cindex IBM RS/6000 and PowerPC Options
- These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
- @table @gcctabopt
- @item -mpowerpc-gpopt
- @itemx -mno-powerpc-gpopt
- @itemx -mpowerpc-gfxopt
- @itemx -mno-powerpc-gfxopt
- @need 800
- @itemx -mpowerpc64
- @itemx -mno-powerpc64
- @itemx -mmfcrf
- @itemx -mno-mfcrf
- @itemx -mpopcntb
- @itemx -mno-popcntb
- @itemx -mpopcntd
- @itemx -mno-popcntd
- @itemx -mfprnd
- @itemx -mno-fprnd
- @need 800
- @itemx -mcmpb
- @itemx -mno-cmpb
- @itemx -mmfpgpr
- @itemx -mno-mfpgpr
- @itemx -mhard-dfp
- @itemx -mno-hard-dfp
- @opindex mpowerpc-gpopt
- @opindex mno-powerpc-gpopt
- @opindex mpowerpc-gfxopt
- @opindex mno-powerpc-gfxopt
- @opindex mpowerpc64
- @opindex mno-powerpc64
- @opindex mmfcrf
- @opindex mno-mfcrf
- @opindex mpopcntb
- @opindex mno-popcntb
- @opindex mpopcntd
- @opindex mno-popcntd
- @opindex mfprnd
- @opindex mno-fprnd
- @opindex mcmpb
- @opindex mno-cmpb
- @opindex mmfpgpr
- @opindex mno-mfpgpr
- @opindex mhard-dfp
- @opindex mno-hard-dfp
- You use these options to specify which instructions are available on the
- processor you are using. The default value of these options is
- determined when configuring GCC@. Specifying the
- @option{-mcpu=@var{cpu_type}} overrides the specification of these
- options. We recommend you use the @option{-mcpu=@var{cpu_type}} option
- rather than the options listed above.
- Specifying @option{-mpowerpc-gpopt} allows
- GCC to use the optional PowerPC architecture instructions in the
- General Purpose group, including floating-point square root. Specifying
- @option{-mpowerpc-gfxopt} allows GCC to
- use the optional PowerPC architecture instructions in the Graphics
- group, including floating-point select.
- The @option{-mmfcrf} option allows GCC to generate the move from
- condition register field instruction implemented on the POWER4
- processor and other processors that support the PowerPC V2.01
- architecture.
- The @option{-mpopcntb} option allows GCC to generate the popcount and
- double-precision FP reciprocal estimate instruction implemented on the
- POWER5 processor and other processors that support the PowerPC V2.02
- architecture.
- The @option{-mpopcntd} option allows GCC to generate the popcount
- instruction implemented on the POWER7 processor and other processors
- that support the PowerPC V2.06 architecture.
- The @option{-mfprnd} option allows GCC to generate the FP round to
- integer instructions implemented on the POWER5+ processor and other
- processors that support the PowerPC V2.03 architecture.
- The @option{-mcmpb} option allows GCC to generate the compare bytes
- instruction implemented on the POWER6 processor and other processors
- that support the PowerPC V2.05 architecture.
- The @option{-mmfpgpr} option allows GCC to generate the FP move to/from
- general-purpose register instructions implemented on the POWER6X
- processor and other processors that support the extended PowerPC V2.05
- architecture.
- The @option{-mhard-dfp} option allows GCC to generate the decimal
- floating-point instructions implemented on some POWER processors.
- The @option{-mpowerpc64} option allows GCC to generate the additional
- 64-bit instructions that are found in the full PowerPC64 architecture
- and to treat GPRs as 64-bit, doubleword quantities. GCC defaults to
- @option{-mno-powerpc64}.
- @item -mcpu=@var{cpu_type}
- @opindex mcpu
- Set architecture type, register usage, and
- instruction scheduling parameters for machine type @var{cpu_type}.
- Supported values for @var{cpu_type} are @samp{401}, @samp{403},
- @samp{405}, @samp{405fp}, @samp{440}, @samp{440fp}, @samp{464}, @samp{464fp},
- @samp{476}, @samp{476fp}, @samp{505}, @samp{601}, @samp{602}, @samp{603},
- @samp{603e}, @samp{604}, @samp{604e}, @samp{620}, @samp{630}, @samp{740},
- @samp{7400}, @samp{7450}, @samp{750}, @samp{801}, @samp{821}, @samp{823},
- @samp{860}, @samp{970}, @samp{8540}, @samp{a2}, @samp{e300c2},
- @samp{e300c3}, @samp{e500mc}, @samp{e500mc64}, @samp{e5500},
- @samp{e6500}, @samp{ec603e}, @samp{G3}, @samp{G4}, @samp{G5},
- @samp{titan}, @samp{power3}, @samp{power4}, @samp{power5}, @samp{power5+},
- @samp{power6}, @samp{power6x}, @samp{power7}, @samp{power8}, @samp{powerpc},
- @samp{powerpc64}, @samp{powerpc64le}, and @samp{rs64}.
- @option{-mcpu=powerpc}, @option{-mcpu=powerpc64}, and
- @option{-mcpu=powerpc64le} specify pure 32-bit PowerPC (either
- endian), 64-bit big endian PowerPC and 64-bit little endian PowerPC
- architecture machine types, with an appropriate, generic processor
- model assumed for scheduling purposes.
- The other options specify a specific processor. Code generated under
- those options runs best on that processor, and may not run at all on
- others.
- The @option{-mcpu} options automatically enable or disable the
- following options:
- @gccoptlist{-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple @gol
- -mpopcntb -mpopcntd -mpowerpc64 @gol
- -mpowerpc-gpopt -mpowerpc-gfxopt -msingle-float -mdouble-float @gol
- -msimple-fpu -mstring -mmulhw -mdlmzb -mmfpgpr -mvsx @gol
- -mcrypto -mdirect-move -mpower8-fusion -mpower8-vector @gol
- -mquad-memory -mquad-memory-atomic}
- The particular options set for any particular CPU varies between
- compiler versions, depending on what setting seems to produce optimal
- code for that CPU; it doesn't necessarily reflect the actual hardware's
- capabilities. If you wish to set an individual option to a particular
- value, you may specify it after the @option{-mcpu} option, like
- @option{-mcpu=970 -mno-altivec}.
- On AIX, the @option{-maltivec} and @option{-mpowerpc64} options are
- not enabled or disabled by the @option{-mcpu} option at present because
- AIX does not have full support for these options. You may still
- enable or disable them individually if you're sure it'll work in your
- environment.
- @item -mtune=@var{cpu_type}
- @opindex mtune
- Set the instruction scheduling parameters for machine type
- @var{cpu_type}, but do not set the architecture type or register usage,
- as @option{-mcpu=@var{cpu_type}} does. The same
- values for @var{cpu_type} are used for @option{-mtune} as for
- @option{-mcpu}. If both are specified, the code generated uses the
- architecture and registers set by @option{-mcpu}, but the
- scheduling parameters set by @option{-mtune}.
- @item -mcmodel=small
- @opindex mcmodel=small
- Generate PowerPC64 code for the small model: The TOC is limited to
- 64k.
- @item -mcmodel=medium
- @opindex mcmodel=medium
- Generate PowerPC64 code for the medium model: The TOC and other static
- data may be up to a total of 4G in size.
- @item -mcmodel=large
- @opindex mcmodel=large
- Generate PowerPC64 code for the large model: The TOC may be up to 4G
- in size. Other data and code is only limited by the 64-bit address
- space.
- @item -maltivec
- @itemx -mno-altivec
- @opindex maltivec
- @opindex mno-altivec
- Generate code that uses (does not use) AltiVec instructions, and also
- enable the use of built-in functions that allow more direct access to
- the AltiVec instruction set. You may also need to set
- @option{-mabi=altivec} to adjust the current ABI with AltiVec ABI
- enhancements.
- When @option{-maltivec} is used, rather than @option{-maltivec=le} or
- @option{-maltivec=be}, the element order for Altivec intrinsics such
- as @code{vec_splat}, @code{vec_extract}, and @code{vec_insert}
- match array element order corresponding to the endianness of the
- target. That is, element zero identifies the leftmost element in a
- vector register when targeting a big-endian platform, and identifies
- the rightmost element in a vector register when targeting a
- little-endian platform.
- @item -maltivec=be
- @opindex maltivec=be
- Generate Altivec instructions using big-endian element order,
- regardless of whether the target is big- or little-endian. This is
- the default when targeting a big-endian platform.
- The element order is used to interpret element numbers in Altivec
- intrinsics such as @code{vec_splat}, @code{vec_extract}, and
- @code{vec_insert}. By default, these match array element order
- corresponding to the endianness for the target.
- @item -maltivec=le
- @opindex maltivec=le
- Generate Altivec instructions using little-endian element order,
- regardless of whether the target is big- or little-endian. This is
- the default when targeting a little-endian platform. This option is
- currently ignored when targeting a big-endian platform.
- The element order is used to interpret element numbers in Altivec
- intrinsics such as @code{vec_splat}, @code{vec_extract}, and
- @code{vec_insert}. By default, these match array element order
- corresponding to the endianness for the target.
- @item -mvrsave
- @itemx -mno-vrsave
- @opindex mvrsave
- @opindex mno-vrsave
- Generate VRSAVE instructions when generating AltiVec code.
- @item -mgen-cell-microcode
- @opindex mgen-cell-microcode
- Generate Cell microcode instructions.
- @item -mwarn-cell-microcode
- @opindex mwarn-cell-microcode
- Warn when a Cell microcode instruction is emitted. An example
- of a Cell microcode instruction is a variable shift.
- @item -msecure-plt
- @opindex msecure-plt
- Generate code that allows @command{ld} and @command{ld.so}
- to build executables and shared
- libraries with non-executable @code{.plt} and @code{.got} sections.
- This is a PowerPC
- 32-bit SYSV ABI option.
- @item -mbss-plt
- @opindex mbss-plt
- Generate code that uses a BSS @code{.plt} section that @command{ld.so}
- fills in, and
- requires @code{.plt} and @code{.got}
- sections that are both writable and executable.
- This is a PowerPC 32-bit SYSV ABI option.
- @item -misel
- @itemx -mno-isel
- @opindex misel
- @opindex mno-isel
- This switch enables or disables the generation of ISEL instructions.
- @item -misel=@var{yes/no}
- This switch has been deprecated. Use @option{-misel} and
- @option{-mno-isel} instead.
- @item -mspe
- @itemx -mno-spe
- @opindex mspe
- @opindex mno-spe
- This switch enables or disables the generation of SPE simd
- instructions.
- @item -mpaired
- @itemx -mno-paired
- @opindex mpaired
- @opindex mno-paired
- This switch enables or disables the generation of PAIRED simd
- instructions.
- @item -mspe=@var{yes/no}
- This option has been deprecated. Use @option{-mspe} and
- @option{-mno-spe} instead.
- @item -mvsx
- @itemx -mno-vsx
- @opindex mvsx
- @opindex mno-vsx
- Generate code that uses (does not use) vector/scalar (VSX)
- instructions, and also enable the use of built-in functions that allow
- more direct access to the VSX instruction set.
- @item -mcrypto
- @itemx -mno-crypto
- @opindex mcrypto
- @opindex mno-crypto
- Enable the use (disable) of the built-in functions that allow direct
- access to the cryptographic instructions that were added in version
- 2.07 of the PowerPC ISA.
- @item -mdirect-move
- @itemx -mno-direct-move
- @opindex mdirect-move
- @opindex mno-direct-move
- Generate code that uses (does not use) the instructions to move data
- between the general purpose registers and the vector/scalar (VSX)
- registers that were added in version 2.07 of the PowerPC ISA.
- @item -mpower8-fusion
- @itemx -mno-power8-fusion
- @opindex mpower8-fusion
- @opindex mno-power8-fusion
- Generate code that keeps (does not keeps) some integer operations
- adjacent so that the instructions can be fused together on power8 and
- later processors.
- @item -mpower8-vector
- @itemx -mno-power8-vector
- @opindex mpower8-vector
- @opindex mno-power8-vector
- Generate code that uses (does not use) the vector and scalar
- instructions that were added in version 2.07 of the PowerPC ISA. Also
- enable the use of built-in functions that allow more direct access to
- the vector instructions.
- @item -mquad-memory
- @itemx -mno-quad-memory
- @opindex mquad-memory
- @opindex mno-quad-memory
- Generate code that uses (does not use) the non-atomic quad word memory
- instructions. The @option{-mquad-memory} option requires use of
- 64-bit mode.
- @item -mquad-memory-atomic
- @itemx -mno-quad-memory-atomic
- @opindex mquad-memory-atomic
- @opindex mno-quad-memory-atomic
- Generate code that uses (does not use) the atomic quad word memory
- instructions. The @option{-mquad-memory-atomic} option requires use of
- 64-bit mode.
- @item -mupper-regs-df
- @itemx -mno-upper-regs-df
- @opindex mupper-regs-df
- @opindex mno-upper-regs-df
- Generate code that uses (does not use) the scalar double precision
- instructions that target all 64 registers in the vector/scalar
- floating point register set that were added in version 2.06 of the
- PowerPC ISA. @option{-mupper-regs-df} is turned on by default if you
- use any of the @option{-mcpu=power7}, @option{-mcpu=power8}, or
- @option{-mvsx} options.
- @item -mupper-regs-sf
- @itemx -mno-upper-regs-sf
- @opindex mupper-regs-sf
- @opindex mno-upper-regs-sf
- Generate code that uses (does not use) the scalar single precision
- instructions that target all 64 registers in the vector/scalar
- floating point register set that were added in version 2.07 of the
- PowerPC ISA. @option{-mupper-regs-sf} is turned on by default if you
- use either of the @option{-mcpu=power8} or @option{-mpower8-vector}
- options.
- @item -mupper-regs
- @itemx -mno-upper-regs
- @opindex mupper-regs
- @opindex mno-upper-regs
- Generate code that uses (does not use) the scalar
- instructions that target all 64 registers in the vector/scalar
- floating point register set, depending on the model of the machine.
- If the @option{-mno-upper-regs} option is used, it turns off both
- @option{-mupper-regs-sf} and @option{-mupper-regs-df} options.
- @item -mfloat-gprs=@var{yes/single/double/no}
- @itemx -mfloat-gprs
- @opindex mfloat-gprs
- This switch enables or disables the generation of floating-point
- operations on the general-purpose registers for architectures that
- support it.
- The argument @samp{yes} or @samp{single} enables the use of
- single-precision floating-point operations.
- The argument @samp{double} enables the use of single and
- double-precision floating-point operations.
- The argument @samp{no} disables floating-point operations on the
- general-purpose registers.
- This option is currently only available on the MPC854x.
- @item -m32
- @itemx -m64
- @opindex m32
- @opindex m64
- Generate code for 32-bit or 64-bit environments of Darwin and SVR4
- targets (including GNU/Linux). The 32-bit environment sets int, long
- and pointer to 32 bits and generates code that runs on any PowerPC
- variant. The 64-bit environment sets int to 32 bits and long and
- pointer to 64 bits, and generates code for PowerPC64, as for
- @option{-mpowerpc64}.
- @item -mfull-toc
- @itemx -mno-fp-in-toc
- @itemx -mno-sum-in-toc
- @itemx -mminimal-toc
- @opindex mfull-toc
- @opindex mno-fp-in-toc
- @opindex mno-sum-in-toc
- @opindex mminimal-toc
- Modify generation of the TOC (Table Of Contents), which is created for
- every executable file. The @option{-mfull-toc} option is selected by
- default. In that case, GCC allocates at least one TOC entry for
- each unique non-automatic variable reference in your program. GCC
- also places floating-point constants in the TOC@. However, only
- 16,384 entries are available in the TOC@.
- If you receive a linker error message that saying you have overflowed
- the available TOC space, you can reduce the amount of TOC space used
- with the @option{-mno-fp-in-toc} and @option{-mno-sum-in-toc} options.
- @option{-mno-fp-in-toc} prevents GCC from putting floating-point
- constants in the TOC and @option{-mno-sum-in-toc} forces GCC to
- generate code to calculate the sum of an address and a constant at
- run time instead of putting that sum into the TOC@. You may specify one
- or both of these options. Each causes GCC to produce very slightly
- slower and larger code at the expense of conserving TOC space.
- If you still run out of space in the TOC even when you specify both of
- these options, specify @option{-mminimal-toc} instead. This option causes
- GCC to make only one TOC entry for every file. When you specify this
- option, GCC produces code that is slower and larger but which
- uses extremely little TOC space. You may wish to use this option
- only on files that contain less frequently-executed code.
- @item -maix64
- @itemx -maix32
- @opindex maix64
- @opindex maix32
- Enable 64-bit AIX ABI and calling convention: 64-bit pointers, 64-bit
- @code{long} type, and the infrastructure needed to support them.
- Specifying @option{-maix64} implies @option{-mpowerpc64},
- while @option{-maix32} disables the 64-bit ABI and
- implies @option{-mno-powerpc64}. GCC defaults to @option{-maix32}.
- @item -mxl-compat
- @itemx -mno-xl-compat
- @opindex mxl-compat
- @opindex mno-xl-compat
- Produce code that conforms more closely to IBM XL compiler semantics
- when using AIX-compatible ABI@. Pass floating-point arguments to
- prototyped functions beyond the register save area (RSA) on the stack
- in addition to argument FPRs. Do not assume that most significant
- double in 128-bit long double value is properly rounded when comparing
- values and converting to double. Use XL symbol names for long double
- support routines.
- The AIX calling convention was extended but not initially documented to
- handle an obscure K&R C case of calling a function that takes the
- address of its arguments with fewer arguments than declared. IBM XL
- compilers access floating-point arguments that do not fit in the
- RSA from the stack when a subroutine is compiled without
- optimization. Because always storing floating-point arguments on the
- stack is inefficient and rarely needed, this option is not enabled by
- default and only is necessary when calling subroutines compiled by IBM
- XL compilers without optimization.
- @item -mpe
- @opindex mpe
- Support @dfn{IBM RS/6000 SP} @dfn{Parallel Environment} (PE)@. Link an
- application written to use message passing with special startup code to
- enable the application to run. The system must have PE installed in the
- standard location (@file{/usr/lpp/ppe.poe/}), or the @file{specs} file
- must be overridden with the @option{-specs=} option to specify the
- appropriate directory location. The Parallel Environment does not
- support threads, so the @option{-mpe} option and the @option{-pthread}
- option are incompatible.
- @item -malign-natural
- @itemx -malign-power
- @opindex malign-natural
- @opindex malign-power
- On AIX, 32-bit Darwin, and 64-bit PowerPC GNU/Linux, the option
- @option{-malign-natural} overrides the ABI-defined alignment of larger
- types, such as floating-point doubles, on their natural size-based boundary.
- The option @option{-malign-power} instructs GCC to follow the ABI-specified
- alignment rules. GCC defaults to the standard alignment defined in the ABI@.
- On 64-bit Darwin, natural alignment is the default, and @option{-malign-power}
- is not supported.
- @item -msoft-float
- @itemx -mhard-float
- @opindex msoft-float
- @opindex mhard-float
- Generate code that does not use (uses) the floating-point register set.
- Software floating-point emulation is provided if you use the
- @option{-msoft-float} option, and pass the option to GCC when linking.
- @item -msingle-float
- @itemx -mdouble-float
- @opindex msingle-float
- @opindex mdouble-float
- Generate code for single- or double-precision floating-point operations.
- @option{-mdouble-float} implies @option{-msingle-float}.
- @item -msimple-fpu
- @opindex msimple-fpu
- Do not generate @code{sqrt} and @code{div} instructions for hardware
- floating-point unit.
- @item -mfpu=@var{name}
- @opindex mfpu
- Specify type of floating-point unit. Valid values for @var{name} are
- @samp{sp_lite} (equivalent to @option{-msingle-float -msimple-fpu}),
- @samp{dp_lite} (equivalent to @option{-mdouble-float -msimple-fpu}),
- @samp{sp_full} (equivalent to @option{-msingle-float}),
- and @samp{dp_full} (equivalent to @option{-mdouble-float}).
- @item -mxilinx-fpu
- @opindex mxilinx-fpu
- Perform optimizations for the floating-point unit on Xilinx PPC 405/440.
- @item -mmultiple
- @itemx -mno-multiple
- @opindex mmultiple
- @opindex mno-multiple
- Generate code that uses (does not use) the load multiple word
- instructions and the store multiple word instructions. These
- instructions are generated by default on POWER systems, and not
- generated on PowerPC systems. Do not use @option{-mmultiple} on little-endian
- PowerPC systems, since those instructions do not work when the
- processor is in little-endian mode. The exceptions are PPC740 and
- PPC750 which permit these instructions in little-endian mode.
- @item -mstring
- @itemx -mno-string
- @opindex mstring
- @opindex mno-string
- Generate code that uses (does not use) the load string instructions
- and the store string word instructions to save multiple registers and
- do small block moves. These instructions are generated by default on
- POWER systems, and not generated on PowerPC systems. Do not use
- @option{-mstring} on little-endian PowerPC systems, since those
- instructions do not work when the processor is in little-endian mode.
- The exceptions are PPC740 and PPC750 which permit these instructions
- in little-endian mode.
- @item -mupdate
- @itemx -mno-update
- @opindex mupdate
- @opindex mno-update
- Generate code that uses (does not use) the load or store instructions
- that update the base register to the address of the calculated memory
- location. These instructions are generated by default. If you use
- @option{-mno-update}, there is a small window between the time that the
- stack pointer is updated and the address of the previous frame is
- stored, which means code that walks the stack frame across interrupts or
- signals may get corrupted data.
- @item -mavoid-indexed-addresses
- @itemx -mno-avoid-indexed-addresses
- @opindex mavoid-indexed-addresses
- @opindex mno-avoid-indexed-addresses
- Generate code that tries to avoid (not avoid) the use of indexed load
- or store instructions. These instructions can incur a performance
- penalty on Power6 processors in certain situations, such as when
- stepping through large arrays that cross a 16M boundary. This option
- is enabled by default when targeting Power6 and disabled otherwise.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Generate code that uses (does not use) the floating-point multiply and
- accumulate instructions. These instructions are generated by default
- if hardware floating point is used. The machine-dependent
- @option{-mfused-madd} option is now mapped to the machine-independent
- @option{-ffp-contract=fast} option, and @option{-mno-fused-madd} is
- mapped to @option{-ffp-contract=off}.
- @item -mmulhw
- @itemx -mno-mulhw
- @opindex mmulhw
- @opindex mno-mulhw
- Generate code that uses (does not use) the half-word multiply and
- multiply-accumulate instructions on the IBM 405, 440, 464 and 476 processors.
- These instructions are generated by default when targeting those
- processors.
- @item -mdlmzb
- @itemx -mno-dlmzb
- @opindex mdlmzb
- @opindex mno-dlmzb
- Generate code that uses (does not use) the string-search @samp{dlmzb}
- instruction on the IBM 405, 440, 464 and 476 processors. This instruction is
- generated by default when targeting those processors.
- @item -mno-bit-align
- @itemx -mbit-align
- @opindex mno-bit-align
- @opindex mbit-align
- On System V.4 and embedded PowerPC systems do not (do) force structures
- and unions that contain bit-fields to be aligned to the base type of the
- bit-field.
- For example, by default a structure containing nothing but 8
- @code{unsigned} bit-fields of length 1 is aligned to a 4-byte
- boundary and has a size of 4 bytes. By using @option{-mno-bit-align},
- the structure is aligned to a 1-byte boundary and is 1 byte in
- size.
- @item -mno-strict-align
- @itemx -mstrict-align
- @opindex mno-strict-align
- @opindex mstrict-align
- On System V.4 and embedded PowerPC systems do not (do) assume that
- unaligned memory references are handled by the system.
- @item -mrelocatable
- @itemx -mno-relocatable
- @opindex mrelocatable
- @opindex mno-relocatable
- Generate code that allows (does not allow) a static executable to be
- relocated to a different address at run time. A simple embedded
- PowerPC system loader should relocate the entire contents of
- @code{.got2} and 4-byte locations listed in the @code{.fixup} section,
- a table of 32-bit addresses generated by this option. For this to
- work, all objects linked together must be compiled with
- @option{-mrelocatable} or @option{-mrelocatable-lib}.
- @option{-mrelocatable} code aligns the stack to an 8-byte boundary.
- @item -mrelocatable-lib
- @itemx -mno-relocatable-lib
- @opindex mrelocatable-lib
- @opindex mno-relocatable-lib
- Like @option{-mrelocatable}, @option{-mrelocatable-lib} generates a
- @code{.fixup} section to allow static executables to be relocated at
- run time, but @option{-mrelocatable-lib} does not use the smaller stack
- alignment of @option{-mrelocatable}. Objects compiled with
- @option{-mrelocatable-lib} may be linked with objects compiled with
- any combination of the @option{-mrelocatable} options.
- @item -mno-toc
- @itemx -mtoc
- @opindex mno-toc
- @opindex mtoc
- On System V.4 and embedded PowerPC systems do not (do) assume that
- register 2 contains a pointer to a global area pointing to the addresses
- used in the program.
- @item -mlittle
- @itemx -mlittle-endian
- @opindex mlittle
- @opindex mlittle-endian
- On System V.4 and embedded PowerPC systems compile code for the
- processor in little-endian mode. The @option{-mlittle-endian} option is
- the same as @option{-mlittle}.
- @item -mbig
- @itemx -mbig-endian
- @opindex mbig
- @opindex mbig-endian
- On System V.4 and embedded PowerPC systems compile code for the
- processor in big-endian mode. The @option{-mbig-endian} option is
- the same as @option{-mbig}.
- @item -mdynamic-no-pic
- @opindex mdynamic-no-pic
- On Darwin and Mac OS X systems, compile code so that it is not
- relocatable, but that its external references are relocatable. The
- resulting code is suitable for applications, but not shared
- libraries.
- @item -msingle-pic-base
- @opindex msingle-pic-base
- Treat the register used for PIC addressing as read-only, rather than
- loading it in the prologue for each function. The runtime system is
- responsible for initializing this register with an appropriate value
- before execution begins.
- @item -mprioritize-restricted-insns=@var{priority}
- @opindex mprioritize-restricted-insns
- This option controls the priority that is assigned to
- dispatch-slot restricted instructions during the second scheduling
- pass. The argument @var{priority} takes the value @samp{0}, @samp{1},
- or @samp{2} to assign no, highest, or second-highest (respectively)
- priority to dispatch-slot restricted
- instructions.
- @item -msched-costly-dep=@var{dependence_type}
- @opindex msched-costly-dep
- This option controls which dependences are considered costly
- by the target during instruction scheduling. The argument
- @var{dependence_type} takes one of the following values:
- @table @asis
- @item @samp{no}
- No dependence is costly.
- @item @samp{all}
- All dependences are costly.
- @item @samp{true_store_to_load}
- A true dependence from store to load is costly.
- @item @samp{store_to_load}
- Any dependence from store to load is costly.
- @item @var{number}
- Any dependence for which the latency is greater than or equal to
- @var{number} is costly.
- @end table
- @item -minsert-sched-nops=@var{scheme}
- @opindex minsert-sched-nops
- This option controls which NOP insertion scheme is used during
- the second scheduling pass. The argument @var{scheme} takes one of the
- following values:
- @table @asis
- @item @samp{no}
- Don't insert NOPs.
- @item @samp{pad}
- Pad with NOPs any dispatch group that has vacant issue slots,
- according to the scheduler's grouping.
- @item @samp{regroup_exact}
- Insert NOPs to force costly dependent insns into
- separate groups. Insert exactly as many NOPs as needed to force an insn
- to a new group, according to the estimated processor grouping.
- @item @var{number}
- Insert NOPs to force costly dependent insns into
- separate groups. Insert @var{number} NOPs to force an insn to a new group.
- @end table
- @item -mcall-sysv
- @opindex mcall-sysv
- On System V.4 and embedded PowerPC systems compile code using calling
- conventions that adhere to the March 1995 draft of the System V
- Application Binary Interface, PowerPC processor supplement. This is the
- default unless you configured GCC using @samp{powerpc-*-eabiaix}.
- @item -mcall-sysv-eabi
- @itemx -mcall-eabi
- @opindex mcall-sysv-eabi
- @opindex mcall-eabi
- Specify both @option{-mcall-sysv} and @option{-meabi} options.
- @item -mcall-sysv-noeabi
- @opindex mcall-sysv-noeabi
- Specify both @option{-mcall-sysv} and @option{-mno-eabi} options.
- @item -mcall-aixdesc
- @opindex m
- On System V.4 and embedded PowerPC systems compile code for the AIX
- operating system.
- @item -mcall-linux
- @opindex mcall-linux
- On System V.4 and embedded PowerPC systems compile code for the
- Linux-based GNU system.
- @item -mcall-freebsd
- @opindex mcall-freebsd
- On System V.4 and embedded PowerPC systems compile code for the
- FreeBSD operating system.
- @item -mcall-netbsd
- @opindex mcall-netbsd
- On System V.4 and embedded PowerPC systems compile code for the
- NetBSD operating system.
- @item -mcall-openbsd
- @opindex mcall-netbsd
- On System V.4 and embedded PowerPC systems compile code for the
- OpenBSD operating system.
- @item -maix-struct-return
- @opindex maix-struct-return
- Return all structures in memory (as specified by the AIX ABI)@.
- @item -msvr4-struct-return
- @opindex msvr4-struct-return
- Return structures smaller than 8 bytes in registers (as specified by the
- SVR4 ABI)@.
- @item -mabi=@var{abi-type}
- @opindex mabi
- Extend the current ABI with a particular extension, or remove such extension.
- Valid values are @samp{altivec}, @samp{no-altivec}, @samp{spe},
- @samp{no-spe}, @samp{ibmlongdouble}, @samp{ieeelongdouble},
- @samp{elfv1}, @samp{elfv2}@.
- @item -mabi=spe
- @opindex mabi=spe
- Extend the current ABI with SPE ABI extensions. This does not change
- the default ABI, instead it adds the SPE ABI extensions to the current
- ABI@.
- @item -mabi=no-spe
- @opindex mabi=no-spe
- Disable Book-E SPE ABI extensions for the current ABI@.
- @item -mabi=ibmlongdouble
- @opindex mabi=ibmlongdouble
- Change the current ABI to use IBM extended-precision long double.
- This is a PowerPC 32-bit SYSV ABI option.
- @item -mabi=ieeelongdouble
- @opindex mabi=ieeelongdouble
- Change the current ABI to use IEEE extended-precision long double.
- This is a PowerPC 32-bit Linux ABI option.
- @item -mabi=elfv1
- @opindex mabi=elfv1
- Change the current ABI to use the ELFv1 ABI.
- This is the default ABI for big-endian PowerPC 64-bit Linux.
- Overriding the default ABI requires special system support and is
- likely to fail in spectacular ways.
- @item -mabi=elfv2
- @opindex mabi=elfv2
- Change the current ABI to use the ELFv2 ABI.
- This is the default ABI for little-endian PowerPC 64-bit Linux.
- Overriding the default ABI requires special system support and is
- likely to fail in spectacular ways.
- @item -mprototype
- @itemx -mno-prototype
- @opindex mprototype
- @opindex mno-prototype
- On System V.4 and embedded PowerPC systems assume that all calls to
- variable argument functions are properly prototyped. Otherwise, the
- compiler must insert an instruction before every non-prototyped call to
- set or clear bit 6 of the condition code register (@code{CR}) to
- indicate whether floating-point values are passed in the floating-point
- registers in case the function takes variable arguments. With
- @option{-mprototype}, only calls to prototyped variable argument functions
- set or clear the bit.
- @item -msim
- @opindex msim
- On embedded PowerPC systems, assume that the startup module is called
- @file{sim-crt0.o} and that the standard C libraries are @file{libsim.a} and
- @file{libc.a}. This is the default for @samp{powerpc-*-eabisim}
- configurations.
- @item -mmvme
- @opindex mmvme
- On embedded PowerPC systems, assume that the startup module is called
- @file{crt0.o} and the standard C libraries are @file{libmvme.a} and
- @file{libc.a}.
- @item -mads
- @opindex mads
- On embedded PowerPC systems, assume that the startup module is called
- @file{crt0.o} and the standard C libraries are @file{libads.a} and
- @file{libc.a}.
- @item -myellowknife
- @opindex myellowknife
- On embedded PowerPC systems, assume that the startup module is called
- @file{crt0.o} and the standard C libraries are @file{libyk.a} and
- @file{libc.a}.
- @item -mvxworks
- @opindex mvxworks
- On System V.4 and embedded PowerPC systems, specify that you are
- compiling for a VxWorks system.
- @item -memb
- @opindex memb
- On embedded PowerPC systems, set the @code{PPC_EMB} bit in the ELF flags
- header to indicate that @samp{eabi} extended relocations are used.
- @item -meabi
- @itemx -mno-eabi
- @opindex meabi
- @opindex mno-eabi
- On System V.4 and embedded PowerPC systems do (do not) adhere to the
- Embedded Applications Binary Interface (EABI), which is a set of
- modifications to the System V.4 specifications. Selecting @option{-meabi}
- means that the stack is aligned to an 8-byte boundary, a function
- @code{__eabi} is called from @code{main} to set up the EABI
- environment, and the @option{-msdata} option can use both @code{r2} and
- @code{r13} to point to two separate small data areas. Selecting
- @option{-mno-eabi} means that the stack is aligned to a 16-byte boundary,
- no EABI initialization function is called from @code{main}, and the
- @option{-msdata} option only uses @code{r13} to point to a single
- small data area. The @option{-meabi} option is on by default if you
- configured GCC using one of the @samp{powerpc*-*-eabi*} options.
- @item -msdata=eabi
- @opindex msdata=eabi
- On System V.4 and embedded PowerPC systems, put small initialized
- @code{const} global and static data in the @code{.sdata2} section, which
- is pointed to by register @code{r2}. Put small initialized
- non-@code{const} global and static data in the @code{.sdata} section,
- which is pointed to by register @code{r13}. Put small uninitialized
- global and static data in the @code{.sbss} section, which is adjacent to
- the @code{.sdata} section. The @option{-msdata=eabi} option is
- incompatible with the @option{-mrelocatable} option. The
- @option{-msdata=eabi} option also sets the @option{-memb} option.
- @item -msdata=sysv
- @opindex msdata=sysv
- On System V.4 and embedded PowerPC systems, put small global and static
- data in the @code{.sdata} section, which is pointed to by register
- @code{r13}. Put small uninitialized global and static data in the
- @code{.sbss} section, which is adjacent to the @code{.sdata} section.
- The @option{-msdata=sysv} option is incompatible with the
- @option{-mrelocatable} option.
- @item -msdata=default
- @itemx -msdata
- @opindex msdata=default
- @opindex msdata
- On System V.4 and embedded PowerPC systems, if @option{-meabi} is used,
- compile code the same as @option{-msdata=eabi}, otherwise compile code the
- same as @option{-msdata=sysv}.
- @item -msdata=data
- @opindex msdata=data
- On System V.4 and embedded PowerPC systems, put small global
- data in the @code{.sdata} section. Put small uninitialized global
- data in the @code{.sbss} section. Do not use register @code{r13}
- to address small data however. This is the default behavior unless
- other @option{-msdata} options are used.
- @item -msdata=none
- @itemx -mno-sdata
- @opindex msdata=none
- @opindex mno-sdata
- On embedded PowerPC systems, put all initialized global and static data
- in the @code{.data} section, and all uninitialized data in the
- @code{.bss} section.
- @item -mblock-move-inline-limit=@var{num}
- @opindex mblock-move-inline-limit
- Inline all block moves (such as calls to @code{memcpy} or structure
- copies) less than or equal to @var{num} bytes. The minimum value for
- @var{num} is 32 bytes on 32-bit targets and 64 bytes on 64-bit
- targets. The default value is target-specific.
- @item -G @var{num}
- @opindex G
- @cindex smaller data references (PowerPC)
- @cindex .sdata/.sdata2 references (PowerPC)
- On embedded PowerPC systems, put global and static items less than or
- equal to @var{num} bytes into the small data or BSS sections instead of
- the normal data or BSS section. By default, @var{num} is 8. The
- @option{-G @var{num}} switch is also passed to the linker.
- All modules should be compiled with the same @option{-G @var{num}} value.
- @item -mregnames
- @itemx -mno-regnames
- @opindex mregnames
- @opindex mno-regnames
- On System V.4 and embedded PowerPC systems do (do not) emit register
- names in the assembly language output using symbolic forms.
- @item -mlongcall
- @itemx -mno-longcall
- @opindex mlongcall
- @opindex mno-longcall
- By default assume that all calls are far away so that a longer and more
- expensive calling sequence is required. This is required for calls
- farther than 32 megabytes (33,554,432 bytes) from the current location.
- A short call is generated if the compiler knows
- the call cannot be that far away. This setting can be overridden by
- the @code{shortcall} function attribute, or by @code{#pragma
- longcall(0)}.
- Some linkers are capable of detecting out-of-range calls and generating
- glue code on the fly. On these systems, long calls are unnecessary and
- generate slower code. As of this writing, the AIX linker can do this,
- as can the GNU linker for PowerPC/64. It is planned to add this feature
- to the GNU linker for 32-bit PowerPC systems as well.
- On Darwin/PPC systems, @code{#pragma longcall} generates @code{jbsr
- callee, L42}, plus a @dfn{branch island} (glue code). The two target
- addresses represent the callee and the branch island. The
- Darwin/PPC linker prefers the first address and generates a @code{bl
- callee} if the PPC @code{bl} instruction reaches the callee directly;
- otherwise, the linker generates @code{bl L42} to call the branch
- island. The branch island is appended to the body of the
- calling function; it computes the full 32-bit address of the callee
- and jumps to it.
- On Mach-O (Darwin) systems, this option directs the compiler emit to
- the glue for every direct call, and the Darwin linker decides whether
- to use or discard it.
- In the future, GCC may ignore all longcall specifications
- when the linker is known to generate glue.
- @item -mtls-markers
- @itemx -mno-tls-markers
- @opindex mtls-markers
- @opindex mno-tls-markers
- Mark (do not mark) calls to @code{__tls_get_addr} with a relocation
- specifying the function argument. The relocation allows the linker to
- reliably associate function call with argument setup instructions for
- TLS optimization, which in turn allows GCC to better schedule the
- sequence.
- @item -pthread
- @opindex pthread
- Adds support for multithreading with the @dfn{pthreads} library.
- This option sets flags for both the preprocessor and linker.
- @item -mrecip
- @itemx -mno-recip
- @opindex mrecip
- This option enables use of the reciprocal estimate and
- reciprocal square root estimate instructions with additional
- Newton-Raphson steps to increase precision instead of doing a divide or
- square root and divide for floating-point arguments. You should use
- the @option{-ffast-math} option when using @option{-mrecip} (or at
- least @option{-funsafe-math-optimizations},
- @option{-finite-math-only}, @option{-freciprocal-math} and
- @option{-fno-trapping-math}). Note that while the throughput of the
- sequence is generally higher than the throughput of the non-reciprocal
- instruction, the precision of the sequence can be decreased by up to 2
- ulp (i.e.@: the inverse of 1.0 equals 0.99999994) for reciprocal square
- roots.
- @item -mrecip=@var{opt}
- @opindex mrecip=opt
- This option controls which reciprocal estimate instructions
- may be used. @var{opt} is a comma-separated list of options, which may
- be preceded by a @code{!} to invert the option:
- @table @samp
- @item all
- Enable all estimate instructions.
- @item default
- Enable the default instructions, equivalent to @option{-mrecip}.
- @item none
- Disable all estimate instructions, equivalent to @option{-mno-recip}.
- @item div
- Enable the reciprocal approximation instructions for both
- single and double precision.
- @item divf
- Enable the single-precision reciprocal approximation instructions.
- @item divd
- Enable the double-precision reciprocal approximation instructions.
- @item rsqrt
- Enable the reciprocal square root approximation instructions for both
- single and double precision.
- @item rsqrtf
- Enable the single-precision reciprocal square root approximation instructions.
- @item rsqrtd
- Enable the double-precision reciprocal square root approximation instructions.
- @end table
- So, for example, @option{-mrecip=all,!rsqrtd} enables
- all of the reciprocal estimate instructions, except for the
- @code{FRSQRTE}, @code{XSRSQRTEDP}, and @code{XVRSQRTEDP} instructions
- which handle the double-precision reciprocal square root calculations.
- @item -mrecip-precision
- @itemx -mno-recip-precision
- @opindex mrecip-precision
- Assume (do not assume) that the reciprocal estimate instructions
- provide higher-precision estimates than is mandated by the PowerPC
- ABI. Selecting @option{-mcpu=power6}, @option{-mcpu=power7} or
- @option{-mcpu=power8} automatically selects @option{-mrecip-precision}.
- The double-precision square root estimate instructions are not generated by
- default on low-precision machines, since they do not provide an
- estimate that converges after three steps.
- @item -mveclibabi=@var{type}
- @opindex mveclibabi
- Specifies the ABI type to use for vectorizing intrinsics using an
- external library. The only type supported at present is @samp{mass},
- which specifies to use IBM's Mathematical Acceleration Subsystem
- (MASS) libraries for vectorizing intrinsics using external libraries.
- GCC currently emits calls to @code{acosd2}, @code{acosf4},
- @code{acoshd2}, @code{acoshf4}, @code{asind2}, @code{asinf4},
- @code{asinhd2}, @code{asinhf4}, @code{atan2d2}, @code{atan2f4},
- @code{atand2}, @code{atanf4}, @code{atanhd2}, @code{atanhf4},
- @code{cbrtd2}, @code{cbrtf4}, @code{cosd2}, @code{cosf4},
- @code{coshd2}, @code{coshf4}, @code{erfcd2}, @code{erfcf4},
- @code{erfd2}, @code{erff4}, @code{exp2d2}, @code{exp2f4},
- @code{expd2}, @code{expf4}, @code{expm1d2}, @code{expm1f4},
- @code{hypotd2}, @code{hypotf4}, @code{lgammad2}, @code{lgammaf4},
- @code{log10d2}, @code{log10f4}, @code{log1pd2}, @code{log1pf4},
- @code{log2d2}, @code{log2f4}, @code{logd2}, @code{logf4},
- @code{powd2}, @code{powf4}, @code{sind2}, @code{sinf4}, @code{sinhd2},
- @code{sinhf4}, @code{sqrtd2}, @code{sqrtf4}, @code{tand2},
- @code{tanf4}, @code{tanhd2}, and @code{tanhf4} when generating code
- for power7. Both @option{-ftree-vectorize} and
- @option{-funsafe-math-optimizations} must also be enabled. The MASS
- libraries must be specified at link time.
- @item -mfriz
- @itemx -mno-friz
- @opindex mfriz
- Generate (do not generate) the @code{friz} instruction when the
- @option{-funsafe-math-optimizations} option is used to optimize
- rounding of floating-point values to 64-bit integer and back to floating
- point. The @code{friz} instruction does not return the same value if
- the floating-point number is too large to fit in an integer.
- @item -mpointers-to-nested-functions
- @itemx -mno-pointers-to-nested-functions
- @opindex mpointers-to-nested-functions
- Generate (do not generate) code to load up the static chain register
- (@code{r11}) when calling through a pointer on AIX and 64-bit Linux
- systems where a function pointer points to a 3-word descriptor giving
- the function address, TOC value to be loaded in register @code{r2}, and
- static chain value to be loaded in register @code{r11}. The
- @option{-mpointers-to-nested-functions} is on by default. You cannot
- call through pointers to nested functions or pointers
- to functions compiled in other languages that use the static chain if
- you use @option{-mno-pointers-to-nested-functions}.
- @item -msave-toc-indirect
- @itemx -mno-save-toc-indirect
- @opindex msave-toc-indirect
- Generate (do not generate) code to save the TOC value in the reserved
- stack location in the function prologue if the function calls through
- a pointer on AIX and 64-bit Linux systems. If the TOC value is not
- saved in the prologue, it is saved just before the call through the
- pointer. The @option{-mno-save-toc-indirect} option is the default.
- @item -mcompat-align-parm
- @itemx -mno-compat-align-parm
- @opindex mcompat-align-parm
- Generate (do not generate) code to pass structure parameters with a
- maximum alignment of 64 bits, for compatibility with older versions
- of GCC.
- Older versions of GCC (prior to 4.9.0) incorrectly did not align a
- structure parameter on a 128-bit boundary when that structure contained
- a member requiring 128-bit alignment. This is corrected in more
- recent versions of GCC. This option may be used to generate code
- that is compatible with functions compiled with older versions of
- GCC.
- The @option{-mno-compat-align-parm} option is the default.
- @end table
- @node RX Options
- @subsection RX Options
- @cindex RX Options
- These command-line options are defined for RX targets:
- @table @gcctabopt
- @item -m64bit-doubles
- @itemx -m32bit-doubles
- @opindex m64bit-doubles
- @opindex m32bit-doubles
- Make the @code{double} data type be 64 bits (@option{-m64bit-doubles})
- or 32 bits (@option{-m32bit-doubles}) in size. The default is
- @option{-m32bit-doubles}. @emph{Note} RX floating-point hardware only
- works on 32-bit values, which is why the default is
- @option{-m32bit-doubles}.
- @item -fpu
- @itemx -nofpu
- @opindex fpu
- @opindex nofpu
- Enables (@option{-fpu}) or disables (@option{-nofpu}) the use of RX
- floating-point hardware. The default is enabled for the RX600
- series and disabled for the RX200 series.
- Floating-point instructions are only generated for 32-bit floating-point
- values, however, so the FPU hardware is not used for doubles if the
- @option{-m64bit-doubles} option is used.
- @emph{Note} If the @option{-fpu} option is enabled then
- @option{-funsafe-math-optimizations} is also enabled automatically.
- This is because the RX FPU instructions are themselves unsafe.
- @item -mcpu=@var{name}
- @opindex mcpu
- Selects the type of RX CPU to be targeted. Currently three types are
- supported, the generic @samp{RX600} and @samp{RX200} series hardware and
- the specific @samp{RX610} CPU. The default is @samp{RX600}.
- The only difference between @samp{RX600} and @samp{RX610} is that the
- @samp{RX610} does not support the @code{MVTIPL} instruction.
- The @samp{RX200} series does not have a hardware floating-point unit
- and so @option{-nofpu} is enabled by default when this type is
- selected.
- @item -mbig-endian-data
- @itemx -mlittle-endian-data
- @opindex mbig-endian-data
- @opindex mlittle-endian-data
- Store data (but not code) in the big-endian format. The default is
- @option{-mlittle-endian-data}, i.e.@: to store data in the little-endian
- format.
- @item -msmall-data-limit=@var{N}
- @opindex msmall-data-limit
- Specifies the maximum size in bytes of global and static variables
- which can be placed into the small data area. Using the small data
- area can lead to smaller and faster code, but the size of area is
- limited and it is up to the programmer to ensure that the area does
- not overflow. Also when the small data area is used one of the RX's
- registers (usually @code{r13}) is reserved for use pointing to this
- area, so it is no longer available for use by the compiler. This
- could result in slower and/or larger code if variables are pushed onto
- the stack instead of being held in this register.
- Note, common variables (variables that have not been initialized) and
- constants are not placed into the small data area as they are assigned
- to other sections in the output executable.
- The default value is zero, which disables this feature. Note, this
- feature is not enabled by default with higher optimization levels
- (@option{-O2} etc) because of the potentially detrimental effects of
- reserving a register. It is up to the programmer to experiment and
- discover whether this feature is of benefit to their program. See the
- description of the @option{-mpid} option for a description of how the
- actual register to hold the small data area pointer is chosen.
- @item -msim
- @itemx -mno-sim
- @opindex msim
- @opindex mno-sim
- Use the simulator runtime. The default is to use the libgloss
- board-specific runtime.
- @item -mas100-syntax
- @itemx -mno-as100-syntax
- @opindex mas100-syntax
- @opindex mno-as100-syntax
- When generating assembler output use a syntax that is compatible with
- Renesas's AS100 assembler. This syntax can also be handled by the GAS
- assembler, but it has some restrictions so it is not generated by default.
- @item -mmax-constant-size=@var{N}
- @opindex mmax-constant-size
- Specifies the maximum size, in bytes, of a constant that can be used as
- an operand in a RX instruction. Although the RX instruction set does
- allow constants of up to 4 bytes in length to be used in instructions,
- a longer value equates to a longer instruction. Thus in some
- circumstances it can be beneficial to restrict the size of constants
- that are used in instructions. Constants that are too big are instead
- placed into a constant pool and referenced via register indirection.
- The value @var{N} can be between 0 and 4. A value of 0 (the default)
- or 4 means that constants of any size are allowed.
- @item -mrelax
- @opindex mrelax
- Enable linker relaxation. Linker relaxation is a process whereby the
- linker attempts to reduce the size of a program by finding shorter
- versions of various instructions. Disabled by default.
- @item -mint-register=@var{N}
- @opindex mint-register
- Specify the number of registers to reserve for fast interrupt handler
- functions. The value @var{N} can be between 0 and 4. A value of 1
- means that register @code{r13} is reserved for the exclusive use
- of fast interrupt handlers. A value of 2 reserves @code{r13} and
- @code{r12}. A value of 3 reserves @code{r13}, @code{r12} and
- @code{r11}, and a value of 4 reserves @code{r13} through @code{r10}.
- A value of 0, the default, does not reserve any registers.
- @item -msave-acc-in-interrupts
- @opindex msave-acc-in-interrupts
- Specifies that interrupt handler functions should preserve the
- accumulator register. This is only necessary if normal code might use
- the accumulator register, for example because it performs 64-bit
- multiplications. The default is to ignore the accumulator as this
- makes the interrupt handlers faster.
- @item -mpid
- @itemx -mno-pid
- @opindex mpid
- @opindex mno-pid
- Enables the generation of position independent data. When enabled any
- access to constant data is done via an offset from a base address
- held in a register. This allows the location of constant data to be
- determined at run time without requiring the executable to be
- relocated, which is a benefit to embedded applications with tight
- memory constraints. Data that can be modified is not affected by this
- option.
- Note, using this feature reserves a register, usually @code{r13}, for
- the constant data base address. This can result in slower and/or
- larger code, especially in complicated functions.
- The actual register chosen to hold the constant data base address
- depends upon whether the @option{-msmall-data-limit} and/or the
- @option{-mint-register} command-line options are enabled. Starting
- with register @code{r13} and proceeding downwards, registers are
- allocated first to satisfy the requirements of @option{-mint-register},
- then @option{-mpid} and finally @option{-msmall-data-limit}. Thus it
- is possible for the small data area register to be @code{r8} if both
- @option{-mint-register=4} and @option{-mpid} are specified on the
- command line.
- By default this feature is not enabled. The default can be restored
- via the @option{-mno-pid} command-line option.
- @item -mno-warn-multiple-fast-interrupts
- @itemx -mwarn-multiple-fast-interrupts
- @opindex mno-warn-multiple-fast-interrupts
- @opindex mwarn-multiple-fast-interrupts
- Prevents GCC from issuing a warning message if it finds more than one
- fast interrupt handler when it is compiling a file. The default is to
- issue a warning for each extra fast interrupt handler found, as the RX
- only supports one such interrupt.
- @end table
- @emph{Note:} The generic GCC command-line option @option{-ffixed-@var{reg}}
- has special significance to the RX port when used with the
- @code{interrupt} function attribute. This attribute indicates a
- function intended to process fast interrupts. GCC ensures
- that it only uses the registers @code{r10}, @code{r11}, @code{r12}
- and/or @code{r13} and only provided that the normal use of the
- corresponding registers have been restricted via the
- @option{-ffixed-@var{reg}} or @option{-mint-register} command-line
- options.
- @node S/390 and zSeries Options
- @subsection S/390 and zSeries Options
- @cindex S/390 and zSeries Options
- These are the @samp{-m} options defined for the S/390 and zSeries architecture.
- @table @gcctabopt
- @item -mhard-float
- @itemx -msoft-float
- @opindex mhard-float
- @opindex msoft-float
- Use (do not use) the hardware floating-point instructions and registers
- for floating-point operations. When @option{-msoft-float} is specified,
- functions in @file{libgcc.a} are used to perform floating-point
- operations. When @option{-mhard-float} is specified, the compiler
- generates IEEE floating-point instructions. This is the default.
- @item -mhard-dfp
- @itemx -mno-hard-dfp
- @opindex mhard-dfp
- @opindex mno-hard-dfp
- Use (do not use) the hardware decimal-floating-point instructions for
- decimal-floating-point operations. When @option{-mno-hard-dfp} is
- specified, functions in @file{libgcc.a} are used to perform
- decimal-floating-point operations. When @option{-mhard-dfp} is
- specified, the compiler generates decimal-floating-point hardware
- instructions. This is the default for @option{-march=z9-ec} or higher.
- @item -mlong-double-64
- @itemx -mlong-double-128
- @opindex mlong-double-64
- @opindex mlong-double-128
- These switches control the size of @code{long double} type. A size
- of 64 bits makes the @code{long double} type equivalent to the @code{double}
- type. This is the default.
- @item -mbackchain
- @itemx -mno-backchain
- @opindex mbackchain
- @opindex mno-backchain
- Store (do not store) the address of the caller's frame as backchain pointer
- into the callee's stack frame.
- A backchain may be needed to allow debugging using tools that do not understand
- DWARF 2 call frame information.
- When @option{-mno-packed-stack} is in effect, the backchain pointer is stored
- at the bottom of the stack frame; when @option{-mpacked-stack} is in effect,
- the backchain is placed into the topmost word of the 96/160 byte register
- save area.
- In general, code compiled with @option{-mbackchain} is call-compatible with
- code compiled with @option{-mmo-backchain}; however, use of the backchain
- for debugging purposes usually requires that the whole binary is built with
- @option{-mbackchain}. Note that the combination of @option{-mbackchain},
- @option{-mpacked-stack} and @option{-mhard-float} is not supported. In order
- to build a linux kernel use @option{-msoft-float}.
- The default is to not maintain the backchain.
- @item -mpacked-stack
- @itemx -mno-packed-stack
- @opindex mpacked-stack
- @opindex mno-packed-stack
- Use (do not use) the packed stack layout. When @option{-mno-packed-stack} is
- specified, the compiler uses the all fields of the 96/160 byte register save
- area only for their default purpose; unused fields still take up stack space.
- When @option{-mpacked-stack} is specified, register save slots are densely
- packed at the top of the register save area; unused space is reused for other
- purposes, allowing for more efficient use of the available stack space.
- However, when @option{-mbackchain} is also in effect, the topmost word of
- the save area is always used to store the backchain, and the return address
- register is always saved two words below the backchain.
- As long as the stack frame backchain is not used, code generated with
- @option{-mpacked-stack} is call-compatible with code generated with
- @option{-mno-packed-stack}. Note that some non-FSF releases of GCC 2.95 for
- S/390 or zSeries generated code that uses the stack frame backchain at run
- time, not just for debugging purposes. Such code is not call-compatible
- with code compiled with @option{-mpacked-stack}. Also, note that the
- combination of @option{-mbackchain},
- @option{-mpacked-stack} and @option{-mhard-float} is not supported. In order
- to build a linux kernel use @option{-msoft-float}.
- The default is to not use the packed stack layout.
- @item -msmall-exec
- @itemx -mno-small-exec
- @opindex msmall-exec
- @opindex mno-small-exec
- Generate (or do not generate) code using the @code{bras} instruction
- to do subroutine calls.
- This only works reliably if the total executable size does not
- exceed 64k. The default is to use the @code{basr} instruction instead,
- which does not have this limitation.
- @item -m64
- @itemx -m31
- @opindex m64
- @opindex m31
- When @option{-m31} is specified, generate code compliant to the
- GNU/Linux for S/390 ABI@. When @option{-m64} is specified, generate
- code compliant to the GNU/Linux for zSeries ABI@. This allows GCC in
- particular to generate 64-bit instructions. For the @samp{s390}
- targets, the default is @option{-m31}, while the @samp{s390x}
- targets default to @option{-m64}.
- @item -mzarch
- @itemx -mesa
- @opindex mzarch
- @opindex mesa
- When @option{-mzarch} is specified, generate code using the
- instructions available on z/Architecture.
- When @option{-mesa} is specified, generate code using the
- instructions available on ESA/390. Note that @option{-mesa} is
- not possible with @option{-m64}.
- When generating code compliant to the GNU/Linux for S/390 ABI,
- the default is @option{-mesa}. When generating code compliant
- to the GNU/Linux for zSeries ABI, the default is @option{-mzarch}.
- @item -mmvcle
- @itemx -mno-mvcle
- @opindex mmvcle
- @opindex mno-mvcle
- Generate (or do not generate) code using the @code{mvcle} instruction
- to perform block moves. When @option{-mno-mvcle} is specified,
- use a @code{mvc} loop instead. This is the default unless optimizing for
- size.
- @item -mdebug
- @itemx -mno-debug
- @opindex mdebug
- @opindex mno-debug
- Print (or do not print) additional debug information when compiling.
- The default is to not print debug information.
- @item -march=@var{cpu-type}
- @opindex march
- Generate code that runs on @var{cpu-type}, which is the name of a system
- representing a certain processor type. Possible values for
- @var{cpu-type} are @samp{g5}, @samp{g6}, @samp{z900}, @samp{z990},
- @samp{z9-109}, @samp{z9-ec}, @samp{z10}, @samp{z196}, @samp{zEC12},
- and @samp{z13}.
- When generating code using the instructions available on z/Architecture,
- the default is @option{-march=z900}. Otherwise, the default is
- @option{-march=g5}.
- @item -mtune=@var{cpu-type}
- @opindex mtune
- Tune to @var{cpu-type} everything applicable about the generated code,
- except for the ABI and the set of available instructions.
- The list of @var{cpu-type} values is the same as for @option{-march}.
- The default is the value used for @option{-march}.
- @item -mtpf-trace
- @itemx -mno-tpf-trace
- @opindex mtpf-trace
- @opindex mno-tpf-trace
- Generate code that adds (does not add) in TPF OS specific branches to trace
- routines in the operating system. This option is off by default, even
- when compiling for the TPF OS@.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Generate code that uses (does not use) the floating-point multiply and
- accumulate instructions. These instructions are generated by default if
- hardware floating point is used.
- @item -mwarn-framesize=@var{framesize}
- @opindex mwarn-framesize
- Emit a warning if the current function exceeds the given frame size. Because
- this is a compile-time check it doesn't need to be a real problem when the program
- runs. It is intended to identify functions that most probably cause
- a stack overflow. It is useful to be used in an environment with limited stack
- size e.g.@: the linux kernel.
- @item -mwarn-dynamicstack
- @opindex mwarn-dynamicstack
- Emit a warning if the function calls @code{alloca} or uses dynamically-sized
- arrays. This is generally a bad idea with a limited stack size.
- @item -mstack-guard=@var{stack-guard}
- @itemx -mstack-size=@var{stack-size}
- @opindex mstack-guard
- @opindex mstack-size
- If these options are provided the S/390 back end emits additional instructions in
- the function prologue that trigger a trap if the stack size is @var{stack-guard}
- bytes above the @var{stack-size} (remember that the stack on S/390 grows downward).
- If the @var{stack-guard} option is omitted the smallest power of 2 larger than
- the frame size of the compiled function is chosen.
- These options are intended to be used to help debugging stack overflow problems.
- The additionally emitted code causes only little overhead and hence can also be
- used in production-like systems without greater performance degradation. The given
- values have to be exact powers of 2 and @var{stack-size} has to be greater than
- @var{stack-guard} without exceeding 64k.
- In order to be efficient the extra code makes the assumption that the stack starts
- at an address aligned to the value given by @var{stack-size}.
- The @var{stack-guard} option can only be used in conjunction with @var{stack-size}.
- @item -mhotpatch=@var{pre-halfwords},@var{post-halfwords}
- @opindex mhotpatch
- If the hotpatch option is enabled, a ``hot-patching'' function
- prologue is generated for all functions in the compilation unit.
- The funtion label is prepended with the given number of two-byte
- NOP instructions (@var{pre-halfwords}, maximum 1000000). After
- the label, 2 * @var{post-halfwords} bytes are appended, using the
- largest NOP like instructions the architecture allows (maximum
- 1000000).
- If both arguments are zero, hotpatching is disabled.
- This option can be overridden for individual functions with the
- @code{hotpatch} attribute.
- @end table
- @node Score Options
- @subsection Score Options
- @cindex Score Options
- These options are defined for Score implementations:
- @table @gcctabopt
- @item -meb
- @opindex meb
- Compile code for big-endian mode. This is the default.
- @item -mel
- @opindex mel
- Compile code for little-endian mode.
- @item -mnhwloop
- @opindex mnhwloop
- Disable generation of @code{bcnz} instructions.
- @item -muls
- @opindex muls
- Enable generation of unaligned load and store instructions.
- @item -mmac
- @opindex mmac
- Enable the use of multiply-accumulate instructions. Disabled by default.
- @item -mscore5
- @opindex mscore5
- Specify the SCORE5 as the target architecture.
- @item -mscore5u
- @opindex mscore5u
- Specify the SCORE5U of the target architecture.
- @item -mscore7
- @opindex mscore7
- Specify the SCORE7 as the target architecture. This is the default.
- @item -mscore7d
- @opindex mscore7d
- Specify the SCORE7D as the target architecture.
- @end table
- @node SH Options
- @subsection SH Options
- These @samp{-m} options are defined for the SH implementations:
- @table @gcctabopt
- @item -m1
- @opindex m1
- Generate code for the SH1.
- @item -m2
- @opindex m2
- Generate code for the SH2.
- @item -m2e
- Generate code for the SH2e.
- @item -m2a-nofpu
- @opindex m2a-nofpu
- Generate code for the SH2a without FPU, or for a SH2a-FPU in such a way
- that the floating-point unit is not used.
- @item -m2a-single-only
- @opindex m2a-single-only
- Generate code for the SH2a-FPU, in such a way that no double-precision
- floating-point operations are used.
- @item -m2a-single
- @opindex m2a-single
- Generate code for the SH2a-FPU assuming the floating-point unit is in
- single-precision mode by default.
- @item -m2a
- @opindex m2a
- Generate code for the SH2a-FPU assuming the floating-point unit is in
- double-precision mode by default.
- @item -m3
- @opindex m3
- Generate code for the SH3.
- @item -m3e
- @opindex m3e
- Generate code for the SH3e.
- @item -m4-nofpu
- @opindex m4-nofpu
- Generate code for the SH4 without a floating-point unit.
- @item -m4-single-only
- @opindex m4-single-only
- Generate code for the SH4 with a floating-point unit that only
- supports single-precision arithmetic.
- @item -m4-single
- @opindex m4-single
- Generate code for the SH4 assuming the floating-point unit is in
- single-precision mode by default.
- @item -m4
- @opindex m4
- Generate code for the SH4.
- @item -m4-100
- @opindex m4-100
- Generate code for SH4-100.
- @item -m4-100-nofpu
- @opindex m4-100-nofpu
- Generate code for SH4-100 in such a way that the
- floating-point unit is not used.
- @item -m4-100-single
- @opindex m4-100-single
- Generate code for SH4-100 assuming the floating-point unit is in
- single-precision mode by default.
- @item -m4-100-single-only
- @opindex m4-100-single-only
- Generate code for SH4-100 in such a way that no double-precision
- floating-point operations are used.
- @item -m4-200
- @opindex m4-200
- Generate code for SH4-200.
- @item -m4-200-nofpu
- @opindex m4-200-nofpu
- Generate code for SH4-200 without in such a way that the
- floating-point unit is not used.
- @item -m4-200-single
- @opindex m4-200-single
- Generate code for SH4-200 assuming the floating-point unit is in
- single-precision mode by default.
- @item -m4-200-single-only
- @opindex m4-200-single-only
- Generate code for SH4-200 in such a way that no double-precision
- floating-point operations are used.
- @item -m4-300
- @opindex m4-300
- Generate code for SH4-300.
- @item -m4-300-nofpu
- @opindex m4-300-nofpu
- Generate code for SH4-300 without in such a way that the
- floating-point unit is not used.
- @item -m4-300-single
- @opindex m4-300-single
- Generate code for SH4-300 in such a way that no double-precision
- floating-point operations are used.
- @item -m4-300-single-only
- @opindex m4-300-single-only
- Generate code for SH4-300 in such a way that no double-precision
- floating-point operations are used.
- @item -m4-340
- @opindex m4-340
- Generate code for SH4-340 (no MMU, no FPU).
- @item -m4-500
- @opindex m4-500
- Generate code for SH4-500 (no FPU). Passes @option{-isa=sh4-nofpu} to the
- assembler.
- @item -m4a-nofpu
- @opindex m4a-nofpu
- Generate code for the SH4al-dsp, or for a SH4a in such a way that the
- floating-point unit is not used.
- @item -m4a-single-only
- @opindex m4a-single-only
- Generate code for the SH4a, in such a way that no double-precision
- floating-point operations are used.
- @item -m4a-single
- @opindex m4a-single
- Generate code for the SH4a assuming the floating-point unit is in
- single-precision mode by default.
- @item -m4a
- @opindex m4a
- Generate code for the SH4a.
- @item -m4al
- @opindex m4al
- Same as @option{-m4a-nofpu}, except that it implicitly passes
- @option{-dsp} to the assembler. GCC doesn't generate any DSP
- instructions at the moment.
- @item -m5-32media
- @opindex m5-32media
- Generate 32-bit code for SHmedia.
- @item -m5-32media-nofpu
- @opindex m5-32media-nofpu
- Generate 32-bit code for SHmedia in such a way that the
- floating-point unit is not used.
- @item -m5-64media
- @opindex m5-64media
- Generate 64-bit code for SHmedia.
- @item -m5-64media-nofpu
- @opindex m5-64media-nofpu
- Generate 64-bit code for SHmedia in such a way that the
- floating-point unit is not used.
- @item -m5-compact
- @opindex m5-compact
- Generate code for SHcompact.
- @item -m5-compact-nofpu
- @opindex m5-compact-nofpu
- Generate code for SHcompact in such a way that the
- floating-point unit is not used.
- @item -mb
- @opindex mb
- Compile code for the processor in big-endian mode.
- @item -ml
- @opindex ml
- Compile code for the processor in little-endian mode.
- @item -mdalign
- @opindex mdalign
- Align doubles at 64-bit boundaries. Note that this changes the calling
- conventions, and thus some functions from the standard C library do
- not work unless you recompile it first with @option{-mdalign}.
- @item -mrelax
- @opindex mrelax
- Shorten some address references at link time, when possible; uses the
- linker option @option{-relax}.
- @item -mbigtable
- @opindex mbigtable
- Use 32-bit offsets in @code{switch} tables. The default is to use
- 16-bit offsets.
- @item -mbitops
- @opindex mbitops
- Enable the use of bit manipulation instructions on SH2A.
- @item -mfmovd
- @opindex mfmovd
- Enable the use of the instruction @code{fmovd}. Check @option{-mdalign} for
- alignment constraints.
- @item -mrenesas
- @opindex mrenesas
- Comply with the calling conventions defined by Renesas.
- @item -mno-renesas
- @opindex mno-renesas
- Comply with the calling conventions defined for GCC before the Renesas
- conventions were available. This option is the default for all
- targets of the SH toolchain.
- @item -mnomacsave
- @opindex mnomacsave
- Mark the @code{MAC} register as call-clobbered, even if
- @option{-mrenesas} is given.
- @item -mieee
- @itemx -mno-ieee
- @opindex mieee
- @opindex mno-ieee
- Control the IEEE compliance of floating-point comparisons, which affects the
- handling of cases where the result of a comparison is unordered. By default
- @option{-mieee} is implicitly enabled. If @option{-ffinite-math-only} is
- enabled @option{-mno-ieee} is implicitly set, which results in faster
- floating-point greater-equal and less-equal comparisons. The implcit settings
- can be overridden by specifying either @option{-mieee} or @option{-mno-ieee}.
- @item -minline-ic_invalidate
- @opindex minline-ic_invalidate
- Inline code to invalidate instruction cache entries after setting up
- nested function trampolines.
- This option has no effect if @option{-musermode} is in effect and the selected
- code generation option (e.g. @option{-m4}) does not allow the use of the @code{icbi}
- instruction.
- If the selected code generation option does not allow the use of the @code{icbi}
- instruction, and @option{-musermode} is not in effect, the inlined code
- manipulates the instruction cache address array directly with an associative
- write. This not only requires privileged mode at run time, but it also
- fails if the cache line had been mapped via the TLB and has become unmapped.
- @item -misize
- @opindex misize
- Dump instruction size and location in the assembly code.
- @item -mpadstruct
- @opindex mpadstruct
- This option is deprecated. It pads structures to multiple of 4 bytes,
- which is incompatible with the SH ABI@.
- @item -matomic-model=@var{model}
- @opindex matomic-model=@var{model}
- Sets the model of atomic operations and additional parameters as a comma
- separated list. For details on the atomic built-in functions see
- @ref{__atomic Builtins}. The following models and parameters are supported:
- @table @samp
- @item none
- Disable compiler generated atomic sequences and emit library calls for atomic
- operations. This is the default if the target is not @code{sh*-*-linux*}.
- @item soft-gusa
- Generate GNU/Linux compatible gUSA software atomic sequences for the atomic
- built-in functions. The generated atomic sequences require additional support
- from the interrupt/exception handling code of the system and are only suitable
- for SH3* and SH4* single-core systems. This option is enabled by default when
- the target is @code{sh*-*-linux*} and SH3* or SH4*. When the target is SH4A,
- this option also partially utilizes the hardware atomic instructions
- @code{movli.l} and @code{movco.l} to create more efficient code, unless
- @samp{strict} is specified.
- @item soft-tcb
- Generate software atomic sequences that use a variable in the thread control
- block. This is a variation of the gUSA sequences which can also be used on
- SH1* and SH2* targets. The generated atomic sequences require additional
- support from the interrupt/exception handling code of the system and are only
- suitable for single-core systems. When using this model, the @samp{gbr-offset=}
- parameter has to be specified as well.
- @item soft-imask
- Generate software atomic sequences that temporarily disable interrupts by
- setting @code{SR.IMASK = 1111}. This model works only when the program runs
- in privileged mode and is only suitable for single-core systems. Additional
- support from the interrupt/exception handling code of the system is not
- required. This model is enabled by default when the target is
- @code{sh*-*-linux*} and SH1* or SH2*.
- @item hard-llcs
- Generate hardware atomic sequences using the @code{movli.l} and @code{movco.l}
- instructions only. This is only available on SH4A and is suitable for
- multi-core systems. Since the hardware instructions support only 32 bit atomic
- variables access to 8 or 16 bit variables is emulated with 32 bit accesses.
- Code compiled with this option is also compatible with other software
- atomic model interrupt/exception handling systems if executed on an SH4A
- system. Additional support from the interrupt/exception handling code of the
- system is not required for this model.
- @item gbr-offset=
- This parameter specifies the offset in bytes of the variable in the thread
- control block structure that should be used by the generated atomic sequences
- when the @samp{soft-tcb} model has been selected. For other models this
- parameter is ignored. The specified value must be an integer multiple of four
- and in the range 0-1020.
- @item strict
- This parameter prevents mixed usage of multiple atomic models, even if they
- are compatible, and makes the compiler generate atomic sequences of the
- specified model only.
- @end table
- @item -mtas
- @opindex mtas
- Generate the @code{tas.b} opcode for @code{__atomic_test_and_set}.
- Notice that depending on the particular hardware and software configuration
- this can degrade overall performance due to the operand cache line flushes
- that are implied by the @code{tas.b} instruction. On multi-core SH4A
- processors the @code{tas.b} instruction must be used with caution since it
- can result in data corruption for certain cache configurations.
- @item -mprefergot
- @opindex mprefergot
- When generating position-independent code, emit function calls using
- the Global Offset Table instead of the Procedure Linkage Table.
- @item -musermode
- @itemx -mno-usermode
- @opindex musermode
- @opindex mno-usermode
- Don't allow (allow) the compiler generating privileged mode code. Specifying
- @option{-musermode} also implies @option{-mno-inline-ic_invalidate} if the
- inlined code would not work in user mode. @option{-musermode} is the default
- when the target is @code{sh*-*-linux*}. If the target is SH1* or SH2*
- @option{-musermode} has no effect, since there is no user mode.
- @item -multcost=@var{number}
- @opindex multcost=@var{number}
- Set the cost to assume for a multiply insn.
- @item -mdiv=@var{strategy}
- @opindex mdiv=@var{strategy}
- Set the division strategy to be used for integer division operations.
- For SHmedia @var{strategy} can be one of:
- @table @samp
- @item fp
- Performs the operation in floating point. This has a very high latency,
- but needs only a few instructions, so it might be a good choice if
- your code has enough easily-exploitable ILP to allow the compiler to
- schedule the floating-point instructions together with other instructions.
- Division by zero causes a floating-point exception.
- @item inv
- Uses integer operations to calculate the inverse of the divisor,
- and then multiplies the dividend with the inverse. This strategy allows
- CSE and hoisting of the inverse calculation. Division by zero calculates
- an unspecified result, but does not trap.
- @item inv:minlat
- A variant of @samp{inv} where, if no CSE or hoisting opportunities
- have been found, or if the entire operation has been hoisted to the same
- place, the last stages of the inverse calculation are intertwined with the
- final multiply to reduce the overall latency, at the expense of using a few
- more instructions, and thus offering fewer scheduling opportunities with
- other code.
- @item call
- Calls a library function that usually implements the @samp{inv:minlat}
- strategy.
- This gives high code density for @code{m5-*media-nofpu} compilations.
- @item call2
- Uses a different entry point of the same library function, where it
- assumes that a pointer to a lookup table has already been set up, which
- exposes the pointer load to CSE and code hoisting optimizations.
- @item inv:call
- @itemx inv:call2
- @itemx inv:fp
- Use the @samp{inv} algorithm for initial
- code generation, but if the code stays unoptimized, revert to the @samp{call},
- @samp{call2}, or @samp{fp} strategies, respectively. Note that the
- potentially-trapping side effect of division by zero is carried by a
- separate instruction, so it is possible that all the integer instructions
- are hoisted out, but the marker for the side effect stays where it is.
- A recombination to floating-point operations or a call is not possible
- in that case.
- @item inv20u
- @itemx inv20l
- Variants of the @samp{inv:minlat} strategy. In the case
- that the inverse calculation is not separated from the multiply, they speed
- up division where the dividend fits into 20 bits (plus sign where applicable)
- by inserting a test to skip a number of operations in this case; this test
- slows down the case of larger dividends. @samp{inv20u} assumes the case of a such
- a small dividend to be unlikely, and @samp{inv20l} assumes it to be likely.
- @end table
- For targets other than SHmedia @var{strategy} can be one of:
- @table @samp
- @item call-div1
- Calls a library function that uses the single-step division instruction
- @code{div1} to perform the operation. Division by zero calculates an
- unspecified result and does not trap. This is the default except for SH4,
- SH2A and SHcompact.
- @item call-fp
- Calls a library function that performs the operation in double precision
- floating point. Division by zero causes a floating-point exception. This is
- the default for SHcompact with FPU. Specifying this for targets that do not
- have a double precision FPU defaults to @code{call-div1}.
- @item call-table
- Calls a library function that uses a lookup table for small divisors and
- the @code{div1} instruction with case distinction for larger divisors. Division
- by zero calculates an unspecified result and does not trap. This is the default
- for SH4. Specifying this for targets that do not have dynamic shift
- instructions defaults to @code{call-div1}.
- @end table
- When a division strategy has not been specified the default strategy is
- selected based on the current target. For SH2A the default strategy is to
- use the @code{divs} and @code{divu} instructions instead of library function
- calls.
- @item -maccumulate-outgoing-args
- @opindex maccumulate-outgoing-args
- Reserve space once for outgoing arguments in the function prologue rather
- than around each call. Generally beneficial for performance and size. Also
- needed for unwinding to avoid changing the stack frame around conditional code.
- @item -mdivsi3_libfunc=@var{name}
- @opindex mdivsi3_libfunc=@var{name}
- Set the name of the library function used for 32-bit signed division to
- @var{name}.
- This only affects the name used in the @samp{call} and @samp{inv:call}
- division strategies, and the compiler still expects the same
- sets of input/output/clobbered registers as if this option were not present.
- @item -mfixed-range=@var{register-range}
- @opindex mfixed-range
- Generate code treating the given register range as fixed registers.
- A fixed register is one that the register allocator can not use. This is
- useful when compiling kernel code. A register range is specified as
- two registers separated by a dash. Multiple register ranges can be
- specified separated by a comma.
- @item -mindexed-addressing
- @opindex mindexed-addressing
- Enable the use of the indexed addressing mode for SHmedia32/SHcompact.
- This is only safe if the hardware and/or OS implement 32-bit wrap-around
- semantics for the indexed addressing mode. The architecture allows the
- implementation of processors with 64-bit MMU, which the OS could use to
- get 32-bit addressing, but since no current hardware implementation supports
- this or any other way to make the indexed addressing mode safe to use in
- the 32-bit ABI, the default is @option{-mno-indexed-addressing}.
- @item -mgettrcost=@var{number}
- @opindex mgettrcost=@var{number}
- Set the cost assumed for the @code{gettr} instruction to @var{number}.
- The default is 2 if @option{-mpt-fixed} is in effect, 100 otherwise.
- @item -mpt-fixed
- @opindex mpt-fixed
- Assume @code{pt*} instructions won't trap. This generally generates
- better-scheduled code, but is unsafe on current hardware.
- The current architecture
- definition says that @code{ptabs} and @code{ptrel} trap when the target
- anded with 3 is 3.
- This has the unintentional effect of making it unsafe to schedule these
- instructions before a branch, or hoist them out of a loop. For example,
- @code{__do_global_ctors}, a part of @file{libgcc}
- that runs constructors at program
- startup, calls functions in a list which is delimited by @minus{}1. With the
- @option{-mpt-fixed} option, the @code{ptabs} is done before testing against @minus{}1.
- That means that all the constructors run a bit more quickly, but when
- the loop comes to the end of the list, the program crashes because @code{ptabs}
- loads @minus{}1 into a target register.
- Since this option is unsafe for any
- hardware implementing the current architecture specification, the default
- is @option{-mno-pt-fixed}. Unless specified explicitly with
- @option{-mgettrcost}, @option{-mno-pt-fixed} also implies @option{-mgettrcost=100};
- this deters register allocation from using target registers for storing
- ordinary integers.
- @item -minvalid-symbols
- @opindex minvalid-symbols
- Assume symbols might be invalid. Ordinary function symbols generated by
- the compiler are always valid to load with
- @code{movi}/@code{shori}/@code{ptabs} or
- @code{movi}/@code{shori}/@code{ptrel},
- but with assembler and/or linker tricks it is possible
- to generate symbols that cause @code{ptabs} or @code{ptrel} to trap.
- This option is only meaningful when @option{-mno-pt-fixed} is in effect.
- It prevents cross-basic-block CSE, hoisting and most scheduling
- of symbol loads. The default is @option{-mno-invalid-symbols}.
- @item -mbranch-cost=@var{num}
- @opindex mbranch-cost=@var{num}
- Assume @var{num} to be the cost for a branch instruction. Higher numbers
- make the compiler try to generate more branch-free code if possible.
- If not specified the value is selected depending on the processor type that
- is being compiled for.
- @item -mzdcbranch
- @itemx -mno-zdcbranch
- @opindex mzdcbranch
- @opindex mno-zdcbranch
- Assume (do not assume) that zero displacement conditional branch instructions
- @code{bt} and @code{bf} are fast. If @option{-mzdcbranch} is specified, the
- compiler prefers zero displacement branch code sequences. This is
- enabled by default when generating code for SH4 and SH4A. It can be explicitly
- disabled by specifying @option{-mno-zdcbranch}.
- @item -mcbranch-force-delay-slot
- @opindex mcbranch-force-delay-slot
- Force the usage of delay slots for conditional branches, which stuffs the delay
- slot with a @code{nop} if a suitable instruction can't be found. By default
- this option is disabled. It can be enabled to work around hardware bugs as
- found in the original SH7055.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Generate code that uses (does not use) the floating-point multiply and
- accumulate instructions. These instructions are generated by default
- if hardware floating point is used. The machine-dependent
- @option{-mfused-madd} option is now mapped to the machine-independent
- @option{-ffp-contract=fast} option, and @option{-mno-fused-madd} is
- mapped to @option{-ffp-contract=off}.
- @item -mfsca
- @itemx -mno-fsca
- @opindex mfsca
- @opindex mno-fsca
- Allow or disallow the compiler to emit the @code{fsca} instruction for sine
- and cosine approximations. The option @option{-mfsca} must be used in
- combination with @option{-funsafe-math-optimizations}. It is enabled by default
- when generating code for SH4A. Using @option{-mno-fsca} disables sine and cosine
- approximations even if @option{-funsafe-math-optimizations} is in effect.
- @item -mfsrra
- @itemx -mno-fsrra
- @opindex mfsrra
- @opindex mno-fsrra
- Allow or disallow the compiler to emit the @code{fsrra} instruction for
- reciprocal square root approximations. The option @option{-mfsrra} must be used
- in combination with @option{-funsafe-math-optimizations} and
- @option{-ffinite-math-only}. It is enabled by default when generating code for
- SH4A. Using @option{-mno-fsrra} disables reciprocal square root approximations
- even if @option{-funsafe-math-optimizations} and @option{-ffinite-math-only} are
- in effect.
- @item -mpretend-cmove
- @opindex mpretend-cmove
- Prefer zero-displacement conditional branches for conditional move instruction
- patterns. This can result in faster code on the SH4 processor.
- @end table
- @node Solaris 2 Options
- @subsection Solaris 2 Options
- @cindex Solaris 2 options
- These @samp{-m} options are supported on Solaris 2:
- @table @gcctabopt
- @item -mclear-hwcap
- @opindex mclear-hwcap
- @option{-mclear-hwcap} tells the compiler to remove the hardware
- capabilities generated by the Solaris assembler. This is only necessary
- when object files use ISA extensions not supported by the current
- machine, but check at runtime whether or not to use them.
- @item -mimpure-text
- @opindex mimpure-text
- @option{-mimpure-text}, used in addition to @option{-shared}, tells
- the compiler to not pass @option{-z text} to the linker when linking a
- shared object. Using this option, you can link position-dependent
- code into a shared object.
- @option{-mimpure-text} suppresses the ``relocations remain against
- allocatable but non-writable sections'' linker error message.
- However, the necessary relocations trigger copy-on-write, and the
- shared object is not actually shared across processes. Instead of
- using @option{-mimpure-text}, you should compile all source code with
- @option{-fpic} or @option{-fPIC}.
- @end table
- These switches are supported in addition to the above on Solaris 2:
- @table @gcctabopt
- @item -pthreads
- @opindex pthreads
- Add support for multithreading using the POSIX threads library. This
- option sets flags for both the preprocessor and linker. This option does
- not affect the thread safety of object code produced by the compiler or
- that of libraries supplied with it.
- @item -pthread
- @opindex pthread
- This is a synonym for @option{-pthreads}.
- @end table
- @node SPARC Options
- @subsection SPARC Options
- @cindex SPARC options
- These @samp{-m} options are supported on the SPARC:
- @table @gcctabopt
- @item -mno-app-regs
- @itemx -mapp-regs
- @opindex mno-app-regs
- @opindex mapp-regs
- Specify @option{-mapp-regs} to generate output using the global registers
- 2 through 4, which the SPARC SVR4 ABI reserves for applications. Like the
- global register 1, each global register 2 through 4 is then treated as an
- allocable register that is clobbered by function calls. This is the default.
- To be fully SVR4 ABI-compliant at the cost of some performance loss,
- specify @option{-mno-app-regs}. You should compile libraries and system
- software with this option.
- @item -mflat
- @itemx -mno-flat
- @opindex mflat
- @opindex mno-flat
- With @option{-mflat}, the compiler does not generate save/restore instructions
- and uses a ``flat'' or single register window model. This model is compatible
- with the regular register window model. The local registers and the input
- registers (0--5) are still treated as ``call-saved'' registers and are
- saved on the stack as needed.
- With @option{-mno-flat} (the default), the compiler generates save/restore
- instructions (except for leaf functions). This is the normal operating mode.
- @item -mfpu
- @itemx -mhard-float
- @opindex mfpu
- @opindex mhard-float
- Generate output containing floating-point instructions. This is the
- default.
- @item -mno-fpu
- @itemx -msoft-float
- @opindex mno-fpu
- @opindex msoft-float
- Generate output containing library calls for floating point.
- @strong{Warning:} the requisite libraries are not available for all SPARC
- targets. Normally the facilities of the machine's usual C compiler are
- used, but this cannot be done directly in cross-compilation. You must make
- your own arrangements to provide suitable library functions for
- cross-compilation. The embedded targets @samp{sparc-*-aout} and
- @samp{sparclite-*-*} do provide software floating-point support.
- @option{-msoft-float} changes the calling convention in the output file;
- therefore, it is only useful if you compile @emph{all} of a program with
- this option. In particular, you need to compile @file{libgcc.a}, the
- library that comes with GCC, with @option{-msoft-float} in order for
- this to work.
- @item -mhard-quad-float
- @opindex mhard-quad-float
- Generate output containing quad-word (long double) floating-point
- instructions.
- @item -msoft-quad-float
- @opindex msoft-quad-float
- Generate output containing library calls for quad-word (long double)
- floating-point instructions. The functions called are those specified
- in the SPARC ABI@. This is the default.
- As of this writing, there are no SPARC implementations that have hardware
- support for the quad-word floating-point instructions. They all invoke
- a trap handler for one of these instructions, and then the trap handler
- emulates the effect of the instruction. Because of the trap handler overhead,
- this is much slower than calling the ABI library routines. Thus the
- @option{-msoft-quad-float} option is the default.
- @item -mno-unaligned-doubles
- @itemx -munaligned-doubles
- @opindex mno-unaligned-doubles
- @opindex munaligned-doubles
- Assume that doubles have 8-byte alignment. This is the default.
- With @option{-munaligned-doubles}, GCC assumes that doubles have 8-byte
- alignment only if they are contained in another type, or if they have an
- absolute address. Otherwise, it assumes they have 4-byte alignment.
- Specifying this option avoids some rare compatibility problems with code
- generated by other compilers. It is not the default because it results
- in a performance loss, especially for floating-point code.
- @item -muser-mode
- @itemx -mno-user-mode
- @opindex muser-mode
- @opindex mno-user-mode
- Do not generate code that can only run in supervisor mode. This is relevant
- only for the @code{casa} instruction emitted for the LEON3 processor. The
- default is @option{-mno-user-mode}.
- @item -mno-faster-structs
- @itemx -mfaster-structs
- @opindex mno-faster-structs
- @opindex mfaster-structs
- With @option{-mfaster-structs}, the compiler assumes that structures
- should have 8-byte alignment. This enables the use of pairs of
- @code{ldd} and @code{std} instructions for copies in structure
- assignment, in place of twice as many @code{ld} and @code{st} pairs.
- However, the use of this changed alignment directly violates the SPARC
- ABI@. Thus, it's intended only for use on targets where the developer
- acknowledges that their resulting code is not directly in line with
- the rules of the ABI@.
- @item -mcpu=@var{cpu_type}
- @opindex mcpu
- Set the instruction set, register set, and instruction scheduling parameters
- for machine type @var{cpu_type}. Supported values for @var{cpu_type} are
- @samp{v7}, @samp{cypress}, @samp{v8}, @samp{supersparc}, @samp{hypersparc},
- @samp{leon}, @samp{leon3}, @samp{leon3v7}, @samp{sparclite}, @samp{f930},
- @samp{f934}, @samp{sparclite86x}, @samp{sparclet}, @samp{tsc701}, @samp{v9},
- @samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
- @samp{niagara3} and @samp{niagara4}.
- Native Solaris and GNU/Linux toolchains also support the value @samp{native},
- which selects the best architecture option for the host processor.
- @option{-mcpu=native} has no effect if GCC does not recognize
- the processor.
- Default instruction scheduling parameters are used for values that select
- an architecture and not an implementation. These are @samp{v7}, @samp{v8},
- @samp{sparclite}, @samp{sparclet}, @samp{v9}.
- Here is a list of each supported architecture and their supported
- implementations.
- @table @asis
- @item v7
- cypress, leon3v7
- @item v8
- supersparc, hypersparc, leon, leon3
- @item sparclite
- f930, f934, sparclite86x
- @item sparclet
- tsc701
- @item v9
- ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4
- @end table
- By default (unless configured otherwise), GCC generates code for the V7
- variant of the SPARC architecture. With @option{-mcpu=cypress}, the compiler
- additionally optimizes it for the Cypress CY7C602 chip, as used in the
- SPARCStation/SPARCServer 3xx series. This is also appropriate for the older
- SPARCStation 1, 2, IPX etc.
- With @option{-mcpu=v8}, GCC generates code for the V8 variant of the SPARC
- architecture. The only difference from V7 code is that the compiler emits
- the integer multiply and integer divide instructions which exist in SPARC-V8
- but not in SPARC-V7. With @option{-mcpu=supersparc}, the compiler additionally
- optimizes it for the SuperSPARC chip, as used in the SPARCStation 10, 1000 and
- 2000 series.
- With @option{-mcpu=sparclite}, GCC generates code for the SPARClite variant of
- the SPARC architecture. This adds the integer multiply, integer divide step
- and scan (@code{ffs}) instructions which exist in SPARClite but not in SPARC-V7.
- With @option{-mcpu=f930}, the compiler additionally optimizes it for the
- Fujitsu MB86930 chip, which is the original SPARClite, with no FPU@. With
- @option{-mcpu=f934}, the compiler additionally optimizes it for the Fujitsu
- MB86934 chip, which is the more recent SPARClite with FPU@.
- With @option{-mcpu=sparclet}, GCC generates code for the SPARClet variant of
- the SPARC architecture. This adds the integer multiply, multiply/accumulate,
- integer divide step and scan (@code{ffs}) instructions which exist in SPARClet
- but not in SPARC-V7. With @option{-mcpu=tsc701}, the compiler additionally
- optimizes it for the TEMIC SPARClet chip.
- With @option{-mcpu=v9}, GCC generates code for the V9 variant of the SPARC
- architecture. This adds 64-bit integer and floating-point move instructions,
- 3 additional floating-point condition code registers and conditional move
- instructions. With @option{-mcpu=ultrasparc}, the compiler additionally
- optimizes it for the Sun UltraSPARC I/II/IIi chips. With
- @option{-mcpu=ultrasparc3}, the compiler additionally optimizes it for the
- Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ chips. With
- @option{-mcpu=niagara}, the compiler additionally optimizes it for
- Sun UltraSPARC T1 chips. With @option{-mcpu=niagara2}, the compiler
- additionally optimizes it for Sun UltraSPARC T2 chips. With
- @option{-mcpu=niagara3}, the compiler additionally optimizes it for Sun
- UltraSPARC T3 chips. With @option{-mcpu=niagara4}, the compiler
- additionally optimizes it for Sun UltraSPARC T4 chips.
- @item -mtune=@var{cpu_type}
- @opindex mtune
- Set the instruction scheduling parameters for machine type
- @var{cpu_type}, but do not set the instruction set or register set that the
- option @option{-mcpu=@var{cpu_type}} does.
- The same values for @option{-mcpu=@var{cpu_type}} can be used for
- @option{-mtune=@var{cpu_type}}, but the only useful values are those
- that select a particular CPU implementation. Those are @samp{cypress},
- @samp{supersparc}, @samp{hypersparc}, @samp{leon}, @samp{leon3},
- @samp{leon3v7}, @samp{f930}, @samp{f934}, @samp{sparclite86x}, @samp{tsc701},
- @samp{ultrasparc}, @samp{ultrasparc3}, @samp{niagara}, @samp{niagara2},
- @samp{niagara3} and @samp{niagara4}. With native Solaris and GNU/Linux
- toolchains, @samp{native} can also be used.
- @item -mv8plus
- @itemx -mno-v8plus
- @opindex mv8plus
- @opindex mno-v8plus
- With @option{-mv8plus}, GCC generates code for the SPARC-V8+ ABI@. The
- difference from the V8 ABI is that the global and out registers are
- considered 64 bits wide. This is enabled by default on Solaris in 32-bit
- mode for all SPARC-V9 processors.
- @item -mvis
- @itemx -mno-vis
- @opindex mvis
- @opindex mno-vis
- With @option{-mvis}, GCC generates code that takes advantage of the UltraSPARC
- Visual Instruction Set extensions. The default is @option{-mno-vis}.
- @item -mvis2
- @itemx -mno-vis2
- @opindex mvis2
- @opindex mno-vis2
- With @option{-mvis2}, GCC generates code that takes advantage of
- version 2.0 of the UltraSPARC Visual Instruction Set extensions. The
- default is @option{-mvis2} when targeting a cpu that supports such
- instructions, such as UltraSPARC-III and later. Setting @option{-mvis2}
- also sets @option{-mvis}.
- @item -mvis3
- @itemx -mno-vis3
- @opindex mvis3
- @opindex mno-vis3
- With @option{-mvis3}, GCC generates code that takes advantage of
- version 3.0 of the UltraSPARC Visual Instruction Set extensions. The
- default is @option{-mvis3} when targeting a cpu that supports such
- instructions, such as niagara-3 and later. Setting @option{-mvis3}
- also sets @option{-mvis2} and @option{-mvis}.
- @item -mcbcond
- @itemx -mno-cbcond
- @opindex mcbcond
- @opindex mno-cbcond
- With @option{-mcbcond}, GCC generates code that takes advantage of
- compare-and-branch instructions, as defined in the Sparc Architecture 2011.
- The default is @option{-mcbcond} when targeting a cpu that supports such
- instructions, such as niagara-4 and later.
- @item -mpopc
- @itemx -mno-popc
- @opindex mpopc
- @opindex mno-popc
- With @option{-mpopc}, GCC generates code that takes advantage of the UltraSPARC
- population count instruction. The default is @option{-mpopc}
- when targeting a cpu that supports such instructions, such as Niagara-2 and
- later.
- @item -mfmaf
- @itemx -mno-fmaf
- @opindex mfmaf
- @opindex mno-fmaf
- With @option{-mfmaf}, GCC generates code that takes advantage of the UltraSPARC
- Fused Multiply-Add Floating-point extensions. The default is @option{-mfmaf}
- when targeting a cpu that supports such instructions, such as Niagara-3 and
- later.
- @item -mfix-at697f
- @opindex mfix-at697f
- Enable the documented workaround for the single erratum of the Atmel AT697F
- processor (which corresponds to erratum #13 of the AT697E processor).
- @item -mfix-ut699
- @opindex mfix-ut699
- Enable the documented workarounds for the floating-point errata and the data
- cache nullify errata of the UT699 processor.
- @end table
- These @samp{-m} options are supported in addition to the above
- on SPARC-V9 processors in 64-bit environments:
- @table @gcctabopt
- @item -m32
- @itemx -m64
- @opindex m32
- @opindex m64
- Generate code for a 32-bit or 64-bit environment.
- The 32-bit environment sets int, long and pointer to 32 bits.
- The 64-bit environment sets int to 32 bits and long and pointer
- to 64 bits.
- @item -mcmodel=@var{which}
- @opindex mcmodel
- Set the code model to one of
- @table @samp
- @item medlow
- The Medium/Low code model: 64-bit addresses, programs
- must be linked in the low 32 bits of memory. Programs can be statically
- or dynamically linked.
- @item medmid
- The Medium/Middle code model: 64-bit addresses, programs
- must be linked in the low 44 bits of memory, the text and data segments must
- be less than 2GB in size and the data segment must be located within 2GB of
- the text segment.
- @item medany
- The Medium/Anywhere code model: 64-bit addresses, programs
- may be linked anywhere in memory, the text and data segments must be less
- than 2GB in size and the data segment must be located within 2GB of the
- text segment.
- @item embmedany
- The Medium/Anywhere code model for embedded systems:
- 64-bit addresses, the text and data segments must be less than 2GB in
- size, both starting anywhere in memory (determined at link time). The
- global register %g4 points to the base of the data segment. Programs
- are statically linked and PIC is not supported.
- @end table
- @item -mmemory-model=@var{mem-model}
- @opindex mmemory-model
- Set the memory model in force on the processor to one of
- @table @samp
- @item default
- The default memory model for the processor and operating system.
- @item rmo
- Relaxed Memory Order
- @item pso
- Partial Store Order
- @item tso
- Total Store Order
- @item sc
- Sequential Consistency
- @end table
- These memory models are formally defined in Appendix D of the Sparc V9
- architecture manual, as set in the processor's @code{PSTATE.MM} field.
- @item -mstack-bias
- @itemx -mno-stack-bias
- @opindex mstack-bias
- @opindex mno-stack-bias
- With @option{-mstack-bias}, GCC assumes that the stack pointer, and
- frame pointer if present, are offset by @minus{}2047 which must be added back
- when making stack frame references. This is the default in 64-bit mode.
- Otherwise, assume no such offset is present.
- @end table
- @node SPU Options
- @subsection SPU Options
- @cindex SPU options
- These @samp{-m} options are supported on the SPU:
- @table @gcctabopt
- @item -mwarn-reloc
- @itemx -merror-reloc
- @opindex mwarn-reloc
- @opindex merror-reloc
- The loader for SPU does not handle dynamic relocations. By default, GCC
- gives an error when it generates code that requires a dynamic
- relocation. @option{-mno-error-reloc} disables the error,
- @option{-mwarn-reloc} generates a warning instead.
- @item -msafe-dma
- @itemx -munsafe-dma
- @opindex msafe-dma
- @opindex munsafe-dma
- Instructions that initiate or test completion of DMA must not be
- reordered with respect to loads and stores of the memory that is being
- accessed.
- With @option{-munsafe-dma} you must use the @code{volatile} keyword to protect
- memory accesses, but that can lead to inefficient code in places where the
- memory is known to not change. Rather than mark the memory as volatile,
- you can use @option{-msafe-dma} to tell the compiler to treat
- the DMA instructions as potentially affecting all memory.
- @item -mbranch-hints
- @opindex mbranch-hints
- By default, GCC generates a branch hint instruction to avoid
- pipeline stalls for always-taken or probably-taken branches. A hint
- is not generated closer than 8 instructions away from its branch.
- There is little reason to disable them, except for debugging purposes,
- or to make an object a little bit smaller.
- @item -msmall-mem
- @itemx -mlarge-mem
- @opindex msmall-mem
- @opindex mlarge-mem
- By default, GCC generates code assuming that addresses are never larger
- than 18 bits. With @option{-mlarge-mem} code is generated that assumes
- a full 32-bit address.
- @item -mstdmain
- @opindex mstdmain
- By default, GCC links against startup code that assumes the SPU-style
- main function interface (which has an unconventional parameter list).
- With @option{-mstdmain}, GCC links your program against startup
- code that assumes a C99-style interface to @code{main}, including a
- local copy of @code{argv} strings.
- @item -mfixed-range=@var{register-range}
- @opindex mfixed-range
- Generate code treating the given register range as fixed registers.
- A fixed register is one that the register allocator cannot use. This is
- useful when compiling kernel code. A register range is specified as
- two registers separated by a dash. Multiple register ranges can be
- specified separated by a comma.
- @item -mea32
- @itemx -mea64
- @opindex mea32
- @opindex mea64
- Compile code assuming that pointers to the PPU address space accessed
- via the @code{__ea} named address space qualifier are either 32 or 64
- bits wide. The default is 32 bits. As this is an ABI-changing option,
- all object code in an executable must be compiled with the same setting.
- @item -maddress-space-conversion
- @itemx -mno-address-space-conversion
- @opindex maddress-space-conversion
- @opindex mno-address-space-conversion
- Allow/disallow treating the @code{__ea} address space as superset
- of the generic address space. This enables explicit type casts
- between @code{__ea} and generic pointer as well as implicit
- conversions of generic pointers to @code{__ea} pointers. The
- default is to allow address space pointer conversions.
- @item -mcache-size=@var{cache-size}
- @opindex mcache-size
- This option controls the version of libgcc that the compiler links to an
- executable and selects a software-managed cache for accessing variables
- in the @code{__ea} address space with a particular cache size. Possible
- options for @var{cache-size} are @samp{8}, @samp{16}, @samp{32}, @samp{64}
- and @samp{128}. The default cache size is 64KB.
- @item -matomic-updates
- @itemx -mno-atomic-updates
- @opindex matomic-updates
- @opindex mno-atomic-updates
- This option controls the version of libgcc that the compiler links to an
- executable and selects whether atomic updates to the software-managed
- cache of PPU-side variables are used. If you use atomic updates, changes
- to a PPU variable from SPU code using the @code{__ea} named address space
- qualifier do not interfere with changes to other PPU variables residing
- in the same cache line from PPU code. If you do not use atomic updates,
- such interference may occur; however, writing back cache lines is
- more efficient. The default behavior is to use atomic updates.
- @item -mdual-nops
- @itemx -mdual-nops=@var{n}
- @opindex mdual-nops
- By default, GCC inserts nops to increase dual issue when it expects
- it to increase performance. @var{n} can be a value from 0 to 10. A
- smaller @var{n} inserts fewer nops. 10 is the default, 0 is the
- same as @option{-mno-dual-nops}. Disabled with @option{-Os}.
- @item -mhint-max-nops=@var{n}
- @opindex mhint-max-nops
- Maximum number of nops to insert for a branch hint. A branch hint must
- be at least 8 instructions away from the branch it is affecting. GCC
- inserts up to @var{n} nops to enforce this, otherwise it does not
- generate the branch hint.
- @item -mhint-max-distance=@var{n}
- @opindex mhint-max-distance
- The encoding of the branch hint instruction limits the hint to be within
- 256 instructions of the branch it is affecting. By default, GCC makes
- sure it is within 125.
- @item -msafe-hints
- @opindex msafe-hints
- Work around a hardware bug that causes the SPU to stall indefinitely.
- By default, GCC inserts the @code{hbrp} instruction to make sure
- this stall won't happen.
- @end table
- @node System V Options
- @subsection Options for System V
- These additional options are available on System V Release 4 for
- compatibility with other compilers on those systems:
- @table @gcctabopt
- @item -G
- @opindex G
- Create a shared object.
- It is recommended that @option{-symbolic} or @option{-shared} be used instead.
- @item -Qy
- @opindex Qy
- Identify the versions of each tool used by the compiler, in a
- @code{.ident} assembler directive in the output.
- @item -Qn
- @opindex Qn
- Refrain from adding @code{.ident} directives to the output file (this is
- the default).
- @item -YP,@var{dirs}
- @opindex YP
- Search the directories @var{dirs}, and no others, for libraries
- specified with @option{-l}.
- @item -Ym,@var{dir}
- @opindex Ym
- Look in the directory @var{dir} to find the M4 preprocessor.
- The assembler uses this option.
- @c This is supposed to go with a -Yd for predefined M4 macro files, but
- @c the generic assembler that comes with Solaris takes just -Ym.
- @end table
- @node TILE-Gx Options
- @subsection TILE-Gx Options
- @cindex TILE-Gx options
- These @samp{-m} options are supported on the TILE-Gx:
- @table @gcctabopt
- @item -mcmodel=small
- @opindex mcmodel=small
- Generate code for the small model. The distance for direct calls is
- limited to 500M in either direction. PC-relative addresses are 32
- bits. Absolute addresses support the full address range.
- @item -mcmodel=large
- @opindex mcmodel=large
- Generate code for the large model. There is no limitation on call
- distance, pc-relative addresses, or absolute addresses.
- @item -mcpu=@var{name}
- @opindex mcpu
- Selects the type of CPU to be targeted. Currently the only supported
- type is @samp{tilegx}.
- @item -m32
- @itemx -m64
- @opindex m32
- @opindex m64
- Generate code for a 32-bit or 64-bit environment. The 32-bit
- environment sets int, long, and pointer to 32 bits. The 64-bit
- environment sets int to 32 bits and long and pointer to 64 bits.
- @item -mbig-endian
- @itemx -mlittle-endian
- @opindex mbig-endian
- @opindex mlittle-endian
- Generate code in big/little endian mode, respectively.
- @end table
- @node TILEPro Options
- @subsection TILEPro Options
- @cindex TILEPro options
- These @samp{-m} options are supported on the TILEPro:
- @table @gcctabopt
- @item -mcpu=@var{name}
- @opindex mcpu
- Selects the type of CPU to be targeted. Currently the only supported
- type is @samp{tilepro}.
- @item -m32
- @opindex m32
- Generate code for a 32-bit environment, which sets int, long, and
- pointer to 32 bits. This is the only supported behavior so the flag
- is essentially ignored.
- @end table
- @node V850 Options
- @subsection V850 Options
- @cindex V850 Options
- These @samp{-m} options are defined for V850 implementations:
- @table @gcctabopt
- @item -mlong-calls
- @itemx -mno-long-calls
- @opindex mlong-calls
- @opindex mno-long-calls
- Treat all calls as being far away (near). If calls are assumed to be
- far away, the compiler always loads the function's address into a
- register, and calls indirect through the pointer.
- @item -mno-ep
- @itemx -mep
- @opindex mno-ep
- @opindex mep
- Do not optimize (do optimize) basic blocks that use the same index
- pointer 4 or more times to copy pointer into the @code{ep} register, and
- use the shorter @code{sld} and @code{sst} instructions. The @option{-mep}
- option is on by default if you optimize.
- @item -mno-prolog-function
- @itemx -mprolog-function
- @opindex mno-prolog-function
- @opindex mprolog-function
- Do not use (do use) external functions to save and restore registers
- at the prologue and epilogue of a function. The external functions
- are slower, but use less code space if more than one function saves
- the same number of registers. The @option{-mprolog-function} option
- is on by default if you optimize.
- @item -mspace
- @opindex mspace
- Try to make the code as small as possible. At present, this just turns
- on the @option{-mep} and @option{-mprolog-function} options.
- @item -mtda=@var{n}
- @opindex mtda
- Put static or global variables whose size is @var{n} bytes or less into
- the tiny data area that register @code{ep} points to. The tiny data
- area can hold up to 256 bytes in total (128 bytes for byte references).
- @item -msda=@var{n}
- @opindex msda
- Put static or global variables whose size is @var{n} bytes or less into
- the small data area that register @code{gp} points to. The small data
- area can hold up to 64 kilobytes.
- @item -mzda=@var{n}
- @opindex mzda
- Put static or global variables whose size is @var{n} bytes or less into
- the first 32 kilobytes of memory.
- @item -mv850
- @opindex mv850
- Specify that the target processor is the V850.
- @item -mv850e3v5
- @opindex mv850e3v5
- Specify that the target processor is the V850E3V5. The preprocessor
- constant @code{__v850e3v5__} is defined if this option is used.
- @item -mv850e2v4
- @opindex mv850e2v4
- Specify that the target processor is the V850E3V5. This is an alias for
- the @option{-mv850e3v5} option.
- @item -mv850e2v3
- @opindex mv850e2v3
- Specify that the target processor is the V850E2V3. The preprocessor
- constant @code{__v850e2v3__} is defined if this option is used.
- @item -mv850e2
- @opindex mv850e2
- Specify that the target processor is the V850E2. The preprocessor
- constant @code{__v850e2__} is defined if this option is used.
- @item -mv850e1
- @opindex mv850e1
- Specify that the target processor is the V850E1. The preprocessor
- constants @code{__v850e1__} and @code{__v850e__} are defined if
- this option is used.
- @item -mv850es
- @opindex mv850es
- Specify that the target processor is the V850ES. This is an alias for
- the @option{-mv850e1} option.
- @item -mv850e
- @opindex mv850e
- Specify that the target processor is the V850E@. The preprocessor
- constant @code{__v850e__} is defined if this option is used.
- If neither @option{-mv850} nor @option{-mv850e} nor @option{-mv850e1}
- nor @option{-mv850e2} nor @option{-mv850e2v3} nor @option{-mv850e3v5}
- are defined then a default target processor is chosen and the
- relevant @samp{__v850*__} preprocessor constant is defined.
- The preprocessor constants @code{__v850} and @code{__v851__} are always
- defined, regardless of which processor variant is the target.
- @item -mdisable-callt
- @itemx -mno-disable-callt
- @opindex mdisable-callt
- @opindex mno-disable-callt
- This option suppresses generation of the @code{CALLT} instruction for the
- v850e, v850e1, v850e2, v850e2v3 and v850e3v5 flavors of the v850
- architecture.
- This option is enabled by default when the RH850 ABI is
- in use (see @option{-mrh850-abi}), and disabled by default when the
- GCC ABI is in use. If @code{CALLT} instructions are being generated
- then the C preprocessor symbol @code{__V850_CALLT__} is defined.
- @item -mrelax
- @itemx -mno-relax
- @opindex mrelax
- @opindex mno-relax
- Pass on (or do not pass on) the @option{-mrelax} command-line option
- to the assembler.
- @item -mlong-jumps
- @itemx -mno-long-jumps
- @opindex mlong-jumps
- @opindex mno-long-jumps
- Disable (or re-enable) the generation of PC-relative jump instructions.
- @item -msoft-float
- @itemx -mhard-float
- @opindex msoft-float
- @opindex mhard-float
- Disable (or re-enable) the generation of hardware floating point
- instructions. This option is only significant when the target
- architecture is @samp{V850E2V3} or higher. If hardware floating point
- instructions are being generated then the C preprocessor symbol
- @code{__FPU_OK__} is defined, otherwise the symbol
- @code{__NO_FPU__} is defined.
- @item -mloop
- @opindex mloop
- Enables the use of the e3v5 LOOP instruction. The use of this
- instruction is not enabled by default when the e3v5 architecture is
- selected because its use is still experimental.
- @item -mrh850-abi
- @itemx -mghs
- @opindex mrh850-abi
- @opindex mghs
- Enables support for the RH850 version of the V850 ABI. This is the
- default. With this version of the ABI the following rules apply:
- @itemize
- @item
- Integer sized structures and unions are returned via a memory pointer
- rather than a register.
- @item
- Large structures and unions (more than 8 bytes in size) are passed by
- value.
- @item
- Functions are aligned to 16-bit boundaries.
- @item
- The @option{-m8byte-align} command-line option is supported.
- @item
- The @option{-mdisable-callt} command-line option is enabled by
- default. The @option{-mno-disable-callt} command-line option is not
- supported.
- @end itemize
- When this version of the ABI is enabled the C preprocessor symbol
- @code{__V850_RH850_ABI__} is defined.
- @item -mgcc-abi
- @opindex mgcc-abi
- Enables support for the old GCC version of the V850 ABI. With this
- version of the ABI the following rules apply:
- @itemize
- @item
- Integer sized structures and unions are returned in register @code{r10}.
- @item
- Large structures and unions (more than 8 bytes in size) are passed by
- reference.
- @item
- Functions are aligned to 32-bit boundaries, unless optimizing for
- size.
- @item
- The @option{-m8byte-align} command-line option is not supported.
- @item
- The @option{-mdisable-callt} command-line option is supported but not
- enabled by default.
- @end itemize
- When this version of the ABI is enabled the C preprocessor symbol
- @code{__V850_GCC_ABI__} is defined.
- @item -m8byte-align
- @itemx -mno-8byte-align
- @opindex m8byte-align
- @opindex mno-8byte-align
- Enables support for @code{double} and @code{long long} types to be
- aligned on 8-byte boundaries. The default is to restrict the
- alignment of all objects to at most 4-bytes. When
- @option{-m8byte-align} is in effect the C preprocessor symbol
- @code{__V850_8BYTE_ALIGN__} is defined.
- @item -mbig-switch
- @opindex mbig-switch
- Generate code suitable for big switch tables. Use this option only if
- the assembler/linker complain about out of range branches within a switch
- table.
- @item -mapp-regs
- @opindex mapp-regs
- This option causes r2 and r5 to be used in the code generated by
- the compiler. This setting is the default.
- @item -mno-app-regs
- @opindex mno-app-regs
- This option causes r2 and r5 to be treated as fixed registers.
- @end table
- @node VAX Options
- @subsection VAX Options
- @cindex VAX options
- These @samp{-m} options are defined for the VAX:
- @table @gcctabopt
- @item -munix
- @opindex munix
- Do not output certain jump instructions (@code{aobleq} and so on)
- that the Unix assembler for the VAX cannot handle across long
- ranges.
- @item -mgnu
- @opindex mgnu
- Do output those jump instructions, on the assumption that the
- GNU assembler is being used.
- @item -mg
- @opindex mg
- Output code for G-format floating-point numbers instead of D-format.
- @end table
- @node Visium Options
- @subsection Visium Options
- @cindex Visium options
- @table @gcctabopt
- @item -mdebug
- @opindex mdebug
- A program which performs file I/O and is destined to run on an MCM target
- should be linked with this option. It causes the libraries libc.a and
- libdebug.a to be linked. The program should be run on the target under
- the control of the GDB remote debugging stub.
- @item -msim
- @opindex msim
- A program which performs file I/O and is destined to run on the simulator
- should be linked with option. This causes libraries libc.a and libsim.a to
- be linked.
- @item -mfpu
- @itemx -mhard-float
- @opindex mfpu
- @opindex mhard-float
- Generate code containing floating-point instructions. This is the
- default.
- @item -mno-fpu
- @itemx -msoft-float
- @opindex mno-fpu
- @opindex msoft-float
- Generate code containing library calls for floating-point.
- @option{-msoft-float} changes the calling convention in the output file;
- therefore, it is only useful if you compile @emph{all} of a program with
- this option. In particular, you need to compile @file{libgcc.a}, the
- library that comes with GCC, with @option{-msoft-float} in order for
- this to work.
- @item -mcpu=@var{cpu_type}
- @opindex mcpu
- Set the instruction set, register set, and instruction scheduling parameters
- for machine type @var{cpu_type}. Supported values for @var{cpu_type} are
- @samp{mcm}, @samp{gr5} and @samp{gr6}.
- @samp{mcm} is a synonym of @samp{gr5} present for backward compatibility.
- By default (unless configured otherwise), GCC generates code for the GR5
- variant of the Visium architecture.
- With @option{-mcpu=gr6}, GCC generates code for the GR6 variant of the Visium
- architecture. The only difference from GR5 code is that the compiler will
- generate block move instructions.
- @item -mtune=@var{cpu_type}
- @opindex mtune
- Set the instruction scheduling parameters for machine type @var{cpu_type},
- but do not set the instruction set or register set that the option
- @option{-mcpu=@var{cpu_type}} would.
- @item -msv-mode
- @opindex msv-mode
- Generate code for the supervisor mode, where there are no restrictions on
- the access to general registers. This is the default.
- @item -muser-mode
- @opindex muser-mode
- Generate code for the user mode, where the access to some general registers
- is forbidden: on the GR5, registers r24 to r31 cannot be accessed in this
- mode; on the GR6, only registers r29 to r31 are affected.
- @end table
- @node VMS Options
- @subsection VMS Options
- These @samp{-m} options are defined for the VMS implementations:
- @table @gcctabopt
- @item -mvms-return-codes
- @opindex mvms-return-codes
- Return VMS condition codes from @code{main}. The default is to return POSIX-style
- condition (e.g.@ error) codes.
- @item -mdebug-main=@var{prefix}
- @opindex mdebug-main=@var{prefix}
- Flag the first routine whose name starts with @var{prefix} as the main
- routine for the debugger.
- @item -mmalloc64
- @opindex mmalloc64
- Default to 64-bit memory allocation routines.
- @item -mpointer-size=@var{size}
- @opindex mpointer-size=@var{size}
- Set the default size of pointers. Possible options for @var{size} are
- @samp{32} or @samp{short} for 32 bit pointers, @samp{64} or @samp{long}
- for 64 bit pointers, and @samp{no} for supporting only 32 bit pointers.
- The later option disables @code{pragma pointer_size}.
- @end table
- @node VxWorks Options
- @subsection VxWorks Options
- @cindex VxWorks Options
- The options in this section are defined for all VxWorks targets.
- Options specific to the target hardware are listed with the other
- options for that target.
- @table @gcctabopt
- @item -mrtp
- @opindex mrtp
- GCC can generate code for both VxWorks kernels and real time processes
- (RTPs). This option switches from the former to the latter. It also
- defines the preprocessor macro @code{__RTP__}.
- @item -non-static
- @opindex non-static
- Link an RTP executable against shared libraries rather than static
- libraries. The options @option{-static} and @option{-shared} can
- also be used for RTPs (@pxref{Link Options}); @option{-static}
- is the default.
- @item -Bstatic
- @itemx -Bdynamic
- @opindex Bstatic
- @opindex Bdynamic
- These options are passed down to the linker. They are defined for
- compatibility with Diab.
- @item -Xbind-lazy
- @opindex Xbind-lazy
- Enable lazy binding of function calls. This option is equivalent to
- @option{-Wl,-z,now} and is defined for compatibility with Diab.
- @item -Xbind-now
- @opindex Xbind-now
- Disable lazy binding of function calls. This option is the default and
- is defined for compatibility with Diab.
- @end table
- @node x86 Options
- @subsection x86 Options
- @cindex x86 Options
- These @samp{-m} options are defined for the x86 family of computers.
- @table @gcctabopt
- @item -march=@var{cpu-type}
- @opindex march
- Generate instructions for the machine type @var{cpu-type}. In contrast to
- @option{-mtune=@var{cpu-type}}, which merely tunes the generated code
- for the specified @var{cpu-type}, @option{-march=@var{cpu-type}} allows GCC
- to generate code that may not run at all on processors other than the one
- indicated. Specifying @option{-march=@var{cpu-type}} implies
- @option{-mtune=@var{cpu-type}}.
- The choices for @var{cpu-type} are:
- @table @samp
- @item native
- This selects the CPU to generate code for at compilation time by determining
- the processor type of the compiling machine. Using @option{-march=native}
- enables all instruction subsets supported by the local machine (hence
- the result might not run on different machines). Using @option{-mtune=native}
- produces code optimized for the local machine under the constraints
- of the selected instruction set.
- @item i386
- Original Intel i386 CPU@.
- @item i486
- Intel i486 CPU@. (No scheduling is implemented for this chip.)
- @item i586
- @itemx pentium
- Intel Pentium CPU with no MMX support.
- @item pentium-mmx
- Intel Pentium MMX CPU, based on Pentium core with MMX instruction set support.
- @item pentiumpro
- Intel Pentium Pro CPU@.
- @item i686
- When used with @option{-march}, the Pentium Pro
- instruction set is used, so the code runs on all i686 family chips.
- When used with @option{-mtune}, it has the same meaning as @samp{generic}.
- @item pentium2
- Intel Pentium II CPU, based on Pentium Pro core with MMX instruction set
- support.
- @item pentium3
- @itemx pentium3m
- Intel Pentium III CPU, based on Pentium Pro core with MMX and SSE instruction
- set support.
- @item pentium-m
- Intel Pentium M; low-power version of Intel Pentium III CPU
- with MMX, SSE and SSE2 instruction set support. Used by Centrino notebooks.
- @item pentium4
- @itemx pentium4m
- Intel Pentium 4 CPU with MMX, SSE and SSE2 instruction set support.
- @item prescott
- Improved version of Intel Pentium 4 CPU with MMX, SSE, SSE2 and SSE3 instruction
- set support.
- @item nocona
- Improved version of Intel Pentium 4 CPU with 64-bit extensions, MMX, SSE,
- SSE2 and SSE3 instruction set support.
- @item core2
- Intel Core 2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3
- instruction set support.
- @item nehalem
- Intel Nehalem CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2 and POPCNT instruction set support.
- @item westmere
- Intel Westmere CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AES and PCLMUL instruction set support.
- @item sandybridge
- Intel Sandy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AVX, AES and PCLMUL instruction set support.
- @item ivybridge
- Intel Ivy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND and F16C
- instruction set support.
- @item haswell
- Intel Haswell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
- BMI, BMI2 and F16C instruction set support.
- @item broadwell
- Intel Broadwell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
- BMI, BMI2, F16C, RDSEED, ADCX and PREFETCHW instruction set support.
- @item bonnell
- Intel Bonnell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3 and SSSE3
- instruction set support.
- @item silvermont
- Intel Silvermont CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
- SSE4.1, SSE4.2, POPCNT, AES, PCLMUL and RDRND instruction set support.
- @item knl
- Intel Knight's Landing CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
- SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
- BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER and
- AVX512CD instruction set support.
- @item k6
- AMD K6 CPU with MMX instruction set support.
- @item k6-2
- @itemx k6-3
- Improved versions of AMD K6 CPU with MMX and 3DNow!@: instruction set support.
- @item athlon
- @itemx athlon-tbird
- AMD Athlon CPU with MMX, 3dNOW!, enhanced 3DNow!@: and SSE prefetch instructions
- support.
- @item athlon-4
- @itemx athlon-xp
- @itemx athlon-mp
- Improved AMD Athlon CPU with MMX, 3DNow!, enhanced 3DNow!@: and full SSE
- instruction set support.
- @item k8
- @itemx opteron
- @itemx athlon64
- @itemx athlon-fx
- Processors based on the AMD K8 core with x86-64 instruction set support,
- including the AMD Opteron, Athlon 64, and Athlon 64 FX processors.
- (This supersets MMX, SSE, SSE2, 3DNow!, enhanced 3DNow!@: and 64-bit
- instruction set extensions.)
- @item k8-sse3
- @itemx opteron-sse3
- @itemx athlon64-sse3
- Improved versions of AMD K8 cores with SSE3 instruction set support.
- @item amdfam10
- @itemx barcelona
- CPUs based on AMD Family 10h cores with x86-64 instruction set support. (This
- supersets MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM and 64-bit
- instruction set extensions.)
- @item bdver1
- CPUs based on AMD Family 15h cores with x86-64 instruction set support. (This
- supersets FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A,
- SSSE3, SSE4.1, SSE4.2, ABM and 64-bit instruction set extensions.)
- @item bdver2
- AMD Family 15h core based CPUs with x86-64 instruction set support. (This
- supersets BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX,
- SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and 64-bit instruction set
- extensions.)
- @item bdver3
- AMD Family 15h core based CPUs with x86-64 instruction set support. (This
- supersets BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES,
- PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and
- 64-bit instruction set extensions.
- @item bdver4
- AMD Family 15h core based CPUs with x86-64 instruction set support. (This
- supersets BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP,
- AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1,
- SSE4.2, ABM and 64-bit instruction set extensions.
- @item btver1
- CPUs based on AMD Family 14h cores with x86-64 instruction set support. (This
- supersets MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM and 64-bit
- instruction set extensions.)
- @item btver2
- CPUs based on AMD Family 16h cores with x86-64 instruction set support. This
- includes MOVBE, F16C, BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM,
- SSE4A, SSSE3, SSE3, SSE2, SSE, MMX and 64-bit instruction set extensions.
- @item winchip-c6
- IDT WinChip C6 CPU, dealt in same way as i486 with additional MMX instruction
- set support.
- @item winchip2
- IDT WinChip 2 CPU, dealt in same way as i486 with additional MMX and 3DNow!@:
- instruction set support.
- @item c3
- VIA C3 CPU with MMX and 3DNow!@: instruction set support. (No scheduling is
- implemented for this chip.)
- @item c3-2
- VIA C3-2 (Nehemiah/C5XL) CPU with MMX and SSE instruction set support.
- (No scheduling is
- implemented for this chip.)
- @item geode
- AMD Geode embedded processor with MMX and 3DNow!@: instruction set support.
- @end table
- @item -mtune=@var{cpu-type}
- @opindex mtune
- Tune to @var{cpu-type} everything applicable about the generated code, except
- for the ABI and the set of available instructions.
- While picking a specific @var{cpu-type} schedules things appropriately
- for that particular chip, the compiler does not generate any code that
- cannot run on the default machine type unless you use a
- @option{-march=@var{cpu-type}} option.
- For example, if GCC is configured for i686-pc-linux-gnu
- then @option{-mtune=pentium4} generates code that is tuned for Pentium 4
- but still runs on i686 machines.
- The choices for @var{cpu-type} are the same as for @option{-march}.
- In addition, @option{-mtune} supports 2 extra choices for @var{cpu-type}:
- @table @samp
- @item generic
- Produce code optimized for the most common IA32/@/AMD64/@/EM64T processors.
- If you know the CPU on which your code will run, then you should use
- the corresponding @option{-mtune} or @option{-march} option instead of
- @option{-mtune=generic}. But, if you do not know exactly what CPU users
- of your application will have, then you should use this option.
- As new processors are deployed in the marketplace, the behavior of this
- option will change. Therefore, if you upgrade to a newer version of
- GCC, code generation controlled by this option will change to reflect
- the processors
- that are most common at the time that version of GCC is released.
- There is no @option{-march=generic} option because @option{-march}
- indicates the instruction set the compiler can use, and there is no
- generic instruction set applicable to all processors. In contrast,
- @option{-mtune} indicates the processor (or, in this case, collection of
- processors) for which the code is optimized.
- @item intel
- Produce code optimized for the most current Intel processors, which are
- Haswell and Silvermont for this version of GCC. If you know the CPU
- on which your code will run, then you should use the corresponding
- @option{-mtune} or @option{-march} option instead of @option{-mtune=intel}.
- But, if you want your application performs better on both Haswell and
- Silvermont, then you should use this option.
- As new Intel processors are deployed in the marketplace, the behavior of
- this option will change. Therefore, if you upgrade to a newer version of
- GCC, code generation controlled by this option will change to reflect
- the most current Intel processors at the time that version of GCC is
- released.
- There is no @option{-march=intel} option because @option{-march} indicates
- the instruction set the compiler can use, and there is no common
- instruction set applicable to all processors. In contrast,
- @option{-mtune} indicates the processor (or, in this case, collection of
- processors) for which the code is optimized.
- @end table
- @item -mcpu=@var{cpu-type}
- @opindex mcpu
- A deprecated synonym for @option{-mtune}.
- @item -mfpmath=@var{unit}
- @opindex mfpmath
- Generate floating-point arithmetic for selected unit @var{unit}. The choices
- for @var{unit} are:
- @table @samp
- @item 387
- Use the standard 387 floating-point coprocessor present on the majority of chips and
- emulated otherwise. Code compiled with this option runs almost everywhere.
- The temporary results are computed in 80-bit precision instead of the precision
- specified by the type, resulting in slightly different results compared to most
- of other chips. See @option{-ffloat-store} for more detailed description.
- This is the default choice for x86-32 targets.
- @item sse
- Use scalar floating-point instructions present in the SSE instruction set.
- This instruction set is supported by Pentium III and newer chips,
- and in the AMD line
- by Athlon-4, Athlon XP and Athlon MP chips. The earlier version of the SSE
- instruction set supports only single-precision arithmetic, thus the double and
- extended-precision arithmetic are still done using 387. A later version, present
- only in Pentium 4 and AMD x86-64 chips, supports double-precision
- arithmetic too.
- For the x86-32 compiler, you must use @option{-march=@var{cpu-type}}, @option{-msse}
- or @option{-msse2} switches to enable SSE extensions and make this option
- effective. For the x86-64 compiler, these extensions are enabled by default.
- The resulting code should be considerably faster in the majority of cases and avoid
- the numerical instability problems of 387 code, but may break some existing
- code that expects temporaries to be 80 bits.
- This is the default choice for the x86-64 compiler.
- @item sse,387
- @itemx sse+387
- @itemx both
- Attempt to utilize both instruction sets at once. This effectively doubles the
- amount of available registers, and on chips with separate execution units for
- 387 and SSE the execution resources too. Use this option with care, as it is
- still experimental, because the GCC register allocator does not model separate
- functional units well, resulting in unstable performance.
- @end table
- @item -masm=@var{dialect}
- @opindex masm=@var{dialect}
- Output assembly instructions using selected @var{dialect}. Also affects
- which dialect is used for basic @code{asm} (@pxref{Basic Asm}) and
- extended @code{asm} (@pxref{Extended Asm}). Supported choices (in dialect
- order) are @samp{att} or @samp{intel}. The default is @samp{att}. Darwin does
- not support @samp{intel}.
- @item -mieee-fp
- @itemx -mno-ieee-fp
- @opindex mieee-fp
- @opindex mno-ieee-fp
- Control whether or not the compiler uses IEEE floating-point
- comparisons. These correctly handle the case where the result of a
- comparison is unordered.
- @item -msoft-float
- @opindex msoft-float
- Generate output containing library calls for floating point.
- @strong{Warning:} the requisite libraries are not part of GCC@.
- Normally the facilities of the machine's usual C compiler are used, but
- this can't be done directly in cross-compilation. You must make your
- own arrangements to provide suitable library functions for
- cross-compilation.
- On machines where a function returns floating-point results in the 80387
- register stack, some floating-point opcodes may be emitted even if
- @option{-msoft-float} is used.
- @item -mno-fp-ret-in-387
- @opindex mno-fp-ret-in-387
- Do not use the FPU registers for return values of functions.
- The usual calling convention has functions return values of types
- @code{float} and @code{double} in an FPU register, even if there
- is no FPU@. The idea is that the operating system should emulate
- an FPU@.
- The option @option{-mno-fp-ret-in-387} causes such values to be returned
- in ordinary CPU registers instead.
- @item -mno-fancy-math-387
- @opindex mno-fancy-math-387
- Some 387 emulators do not support the @code{sin}, @code{cos} and
- @code{sqrt} instructions for the 387. Specify this option to avoid
- generating those instructions. This option is the default on
- OpenBSD and NetBSD@. This option is overridden when @option{-march}
- indicates that the target CPU always has an FPU and so the
- instruction does not need emulation. These
- instructions are not generated unless you also use the
- @option{-funsafe-math-optimizations} switch.
- @item -malign-double
- @itemx -mno-align-double
- @opindex malign-double
- @opindex mno-align-double
- Control whether GCC aligns @code{double}, @code{long double}, and
- @code{long long} variables on a two-word boundary or a one-word
- boundary. Aligning @code{double} variables on a two-word boundary
- produces code that runs somewhat faster on a Pentium at the
- expense of more memory.
- On x86-64, @option{-malign-double} is enabled by default.
- @strong{Warning:} if you use the @option{-malign-double} switch,
- structures containing the above types are aligned differently than
- the published application binary interface specifications for the x86-32
- and are not binary compatible with structures in code compiled
- without that switch.
- @item -m96bit-long-double
- @itemx -m128bit-long-double
- @opindex m96bit-long-double
- @opindex m128bit-long-double
- These switches control the size of @code{long double} type. The x86-32
- application binary interface specifies the size to be 96 bits,
- so @option{-m96bit-long-double} is the default in 32-bit mode.
- Modern architectures (Pentium and newer) prefer @code{long double}
- to be aligned to an 8- or 16-byte boundary. In arrays or structures
- conforming to the ABI, this is not possible. So specifying
- @option{-m128bit-long-double} aligns @code{long double}
- to a 16-byte boundary by padding the @code{long double} with an additional
- 32-bit zero.
- In the x86-64 compiler, @option{-m128bit-long-double} is the default choice as
- its ABI specifies that @code{long double} is aligned on 16-byte boundary.
- Notice that neither of these options enable any extra precision over the x87
- standard of 80 bits for a @code{long double}.
- @strong{Warning:} if you override the default value for your target ABI, this
- changes the size of
- structures and arrays containing @code{long double} variables,
- as well as modifying the function calling convention for functions taking
- @code{long double}. Hence they are not binary-compatible
- with code compiled without that switch.
- @item -mlong-double-64
- @itemx -mlong-double-80
- @itemx -mlong-double-128
- @opindex mlong-double-64
- @opindex mlong-double-80
- @opindex mlong-double-128
- These switches control the size of @code{long double} type. A size
- of 64 bits makes the @code{long double} type equivalent to the @code{double}
- type. This is the default for 32-bit Bionic C library. A size
- of 128 bits makes the @code{long double} type equivalent to the
- @code{__float128} type. This is the default for 64-bit Bionic C library.
- @strong{Warning:} if you override the default value for your target ABI, this
- changes the size of
- structures and arrays containing @code{long double} variables,
- as well as modifying the function calling convention for functions taking
- @code{long double}. Hence they are not binary-compatible
- with code compiled without that switch.
- @item -malign-data=@var{type}
- @opindex malign-data
- Control how GCC aligns variables. Supported values for @var{type} are
- @samp{compat} uses increased alignment value compatible uses GCC 4.8
- and earlier, @samp{abi} uses alignment value as specified by the
- psABI, and @samp{cacheline} uses increased alignment value to match
- the cache line size. @samp{compat} is the default.
- @item -mlarge-data-threshold=@var{threshold}
- @opindex mlarge-data-threshold
- When @option{-mcmodel=medium} is specified, data objects larger than
- @var{threshold} are placed in the large data section. This value must be the
- same across all objects linked into the binary, and defaults to 65535.
- @item -mrtd
- @opindex mrtd
- Use a different function-calling convention, in which functions that
- take a fixed number of arguments return with the @code{ret @var{num}}
- instruction, which pops their arguments while returning. This saves one
- instruction in the caller since there is no need to pop the arguments
- there.
- You can specify that an individual function is called with this calling
- sequence with the function attribute @code{stdcall}. You can also
- override the @option{-mrtd} option by using the function attribute
- @code{cdecl}. @xref{Function Attributes}.
- @strong{Warning:} this calling convention is incompatible with the one
- normally used on Unix, so you cannot use it if you need to call
- libraries compiled with the Unix compiler.
- Also, you must provide function prototypes for all functions that
- take variable numbers of arguments (including @code{printf});
- otherwise incorrect code is generated for calls to those
- functions.
- In addition, seriously incorrect code results if you call a
- function with too many arguments. (Normally, extra arguments are
- harmlessly ignored.)
- @item -mregparm=@var{num}
- @opindex mregparm
- Control how many registers are used to pass integer arguments. By
- default, no registers are used to pass arguments, and at most 3
- registers can be used. You can control this behavior for a specific
- function by using the function attribute @code{regparm}.
- @xref{Function Attributes}.
- @strong{Warning:} if you use this switch, and
- @var{num} is nonzero, then you must build all modules with the same
- value, including any libraries. This includes the system libraries and
- startup modules.
- @item -msseregparm
- @opindex msseregparm
- Use SSE register passing conventions for float and double arguments
- and return values. You can control this behavior for a specific
- function by using the function attribute @code{sseregparm}.
- @xref{Function Attributes}.
- @strong{Warning:} if you use this switch then you must build all
- modules with the same value, including any libraries. This includes
- the system libraries and startup modules.
- @item -mvect8-ret-in-mem
- @opindex mvect8-ret-in-mem
- Return 8-byte vectors in memory instead of MMX registers. This is the
- default on Solaris@tie{}8 and 9 and VxWorks to match the ABI of the Sun
- Studio compilers until version 12. Later compiler versions (starting
- with Studio 12 Update@tie{}1) follow the ABI used by other x86 targets, which
- is the default on Solaris@tie{}10 and later. @emph{Only} use this option if
- you need to remain compatible with existing code produced by those
- previous compiler versions or older versions of GCC@.
- @item -mpc32
- @itemx -mpc64
- @itemx -mpc80
- @opindex mpc32
- @opindex mpc64
- @opindex mpc80
- Set 80387 floating-point precision to 32, 64 or 80 bits. When @option{-mpc32}
- is specified, the significands of results of floating-point operations are
- rounded to 24 bits (single precision); @option{-mpc64} rounds the
- significands of results of floating-point operations to 53 bits (double
- precision) and @option{-mpc80} rounds the significands of results of
- floating-point operations to 64 bits (extended double precision), which is
- the default. When this option is used, floating-point operations in higher
- precisions are not available to the programmer without setting the FPU
- control word explicitly.
- Setting the rounding of floating-point operations to less than the default
- 80 bits can speed some programs by 2% or more. Note that some mathematical
- libraries assume that extended-precision (80-bit) floating-point operations
- are enabled by default; routines in such libraries could suffer significant
- loss of accuracy, typically through so-called ``catastrophic cancellation'',
- when this option is used to set the precision to less than extended precision.
- @item -mstackrealign
- @opindex mstackrealign
- Realign the stack at entry. On the x86, the @option{-mstackrealign}
- option generates an alternate prologue and epilogue that realigns the
- run-time stack if necessary. This supports mixing legacy codes that keep
- 4-byte stack alignment with modern codes that keep 16-byte stack alignment for
- SSE compatibility. See also the attribute @code{force_align_arg_pointer},
- applicable to individual functions.
- @item -mpreferred-stack-boundary=@var{num}
- @opindex mpreferred-stack-boundary
- Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
- byte boundary. If @option{-mpreferred-stack-boundary} is not specified,
- the default is 4 (16 bytes or 128 bits).
- @strong{Warning:} When generating code for the x86-64 architecture with
- SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
- used to keep the stack boundary aligned to 8 byte boundary. Since
- x86-64 ABI require 16 byte stack alignment, this is ABI incompatible and
- intended to be used in controlled environment where stack space is
- important limitation. This option leads to wrong code when functions
- compiled with 16 byte stack alignment (such as functions from a standard
- library) are called with misaligned stack. In this case, SSE
- instructions may lead to misaligned memory access traps. In addition,
- variable arguments are handled incorrectly for 16 byte aligned
- objects (including x87 long double and __int128), leading to wrong
- results. You must build all modules with
- @option{-mpreferred-stack-boundary=3}, including any libraries. This
- includes the system libraries and startup modules.
- @item -mincoming-stack-boundary=@var{num}
- @opindex mincoming-stack-boundary
- Assume the incoming stack is aligned to a 2 raised to @var{num} byte
- boundary. If @option{-mincoming-stack-boundary} is not specified,
- the one specified by @option{-mpreferred-stack-boundary} is used.
- On Pentium and Pentium Pro, @code{double} and @code{long double} values
- should be aligned to an 8-byte boundary (see @option{-malign-double}) or
- suffer significant run time performance penalties. On Pentium III, the
- Streaming SIMD Extension (SSE) data type @code{__m128} may not work
- properly if it is not 16-byte aligned.
- To ensure proper alignment of this values on the stack, the stack boundary
- must be as aligned as that required by any value stored on the stack.
- Further, every function must be generated such that it keeps the stack
- aligned. Thus calling a function compiled with a higher preferred
- stack boundary from a function compiled with a lower preferred stack
- boundary most likely misaligns the stack. It is recommended that
- libraries that use callbacks always use the default setting.
- This extra alignment does consume extra stack space, and generally
- increases code size. Code that is sensitive to stack space usage, such
- as embedded systems and operating system kernels, may want to reduce the
- preferred alignment to @option{-mpreferred-stack-boundary=2}.
- @need 200
- @item -mmmx
- @opindex mmmx
- @need 200
- @itemx -msse
- @opindex msse
- @need 200
- @itemx -msse2
- @need 200
- @itemx -msse3
- @need 200
- @itemx -mssse3
- @need 200
- @itemx -msse4
- @need 200
- @itemx -msse4a
- @need 200
- @itemx -msse4.1
- @need 200
- @itemx -msse4.2
- @need 200
- @itemx -mavx
- @opindex mavx
- @need 200
- @itemx -mavx2
- @need 200
- @itemx -mavx512f
- @need 200
- @itemx -mavx512pf
- @need 200
- @itemx -mavx512er
- @need 200
- @itemx -mavx512cd
- @need 200
- @itemx -msha
- @opindex msha
- @need 200
- @itemx -maes
- @opindex maes
- @need 200
- @itemx -mpclmul
- @opindex mpclmul
- @need 200
- @itemx -mclfushopt
- @opindex mclfushopt
- @need 200
- @itemx -mfsgsbase
- @opindex mfsgsbase
- @need 200
- @itemx -mrdrnd
- @opindex mrdrnd
- @need 200
- @itemx -mf16c
- @opindex mf16c
- @need 200
- @itemx -mfma
- @opindex mfma
- @need 200
- @itemx -mfma4
- @need 200
- @itemx -mno-fma4
- @need 200
- @itemx -mprefetchwt1
- @opindex mprefetchwt1
- @need 200
- @itemx -mxop
- @opindex mxop
- @need 200
- @itemx -mlwp
- @opindex mlwp
- @need 200
- @itemx -m3dnow
- @opindex m3dnow
- @need 200
- @itemx -mpopcnt
- @opindex mpopcnt
- @need 200
- @itemx -mabm
- @opindex mabm
- @need 200
- @itemx -mbmi
- @opindex mbmi
- @need 200
- @itemx -mbmi2
- @need 200
- @itemx -mlzcnt
- @opindex mlzcnt
- @need 200
- @itemx -mfxsr
- @opindex mfxsr
- @need 200
- @itemx -mxsave
- @opindex mxsave
- @need 200
- @itemx -mxsaveopt
- @opindex mxsaveopt
- @need 200
- @itemx -mxsavec
- @opindex mxsavec
- @need 200
- @itemx -mxsaves
- @opindex mxsaves
- @need 200
- @itemx -mrtm
- @opindex mrtm
- @need 200
- @itemx -mtbm
- @opindex mtbm
- @need 200
- @itemx -mmpx
- @opindex mmpx
- @need 200
- @itemx -mmwaitx
- @opindex mmwaitx
- These switches enable the use of instructions in the MMX, SSE,
- SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD,
- SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM,
- BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM, MPX, MWAITX or 3DNow!@:
- extended instruction sets. Each has a corresponding @option{-mno-} option
- to disable use of these instructions.
- These extensions are also available as built-in functions: see
- @ref{x86 Built-in Functions}, for details of the functions enabled and
- disabled by these switches.
- To generate SSE/SSE2 instructions automatically from floating-point
- code (as opposed to 387 instructions), see @option{-mfpmath=sse}.
- GCC depresses SSEx instructions when @option{-mavx} is used. Instead, it
- generates new AVX instructions or AVX equivalence for all SSEx instructions
- when needed.
- These options enable GCC to use these extended instructions in
- generated code, even without @option{-mfpmath=sse}. Applications that
- perform run-time CPU detection must compile separate files for each
- supported architecture, using the appropriate flags. In particular,
- the file containing the CPU detection code should be compiled without
- these options.
- @item -mdump-tune-features
- @opindex mdump-tune-features
- This option instructs GCC to dump the names of the x86 performance
- tuning features and default settings. The names can be used in
- @option{-mtune-ctrl=@var{feature-list}}.
- @item -mtune-ctrl=@var{feature-list}
- @opindex mtune-ctrl=@var{feature-list}
- This option is used to do fine grain control of x86 code generation features.
- @var{feature-list} is a comma separated list of @var{feature} names. See also
- @option{-mdump-tune-features}. When specified, the @var{feature} is turned
- on if it is not preceded with @samp{^}, otherwise, it is turned off.
- @option{-mtune-ctrl=@var{feature-list}} is intended to be used by GCC
- developers. Using it may lead to code paths not covered by testing and can
- potentially result in compiler ICEs or runtime errors.
- @item -mno-default
- @opindex mno-default
- This option instructs GCC to turn off all tunable features. See also
- @option{-mtune-ctrl=@var{feature-list}} and @option{-mdump-tune-features}.
- @item -mcld
- @opindex mcld
- This option instructs GCC to emit a @code{cld} instruction in the prologue
- of functions that use string instructions. String instructions depend on
- the DF flag to select between autoincrement or autodecrement mode. While the
- ABI specifies the DF flag to be cleared on function entry, some operating
- systems violate this specification by not clearing the DF flag in their
- exception dispatchers. The exception handler can be invoked with the DF flag
- set, which leads to wrong direction mode when string instructions are used.
- This option can be enabled by default on 32-bit x86 targets by configuring
- GCC with the @option{--enable-cld} configure option. Generation of @code{cld}
- instructions can be suppressed with the @option{-mno-cld} compiler option
- in this case.
- @item -mvzeroupper
- @opindex mvzeroupper
- This option instructs GCC to emit a @code{vzeroupper} instruction
- before a transfer of control flow out of the function to minimize
- the AVX to SSE transition penalty as well as remove unnecessary @code{zeroupper}
- intrinsics.
- @item -mprefer-avx128
- @opindex mprefer-avx128
- This option instructs GCC to use 128-bit AVX instructions instead of
- 256-bit AVX instructions in the auto-vectorizer.
- @item -mcx16
- @opindex mcx16
- This option enables GCC to generate @code{CMPXCHG16B} instructions.
- @code{CMPXCHG16B} allows for atomic operations on 128-bit double quadword
- (or oword) data types.
- This is useful for high-resolution counters that can be updated
- by multiple processors (or cores). This instruction is generated as part of
- atomic built-in functions: see @ref{__sync Builtins} or
- @ref{__atomic Builtins} for details.
- @item -msahf
- @opindex msahf
- This option enables generation of @code{SAHF} instructions in 64-bit code.
- Early Intel Pentium 4 CPUs with Intel 64 support,
- prior to the introduction of Pentium 4 G1 step in December 2005,
- lacked the @code{LAHF} and @code{SAHF} instructions
- which are supported by AMD64.
- These are load and store instructions, respectively, for certain status flags.
- In 64-bit mode, the @code{SAHF} instruction is used to optimize @code{fmod},
- @code{drem}, and @code{remainder} built-in functions;
- see @ref{Other Builtins} for details.
- @item -mmovbe
- @opindex mmovbe
- This option enables use of the @code{movbe} instruction to implement
- @code{__builtin_bswap32} and @code{__builtin_bswap64}.
- @item -mcrc32
- @opindex mcrc32
- This option enables built-in functions @code{__builtin_ia32_crc32qi},
- @code{__builtin_ia32_crc32hi}, @code{__builtin_ia32_crc32si} and
- @code{__builtin_ia32_crc32di} to generate the @code{crc32} machine instruction.
- @item -mrecip
- @opindex mrecip
- This option enables use of @code{RCPSS} and @code{RSQRTSS} instructions
- (and their vectorized variants @code{RCPPS} and @code{RSQRTPS})
- with an additional Newton-Raphson step
- to increase precision instead of @code{DIVSS} and @code{SQRTSS}
- (and their vectorized
- variants) for single-precision floating-point arguments. These instructions
- are generated only when @option{-funsafe-math-optimizations} is enabled
- together with @option{-finite-math-only} and @option{-fno-trapping-math}.
- Note that while the throughput of the sequence is higher than the throughput
- of the non-reciprocal instruction, the precision of the sequence can be
- decreased by up to 2 ulp (i.e. the inverse of 1.0 equals 0.99999994).
- Note that GCC implements @code{1.0f/sqrtf(@var{x})} in terms of @code{RSQRTSS}
- (or @code{RSQRTPS}) already with @option{-ffast-math} (or the above option
- combination), and doesn't need @option{-mrecip}.
- Also note that GCC emits the above sequence with additional Newton-Raphson step
- for vectorized single-float division and vectorized @code{sqrtf(@var{x})}
- already with @option{-ffast-math} (or the above option combination), and
- doesn't need @option{-mrecip}.
- @item -mrecip=@var{opt}
- @opindex mrecip=opt
- This option controls which reciprocal estimate instructions
- may be used. @var{opt} is a comma-separated list of options, which may
- be preceded by a @samp{!} to invert the option:
- @table @samp
- @item all
- Enable all estimate instructions.
- @item default
- Enable the default instructions, equivalent to @option{-mrecip}.
- @item none
- Disable all estimate instructions, equivalent to @option{-mno-recip}.
- @item div
- Enable the approximation for scalar division.
- @item vec-div
- Enable the approximation for vectorized division.
- @item sqrt
- Enable the approximation for scalar square root.
- @item vec-sqrt
- Enable the approximation for vectorized square root.
- @end table
- So, for example, @option{-mrecip=all,!sqrt} enables
- all of the reciprocal approximations, except for square root.
- @item -mveclibabi=@var{type}
- @opindex mveclibabi
- Specifies the ABI type to use for vectorizing intrinsics using an
- external library. Supported values for @var{type} are @samp{svml}
- for the Intel short
- vector math library and @samp{acml} for the AMD math core library.
- To use this option, both @option{-ftree-vectorize} and
- @option{-funsafe-math-optimizations} have to be enabled, and an SVML or ACML
- ABI-compatible library must be specified at link time.
- GCC currently emits calls to @code{vmldExp2},
- @code{vmldLn2}, @code{vmldLog102}, @code{vmldLog102}, @code{vmldPow2},
- @code{vmldTanh2}, @code{vmldTan2}, @code{vmldAtan2}, @code{vmldAtanh2},
- @code{vmldCbrt2}, @code{vmldSinh2}, @code{vmldSin2}, @code{vmldAsinh2},
- @code{vmldAsin2}, @code{vmldCosh2}, @code{vmldCos2}, @code{vmldAcosh2},
- @code{vmldAcos2}, @code{vmlsExp4}, @code{vmlsLn4}, @code{vmlsLog104},
- @code{vmlsLog104}, @code{vmlsPow4}, @code{vmlsTanh4}, @code{vmlsTan4},
- @code{vmlsAtan4}, @code{vmlsAtanh4}, @code{vmlsCbrt4}, @code{vmlsSinh4},
- @code{vmlsSin4}, @code{vmlsAsinh4}, @code{vmlsAsin4}, @code{vmlsCosh4},
- @code{vmlsCos4}, @code{vmlsAcosh4} and @code{vmlsAcos4} for corresponding
- function type when @option{-mveclibabi=svml} is used, and @code{__vrd2_sin},
- @code{__vrd2_cos}, @code{__vrd2_exp}, @code{__vrd2_log}, @code{__vrd2_log2},
- @code{__vrd2_log10}, @code{__vrs4_sinf}, @code{__vrs4_cosf},
- @code{__vrs4_expf}, @code{__vrs4_logf}, @code{__vrs4_log2f},
- @code{__vrs4_log10f} and @code{__vrs4_powf} for the corresponding function type
- when @option{-mveclibabi=acml} is used.
- @item -mabi=@var{name}
- @opindex mabi
- Generate code for the specified calling convention. Permissible values
- are @samp{sysv} for the ABI used on GNU/Linux and other systems, and
- @samp{ms} for the Microsoft ABI. The default is to use the Microsoft
- ABI when targeting Microsoft Windows and the SysV ABI on all other systems.
- You can control this behavior for specific functions by
- using the function attributes @code{ms_abi} and @code{sysv_abi}.
- @xref{Function Attributes}.
- @item -mtls-dialect=@var{type}
- @opindex mtls-dialect
- Generate code to access thread-local storage using the @samp{gnu} or
- @samp{gnu2} conventions. @samp{gnu} is the conservative default;
- @samp{gnu2} is more efficient, but it may add compile- and run-time
- requirements that cannot be satisfied on all systems.
- @item -mpush-args
- @itemx -mno-push-args
- @opindex mpush-args
- @opindex mno-push-args
- Use PUSH operations to store outgoing parameters. This method is shorter
- and usually equally fast as method using SUB/MOV operations and is enabled
- by default. In some cases disabling it may improve performance because of
- improved scheduling and reduced dependencies.
- @item -maccumulate-outgoing-args
- @opindex maccumulate-outgoing-args
- If enabled, the maximum amount of space required for outgoing arguments is
- computed in the function prologue. This is faster on most modern CPUs
- because of reduced dependencies, improved scheduling and reduced stack usage
- when the preferred stack boundary is not equal to 2. The drawback is a notable
- increase in code size. This switch implies @option{-mno-push-args}.
- @item -mthreads
- @opindex mthreads
- Support thread-safe exception handling on MinGW. Programs that rely
- on thread-safe exception handling must compile and link all code with the
- @option{-mthreads} option. When compiling, @option{-mthreads} defines
- @option{-D_MT}; when linking, it links in a special thread helper library
- @option{-lmingwthrd} which cleans up per-thread exception-handling data.
- @item -mno-align-stringops
- @opindex mno-align-stringops
- Do not align the destination of inlined string operations. This switch reduces
- code size and improves performance in case the destination is already aligned,
- but GCC doesn't know about it.
- @item -minline-all-stringops
- @opindex minline-all-stringops
- By default GCC inlines string operations only when the destination is
- known to be aligned to least a 4-byte boundary.
- This enables more inlining and increases code
- size, but may improve performance of code that depends on fast
- @code{memcpy}, @code{strlen},
- and @code{memset} for short lengths.
- @item -minline-stringops-dynamically
- @opindex minline-stringops-dynamically
- For string operations of unknown size, use run-time checks with
- inline code for small blocks and a library call for large blocks.
- @item -mstringop-strategy=@var{alg}
- @opindex mstringop-strategy=@var{alg}
- Override the internal decision heuristic for the particular algorithm to use
- for inlining string operations. The allowed values for @var{alg} are:
- @table @samp
- @item rep_byte
- @itemx rep_4byte
- @itemx rep_8byte
- Expand using i386 @code{rep} prefix of the specified size.
- @item byte_loop
- @itemx loop
- @itemx unrolled_loop
- Expand into an inline loop.
- @item libcall
- Always use a library call.
- @end table
- @item -mmemcpy-strategy=@var{strategy}
- @opindex mmemcpy-strategy=@var{strategy}
- Override the internal decision heuristic to decide if @code{__builtin_memcpy}
- should be inlined and what inline algorithm to use when the expected size
- of the copy operation is known. @var{strategy}
- is a comma-separated list of @var{alg}:@var{max_size}:@var{dest_align} triplets.
- @var{alg} is specified in @option{-mstringop-strategy}, @var{max_size} specifies
- the max byte size with which inline algorithm @var{alg} is allowed. For the last
- triplet, the @var{max_size} must be @code{-1}. The @var{max_size} of the triplets
- in the list must be specified in increasing order. The minimal byte size for
- @var{alg} is @code{0} for the first triplet and @code{@var{max_size} + 1} of the
- preceding range.
- @item -mmemset-strategy=@var{strategy}
- @opindex mmemset-strategy=@var{strategy}
- The option is similar to @option{-mmemcpy-strategy=} except that it is to control
- @code{__builtin_memset} expansion.
- @item -momit-leaf-frame-pointer
- @opindex momit-leaf-frame-pointer
- Don't keep the frame pointer in a register for leaf functions. This
- avoids the instructions to save, set up, and restore frame pointers and
- makes an extra register available in leaf functions. The option
- @option{-fomit-leaf-frame-pointer} removes the frame pointer for leaf functions,
- which might make debugging harder.
- @item -mtls-direct-seg-refs
- @itemx -mno-tls-direct-seg-refs
- @opindex mtls-direct-seg-refs
- Controls whether TLS variables may be accessed with offsets from the
- TLS segment register (@code{%gs} for 32-bit, @code{%fs} for 64-bit),
- or whether the thread base pointer must be added. Whether or not this
- is valid depends on the operating system, and whether it maps the
- segment to cover the entire TLS area.
- For systems that use the GNU C Library, the default is on.
- @item -msse2avx
- @itemx -mno-sse2avx
- @opindex msse2avx
- Specify that the assembler should encode SSE instructions with VEX
- prefix. The option @option{-mavx} turns this on by default.
- @item -mfentry
- @itemx -mno-fentry
- @opindex mfentry
- If profiling is active (@option{-pg}), put the profiling
- counter call before the prologue.
- Note: On x86 architectures the attribute @code{ms_hook_prologue}
- isn't possible at the moment for @option{-mfentry} and @option{-pg}.
- @item -mrecord-mcount
- @itemx -mno-record-mcount
- @opindex mrecord-mcount
- If profiling is active (@option{-pg}), generate a __mcount_loc section
- that contains pointers to each profiling call. This is useful for
- automatically patching and out calls.
- @item -mnop-mcount
- @itemx -mno-nop-mcount
- @opindex mnop-mcount
- If profiling is active (@option{-pg}), generate the calls to
- the profiling functions as nops. This is useful when they
- should be patched in later dynamically. This is likely only
- useful together with @option{-mrecord-mcount}.
- @item -mskip-rax-setup
- @itemx -mno-skip-rax-setup
- @opindex mskip-rax-setup
- When generating code for the x86-64 architecture with SSE extensions
- disabled, @option{-skip-rax-setup} can be used to skip setting up RAX
- register when there are no variable arguments passed in vector registers.
- @strong{Warning:} Since RAX register is used to avoid unnecessarily
- saving vector registers on stack when passing variable arguments, the
- impacts of this option are callees may waste some stack space,
- misbehave or jump to a random location. GCC 4.4 or newer don't have
- those issues, regardless the RAX register value.
- @item -m8bit-idiv
- @itemx -mno-8bit-idiv
- @opindex m8bit-idiv
- On some processors, like Intel Atom, 8-bit unsigned integer divide is
- much faster than 32-bit/64-bit integer divide. This option generates a
- run-time check. If both dividend and divisor are within range of 0
- to 255, 8-bit unsigned integer divide is used instead of
- 32-bit/64-bit integer divide.
- @item -mavx256-split-unaligned-load
- @itemx -mavx256-split-unaligned-store
- @opindex mavx256-split-unaligned-load
- @opindex mavx256-split-unaligned-store
- Split 32-byte AVX unaligned load and store.
- @item -mstack-protector-guard=@var{guard}
- @opindex mstack-protector-guard=@var{guard}
- Generate stack protection code using canary at @var{guard}. Supported
- locations are @samp{global} for global canary or @samp{tls} for per-thread
- canary in the TLS block (the default). This option has effect only when
- @option{-fstack-protector} or @option{-fstack-protector-all} is specified.
- @end table
- These @samp{-m} switches are supported in addition to the above
- on x86-64 processors in 64-bit environments.
- @table @gcctabopt
- @item -m32
- @itemx -m64
- @itemx -mx32
- @itemx -m16
- @opindex m32
- @opindex m64
- @opindex mx32
- @opindex m16
- Generate code for a 16-bit, 32-bit or 64-bit environment.
- The @option{-m32} option sets @code{int}, @code{long}, and pointer types
- to 32 bits, and
- generates code that runs on any i386 system.
- The @option{-m64} option sets @code{int} to 32 bits and @code{long} and pointer
- types to 64 bits, and generates code for the x86-64 architecture.
- For Darwin only the @option{-m64} option also turns off the @option{-fno-pic}
- and @option{-mdynamic-no-pic} options.
- The @option{-mx32} option sets @code{int}, @code{long}, and pointer types
- to 32 bits, and
- generates code for the x86-64 architecture.
- The @option{-m16} option is the same as @option{-m32}, except for that
- it outputs the @code{.code16gcc} assembly directive at the beginning of
- the assembly output so that the binary can run in 16-bit mode.
- @item -mno-red-zone
- @opindex mno-red-zone
- Do not use a so-called ``red zone'' for x86-64 code. The red zone is mandated
- by the x86-64 ABI; it is a 128-byte area beyond the location of the
- stack pointer that is not modified by signal or interrupt handlers
- and therefore can be used for temporary data without adjusting the stack
- pointer. The flag @option{-mno-red-zone} disables this red zone.
- @item -mcmodel=small
- @opindex mcmodel=small
- Generate code for the small code model: the program and its symbols must
- be linked in the lower 2 GB of the address space. Pointers are 64 bits.
- Programs can be statically or dynamically linked. This is the default
- code model.
- @item -mcmodel=kernel
- @opindex mcmodel=kernel
- Generate code for the kernel code model. The kernel runs in the
- negative 2 GB of the address space.
- This model has to be used for Linux kernel code.
- @item -mcmodel=medium
- @opindex mcmodel=medium
- Generate code for the medium model: the program is linked in the lower 2
- GB of the address space. Small symbols are also placed there. Symbols
- with sizes larger than @option{-mlarge-data-threshold} are put into
- large data or BSS sections and can be located above 2GB. Programs can
- be statically or dynamically linked.
- @item -mcmodel=large
- @opindex mcmodel=large
- Generate code for the large model. This model makes no assumptions
- about addresses and sizes of sections.
- @item -maddress-mode=long
- @opindex maddress-mode=long
- Generate code for long address mode. This is only supported for 64-bit
- and x32 environments. It is the default address mode for 64-bit
- environments.
- @item -maddress-mode=short
- @opindex maddress-mode=short
- Generate code for short address mode. This is only supported for 32-bit
- and x32 environments. It is the default address mode for 32-bit and
- x32 environments.
- @end table
- @node x86 Windows Options
- @subsection x86 Windows Options
- @cindex x86 Windows Options
- @cindex Windows Options for x86
- These additional options are available for Microsoft Windows targets:
- @table @gcctabopt
- @item -mconsole
- @opindex mconsole
- This option
- specifies that a console application is to be generated, by
- instructing the linker to set the PE header subsystem type
- required for console applications.
- This option is available for Cygwin and MinGW targets and is
- enabled by default on those targets.
- @item -mdll
- @opindex mdll
- This option is available for Cygwin and MinGW targets. It
- specifies that a DLL---a dynamic link library---is to be
- generated, enabling the selection of the required runtime
- startup object and entry point.
- @item -mnop-fun-dllimport
- @opindex mnop-fun-dllimport
- This option is available for Cygwin and MinGW targets. It
- specifies that the @code{dllimport} attribute should be ignored.
- @item -mthread
- @opindex mthread
- This option is available for MinGW targets. It specifies
- that MinGW-specific thread support is to be used.
- @item -municode
- @opindex municode
- This option is available for MinGW-w64 targets. It causes
- the @code{UNICODE} preprocessor macro to be predefined, and
- chooses Unicode-capable runtime startup code.
- @item -mwin32
- @opindex mwin32
- This option is available for Cygwin and MinGW targets. It
- specifies that the typical Microsoft Windows predefined macros are to
- be set in the pre-processor, but does not influence the choice
- of runtime library/startup code.
- @item -mwindows
- @opindex mwindows
- This option is available for Cygwin and MinGW targets. It
- specifies that a GUI application is to be generated by
- instructing the linker to set the PE header subsystem type
- appropriately.
- @item -fno-set-stack-executable
- @opindex fno-set-stack-executable
- This option is available for MinGW targets. It specifies that
- the executable flag for the stack used by nested functions isn't
- set. This is necessary for binaries running in kernel mode of
- Microsoft Windows, as there the User32 API, which is used to set executable
- privileges, isn't available.
- @item -fwritable-relocated-rdata
- @opindex fno-writable-relocated-rdata
- This option is available for MinGW and Cygwin targets. It specifies
- that relocated-data in read-only section is put into .data
- section. This is a necessary for older runtimes not supporting
- modification of .rdata sections for pseudo-relocation.
- @item -mpe-aligned-commons
- @opindex mpe-aligned-commons
- This option is available for Cygwin and MinGW targets. It
- specifies that the GNU extension to the PE file format that
- permits the correct alignment of COMMON variables should be
- used when generating code. It is enabled by default if
- GCC detects that the target assembler found during configuration
- supports the feature.
- @end table
- See also under @ref{x86 Options} for standard options.
- @node Xstormy16 Options
- @subsection Xstormy16 Options
- @cindex Xstormy16 Options
- These options are defined for Xstormy16:
- @table @gcctabopt
- @item -msim
- @opindex msim
- Choose startup files and linker script suitable for the simulator.
- @end table
- @node Xtensa Options
- @subsection Xtensa Options
- @cindex Xtensa Options
- These options are supported for Xtensa targets:
- @table @gcctabopt
- @item -mconst16
- @itemx -mno-const16
- @opindex mconst16
- @opindex mno-const16
- Enable or disable use of @code{CONST16} instructions for loading
- constant values. The @code{CONST16} instruction is currently not a
- standard option from Tensilica. When enabled, @code{CONST16}
- instructions are always used in place of the standard @code{L32R}
- instructions. The use of @code{CONST16} is enabled by default only if
- the @code{L32R} instruction is not available.
- @item -mfused-madd
- @itemx -mno-fused-madd
- @opindex mfused-madd
- @opindex mno-fused-madd
- Enable or disable use of fused multiply/add and multiply/subtract
- instructions in the floating-point option. This has no effect if the
- floating-point option is not also enabled. Disabling fused multiply/add
- and multiply/subtract instructions forces the compiler to use separate
- instructions for the multiply and add/subtract operations. This may be
- desirable in some cases where strict IEEE 754-compliant results are
- required: the fused multiply add/subtract instructions do not round the
- intermediate result, thereby producing results with @emph{more} bits of
- precision than specified by the IEEE standard. Disabling fused multiply
- add/subtract instructions also ensures that the program output is not
- sensitive to the compiler's ability to combine multiply and add/subtract
- operations.
- @item -mserialize-volatile
- @itemx -mno-serialize-volatile
- @opindex mserialize-volatile
- @opindex mno-serialize-volatile
- When this option is enabled, GCC inserts @code{MEMW} instructions before
- @code{volatile} memory references to guarantee sequential consistency.
- The default is @option{-mserialize-volatile}. Use
- @option{-mno-serialize-volatile} to omit the @code{MEMW} instructions.
- @item -mforce-no-pic
- @opindex mforce-no-pic
- For targets, like GNU/Linux, where all user-mode Xtensa code must be
- position-independent code (PIC), this option disables PIC for compiling
- kernel code.
- @item -mtext-section-literals
- @itemx -mno-text-section-literals
- @opindex mtext-section-literals
- @opindex mno-text-section-literals
- These options control the treatment of literal pools. The default is
- @option{-mno-text-section-literals}, which places literals in a separate
- section in the output file. This allows the literal pool to be placed
- in a data RAM/ROM, and it also allows the linker to combine literal
- pools from separate object files to remove redundant literals and
- improve code size. With @option{-mtext-section-literals}, the literals
- are interspersed in the text section in order to keep them as close as
- possible to their references. This may be necessary for large assembly
- files.
- @item -mtarget-align
- @itemx -mno-target-align
- @opindex mtarget-align
- @opindex mno-target-align
- When this option is enabled, GCC instructs the assembler to
- automatically align instructions to reduce branch penalties at the
- expense of some code density. The assembler attempts to widen density
- instructions to align branch targets and the instructions following call
- instructions. If there are not enough preceding safe density
- instructions to align a target, no widening is performed. The
- default is @option{-mtarget-align}. These options do not affect the
- treatment of auto-aligned instructions like @code{LOOP}, which the
- assembler always aligns, either by widening density instructions or
- by inserting NOP instructions.
- @item -mlongcalls
- @itemx -mno-longcalls
- @opindex mlongcalls
- @opindex mno-longcalls
- When this option is enabled, GCC instructs the assembler to translate
- direct calls to indirect calls unless it can determine that the target
- of a direct call is in the range allowed by the call instruction. This
- translation typically occurs for calls to functions in other source
- files. Specifically, the assembler translates a direct @code{CALL}
- instruction into an @code{L32R} followed by a @code{CALLX} instruction.
- The default is @option{-mno-longcalls}. This option should be used in
- programs where the call target can potentially be out of range. This
- option is implemented in the assembler, not the compiler, so the
- assembly code generated by GCC still shows direct call
- instructions---look at the disassembled object code to see the actual
- instructions. Note that the assembler uses an indirect call for
- every cross-file call, not just those that really are out of range.
- @end table
- @node zSeries Options
- @subsection zSeries Options
- @cindex zSeries options
- These are listed under @xref{S/390 and zSeries Options}.
- @node Code Gen Options
- @section Options for Code Generation Conventions
- @cindex code generation conventions
- @cindex options, code generation
- @cindex run-time options
- These machine-independent options control the interface conventions
- used in code generation.
- Most of them have both positive and negative forms; the negative form
- of @option{-ffoo} is @option{-fno-foo}. In the table below, only
- one of the forms is listed---the one that is not the default. You
- can figure out the other form by either removing @samp{no-} or adding
- it.
- @table @gcctabopt
- @item -fbounds-check
- @opindex fbounds-check
- For front ends that support it, generate additional code to check that
- indices used to access arrays are within the declared range. This is
- currently only supported by the Java and Fortran front ends, where
- this option defaults to true and false respectively.
- @item -fstack-reuse=@var{reuse-level}
- @opindex fstack_reuse
- This option controls stack space reuse for user declared local/auto variables
- and compiler generated temporaries. @var{reuse_level} can be @samp{all},
- @samp{named_vars}, or @samp{none}. @samp{all} enables stack reuse for all
- local variables and temporaries, @samp{named_vars} enables the reuse only for
- user defined local variables with names, and @samp{none} disables stack reuse
- completely. The default value is @samp{all}. The option is needed when the
- program extends the lifetime of a scoped local variable or a compiler generated
- temporary beyond the end point defined by the language. When a lifetime of
- a variable ends, and if the variable lives in memory, the optimizing compiler
- has the freedom to reuse its stack space with other temporaries or scoped
- local variables whose live range does not overlap with it. Legacy code extending
- local lifetime is likely to break with the stack reuse optimization.
- For example,
- @smallexample
- int *p;
- @{
- int local1;
- p = &local1;
- local1 = 10;
- ....
- @}
- @{
- int local2;
- local2 = 20;
- ...
- @}
- if (*p == 10) // out of scope use of local1
- @{
- @}
- @end smallexample
- Another example:
- @smallexample
- struct A
- @{
- A(int k) : i(k), j(k) @{ @}
- int i;
- int j;
- @};
- A *ap;
- void foo(const A& ar)
- @{
- ap = &ar;
- @}
- void bar()
- @{
- foo(A(10)); // temp object's lifetime ends when foo returns
- @{
- A a(20);
- ....
- @}
- ap->i+= 10; // ap references out of scope temp whose space
- // is reused with a. What is the value of ap->i?
- @}
- @end smallexample
- The lifetime of a compiler generated temporary is well defined by the C++
- standard. When a lifetime of a temporary ends, and if the temporary lives
- in memory, the optimizing compiler has the freedom to reuse its stack
- space with other temporaries or scoped local variables whose live range
- does not overlap with it. However some of the legacy code relies on
- the behavior of older compilers in which temporaries' stack space is
- not reused, the aggressive stack reuse can lead to runtime errors. This
- option is used to control the temporary stack reuse optimization.
- @item -ftrapv
- @opindex ftrapv
- This option generates traps for signed overflow on addition, subtraction,
- multiplication operations.
- @item -fwrapv
- @opindex fwrapv
- This option instructs the compiler to assume that signed arithmetic
- overflow of addition, subtraction and multiplication wraps around
- using twos-complement representation. This flag enables some optimizations
- and disables others. This option is enabled by default for the Java
- front end, as required by the Java language specification.
- @item -fexceptions
- @opindex fexceptions
- Enable exception handling. Generates extra code needed to propagate
- exceptions. For some targets, this implies GCC generates frame
- unwind information for all functions, which can produce significant data
- size overhead, although it does not affect execution. If you do not
- specify this option, GCC enables it by default for languages like
- C++ that normally require exception handling, and disables it for
- languages like C that do not normally require it. However, you may need
- to enable this option when compiling C code that needs to interoperate
- properly with exception handlers written in C++. You may also wish to
- disable this option if you are compiling older C++ programs that don't
- use exception handling.
- @item -fnon-call-exceptions
- @opindex fnon-call-exceptions
- Generate code that allows trapping instructions to throw exceptions.
- Note that this requires platform-specific runtime support that does
- not exist everywhere. Moreover, it only allows @emph{trapping}
- instructions to throw exceptions, i.e.@: memory references or floating-point
- instructions. It does not allow exceptions to be thrown from
- arbitrary signal handlers such as @code{SIGALRM}.
- @item -fdelete-dead-exceptions
- @opindex fdelete-dead-exceptions
- Consider that instructions that may throw exceptions but don't otherwise
- contribute to the execution of the program can be optimized away.
- This option is enabled by default for the Ada front end, as permitted by
- the Ada language specification.
- Optimization passes that cause dead exceptions to be removed are enabled independently at different optimization levels.
- @item -funwind-tables
- @opindex funwind-tables
- Similar to @option{-fexceptions}, except that it just generates any needed
- static data, but does not affect the generated code in any other way.
- You normally do not need to enable this option; instead, a language processor
- that needs this handling enables it on your behalf.
- @item -fasynchronous-unwind-tables
- @opindex fasynchronous-unwind-tables
- Generate unwind table in DWARF 2 format, if supported by target machine. The
- table is exact at each instruction boundary, so it can be used for stack
- unwinding from asynchronous events (such as debugger or garbage collector).
- @item -fno-gnu-unique
- @opindex fno-gnu-unique
- On systems with recent GNU assembler and C library, the C++ compiler
- uses the @code{STB_GNU_UNIQUE} binding to make sure that definitions
- of template static data members and static local variables in inline
- functions are unique even in the presence of @code{RTLD_LOCAL}; this
- is necessary to avoid problems with a library used by two different
- @code{RTLD_LOCAL} plugins depending on a definition in one of them and
- therefore disagreeing with the other one about the binding of the
- symbol. But this causes @code{dlclose} to be ignored for affected
- DSOs; if your program relies on reinitialization of a DSO via
- @code{dlclose} and @code{dlopen}, you can use
- @option{-fno-gnu-unique}.
- @item -fpcc-struct-return
- @opindex fpcc-struct-return
- Return ``short'' @code{struct} and @code{union} values in memory like
- longer ones, rather than in registers. This convention is less
- efficient, but it has the advantage of allowing intercallability between
- GCC-compiled files and files compiled with other compilers, particularly
- the Portable C Compiler (pcc).
- The precise convention for returning structures in memory depends
- on the target configuration macros.
- Short structures and unions are those whose size and alignment match
- that of some integer type.
- @strong{Warning:} code compiled with the @option{-fpcc-struct-return}
- switch is not binary compatible with code compiled with the
- @option{-freg-struct-return} switch.
- Use it to conform to a non-default application binary interface.
- @item -freg-struct-return
- @opindex freg-struct-return
- Return @code{struct} and @code{union} values in registers when possible.
- This is more efficient for small structures than
- @option{-fpcc-struct-return}.
- If you specify neither @option{-fpcc-struct-return} nor
- @option{-freg-struct-return}, GCC defaults to whichever convention is
- standard for the target. If there is no standard convention, GCC
- defaults to @option{-fpcc-struct-return}, except on targets where GCC is
- the principal compiler. In those cases, we can choose the standard, and
- we chose the more efficient register return alternative.
- @strong{Warning:} code compiled with the @option{-freg-struct-return}
- switch is not binary compatible with code compiled with the
- @option{-fpcc-struct-return} switch.
- Use it to conform to a non-default application binary interface.
- @item -fshort-enums
- @opindex fshort-enums
- Allocate to an @code{enum} type only as many bytes as it needs for the
- declared range of possible values. Specifically, the @code{enum} type
- is equivalent to the smallest integer type that has enough room.
- @strong{Warning:} the @option{-fshort-enums} switch causes GCC to generate
- code that is not binary compatible with code generated without that switch.
- Use it to conform to a non-default application binary interface.
- @item -fshort-double
- @opindex fshort-double
- Use the same size for @code{double} as for @code{float}.
- @strong{Warning:} the @option{-fshort-double} switch causes GCC to generate
- code that is not binary compatible with code generated without that switch.
- Use it to conform to a non-default application binary interface.
- @item -fshort-wchar
- @opindex fshort-wchar
- Override the underlying type for @code{wchar_t} to be @code{short
- unsigned int} instead of the default for the target. This option is
- useful for building programs to run under WINE@.
- @strong{Warning:} the @option{-fshort-wchar} switch causes GCC to generate
- code that is not binary compatible with code generated without that switch.
- Use it to conform to a non-default application binary interface.
- @item -fno-common
- @opindex fno-common
- In C code, controls the placement of uninitialized global variables.
- Unix C compilers have traditionally permitted multiple definitions of
- such variables in different compilation units by placing the variables
- in a common block.
- This is the behavior specified by @option{-fcommon}, and is the default
- for GCC on most targets.
- On the other hand, this behavior is not required by ISO C, and on some
- targets may carry a speed or code size penalty on variable references.
- The @option{-fno-common} option specifies that the compiler should place
- uninitialized global variables in the data section of the object file,
- rather than generating them as common blocks.
- This has the effect that if the same variable is declared
- (without @code{extern}) in two different compilations,
- you get a multiple-definition error when you link them.
- In this case, you must compile with @option{-fcommon} instead.
- Compiling with @option{-fno-common} is useful on targets for which
- it provides better performance, or if you wish to verify that the
- program will work on other systems that always treat uninitialized
- variable declarations this way.
- @item -fno-ident
- @opindex fno-ident
- Ignore the @code{#ident} directive.
- @item -finhibit-size-directive
- @opindex finhibit-size-directive
- Don't output a @code{.size} assembler directive, or anything else that
- would cause trouble if the function is split in the middle, and the
- two halves are placed at locations far apart in memory. This option is
- used when compiling @file{crtstuff.c}; you should not need to use it
- for anything else.
- @item -fverbose-asm
- @opindex fverbose-asm
- Put extra commentary information in the generated assembly code to
- make it more readable. This option is generally only of use to those
- who actually need to read the generated assembly code (perhaps while
- debugging the compiler itself).
- @option{-fno-verbose-asm}, the default, causes the
- extra information to be omitted and is useful when comparing two assembler
- files.
- @item -frecord-gcc-switches
- @opindex frecord-gcc-switches
- This switch causes the command line used to invoke the
- compiler to be recorded into the object file that is being created.
- This switch is only implemented on some targets and the exact format
- of the recording is target and binary file format dependent, but it
- usually takes the form of a section containing ASCII text. This
- switch is related to the @option{-fverbose-asm} switch, but that
- switch only records information in the assembler output file as
- comments, so it never reaches the object file.
- See also @option{-grecord-gcc-switches} for another
- way of storing compiler options into the object file.
- @item -fpic
- @opindex fpic
- @cindex global offset table
- @cindex PIC
- Generate position-independent code (PIC) suitable for use in a shared
- library, if supported for the target machine. Such code accesses all
- constant addresses through a global offset table (GOT)@. The dynamic
- loader resolves the GOT entries when the program starts (the dynamic
- loader is not part of GCC; it is part of the operating system). If
- the GOT size for the linked executable exceeds a machine-specific
- maximum size, you get an error message from the linker indicating that
- @option{-fpic} does not work; in that case, recompile with @option{-fPIC}
- instead. (These maximums are 8k on the SPARC and 32k
- on the m68k and RS/6000. The x86 has no such limit.)
- Position-independent code requires special support, and therefore works
- only on certain machines. For the x86, GCC supports PIC for System V
- but not for the Sun 386i. Code generated for the IBM RS/6000 is always
- position-independent.
- When this flag is set, the macros @code{__pic__} and @code{__PIC__}
- are defined to 1.
- @item -fPIC
- @opindex fPIC
- If supported for the target machine, emit position-independent code,
- suitable for dynamic linking and avoiding any limit on the size of the
- global offset table. This option makes a difference on the m68k,
- PowerPC and SPARC@.
- Position-independent code requires special support, and therefore works
- only on certain machines.
- When this flag is set, the macros @code{__pic__} and @code{__PIC__}
- are defined to 2.
- @item -fpie
- @itemx -fPIE
- @opindex fpie
- @opindex fPIE
- These options are similar to @option{-fpic} and @option{-fPIC}, but
- generated position independent code can be only linked into executables.
- Usually these options are used when @option{-pie} GCC option is
- used during linking.
- @option{-fpie} and @option{-fPIE} both define the macros
- @code{__pie__} and @code{__PIE__}. The macros have the value 1
- for @option{-fpie} and 2 for @option{-fPIE}.
- @item -fno-jump-tables
- @opindex fno-jump-tables
- Do not use jump tables for switch statements even where it would be
- more efficient than other code generation strategies. This option is
- of use in conjunction with @option{-fpic} or @option{-fPIC} for
- building code that forms part of a dynamic linker and cannot
- reference the address of a jump table. On some targets, jump tables
- do not require a GOT and this option is not needed.
- @item -ffixed-@var{reg}
- @opindex ffixed
- Treat the register named @var{reg} as a fixed register; generated code
- should never refer to it (except perhaps as a stack pointer, frame
- pointer or in some other fixed role).
- @var{reg} must be the name of a register. The register names accepted
- are machine-specific and are defined in the @code{REGISTER_NAMES}
- macro in the machine description macro file.
- This flag does not have a negative form, because it specifies a
- three-way choice.
- @item -fcall-used-@var{reg}
- @opindex fcall-used
- Treat the register named @var{reg} as an allocable register that is
- clobbered by function calls. It may be allocated for temporaries or
- variables that do not live across a call. Functions compiled this way
- do not save and restore the register @var{reg}.
- It is an error to use this flag with the frame pointer or stack pointer.
- Use of this flag for other registers that have fixed pervasive roles in
- the machine's execution model produces disastrous results.
- This flag does not have a negative form, because it specifies a
- three-way choice.
- @item -fcall-saved-@var{reg}
- @opindex fcall-saved
- Treat the register named @var{reg} as an allocable register saved by
- functions. It may be allocated even for temporaries or variables that
- live across a call. Functions compiled this way save and restore
- the register @var{reg} if they use it.
- It is an error to use this flag with the frame pointer or stack pointer.
- Use of this flag for other registers that have fixed pervasive roles in
- the machine's execution model produces disastrous results.
- A different sort of disaster results from the use of this flag for
- a register in which function values may be returned.
- This flag does not have a negative form, because it specifies a
- three-way choice.
- @item -fpack-struct[=@var{n}]
- @opindex fpack-struct
- Without a value specified, pack all structure members together without
- holes. When a value is specified (which must be a small power of two), pack
- structure members according to this value, representing the maximum
- alignment (that is, objects with default alignment requirements larger than
- this are output potentially unaligned at the next fitting location.
- @strong{Warning:} the @option{-fpack-struct} switch causes GCC to generate
- code that is not binary compatible with code generated without that switch.
- Additionally, it makes the code suboptimal.
- Use it to conform to a non-default application binary interface.
- @item -finstrument-functions
- @opindex finstrument-functions
- Generate instrumentation calls for entry and exit to functions. Just
- after function entry and just before function exit, the following
- profiling functions are called with the address of the current
- function and its call site. (On some platforms,
- @code{__builtin_return_address} does not work beyond the current
- function, so the call site information may not be available to the
- profiling functions otherwise.)
- @smallexample
- void __cyg_profile_func_enter (void *this_fn,
- void *call_site);
- void __cyg_profile_func_exit (void *this_fn,
- void *call_site);
- @end smallexample
- The first argument is the address of the start of the current function,
- which may be looked up exactly in the symbol table.
- This instrumentation is also done for functions expanded inline in other
- functions. The profiling calls indicate where, conceptually, the
- inline function is entered and exited. This means that addressable
- versions of such functions must be available. If all your uses of a
- function are expanded inline, this may mean an additional expansion of
- code size. If you use @code{extern inline} in your C code, an
- addressable version of such functions must be provided. (This is
- normally the case anyway, but if you get lucky and the optimizer always
- expands the functions inline, you might have gotten away without
- providing static copies.)
- A function may be given the attribute @code{no_instrument_function}, in
- which case this instrumentation is not done. This can be used, for
- example, for the profiling functions listed above, high-priority
- interrupt routines, and any functions from which the profiling functions
- cannot safely be called (perhaps signal handlers, if the profiling
- routines generate output or allocate memory).
- @item -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{}
- @opindex finstrument-functions-exclude-file-list
- Set the list of functions that are excluded from instrumentation (see
- the description of @option{-finstrument-functions}). If the file that
- contains a function definition matches with one of @var{file}, then
- that function is not instrumented. The match is done on substrings:
- if the @var{file} parameter is a substring of the file name, it is
- considered to be a match.
- For example:
- @smallexample
- -finstrument-functions-exclude-file-list=/bits/stl,include/sys
- @end smallexample
- @noindent
- excludes any inline function defined in files whose pathnames
- contain @file{/bits/stl} or @file{include/sys}.
- If, for some reason, you want to include letter @samp{,} in one of
- @var{sym}, write @samp{\,}. For example,
- @option{-finstrument-functions-exclude-file-list='\,\,tmp'}
- (note the single quote surrounding the option).
- @item -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{}
- @opindex finstrument-functions-exclude-function-list
- This is similar to @option{-finstrument-functions-exclude-file-list},
- but this option sets the list of function names to be excluded from
- instrumentation. The function name to be matched is its user-visible
- name, such as @code{vector<int> blah(const vector<int> &)}, not the
- internal mangled name (e.g., @code{_Z4blahRSt6vectorIiSaIiEE}). The
- match is done on substrings: if the @var{sym} parameter is a substring
- of the function name, it is considered to be a match. For C99 and C++
- extended identifiers, the function name must be given in UTF-8, not
- using universal character names.
- @item -fstack-check
- @opindex fstack-check
- Generate code to verify that you do not go beyond the boundary of the
- stack. You should specify this flag if you are running in an
- environment with multiple threads, but you only rarely need to specify it in
- a single-threaded environment since stack overflow is automatically
- detected on nearly all systems if there is only one stack.
- Note that this switch does not actually cause checking to be done; the
- operating system or the language runtime must do that. The switch causes
- generation of code to ensure that they see the stack being extended.
- You can additionally specify a string parameter: @samp{no} means no
- checking, @samp{generic} means force the use of old-style checking,
- @samp{specific} means use the best checking method and is equivalent
- to bare @option{-fstack-check}.
- Old-style checking is a generic mechanism that requires no specific
- target support in the compiler but comes with the following drawbacks:
- @enumerate
- @item
- Modified allocation strategy for large objects: they are always
- allocated dynamically if their size exceeds a fixed threshold.
- @item
- Fixed limit on the size of the static frame of functions: when it is
- topped by a particular function, stack checking is not reliable and
- a warning is issued by the compiler.
- @item
- Inefficiency: because of both the modified allocation strategy and the
- generic implementation, code performance is hampered.
- @end enumerate
- Note that old-style stack checking is also the fallback method for
- @samp{specific} if no target support has been added in the compiler.
- @item -fstack-limit-register=@var{reg}
- @itemx -fstack-limit-symbol=@var{sym}
- @itemx -fno-stack-limit
- @opindex fstack-limit-register
- @opindex fstack-limit-symbol
- @opindex fno-stack-limit
- Generate code to ensure that the stack does not grow beyond a certain value,
- either the value of a register or the address of a symbol. If a larger
- stack is required, a signal is raised at run time. For most targets,
- the signal is raised before the stack overruns the boundary, so
- it is possible to catch the signal without taking special precautions.
- For instance, if the stack starts at absolute address @samp{0x80000000}
- and grows downwards, you can use the flags
- @option{-fstack-limit-symbol=__stack_limit} and
- @option{-Wl,--defsym,__stack_limit=0x7ffe0000} to enforce a stack limit
- of 128KB@. Note that this may only work with the GNU linker.
- @item -fsplit-stack
- @opindex fsplit-stack
- Generate code to automatically split the stack before it overflows.
- The resulting program has a discontiguous stack which can only
- overflow if the program is unable to allocate any more memory. This
- is most useful when running threaded programs, as it is no longer
- necessary to calculate a good stack size to use for each thread. This
- is currently only implemented for the x86 targets running
- GNU/Linux.
- When code compiled with @option{-fsplit-stack} calls code compiled
- without @option{-fsplit-stack}, there may not be much stack space
- available for the latter code to run. If compiling all code,
- including library code, with @option{-fsplit-stack} is not an option,
- then the linker can fix up these calls so that the code compiled
- without @option{-fsplit-stack} always has a large stack. Support for
- this is implemented in the gold linker in GNU binutils release 2.21
- and later.
- @item -fleading-underscore
- @opindex fleading-underscore
- This option and its counterpart, @option{-fno-leading-underscore}, forcibly
- change the way C symbols are represented in the object file. One use
- is to help link with legacy assembly code.
- @strong{Warning:} the @option{-fleading-underscore} switch causes GCC to
- generate code that is not binary compatible with code generated without that
- switch. Use it to conform to a non-default application binary interface.
- Not all targets provide complete support for this switch.
- @item -ftls-model=@var{model}
- @opindex ftls-model
- Alter the thread-local storage model to be used (@pxref{Thread-Local}).
- The @var{model} argument should be one of @samp{global-dynamic},
- @samp{local-dynamic}, @samp{initial-exec} or @samp{local-exec}.
- Note that the choice is subject to optimization: the compiler may use
- a more efficient model for symbols not visible outside of the translation
- unit, or if @option{-fpic} is not given on the command line.
- The default without @option{-fpic} is @samp{initial-exec}; with
- @option{-fpic} the default is @samp{global-dynamic}.
- @item -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]}
- @opindex fvisibility
- Set the default ELF image symbol visibility to the specified option---all
- symbols are marked with this unless overridden within the code.
- Using this feature can very substantially improve linking and
- load times of shared object libraries, produce more optimized
- code, provide near-perfect API export and prevent symbol clashes.
- It is @strong{strongly} recommended that you use this in any shared objects
- you distribute.
- Despite the nomenclature, @samp{default} always means public; i.e.,
- available to be linked against from outside the shared object.
- @samp{protected} and @samp{internal} are pretty useless in real-world
- usage so the only other commonly used option is @samp{hidden}.
- The default if @option{-fvisibility} isn't specified is
- @samp{default}, i.e., make every symbol public.
- A good explanation of the benefits offered by ensuring ELF
- symbols have the correct visibility is given by ``How To Write
- Shared Libraries'' by Ulrich Drepper (which can be found at
- @w{@uref{http://www.akkadia.org/drepper/}})---however a superior
- solution made possible by this option to marking things hidden when
- the default is public is to make the default hidden and mark things
- public. This is the norm with DLLs on Windows and with @option{-fvisibility=hidden}
- and @code{__attribute__ ((visibility("default")))} instead of
- @code{__declspec(dllexport)} you get almost identical semantics with
- identical syntax. This is a great boon to those working with
- cross-platform projects.
- For those adding visibility support to existing code, you may find
- @code{#pragma GCC visibility} of use. This works by you enclosing
- the declarations you wish to set visibility for with (for example)
- @code{#pragma GCC visibility push(hidden)} and
- @code{#pragma GCC visibility pop}.
- Bear in mind that symbol visibility should be viewed @strong{as
- part of the API interface contract} and thus all new code should
- always specify visibility when it is not the default; i.e., declarations
- only for use within the local DSO should @strong{always} be marked explicitly
- as hidden as so to avoid PLT indirection overheads---making this
- abundantly clear also aids readability and self-documentation of the code.
- Note that due to ISO C++ specification requirements, @code{operator new} and
- @code{operator delete} must always be of default visibility.
- Be aware that headers from outside your project, in particular system
- headers and headers from any other library you use, may not be
- expecting to be compiled with visibility other than the default. You
- may need to explicitly say @code{#pragma GCC visibility push(default)}
- before including any such headers.
- @code{extern} declarations are not affected by @option{-fvisibility}, so
- a lot of code can be recompiled with @option{-fvisibility=hidden} with
- no modifications. However, this means that calls to @code{extern}
- functions with no explicit visibility use the PLT, so it is more
- effective to use @code{__attribute ((visibility))} and/or
- @code{#pragma GCC visibility} to tell the compiler which @code{extern}
- declarations should be treated as hidden.
- Note that @option{-fvisibility} does affect C++ vague linkage
- entities. This means that, for instance, an exception class that is
- be thrown between DSOs must be explicitly marked with default
- visibility so that the @samp{type_info} nodes are unified between
- the DSOs.
- An overview of these techniques, their benefits and how to use them
- is at @uref{http://gcc.gnu.org/@/wiki/@/Visibility}.
- @item -fstrict-volatile-bitfields
- @opindex fstrict-volatile-bitfields
- This option should be used if accesses to volatile bit-fields (or other
- structure fields, although the compiler usually honors those types
- anyway) should use a single access of the width of the
- field's type, aligned to a natural alignment if possible. For
- example, targets with memory-mapped peripheral registers might require
- all such accesses to be 16 bits wide; with this flag you can
- declare all peripheral bit-fields as @code{unsigned short} (assuming short
- is 16 bits on these targets) to force GCC to use 16-bit accesses
- instead of, perhaps, a more efficient 32-bit access.
- If this option is disabled, the compiler uses the most efficient
- instruction. In the previous example, that might be a 32-bit load
- instruction, even though that accesses bytes that do not contain
- any portion of the bit-field, or memory-mapped registers unrelated to
- the one being updated.
- In some cases, such as when the @code{packed} attribute is applied to a
- structure field, it may not be possible to access the field with a single
- read or write that is correctly aligned for the target machine. In this
- case GCC falls back to generating multiple accesses rather than code that
- will fault or truncate the result at run time.
- Note: Due to restrictions of the C/C++11 memory model, write accesses are
- not allowed to touch non bit-field members. It is therefore recommended
- to define all bits of the field's type as bit-field members.
- The default value of this option is determined by the application binary
- interface for the target processor.
- @item -fsync-libcalls
- @opindex fsync-libcalls
- This option controls whether any out-of-line instance of the @code{__sync}
- family of functions may be used to implement the C++11 @code{__atomic}
- family of functions.
- The default value of this option is enabled, thus the only useful form
- of the option is @option{-fno-sync-libcalls}. This option is used in
- the implementation of the @file{libatomic} runtime library.
- @end table
- @c man end
- @node Environment Variables
- @section Environment Variables Affecting GCC
- @cindex environment variables
- @c man begin ENVIRONMENT
- This section describes several environment variables that affect how GCC
- operates. Some of them work by specifying directories or prefixes to use
- when searching for various kinds of files. Some are used to specify other
- aspects of the compilation environment.
- Note that you can also specify places to search using options such as
- @option{-B}, @option{-I} and @option{-L} (@pxref{Directory Options}). These
- take precedence over places specified using environment variables, which
- in turn take precedence over those specified by the configuration of GCC@.
- @xref{Driver,, Controlling the Compilation Driver @file{gcc}, gccint,
- GNU Compiler Collection (GCC) Internals}.
- @table @env
- @item LANG
- @itemx LC_CTYPE
- @c @itemx LC_COLLATE
- @itemx LC_MESSAGES
- @c @itemx LC_MONETARY
- @c @itemx LC_NUMERIC
- @c @itemx LC_TIME
- @itemx LC_ALL
- @findex LANG
- @findex LC_CTYPE
- @c @findex LC_COLLATE
- @findex LC_MESSAGES
- @c @findex LC_MONETARY
- @c @findex LC_NUMERIC
- @c @findex LC_TIME
- @findex LC_ALL
- @cindex locale
- These environment variables control the way that GCC uses
- localization information which allows GCC to work with different
- national conventions. GCC inspects the locale categories
- @env{LC_CTYPE} and @env{LC_MESSAGES} if it has been configured to do
- so. These locale categories can be set to any value supported by your
- installation. A typical value is @samp{en_GB.UTF-8} for English in the United
- Kingdom encoded in UTF-8.
- The @env{LC_CTYPE} environment variable specifies character
- classification. GCC uses it to determine the character boundaries in
- a string; this is needed for some multibyte encodings that contain quote
- and escape characters that are otherwise interpreted as a string
- end or escape.
- The @env{LC_MESSAGES} environment variable specifies the language to
- use in diagnostic messages.
- If the @env{LC_ALL} environment variable is set, it overrides the value
- of @env{LC_CTYPE} and @env{LC_MESSAGES}; otherwise, @env{LC_CTYPE}
- and @env{LC_MESSAGES} default to the value of the @env{LANG}
- environment variable. If none of these variables are set, GCC
- defaults to traditional C English behavior.
- @item TMPDIR
- @findex TMPDIR
- If @env{TMPDIR} is set, it specifies the directory to use for temporary
- files. GCC uses temporary files to hold the output of one stage of
- compilation which is to be used as input to the next stage: for example,
- the output of the preprocessor, which is the input to the compiler
- proper.
- @item GCC_COMPARE_DEBUG
- @findex GCC_COMPARE_DEBUG
- Setting @env{GCC_COMPARE_DEBUG} is nearly equivalent to passing
- @option{-fcompare-debug} to the compiler driver. See the documentation
- of this option for more details.
- @item GCC_EXEC_PREFIX
- @findex GCC_EXEC_PREFIX
- If @env{GCC_EXEC_PREFIX} is set, it specifies a prefix to use in the
- names of the subprograms executed by the compiler. No slash is added
- when this prefix is combined with the name of a subprogram, but you can
- specify a prefix that ends with a slash if you wish.
- If @env{GCC_EXEC_PREFIX} is not set, GCC attempts to figure out
- an appropriate prefix to use based on the pathname it is invoked with.
- If GCC cannot find the subprogram using the specified prefix, it
- tries looking in the usual places for the subprogram.
- The default value of @env{GCC_EXEC_PREFIX} is
- @file{@var{prefix}/lib/gcc/} where @var{prefix} is the prefix to
- the installed compiler. In many cases @var{prefix} is the value
- of @code{prefix} when you ran the @file{configure} script.
- Other prefixes specified with @option{-B} take precedence over this prefix.
- This prefix is also used for finding files such as @file{crt0.o} that are
- used for linking.
- In addition, the prefix is used in an unusual way in finding the
- directories to search for header files. For each of the standard
- directories whose name normally begins with @samp{/usr/local/lib/gcc}
- (more precisely, with the value of @env{GCC_INCLUDE_DIR}), GCC tries
- replacing that beginning with the specified prefix to produce an
- alternate directory name. Thus, with @option{-Bfoo/}, GCC searches
- @file{foo/bar} just before it searches the standard directory
- @file{/usr/local/lib/bar}.
- If a standard directory begins with the configured
- @var{prefix} then the value of @var{prefix} is replaced by
- @env{GCC_EXEC_PREFIX} when looking for header files.
- @item COMPILER_PATH
- @findex COMPILER_PATH
- The value of @env{COMPILER_PATH} is a colon-separated list of
- directories, much like @env{PATH}. GCC tries the directories thus
- specified when searching for subprograms, if it can't find the
- subprograms using @env{GCC_EXEC_PREFIX}.
- @item LIBRARY_PATH
- @findex LIBRARY_PATH
- The value of @env{LIBRARY_PATH} is a colon-separated list of
- directories, much like @env{PATH}. When configured as a native compiler,
- GCC tries the directories thus specified when searching for special
- linker files, if it can't find them using @env{GCC_EXEC_PREFIX}. Linking
- using GCC also uses these directories when searching for ordinary
- libraries for the @option{-l} option (but directories specified with
- @option{-L} come first).
- @item LANG
- @findex LANG
- @cindex locale definition
- This variable is used to pass locale information to the compiler. One way in
- which this information is used is to determine the character set to be used
- when character literals, string literals and comments are parsed in C and C++.
- When the compiler is configured to allow multibyte characters,
- the following values for @env{LANG} are recognized:
- @table @samp
- @item C-JIS
- Recognize JIS characters.
- @item C-SJIS
- Recognize SJIS characters.
- @item C-EUCJP
- Recognize EUCJP characters.
- @end table
- If @env{LANG} is not defined, or if it has some other value, then the
- compiler uses @code{mblen} and @code{mbtowc} as defined by the default locale to
- recognize and translate multibyte characters.
- @end table
- @noindent
- Some additional environment variables affect the behavior of the
- preprocessor.
- @include cppenv.texi
- @c man end
- @node Precompiled Headers
- @section Using Precompiled Headers
- @cindex precompiled headers
- @cindex speed of compilation
- Often large projects have many header files that are included in every
- source file. The time the compiler takes to process these header files
- over and over again can account for nearly all of the time required to
- build the project. To make builds faster, GCC allows you to
- @dfn{precompile} a header file.
- To create a precompiled header file, simply compile it as you would any
- other file, if necessary using the @option{-x} option to make the driver
- treat it as a C or C++ header file. You may want to use a
- tool like @command{make} to keep the precompiled header up-to-date when
- the headers it contains change.
- A precompiled header file is searched for when @code{#include} is
- seen in the compilation. As it searches for the included file
- (@pxref{Search Path,,Search Path,cpp,The C Preprocessor}) the
- compiler looks for a precompiled header in each directory just before it
- looks for the include file in that directory. The name searched for is
- the name specified in the @code{#include} with @samp{.gch} appended. If
- the precompiled header file can't be used, it is ignored.
- For instance, if you have @code{#include "all.h"}, and you have
- @file{all.h.gch} in the same directory as @file{all.h}, then the
- precompiled header file is used if possible, and the original
- header is used otherwise.
- Alternatively, you might decide to put the precompiled header file in a
- directory and use @option{-I} to ensure that directory is searched
- before (or instead of) the directory containing the original header.
- Then, if you want to check that the precompiled header file is always
- used, you can put a file of the same name as the original header in this
- directory containing an @code{#error} command.
- This also works with @option{-include}. So yet another way to use
- precompiled headers, good for projects not designed with precompiled
- header files in mind, is to simply take most of the header files used by
- a project, include them from another header file, precompile that header
- file, and @option{-include} the precompiled header. If the header files
- have guards against multiple inclusion, they are skipped because
- they've already been included (in the precompiled header).
- If you need to precompile the same header file for different
- languages, targets, or compiler options, you can instead make a
- @emph{directory} named like @file{all.h.gch}, and put each precompiled
- header in the directory, perhaps using @option{-o}. It doesn't matter
- what you call the files in the directory; every precompiled header in
- the directory is considered. The first precompiled header
- encountered in the directory that is valid for this compilation is
- used; they're searched in no particular order.
- There are many other possibilities, limited only by your imagination,
- good sense, and the constraints of your build system.
- A precompiled header file can be used only when these conditions apply:
- @itemize
- @item
- Only one precompiled header can be used in a particular compilation.
- @item
- A precompiled header can't be used once the first C token is seen. You
- can have preprocessor directives before a precompiled header; you cannot
- include a precompiled header from inside another header.
- @item
- The precompiled header file must be produced for the same language as
- the current compilation. You can't use a C precompiled header for a C++
- compilation.
- @item
- The precompiled header file must have been produced by the same compiler
- binary as the current compilation is using.
- @item
- Any macros defined before the precompiled header is included must
- either be defined in the same way as when the precompiled header was
- generated, or must not affect the precompiled header, which usually
- means that they don't appear in the precompiled header at all.
- The @option{-D} option is one way to define a macro before a
- precompiled header is included; using a @code{#define} can also do it.
- There are also some options that define macros implicitly, like
- @option{-O} and @option{-Wdeprecated}; the same rule applies to macros
- defined this way.
- @item If debugging information is output when using the precompiled
- header, using @option{-g} or similar, the same kind of debugging information
- must have been output when building the precompiled header. However,
- a precompiled header built using @option{-g} can be used in a compilation
- when no debugging information is being output.
- @item The same @option{-m} options must generally be used when building
- and using the precompiled header. @xref{Submodel Options},
- for any cases where this rule is relaxed.
- @item Each of the following options must be the same when building and using
- the precompiled header:
- @gccoptlist{-fexceptions}
- @item
- Some other command-line options starting with @option{-f},
- @option{-p}, or @option{-O} must be defined in the same way as when
- the precompiled header was generated. At present, it's not clear
- which options are safe to change and which are not; the safest choice
- is to use exactly the same options when generating and using the
- precompiled header. The following are known to be safe:
- @gccoptlist{-fmessage-length= -fpreprocessed -fsched-interblock @gol
- -fsched-spec -fsched-spec-load -fsched-spec-load-dangerous @gol
- -fsched-verbose=@var{number} -fschedule-insns -fvisibility= @gol
- -pedantic-errors}
- @end itemize
- For all of these except the last, the compiler automatically
- ignores the precompiled header if the conditions aren't met. If you
- find an option combination that doesn't work and doesn't cause the
- precompiled header to be ignored, please consider filing a bug report,
- see @ref{Bugs}.
- If you do use differing options when generating and using the
- precompiled header, the actual behavior is a mixture of the
- behavior for the options. For instance, if you use @option{-g} to
- generate the precompiled header but not when using it, you may or may
- not get debugging information for routines in the precompiled header.
|