Tools.cpp 187 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205
  1. //===--- Tools.cpp - Tools Implementations --------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "Tools.h"
  10. #include "clang/Driver/Action.h"
  11. #include "clang/Driver/Arg.h"
  12. #include "clang/Driver/ArgList.h"
  13. #include "clang/Driver/Driver.h"
  14. #include "clang/Driver/DriverDiagnostic.h"
  15. #include "clang/Driver/Compilation.h"
  16. #include "clang/Driver/Job.h"
  17. #include "clang/Driver/ObjCRuntime.h"
  18. #include "clang/Driver/Option.h"
  19. #include "clang/Driver/Options.h"
  20. #include "clang/Driver/ToolChain.h"
  21. #include "clang/Driver/Util.h"
  22. #include "llvm/ADT/SmallString.h"
  23. #include "llvm/ADT/StringSwitch.h"
  24. #include "llvm/ADT/Twine.h"
  25. #include "llvm/Support/FileSystem.h"
  26. #include "llvm/Support/Format.h"
  27. #include "llvm/Support/raw_ostream.h"
  28. #include "llvm/Support/Host.h"
  29. #include "llvm/Support/Process.h"
  30. #include "llvm/Support/ErrorHandling.h"
  31. #include "InputInfo.h"
  32. #include "ToolChains.h"
  33. using namespace clang::driver;
  34. using namespace clang::driver::tools;
  35. using namespace clang;
  36. /// CheckPreprocessingOptions - Perform some validation of preprocessing
  37. /// arguments that is shared with gcc.
  38. static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
  39. if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
  40. if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
  41. D.Diag(diag::err_drv_argument_only_allowed_with)
  42. << A->getAsString(Args) << "-E";
  43. }
  44. /// CheckCodeGenerationOptions - Perform some validation of code generation
  45. /// arguments that is shared with gcc.
  46. static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
  47. // In gcc, only ARM checks this, but it seems reasonable to check universally.
  48. if (Args.hasArg(options::OPT_static))
  49. if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
  50. options::OPT_mdynamic_no_pic))
  51. D.Diag(diag::err_drv_argument_not_allowed_with)
  52. << A->getAsString(Args) << "-static";
  53. }
  54. // Quote target names for inclusion in GNU Make dependency files.
  55. // Only the characters '$', '#', ' ', '\t' are quoted.
  56. static void QuoteTarget(StringRef Target,
  57. SmallVectorImpl<char> &Res) {
  58. for (unsigned i = 0, e = Target.size(); i != e; ++i) {
  59. switch (Target[i]) {
  60. case ' ':
  61. case '\t':
  62. // Escape the preceding backslashes
  63. for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
  64. Res.push_back('\\');
  65. // Escape the space/tab
  66. Res.push_back('\\');
  67. break;
  68. case '$':
  69. Res.push_back('$');
  70. break;
  71. case '#':
  72. Res.push_back('\\');
  73. break;
  74. default:
  75. break;
  76. }
  77. Res.push_back(Target[i]);
  78. }
  79. }
  80. static void AddLinkerInputs(const ToolChain &TC,
  81. const InputInfoList &Inputs, const ArgList &Args,
  82. ArgStringList &CmdArgs) {
  83. const Driver &D = TC.getDriver();
  84. // Add extra linker input arguments which are not treated as inputs
  85. // (constructed via -Xarch_).
  86. Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
  87. for (InputInfoList::const_iterator
  88. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  89. const InputInfo &II = *it;
  90. if (!TC.HasNativeLLVMSupport()) {
  91. // Don't try to pass LLVM inputs unless we have native support.
  92. if (II.getType() == types::TY_LLVM_IR ||
  93. II.getType() == types::TY_LTO_IR ||
  94. II.getType() == types::TY_LLVM_BC ||
  95. II.getType() == types::TY_LTO_BC)
  96. D.Diag(diag::err_drv_no_linker_llvm_support)
  97. << TC.getTripleString();
  98. }
  99. // Add filenames immediately.
  100. if (II.isFilename()) {
  101. CmdArgs.push_back(II.getFilename());
  102. continue;
  103. }
  104. // Otherwise, this is a linker input argument.
  105. const Arg &A = II.getInputArg();
  106. // Handle reserved library options.
  107. if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
  108. TC.AddCXXStdlibLibArgs(Args, CmdArgs);
  109. } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
  110. TC.AddCCKextLibArgs(Args, CmdArgs);
  111. } else
  112. A.renderAsInput(Args, CmdArgs);
  113. }
  114. }
  115. /// \brief Determine whether Objective-C automated reference counting is
  116. /// enabled.
  117. static bool isObjCAutoRefCount(const ArgList &Args) {
  118. return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
  119. }
  120. static void addProfileRT(const ToolChain &TC, const ArgList &Args,
  121. ArgStringList &CmdArgs,
  122. llvm::Triple Triple) {
  123. if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
  124. Args.hasArg(options::OPT_fprofile_generate) ||
  125. Args.hasArg(options::OPT_fcreate_profile) ||
  126. Args.hasArg(options::OPT_coverage)))
  127. return;
  128. // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
  129. // the link line. We cannot do the same thing because unlike gcov there is a
  130. // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
  131. // not supported by old linkers.
  132. std::string ProfileRT =
  133. std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
  134. CmdArgs.push_back(Args.MakeArgString(ProfileRT));
  135. }
  136. static void AddIncludeDirectoryList(const ArgList &Args,
  137. ArgStringList &CmdArgs,
  138. const char *ArgName,
  139. const char *DirList) {
  140. if (!DirList)
  141. return; // Nothing to do.
  142. StringRef Dirs(DirList);
  143. if (Dirs.empty()) // Empty string should not add '.'.
  144. return;
  145. StringRef::size_type Delim;
  146. while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
  147. if (Delim == 0) { // Leading colon.
  148. CmdArgs.push_back(ArgName);
  149. CmdArgs.push_back(".");
  150. } else {
  151. CmdArgs.push_back(ArgName);
  152. CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
  153. }
  154. Dirs = Dirs.substr(Delim + 1);
  155. }
  156. if (Dirs.empty()) { // Trailing colon.
  157. CmdArgs.push_back(ArgName);
  158. CmdArgs.push_back(".");
  159. } else { // Add the last path.
  160. CmdArgs.push_back(ArgName);
  161. CmdArgs.push_back(Args.MakeArgString(Dirs));
  162. }
  163. }
  164. void Clang::AddPreprocessingOptions(Compilation &C,
  165. const Driver &D,
  166. const ArgList &Args,
  167. ArgStringList &CmdArgs,
  168. const InputInfo &Output,
  169. const InputInfoList &Inputs) const {
  170. Arg *A;
  171. CheckPreprocessingOptions(D, Args);
  172. Args.AddLastArg(CmdArgs, options::OPT_C);
  173. Args.AddLastArg(CmdArgs, options::OPT_CC);
  174. // Handle dependency file generation.
  175. if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
  176. (A = Args.getLastArg(options::OPT_MD)) ||
  177. (A = Args.getLastArg(options::OPT_MMD))) {
  178. // Determine the output location.
  179. const char *DepFile;
  180. if (Output.getType() == types::TY_Dependencies) {
  181. DepFile = Output.getFilename();
  182. } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
  183. DepFile = MF->getValue(Args);
  184. C.addFailureResultFile(DepFile);
  185. } else if (A->getOption().matches(options::OPT_M) ||
  186. A->getOption().matches(options::OPT_MM)) {
  187. DepFile = "-";
  188. } else {
  189. DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
  190. C.addFailureResultFile(DepFile);
  191. }
  192. CmdArgs.push_back("-dependency-file");
  193. CmdArgs.push_back(DepFile);
  194. // Add a default target if one wasn't specified.
  195. if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
  196. const char *DepTarget;
  197. // If user provided -o, that is the dependency target, except
  198. // when we are only generating a dependency file.
  199. Arg *OutputOpt = Args.getLastArg(options::OPT_o);
  200. if (OutputOpt && Output.getType() != types::TY_Dependencies) {
  201. DepTarget = OutputOpt->getValue(Args);
  202. } else {
  203. // Otherwise derive from the base input.
  204. //
  205. // FIXME: This should use the computed output file location.
  206. SmallString<128> P(Inputs[0].getBaseInput());
  207. llvm::sys::path::replace_extension(P, "o");
  208. DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
  209. }
  210. CmdArgs.push_back("-MT");
  211. SmallString<128> Quoted;
  212. QuoteTarget(DepTarget, Quoted);
  213. CmdArgs.push_back(Args.MakeArgString(Quoted));
  214. }
  215. if (A->getOption().matches(options::OPT_M) ||
  216. A->getOption().matches(options::OPT_MD))
  217. CmdArgs.push_back("-sys-header-deps");
  218. }
  219. if (Args.hasArg(options::OPT_MG)) {
  220. if (!A || A->getOption().matches(options::OPT_MD) ||
  221. A->getOption().matches(options::OPT_MMD))
  222. D.Diag(diag::err_drv_mg_requires_m_or_mm);
  223. CmdArgs.push_back("-MG");
  224. }
  225. Args.AddLastArg(CmdArgs, options::OPT_MP);
  226. // Convert all -MQ <target> args to -MT <quoted target>
  227. for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
  228. options::OPT_MQ),
  229. ie = Args.filtered_end(); it != ie; ++it) {
  230. const Arg *A = *it;
  231. A->claim();
  232. if (A->getOption().matches(options::OPT_MQ)) {
  233. CmdArgs.push_back("-MT");
  234. SmallString<128> Quoted;
  235. QuoteTarget(A->getValue(Args), Quoted);
  236. CmdArgs.push_back(Args.MakeArgString(Quoted));
  237. // -MT flag - no change
  238. } else {
  239. A->render(Args, CmdArgs);
  240. }
  241. }
  242. // Add -i* options, and automatically translate to
  243. // -include-pch/-include-pth for transparent PCH support. It's
  244. // wonky, but we include looking for .gch so we can support seamless
  245. // replacement into a build system already set up to be generating
  246. // .gch files.
  247. bool RenderedImplicitInclude = false;
  248. for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
  249. ie = Args.filtered_end(); it != ie; ++it) {
  250. const Arg *A = it;
  251. if (A->getOption().matches(options::OPT_include)) {
  252. bool IsFirstImplicitInclude = !RenderedImplicitInclude;
  253. RenderedImplicitInclude = true;
  254. // Use PCH if the user requested it.
  255. bool UsePCH = D.CCCUsePCH;
  256. bool FoundPTH = false;
  257. bool FoundPCH = false;
  258. llvm::sys::Path P(A->getValue(Args));
  259. bool Exists;
  260. if (UsePCH) {
  261. P.appendSuffix("pch");
  262. if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
  263. FoundPCH = true;
  264. else
  265. P.eraseSuffix();
  266. }
  267. if (!FoundPCH) {
  268. P.appendSuffix("pth");
  269. if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
  270. FoundPTH = true;
  271. else
  272. P.eraseSuffix();
  273. }
  274. if (!FoundPCH && !FoundPTH) {
  275. P.appendSuffix("gch");
  276. if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
  277. FoundPCH = UsePCH;
  278. FoundPTH = !UsePCH;
  279. }
  280. else
  281. P.eraseSuffix();
  282. }
  283. if (FoundPCH || FoundPTH) {
  284. if (IsFirstImplicitInclude) {
  285. A->claim();
  286. if (UsePCH)
  287. CmdArgs.push_back("-include-pch");
  288. else
  289. CmdArgs.push_back("-include-pth");
  290. CmdArgs.push_back(Args.MakeArgString(P.str()));
  291. continue;
  292. } else {
  293. // Ignore the PCH if not first on command line and emit warning.
  294. D.Diag(diag::warn_drv_pch_not_first_include)
  295. << P.str() << A->getAsString(Args);
  296. }
  297. }
  298. }
  299. // Not translated, render as usual.
  300. A->claim();
  301. A->render(Args, CmdArgs);
  302. }
  303. Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
  304. Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
  305. options::OPT_index_header_map);
  306. // Add -Wp, and -Xassembler if using the preprocessor.
  307. // FIXME: There is a very unfortunate problem here, some troubled
  308. // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
  309. // really support that we would have to parse and then translate
  310. // those options. :(
  311. Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
  312. options::OPT_Xpreprocessor);
  313. // -I- is a deprecated GCC feature, reject it.
  314. if (Arg *A = Args.getLastArg(options::OPT_I_))
  315. D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
  316. // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
  317. // -isysroot to the CC1 invocation.
  318. if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
  319. if (!Args.hasArg(options::OPT_isysroot)) {
  320. CmdArgs.push_back("-isysroot");
  321. CmdArgs.push_back(A->getValue(Args));
  322. }
  323. }
  324. // If a module path was provided, pass it along. Otherwise, use a temporary
  325. // directory.
  326. if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
  327. A->claim();
  328. A->render(Args, CmdArgs);
  329. } else {
  330. SmallString<128> DefaultModuleCache;
  331. llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
  332. DefaultModuleCache);
  333. llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
  334. CmdArgs.push_back("-fmodule-cache-path");
  335. CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
  336. }
  337. // Parse additional include paths from environment variables.
  338. // FIXME: We should probably sink the logic for handling these from the
  339. // frontend into the driver. It will allow deleting 4 otherwise unused flags.
  340. // CPATH - included following the user specified includes (but prior to
  341. // builtin and standard includes).
  342. AddIncludeDirectoryList(Args, CmdArgs, "-I", ::getenv("CPATH"));
  343. // C_INCLUDE_PATH - system includes enabled when compiling C.
  344. AddIncludeDirectoryList(Args, CmdArgs, "-c-isystem",
  345. ::getenv("C_INCLUDE_PATH"));
  346. // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
  347. AddIncludeDirectoryList(Args, CmdArgs, "-cxx-isystem",
  348. ::getenv("CPLUS_INCLUDE_PATH"));
  349. // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
  350. AddIncludeDirectoryList(Args, CmdArgs, "-objc-isystem",
  351. ::getenv("OBJC_INCLUDE_PATH"));
  352. // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
  353. AddIncludeDirectoryList(Args, CmdArgs, "-objcxx-isystem",
  354. ::getenv("OBJCPLUS_INCLUDE_PATH"));
  355. // Add C++ include arguments, if needed.
  356. if (types::isCXX(Inputs[0].getType()))
  357. getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
  358. // Add system include arguments.
  359. getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
  360. }
  361. /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
  362. //
  363. // FIXME: tblgen this.
  364. static const char *getARMTargetCPU(const ArgList &Args,
  365. const llvm::Triple &Triple) {
  366. // FIXME: Warn on inconsistent use of -mcpu and -march.
  367. // If we have -mcpu=, use that.
  368. if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
  369. return A->getValue(Args);
  370. StringRef MArch;
  371. if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
  372. // Otherwise, if we have -march= choose the base CPU for that arch.
  373. MArch = A->getValue(Args);
  374. } else {
  375. // Otherwise, use the Arch from the triple.
  376. MArch = Triple.getArchName();
  377. }
  378. return llvm::StringSwitch<const char *>(MArch)
  379. .Cases("armv2", "armv2a","arm2")
  380. .Case("armv3", "arm6")
  381. .Case("armv3m", "arm7m")
  382. .Cases("armv4", "armv4t", "arm7tdmi")
  383. .Cases("armv5", "armv5t", "arm10tdmi")
  384. .Cases("armv5e", "armv5te", "arm1026ejs")
  385. .Case("armv5tej", "arm926ej-s")
  386. .Cases("armv6", "armv6k", "arm1136jf-s")
  387. .Case("armv6j", "arm1136j-s")
  388. .Cases("armv6z", "armv6zk", "arm1176jzf-s")
  389. .Case("armv6t2", "arm1156t2-s")
  390. .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
  391. .Cases("armv7r", "armv7-r", "cortex-r4")
  392. .Cases("armv7m", "armv7-m", "cortex-m3")
  393. .Case("ep9312", "ep9312")
  394. .Case("iwmmxt", "iwmmxt")
  395. .Case("xscale", "xscale")
  396. .Cases("armv6m", "armv6-m", "cortex-m0")
  397. // If all else failed, return the most base CPU LLVM supports.
  398. .Default("arm7tdmi");
  399. }
  400. /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
  401. /// CPU.
  402. //
  403. // FIXME: This is redundant with -mcpu, why does LLVM use this.
  404. // FIXME: tblgen this, or kill it!
  405. static const char *getLLVMArchSuffixForARM(StringRef CPU) {
  406. return llvm::StringSwitch<const char *>(CPU)
  407. .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
  408. .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
  409. .Cases("arm920", "arm920t", "arm922t", "v4t")
  410. .Cases("arm940t", "ep9312","v4t")
  411. .Cases("arm10tdmi", "arm1020t", "v5")
  412. .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
  413. .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
  414. .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
  415. .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
  416. .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
  417. .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
  418. .Cases("cortex-a8", "cortex-a9", "v7")
  419. .Default("");
  420. }
  421. // FIXME: Move to target hook.
  422. static bool isSignedCharDefault(const llvm::Triple &Triple) {
  423. switch (Triple.getArch()) {
  424. default:
  425. return true;
  426. case llvm::Triple::arm:
  427. case llvm::Triple::ppc:
  428. case llvm::Triple::ppc64:
  429. if (Triple.isOSDarwin())
  430. return true;
  431. return false;
  432. }
  433. }
  434. void Clang::AddARMTargetArgs(const ArgList &Args,
  435. ArgStringList &CmdArgs,
  436. bool KernelOrKext) const {
  437. const Driver &D = getToolChain().getDriver();
  438. llvm::Triple Triple = getToolChain().getTriple();
  439. // Select the ABI to use.
  440. //
  441. // FIXME: Support -meabi.
  442. const char *ABIName = 0;
  443. if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
  444. ABIName = A->getValue(Args);
  445. } else {
  446. // Select the default based on the platform.
  447. switch(Triple.getEnvironment()) {
  448. case llvm::Triple::ANDROIDEABI:
  449. case llvm::Triple::GNUEABI:
  450. ABIName = "aapcs-linux";
  451. break;
  452. case llvm::Triple::EABI:
  453. ABIName = "aapcs";
  454. break;
  455. default:
  456. ABIName = "apcs-gnu";
  457. }
  458. }
  459. CmdArgs.push_back("-target-abi");
  460. CmdArgs.push_back(ABIName);
  461. // Set the CPU based on -march= and -mcpu=.
  462. CmdArgs.push_back("-target-cpu");
  463. CmdArgs.push_back(getARMTargetCPU(Args, Triple));
  464. // Select the float ABI as determined by -msoft-float, -mhard-float, and
  465. // -mfloat-abi=.
  466. StringRef FloatABI;
  467. if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
  468. options::OPT_mhard_float,
  469. options::OPT_mfloat_abi_EQ)) {
  470. if (A->getOption().matches(options::OPT_msoft_float))
  471. FloatABI = "soft";
  472. else if (A->getOption().matches(options::OPT_mhard_float))
  473. FloatABI = "hard";
  474. else {
  475. FloatABI = A->getValue(Args);
  476. if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
  477. D.Diag(diag::err_drv_invalid_mfloat_abi)
  478. << A->getAsString(Args);
  479. FloatABI = "soft";
  480. }
  481. }
  482. }
  483. // If unspecified, choose the default based on the platform.
  484. if (FloatABI.empty()) {
  485. switch (Triple.getOS()) {
  486. case llvm::Triple::Darwin:
  487. case llvm::Triple::MacOSX:
  488. case llvm::Triple::IOS: {
  489. // Darwin defaults to "softfp" for v6 and v7.
  490. //
  491. // FIXME: Factor out an ARM class so we can cache the arch somewhere.
  492. StringRef ArchName =
  493. getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
  494. if (ArchName.startswith("v6") || ArchName.startswith("v7"))
  495. FloatABI = "softfp";
  496. else
  497. FloatABI = "soft";
  498. break;
  499. }
  500. case llvm::Triple::Linux: {
  501. if (Triple.getEnvironment() == llvm::Triple::GNUEABI) {
  502. FloatABI = "softfp";
  503. break;
  504. }
  505. }
  506. // fall through
  507. default:
  508. switch(Triple.getEnvironment()) {
  509. case llvm::Triple::GNUEABI:
  510. FloatABI = "softfp";
  511. break;
  512. case llvm::Triple::EABI:
  513. // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
  514. FloatABI = "softfp";
  515. break;
  516. case llvm::Triple::ANDROIDEABI: {
  517. StringRef ArchName =
  518. getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
  519. if (ArchName.startswith("v7"))
  520. FloatABI = "softfp";
  521. else
  522. FloatABI = "soft";
  523. break;
  524. }
  525. default:
  526. // Assume "soft", but warn the user we are guessing.
  527. FloatABI = "soft";
  528. D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
  529. break;
  530. }
  531. }
  532. }
  533. if (FloatABI == "soft") {
  534. // Floating point operations and argument passing are soft.
  535. //
  536. // FIXME: This changes CPP defines, we need -target-soft-float.
  537. CmdArgs.push_back("-msoft-float");
  538. CmdArgs.push_back("-mfloat-abi");
  539. CmdArgs.push_back("soft");
  540. } else if (FloatABI == "softfp") {
  541. // Floating point operations are hard, but argument passing is soft.
  542. CmdArgs.push_back("-mfloat-abi");
  543. CmdArgs.push_back("soft");
  544. } else {
  545. // Floating point operations and argument passing are hard.
  546. assert(FloatABI == "hard" && "Invalid float abi!");
  547. CmdArgs.push_back("-mfloat-abi");
  548. CmdArgs.push_back("hard");
  549. }
  550. // Set appropriate target features for floating point mode.
  551. //
  552. // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
  553. // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
  554. // stripped out by the ARM target.
  555. // Use software floating point operations?
  556. if (FloatABI == "soft") {
  557. CmdArgs.push_back("-target-feature");
  558. CmdArgs.push_back("+soft-float");
  559. }
  560. // Use software floating point argument passing?
  561. if (FloatABI != "hard") {
  562. CmdArgs.push_back("-target-feature");
  563. CmdArgs.push_back("+soft-float-abi");
  564. }
  565. // Honor -mfpu=.
  566. //
  567. // FIXME: Centralize feature selection, defaulting shouldn't be also in the
  568. // frontend target.
  569. if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
  570. StringRef FPU = A->getValue(Args);
  571. // Set the target features based on the FPU.
  572. if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
  573. // Disable any default FPU support.
  574. CmdArgs.push_back("-target-feature");
  575. CmdArgs.push_back("-vfp2");
  576. CmdArgs.push_back("-target-feature");
  577. CmdArgs.push_back("-vfp3");
  578. CmdArgs.push_back("-target-feature");
  579. CmdArgs.push_back("-neon");
  580. } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
  581. CmdArgs.push_back("-target-feature");
  582. CmdArgs.push_back("+vfp3");
  583. CmdArgs.push_back("-target-feature");
  584. CmdArgs.push_back("+d16");
  585. CmdArgs.push_back("-target-feature");
  586. CmdArgs.push_back("-neon");
  587. } else if (FPU == "vfp") {
  588. CmdArgs.push_back("-target-feature");
  589. CmdArgs.push_back("+vfp2");
  590. CmdArgs.push_back("-target-feature");
  591. CmdArgs.push_back("-neon");
  592. } else if (FPU == "vfp3" || FPU == "vfpv3") {
  593. CmdArgs.push_back("-target-feature");
  594. CmdArgs.push_back("+vfp3");
  595. CmdArgs.push_back("-target-feature");
  596. CmdArgs.push_back("-neon");
  597. } else if (FPU == "neon") {
  598. CmdArgs.push_back("-target-feature");
  599. CmdArgs.push_back("+neon");
  600. } else
  601. D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
  602. }
  603. // Setting -msoft-float effectively disables NEON because of the GCC
  604. // implementation, although the same isn't true of VFP or VFP3.
  605. if (FloatABI == "soft") {
  606. CmdArgs.push_back("-target-feature");
  607. CmdArgs.push_back("-neon");
  608. }
  609. // Kernel code has more strict alignment requirements.
  610. if (KernelOrKext) {
  611. CmdArgs.push_back("-backend-option");
  612. CmdArgs.push_back("-arm-long-calls");
  613. CmdArgs.push_back("-backend-option");
  614. CmdArgs.push_back("-arm-strict-align");
  615. // The kext linker doesn't know how to deal with movw/movt.
  616. CmdArgs.push_back("-backend-option");
  617. CmdArgs.push_back("-arm-darwin-use-movt=0");
  618. }
  619. // Setting -mno-global-merge disables the codegen global merge pass. Setting
  620. // -mglobal-merge has no effect as the pass is enabled by default.
  621. if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
  622. options::OPT_mno_global_merge)) {
  623. if (A->getOption().matches(options::OPT_mno_global_merge))
  624. CmdArgs.push_back("-mno-global-merge");
  625. }
  626. }
  627. // Get default architecture.
  628. static const char* getMipsArchFromCPU(StringRef CPUName) {
  629. if (CPUName == "mips32" || CPUName == "mips32r2")
  630. return "mips";
  631. assert((CPUName == "mips64" || CPUName == "mips64r2") &&
  632. "Unexpected cpu name.");
  633. return "mips64";
  634. }
  635. // Check that ArchName is a known Mips architecture name.
  636. static bool checkMipsArchName(StringRef ArchName) {
  637. return ArchName == "mips" ||
  638. ArchName == "mipsel" ||
  639. ArchName == "mips64" ||
  640. ArchName == "mips64el";
  641. }
  642. // Get default target cpu.
  643. static const char* getMipsCPUFromArch(StringRef ArchName) {
  644. if (ArchName == "mips" || ArchName == "mipsel")
  645. return "mips32";
  646. assert((ArchName == "mips64" || ArchName == "mips64el") &&
  647. "Unexpected arch name.");
  648. return "mips64";
  649. }
  650. // Get default ABI.
  651. static const char* getMipsABIFromArch(StringRef ArchName) {
  652. if (ArchName == "mips" || ArchName == "mipsel")
  653. return "o32";
  654. assert((ArchName == "mips64" || ArchName == "mips64el") &&
  655. "Unexpected arch name.");
  656. return "n64";
  657. }
  658. void Clang::AddMIPSTargetArgs(const ArgList &Args,
  659. ArgStringList &CmdArgs) const {
  660. const Driver &D = getToolChain().getDriver();
  661. StringRef ArchName;
  662. const char *CPUName;
  663. // Set target cpu and architecture.
  664. if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
  665. CPUName = A->getValue(Args);
  666. ArchName = getMipsArchFromCPU(CPUName);
  667. }
  668. else {
  669. ArchName = Args.MakeArgString(getToolChain().getArchName());
  670. if (!checkMipsArchName(ArchName))
  671. D.Diag(diag::err_drv_invalid_arch_name) << ArchName;
  672. else
  673. CPUName = getMipsCPUFromArch(ArchName);
  674. }
  675. CmdArgs.push_back("-target-cpu");
  676. CmdArgs.push_back(CPUName);
  677. // Select the ABI to use.
  678. const char *ABIName = 0;
  679. if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
  680. ABIName = A->getValue(Args);
  681. else
  682. ABIName = getMipsABIFromArch(ArchName);
  683. CmdArgs.push_back("-target-abi");
  684. CmdArgs.push_back(ABIName);
  685. // Select the float ABI as determined by -msoft-float, -mhard-float, and
  686. StringRef FloatABI;
  687. if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
  688. options::OPT_mhard_float)) {
  689. if (A->getOption().matches(options::OPT_msoft_float))
  690. FloatABI = "soft";
  691. else if (A->getOption().matches(options::OPT_mhard_float))
  692. FloatABI = "hard";
  693. }
  694. // If unspecified, choose the default based on the platform.
  695. if (FloatABI.empty()) {
  696. // Assume "soft", but warn the user we are guessing.
  697. FloatABI = "soft";
  698. D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
  699. }
  700. if (FloatABI == "soft") {
  701. // Floating point operations and argument passing are soft.
  702. //
  703. // FIXME: This changes CPP defines, we need -target-soft-float.
  704. CmdArgs.push_back("-msoft-float");
  705. } else {
  706. assert(FloatABI == "hard" && "Invalid float abi!");
  707. CmdArgs.push_back("-mhard-float");
  708. }
  709. }
  710. void Clang::AddSparcTargetArgs(const ArgList &Args,
  711. ArgStringList &CmdArgs) const {
  712. const Driver &D = getToolChain().getDriver();
  713. if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
  714. CmdArgs.push_back("-target-cpu");
  715. CmdArgs.push_back(A->getValue(Args));
  716. }
  717. // Select the float ABI as determined by -msoft-float, -mhard-float, and
  718. StringRef FloatABI;
  719. if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
  720. options::OPT_mhard_float)) {
  721. if (A->getOption().matches(options::OPT_msoft_float))
  722. FloatABI = "soft";
  723. else if (A->getOption().matches(options::OPT_mhard_float))
  724. FloatABI = "hard";
  725. }
  726. // If unspecified, choose the default based on the platform.
  727. if (FloatABI.empty()) {
  728. switch (getToolChain().getTriple().getOS()) {
  729. default:
  730. // Assume "soft", but warn the user we are guessing.
  731. FloatABI = "soft";
  732. D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
  733. break;
  734. }
  735. }
  736. if (FloatABI == "soft") {
  737. // Floating point operations and argument passing are soft.
  738. //
  739. // FIXME: This changes CPP defines, we need -target-soft-float.
  740. CmdArgs.push_back("-msoft-float");
  741. CmdArgs.push_back("-target-feature");
  742. CmdArgs.push_back("+soft-float");
  743. } else {
  744. assert(FloatABI == "hard" && "Invalid float abi!");
  745. CmdArgs.push_back("-mhard-float");
  746. }
  747. }
  748. void Clang::AddX86TargetArgs(const ArgList &Args,
  749. ArgStringList &CmdArgs) const {
  750. if (!Args.hasFlag(options::OPT_mred_zone,
  751. options::OPT_mno_red_zone,
  752. true) ||
  753. Args.hasArg(options::OPT_mkernel) ||
  754. Args.hasArg(options::OPT_fapple_kext))
  755. CmdArgs.push_back("-disable-red-zone");
  756. if (Args.hasFlag(options::OPT_msoft_float,
  757. options::OPT_mno_soft_float,
  758. false))
  759. CmdArgs.push_back("-no-implicit-float");
  760. const char *CPUName = 0;
  761. if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
  762. if (StringRef(A->getValue(Args)) == "native") {
  763. // FIXME: Reject attempts to use -march=native unless the target matches
  764. // the host.
  765. //
  766. // FIXME: We should also incorporate the detected target features for use
  767. // with -native.
  768. std::string CPU = llvm::sys::getHostCPUName();
  769. if (!CPU.empty())
  770. CPUName = Args.MakeArgString(CPU);
  771. } else
  772. CPUName = A->getValue(Args);
  773. }
  774. // Select the default CPU if none was given (or detection failed).
  775. if (!CPUName) {
  776. // FIXME: Need target hooks.
  777. if (getToolChain().getTriple().isOSDarwin()) {
  778. if (getToolChain().getArch() == llvm::Triple::x86_64)
  779. CPUName = "core2";
  780. else if (getToolChain().getArch() == llvm::Triple::x86)
  781. CPUName = "yonah";
  782. } else if (getToolChain().getOS().startswith("haiku")) {
  783. if (getToolChain().getArch() == llvm::Triple::x86_64)
  784. CPUName = "x86-64";
  785. else if (getToolChain().getArch() == llvm::Triple::x86)
  786. CPUName = "i586";
  787. } else if (getToolChain().getOS().startswith("openbsd")) {
  788. if (getToolChain().getArch() == llvm::Triple::x86_64)
  789. CPUName = "x86-64";
  790. else if (getToolChain().getArch() == llvm::Triple::x86)
  791. CPUName = "i486";
  792. } else if (getToolChain().getOS().startswith("freebsd")) {
  793. if (getToolChain().getArch() == llvm::Triple::x86_64)
  794. CPUName = "x86-64";
  795. else if (getToolChain().getArch() == llvm::Triple::x86)
  796. CPUName = "i486";
  797. } else if (getToolChain().getOS().startswith("netbsd")) {
  798. if (getToolChain().getArch() == llvm::Triple::x86_64)
  799. CPUName = "x86-64";
  800. else if (getToolChain().getArch() == llvm::Triple::x86)
  801. CPUName = "i486";
  802. } else {
  803. if (getToolChain().getArch() == llvm::Triple::x86_64)
  804. CPUName = "x86-64";
  805. else if (getToolChain().getArch() == llvm::Triple::x86)
  806. CPUName = "pentium4";
  807. }
  808. }
  809. if (CPUName) {
  810. CmdArgs.push_back("-target-cpu");
  811. CmdArgs.push_back(CPUName);
  812. }
  813. // The required algorithm here is slightly strange: the options are applied
  814. // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
  815. // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
  816. // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
  817. // former correctly, but not the latter; handle directly-overridden
  818. // attributes here.
  819. llvm::StringMap<unsigned> PrevFeature;
  820. std::vector<const char*> Features;
  821. for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
  822. ie = Args.filtered_end(); it != ie; ++it) {
  823. StringRef Name = (*it)->getOption().getName();
  824. (*it)->claim();
  825. // Skip over "-m".
  826. assert(Name.startswith("-m") && "Invalid feature name.");
  827. Name = Name.substr(2);
  828. bool IsNegative = Name.startswith("no-");
  829. if (IsNegative)
  830. Name = Name.substr(3);
  831. unsigned& Prev = PrevFeature[Name];
  832. if (Prev)
  833. Features[Prev - 1] = 0;
  834. Prev = Features.size() + 1;
  835. Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
  836. }
  837. for (unsigned i = 0; i < Features.size(); i++) {
  838. if (Features[i]) {
  839. CmdArgs.push_back("-target-feature");
  840. CmdArgs.push_back(Features[i]);
  841. }
  842. }
  843. }
  844. static Arg* getLastHexagonArchArg (const ArgList &Args)
  845. {
  846. Arg * A = NULL;
  847. for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
  848. it != ie; ++it) {
  849. if ((*it)->getOption().matches(options::OPT_march_EQ) ||
  850. (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
  851. A = *it;
  852. A->claim();
  853. }
  854. else if ((*it)->getOption().matches(options::OPT_m_Joined)){
  855. StringRef Value = (*it)->getValue(Args,0);
  856. if (Value.startswith("v")) {
  857. A = *it;
  858. A->claim();
  859. }
  860. }
  861. }
  862. return A;
  863. }
  864. static StringRef getHexagonTargetCPU(const ArgList &Args)
  865. {
  866. Arg *A;
  867. llvm::StringRef WhichHexagon;
  868. // Select the default CPU (v4) if none was given or detection failed.
  869. if ((A = getLastHexagonArchArg (Args))) {
  870. WhichHexagon = A->getValue(Args);
  871. if (WhichHexagon == "")
  872. return "v4";
  873. else
  874. return WhichHexagon;
  875. }
  876. else
  877. return "v4";
  878. }
  879. void Clang::AddHexagonTargetArgs(const ArgList &Args,
  880. ArgStringList &CmdArgs) const {
  881. llvm::Triple Triple = getToolChain().getTriple();
  882. CmdArgs.push_back("-target-cpu");
  883. CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
  884. CmdArgs.push_back("-fno-signed-char");
  885. CmdArgs.push_back("-nobuiltininc");
  886. if (Args.hasArg(options::OPT_mqdsp6_compat))
  887. CmdArgs.push_back("-mqdsp6-compat");
  888. if (Arg *A = Args.getLastArg(options::OPT_G,
  889. options::OPT_msmall_data_threshold_EQ)) {
  890. std::string SmallDataThreshold="-small-data-threshold=";
  891. SmallDataThreshold += A->getValue(Args);
  892. CmdArgs.push_back ("-mllvm");
  893. CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
  894. A->claim();
  895. }
  896. CmdArgs.push_back ("-mllvm");
  897. CmdArgs.push_back ("-machine-sink-split=0");
  898. }
  899. static bool
  900. shouldUseExceptionTablesForObjCExceptions(unsigned objcABIVersion,
  901. const llvm::Triple &Triple) {
  902. // We use the zero-cost exception tables for Objective-C if the non-fragile
  903. // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
  904. // later.
  905. if (objcABIVersion >= 2)
  906. return true;
  907. if (!Triple.isOSDarwin())
  908. return false;
  909. return (!Triple.isMacOSXVersionLT(10,5) &&
  910. (Triple.getArch() == llvm::Triple::x86_64 ||
  911. Triple.getArch() == llvm::Triple::arm));
  912. }
  913. /// addExceptionArgs - Adds exception related arguments to the driver command
  914. /// arguments. There's a master flag, -fexceptions and also language specific
  915. /// flags to enable/disable C++ and Objective-C exceptions.
  916. /// This makes it possible to for example disable C++ exceptions but enable
  917. /// Objective-C exceptions.
  918. static void addExceptionArgs(const ArgList &Args, types::ID InputType,
  919. const llvm::Triple &Triple,
  920. bool KernelOrKext, bool IsRewriter,
  921. unsigned objcABIVersion,
  922. ArgStringList &CmdArgs) {
  923. if (KernelOrKext)
  924. return;
  925. // Exceptions are enabled by default.
  926. bool ExceptionsEnabled = true;
  927. // This keeps track of whether exceptions were explicitly turned on or off.
  928. bool DidHaveExplicitExceptionFlag = false;
  929. if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
  930. options::OPT_fno_exceptions)) {
  931. if (A->getOption().matches(options::OPT_fexceptions))
  932. ExceptionsEnabled = true;
  933. else
  934. ExceptionsEnabled = false;
  935. DidHaveExplicitExceptionFlag = true;
  936. }
  937. bool ShouldUseExceptionTables = false;
  938. // Exception tables and cleanups can be enabled with -fexceptions even if the
  939. // language itself doesn't support exceptions.
  940. if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
  941. ShouldUseExceptionTables = true;
  942. // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
  943. // is not necessarily sensible, but follows GCC.
  944. if (types::isObjC(InputType) &&
  945. Args.hasFlag(options::OPT_fobjc_exceptions,
  946. options::OPT_fno_objc_exceptions,
  947. true)) {
  948. CmdArgs.push_back("-fobjc-exceptions");
  949. ShouldUseExceptionTables |=
  950. shouldUseExceptionTablesForObjCExceptions(objcABIVersion, Triple);
  951. }
  952. if (types::isCXX(InputType)) {
  953. bool CXXExceptionsEnabled = ExceptionsEnabled;
  954. if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
  955. options::OPT_fno_cxx_exceptions,
  956. options::OPT_fexceptions,
  957. options::OPT_fno_exceptions)) {
  958. if (A->getOption().matches(options::OPT_fcxx_exceptions))
  959. CXXExceptionsEnabled = true;
  960. else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
  961. CXXExceptionsEnabled = false;
  962. }
  963. if (CXXExceptionsEnabled) {
  964. CmdArgs.push_back("-fcxx-exceptions");
  965. ShouldUseExceptionTables = true;
  966. }
  967. }
  968. if (ShouldUseExceptionTables)
  969. CmdArgs.push_back("-fexceptions");
  970. }
  971. static bool ShouldDisableCFI(const ArgList &Args,
  972. const ToolChain &TC) {
  973. if (TC.getTriple().isOSDarwin()) {
  974. // The native darwin assembler doesn't support cfi directives, so
  975. // we disable them if we think the .s file will be passed to it.
  976. bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
  977. options::OPT_no_integrated_as,
  978. TC.IsIntegratedAssemblerDefault());
  979. bool UseCFI = Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
  980. options::OPT_fno_dwarf2_cfi_asm,
  981. UseIntegratedAs);
  982. return !UseCFI;
  983. }
  984. // For now we assume that every other assembler support CFI.
  985. return false;
  986. }
  987. static bool ShouldDisableDwarfDirectory(const ArgList &Args,
  988. const ToolChain &TC) {
  989. bool IsIADefault = TC.IsIntegratedAssemblerDefault();
  990. bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
  991. options::OPT_no_integrated_as,
  992. IsIADefault);
  993. bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
  994. options::OPT_fno_dwarf_directory_asm,
  995. UseIntegratedAs);
  996. return !UseDwarfDirectory;
  997. }
  998. /// \brief Check whether the given input tree contains any compilation actions.
  999. static bool ContainsCompileAction(const Action *A) {
  1000. if (isa<CompileJobAction>(A))
  1001. return true;
  1002. for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
  1003. if (ContainsCompileAction(*it))
  1004. return true;
  1005. return false;
  1006. }
  1007. /// \brief Check if -relax-all should be passed to the internal assembler.
  1008. /// This is done by default when compiling non-assembler source with -O0.
  1009. static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
  1010. bool RelaxDefault = true;
  1011. if (Arg *A = Args.getLastArg(options::OPT_O_Group))
  1012. RelaxDefault = A->getOption().matches(options::OPT_O0);
  1013. if (RelaxDefault) {
  1014. RelaxDefault = false;
  1015. for (ActionList::const_iterator it = C.getActions().begin(),
  1016. ie = C.getActions().end(); it != ie; ++it) {
  1017. if (ContainsCompileAction(*it)) {
  1018. RelaxDefault = true;
  1019. break;
  1020. }
  1021. }
  1022. }
  1023. return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
  1024. RelaxDefault);
  1025. }
  1026. /// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
  1027. /// This needs to be called before we add the C run-time (malloc, etc).
  1028. static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
  1029. ArgStringList &CmdArgs) {
  1030. // Add asan linker flags when linking an executable, but not a shared object.
  1031. if (Args.hasArg(options::OPT_shared) ||
  1032. !Args.hasFlag(options::OPT_faddress_sanitizer,
  1033. options::OPT_fno_address_sanitizer, false))
  1034. return;
  1035. // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library resource
  1036. // directory.
  1037. SmallString<128> LibAsan(TC.getDriver().ResourceDir);
  1038. llvm::sys::path::append(LibAsan, "lib", "linux",
  1039. (Twine("libclang_rt.asan-") +
  1040. TC.getArchName() + ".a"));
  1041. CmdArgs.push_back(Args.MakeArgString(LibAsan));
  1042. CmdArgs.push_back("-lpthread");
  1043. CmdArgs.push_back("-ldl");
  1044. CmdArgs.push_back("-export-dynamic");
  1045. }
  1046. static bool shouldUseFramePointer(const ArgList &Args,
  1047. const llvm::Triple &Triple) {
  1048. if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
  1049. options::OPT_fomit_frame_pointer))
  1050. return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
  1051. // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
  1052. if ((Triple.getArch() == llvm::Triple::x86_64 ||
  1053. Triple.getArch() == llvm::Triple::x86) &&
  1054. Triple.getOS() == llvm::Triple::Linux) {
  1055. if (Arg *A = Args.getLastArg(options::OPT_O_Group))
  1056. if (!A->getOption().matches(options::OPT_O0))
  1057. return false;
  1058. }
  1059. return true;
  1060. }
  1061. void Clang::ConstructJob(Compilation &C, const JobAction &JA,
  1062. const InputInfo &Output,
  1063. const InputInfoList &Inputs,
  1064. const ArgList &Args,
  1065. const char *LinkingOutput) const {
  1066. bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
  1067. options::OPT_fapple_kext);
  1068. const Driver &D = getToolChain().getDriver();
  1069. ArgStringList CmdArgs;
  1070. assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
  1071. // Invoke ourselves in -cc1 mode.
  1072. //
  1073. // FIXME: Implement custom jobs for internal actions.
  1074. CmdArgs.push_back("-cc1");
  1075. // Add the "effective" target triple.
  1076. CmdArgs.push_back("-triple");
  1077. std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
  1078. CmdArgs.push_back(Args.MakeArgString(TripleStr));
  1079. // Select the appropriate action.
  1080. bool IsRewriter = false;
  1081. if (isa<AnalyzeJobAction>(JA)) {
  1082. assert(JA.getType() == types::TY_Plist && "Invalid output type.");
  1083. CmdArgs.push_back("-analyze");
  1084. } else if (isa<PreprocessJobAction>(JA)) {
  1085. if (Output.getType() == types::TY_Dependencies)
  1086. CmdArgs.push_back("-Eonly");
  1087. else
  1088. CmdArgs.push_back("-E");
  1089. } else if (isa<AssembleJobAction>(JA)) {
  1090. CmdArgs.push_back("-emit-obj");
  1091. if (UseRelaxAll(C, Args))
  1092. CmdArgs.push_back("-mrelax-all");
  1093. // When using an integrated assembler, translate -Wa, and -Xassembler
  1094. // options.
  1095. for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
  1096. options::OPT_Xassembler),
  1097. ie = Args.filtered_end(); it != ie; ++it) {
  1098. const Arg *A = *it;
  1099. A->claim();
  1100. for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
  1101. StringRef Value = A->getValue(Args, i);
  1102. if (Value == "-force_cpusubtype_ALL") {
  1103. // Do nothing, this is the default and we don't support anything else.
  1104. } else if (Value == "-L") {
  1105. CmdArgs.push_back("-msave-temp-labels");
  1106. } else if (Value == "--fatal-warnings") {
  1107. CmdArgs.push_back("-mllvm");
  1108. CmdArgs.push_back("-fatal-assembler-warnings");
  1109. } else if (Value == "--noexecstack") {
  1110. CmdArgs.push_back("-mnoexecstack");
  1111. } else {
  1112. D.Diag(diag::err_drv_unsupported_option_argument)
  1113. << A->getOption().getName() << Value;
  1114. }
  1115. }
  1116. }
  1117. // Also ignore explicit -force_cpusubtype_ALL option.
  1118. (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
  1119. } else if (isa<PrecompileJobAction>(JA)) {
  1120. // Use PCH if the user requested it.
  1121. bool UsePCH = D.CCCUsePCH;
  1122. if (UsePCH)
  1123. CmdArgs.push_back("-emit-pch");
  1124. else
  1125. CmdArgs.push_back("-emit-pth");
  1126. } else {
  1127. assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
  1128. if (JA.getType() == types::TY_Nothing) {
  1129. CmdArgs.push_back("-fsyntax-only");
  1130. } else if (JA.getType() == types::TY_LLVM_IR ||
  1131. JA.getType() == types::TY_LTO_IR) {
  1132. CmdArgs.push_back("-emit-llvm");
  1133. } else if (JA.getType() == types::TY_LLVM_BC ||
  1134. JA.getType() == types::TY_LTO_BC) {
  1135. CmdArgs.push_back("-emit-llvm-bc");
  1136. } else if (JA.getType() == types::TY_PP_Asm) {
  1137. CmdArgs.push_back("-S");
  1138. } else if (JA.getType() == types::TY_AST) {
  1139. CmdArgs.push_back("-emit-pch");
  1140. } else if (JA.getType() == types::TY_RewrittenObjC) {
  1141. CmdArgs.push_back("-rewrite-objc");
  1142. IsRewriter = true;
  1143. } else {
  1144. assert(JA.getType() == types::TY_PP_Asm &&
  1145. "Unexpected output type!");
  1146. }
  1147. }
  1148. // The make clang go fast button.
  1149. CmdArgs.push_back("-disable-free");
  1150. // Disable the verification pass in -asserts builds.
  1151. #ifdef NDEBUG
  1152. CmdArgs.push_back("-disable-llvm-verifier");
  1153. #endif
  1154. // Set the main file name, so that debug info works even with
  1155. // -save-temps.
  1156. CmdArgs.push_back("-main-file-name");
  1157. CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
  1158. // Some flags which affect the language (via preprocessor
  1159. // defines). See darwin::CC1::AddCPPArgs.
  1160. if (Args.hasArg(options::OPT_static))
  1161. CmdArgs.push_back("-static-define");
  1162. if (isa<AnalyzeJobAction>(JA)) {
  1163. // Enable region store model by default.
  1164. CmdArgs.push_back("-analyzer-store=region");
  1165. // Treat blocks as analysis entry points.
  1166. CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
  1167. CmdArgs.push_back("-analyzer-eagerly-assume");
  1168. // Add default argument set.
  1169. if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
  1170. CmdArgs.push_back("-analyzer-checker=core");
  1171. if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
  1172. CmdArgs.push_back("-analyzer-checker=unix");
  1173. if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
  1174. CmdArgs.push_back("-analyzer-checker=osx");
  1175. CmdArgs.push_back("-analyzer-checker=deadcode");
  1176. // Enable the following experimental checkers for testing.
  1177. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
  1178. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
  1179. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
  1180. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
  1181. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
  1182. CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
  1183. }
  1184. // Set the output format. The default is plist, for (lame) historical
  1185. // reasons.
  1186. CmdArgs.push_back("-analyzer-output");
  1187. if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
  1188. CmdArgs.push_back(A->getValue(Args));
  1189. else
  1190. CmdArgs.push_back("plist");
  1191. // Disable the presentation of standard compiler warnings when
  1192. // using --analyze. We only want to show static analyzer diagnostics
  1193. // or frontend errors.
  1194. CmdArgs.push_back("-w");
  1195. // Add -Xanalyzer arguments when running as analyzer.
  1196. Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
  1197. }
  1198. CheckCodeGenerationOptions(D, Args);
  1199. // Perform argument translation for LLVM backend. This
  1200. // takes some care in reconciling with llvm-gcc. The
  1201. // issue is that llvm-gcc translates these options based on
  1202. // the values in cc1, whereas we are processing based on
  1203. // the driver arguments.
  1204. // This comes from the default translation the driver + cc1
  1205. // would do to enable flag_pic.
  1206. //
  1207. // FIXME: Centralize this code.
  1208. bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
  1209. Args.hasArg(options::OPT_fpic) ||
  1210. Args.hasArg(options::OPT_fPIE) ||
  1211. Args.hasArg(options::OPT_fpie));
  1212. bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
  1213. Args.hasArg(options::OPT_static));
  1214. const char *Model = getToolChain().GetForcedPicModel();
  1215. if (!Model) {
  1216. if (Args.hasArg(options::OPT_mdynamic_no_pic))
  1217. Model = "dynamic-no-pic";
  1218. else if (PICDisabled)
  1219. Model = "static";
  1220. else if (PICEnabled)
  1221. Model = "pic";
  1222. else
  1223. Model = getToolChain().GetDefaultRelocationModel();
  1224. }
  1225. if (StringRef(Model) != "pic") {
  1226. CmdArgs.push_back("-mrelocation-model");
  1227. CmdArgs.push_back(Model);
  1228. }
  1229. // Infer the __PIC__ value.
  1230. //
  1231. // FIXME: This isn't quite right on Darwin, which always sets
  1232. // __PIC__=2.
  1233. if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
  1234. CmdArgs.push_back("-pic-level");
  1235. CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
  1236. }
  1237. if (!Args.hasFlag(options::OPT_fmerge_all_constants,
  1238. options::OPT_fno_merge_all_constants))
  1239. CmdArgs.push_back("-fno-merge-all-constants");
  1240. // LLVM Code Generator Options.
  1241. if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
  1242. CmdArgs.push_back("-mregparm");
  1243. CmdArgs.push_back(A->getValue(Args));
  1244. }
  1245. if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
  1246. CmdArgs.push_back("-mrtd");
  1247. if (shouldUseFramePointer(Args, getToolChain().getTriple()))
  1248. CmdArgs.push_back("-mdisable-fp-elim");
  1249. if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
  1250. options::OPT_fno_zero_initialized_in_bss))
  1251. CmdArgs.push_back("-mno-zero-initialized-in-bss");
  1252. if (!Args.hasFlag(options::OPT_fstrict_aliasing,
  1253. options::OPT_fno_strict_aliasing,
  1254. getToolChain().IsStrictAliasingDefault()))
  1255. CmdArgs.push_back("-relaxed-aliasing");
  1256. if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
  1257. options::OPT_fno_optimize_sibling_calls))
  1258. CmdArgs.push_back("-mdisable-tail-calls");
  1259. // Handle various floating point optimization flags, mapping them to the
  1260. // appropriate LLVM code generation flags. The pattern for all of these is to
  1261. // default off the codegen optimizations, and if any flag enables them and no
  1262. // flag disables them after the flag enabling them, enable the codegen
  1263. // optimization. This is complicated by several "umbrella" flags.
  1264. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1265. options::OPT_ffinite_math_only,
  1266. options::OPT_fno_finite_math_only,
  1267. options::OPT_fhonor_infinities,
  1268. options::OPT_fno_honor_infinities))
  1269. if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
  1270. A->getOption().getID() != options::OPT_fhonor_infinities)
  1271. CmdArgs.push_back("-menable-no-infs");
  1272. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1273. options::OPT_ffinite_math_only,
  1274. options::OPT_fno_finite_math_only,
  1275. options::OPT_fhonor_nans,
  1276. options::OPT_fno_honor_nans))
  1277. if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
  1278. A->getOption().getID() != options::OPT_fhonor_nans)
  1279. CmdArgs.push_back("-menable-no-nans");
  1280. // -fno-math-errno is default.
  1281. bool MathErrno = false;
  1282. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1283. options::OPT_fmath_errno,
  1284. options::OPT_fno_math_errno)) {
  1285. if (A->getOption().getID() == options::OPT_fmath_errno) {
  1286. CmdArgs.push_back("-fmath-errno");
  1287. MathErrno = true;
  1288. }
  1289. }
  1290. // There are several flags which require disabling very specific
  1291. // optimizations. Any of these being disabled forces us to turn off the
  1292. // entire set of LLVM optimizations, so collect them through all the flag
  1293. // madness.
  1294. bool AssociativeMath = false;
  1295. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1296. options::OPT_funsafe_math_optimizations,
  1297. options::OPT_fno_unsafe_math_optimizations,
  1298. options::OPT_fassociative_math,
  1299. options::OPT_fno_associative_math))
  1300. if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
  1301. A->getOption().getID() != options::OPT_fno_associative_math)
  1302. AssociativeMath = true;
  1303. bool ReciprocalMath = false;
  1304. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1305. options::OPT_funsafe_math_optimizations,
  1306. options::OPT_fno_unsafe_math_optimizations,
  1307. options::OPT_freciprocal_math,
  1308. options::OPT_fno_reciprocal_math))
  1309. if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
  1310. A->getOption().getID() != options::OPT_fno_reciprocal_math)
  1311. ReciprocalMath = true;
  1312. bool SignedZeros = true;
  1313. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1314. options::OPT_funsafe_math_optimizations,
  1315. options::OPT_fno_unsafe_math_optimizations,
  1316. options::OPT_fsigned_zeros,
  1317. options::OPT_fno_signed_zeros))
  1318. if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
  1319. A->getOption().getID() != options::OPT_fsigned_zeros)
  1320. SignedZeros = false;
  1321. bool TrappingMath = true;
  1322. if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
  1323. options::OPT_funsafe_math_optimizations,
  1324. options::OPT_fno_unsafe_math_optimizations,
  1325. options::OPT_ftrapping_math,
  1326. options::OPT_fno_trapping_math))
  1327. if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
  1328. A->getOption().getID() != options::OPT_ftrapping_math)
  1329. TrappingMath = false;
  1330. if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
  1331. !TrappingMath)
  1332. CmdArgs.push_back("-menable-unsafe-fp-math");
  1333. // We separately look for the '-ffast-math' flag, and if we find it, tell the
  1334. // frontend to provide the appropriate preprocessor macros. This is distinct
  1335. // from enabling any optimizations as it induces a language change which must
  1336. // survive serialization and deserialization, etc.
  1337. if (Args.hasArg(options::OPT_ffast_math))
  1338. CmdArgs.push_back("-ffast-math");
  1339. // Decide whether to use verbose asm. Verbose assembly is the default on
  1340. // toolchains which have the integrated assembler on by default.
  1341. bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
  1342. if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
  1343. IsVerboseAsmDefault) ||
  1344. Args.hasArg(options::OPT_dA))
  1345. CmdArgs.push_back("-masm-verbose");
  1346. if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
  1347. CmdArgs.push_back("-mdebug-pass");
  1348. CmdArgs.push_back("Structure");
  1349. }
  1350. if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
  1351. CmdArgs.push_back("-mdebug-pass");
  1352. CmdArgs.push_back("Arguments");
  1353. }
  1354. // Enable -mconstructor-aliases except on darwin, where we have to
  1355. // work around a linker bug; see <rdar://problem/7651567>.
  1356. if (!getToolChain().getTriple().isOSDarwin())
  1357. CmdArgs.push_back("-mconstructor-aliases");
  1358. // Darwin's kernel doesn't support guard variables; just die if we
  1359. // try to use them.
  1360. if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
  1361. CmdArgs.push_back("-fforbid-guard-variables");
  1362. if (Args.hasArg(options::OPT_mms_bitfields)) {
  1363. CmdArgs.push_back("-mms-bitfields");
  1364. }
  1365. // This is a coarse approximation of what llvm-gcc actually does, both
  1366. // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
  1367. // complicated ways.
  1368. bool AsynchronousUnwindTables =
  1369. Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
  1370. options::OPT_fno_asynchronous_unwind_tables,
  1371. getToolChain().IsUnwindTablesDefault() &&
  1372. !KernelOrKext);
  1373. if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
  1374. AsynchronousUnwindTables))
  1375. CmdArgs.push_back("-munwind-tables");
  1376. if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
  1377. CmdArgs.push_back("-mlimit-float-precision");
  1378. CmdArgs.push_back(A->getValue(Args));
  1379. }
  1380. // FIXME: Handle -mtune=.
  1381. (void) Args.hasArg(options::OPT_mtune_EQ);
  1382. if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
  1383. CmdArgs.push_back("-mcode-model");
  1384. CmdArgs.push_back(A->getValue(Args));
  1385. }
  1386. // Add target specific cpu and features flags.
  1387. switch(getToolChain().getTriple().getArch()) {
  1388. default:
  1389. break;
  1390. case llvm::Triple::arm:
  1391. case llvm::Triple::thumb:
  1392. AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
  1393. break;
  1394. case llvm::Triple::mips:
  1395. case llvm::Triple::mipsel:
  1396. case llvm::Triple::mips64:
  1397. case llvm::Triple::mips64el:
  1398. AddMIPSTargetArgs(Args, CmdArgs);
  1399. break;
  1400. case llvm::Triple::sparc:
  1401. AddSparcTargetArgs(Args, CmdArgs);
  1402. break;
  1403. case llvm::Triple::x86:
  1404. case llvm::Triple::x86_64:
  1405. AddX86TargetArgs(Args, CmdArgs);
  1406. break;
  1407. case llvm::Triple::hexagon:
  1408. AddHexagonTargetArgs(Args, CmdArgs);
  1409. break;
  1410. }
  1411. // Pass the linker version in use.
  1412. if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
  1413. CmdArgs.push_back("-target-linker-version");
  1414. CmdArgs.push_back(A->getValue(Args));
  1415. }
  1416. // -mno-omit-leaf-frame-pointer is the default on Darwin.
  1417. if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
  1418. options::OPT_mno_omit_leaf_frame_pointer,
  1419. !getToolChain().getTriple().isOSDarwin()))
  1420. CmdArgs.push_back("-momit-leaf-frame-pointer");
  1421. // Explicitly error on some things we know we don't support and can't just
  1422. // ignore.
  1423. types::ID InputType = Inputs[0].getType();
  1424. if (!Args.hasArg(options::OPT_fallow_unsupported)) {
  1425. Arg *Unsupported;
  1426. if (types::isCXX(InputType) &&
  1427. getToolChain().getTriple().isOSDarwin() &&
  1428. getToolChain().getTriple().getArch() == llvm::Triple::x86) {
  1429. if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
  1430. (Unsupported = Args.getLastArg(options::OPT_mkernel)))
  1431. D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
  1432. << Unsupported->getOption().getName();
  1433. }
  1434. }
  1435. Args.AddAllArgs(CmdArgs, options::OPT_v);
  1436. Args.AddLastArg(CmdArgs, options::OPT_H);
  1437. if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
  1438. CmdArgs.push_back("-header-include-file");
  1439. CmdArgs.push_back(D.CCPrintHeadersFilename ?
  1440. D.CCPrintHeadersFilename : "-");
  1441. }
  1442. Args.AddLastArg(CmdArgs, options::OPT_P);
  1443. Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
  1444. if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
  1445. CmdArgs.push_back("-diagnostic-log-file");
  1446. CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
  1447. D.CCLogDiagnosticsFilename : "-");
  1448. }
  1449. // Special case debug options to only pass -g to clang. This is
  1450. // wrong.
  1451. Args.ClaimAllArgs(options::OPT_g_Group);
  1452. if (Arg *A = Args.getLastArg(options::OPT_g_Group))
  1453. if (!A->getOption().matches(options::OPT_g0)) {
  1454. CmdArgs.push_back("-g");
  1455. }
  1456. Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
  1457. Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
  1458. Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
  1459. if (Args.hasArg(options::OPT_ftest_coverage) ||
  1460. Args.hasArg(options::OPT_coverage))
  1461. CmdArgs.push_back("-femit-coverage-notes");
  1462. if (Args.hasArg(options::OPT_fprofile_arcs) ||
  1463. Args.hasArg(options::OPT_coverage))
  1464. CmdArgs.push_back("-femit-coverage-data");
  1465. if (C.getArgs().hasArg(options::OPT_c) ||
  1466. C.getArgs().hasArg(options::OPT_S)) {
  1467. if (Output.isFilename()) {
  1468. CmdArgs.push_back("-coverage-file");
  1469. CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
  1470. }
  1471. }
  1472. // Pass options for controlling the default header search paths.
  1473. if (Args.hasArg(options::OPT_nostdinc)) {
  1474. CmdArgs.push_back("-nostdsysteminc");
  1475. CmdArgs.push_back("-nobuiltininc");
  1476. } else {
  1477. if (Args.hasArg(options::OPT_nostdlibinc))
  1478. CmdArgs.push_back("-nostdsysteminc");
  1479. Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
  1480. Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
  1481. }
  1482. // Pass the path to compiler resource files.
  1483. CmdArgs.push_back("-resource-dir");
  1484. CmdArgs.push_back(D.ResourceDir.c_str());
  1485. Args.AddLastArg(CmdArgs, options::OPT_working_directory);
  1486. if (!Args.hasArg(options::OPT_fno_objc_arc)) {
  1487. if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
  1488. options::OPT_ccc_arcmt_modify,
  1489. options::OPT_ccc_arcmt_migrate)) {
  1490. switch (A->getOption().getID()) {
  1491. default:
  1492. llvm_unreachable("missed a case");
  1493. case options::OPT_ccc_arcmt_check:
  1494. CmdArgs.push_back("-arcmt-check");
  1495. break;
  1496. case options::OPT_ccc_arcmt_modify:
  1497. CmdArgs.push_back("-arcmt-modify");
  1498. break;
  1499. case options::OPT_ccc_arcmt_migrate:
  1500. CmdArgs.push_back("-arcmt-migrate");
  1501. CmdArgs.push_back("-arcmt-migrate-directory");
  1502. CmdArgs.push_back(A->getValue(Args));
  1503. Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
  1504. Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
  1505. break;
  1506. }
  1507. }
  1508. }
  1509. // Add preprocessing options like -I, -D, etc. if we are using the
  1510. // preprocessor.
  1511. //
  1512. // FIXME: Support -fpreprocessed
  1513. if (types::getPreprocessedType(InputType) != types::TY_INVALID)
  1514. AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
  1515. // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
  1516. // that "The compiler can only warn and ignore the option if not recognized".
  1517. // When building with ccache, it will pass -D options to clang even on
  1518. // preprocessed inputs and configure concludes that -fPIC is not supported.
  1519. Args.ClaimAllArgs(options::OPT_D);
  1520. // Manually translate -O to -O2 and -O4 to -O3; let clang reject
  1521. // others.
  1522. if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
  1523. if (A->getOption().matches(options::OPT_O4))
  1524. CmdArgs.push_back("-O3");
  1525. else if (A->getOption().matches(options::OPT_O) &&
  1526. A->getValue(Args)[0] == '\0')
  1527. CmdArgs.push_back("-O2");
  1528. else
  1529. A->render(Args, CmdArgs);
  1530. }
  1531. Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
  1532. Args.AddLastArg(CmdArgs, options::OPT_pedantic);
  1533. Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
  1534. Args.AddLastArg(CmdArgs, options::OPT_w);
  1535. // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
  1536. // (-ansi is equivalent to -std=c89).
  1537. //
  1538. // If a std is supplied, only add -trigraphs if it follows the
  1539. // option.
  1540. if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
  1541. if (Std->getOption().matches(options::OPT_ansi))
  1542. if (types::isCXX(InputType))
  1543. CmdArgs.push_back("-std=c++98");
  1544. else
  1545. CmdArgs.push_back("-std=c89");
  1546. else
  1547. Std->render(Args, CmdArgs);
  1548. if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
  1549. options::OPT_trigraphs))
  1550. if (A != Std)
  1551. A->render(Args, CmdArgs);
  1552. } else {
  1553. // Honor -std-default.
  1554. //
  1555. // FIXME: Clang doesn't correctly handle -std= when the input language
  1556. // doesn't match. For the time being just ignore this for C++ inputs;
  1557. // eventually we want to do all the standard defaulting here instead of
  1558. // splitting it between the driver and clang -cc1.
  1559. if (!types::isCXX(InputType))
  1560. Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
  1561. "-std=", /*Joined=*/true);
  1562. Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
  1563. }
  1564. // Map the bizarre '-Wwrite-strings' flag to a more sensible
  1565. // '-fconst-strings'; this better indicates its actual behavior.
  1566. if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
  1567. false)) {
  1568. // For perfect compatibility with GCC, we do this even in the presence of
  1569. // '-w'. This flag names something other than a warning for GCC.
  1570. CmdArgs.push_back("-fconst-strings");
  1571. }
  1572. // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
  1573. // during C++ compilation, which it is by default. GCC keeps this define even
  1574. // in the presence of '-w', match this behavior bug-for-bug.
  1575. if (types::isCXX(InputType) &&
  1576. Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
  1577. true)) {
  1578. CmdArgs.push_back("-fdeprecated-macro");
  1579. }
  1580. // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
  1581. if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
  1582. if (Asm->getOption().matches(options::OPT_fasm))
  1583. CmdArgs.push_back("-fgnu-keywords");
  1584. else
  1585. CmdArgs.push_back("-fno-gnu-keywords");
  1586. }
  1587. if (ShouldDisableCFI(Args, getToolChain()))
  1588. CmdArgs.push_back("-fno-dwarf2-cfi-asm");
  1589. if (ShouldDisableDwarfDirectory(Args, getToolChain()))
  1590. CmdArgs.push_back("-fno-dwarf-directory-asm");
  1591. if (const char *pwd = ::getenv("PWD")) {
  1592. // GCC also verifies that stat(pwd) and stat(".") have the same inode
  1593. // number. Not doing those because stats are slow, but we could.
  1594. if (llvm::sys::path::is_absolute(pwd)) {
  1595. std::string CompDir = pwd;
  1596. CmdArgs.push_back("-fdebug-compilation-dir");
  1597. CmdArgs.push_back(Args.MakeArgString(CompDir));
  1598. }
  1599. }
  1600. if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
  1601. options::OPT_ftemplate_depth_EQ)) {
  1602. CmdArgs.push_back("-ftemplate-depth");
  1603. CmdArgs.push_back(A->getValue(Args));
  1604. }
  1605. if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
  1606. CmdArgs.push_back("-fconstexpr-depth");
  1607. CmdArgs.push_back(A->getValue(Args));
  1608. }
  1609. if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
  1610. options::OPT_Wlarge_by_value_copy_def)) {
  1611. CmdArgs.push_back("-Wlarge-by-value-copy");
  1612. if (A->getNumValues())
  1613. CmdArgs.push_back(A->getValue(Args));
  1614. else
  1615. CmdArgs.push_back("64"); // default value for -Wlarge-by-value-copy.
  1616. }
  1617. if (Args.hasArg(options::OPT__relocatable_pch))
  1618. CmdArgs.push_back("-relocatable-pch");
  1619. if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
  1620. CmdArgs.push_back("-fconstant-string-class");
  1621. CmdArgs.push_back(A->getValue(Args));
  1622. }
  1623. if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
  1624. CmdArgs.push_back("-ftabstop");
  1625. CmdArgs.push_back(A->getValue(Args));
  1626. }
  1627. CmdArgs.push_back("-ferror-limit");
  1628. if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
  1629. CmdArgs.push_back(A->getValue(Args));
  1630. else
  1631. CmdArgs.push_back("19");
  1632. if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
  1633. CmdArgs.push_back("-fmacro-backtrace-limit");
  1634. CmdArgs.push_back(A->getValue(Args));
  1635. }
  1636. if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
  1637. CmdArgs.push_back("-ftemplate-backtrace-limit");
  1638. CmdArgs.push_back(A->getValue(Args));
  1639. }
  1640. if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
  1641. CmdArgs.push_back("-fconstexpr-backtrace-limit");
  1642. CmdArgs.push_back(A->getValue(Args));
  1643. }
  1644. // Pass -fmessage-length=.
  1645. CmdArgs.push_back("-fmessage-length");
  1646. if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
  1647. CmdArgs.push_back(A->getValue(Args));
  1648. } else {
  1649. // If -fmessage-length=N was not specified, determine whether this is a
  1650. // terminal and, if so, implicitly define -fmessage-length appropriately.
  1651. unsigned N = llvm::sys::Process::StandardErrColumns();
  1652. CmdArgs.push_back(Args.MakeArgString(Twine(N)));
  1653. }
  1654. if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
  1655. CmdArgs.push_back("-fvisibility");
  1656. CmdArgs.push_back(A->getValue(Args));
  1657. }
  1658. Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
  1659. // -fhosted is default.
  1660. if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding,
  1661. options::OPT_fhosted,
  1662. false))
  1663. CmdArgs.push_back("-ffreestanding");
  1664. // Forward -f (flag) options which we can pass directly.
  1665. Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
  1666. Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
  1667. Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
  1668. Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
  1669. Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
  1670. Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
  1671. Args.AddLastArg(CmdArgs, options::OPT_faltivec);
  1672. if (getToolChain().SupportsProfiling())
  1673. Args.AddLastArg(CmdArgs, options::OPT_pg);
  1674. if (Args.hasFlag(options::OPT_faddress_sanitizer,
  1675. options::OPT_fno_address_sanitizer, false))
  1676. CmdArgs.push_back("-faddress-sanitizer");
  1677. // -flax-vector-conversions is default.
  1678. if (!Args.hasFlag(options::OPT_flax_vector_conversions,
  1679. options::OPT_fno_lax_vector_conversions))
  1680. CmdArgs.push_back("-fno-lax-vector-conversions");
  1681. if (Args.getLastArg(options::OPT_fapple_kext))
  1682. CmdArgs.push_back("-fapple-kext");
  1683. Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
  1684. Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
  1685. Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
  1686. Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
  1687. Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
  1688. if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
  1689. CmdArgs.push_back("-ftrapv-handler");
  1690. CmdArgs.push_back(A->getValue(Args));
  1691. }
  1692. Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
  1693. // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
  1694. // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
  1695. if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
  1696. options::OPT_fno_wrapv)) {
  1697. if (A->getOption().matches(options::OPT_fwrapv))
  1698. CmdArgs.push_back("-fwrapv");
  1699. } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
  1700. options::OPT_fno_strict_overflow)) {
  1701. if (A->getOption().matches(options::OPT_fno_strict_overflow))
  1702. CmdArgs.push_back("-fwrapv");
  1703. }
  1704. Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
  1705. Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
  1706. Args.AddLastArg(CmdArgs, options::OPT_pthread);
  1707. // -stack-protector=0 is default.
  1708. unsigned StackProtectorLevel = 0;
  1709. if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
  1710. options::OPT_fstack_protector_all,
  1711. options::OPT_fstack_protector)) {
  1712. if (A->getOption().matches(options::OPT_fstack_protector))
  1713. StackProtectorLevel = 1;
  1714. else if (A->getOption().matches(options::OPT_fstack_protector_all))
  1715. StackProtectorLevel = 2;
  1716. } else {
  1717. StackProtectorLevel =
  1718. getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
  1719. }
  1720. if (StackProtectorLevel) {
  1721. CmdArgs.push_back("-stack-protector");
  1722. CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
  1723. }
  1724. // Translate -mstackrealign
  1725. if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
  1726. false)) {
  1727. CmdArgs.push_back("-backend-option");
  1728. CmdArgs.push_back("-force-align-stack");
  1729. }
  1730. if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
  1731. false)) {
  1732. CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
  1733. }
  1734. if (Args.hasArg(options::OPT_mstack_alignment)) {
  1735. StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
  1736. CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
  1737. }
  1738. // Forward -f options with positive and negative forms; we translate
  1739. // these by hand.
  1740. if (Args.hasArg(options::OPT_mkernel)) {
  1741. if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
  1742. CmdArgs.push_back("-fapple-kext");
  1743. if (!Args.hasArg(options::OPT_fbuiltin))
  1744. CmdArgs.push_back("-fno-builtin");
  1745. }
  1746. // -fbuiltin is default.
  1747. else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
  1748. CmdArgs.push_back("-fno-builtin");
  1749. if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
  1750. options::OPT_fno_assume_sane_operator_new))
  1751. CmdArgs.push_back("-fno-assume-sane-operator-new");
  1752. // -fblocks=0 is default.
  1753. if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
  1754. getToolChain().IsBlocksDefault()) ||
  1755. (Args.hasArg(options::OPT_fgnu_runtime) &&
  1756. Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
  1757. !Args.hasArg(options::OPT_fno_blocks))) {
  1758. CmdArgs.push_back("-fblocks");
  1759. if (!Args.hasArg(options::OPT_fgnu_runtime) &&
  1760. !getToolChain().hasBlocksRuntime())
  1761. CmdArgs.push_back("-fblocks-runtime-optional");
  1762. }
  1763. // -fmodules enables modules (off by default). However, for C++/Objective-C++,
  1764. // users must also pass -fcxx-modules. The latter flag will disappear once the
  1765. // modules implementation is solid for C++/Objective-C++ programs as well.
  1766. if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
  1767. bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
  1768. options::OPT_fno_cxx_modules,
  1769. false);
  1770. if (AllowedInCXX || !types::isCXX(InputType))
  1771. CmdArgs.push_back("-fmodules");
  1772. }
  1773. // -faccess-control is default.
  1774. if (Args.hasFlag(options::OPT_fno_access_control,
  1775. options::OPT_faccess_control,
  1776. false))
  1777. CmdArgs.push_back("-fno-access-control");
  1778. // -felide-constructors is the default.
  1779. if (Args.hasFlag(options::OPT_fno_elide_constructors,
  1780. options::OPT_felide_constructors,
  1781. false))
  1782. CmdArgs.push_back("-fno-elide-constructors");
  1783. // -frtti is default.
  1784. if (KernelOrKext ||
  1785. !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
  1786. CmdArgs.push_back("-fno-rtti");
  1787. // -fshort-enums=0 is default for all architectures except Hexagon.
  1788. if (Args.hasFlag(options::OPT_fshort_enums,
  1789. options::OPT_fno_short_enums,
  1790. getToolChain().getTriple().getArch() ==
  1791. llvm::Triple::hexagon))
  1792. CmdArgs.push_back("-fshort-enums");
  1793. // -fsigned-char is default.
  1794. if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
  1795. isSignedCharDefault(getToolChain().getTriple())))
  1796. CmdArgs.push_back("-fno-signed-char");
  1797. // -fthreadsafe-static is default.
  1798. if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
  1799. options::OPT_fno_threadsafe_statics))
  1800. CmdArgs.push_back("-fno-threadsafe-statics");
  1801. // -fuse-cxa-atexit is default.
  1802. if (KernelOrKext ||
  1803. !Args.hasFlag(options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
  1804. getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
  1805. getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
  1806. getToolChain().getTriple().getArch() !=
  1807. llvm::Triple::hexagon))
  1808. CmdArgs.push_back("-fno-use-cxa-atexit");
  1809. // -fms-extensions=0 is default.
  1810. if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
  1811. getToolChain().getTriple().getOS() == llvm::Triple::Win32))
  1812. CmdArgs.push_back("-fms-extensions");
  1813. // -fms-compatibility=0 is default.
  1814. if (Args.hasFlag(options::OPT_fms_compatibility,
  1815. options::OPT_fno_ms_compatibility,
  1816. (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
  1817. Args.hasFlag(options::OPT_fms_extensions,
  1818. options::OPT_fno_ms_extensions,
  1819. true))))
  1820. CmdArgs.push_back("-fms-compatibility");
  1821. // -fmsc-version=1300 is default.
  1822. if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
  1823. getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
  1824. Args.hasArg(options::OPT_fmsc_version)) {
  1825. StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
  1826. if (msc_ver.empty())
  1827. CmdArgs.push_back("-fmsc-version=1300");
  1828. else
  1829. CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
  1830. }
  1831. // -fborland-extensions=0 is default.
  1832. if (Args.hasFlag(options::OPT_fborland_extensions,
  1833. options::OPT_fno_borland_extensions, false))
  1834. CmdArgs.push_back("-fborland-extensions");
  1835. // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
  1836. // needs it.
  1837. if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
  1838. options::OPT_fno_delayed_template_parsing,
  1839. getToolChain().getTriple().getOS() == llvm::Triple::Win32))
  1840. CmdArgs.push_back("-fdelayed-template-parsing");
  1841. // -fgnu-keywords default varies depending on language; only pass if
  1842. // specified.
  1843. if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
  1844. options::OPT_fno_gnu_keywords))
  1845. A->render(Args, CmdArgs);
  1846. if (Args.hasFlag(options::OPT_fgnu89_inline,
  1847. options::OPT_fno_gnu89_inline,
  1848. false))
  1849. CmdArgs.push_back("-fgnu89-inline");
  1850. // -fobjc-nonfragile-abi=0 is default.
  1851. ObjCRuntime objCRuntime;
  1852. unsigned objcABIVersion = 0;
  1853. bool NeXTRuntimeIsDefault
  1854. = (IsRewriter || getToolChain().getTriple().isOSDarwin());
  1855. if (Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
  1856. NeXTRuntimeIsDefault)) {
  1857. objCRuntime.setKind(ObjCRuntime::NeXT);
  1858. } else {
  1859. CmdArgs.push_back("-fgnu-runtime");
  1860. objCRuntime.setKind(ObjCRuntime::GNU);
  1861. }
  1862. getToolChain().configureObjCRuntime(objCRuntime);
  1863. if (objCRuntime.HasARC)
  1864. CmdArgs.push_back("-fobjc-runtime-has-arc");
  1865. if (objCRuntime.HasWeak)
  1866. CmdArgs.push_back("-fobjc-runtime-has-weak");
  1867. if (objCRuntime.HasTerminate)
  1868. CmdArgs.push_back("-fobjc-runtime-has-terminate");
  1869. // Compute the Objective-C ABI "version" to use. Version numbers are
  1870. // slightly confusing for historical reasons:
  1871. // 1 - Traditional "fragile" ABI
  1872. // 2 - Non-fragile ABI, version 1
  1873. // 3 - Non-fragile ABI, version 2
  1874. objcABIVersion = 1;
  1875. // If -fobjc-abi-version= is present, use that to set the version.
  1876. if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
  1877. if (StringRef(A->getValue(Args)) == "1")
  1878. objcABIVersion = 1;
  1879. else if (StringRef(A->getValue(Args)) == "2")
  1880. objcABIVersion = 2;
  1881. else if (StringRef(A->getValue(Args)) == "3")
  1882. objcABIVersion = 3;
  1883. else
  1884. D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
  1885. } else {
  1886. // Otherwise, determine if we are using the non-fragile ABI.
  1887. bool NonFragileABIIsDefault
  1888. = (!IsRewriter && getToolChain().IsObjCNonFragileABIDefault());
  1889. if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi,
  1890. options::OPT_fno_objc_nonfragile_abi,
  1891. NonFragileABIIsDefault)) {
  1892. // Determine the non-fragile ABI version to use.
  1893. #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
  1894. unsigned NonFragileABIVersion = 1;
  1895. #else
  1896. unsigned NonFragileABIVersion = 2;
  1897. #endif
  1898. if (Arg *A = Args.getLastArg(
  1899. options::OPT_fobjc_nonfragile_abi_version_EQ)) {
  1900. if (StringRef(A->getValue(Args)) == "1")
  1901. NonFragileABIVersion = 1;
  1902. else if (StringRef(A->getValue(Args)) == "2")
  1903. NonFragileABIVersion = 2;
  1904. else
  1905. D.Diag(diag::err_drv_clang_unsupported)
  1906. << A->getAsString(Args);
  1907. }
  1908. objcABIVersion = 1 + NonFragileABIVersion;
  1909. } else {
  1910. objcABIVersion = 1;
  1911. }
  1912. }
  1913. if (objcABIVersion == 1) {
  1914. CmdArgs.push_back("-fobjc-fragile-abi");
  1915. } else {
  1916. // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
  1917. // legacy is the default.
  1918. if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
  1919. options::OPT_fno_objc_legacy_dispatch,
  1920. getToolChain().IsObjCLegacyDispatchDefault())) {
  1921. if (getToolChain().UseObjCMixedDispatch())
  1922. CmdArgs.push_back("-fobjc-dispatch-method=mixed");
  1923. else
  1924. CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
  1925. }
  1926. }
  1927. // -fobjc-default-synthesize-properties=0 is default.
  1928. if (Args.hasFlag(options::OPT_fobjc_default_synthesize_properties,
  1929. options::OPT_fno_objc_default_synthesize_properties,
  1930. getToolChain().IsObjCDefaultSynthPropertiesDefault())) {
  1931. CmdArgs.push_back("-fobjc-default-synthesize-properties");
  1932. }
  1933. // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
  1934. // NOTE: This logic is duplicated in ToolChains.cpp.
  1935. bool ARC = isObjCAutoRefCount(Args);
  1936. if (ARC) {
  1937. CmdArgs.push_back("-fobjc-arc");
  1938. // FIXME: It seems like this entire block, and several around it should be
  1939. // wrapped in isObjC, but for now we just use it here as this is where it
  1940. // was being used previously.
  1941. if (types::isCXX(InputType) && types::isObjC(InputType)) {
  1942. if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
  1943. CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
  1944. else
  1945. CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
  1946. }
  1947. // Allow the user to enable full exceptions code emission.
  1948. // We define off for Objective-CC, on for Objective-C++.
  1949. if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
  1950. options::OPT_fno_objc_arc_exceptions,
  1951. /*default*/ types::isCXX(InputType)))
  1952. CmdArgs.push_back("-fobjc-arc-exceptions");
  1953. }
  1954. // -fobjc-infer-related-result-type is the default, except in the Objective-C
  1955. // rewriter.
  1956. if (IsRewriter)
  1957. CmdArgs.push_back("-fno-objc-infer-related-result-type");
  1958. // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
  1959. // takes precedence.
  1960. const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
  1961. if (!GCArg)
  1962. GCArg = Args.getLastArg(options::OPT_fobjc_gc);
  1963. if (GCArg) {
  1964. if (ARC) {
  1965. D.Diag(diag::err_drv_objc_gc_arr)
  1966. << GCArg->getAsString(Args);
  1967. } else if (getToolChain().SupportsObjCGC()) {
  1968. GCArg->render(Args, CmdArgs);
  1969. } else {
  1970. // FIXME: We should move this to a hard error.
  1971. D.Diag(diag::warn_drv_objc_gc_unsupported)
  1972. << GCArg->getAsString(Args);
  1973. }
  1974. }
  1975. // Add exception args.
  1976. addExceptionArgs(Args, InputType, getToolChain().getTriple(),
  1977. KernelOrKext, IsRewriter, objcABIVersion, CmdArgs);
  1978. if (getToolChain().UseSjLjExceptions())
  1979. CmdArgs.push_back("-fsjlj-exceptions");
  1980. // C++ "sane" operator new.
  1981. if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
  1982. options::OPT_fno_assume_sane_operator_new))
  1983. CmdArgs.push_back("-fno-assume-sane-operator-new");
  1984. // -fconstant-cfstrings is default, and may be subject to argument translation
  1985. // on Darwin.
  1986. if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
  1987. options::OPT_fno_constant_cfstrings) ||
  1988. !Args.hasFlag(options::OPT_mconstant_cfstrings,
  1989. options::OPT_mno_constant_cfstrings))
  1990. CmdArgs.push_back("-fno-constant-cfstrings");
  1991. // -fshort-wchar default varies depending on platform; only
  1992. // pass if specified.
  1993. if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
  1994. A->render(Args, CmdArgs);
  1995. // -fno-pascal-strings is default, only pass non-default. If the tool chain
  1996. // happened to translate to -mpascal-strings, we want to back translate here.
  1997. //
  1998. // FIXME: This is gross; that translation should be pulled from the
  1999. // tool chain.
  2000. if (Args.hasFlag(options::OPT_fpascal_strings,
  2001. options::OPT_fno_pascal_strings,
  2002. false) ||
  2003. Args.hasFlag(options::OPT_mpascal_strings,
  2004. options::OPT_mno_pascal_strings,
  2005. false))
  2006. CmdArgs.push_back("-fpascal-strings");
  2007. // Honor -fpack-struct= and -fpack-struct, if given. Note that
  2008. // -fno-pack-struct doesn't apply to -fpack-struct=.
  2009. if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
  2010. CmdArgs.push_back("-fpack-struct");
  2011. CmdArgs.push_back(A->getValue(Args));
  2012. } else if (Args.hasFlag(options::OPT_fpack_struct,
  2013. options::OPT_fno_pack_struct, false)) {
  2014. CmdArgs.push_back("-fpack-struct");
  2015. CmdArgs.push_back("1");
  2016. }
  2017. if (Args.hasArg(options::OPT_mkernel) ||
  2018. Args.hasArg(options::OPT_fapple_kext)) {
  2019. if (!Args.hasArg(options::OPT_fcommon))
  2020. CmdArgs.push_back("-fno-common");
  2021. }
  2022. // -fcommon is default, only pass non-default.
  2023. else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
  2024. CmdArgs.push_back("-fno-common");
  2025. // -fsigned-bitfields is default, and clang doesn't yet support
  2026. // -funsigned-bitfields.
  2027. if (!Args.hasFlag(options::OPT_fsigned_bitfields,
  2028. options::OPT_funsigned_bitfields))
  2029. D.Diag(diag::warn_drv_clang_unsupported)
  2030. << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
  2031. // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
  2032. if (!Args.hasFlag(options::OPT_ffor_scope,
  2033. options::OPT_fno_for_scope))
  2034. D.Diag(diag::err_drv_clang_unsupported)
  2035. << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
  2036. // -fcaret-diagnostics is default.
  2037. if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
  2038. options::OPT_fno_caret_diagnostics, true))
  2039. CmdArgs.push_back("-fno-caret-diagnostics");
  2040. // -fdiagnostics-fixit-info is default, only pass non-default.
  2041. if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
  2042. options::OPT_fno_diagnostics_fixit_info))
  2043. CmdArgs.push_back("-fno-diagnostics-fixit-info");
  2044. // Enable -fdiagnostics-show-name by default.
  2045. if (Args.hasFlag(options::OPT_fdiagnostics_show_name,
  2046. options::OPT_fno_diagnostics_show_name, false))
  2047. CmdArgs.push_back("-fdiagnostics-show-name");
  2048. // Enable -fdiagnostics-show-option by default.
  2049. if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
  2050. options::OPT_fno_diagnostics_show_option))
  2051. CmdArgs.push_back("-fdiagnostics-show-option");
  2052. if (const Arg *A =
  2053. Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
  2054. CmdArgs.push_back("-fdiagnostics-show-category");
  2055. CmdArgs.push_back(A->getValue(Args));
  2056. }
  2057. if (const Arg *A =
  2058. Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
  2059. CmdArgs.push_back("-fdiagnostics-format");
  2060. CmdArgs.push_back(A->getValue(Args));
  2061. }
  2062. if (Arg *A = Args.getLastArg(
  2063. options::OPT_fdiagnostics_show_note_include_stack,
  2064. options::OPT_fno_diagnostics_show_note_include_stack)) {
  2065. if (A->getOption().matches(
  2066. options::OPT_fdiagnostics_show_note_include_stack))
  2067. CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
  2068. else
  2069. CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
  2070. }
  2071. // Color diagnostics are the default, unless the terminal doesn't support
  2072. // them.
  2073. if (Args.hasFlag(options::OPT_fcolor_diagnostics,
  2074. options::OPT_fno_color_diagnostics,
  2075. llvm::sys::Process::StandardErrHasColors()))
  2076. CmdArgs.push_back("-fcolor-diagnostics");
  2077. if (!Args.hasFlag(options::OPT_fshow_source_location,
  2078. options::OPT_fno_show_source_location))
  2079. CmdArgs.push_back("-fno-show-source-location");
  2080. if (!Args.hasFlag(options::OPT_fshow_column,
  2081. options::OPT_fno_show_column,
  2082. true))
  2083. CmdArgs.push_back("-fno-show-column");
  2084. if (!Args.hasFlag(options::OPT_fspell_checking,
  2085. options::OPT_fno_spell_checking))
  2086. CmdArgs.push_back("-fno-spell-checking");
  2087. // Silently ignore -fasm-blocks for now.
  2088. (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
  2089. false);
  2090. if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
  2091. A->render(Args, CmdArgs);
  2092. // -fdollars-in-identifiers default varies depending on platform and
  2093. // language; only pass if specified.
  2094. if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
  2095. options::OPT_fno_dollars_in_identifiers)) {
  2096. if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
  2097. CmdArgs.push_back("-fdollars-in-identifiers");
  2098. else
  2099. CmdArgs.push_back("-fno-dollars-in-identifiers");
  2100. }
  2101. // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
  2102. // practical purposes.
  2103. if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
  2104. options::OPT_fno_unit_at_a_time)) {
  2105. if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
  2106. D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
  2107. }
  2108. if (Args.hasFlag(options::OPT_fapple_pragma_pack,
  2109. options::OPT_fno_apple_pragma_pack, false))
  2110. CmdArgs.push_back("-fapple-pragma-pack");
  2111. // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
  2112. //
  2113. // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
  2114. #if 0
  2115. if (getToolChain().getTriple().isOSDarwin() &&
  2116. (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
  2117. getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
  2118. if (!Args.hasArg(options::OPT_fbuiltin_strcat))
  2119. CmdArgs.push_back("-fno-builtin-strcat");
  2120. if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
  2121. CmdArgs.push_back("-fno-builtin-strcpy");
  2122. }
  2123. #endif
  2124. // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
  2125. if (Arg *A = Args.getLastArg(options::OPT_traditional,
  2126. options::OPT_traditional_cpp)) {
  2127. if (isa<PreprocessJobAction>(JA))
  2128. CmdArgs.push_back("-traditional-cpp");
  2129. else
  2130. D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
  2131. }
  2132. Args.AddLastArg(CmdArgs, options::OPT_dM);
  2133. Args.AddLastArg(CmdArgs, options::OPT_dD);
  2134. // Handle serialized diagnostics.
  2135. if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
  2136. CmdArgs.push_back("-serialize-diagnostic-file");
  2137. CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
  2138. }
  2139. // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
  2140. // parser.
  2141. Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
  2142. for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
  2143. ie = Args.filtered_end(); it != ie; ++it) {
  2144. (*it)->claim();
  2145. // We translate this by hand to the -cc1 argument, since nightly test uses
  2146. // it and developers have been trained to spell it with -mllvm.
  2147. if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
  2148. CmdArgs.push_back("-disable-llvm-optzns");
  2149. else
  2150. (*it)->render(Args, CmdArgs);
  2151. }
  2152. if (Output.getType() == types::TY_Dependencies) {
  2153. // Handled with other dependency code.
  2154. } else if (Output.isFilename()) {
  2155. CmdArgs.push_back("-o");
  2156. CmdArgs.push_back(Output.getFilename());
  2157. } else {
  2158. assert(Output.isNothing() && "Invalid output.");
  2159. }
  2160. for (InputInfoList::const_iterator
  2161. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  2162. const InputInfo &II = *it;
  2163. CmdArgs.push_back("-x");
  2164. CmdArgs.push_back(types::getTypeName(II.getType()));
  2165. if (II.isFilename())
  2166. CmdArgs.push_back(II.getFilename());
  2167. else
  2168. II.getInputArg().renderAsInput(Args, CmdArgs);
  2169. }
  2170. Args.AddAllArgs(CmdArgs, options::OPT_undef);
  2171. const char *Exec = getToolChain().getDriver().getClangProgramPath();
  2172. // Optionally embed the -cc1 level arguments into the debug info, for build
  2173. // analysis.
  2174. if (getToolChain().UseDwarfDebugFlags()) {
  2175. ArgStringList OriginalArgs;
  2176. for (ArgList::const_iterator it = Args.begin(),
  2177. ie = Args.end(); it != ie; ++it)
  2178. (*it)->render(Args, OriginalArgs);
  2179. SmallString<256> Flags;
  2180. Flags += Exec;
  2181. for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
  2182. Flags += " ";
  2183. Flags += OriginalArgs[i];
  2184. }
  2185. CmdArgs.push_back("-dwarf-debug-flags");
  2186. CmdArgs.push_back(Args.MakeArgString(Flags.str()));
  2187. }
  2188. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2189. if (Arg *A = Args.getLastArg(options::OPT_pg))
  2190. if (Args.hasArg(options::OPT_fomit_frame_pointer))
  2191. D.Diag(diag::err_drv_argument_not_allowed_with)
  2192. << "-fomit-frame-pointer" << A->getAsString(Args);
  2193. // Claim some arguments which clang supports automatically.
  2194. // -fpch-preprocess is used with gcc to add a special marker in the output to
  2195. // include the PCH file. Clang's PTH solution is completely transparent, so we
  2196. // do not need to deal with it at all.
  2197. Args.ClaimAllArgs(options::OPT_fpch_preprocess);
  2198. // Claim some arguments which clang doesn't support, but we don't
  2199. // care to warn the user about.
  2200. Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
  2201. Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
  2202. // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
  2203. Args.ClaimAllArgs(options::OPT_use_gold_plugin);
  2204. Args.ClaimAllArgs(options::OPT_emit_llvm);
  2205. }
  2206. void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
  2207. const InputInfo &Output,
  2208. const InputInfoList &Inputs,
  2209. const ArgList &Args,
  2210. const char *LinkingOutput) const {
  2211. ArgStringList CmdArgs;
  2212. assert(Inputs.size() == 1 && "Unexpected number of inputs.");
  2213. const InputInfo &Input = Inputs[0];
  2214. // Don't warn about "clang -w -c foo.s"
  2215. Args.ClaimAllArgs(options::OPT_w);
  2216. // and "clang -emit-llvm -c foo.s"
  2217. Args.ClaimAllArgs(options::OPT_emit_llvm);
  2218. // and "clang -use-gold-plugin -c foo.s"
  2219. Args.ClaimAllArgs(options::OPT_use_gold_plugin);
  2220. // Invoke ourselves in -cc1as mode.
  2221. //
  2222. // FIXME: Implement custom jobs for internal actions.
  2223. CmdArgs.push_back("-cc1as");
  2224. // Add the "effective" target triple.
  2225. CmdArgs.push_back("-triple");
  2226. std::string TripleStr =
  2227. getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
  2228. CmdArgs.push_back(Args.MakeArgString(TripleStr));
  2229. // Set the output mode, we currently only expect to be used as a real
  2230. // assembler.
  2231. CmdArgs.push_back("-filetype");
  2232. CmdArgs.push_back("obj");
  2233. if (UseRelaxAll(C, Args))
  2234. CmdArgs.push_back("-relax-all");
  2235. // Ignore explicit -force_cpusubtype_ALL option.
  2236. (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
  2237. // Determine the original source input.
  2238. const Action *SourceAction = &JA;
  2239. while (SourceAction->getKind() != Action::InputClass) {
  2240. assert(!SourceAction->getInputs().empty() && "unexpected root action!");
  2241. SourceAction = SourceAction->getInputs()[0];
  2242. }
  2243. // Forward -g, assuming we are dealing with an actual assembly file.
  2244. if (SourceAction->getType() == types::TY_Asm ||
  2245. SourceAction->getType() == types::TY_PP_Asm) {
  2246. Args.ClaimAllArgs(options::OPT_g_Group);
  2247. if (Arg *A = Args.getLastArg(options::OPT_g_Group))
  2248. if (!A->getOption().matches(options::OPT_g0))
  2249. CmdArgs.push_back("-g");
  2250. }
  2251. // Optionally embed the -cc1as level arguments into the debug info, for build
  2252. // analysis.
  2253. if (getToolChain().UseDwarfDebugFlags()) {
  2254. ArgStringList OriginalArgs;
  2255. for (ArgList::const_iterator it = Args.begin(),
  2256. ie = Args.end(); it != ie; ++it)
  2257. (*it)->render(Args, OriginalArgs);
  2258. SmallString<256> Flags;
  2259. const char *Exec = getToolChain().getDriver().getClangProgramPath();
  2260. Flags += Exec;
  2261. for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
  2262. Flags += " ";
  2263. Flags += OriginalArgs[i];
  2264. }
  2265. CmdArgs.push_back("-dwarf-debug-flags");
  2266. CmdArgs.push_back(Args.MakeArgString(Flags.str()));
  2267. }
  2268. // FIXME: Add -static support, once we have it.
  2269. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  2270. options::OPT_Xassembler);
  2271. Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
  2272. assert(Output.isFilename() && "Unexpected lipo output.");
  2273. CmdArgs.push_back("-o");
  2274. CmdArgs.push_back(Output.getFilename());
  2275. assert(Input.isFilename() && "Invalid input.");
  2276. CmdArgs.push_back(Input.getFilename());
  2277. const char *Exec = getToolChain().getDriver().getClangProgramPath();
  2278. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2279. }
  2280. void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
  2281. const InputInfo &Output,
  2282. const InputInfoList &Inputs,
  2283. const ArgList &Args,
  2284. const char *LinkingOutput) const {
  2285. const Driver &D = getToolChain().getDriver();
  2286. ArgStringList CmdArgs;
  2287. for (ArgList::const_iterator
  2288. it = Args.begin(), ie = Args.end(); it != ie; ++it) {
  2289. Arg *A = *it;
  2290. if (A->getOption().hasForwardToGCC()) {
  2291. // Don't forward any -g arguments to assembly steps.
  2292. if (isa<AssembleJobAction>(JA) &&
  2293. A->getOption().matches(options::OPT_g_Group))
  2294. continue;
  2295. // It is unfortunate that we have to claim here, as this means
  2296. // we will basically never report anything interesting for
  2297. // platforms using a generic gcc, even if we are just using gcc
  2298. // to get to the assembler.
  2299. A->claim();
  2300. A->render(Args, CmdArgs);
  2301. }
  2302. }
  2303. RenderExtraToolArgs(JA, CmdArgs);
  2304. // If using a driver driver, force the arch.
  2305. const std::string &Arch = getToolChain().getArchName();
  2306. if (getToolChain().getTriple().isOSDarwin()) {
  2307. CmdArgs.push_back("-arch");
  2308. // FIXME: Remove these special cases.
  2309. if (Arch == "powerpc")
  2310. CmdArgs.push_back("ppc");
  2311. else if (Arch == "powerpc64")
  2312. CmdArgs.push_back("ppc64");
  2313. else
  2314. CmdArgs.push_back(Args.MakeArgString(Arch));
  2315. }
  2316. // Try to force gcc to match the tool chain we want, if we recognize
  2317. // the arch.
  2318. //
  2319. // FIXME: The triple class should directly provide the information we want
  2320. // here.
  2321. if (Arch == "i386" || Arch == "powerpc")
  2322. CmdArgs.push_back("-m32");
  2323. else if (Arch == "x86_64" || Arch == "powerpc64")
  2324. CmdArgs.push_back("-m64");
  2325. if (Output.isFilename()) {
  2326. CmdArgs.push_back("-o");
  2327. CmdArgs.push_back(Output.getFilename());
  2328. } else {
  2329. assert(Output.isNothing() && "Unexpected output");
  2330. CmdArgs.push_back("-fsyntax-only");
  2331. }
  2332. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  2333. options::OPT_Xassembler);
  2334. // Only pass -x if gcc will understand it; otherwise hope gcc
  2335. // understands the suffix correctly. The main use case this would go
  2336. // wrong in is for linker inputs if they happened to have an odd
  2337. // suffix; really the only way to get this to happen is a command
  2338. // like '-x foobar a.c' which will treat a.c like a linker input.
  2339. //
  2340. // FIXME: For the linker case specifically, can we safely convert
  2341. // inputs into '-Wl,' options?
  2342. for (InputInfoList::const_iterator
  2343. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  2344. const InputInfo &II = *it;
  2345. // Don't try to pass LLVM or AST inputs to a generic gcc.
  2346. if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
  2347. II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
  2348. D.Diag(diag::err_drv_no_linker_llvm_support)
  2349. << getToolChain().getTripleString();
  2350. else if (II.getType() == types::TY_AST)
  2351. D.Diag(diag::err_drv_no_ast_support)
  2352. << getToolChain().getTripleString();
  2353. if (types::canTypeBeUserSpecified(II.getType())) {
  2354. CmdArgs.push_back("-x");
  2355. CmdArgs.push_back(types::getTypeName(II.getType()));
  2356. }
  2357. if (II.isFilename())
  2358. CmdArgs.push_back(II.getFilename());
  2359. else {
  2360. const Arg &A = II.getInputArg();
  2361. // Reverse translate some rewritten options.
  2362. if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
  2363. CmdArgs.push_back("-lstdc++");
  2364. continue;
  2365. }
  2366. // Don't render as input, we need gcc to do the translations.
  2367. A.render(Args, CmdArgs);
  2368. }
  2369. }
  2370. const std::string customGCCName = D.getCCCGenericGCCName();
  2371. const char *GCCName;
  2372. if (!customGCCName.empty())
  2373. GCCName = customGCCName.c_str();
  2374. else if (D.CCCIsCXX) {
  2375. GCCName = "g++";
  2376. } else
  2377. GCCName = "gcc";
  2378. const char *Exec =
  2379. Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
  2380. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2381. }
  2382. void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
  2383. ArgStringList &CmdArgs) const {
  2384. CmdArgs.push_back("-E");
  2385. }
  2386. void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
  2387. ArgStringList &CmdArgs) const {
  2388. // The type is good enough.
  2389. }
  2390. void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
  2391. ArgStringList &CmdArgs) const {
  2392. const Driver &D = getToolChain().getDriver();
  2393. // If -flto, etc. are present then make sure not to force assembly output.
  2394. if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
  2395. JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
  2396. CmdArgs.push_back("-c");
  2397. else {
  2398. if (JA.getType() != types::TY_PP_Asm)
  2399. D.Diag(diag::err_drv_invalid_gcc_output_type)
  2400. << getTypeName(JA.getType());
  2401. CmdArgs.push_back("-S");
  2402. }
  2403. }
  2404. void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
  2405. ArgStringList &CmdArgs) const {
  2406. CmdArgs.push_back("-c");
  2407. }
  2408. void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
  2409. ArgStringList &CmdArgs) const {
  2410. // The types are (hopefully) good enough.
  2411. }
  2412. // Hexagon tools start.
  2413. void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
  2414. ArgStringList &CmdArgs) const {
  2415. }
  2416. void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  2417. const InputInfo &Output,
  2418. const InputInfoList &Inputs,
  2419. const ArgList &Args,
  2420. const char *LinkingOutput) const {
  2421. const Driver &D = getToolChain().getDriver();
  2422. ArgStringList CmdArgs;
  2423. std::string MarchString = "-march=";
  2424. MarchString += getHexagonTargetCPU(Args);
  2425. CmdArgs.push_back(Args.MakeArgString(MarchString));
  2426. RenderExtraToolArgs(JA, CmdArgs);
  2427. if (Output.isFilename()) {
  2428. CmdArgs.push_back("-o");
  2429. CmdArgs.push_back(Output.getFilename());
  2430. } else {
  2431. assert(Output.isNothing() && "Unexpected output");
  2432. CmdArgs.push_back("-fsyntax-only");
  2433. }
  2434. // Only pass -x if gcc will understand it; otherwise hope gcc
  2435. // understands the suffix correctly. The main use case this would go
  2436. // wrong in is for linker inputs if they happened to have an odd
  2437. // suffix; really the only way to get this to happen is a command
  2438. // like '-x foobar a.c' which will treat a.c like a linker input.
  2439. //
  2440. // FIXME: For the linker case specifically, can we safely convert
  2441. // inputs into '-Wl,' options?
  2442. for (InputInfoList::const_iterator
  2443. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  2444. const InputInfo &II = *it;
  2445. // Don't try to pass LLVM or AST inputs to a generic gcc.
  2446. if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
  2447. II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
  2448. D.Diag(clang::diag::err_drv_no_linker_llvm_support)
  2449. << getToolChain().getTripleString();
  2450. else if (II.getType() == types::TY_AST)
  2451. D.Diag(clang::diag::err_drv_no_ast_support)
  2452. << getToolChain().getTripleString();
  2453. if (II.isFilename())
  2454. CmdArgs.push_back(II.getFilename());
  2455. else
  2456. // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
  2457. II.getInputArg().render(Args, CmdArgs);
  2458. }
  2459. const char *GCCName = "hexagon-as";
  2460. const char *Exec =
  2461. Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
  2462. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2463. }
  2464. void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
  2465. ArgStringList &CmdArgs) const {
  2466. // The types are (hopefully) good enough.
  2467. }
  2468. void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
  2469. const InputInfo &Output,
  2470. const InputInfoList &Inputs,
  2471. const ArgList &Args,
  2472. const char *LinkingOutput) const {
  2473. const Driver &D = getToolChain().getDriver();
  2474. ArgStringList CmdArgs;
  2475. for (ArgList::const_iterator
  2476. it = Args.begin(), ie = Args.end(); it != ie; ++it) {
  2477. Arg *A = *it;
  2478. if (A->getOption().hasForwardToGCC()) {
  2479. // Don't forward any -g arguments to assembly steps.
  2480. if (isa<AssembleJobAction>(JA) &&
  2481. A->getOption().matches(options::OPT_g_Group))
  2482. continue;
  2483. // It is unfortunate that we have to claim here, as this means
  2484. // we will basically never report anything interesting for
  2485. // platforms using a generic gcc, even if we are just using gcc
  2486. // to get to the assembler.
  2487. A->claim();
  2488. A->render(Args, CmdArgs);
  2489. }
  2490. }
  2491. RenderExtraToolArgs(JA, CmdArgs);
  2492. // Add Arch Information
  2493. Arg *A;
  2494. if ((A = getLastHexagonArchArg(Args))) {
  2495. if (A->getOption().matches(options::OPT_m_Joined))
  2496. A->render(Args, CmdArgs);
  2497. else
  2498. CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
  2499. }
  2500. else {
  2501. CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
  2502. }
  2503. CmdArgs.push_back("-mqdsp6-compat");
  2504. const char *GCCName;
  2505. if (C.getDriver().CCCIsCXX)
  2506. GCCName = "hexagon-g++";
  2507. else
  2508. GCCName = "hexagon-gcc";
  2509. const char *Exec =
  2510. Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
  2511. if (Output.isFilename()) {
  2512. CmdArgs.push_back("-o");
  2513. CmdArgs.push_back(Output.getFilename());
  2514. }
  2515. for (InputInfoList::const_iterator
  2516. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  2517. const InputInfo &II = *it;
  2518. // Don't try to pass LLVM or AST inputs to a generic gcc.
  2519. if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
  2520. II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
  2521. D.Diag(clang::diag::err_drv_no_linker_llvm_support)
  2522. << getToolChain().getTripleString();
  2523. else if (II.getType() == types::TY_AST)
  2524. D.Diag(clang::diag::err_drv_no_ast_support)
  2525. << getToolChain().getTripleString();
  2526. if (II.isFilename())
  2527. CmdArgs.push_back(II.getFilename());
  2528. else
  2529. // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
  2530. II.getInputArg().render(Args, CmdArgs);
  2531. }
  2532. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2533. }
  2534. // Hexagon tools end.
  2535. const char *darwin::CC1::getCC1Name(types::ID Type) const {
  2536. switch (Type) {
  2537. default:
  2538. llvm_unreachable("Unexpected type for Darwin CC1 tool.");
  2539. case types::TY_Asm:
  2540. case types::TY_C: case types::TY_CHeader:
  2541. case types::TY_PP_C: case types::TY_PP_CHeader:
  2542. return "cc1";
  2543. case types::TY_ObjC: case types::TY_ObjCHeader:
  2544. case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
  2545. case types::TY_PP_ObjCHeader:
  2546. return "cc1obj";
  2547. case types::TY_CXX: case types::TY_CXXHeader:
  2548. case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
  2549. return "cc1plus";
  2550. case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
  2551. case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
  2552. case types::TY_PP_ObjCXXHeader:
  2553. return "cc1objplus";
  2554. }
  2555. }
  2556. void darwin::CC1::anchor() {}
  2557. const char *darwin::CC1::getBaseInputName(const ArgList &Args,
  2558. const InputInfoList &Inputs) {
  2559. return Args.MakeArgString(
  2560. llvm::sys::path::filename(Inputs[0].getBaseInput()));
  2561. }
  2562. const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
  2563. const InputInfoList &Inputs) {
  2564. const char *Str = getBaseInputName(Args, Inputs);
  2565. if (const char *End = strrchr(Str, '.'))
  2566. return Args.MakeArgString(std::string(Str, End));
  2567. return Str;
  2568. }
  2569. const char *
  2570. darwin::CC1::getDependencyFileName(const ArgList &Args,
  2571. const InputInfoList &Inputs) {
  2572. // FIXME: Think about this more.
  2573. std::string Res;
  2574. if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
  2575. std::string Str(OutputOpt->getValue(Args));
  2576. Res = Str.substr(0, Str.rfind('.'));
  2577. } else {
  2578. Res = darwin::CC1::getBaseInputStem(Args, Inputs);
  2579. }
  2580. return Args.MakeArgString(Res + ".d");
  2581. }
  2582. void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
  2583. for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
  2584. it != ie;) {
  2585. StringRef Option = *it;
  2586. bool RemoveOption = false;
  2587. // Remove -faltivec
  2588. if (Option.equals("-faltivec")) {
  2589. it = CmdArgs.erase(it);
  2590. ie = CmdArgs.end();
  2591. continue;
  2592. }
  2593. // Handle machine specific options.
  2594. if (Option.startswith("-m")) {
  2595. RemoveOption = llvm::StringSwitch<bool>(Option)
  2596. .Case("-mthumb", true)
  2597. .Case("-mno-thumb", true)
  2598. .Case("-mno-fused-madd", true)
  2599. .Case("-mlong-branch", true)
  2600. .Case("-mlongcall", true)
  2601. .Case("-mcpu=G4", true)
  2602. .Case("-mcpu=G5", true)
  2603. .Default(false);
  2604. }
  2605. // Handle warning options.
  2606. if (Option.startswith("-W")) {
  2607. // Remove -W/-Wno- to reduce the number of cases.
  2608. if (Option.startswith("-Wno-"))
  2609. Option = Option.substr(5);
  2610. else
  2611. Option = Option.substr(2);
  2612. RemoveOption = llvm::StringSwitch<bool>(Option)
  2613. .Case("address-of-temporary", true)
  2614. .Case("ambiguous-member-template", true)
  2615. .Case("analyzer-incompatible-plugin", true)
  2616. .Case("array-bounds", true)
  2617. .Case("array-bounds-pointer-arithmetic", true)
  2618. .Case("bind-to-temporary-copy", true)
  2619. .Case("bitwise-op-parentheses", true)
  2620. .Case("bool-conversions", true)
  2621. .Case("builtin-macro-redefined", true)
  2622. .Case("c++-hex-floats", true)
  2623. .Case("c++0x-compat", true)
  2624. .Case("c++0x-extensions", true)
  2625. .Case("c++0x-narrowing", true)
  2626. .Case("c++11-compat", true)
  2627. .Case("c++11-extensions", true)
  2628. .Case("c++11-narrowing", true)
  2629. .Case("conditional-uninitialized", true)
  2630. .Case("constant-conversion", true)
  2631. .Case("CFString-literal", true)
  2632. .Case("constant-logical-operand", true)
  2633. .Case("custom-atomic-properties", true)
  2634. .Case("default-arg-special-member", true)
  2635. .Case("delegating-ctor-cycles", true)
  2636. .Case("delete-non-virtual-dtor", true)
  2637. .Case("deprecated-implementations", true)
  2638. .Case("deprecated-writable-strings", true)
  2639. .Case("distributed-object-modifiers", true)
  2640. .Case("duplicate-method-arg", true)
  2641. .Case("dynamic-class-memaccess", true)
  2642. .Case("enum-compare", true)
  2643. .Case("exit-time-destructors", true)
  2644. .Case("gnu", true)
  2645. .Case("gnu-designator", true)
  2646. .Case("header-hygiene", true)
  2647. .Case("idiomatic-parentheses", true)
  2648. .Case("ignored-qualifiers", true)
  2649. .Case("implicit-atomic-properties", true)
  2650. .Case("incompatible-pointer-types", true)
  2651. .Case("incomplete-implementation", true)
  2652. .Case("initializer-overrides", true)
  2653. .Case("invalid-noreturn", true)
  2654. .Case("invalid-token-paste", true)
  2655. .Case("language-extension-token", true)
  2656. .Case("literal-conversion", true)
  2657. .Case("literal-range", true)
  2658. .Case("local-type-template-args", true)
  2659. .Case("logical-op-parentheses", true)
  2660. .Case("method-signatures", true)
  2661. .Case("microsoft", true)
  2662. .Case("mismatched-tags", true)
  2663. .Case("missing-method-return-type", true)
  2664. .Case("non-pod-varargs", true)
  2665. .Case("nonfragile-abi2", true)
  2666. .Case("null-arithmetic", true)
  2667. .Case("null-dereference", true)
  2668. .Case("out-of-line-declaration", true)
  2669. .Case("overriding-method-mismatch", true)
  2670. .Case("readonly-setter-attrs", true)
  2671. .Case("return-stack-address", true)
  2672. .Case("self-assign", true)
  2673. .Case("semicolon-before-method-body", true)
  2674. .Case("sentinel", true)
  2675. .Case("shift-overflow", true)
  2676. .Case("shift-sign-overflow", true)
  2677. .Case("sign-conversion", true)
  2678. .Case("sizeof-array-argument", true)
  2679. .Case("sizeof-pointer-memaccess", true)
  2680. .Case("string-compare", true)
  2681. .Case("super-class-method-mismatch", true)
  2682. .Case("tautological-compare", true)
  2683. .Case("typedef-redefinition", true)
  2684. .Case("typename-missing", true)
  2685. .Case("undefined-reinterpret-cast", true)
  2686. .Case("unknown-warning-option", true)
  2687. .Case("unnamed-type-template-args", true)
  2688. .Case("unneeded-internal-declaration", true)
  2689. .Case("unneeded-member-function", true)
  2690. .Case("unused-comparison", true)
  2691. .Case("unused-exception-parameter", true)
  2692. .Case("unused-member-function", true)
  2693. .Case("unused-result", true)
  2694. .Case("vector-conversions", true)
  2695. .Case("vla", true)
  2696. .Case("used-but-marked-unused", true)
  2697. .Case("weak-vtables", true)
  2698. .Default(false);
  2699. } // if (Option.startswith("-W"))
  2700. if (RemoveOption) {
  2701. it = CmdArgs.erase(it);
  2702. ie = CmdArgs.end();
  2703. } else {
  2704. ++it;
  2705. }
  2706. }
  2707. }
  2708. void darwin::CC1::AddCC1Args(const ArgList &Args,
  2709. ArgStringList &CmdArgs) const {
  2710. const Driver &D = getToolChain().getDriver();
  2711. CheckCodeGenerationOptions(D, Args);
  2712. // Derived from cc1 spec.
  2713. if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
  2714. !Args.hasArg(options::OPT_mdynamic_no_pic))
  2715. CmdArgs.push_back("-fPIC");
  2716. if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
  2717. getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
  2718. if (!Args.hasArg(options::OPT_fbuiltin_strcat))
  2719. CmdArgs.push_back("-fno-builtin-strcat");
  2720. if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
  2721. CmdArgs.push_back("-fno-builtin-strcpy");
  2722. }
  2723. if (Args.hasArg(options::OPT_g_Flag) &&
  2724. !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
  2725. CmdArgs.push_back("-feliminate-unused-debug-symbols");
  2726. }
  2727. void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
  2728. const InputInfoList &Inputs,
  2729. const ArgStringList &OutputArgs) const {
  2730. const Driver &D = getToolChain().getDriver();
  2731. // Derived from cc1_options spec.
  2732. if (Args.hasArg(options::OPT_fast) ||
  2733. Args.hasArg(options::OPT_fastf) ||
  2734. Args.hasArg(options::OPT_fastcp))
  2735. CmdArgs.push_back("-O3");
  2736. if (Arg *A = Args.getLastArg(options::OPT_pg))
  2737. if (Args.hasArg(options::OPT_fomit_frame_pointer))
  2738. D.Diag(diag::err_drv_argument_not_allowed_with)
  2739. << A->getAsString(Args) << "-fomit-frame-pointer";
  2740. AddCC1Args(Args, CmdArgs);
  2741. if (!Args.hasArg(options::OPT_Q))
  2742. CmdArgs.push_back("-quiet");
  2743. CmdArgs.push_back("-dumpbase");
  2744. CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
  2745. Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
  2746. Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
  2747. Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
  2748. // FIXME: The goal is to use the user provided -o if that is our
  2749. // final output, otherwise to drive from the original input
  2750. // name. Find a clean way to go about this.
  2751. if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
  2752. Args.hasArg(options::OPT_o)) {
  2753. Arg *OutputOpt = Args.getLastArg(options::OPT_o);
  2754. CmdArgs.push_back("-auxbase-strip");
  2755. CmdArgs.push_back(OutputOpt->getValue(Args));
  2756. } else {
  2757. CmdArgs.push_back("-auxbase");
  2758. CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
  2759. }
  2760. Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
  2761. Args.AddAllArgs(CmdArgs, options::OPT_O);
  2762. // FIXME: -Wall is getting some special treatment. Investigate.
  2763. Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
  2764. Args.AddLastArg(CmdArgs, options::OPT_w);
  2765. Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
  2766. options::OPT_trigraphs);
  2767. if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
  2768. // Honor -std-default.
  2769. Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
  2770. "-std=", /*Joined=*/true);
  2771. }
  2772. if (Args.hasArg(options::OPT_v))
  2773. CmdArgs.push_back("-version");
  2774. if (Args.hasArg(options::OPT_pg) &&
  2775. getToolChain().SupportsProfiling())
  2776. CmdArgs.push_back("-p");
  2777. Args.AddLastArg(CmdArgs, options::OPT_p);
  2778. // The driver treats -fsyntax-only specially.
  2779. if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
  2780. getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
  2781. // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
  2782. // used to inhibit the default -fno-builtin-str{cat,cpy}.
  2783. //
  2784. // FIXME: Should we grow a better way to deal with "removing" args?
  2785. for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
  2786. options::OPT_fsyntax_only),
  2787. ie = Args.filtered_end(); it != ie; ++it) {
  2788. if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
  2789. !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
  2790. (*it)->claim();
  2791. (*it)->render(Args, CmdArgs);
  2792. }
  2793. }
  2794. } else
  2795. Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
  2796. // Claim Clang only -f options, they aren't worth warning about.
  2797. Args.ClaimAllArgs(options::OPT_f_clang_Group);
  2798. Args.AddAllArgs(CmdArgs, options::OPT_undef);
  2799. if (Args.hasArg(options::OPT_Qn))
  2800. CmdArgs.push_back("-fno-ident");
  2801. // FIXME: This isn't correct.
  2802. //Args.AddLastArg(CmdArgs, options::OPT__help)
  2803. //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
  2804. CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
  2805. // FIXME: Still don't get what is happening here. Investigate.
  2806. Args.AddAllArgs(CmdArgs, options::OPT__param);
  2807. if (Args.hasArg(options::OPT_fmudflap) ||
  2808. Args.hasArg(options::OPT_fmudflapth)) {
  2809. CmdArgs.push_back("-fno-builtin");
  2810. CmdArgs.push_back("-fno-merge-constants");
  2811. }
  2812. if (Args.hasArg(options::OPT_coverage)) {
  2813. CmdArgs.push_back("-fprofile-arcs");
  2814. CmdArgs.push_back("-ftest-coverage");
  2815. }
  2816. if (types::isCXX(Inputs[0].getType()))
  2817. CmdArgs.push_back("-D__private_extern__=extern");
  2818. }
  2819. void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
  2820. const InputInfoList &Inputs,
  2821. const ArgStringList &OutputArgs) const {
  2822. // Derived from cpp_options
  2823. AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
  2824. CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
  2825. AddCC1Args(Args, CmdArgs);
  2826. // NOTE: The code below has some commonality with cpp_options, but
  2827. // in classic gcc style ends up sending things in different
  2828. // orders. This may be a good merge candidate once we drop pedantic
  2829. // compatibility.
  2830. Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
  2831. Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
  2832. options::OPT_trigraphs);
  2833. if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
  2834. // Honor -std-default.
  2835. Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
  2836. "-std=", /*Joined=*/true);
  2837. }
  2838. Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
  2839. Args.AddLastArg(CmdArgs, options::OPT_w);
  2840. // The driver treats -fsyntax-only specially.
  2841. Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
  2842. // Claim Clang only -f options, they aren't worth warning about.
  2843. Args.ClaimAllArgs(options::OPT_f_clang_Group);
  2844. if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
  2845. !Args.hasArg(options::OPT_fno_working_directory))
  2846. CmdArgs.push_back("-fworking-directory");
  2847. Args.AddAllArgs(CmdArgs, options::OPT_O);
  2848. Args.AddAllArgs(CmdArgs, options::OPT_undef);
  2849. if (Args.hasArg(options::OPT_save_temps))
  2850. CmdArgs.push_back("-fpch-preprocess");
  2851. }
  2852. void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
  2853. ArgStringList &CmdArgs,
  2854. const InputInfoList &Inputs) const {
  2855. const Driver &D = getToolChain().getDriver();
  2856. CheckPreprocessingOptions(D, Args);
  2857. // Derived from cpp_unique_options.
  2858. // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
  2859. Args.AddLastArg(CmdArgs, options::OPT_C);
  2860. Args.AddLastArg(CmdArgs, options::OPT_CC);
  2861. if (!Args.hasArg(options::OPT_Q))
  2862. CmdArgs.push_back("-quiet");
  2863. Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
  2864. Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
  2865. Args.AddLastArg(CmdArgs, options::OPT_v);
  2866. Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
  2867. Args.AddLastArg(CmdArgs, options::OPT_P);
  2868. // FIXME: Handle %I properly.
  2869. if (getToolChain().getArchName() == "x86_64") {
  2870. CmdArgs.push_back("-imultilib");
  2871. CmdArgs.push_back("x86_64");
  2872. }
  2873. if (Args.hasArg(options::OPT_MD)) {
  2874. CmdArgs.push_back("-MD");
  2875. CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
  2876. }
  2877. if (Args.hasArg(options::OPT_MMD)) {
  2878. CmdArgs.push_back("-MMD");
  2879. CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
  2880. }
  2881. Args.AddLastArg(CmdArgs, options::OPT_M);
  2882. Args.AddLastArg(CmdArgs, options::OPT_MM);
  2883. Args.AddAllArgs(CmdArgs, options::OPT_MF);
  2884. Args.AddLastArg(CmdArgs, options::OPT_MG);
  2885. Args.AddLastArg(CmdArgs, options::OPT_MP);
  2886. Args.AddAllArgs(CmdArgs, options::OPT_MQ);
  2887. Args.AddAllArgs(CmdArgs, options::OPT_MT);
  2888. if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
  2889. (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
  2890. if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
  2891. CmdArgs.push_back("-MQ");
  2892. CmdArgs.push_back(OutputOpt->getValue(Args));
  2893. }
  2894. }
  2895. Args.AddLastArg(CmdArgs, options::OPT_remap);
  2896. if (Args.hasArg(options::OPT_g3))
  2897. CmdArgs.push_back("-dD");
  2898. Args.AddLastArg(CmdArgs, options::OPT_H);
  2899. AddCPPArgs(Args, CmdArgs);
  2900. Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
  2901. Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
  2902. for (InputInfoList::const_iterator
  2903. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  2904. const InputInfo &II = *it;
  2905. CmdArgs.push_back(II.getFilename());
  2906. }
  2907. Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
  2908. options::OPT_Xpreprocessor);
  2909. if (Args.hasArg(options::OPT_fmudflap)) {
  2910. CmdArgs.push_back("-D_MUDFLAP");
  2911. CmdArgs.push_back("-include");
  2912. CmdArgs.push_back("mf-runtime.h");
  2913. }
  2914. if (Args.hasArg(options::OPT_fmudflapth)) {
  2915. CmdArgs.push_back("-D_MUDFLAP");
  2916. CmdArgs.push_back("-D_MUDFLAPTH");
  2917. CmdArgs.push_back("-include");
  2918. CmdArgs.push_back("mf-runtime.h");
  2919. }
  2920. }
  2921. void darwin::CC1::AddCPPArgs(const ArgList &Args,
  2922. ArgStringList &CmdArgs) const {
  2923. // Derived from cpp spec.
  2924. if (Args.hasArg(options::OPT_static)) {
  2925. // The gcc spec is broken here, it refers to dynamic but
  2926. // that has been translated. Start by being bug compatible.
  2927. // if (!Args.hasArg(arglist.parser.dynamicOption))
  2928. CmdArgs.push_back("-D__STATIC__");
  2929. } else
  2930. CmdArgs.push_back("-D__DYNAMIC__");
  2931. if (Args.hasArg(options::OPT_pthread))
  2932. CmdArgs.push_back("-D_REENTRANT");
  2933. }
  2934. void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
  2935. const InputInfo &Output,
  2936. const InputInfoList &Inputs,
  2937. const ArgList &Args,
  2938. const char *LinkingOutput) const {
  2939. ArgStringList CmdArgs;
  2940. assert(Inputs.size() == 1 && "Unexpected number of inputs!");
  2941. CmdArgs.push_back("-E");
  2942. if (Args.hasArg(options::OPT_traditional) ||
  2943. Args.hasArg(options::OPT_traditional_cpp))
  2944. CmdArgs.push_back("-traditional-cpp");
  2945. ArgStringList OutputArgs;
  2946. assert(Output.isFilename() && "Unexpected CC1 output.");
  2947. OutputArgs.push_back("-o");
  2948. OutputArgs.push_back(Output.getFilename());
  2949. if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
  2950. AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
  2951. } else {
  2952. AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
  2953. CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
  2954. }
  2955. Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
  2956. RemoveCC1UnsupportedArgs(CmdArgs);
  2957. const char *CC1Name = getCC1Name(Inputs[0].getType());
  2958. const char *Exec =
  2959. Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
  2960. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  2961. }
  2962. void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
  2963. const InputInfo &Output,
  2964. const InputInfoList &Inputs,
  2965. const ArgList &Args,
  2966. const char *LinkingOutput) const {
  2967. const Driver &D = getToolChain().getDriver();
  2968. ArgStringList CmdArgs;
  2969. assert(Inputs.size() == 1 && "Unexpected number of inputs!");
  2970. types::ID InputType = Inputs[0].getType();
  2971. const Arg *A;
  2972. if ((A = Args.getLastArg(options::OPT_traditional)))
  2973. D.Diag(diag::err_drv_argument_only_allowed_with)
  2974. << A->getAsString(Args) << "-E";
  2975. if (JA.getType() == types::TY_LLVM_IR ||
  2976. JA.getType() == types::TY_LTO_IR)
  2977. CmdArgs.push_back("-emit-llvm");
  2978. else if (JA.getType() == types::TY_LLVM_BC ||
  2979. JA.getType() == types::TY_LTO_BC)
  2980. CmdArgs.push_back("-emit-llvm-bc");
  2981. else if (Output.getType() == types::TY_AST)
  2982. D.Diag(diag::err_drv_no_ast_support)
  2983. << getToolChain().getTripleString();
  2984. else if (JA.getType() != types::TY_PP_Asm &&
  2985. JA.getType() != types::TY_PCH)
  2986. D.Diag(diag::err_drv_invalid_gcc_output_type)
  2987. << getTypeName(JA.getType());
  2988. ArgStringList OutputArgs;
  2989. if (Output.getType() != types::TY_PCH) {
  2990. OutputArgs.push_back("-o");
  2991. if (Output.isNothing())
  2992. OutputArgs.push_back("/dev/null");
  2993. else
  2994. OutputArgs.push_back(Output.getFilename());
  2995. }
  2996. // There is no need for this level of compatibility, but it makes
  2997. // diffing easier.
  2998. bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
  2999. Args.hasArg(options::OPT_S));
  3000. if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
  3001. AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
  3002. if (OutputArgsEarly) {
  3003. AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
  3004. } else {
  3005. AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
  3006. CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
  3007. }
  3008. } else {
  3009. CmdArgs.push_back("-fpreprocessed");
  3010. for (InputInfoList::const_iterator
  3011. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3012. const InputInfo &II = *it;
  3013. // Reject AST inputs.
  3014. if (II.getType() == types::TY_AST) {
  3015. D.Diag(diag::err_drv_no_ast_support)
  3016. << getToolChain().getTripleString();
  3017. return;
  3018. }
  3019. CmdArgs.push_back(II.getFilename());
  3020. }
  3021. if (OutputArgsEarly) {
  3022. AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
  3023. } else {
  3024. AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
  3025. CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
  3026. }
  3027. }
  3028. if (Output.getType() == types::TY_PCH) {
  3029. assert(Output.isFilename() && "Invalid PCH output.");
  3030. CmdArgs.push_back("-o");
  3031. // NOTE: gcc uses a temp .s file for this, but there doesn't seem
  3032. // to be a good reason.
  3033. const char *TmpPath = C.getArgs().MakeArgString(
  3034. D.GetTemporaryPath("cc", "s"));
  3035. C.addTempFile(TmpPath);
  3036. CmdArgs.push_back(TmpPath);
  3037. // If we're emitting a pch file with the last 4 characters of ".pth"
  3038. // and falling back to llvm-gcc we want to use ".gch" instead.
  3039. std::string OutputFile(Output.getFilename());
  3040. size_t loc = OutputFile.rfind(".pth");
  3041. if (loc != std::string::npos)
  3042. OutputFile.replace(loc, 4, ".gch");
  3043. const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
  3044. CmdArgs.push_back(Tmp);
  3045. }
  3046. RemoveCC1UnsupportedArgs(CmdArgs);
  3047. const char *CC1Name = getCC1Name(Inputs[0].getType());
  3048. const char *Exec =
  3049. Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
  3050. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3051. }
  3052. void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  3053. const InputInfo &Output,
  3054. const InputInfoList &Inputs,
  3055. const ArgList &Args,
  3056. const char *LinkingOutput) const {
  3057. ArgStringList CmdArgs;
  3058. assert(Inputs.size() == 1 && "Unexpected number of inputs.");
  3059. const InputInfo &Input = Inputs[0];
  3060. // Determine the original source input.
  3061. const Action *SourceAction = &JA;
  3062. while (SourceAction->getKind() != Action::InputClass) {
  3063. assert(!SourceAction->getInputs().empty() && "unexpected root action!");
  3064. SourceAction = SourceAction->getInputs()[0];
  3065. }
  3066. // Forward -g, assuming we are dealing with an actual assembly file.
  3067. if (SourceAction->getType() == types::TY_Asm ||
  3068. SourceAction->getType() == types::TY_PP_Asm) {
  3069. if (Args.hasArg(options::OPT_gstabs))
  3070. CmdArgs.push_back("--gstabs");
  3071. else if (Args.hasArg(options::OPT_g_Group))
  3072. CmdArgs.push_back("-g");
  3073. }
  3074. // Derived from asm spec.
  3075. AddDarwinArch(Args, CmdArgs);
  3076. // Use -force_cpusubtype_ALL on x86 by default.
  3077. if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
  3078. getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
  3079. Args.hasArg(options::OPT_force__cpusubtype__ALL))
  3080. CmdArgs.push_back("-force_cpusubtype_ALL");
  3081. if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
  3082. (Args.hasArg(options::OPT_mkernel) ||
  3083. Args.hasArg(options::OPT_static) ||
  3084. Args.hasArg(options::OPT_fapple_kext)))
  3085. CmdArgs.push_back("-static");
  3086. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  3087. options::OPT_Xassembler);
  3088. assert(Output.isFilename() && "Unexpected lipo output.");
  3089. CmdArgs.push_back("-o");
  3090. CmdArgs.push_back(Output.getFilename());
  3091. assert(Input.isFilename() && "Invalid input.");
  3092. CmdArgs.push_back(Input.getFilename());
  3093. // asm_final spec is empty.
  3094. const char *Exec =
  3095. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  3096. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3097. }
  3098. void darwin::DarwinTool::anchor() {}
  3099. void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
  3100. ArgStringList &CmdArgs) const {
  3101. StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
  3102. // Derived from darwin_arch spec.
  3103. CmdArgs.push_back("-arch");
  3104. CmdArgs.push_back(Args.MakeArgString(ArchName));
  3105. // FIXME: Is this needed anymore?
  3106. if (ArchName == "arm")
  3107. CmdArgs.push_back("-force_cpusubtype_ALL");
  3108. }
  3109. void darwin::Link::AddLinkArgs(Compilation &C,
  3110. const ArgList &Args,
  3111. ArgStringList &CmdArgs) const {
  3112. const Driver &D = getToolChain().getDriver();
  3113. const toolchains::Darwin &DarwinTC = getDarwinToolChain();
  3114. unsigned Version[3] = { 0, 0, 0 };
  3115. if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
  3116. bool HadExtra;
  3117. if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
  3118. Version[1], Version[2], HadExtra) ||
  3119. HadExtra)
  3120. D.Diag(diag::err_drv_invalid_version_number)
  3121. << A->getAsString(Args);
  3122. }
  3123. // Newer linkers support -demangle, pass it if supported and not disabled by
  3124. // the user.
  3125. if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
  3126. // Don't pass -demangle to ld_classic.
  3127. //
  3128. // FIXME: This is a temporary workaround, ld should be handling this.
  3129. bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
  3130. Args.hasArg(options::OPT_static));
  3131. if (getToolChain().getArch() == llvm::Triple::x86) {
  3132. for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
  3133. options::OPT_Wl_COMMA),
  3134. ie = Args.filtered_end(); it != ie; ++it) {
  3135. const Arg *A = *it;
  3136. for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
  3137. if (StringRef(A->getValue(Args, i)) == "-kext")
  3138. UsesLdClassic = true;
  3139. }
  3140. }
  3141. if (!UsesLdClassic)
  3142. CmdArgs.push_back("-demangle");
  3143. }
  3144. // If we are using LTO, then automatically create a temporary file path for
  3145. // the linker to use, so that it's lifetime will extend past a possible
  3146. // dsymutil step.
  3147. if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
  3148. const char *TmpPath = C.getArgs().MakeArgString(
  3149. D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
  3150. C.addTempFile(TmpPath);
  3151. CmdArgs.push_back("-object_path_lto");
  3152. CmdArgs.push_back(TmpPath);
  3153. }
  3154. // Derived from the "link" spec.
  3155. Args.AddAllArgs(CmdArgs, options::OPT_static);
  3156. if (!Args.hasArg(options::OPT_static))
  3157. CmdArgs.push_back("-dynamic");
  3158. if (Args.hasArg(options::OPT_fgnu_runtime)) {
  3159. // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
  3160. // here. How do we wish to handle such things?
  3161. }
  3162. if (!Args.hasArg(options::OPT_dynamiclib)) {
  3163. AddDarwinArch(Args, CmdArgs);
  3164. // FIXME: Why do this only on this path?
  3165. Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
  3166. Args.AddLastArg(CmdArgs, options::OPT_bundle);
  3167. Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
  3168. Args.AddAllArgs(CmdArgs, options::OPT_client__name);
  3169. Arg *A;
  3170. if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
  3171. (A = Args.getLastArg(options::OPT_current__version)) ||
  3172. (A = Args.getLastArg(options::OPT_install__name)))
  3173. D.Diag(diag::err_drv_argument_only_allowed_with)
  3174. << A->getAsString(Args) << "-dynamiclib";
  3175. Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
  3176. Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
  3177. Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
  3178. } else {
  3179. CmdArgs.push_back("-dylib");
  3180. Arg *A;
  3181. if ((A = Args.getLastArg(options::OPT_bundle)) ||
  3182. (A = Args.getLastArg(options::OPT_bundle__loader)) ||
  3183. (A = Args.getLastArg(options::OPT_client__name)) ||
  3184. (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
  3185. (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
  3186. (A = Args.getLastArg(options::OPT_private__bundle)))
  3187. D.Diag(diag::err_drv_argument_not_allowed_with)
  3188. << A->getAsString(Args) << "-dynamiclib";
  3189. Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
  3190. "-dylib_compatibility_version");
  3191. Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
  3192. "-dylib_current_version");
  3193. AddDarwinArch(Args, CmdArgs);
  3194. Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
  3195. "-dylib_install_name");
  3196. }
  3197. Args.AddLastArg(CmdArgs, options::OPT_all__load);
  3198. Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
  3199. Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
  3200. if (DarwinTC.isTargetIPhoneOS())
  3201. Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
  3202. Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
  3203. Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
  3204. Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
  3205. Args.AddLastArg(CmdArgs, options::OPT_dynamic);
  3206. Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
  3207. Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
  3208. Args.AddAllArgs(CmdArgs, options::OPT_force__load);
  3209. Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
  3210. Args.AddAllArgs(CmdArgs, options::OPT_image__base);
  3211. Args.AddAllArgs(CmdArgs, options::OPT_init);
  3212. // Add the deployment target.
  3213. unsigned TargetVersion[3];
  3214. DarwinTC.getTargetVersion(TargetVersion);
  3215. // If we had an explicit -mios-simulator-version-min argument, honor that,
  3216. // otherwise use the traditional deployment targets. We can't just check the
  3217. // is-sim attribute because existing code follows this path, and the linker
  3218. // may not handle the argument.
  3219. //
  3220. // FIXME: We may be able to remove this, once we can verify no one depends on
  3221. // it.
  3222. if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
  3223. CmdArgs.push_back("-ios_simulator_version_min");
  3224. else if (DarwinTC.isTargetIPhoneOS())
  3225. CmdArgs.push_back("-iphoneos_version_min");
  3226. else
  3227. CmdArgs.push_back("-macosx_version_min");
  3228. CmdArgs.push_back(Args.MakeArgString(Twine(TargetVersion[0]) + "." +
  3229. Twine(TargetVersion[1]) + "." +
  3230. Twine(TargetVersion[2])));
  3231. Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
  3232. Args.AddLastArg(CmdArgs, options::OPT_multi__module);
  3233. Args.AddLastArg(CmdArgs, options::OPT_single__module);
  3234. Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
  3235. Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
  3236. if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
  3237. options::OPT_fno_pie,
  3238. options::OPT_fno_PIE)) {
  3239. if (A->getOption().matches(options::OPT_fpie) ||
  3240. A->getOption().matches(options::OPT_fPIE))
  3241. CmdArgs.push_back("-pie");
  3242. else
  3243. CmdArgs.push_back("-no_pie");
  3244. }
  3245. Args.AddLastArg(CmdArgs, options::OPT_prebind);
  3246. Args.AddLastArg(CmdArgs, options::OPT_noprebind);
  3247. Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
  3248. Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
  3249. Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
  3250. Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
  3251. Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
  3252. Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
  3253. Args.AddAllArgs(CmdArgs, options::OPT_segprot);
  3254. Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
  3255. Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
  3256. Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
  3257. Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
  3258. Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
  3259. Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
  3260. Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
  3261. // Give --sysroot= preference, over the Apple specific behavior to also use
  3262. // --isysroot as the syslibroot.
  3263. if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
  3264. CmdArgs.push_back("-syslibroot");
  3265. CmdArgs.push_back(A->getValue(Args));
  3266. } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
  3267. CmdArgs.push_back("-syslibroot");
  3268. CmdArgs.push_back(A->getValue(Args));
  3269. } else if (getDarwinToolChain().isTargetIPhoneOS()) {
  3270. CmdArgs.push_back("-syslibroot");
  3271. CmdArgs.push_back("/Developer/SDKs/Extra");
  3272. }
  3273. Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
  3274. Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
  3275. Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
  3276. Args.AddAllArgs(CmdArgs, options::OPT_undefined);
  3277. Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
  3278. Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
  3279. Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
  3280. Args.AddAllArgs(CmdArgs, options::OPT_y);
  3281. Args.AddLastArg(CmdArgs, options::OPT_w);
  3282. Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
  3283. Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
  3284. Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
  3285. Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
  3286. Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
  3287. Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
  3288. Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
  3289. Args.AddLastArg(CmdArgs, options::OPT_whyload);
  3290. Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
  3291. Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
  3292. Args.AddLastArg(CmdArgs, options::OPT_dylinker);
  3293. Args.AddLastArg(CmdArgs, options::OPT_Mach);
  3294. }
  3295. void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
  3296. const InputInfo &Output,
  3297. const InputInfoList &Inputs,
  3298. const ArgList &Args,
  3299. const char *LinkingOutput) const {
  3300. assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
  3301. // The logic here is derived from gcc's behavior; most of which
  3302. // comes from specs (starting with link_command). Consult gcc for
  3303. // more information.
  3304. ArgStringList CmdArgs;
  3305. /// Hack(tm) to ignore linking errors when we are doing ARC migration.
  3306. if (Args.hasArg(options::OPT_ccc_arcmt_check,
  3307. options::OPT_ccc_arcmt_migrate)) {
  3308. for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
  3309. (*I)->claim();
  3310. const char *Exec =
  3311. Args.MakeArgString(getToolChain().GetProgramPath("touch"));
  3312. CmdArgs.push_back(Output.getFilename());
  3313. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3314. return;
  3315. }
  3316. // I'm not sure why this particular decomposition exists in gcc, but
  3317. // we follow suite for ease of comparison.
  3318. AddLinkArgs(C, Args, CmdArgs);
  3319. Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
  3320. Args.AddAllArgs(CmdArgs, options::OPT_s);
  3321. Args.AddAllArgs(CmdArgs, options::OPT_t);
  3322. Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
  3323. Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
  3324. Args.AddAllArgs(CmdArgs, options::OPT_A);
  3325. Args.AddLastArg(CmdArgs, options::OPT_e);
  3326. Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
  3327. Args.AddAllArgs(CmdArgs, options::OPT_r);
  3328. // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
  3329. // members of static archive libraries which implement Objective-C classes or
  3330. // categories.
  3331. if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
  3332. CmdArgs.push_back("-ObjC");
  3333. CmdArgs.push_back("-o");
  3334. CmdArgs.push_back(Output.getFilename());
  3335. if (!Args.hasArg(options::OPT_A) &&
  3336. !Args.hasArg(options::OPT_nostdlib) &&
  3337. !Args.hasArg(options::OPT_nostartfiles)) {
  3338. // Derived from startfile spec.
  3339. if (Args.hasArg(options::OPT_dynamiclib)) {
  3340. // Derived from darwin_dylib1 spec.
  3341. if (getDarwinToolChain().isTargetIOSSimulator()) {
  3342. // The simulator doesn't have a versioned crt1 file.
  3343. CmdArgs.push_back("-ldylib1.o");
  3344. } else if (getDarwinToolChain().isTargetIPhoneOS()) {
  3345. if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
  3346. CmdArgs.push_back("-ldylib1.o");
  3347. } else {
  3348. if (getDarwinToolChain().isMacosxVersionLT(10, 5))
  3349. CmdArgs.push_back("-ldylib1.o");
  3350. else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
  3351. CmdArgs.push_back("-ldylib1.10.5.o");
  3352. }
  3353. } else {
  3354. if (Args.hasArg(options::OPT_bundle)) {
  3355. if (!Args.hasArg(options::OPT_static)) {
  3356. // Derived from darwin_bundle1 spec.
  3357. if (getDarwinToolChain().isTargetIOSSimulator()) {
  3358. // The simulator doesn't have a versioned crt1 file.
  3359. CmdArgs.push_back("-lbundle1.o");
  3360. } else if (getDarwinToolChain().isTargetIPhoneOS()) {
  3361. if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
  3362. CmdArgs.push_back("-lbundle1.o");
  3363. } else {
  3364. if (getDarwinToolChain().isMacosxVersionLT(10, 6))
  3365. CmdArgs.push_back("-lbundle1.o");
  3366. }
  3367. }
  3368. } else {
  3369. if (Args.hasArg(options::OPT_pg) &&
  3370. getToolChain().SupportsProfiling()) {
  3371. if (Args.hasArg(options::OPT_static) ||
  3372. Args.hasArg(options::OPT_object) ||
  3373. Args.hasArg(options::OPT_preload)) {
  3374. CmdArgs.push_back("-lgcrt0.o");
  3375. } else {
  3376. CmdArgs.push_back("-lgcrt1.o");
  3377. // darwin_crt2 spec is empty.
  3378. }
  3379. } else {
  3380. if (Args.hasArg(options::OPT_static) ||
  3381. Args.hasArg(options::OPT_object) ||
  3382. Args.hasArg(options::OPT_preload)) {
  3383. CmdArgs.push_back("-lcrt0.o");
  3384. } else {
  3385. // Derived from darwin_crt1 spec.
  3386. if (getDarwinToolChain().isTargetIOSSimulator()) {
  3387. // The simulator doesn't have a versioned crt1 file.
  3388. CmdArgs.push_back("-lcrt1.o");
  3389. } else if (getDarwinToolChain().isTargetIPhoneOS()) {
  3390. if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
  3391. CmdArgs.push_back("-lcrt1.o");
  3392. else
  3393. CmdArgs.push_back("-lcrt1.3.1.o");
  3394. } else {
  3395. if (getDarwinToolChain().isMacosxVersionLT(10, 5))
  3396. CmdArgs.push_back("-lcrt1.o");
  3397. else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
  3398. CmdArgs.push_back("-lcrt1.10.5.o");
  3399. else
  3400. CmdArgs.push_back("-lcrt1.10.6.o");
  3401. // darwin_crt2 spec is empty.
  3402. }
  3403. }
  3404. }
  3405. }
  3406. }
  3407. if (!getDarwinToolChain().isTargetIPhoneOS() &&
  3408. Args.hasArg(options::OPT_shared_libgcc) &&
  3409. getDarwinToolChain().isMacosxVersionLT(10, 5)) {
  3410. const char *Str =
  3411. Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
  3412. CmdArgs.push_back(Str);
  3413. }
  3414. }
  3415. Args.AddAllArgs(CmdArgs, options::OPT_L);
  3416. // If we're building a dynamic lib with -faddress-sanitizer, unresolved
  3417. // symbols may appear. Mark all of them as dynamic_lookup.
  3418. // Linking executables is handled in lib/Driver/ToolChains.cpp.
  3419. if (Args.hasFlag(options::OPT_faddress_sanitizer,
  3420. options::OPT_fno_address_sanitizer, false)) {
  3421. if (Args.hasArg(options::OPT_dynamiclib) ||
  3422. Args.hasArg(options::OPT_bundle)) {
  3423. CmdArgs.push_back("-undefined");
  3424. CmdArgs.push_back("dynamic_lookup");
  3425. }
  3426. }
  3427. if (Args.hasArg(options::OPT_fopenmp))
  3428. // This is more complicated in gcc...
  3429. CmdArgs.push_back("-lgomp");
  3430. getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
  3431. // In ARC, if we don't have runtime support, link in the runtime
  3432. // stubs. We have to do this *before* adding any of the normal
  3433. // linker inputs so that its initializer gets run first.
  3434. if (isObjCAutoRefCount(Args)) {
  3435. ObjCRuntime runtime;
  3436. getDarwinToolChain().configureObjCRuntime(runtime);
  3437. if (!runtime.HasARC)
  3438. getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
  3439. }
  3440. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  3441. if (LinkingOutput) {
  3442. CmdArgs.push_back("-arch_multiple");
  3443. CmdArgs.push_back("-final_output");
  3444. CmdArgs.push_back(LinkingOutput);
  3445. }
  3446. if (Args.hasArg(options::OPT_fnested_functions))
  3447. CmdArgs.push_back("-allow_stack_execute");
  3448. if (!Args.hasArg(options::OPT_nostdlib) &&
  3449. !Args.hasArg(options::OPT_nodefaultlibs)) {
  3450. if (getToolChain().getDriver().CCCIsCXX)
  3451. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  3452. // link_ssp spec is empty.
  3453. // Let the tool chain choose which runtime library to link.
  3454. getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
  3455. }
  3456. if (!Args.hasArg(options::OPT_A) &&
  3457. !Args.hasArg(options::OPT_nostdlib) &&
  3458. !Args.hasArg(options::OPT_nostartfiles)) {
  3459. // endfile_spec is empty.
  3460. }
  3461. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  3462. Args.AddAllArgs(CmdArgs, options::OPT_F);
  3463. const char *Exec =
  3464. Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  3465. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3466. }
  3467. void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
  3468. const InputInfo &Output,
  3469. const InputInfoList &Inputs,
  3470. const ArgList &Args,
  3471. const char *LinkingOutput) const {
  3472. ArgStringList CmdArgs;
  3473. CmdArgs.push_back("-create");
  3474. assert(Output.isFilename() && "Unexpected lipo output.");
  3475. CmdArgs.push_back("-output");
  3476. CmdArgs.push_back(Output.getFilename());
  3477. for (InputInfoList::const_iterator
  3478. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3479. const InputInfo &II = *it;
  3480. assert(II.isFilename() && "Unexpected lipo input.");
  3481. CmdArgs.push_back(II.getFilename());
  3482. }
  3483. const char *Exec =
  3484. Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
  3485. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3486. }
  3487. void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
  3488. const InputInfo &Output,
  3489. const InputInfoList &Inputs,
  3490. const ArgList &Args,
  3491. const char *LinkingOutput) const {
  3492. ArgStringList CmdArgs;
  3493. CmdArgs.push_back("-o");
  3494. CmdArgs.push_back(Output.getFilename());
  3495. assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
  3496. const InputInfo &Input = Inputs[0];
  3497. assert(Input.isFilename() && "Unexpected dsymutil input.");
  3498. CmdArgs.push_back(Input.getFilename());
  3499. const char *Exec =
  3500. Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
  3501. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3502. }
  3503. void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
  3504. const InputInfo &Output,
  3505. const InputInfoList &Inputs,
  3506. const ArgList &Args,
  3507. const char *LinkingOutput) const {
  3508. ArgStringList CmdArgs;
  3509. CmdArgs.push_back("--verify");
  3510. assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
  3511. const InputInfo &Input = Inputs[0];
  3512. assert(Input.isFilename() && "Unexpected verify input");
  3513. // Grabbing the output of the earlier dsymutil run.
  3514. CmdArgs.push_back(Input.getFilename());
  3515. const char *Exec =
  3516. Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
  3517. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3518. }
  3519. void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  3520. const InputInfo &Output,
  3521. const InputInfoList &Inputs,
  3522. const ArgList &Args,
  3523. const char *LinkingOutput) const {
  3524. ArgStringList CmdArgs;
  3525. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  3526. options::OPT_Xassembler);
  3527. CmdArgs.push_back("-o");
  3528. CmdArgs.push_back(Output.getFilename());
  3529. for (InputInfoList::const_iterator
  3530. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3531. const InputInfo &II = *it;
  3532. CmdArgs.push_back(II.getFilename());
  3533. }
  3534. const char *Exec =
  3535. Args.MakeArgString(getToolChain().GetProgramPath("gas"));
  3536. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3537. }
  3538. void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
  3539. const InputInfo &Output,
  3540. const InputInfoList &Inputs,
  3541. const ArgList &Args,
  3542. const char *LinkingOutput) const {
  3543. ArgStringList CmdArgs;
  3544. if ((!Args.hasArg(options::OPT_nostdlib)) &&
  3545. (!Args.hasArg(options::OPT_shared))) {
  3546. CmdArgs.push_back("-e");
  3547. CmdArgs.push_back("_start");
  3548. }
  3549. if (Args.hasArg(options::OPT_static)) {
  3550. CmdArgs.push_back("-Bstatic");
  3551. CmdArgs.push_back("-dn");
  3552. } else {
  3553. // CmdArgs.push_back("--eh-frame-hdr");
  3554. CmdArgs.push_back("-Bdynamic");
  3555. if (Args.hasArg(options::OPT_shared)) {
  3556. CmdArgs.push_back("-shared");
  3557. } else {
  3558. CmdArgs.push_back("--dynamic-linker");
  3559. CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
  3560. }
  3561. }
  3562. if (Output.isFilename()) {
  3563. CmdArgs.push_back("-o");
  3564. CmdArgs.push_back(Output.getFilename());
  3565. } else {
  3566. assert(Output.isNothing() && "Invalid output.");
  3567. }
  3568. if (!Args.hasArg(options::OPT_nostdlib) &&
  3569. !Args.hasArg(options::OPT_nostartfiles)) {
  3570. if (!Args.hasArg(options::OPT_shared)) {
  3571. CmdArgs.push_back(Args.MakeArgString(
  3572. getToolChain().GetFilePath("crt1.o")));
  3573. CmdArgs.push_back(Args.MakeArgString(
  3574. getToolChain().GetFilePath("crti.o")));
  3575. CmdArgs.push_back(Args.MakeArgString(
  3576. getToolChain().GetFilePath("crtbegin.o")));
  3577. } else {
  3578. CmdArgs.push_back(Args.MakeArgString(
  3579. getToolChain().GetFilePath("crti.o")));
  3580. }
  3581. CmdArgs.push_back(Args.MakeArgString(
  3582. getToolChain().GetFilePath("crtn.o")));
  3583. }
  3584. CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
  3585. + getToolChain().getTripleString()
  3586. + "/4.2.4"));
  3587. Args.AddAllArgs(CmdArgs, options::OPT_L);
  3588. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  3589. Args.AddAllArgs(CmdArgs, options::OPT_e);
  3590. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  3591. if (!Args.hasArg(options::OPT_nostdlib) &&
  3592. !Args.hasArg(options::OPT_nodefaultlibs)) {
  3593. // FIXME: For some reason GCC passes -lgcc before adding
  3594. // the default system libraries. Just mimic this for now.
  3595. CmdArgs.push_back("-lgcc");
  3596. if (Args.hasArg(options::OPT_pthread))
  3597. CmdArgs.push_back("-pthread");
  3598. if (!Args.hasArg(options::OPT_shared))
  3599. CmdArgs.push_back("-lc");
  3600. CmdArgs.push_back("-lgcc");
  3601. }
  3602. if (!Args.hasArg(options::OPT_nostdlib) &&
  3603. !Args.hasArg(options::OPT_nostartfiles)) {
  3604. if (!Args.hasArg(options::OPT_shared))
  3605. CmdArgs.push_back(Args.MakeArgString(
  3606. getToolChain().GetFilePath("crtend.o")));
  3607. }
  3608. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  3609. const char *Exec =
  3610. Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  3611. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3612. }
  3613. void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  3614. const InputInfo &Output,
  3615. const InputInfoList &Inputs,
  3616. const ArgList &Args,
  3617. const char *LinkingOutput) const {
  3618. ArgStringList CmdArgs;
  3619. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  3620. options::OPT_Xassembler);
  3621. CmdArgs.push_back("-o");
  3622. CmdArgs.push_back(Output.getFilename());
  3623. for (InputInfoList::const_iterator
  3624. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3625. const InputInfo &II = *it;
  3626. CmdArgs.push_back(II.getFilename());
  3627. }
  3628. const char *Exec =
  3629. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  3630. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3631. }
  3632. void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
  3633. const InputInfo &Output,
  3634. const InputInfoList &Inputs,
  3635. const ArgList &Args,
  3636. const char *LinkingOutput) const {
  3637. const Driver &D = getToolChain().getDriver();
  3638. ArgStringList CmdArgs;
  3639. if ((!Args.hasArg(options::OPT_nostdlib)) &&
  3640. (!Args.hasArg(options::OPT_shared))) {
  3641. CmdArgs.push_back("-e");
  3642. CmdArgs.push_back("__start");
  3643. }
  3644. if (Args.hasArg(options::OPT_static)) {
  3645. CmdArgs.push_back("-Bstatic");
  3646. } else {
  3647. if (Args.hasArg(options::OPT_rdynamic))
  3648. CmdArgs.push_back("-export-dynamic");
  3649. CmdArgs.push_back("--eh-frame-hdr");
  3650. CmdArgs.push_back("-Bdynamic");
  3651. if (Args.hasArg(options::OPT_shared)) {
  3652. CmdArgs.push_back("-shared");
  3653. } else {
  3654. CmdArgs.push_back("-dynamic-linker");
  3655. CmdArgs.push_back("/usr/libexec/ld.so");
  3656. }
  3657. }
  3658. if (Output.isFilename()) {
  3659. CmdArgs.push_back("-o");
  3660. CmdArgs.push_back(Output.getFilename());
  3661. } else {
  3662. assert(Output.isNothing() && "Invalid output.");
  3663. }
  3664. if (!Args.hasArg(options::OPT_nostdlib) &&
  3665. !Args.hasArg(options::OPT_nostartfiles)) {
  3666. if (!Args.hasArg(options::OPT_shared)) {
  3667. if (Args.hasArg(options::OPT_pg))
  3668. CmdArgs.push_back(Args.MakeArgString(
  3669. getToolChain().GetFilePath("gcrt0.o")));
  3670. else
  3671. CmdArgs.push_back(Args.MakeArgString(
  3672. getToolChain().GetFilePath("crt0.o")));
  3673. CmdArgs.push_back(Args.MakeArgString(
  3674. getToolChain().GetFilePath("crtbegin.o")));
  3675. } else {
  3676. CmdArgs.push_back(Args.MakeArgString(
  3677. getToolChain().GetFilePath("crtbeginS.o")));
  3678. }
  3679. }
  3680. std::string Triple = getToolChain().getTripleString();
  3681. if (Triple.substr(0, 6) == "x86_64")
  3682. Triple.replace(0, 6, "amd64");
  3683. CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
  3684. "/4.2.1"));
  3685. Args.AddAllArgs(CmdArgs, options::OPT_L);
  3686. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  3687. Args.AddAllArgs(CmdArgs, options::OPT_e);
  3688. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  3689. if (!Args.hasArg(options::OPT_nostdlib) &&
  3690. !Args.hasArg(options::OPT_nodefaultlibs)) {
  3691. if (D.CCCIsCXX) {
  3692. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  3693. if (Args.hasArg(options::OPT_pg))
  3694. CmdArgs.push_back("-lm_p");
  3695. else
  3696. CmdArgs.push_back("-lm");
  3697. }
  3698. // FIXME: For some reason GCC passes -lgcc before adding
  3699. // the default system libraries. Just mimic this for now.
  3700. CmdArgs.push_back("-lgcc");
  3701. if (Args.hasArg(options::OPT_pthread))
  3702. CmdArgs.push_back("-lpthread");
  3703. if (!Args.hasArg(options::OPT_shared)) {
  3704. if (Args.hasArg(options::OPT_pg))
  3705. CmdArgs.push_back("-lc_p");
  3706. else
  3707. CmdArgs.push_back("-lc");
  3708. }
  3709. CmdArgs.push_back("-lgcc");
  3710. }
  3711. if (!Args.hasArg(options::OPT_nostdlib) &&
  3712. !Args.hasArg(options::OPT_nostartfiles)) {
  3713. if (!Args.hasArg(options::OPT_shared))
  3714. CmdArgs.push_back(Args.MakeArgString(
  3715. getToolChain().GetFilePath("crtend.o")));
  3716. else
  3717. CmdArgs.push_back(Args.MakeArgString(
  3718. getToolChain().GetFilePath("crtendS.o")));
  3719. }
  3720. const char *Exec =
  3721. Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  3722. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3723. }
  3724. void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  3725. const InputInfo &Output,
  3726. const InputInfoList &Inputs,
  3727. const ArgList &Args,
  3728. const char *LinkingOutput) const {
  3729. ArgStringList CmdArgs;
  3730. // When building 32-bit code on FreeBSD/amd64, we have to explicitly
  3731. // instruct as in the base system to assemble 32-bit code.
  3732. if (getToolChain().getArchName() == "i386")
  3733. CmdArgs.push_back("--32");
  3734. if (getToolChain().getArchName() == "powerpc")
  3735. CmdArgs.push_back("-a32");
  3736. // Set byte order explicitly
  3737. if (getToolChain().getArchName() == "mips")
  3738. CmdArgs.push_back("-EB");
  3739. else if (getToolChain().getArchName() == "mipsel")
  3740. CmdArgs.push_back("-EL");
  3741. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  3742. options::OPT_Xassembler);
  3743. CmdArgs.push_back("-o");
  3744. CmdArgs.push_back(Output.getFilename());
  3745. for (InputInfoList::const_iterator
  3746. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3747. const InputInfo &II = *it;
  3748. CmdArgs.push_back(II.getFilename());
  3749. }
  3750. const char *Exec =
  3751. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  3752. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3753. }
  3754. void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
  3755. const InputInfo &Output,
  3756. const InputInfoList &Inputs,
  3757. const ArgList &Args,
  3758. const char *LinkingOutput) const {
  3759. const Driver &D = getToolChain().getDriver();
  3760. ArgStringList CmdArgs;
  3761. if (!D.SysRoot.empty())
  3762. CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
  3763. if (Args.hasArg(options::OPT_static)) {
  3764. CmdArgs.push_back("-Bstatic");
  3765. } else {
  3766. if (Args.hasArg(options::OPT_rdynamic))
  3767. CmdArgs.push_back("-export-dynamic");
  3768. CmdArgs.push_back("--eh-frame-hdr");
  3769. if (Args.hasArg(options::OPT_shared)) {
  3770. CmdArgs.push_back("-Bshareable");
  3771. } else {
  3772. CmdArgs.push_back("-dynamic-linker");
  3773. CmdArgs.push_back("/libexec/ld-elf.so.1");
  3774. }
  3775. }
  3776. // When building 32-bit code on FreeBSD/amd64, we have to explicitly
  3777. // instruct ld in the base system to link 32-bit code.
  3778. if (getToolChain().getArchName() == "i386") {
  3779. CmdArgs.push_back("-m");
  3780. CmdArgs.push_back("elf_i386_fbsd");
  3781. }
  3782. if (getToolChain().getArchName() == "powerpc") {
  3783. CmdArgs.push_back("-m");
  3784. CmdArgs.push_back("elf32ppc_fbsd");
  3785. }
  3786. if (Output.isFilename()) {
  3787. CmdArgs.push_back("-o");
  3788. CmdArgs.push_back(Output.getFilename());
  3789. } else {
  3790. assert(Output.isNothing() && "Invalid output.");
  3791. }
  3792. if (!Args.hasArg(options::OPT_nostdlib) &&
  3793. !Args.hasArg(options::OPT_nostartfiles)) {
  3794. if (!Args.hasArg(options::OPT_shared)) {
  3795. if (Args.hasArg(options::OPT_pg))
  3796. CmdArgs.push_back(Args.MakeArgString(
  3797. getToolChain().GetFilePath("gcrt1.o")));
  3798. else {
  3799. const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o";
  3800. CmdArgs.push_back(Args.MakeArgString(
  3801. getToolChain().GetFilePath(crt)));
  3802. }
  3803. CmdArgs.push_back(Args.MakeArgString(
  3804. getToolChain().GetFilePath("crti.o")));
  3805. CmdArgs.push_back(Args.MakeArgString(
  3806. getToolChain().GetFilePath("crtbegin.o")));
  3807. } else {
  3808. CmdArgs.push_back(Args.MakeArgString(
  3809. getToolChain().GetFilePath("crti.o")));
  3810. CmdArgs.push_back(Args.MakeArgString(
  3811. getToolChain().GetFilePath("crtbeginS.o")));
  3812. }
  3813. }
  3814. Args.AddAllArgs(CmdArgs, options::OPT_L);
  3815. const ToolChain::path_list Paths = getToolChain().getFilePaths();
  3816. for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
  3817. i != e; ++i)
  3818. CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
  3819. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  3820. Args.AddAllArgs(CmdArgs, options::OPT_e);
  3821. Args.AddAllArgs(CmdArgs, options::OPT_s);
  3822. Args.AddAllArgs(CmdArgs, options::OPT_t);
  3823. Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
  3824. Args.AddAllArgs(CmdArgs, options::OPT_r);
  3825. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  3826. if (!Args.hasArg(options::OPT_nostdlib) &&
  3827. !Args.hasArg(options::OPT_nodefaultlibs)) {
  3828. if (D.CCCIsCXX) {
  3829. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  3830. if (Args.hasArg(options::OPT_pg))
  3831. CmdArgs.push_back("-lm_p");
  3832. else
  3833. CmdArgs.push_back("-lm");
  3834. }
  3835. // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
  3836. // the default system libraries. Just mimic this for now.
  3837. if (Args.hasArg(options::OPT_pg))
  3838. CmdArgs.push_back("-lgcc_p");
  3839. else
  3840. CmdArgs.push_back("-lgcc");
  3841. if (Args.hasArg(options::OPT_static)) {
  3842. CmdArgs.push_back("-lgcc_eh");
  3843. } else if (Args.hasArg(options::OPT_pg)) {
  3844. CmdArgs.push_back("-lgcc_eh_p");
  3845. } else {
  3846. CmdArgs.push_back("--as-needed");
  3847. CmdArgs.push_back("-lgcc_s");
  3848. CmdArgs.push_back("--no-as-needed");
  3849. }
  3850. if (Args.hasArg(options::OPT_pthread)) {
  3851. if (Args.hasArg(options::OPT_pg))
  3852. CmdArgs.push_back("-lpthread_p");
  3853. else
  3854. CmdArgs.push_back("-lpthread");
  3855. }
  3856. if (Args.hasArg(options::OPT_pg)) {
  3857. if (Args.hasArg(options::OPT_shared))
  3858. CmdArgs.push_back("-lc");
  3859. else
  3860. CmdArgs.push_back("-lc_p");
  3861. CmdArgs.push_back("-lgcc_p");
  3862. } else {
  3863. CmdArgs.push_back("-lc");
  3864. CmdArgs.push_back("-lgcc");
  3865. }
  3866. if (Args.hasArg(options::OPT_static)) {
  3867. CmdArgs.push_back("-lgcc_eh");
  3868. } else if (Args.hasArg(options::OPT_pg)) {
  3869. CmdArgs.push_back("-lgcc_eh_p");
  3870. } else {
  3871. CmdArgs.push_back("--as-needed");
  3872. CmdArgs.push_back("-lgcc_s");
  3873. CmdArgs.push_back("--no-as-needed");
  3874. }
  3875. }
  3876. if (!Args.hasArg(options::OPT_nostdlib) &&
  3877. !Args.hasArg(options::OPT_nostartfiles)) {
  3878. if (!Args.hasArg(options::OPT_shared))
  3879. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  3880. "crtend.o")));
  3881. else
  3882. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  3883. "crtendS.o")));
  3884. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  3885. "crtn.o")));
  3886. }
  3887. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  3888. const char *Exec =
  3889. Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  3890. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3891. }
  3892. void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  3893. const InputInfo &Output,
  3894. const InputInfoList &Inputs,
  3895. const ArgList &Args,
  3896. const char *LinkingOutput) const {
  3897. ArgStringList CmdArgs;
  3898. // When building 32-bit code on NetBSD/amd64, we have to explicitly
  3899. // instruct as in the base system to assemble 32-bit code.
  3900. if (getToolChain().getArch() == llvm::Triple::x86)
  3901. CmdArgs.push_back("--32");
  3902. // Set byte order explicitly
  3903. if (getToolChain().getArchName() == "mips")
  3904. CmdArgs.push_back("-EB");
  3905. else if (getToolChain().getArchName() == "mipsel")
  3906. CmdArgs.push_back("-EL");
  3907. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  3908. options::OPT_Xassembler);
  3909. CmdArgs.push_back("-o");
  3910. CmdArgs.push_back(Output.getFilename());
  3911. for (InputInfoList::const_iterator
  3912. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  3913. const InputInfo &II = *it;
  3914. CmdArgs.push_back(II.getFilename());
  3915. }
  3916. const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
  3917. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  3918. }
  3919. void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
  3920. const InputInfo &Output,
  3921. const InputInfoList &Inputs,
  3922. const ArgList &Args,
  3923. const char *LinkingOutput) const {
  3924. const Driver &D = getToolChain().getDriver();
  3925. ArgStringList CmdArgs;
  3926. if (!D.SysRoot.empty())
  3927. CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
  3928. if (Args.hasArg(options::OPT_static)) {
  3929. CmdArgs.push_back("-Bstatic");
  3930. } else {
  3931. if (Args.hasArg(options::OPT_rdynamic))
  3932. CmdArgs.push_back("-export-dynamic");
  3933. CmdArgs.push_back("--eh-frame-hdr");
  3934. if (Args.hasArg(options::OPT_shared)) {
  3935. CmdArgs.push_back("-Bshareable");
  3936. } else {
  3937. CmdArgs.push_back("-dynamic-linker");
  3938. CmdArgs.push_back("/libexec/ld.elf_so");
  3939. }
  3940. }
  3941. // When building 32-bit code on NetBSD/amd64, we have to explicitly
  3942. // instruct ld in the base system to link 32-bit code.
  3943. if (getToolChain().getArch() == llvm::Triple::x86) {
  3944. CmdArgs.push_back("-m");
  3945. CmdArgs.push_back("elf_i386");
  3946. }
  3947. if (Output.isFilename()) {
  3948. CmdArgs.push_back("-o");
  3949. CmdArgs.push_back(Output.getFilename());
  3950. } else {
  3951. assert(Output.isNothing() && "Invalid output.");
  3952. }
  3953. if (!Args.hasArg(options::OPT_nostdlib) &&
  3954. !Args.hasArg(options::OPT_nostartfiles)) {
  3955. if (!Args.hasArg(options::OPT_shared)) {
  3956. CmdArgs.push_back(Args.MakeArgString(
  3957. getToolChain().GetFilePath("crt0.o")));
  3958. CmdArgs.push_back(Args.MakeArgString(
  3959. getToolChain().GetFilePath("crti.o")));
  3960. CmdArgs.push_back(Args.MakeArgString(
  3961. getToolChain().GetFilePath("crtbegin.o")));
  3962. } else {
  3963. CmdArgs.push_back(Args.MakeArgString(
  3964. getToolChain().GetFilePath("crti.o")));
  3965. CmdArgs.push_back(Args.MakeArgString(
  3966. getToolChain().GetFilePath("crtbeginS.o")));
  3967. }
  3968. }
  3969. Args.AddAllArgs(CmdArgs, options::OPT_L);
  3970. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  3971. Args.AddAllArgs(CmdArgs, options::OPT_e);
  3972. Args.AddAllArgs(CmdArgs, options::OPT_s);
  3973. Args.AddAllArgs(CmdArgs, options::OPT_t);
  3974. Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
  3975. Args.AddAllArgs(CmdArgs, options::OPT_r);
  3976. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  3977. if (!Args.hasArg(options::OPT_nostdlib) &&
  3978. !Args.hasArg(options::OPT_nodefaultlibs)) {
  3979. if (D.CCCIsCXX) {
  3980. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  3981. CmdArgs.push_back("-lm");
  3982. }
  3983. // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
  3984. // the default system libraries. Just mimic this for now.
  3985. if (Args.hasArg(options::OPT_static)) {
  3986. CmdArgs.push_back("-lgcc_eh");
  3987. } else {
  3988. CmdArgs.push_back("--as-needed");
  3989. CmdArgs.push_back("-lgcc_s");
  3990. CmdArgs.push_back("--no-as-needed");
  3991. }
  3992. CmdArgs.push_back("-lgcc");
  3993. if (Args.hasArg(options::OPT_pthread))
  3994. CmdArgs.push_back("-lpthread");
  3995. CmdArgs.push_back("-lc");
  3996. CmdArgs.push_back("-lgcc");
  3997. if (Args.hasArg(options::OPT_static)) {
  3998. CmdArgs.push_back("-lgcc_eh");
  3999. } else {
  4000. CmdArgs.push_back("--as-needed");
  4001. CmdArgs.push_back("-lgcc_s");
  4002. CmdArgs.push_back("--no-as-needed");
  4003. }
  4004. }
  4005. if (!Args.hasArg(options::OPT_nostdlib) &&
  4006. !Args.hasArg(options::OPT_nostartfiles)) {
  4007. if (!Args.hasArg(options::OPT_shared))
  4008. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  4009. "crtend.o")));
  4010. else
  4011. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  4012. "crtendS.o")));
  4013. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
  4014. "crtn.o")));
  4015. }
  4016. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  4017. const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  4018. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4019. }
  4020. void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  4021. const InputInfo &Output,
  4022. const InputInfoList &Inputs,
  4023. const ArgList &Args,
  4024. const char *LinkingOutput) const {
  4025. ArgStringList CmdArgs;
  4026. // Add --32/--64 to make sure we get the format we want.
  4027. // This is incomplete
  4028. if (getToolChain().getArch() == llvm::Triple::x86) {
  4029. CmdArgs.push_back("--32");
  4030. } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
  4031. CmdArgs.push_back("--64");
  4032. } else if (getToolChain().getArch() == llvm::Triple::ppc) {
  4033. CmdArgs.push_back("-a32");
  4034. CmdArgs.push_back("-mppc");
  4035. CmdArgs.push_back("-many");
  4036. } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
  4037. CmdArgs.push_back("-a64");
  4038. CmdArgs.push_back("-mppc64");
  4039. CmdArgs.push_back("-many");
  4040. } else if (getToolChain().getArch() == llvm::Triple::arm) {
  4041. StringRef MArch = getToolChain().getArchName();
  4042. if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
  4043. CmdArgs.push_back("-mfpu=neon");
  4044. } else if (getToolChain().getArch() == llvm::Triple::mips ||
  4045. getToolChain().getArch() == llvm::Triple::mipsel ||
  4046. getToolChain().getArch() == llvm::Triple::mips64 ||
  4047. getToolChain().getArch() == llvm::Triple::mips64el) {
  4048. // Get Mips CPU name and pass it to 'as'.
  4049. const char *CPUName;
  4050. if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
  4051. CPUName = A->getValue(Args);
  4052. else
  4053. CPUName = getMipsCPUFromArch(getToolChain().getArchName());
  4054. if (CPUName) {
  4055. CmdArgs.push_back("-march");
  4056. CmdArgs.push_back(CPUName);
  4057. }
  4058. }
  4059. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  4060. options::OPT_Xassembler);
  4061. CmdArgs.push_back("-o");
  4062. CmdArgs.push_back(Output.getFilename());
  4063. for (InputInfoList::const_iterator
  4064. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  4065. const InputInfo &II = *it;
  4066. CmdArgs.push_back(II.getFilename());
  4067. }
  4068. const char *Exec =
  4069. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  4070. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4071. }
  4072. static void AddLibgcc(const Driver &D, ArgStringList &CmdArgs,
  4073. const ArgList &Args) {
  4074. bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
  4075. Args.hasArg(options::OPT_static_libgcc);
  4076. if (!D.CCCIsCXX)
  4077. CmdArgs.push_back("-lgcc");
  4078. if (StaticLibgcc) {
  4079. if (D.CCCIsCXX)
  4080. CmdArgs.push_back("-lgcc");
  4081. } else {
  4082. if (!D.CCCIsCXX)
  4083. CmdArgs.push_back("--as-needed");
  4084. CmdArgs.push_back("-lgcc_s");
  4085. if (!D.CCCIsCXX)
  4086. CmdArgs.push_back("--no-as-needed");
  4087. }
  4088. if (StaticLibgcc)
  4089. CmdArgs.push_back("-lgcc_eh");
  4090. else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
  4091. CmdArgs.push_back("-lgcc");
  4092. }
  4093. void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
  4094. const InputInfo &Output,
  4095. const InputInfoList &Inputs,
  4096. const ArgList &Args,
  4097. const char *LinkingOutput) const {
  4098. const toolchains::Linux& ToolChain =
  4099. static_cast<const toolchains::Linux&>(getToolChain());
  4100. const Driver &D = ToolChain.getDriver();
  4101. ArgStringList CmdArgs;
  4102. // Silence warning for "clang -g foo.o -o foo"
  4103. Args.ClaimAllArgs(options::OPT_g_Group);
  4104. // and "clang -emit-llvm foo.o -o foo"
  4105. Args.ClaimAllArgs(options::OPT_emit_llvm);
  4106. // and for "clang -g foo.o -o foo". Other warning options are already
  4107. // handled somewhere else.
  4108. Args.ClaimAllArgs(options::OPT_w);
  4109. if (!D.SysRoot.empty())
  4110. CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
  4111. if (Args.hasArg(options::OPT_pie))
  4112. CmdArgs.push_back("-pie");
  4113. if (Args.hasArg(options::OPT_rdynamic))
  4114. CmdArgs.push_back("-export-dynamic");
  4115. if (Args.hasArg(options::OPT_s))
  4116. CmdArgs.push_back("-s");
  4117. for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
  4118. e = ToolChain.ExtraOpts.end();
  4119. i != e; ++i)
  4120. CmdArgs.push_back(i->c_str());
  4121. if (!Args.hasArg(options::OPT_static)) {
  4122. CmdArgs.push_back("--eh-frame-hdr");
  4123. }
  4124. CmdArgs.push_back("-m");
  4125. if (ToolChain.getArch() == llvm::Triple::x86)
  4126. CmdArgs.push_back("elf_i386");
  4127. else if (ToolChain.getArch() == llvm::Triple::arm
  4128. || ToolChain.getArch() == llvm::Triple::thumb)
  4129. CmdArgs.push_back("armelf_linux_eabi");
  4130. else if (ToolChain.getArch() == llvm::Triple::ppc)
  4131. CmdArgs.push_back("elf32ppclinux");
  4132. else if (ToolChain.getArch() == llvm::Triple::ppc64)
  4133. CmdArgs.push_back("elf64ppc");
  4134. else if (ToolChain.getArch() == llvm::Triple::mips)
  4135. CmdArgs.push_back("elf32btsmip");
  4136. else if (ToolChain.getArch() == llvm::Triple::mipsel)
  4137. CmdArgs.push_back("elf32ltsmip");
  4138. else if (ToolChain.getArch() == llvm::Triple::mips64)
  4139. CmdArgs.push_back("elf64btsmip");
  4140. else if (ToolChain.getArch() == llvm::Triple::mips64el)
  4141. CmdArgs.push_back("elf64ltsmip");
  4142. else
  4143. CmdArgs.push_back("elf_x86_64");
  4144. if (Args.hasArg(options::OPT_static)) {
  4145. if (ToolChain.getArch() == llvm::Triple::arm
  4146. || ToolChain.getArch() == llvm::Triple::thumb)
  4147. CmdArgs.push_back("-Bstatic");
  4148. else
  4149. CmdArgs.push_back("-static");
  4150. } else if (Args.hasArg(options::OPT_shared)) {
  4151. CmdArgs.push_back("-shared");
  4152. }
  4153. if (ToolChain.getArch() == llvm::Triple::arm ||
  4154. ToolChain.getArch() == llvm::Triple::thumb ||
  4155. (!Args.hasArg(options::OPT_static) &&
  4156. !Args.hasArg(options::OPT_shared))) {
  4157. CmdArgs.push_back("-dynamic-linker");
  4158. if (ToolChain.getArch() == llvm::Triple::x86)
  4159. CmdArgs.push_back("/lib/ld-linux.so.2");
  4160. else if (ToolChain.getArch() == llvm::Triple::arm ||
  4161. ToolChain.getArch() == llvm::Triple::thumb)
  4162. CmdArgs.push_back("/lib/ld-linux.so.3");
  4163. else if (ToolChain.getArch() == llvm::Triple::mips ||
  4164. ToolChain.getArch() == llvm::Triple::mipsel)
  4165. CmdArgs.push_back("/lib/ld.so.1");
  4166. else if (ToolChain.getArch() == llvm::Triple::ppc)
  4167. CmdArgs.push_back("/lib/ld.so.1");
  4168. else if (ToolChain.getArch() == llvm::Triple::ppc64)
  4169. CmdArgs.push_back("/lib64/ld64.so.1");
  4170. else
  4171. CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
  4172. }
  4173. CmdArgs.push_back("-o");
  4174. CmdArgs.push_back(Output.getFilename());
  4175. if (!Args.hasArg(options::OPT_nostdlib) &&
  4176. !Args.hasArg(options::OPT_nostartfiles)) {
  4177. const char *crt1 = NULL;
  4178. if (!Args.hasArg(options::OPT_shared)){
  4179. if (Args.hasArg(options::OPT_pie))
  4180. crt1 = "Scrt1.o";
  4181. else
  4182. crt1 = "crt1.o";
  4183. }
  4184. if (crt1)
  4185. CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
  4186. CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
  4187. const char *crtbegin;
  4188. if (Args.hasArg(options::OPT_static))
  4189. crtbegin = "crtbeginT.o";
  4190. else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
  4191. crtbegin = "crtbeginS.o";
  4192. else
  4193. crtbegin = "crtbegin.o";
  4194. CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
  4195. }
  4196. Args.AddAllArgs(CmdArgs, options::OPT_L);
  4197. const ToolChain::path_list Paths = ToolChain.getFilePaths();
  4198. for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
  4199. i != e; ++i)
  4200. CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
  4201. AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
  4202. if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib)) {
  4203. bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  4204. !Args.hasArg(options::OPT_static);
  4205. if (OnlyLibstdcxxStatic)
  4206. CmdArgs.push_back("-Bstatic");
  4207. ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
  4208. if (OnlyLibstdcxxStatic)
  4209. CmdArgs.push_back("-Bdynamic");
  4210. CmdArgs.push_back("-lm");
  4211. }
  4212. // Call this before we add the C run-time.
  4213. addAsanRTLinux(getToolChain(), Args, CmdArgs);
  4214. if (!Args.hasArg(options::OPT_nostdlib)) {
  4215. if (Args.hasArg(options::OPT_static))
  4216. CmdArgs.push_back("--start-group");
  4217. AddLibgcc(D, CmdArgs, Args);
  4218. if (Args.hasArg(options::OPT_pthread) ||
  4219. Args.hasArg(options::OPT_pthreads))
  4220. CmdArgs.push_back("-lpthread");
  4221. CmdArgs.push_back("-lc");
  4222. if (Args.hasArg(options::OPT_static))
  4223. CmdArgs.push_back("--end-group");
  4224. else
  4225. AddLibgcc(D, CmdArgs, Args);
  4226. if (!Args.hasArg(options::OPT_nostartfiles)) {
  4227. const char *crtend;
  4228. if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
  4229. crtend = "crtendS.o";
  4230. else
  4231. crtend = "crtend.o";
  4232. CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
  4233. CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
  4234. }
  4235. }
  4236. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  4237. if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
  4238. CmdArgs.push_back("-plugin");
  4239. std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
  4240. CmdArgs.push_back(Args.MakeArgString(Plugin));
  4241. }
  4242. C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
  4243. }
  4244. void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  4245. const InputInfo &Output,
  4246. const InputInfoList &Inputs,
  4247. const ArgList &Args,
  4248. const char *LinkingOutput) const {
  4249. ArgStringList CmdArgs;
  4250. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  4251. options::OPT_Xassembler);
  4252. CmdArgs.push_back("-o");
  4253. CmdArgs.push_back(Output.getFilename());
  4254. for (InputInfoList::const_iterator
  4255. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  4256. const InputInfo &II = *it;
  4257. CmdArgs.push_back(II.getFilename());
  4258. }
  4259. const char *Exec =
  4260. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  4261. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4262. }
  4263. void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
  4264. const InputInfo &Output,
  4265. const InputInfoList &Inputs,
  4266. const ArgList &Args,
  4267. const char *LinkingOutput) const {
  4268. const Driver &D = getToolChain().getDriver();
  4269. ArgStringList CmdArgs;
  4270. if (Output.isFilename()) {
  4271. CmdArgs.push_back("-o");
  4272. CmdArgs.push_back(Output.getFilename());
  4273. } else {
  4274. assert(Output.isNothing() && "Invalid output.");
  4275. }
  4276. if (!Args.hasArg(options::OPT_nostdlib) &&
  4277. !Args.hasArg(options::OPT_nostartfiles)) {
  4278. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
  4279. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
  4280. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
  4281. CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
  4282. }
  4283. Args.AddAllArgs(CmdArgs, options::OPT_L);
  4284. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  4285. Args.AddAllArgs(CmdArgs, options::OPT_e);
  4286. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  4287. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  4288. if (!Args.hasArg(options::OPT_nostdlib) &&
  4289. !Args.hasArg(options::OPT_nodefaultlibs)) {
  4290. if (D.CCCIsCXX) {
  4291. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  4292. CmdArgs.push_back("-lm");
  4293. }
  4294. }
  4295. if (!Args.hasArg(options::OPT_nostdlib) &&
  4296. !Args.hasArg(options::OPT_nostartfiles)) {
  4297. if (Args.hasArg(options::OPT_pthread))
  4298. CmdArgs.push_back("-lpthread");
  4299. CmdArgs.push_back("-lc");
  4300. CmdArgs.push_back("-lCompilerRT-Generic");
  4301. CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
  4302. CmdArgs.push_back(
  4303. Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
  4304. }
  4305. const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  4306. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4307. }
  4308. /// DragonFly Tools
  4309. // For now, DragonFly Assemble does just about the same as for
  4310. // FreeBSD, but this may change soon.
  4311. void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
  4312. const InputInfo &Output,
  4313. const InputInfoList &Inputs,
  4314. const ArgList &Args,
  4315. const char *LinkingOutput) const {
  4316. ArgStringList CmdArgs;
  4317. // When building 32-bit code on DragonFly/pc64, we have to explicitly
  4318. // instruct as in the base system to assemble 32-bit code.
  4319. if (getToolChain().getArchName() == "i386")
  4320. CmdArgs.push_back("--32");
  4321. Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
  4322. options::OPT_Xassembler);
  4323. CmdArgs.push_back("-o");
  4324. CmdArgs.push_back(Output.getFilename());
  4325. for (InputInfoList::const_iterator
  4326. it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
  4327. const InputInfo &II = *it;
  4328. CmdArgs.push_back(II.getFilename());
  4329. }
  4330. const char *Exec =
  4331. Args.MakeArgString(getToolChain().GetProgramPath("as"));
  4332. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4333. }
  4334. void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
  4335. const InputInfo &Output,
  4336. const InputInfoList &Inputs,
  4337. const ArgList &Args,
  4338. const char *LinkingOutput) const {
  4339. const Driver &D = getToolChain().getDriver();
  4340. ArgStringList CmdArgs;
  4341. if (!D.SysRoot.empty())
  4342. CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
  4343. if (Args.hasArg(options::OPT_static)) {
  4344. CmdArgs.push_back("-Bstatic");
  4345. } else {
  4346. if (Args.hasArg(options::OPT_shared))
  4347. CmdArgs.push_back("-Bshareable");
  4348. else {
  4349. CmdArgs.push_back("-dynamic-linker");
  4350. CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
  4351. }
  4352. }
  4353. // When building 32-bit code on DragonFly/pc64, we have to explicitly
  4354. // instruct ld in the base system to link 32-bit code.
  4355. if (getToolChain().getArchName() == "i386") {
  4356. CmdArgs.push_back("-m");
  4357. CmdArgs.push_back("elf_i386");
  4358. }
  4359. if (Output.isFilename()) {
  4360. CmdArgs.push_back("-o");
  4361. CmdArgs.push_back(Output.getFilename());
  4362. } else {
  4363. assert(Output.isNothing() && "Invalid output.");
  4364. }
  4365. if (!Args.hasArg(options::OPT_nostdlib) &&
  4366. !Args.hasArg(options::OPT_nostartfiles)) {
  4367. if (!Args.hasArg(options::OPT_shared)) {
  4368. CmdArgs.push_back(
  4369. Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
  4370. CmdArgs.push_back(
  4371. Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
  4372. CmdArgs.push_back(
  4373. Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
  4374. } else {
  4375. CmdArgs.push_back(
  4376. Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
  4377. CmdArgs.push_back(
  4378. Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
  4379. }
  4380. }
  4381. Args.AddAllArgs(CmdArgs, options::OPT_L);
  4382. Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
  4383. Args.AddAllArgs(CmdArgs, options::OPT_e);
  4384. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  4385. if (!Args.hasArg(options::OPT_nostdlib) &&
  4386. !Args.hasArg(options::OPT_nodefaultlibs)) {
  4387. // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
  4388. // rpaths
  4389. CmdArgs.push_back("-L/usr/lib/gcc41");
  4390. if (!Args.hasArg(options::OPT_static)) {
  4391. CmdArgs.push_back("-rpath");
  4392. CmdArgs.push_back("/usr/lib/gcc41");
  4393. CmdArgs.push_back("-rpath-link");
  4394. CmdArgs.push_back("/usr/lib/gcc41");
  4395. CmdArgs.push_back("-rpath");
  4396. CmdArgs.push_back("/usr/lib");
  4397. CmdArgs.push_back("-rpath-link");
  4398. CmdArgs.push_back("/usr/lib");
  4399. }
  4400. if (D.CCCIsCXX) {
  4401. getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
  4402. CmdArgs.push_back("-lm");
  4403. }
  4404. if (Args.hasArg(options::OPT_shared)) {
  4405. CmdArgs.push_back("-lgcc_pic");
  4406. } else {
  4407. CmdArgs.push_back("-lgcc");
  4408. }
  4409. if (Args.hasArg(options::OPT_pthread))
  4410. CmdArgs.push_back("-lpthread");
  4411. if (!Args.hasArg(options::OPT_nolibc)) {
  4412. CmdArgs.push_back("-lc");
  4413. }
  4414. if (Args.hasArg(options::OPT_shared)) {
  4415. CmdArgs.push_back("-lgcc_pic");
  4416. } else {
  4417. CmdArgs.push_back("-lgcc");
  4418. }
  4419. }
  4420. if (!Args.hasArg(options::OPT_nostdlib) &&
  4421. !Args.hasArg(options::OPT_nostartfiles)) {
  4422. if (!Args.hasArg(options::OPT_shared))
  4423. CmdArgs.push_back(Args.MakeArgString(
  4424. getToolChain().GetFilePath("crtend.o")));
  4425. else
  4426. CmdArgs.push_back(Args.MakeArgString(
  4427. getToolChain().GetFilePath("crtendS.o")));
  4428. CmdArgs.push_back(Args.MakeArgString(
  4429. getToolChain().GetFilePath("crtn.o")));
  4430. }
  4431. addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
  4432. const char *Exec =
  4433. Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  4434. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4435. }
  4436. void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
  4437. const InputInfo &Output,
  4438. const InputInfoList &Inputs,
  4439. const ArgList &Args,
  4440. const char *LinkingOutput) const {
  4441. ArgStringList CmdArgs;
  4442. if (Output.isFilename()) {
  4443. CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
  4444. Output.getFilename()));
  4445. } else {
  4446. assert(Output.isNothing() && "Invalid output.");
  4447. }
  4448. if (!Args.hasArg(options::OPT_nostdlib) &&
  4449. !Args.hasArg(options::OPT_nostartfiles)) {
  4450. CmdArgs.push_back("-defaultlib:libcmt");
  4451. }
  4452. CmdArgs.push_back("-nologo");
  4453. AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
  4454. const char *Exec =
  4455. Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
  4456. C.addCommand(new Command(JA, *this, Exec, CmdArgs));
  4457. }