MemorySanitizer.cpp 219 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763
  1. //===- MemorySanitizer.cpp - detector of uninitialized reads --------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. /// \file
  10. /// This file is a part of MemorySanitizer, a detector of uninitialized
  11. /// reads.
  12. ///
  13. /// The algorithm of the tool is similar to Memcheck
  14. /// (http://goo.gl/QKbem). We associate a few shadow bits with every
  15. /// byte of the application memory, poison the shadow of the malloc-ed
  16. /// or alloca-ed memory, load the shadow bits on every memory read,
  17. /// propagate the shadow bits through some of the arithmetic
  18. /// instruction (including MOV), store the shadow bits on every memory
  19. /// write, report a bug on some other instructions (e.g. JMP) if the
  20. /// associated shadow is poisoned.
  21. ///
  22. /// But there are differences too. The first and the major one:
  23. /// compiler instrumentation instead of binary instrumentation. This
  24. /// gives us much better register allocation, possible compiler
  25. /// optimizations and a fast start-up. But this brings the major issue
  26. /// as well: msan needs to see all program events, including system
  27. /// calls and reads/writes in system libraries, so we either need to
  28. /// compile *everything* with msan or use a binary translation
  29. /// component (e.g. DynamoRIO) to instrument pre-built libraries.
  30. /// Another difference from Memcheck is that we use 8 shadow bits per
  31. /// byte of application memory and use a direct shadow mapping. This
  32. /// greatly simplifies the instrumentation code and avoids races on
  33. /// shadow updates (Memcheck is single-threaded so races are not a
  34. /// concern there. Memcheck uses 2 shadow bits per byte with a slow
  35. /// path storage that uses 8 bits per byte).
  36. ///
  37. /// The default value of shadow is 0, which means "clean" (not poisoned).
  38. ///
  39. /// Every module initializer should call __msan_init to ensure that the
  40. /// shadow memory is ready. On error, __msan_warning is called. Since
  41. /// parameters and return values may be passed via registers, we have a
  42. /// specialized thread-local shadow for return values
  43. /// (__msan_retval_tls) and parameters (__msan_param_tls).
  44. ///
  45. /// Origin tracking.
  46. ///
  47. /// MemorySanitizer can track origins (allocation points) of all uninitialized
  48. /// values. This behavior is controlled with a flag (msan-track-origins) and is
  49. /// disabled by default.
  50. ///
  51. /// Origins are 4-byte values created and interpreted by the runtime library.
  52. /// They are stored in a second shadow mapping, one 4-byte value for 4 bytes
  53. /// of application memory. Propagation of origins is basically a bunch of
  54. /// "select" instructions that pick the origin of a dirty argument, if an
  55. /// instruction has one.
  56. ///
  57. /// Every 4 aligned, consecutive bytes of application memory have one origin
  58. /// value associated with them. If these bytes contain uninitialized data
  59. /// coming from 2 different allocations, the last store wins. Because of this,
  60. /// MemorySanitizer reports can show unrelated origins, but this is unlikely in
  61. /// practice.
  62. ///
  63. /// Origins are meaningless for fully initialized values, so MemorySanitizer
  64. /// avoids storing origin to memory when a fully initialized value is stored.
  65. /// This way it avoids needless overwriting origin of the 4-byte region on
  66. /// a short (i.e. 1 byte) clean store, and it is also good for performance.
  67. ///
  68. /// Atomic handling.
  69. ///
  70. /// Ideally, every atomic store of application value should update the
  71. /// corresponding shadow location in an atomic way. Unfortunately, atomic store
  72. /// of two disjoint locations can not be done without severe slowdown.
  73. ///
  74. /// Therefore, we implement an approximation that may err on the safe side.
  75. /// In this implementation, every atomically accessed location in the program
  76. /// may only change from (partially) uninitialized to fully initialized, but
  77. /// not the other way around. We load the shadow _after_ the application load,
  78. /// and we store the shadow _before_ the app store. Also, we always store clean
  79. /// shadow (if the application store is atomic). This way, if the store-load
  80. /// pair constitutes a happens-before arc, shadow store and load are correctly
  81. /// ordered such that the load will get either the value that was stored, or
  82. /// some later value (which is always clean).
  83. ///
  84. /// This does not work very well with Compare-And-Swap (CAS) and
  85. /// Read-Modify-Write (RMW) operations. To follow the above logic, CAS and RMW
  86. /// must store the new shadow before the app operation, and load the shadow
  87. /// after the app operation. Computers don't work this way. Current
  88. /// implementation ignores the load aspect of CAS/RMW, always returning a clean
  89. /// value. It implements the store part as a simple atomic store by storing a
  90. /// clean shadow.
  91. ///
  92. /// Instrumenting inline assembly.
  93. ///
  94. /// For inline assembly code LLVM has little idea about which memory locations
  95. /// become initialized depending on the arguments. It can be possible to figure
  96. /// out which arguments are meant to point to inputs and outputs, but the
  97. /// actual semantics can be only visible at runtime. In the Linux kernel it's
  98. /// also possible that the arguments only indicate the offset for a base taken
  99. /// from a segment register, so it's dangerous to treat any asm() arguments as
  100. /// pointers. We take a conservative approach generating calls to
  101. /// __msan_instrument_asm_store(ptr, size)
  102. /// , which defer the memory unpoisoning to the runtime library.
  103. /// The latter can perform more complex address checks to figure out whether
  104. /// it's safe to touch the shadow memory.
  105. /// Like with atomic operations, we call __msan_instrument_asm_store() before
  106. /// the assembly call, so that changes to the shadow memory will be seen by
  107. /// other threads together with main memory initialization.
  108. ///
  109. /// KernelMemorySanitizer (KMSAN) implementation.
  110. ///
  111. /// The major differences between KMSAN and MSan instrumentation are:
  112. /// - KMSAN always tracks the origins and implies msan-keep-going=true;
  113. /// - KMSAN allocates shadow and origin memory for each page separately, so
  114. /// there are no explicit accesses to shadow and origin in the
  115. /// instrumentation.
  116. /// Shadow and origin values for a particular X-byte memory location
  117. /// (X=1,2,4,8) are accessed through pointers obtained via the
  118. /// __msan_metadata_ptr_for_load_X(ptr)
  119. /// __msan_metadata_ptr_for_store_X(ptr)
  120. /// functions. The corresponding functions check that the X-byte accesses
  121. /// are possible and returns the pointers to shadow and origin memory.
  122. /// Arbitrary sized accesses are handled with:
  123. /// __msan_metadata_ptr_for_load_n(ptr, size)
  124. /// __msan_metadata_ptr_for_store_n(ptr, size);
  125. /// - TLS variables are stored in a single per-task struct. A call to a
  126. /// function __msan_get_context_state() returning a pointer to that struct
  127. /// is inserted into every instrumented function before the entry block;
  128. /// - __msan_warning() takes a 32-bit origin parameter;
  129. /// - local variables are poisoned with __msan_poison_alloca() upon function
  130. /// entry and unpoisoned with __msan_unpoison_alloca() before leaving the
  131. /// function;
  132. /// - the pass doesn't declare any global variables or add global constructors
  133. /// to the translation unit.
  134. ///
  135. /// Also, KMSAN currently ignores uninitialized memory passed into inline asm
  136. /// calls, making sure we're on the safe side wrt. possible false positives.
  137. ///
  138. /// KernelMemorySanitizer only supports X86_64 at the moment.
  139. ///
  140. //
  141. // FIXME: This sanitizer does not yet handle scalable vectors
  142. //
  143. //===----------------------------------------------------------------------===//
  144. #include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
  145. #include "llvm/ADT/APInt.h"
  146. #include "llvm/ADT/ArrayRef.h"
  147. #include "llvm/ADT/DenseMap.h"
  148. #include "llvm/ADT/DepthFirstIterator.h"
  149. #include "llvm/ADT/SetVector.h"
  150. #include "llvm/ADT/SmallString.h"
  151. #include "llvm/ADT/SmallVector.h"
  152. #include "llvm/ADT/StringExtras.h"
  153. #include "llvm/ADT/StringRef.h"
  154. #include "llvm/ADT/Triple.h"
  155. #include "llvm/Analysis/GlobalsModRef.h"
  156. #include "llvm/Analysis/TargetLibraryInfo.h"
  157. #include "llvm/Analysis/ValueTracking.h"
  158. #include "llvm/IR/Argument.h"
  159. #include "llvm/IR/Attributes.h"
  160. #include "llvm/IR/BasicBlock.h"
  161. #include "llvm/IR/CallingConv.h"
  162. #include "llvm/IR/Constant.h"
  163. #include "llvm/IR/Constants.h"
  164. #include "llvm/IR/DataLayout.h"
  165. #include "llvm/IR/DerivedTypes.h"
  166. #include "llvm/IR/Function.h"
  167. #include "llvm/IR/GlobalValue.h"
  168. #include "llvm/IR/GlobalVariable.h"
  169. #include "llvm/IR/IRBuilder.h"
  170. #include "llvm/IR/InlineAsm.h"
  171. #include "llvm/IR/InstVisitor.h"
  172. #include "llvm/IR/InstrTypes.h"
  173. #include "llvm/IR/Instruction.h"
  174. #include "llvm/IR/Instructions.h"
  175. #include "llvm/IR/IntrinsicInst.h"
  176. #include "llvm/IR/Intrinsics.h"
  177. #include "llvm/IR/IntrinsicsX86.h"
  178. #include "llvm/IR/MDBuilder.h"
  179. #include "llvm/IR/Module.h"
  180. #include "llvm/IR/Type.h"
  181. #include "llvm/IR/Value.h"
  182. #include "llvm/IR/ValueMap.h"
  183. #include "llvm/Support/Alignment.h"
  184. #include "llvm/Support/AtomicOrdering.h"
  185. #include "llvm/Support/Casting.h"
  186. #include "llvm/Support/CommandLine.h"
  187. #include "llvm/Support/Debug.h"
  188. #include "llvm/Support/DebugCounter.h"
  189. #include "llvm/Support/ErrorHandling.h"
  190. #include "llvm/Support/MathExtras.h"
  191. #include "llvm/Support/raw_ostream.h"
  192. #include "llvm/Transforms/Utils/BasicBlockUtils.h"
  193. #include "llvm/Transforms/Utils/Local.h"
  194. #include "llvm/Transforms/Utils/ModuleUtils.h"
  195. #include <algorithm>
  196. #include <cassert>
  197. #include <cstddef>
  198. #include <cstdint>
  199. #include <memory>
  200. #include <string>
  201. #include <tuple>
  202. using namespace llvm;
  203. #define DEBUG_TYPE "msan"
  204. DEBUG_COUNTER(DebugInsertCheck, "msan-insert-check",
  205. "Controls which checks to insert");
  206. static const unsigned kOriginSize = 4;
  207. static const Align kMinOriginAlignment = Align(4);
  208. static const Align kShadowTLSAlignment = Align(8);
  209. // These constants must be kept in sync with the ones in msan.h.
  210. static const unsigned kParamTLSSize = 800;
  211. static const unsigned kRetvalTLSSize = 800;
  212. // Accesses sizes are powers of two: 1, 2, 4, 8.
  213. static const size_t kNumberOfAccessSizes = 4;
  214. /// Track origins of uninitialized values.
  215. ///
  216. /// Adds a section to MemorySanitizer report that points to the allocation
  217. /// (stack or heap) the uninitialized bits came from originally.
  218. static cl::opt<int> ClTrackOrigins(
  219. "msan-track-origins",
  220. cl::desc("Track origins (allocation sites) of poisoned memory"), cl::Hidden,
  221. cl::init(0));
  222. static cl::opt<bool> ClKeepGoing("msan-keep-going",
  223. cl::desc("keep going after reporting a UMR"),
  224. cl::Hidden, cl::init(false));
  225. static cl::opt<bool>
  226. ClPoisonStack("msan-poison-stack",
  227. cl::desc("poison uninitialized stack variables"), cl::Hidden,
  228. cl::init(true));
  229. static cl::opt<bool> ClPoisonStackWithCall(
  230. "msan-poison-stack-with-call",
  231. cl::desc("poison uninitialized stack variables with a call"), cl::Hidden,
  232. cl::init(false));
  233. static cl::opt<int> ClPoisonStackPattern(
  234. "msan-poison-stack-pattern",
  235. cl::desc("poison uninitialized stack variables with the given pattern"),
  236. cl::Hidden, cl::init(0xff));
  237. static cl::opt<bool>
  238. ClPrintStackNames("msan-print-stack-names",
  239. cl::desc("Print name of local stack variable"),
  240. cl::Hidden, cl::init(true));
  241. static cl::opt<bool> ClPoisonUndef("msan-poison-undef",
  242. cl::desc("poison undef temps"), cl::Hidden,
  243. cl::init(true));
  244. static cl::opt<bool>
  245. ClHandleICmp("msan-handle-icmp",
  246. cl::desc("propagate shadow through ICmpEQ and ICmpNE"),
  247. cl::Hidden, cl::init(true));
  248. static cl::opt<bool>
  249. ClHandleICmpExact("msan-handle-icmp-exact",
  250. cl::desc("exact handling of relational integer ICmp"),
  251. cl::Hidden, cl::init(false));
  252. static cl::opt<bool> ClHandleLifetimeIntrinsics(
  253. "msan-handle-lifetime-intrinsics",
  254. cl::desc(
  255. "when possible, poison scoped variables at the beginning of the scope "
  256. "(slower, but more precise)"),
  257. cl::Hidden, cl::init(true));
  258. // When compiling the Linux kernel, we sometimes see false positives related to
  259. // MSan being unable to understand that inline assembly calls may initialize
  260. // local variables.
  261. // This flag makes the compiler conservatively unpoison every memory location
  262. // passed into an assembly call. Note that this may cause false positives.
  263. // Because it's impossible to figure out the array sizes, we can only unpoison
  264. // the first sizeof(type) bytes for each type* pointer.
  265. // The instrumentation is only enabled in KMSAN builds, and only if
  266. // -msan-handle-asm-conservative is on. This is done because we may want to
  267. // quickly disable assembly instrumentation when it breaks.
  268. static cl::opt<bool> ClHandleAsmConservative(
  269. "msan-handle-asm-conservative",
  270. cl::desc("conservative handling of inline assembly"), cl::Hidden,
  271. cl::init(true));
  272. // This flag controls whether we check the shadow of the address
  273. // operand of load or store. Such bugs are very rare, since load from
  274. // a garbage address typically results in SEGV, but still happen
  275. // (e.g. only lower bits of address are garbage, or the access happens
  276. // early at program startup where malloc-ed memory is more likely to
  277. // be zeroed. As of 2012-08-28 this flag adds 20% slowdown.
  278. static cl::opt<bool> ClCheckAccessAddress(
  279. "msan-check-access-address",
  280. cl::desc("report accesses through a pointer which has poisoned shadow"),
  281. cl::Hidden, cl::init(true));
  282. static cl::opt<bool> ClEagerChecks(
  283. "msan-eager-checks",
  284. cl::desc("check arguments and return values at function call boundaries"),
  285. cl::Hidden, cl::init(false));
  286. static cl::opt<bool> ClDumpStrictInstructions(
  287. "msan-dump-strict-instructions",
  288. cl::desc("print out instructions with default strict semantics"),
  289. cl::Hidden, cl::init(false));
  290. static cl::opt<int> ClInstrumentationWithCallThreshold(
  291. "msan-instrumentation-with-call-threshold",
  292. cl::desc(
  293. "If the function being instrumented requires more than "
  294. "this number of checks and origin stores, use callbacks instead of "
  295. "inline checks (-1 means never use callbacks)."),
  296. cl::Hidden, cl::init(3500));
  297. static cl::opt<bool>
  298. ClEnableKmsan("msan-kernel",
  299. cl::desc("Enable KernelMemorySanitizer instrumentation"),
  300. cl::Hidden, cl::init(false));
  301. static cl::opt<bool>
  302. ClDisableChecks("msan-disable-checks",
  303. cl::desc("Apply no_sanitize to the whole file"), cl::Hidden,
  304. cl::init(false));
  305. static cl::opt<bool>
  306. ClCheckConstantShadow("msan-check-constant-shadow",
  307. cl::desc("Insert checks for constant shadow values"),
  308. cl::Hidden, cl::init(true));
  309. // This is off by default because of a bug in gold:
  310. // https://sourceware.org/bugzilla/show_bug.cgi?id=19002
  311. static cl::opt<bool>
  312. ClWithComdat("msan-with-comdat",
  313. cl::desc("Place MSan constructors in comdat sections"),
  314. cl::Hidden, cl::init(false));
  315. // These options allow to specify custom memory map parameters
  316. // See MemoryMapParams for details.
  317. static cl::opt<uint64_t> ClAndMask("msan-and-mask",
  318. cl::desc("Define custom MSan AndMask"),
  319. cl::Hidden, cl::init(0));
  320. static cl::opt<uint64_t> ClXorMask("msan-xor-mask",
  321. cl::desc("Define custom MSan XorMask"),
  322. cl::Hidden, cl::init(0));
  323. static cl::opt<uint64_t> ClShadowBase("msan-shadow-base",
  324. cl::desc("Define custom MSan ShadowBase"),
  325. cl::Hidden, cl::init(0));
  326. static cl::opt<uint64_t> ClOriginBase("msan-origin-base",
  327. cl::desc("Define custom MSan OriginBase"),
  328. cl::Hidden, cl::init(0));
  329. static cl::opt<int>
  330. ClDisambiguateWarning("msan-disambiguate-warning-threshold",
  331. cl::desc("Define threshold for number of checks per "
  332. "debug location to force origin update."),
  333. cl::Hidden, cl::init(3));
  334. const char kMsanModuleCtorName[] = "msan.module_ctor";
  335. const char kMsanInitName[] = "__msan_init";
  336. namespace {
  337. // Memory map parameters used in application-to-shadow address calculation.
  338. // Offset = (Addr & ~AndMask) ^ XorMask
  339. // Shadow = ShadowBase + Offset
  340. // Origin = OriginBase + Offset
  341. struct MemoryMapParams {
  342. uint64_t AndMask;
  343. uint64_t XorMask;
  344. uint64_t ShadowBase;
  345. uint64_t OriginBase;
  346. };
  347. struct PlatformMemoryMapParams {
  348. const MemoryMapParams *bits32;
  349. const MemoryMapParams *bits64;
  350. };
  351. } // end anonymous namespace
  352. // i386 Linux
  353. static const MemoryMapParams Linux_I386_MemoryMapParams = {
  354. 0x000080000000, // AndMask
  355. 0, // XorMask (not used)
  356. 0, // ShadowBase (not used)
  357. 0x000040000000, // OriginBase
  358. };
  359. // x86_64 Linux
  360. static const MemoryMapParams Linux_X86_64_MemoryMapParams = {
  361. 0, // AndMask (not used)
  362. 0x500000000000, // XorMask
  363. 0, // ShadowBase (not used)
  364. 0x100000000000, // OriginBase
  365. };
  366. // mips64 Linux
  367. static const MemoryMapParams Linux_MIPS64_MemoryMapParams = {
  368. 0, // AndMask (not used)
  369. 0x008000000000, // XorMask
  370. 0, // ShadowBase (not used)
  371. 0x002000000000, // OriginBase
  372. };
  373. // ppc64 Linux
  374. static const MemoryMapParams Linux_PowerPC64_MemoryMapParams = {
  375. 0xE00000000000, // AndMask
  376. 0x100000000000, // XorMask
  377. 0x080000000000, // ShadowBase
  378. 0x1C0000000000, // OriginBase
  379. };
  380. // s390x Linux
  381. static const MemoryMapParams Linux_S390X_MemoryMapParams = {
  382. 0xC00000000000, // AndMask
  383. 0, // XorMask (not used)
  384. 0x080000000000, // ShadowBase
  385. 0x1C0000000000, // OriginBase
  386. };
  387. // aarch64 Linux
  388. static const MemoryMapParams Linux_AArch64_MemoryMapParams = {
  389. 0, // AndMask (not used)
  390. 0x0B00000000000, // XorMask
  391. 0, // ShadowBase (not used)
  392. 0x0200000000000, // OriginBase
  393. };
  394. // aarch64 FreeBSD
  395. static const MemoryMapParams FreeBSD_AArch64_MemoryMapParams = {
  396. 0x1800000000000, // AndMask
  397. 0x0400000000000, // XorMask
  398. 0x0200000000000, // ShadowBase
  399. 0x0700000000000, // OriginBase
  400. };
  401. // i386 FreeBSD
  402. static const MemoryMapParams FreeBSD_I386_MemoryMapParams = {
  403. 0x000180000000, // AndMask
  404. 0x000040000000, // XorMask
  405. 0x000020000000, // ShadowBase
  406. 0x000700000000, // OriginBase
  407. };
  408. // x86_64 FreeBSD
  409. static const MemoryMapParams FreeBSD_X86_64_MemoryMapParams = {
  410. 0xc00000000000, // AndMask
  411. 0x200000000000, // XorMask
  412. 0x100000000000, // ShadowBase
  413. 0x380000000000, // OriginBase
  414. };
  415. // x86_64 NetBSD
  416. static const MemoryMapParams NetBSD_X86_64_MemoryMapParams = {
  417. 0, // AndMask
  418. 0x500000000000, // XorMask
  419. 0, // ShadowBase
  420. 0x100000000000, // OriginBase
  421. };
  422. static const PlatformMemoryMapParams Linux_X86_MemoryMapParams = {
  423. &Linux_I386_MemoryMapParams,
  424. &Linux_X86_64_MemoryMapParams,
  425. };
  426. static const PlatformMemoryMapParams Linux_MIPS_MemoryMapParams = {
  427. nullptr,
  428. &Linux_MIPS64_MemoryMapParams,
  429. };
  430. static const PlatformMemoryMapParams Linux_PowerPC_MemoryMapParams = {
  431. nullptr,
  432. &Linux_PowerPC64_MemoryMapParams,
  433. };
  434. static const PlatformMemoryMapParams Linux_S390_MemoryMapParams = {
  435. nullptr,
  436. &Linux_S390X_MemoryMapParams,
  437. };
  438. static const PlatformMemoryMapParams Linux_ARM_MemoryMapParams = {
  439. nullptr,
  440. &Linux_AArch64_MemoryMapParams,
  441. };
  442. static const PlatformMemoryMapParams FreeBSD_ARM_MemoryMapParams = {
  443. nullptr,
  444. &FreeBSD_AArch64_MemoryMapParams,
  445. };
  446. static const PlatformMemoryMapParams FreeBSD_X86_MemoryMapParams = {
  447. &FreeBSD_I386_MemoryMapParams,
  448. &FreeBSD_X86_64_MemoryMapParams,
  449. };
  450. static const PlatformMemoryMapParams NetBSD_X86_MemoryMapParams = {
  451. nullptr,
  452. &NetBSD_X86_64_MemoryMapParams,
  453. };
  454. namespace {
  455. /// Instrument functions of a module to detect uninitialized reads.
  456. ///
  457. /// Instantiating MemorySanitizer inserts the msan runtime library API function
  458. /// declarations into the module if they don't exist already. Instantiating
  459. /// ensures the __msan_init function is in the list of global constructors for
  460. /// the module.
  461. class MemorySanitizer {
  462. public:
  463. MemorySanitizer(Module &M, MemorySanitizerOptions Options)
  464. : CompileKernel(Options.Kernel), TrackOrigins(Options.TrackOrigins),
  465. Recover(Options.Recover), EagerChecks(Options.EagerChecks) {
  466. initializeModule(M);
  467. }
  468. // MSan cannot be moved or copied because of MapParams.
  469. MemorySanitizer(MemorySanitizer &&) = delete;
  470. MemorySanitizer &operator=(MemorySanitizer &&) = delete;
  471. MemorySanitizer(const MemorySanitizer &) = delete;
  472. MemorySanitizer &operator=(const MemorySanitizer &) = delete;
  473. bool sanitizeFunction(Function &F, TargetLibraryInfo &TLI);
  474. private:
  475. friend struct MemorySanitizerVisitor;
  476. friend struct VarArgAMD64Helper;
  477. friend struct VarArgMIPS64Helper;
  478. friend struct VarArgAArch64Helper;
  479. friend struct VarArgPowerPC64Helper;
  480. friend struct VarArgSystemZHelper;
  481. void initializeModule(Module &M);
  482. void initializeCallbacks(Module &M, const TargetLibraryInfo &TLI);
  483. void createKernelApi(Module &M, const TargetLibraryInfo &TLI);
  484. void createUserspaceApi(Module &M, const TargetLibraryInfo &TLI);
  485. /// True if we're compiling the Linux kernel.
  486. bool CompileKernel;
  487. /// Track origins (allocation points) of uninitialized values.
  488. int TrackOrigins;
  489. bool Recover;
  490. bool EagerChecks;
  491. LLVMContext *C;
  492. Type *IntptrTy;
  493. Type *OriginTy;
  494. // XxxTLS variables represent the per-thread state in MSan and per-task state
  495. // in KMSAN.
  496. // For the userspace these point to thread-local globals. In the kernel land
  497. // they point to the members of a per-task struct obtained via a call to
  498. // __msan_get_context_state().
  499. /// Thread-local shadow storage for function parameters.
  500. Value *ParamTLS;
  501. /// Thread-local origin storage for function parameters.
  502. Value *ParamOriginTLS;
  503. /// Thread-local shadow storage for function return value.
  504. Value *RetvalTLS;
  505. /// Thread-local origin storage for function return value.
  506. Value *RetvalOriginTLS;
  507. /// Thread-local shadow storage for in-register va_arg function
  508. /// parameters (x86_64-specific).
  509. Value *VAArgTLS;
  510. /// Thread-local shadow storage for in-register va_arg function
  511. /// parameters (x86_64-specific).
  512. Value *VAArgOriginTLS;
  513. /// Thread-local shadow storage for va_arg overflow area
  514. /// (x86_64-specific).
  515. Value *VAArgOverflowSizeTLS;
  516. /// Are the instrumentation callbacks set up?
  517. bool CallbacksInitialized = false;
  518. /// The run-time callback to print a warning.
  519. FunctionCallee WarningFn;
  520. // These arrays are indexed by log2(AccessSize).
  521. FunctionCallee MaybeWarningFn[kNumberOfAccessSizes];
  522. FunctionCallee MaybeStoreOriginFn[kNumberOfAccessSizes];
  523. /// Run-time helper that generates a new origin value for a stack
  524. /// allocation.
  525. FunctionCallee MsanSetAllocaOriginWithDescriptionFn;
  526. // No description version
  527. FunctionCallee MsanSetAllocaOriginNoDescriptionFn;
  528. /// Run-time helper that poisons stack on function entry.
  529. FunctionCallee MsanPoisonStackFn;
  530. /// Run-time helper that records a store (or any event) of an
  531. /// uninitialized value and returns an updated origin id encoding this info.
  532. FunctionCallee MsanChainOriginFn;
  533. /// Run-time helper that paints an origin over a region.
  534. FunctionCallee MsanSetOriginFn;
  535. /// MSan runtime replacements for memmove, memcpy and memset.
  536. FunctionCallee MemmoveFn, MemcpyFn, MemsetFn;
  537. /// KMSAN callback for task-local function argument shadow.
  538. StructType *MsanContextStateTy;
  539. FunctionCallee MsanGetContextStateFn;
  540. /// Functions for poisoning/unpoisoning local variables
  541. FunctionCallee MsanPoisonAllocaFn, MsanUnpoisonAllocaFn;
  542. /// Each of the MsanMetadataPtrXxx functions returns a pair of shadow/origin
  543. /// pointers.
  544. FunctionCallee MsanMetadataPtrForLoadN, MsanMetadataPtrForStoreN;
  545. FunctionCallee MsanMetadataPtrForLoad_1_8[4];
  546. FunctionCallee MsanMetadataPtrForStore_1_8[4];
  547. FunctionCallee MsanInstrumentAsmStoreFn;
  548. /// Helper to choose between different MsanMetadataPtrXxx().
  549. FunctionCallee getKmsanShadowOriginAccessFn(bool isStore, int size);
  550. /// Memory map parameters used in application-to-shadow calculation.
  551. const MemoryMapParams *MapParams;
  552. /// Custom memory map parameters used when -msan-shadow-base or
  553. // -msan-origin-base is provided.
  554. MemoryMapParams CustomMapParams;
  555. MDNode *ColdCallWeights;
  556. /// Branch weights for origin store.
  557. MDNode *OriginStoreWeights;
  558. };
  559. void insertModuleCtor(Module &M) {
  560. getOrCreateSanitizerCtorAndInitFunctions(
  561. M, kMsanModuleCtorName, kMsanInitName,
  562. /*InitArgTypes=*/{},
  563. /*InitArgs=*/{},
  564. // This callback is invoked when the functions are created the first
  565. // time. Hook them into the global ctors list in that case:
  566. [&](Function *Ctor, FunctionCallee) {
  567. if (!ClWithComdat) {
  568. appendToGlobalCtors(M, Ctor, 0);
  569. return;
  570. }
  571. Comdat *MsanCtorComdat = M.getOrInsertComdat(kMsanModuleCtorName);
  572. Ctor->setComdat(MsanCtorComdat);
  573. appendToGlobalCtors(M, Ctor, 0, Ctor);
  574. });
  575. }
  576. template <class T> T getOptOrDefault(const cl::opt<T> &Opt, T Default) {
  577. return (Opt.getNumOccurrences() > 0) ? Opt : Default;
  578. }
  579. } // end anonymous namespace
  580. MemorySanitizerOptions::MemorySanitizerOptions(int TO, bool R, bool K,
  581. bool EagerChecks)
  582. : Kernel(getOptOrDefault(ClEnableKmsan, K)),
  583. TrackOrigins(getOptOrDefault(ClTrackOrigins, Kernel ? 2 : TO)),
  584. Recover(getOptOrDefault(ClKeepGoing, Kernel || R)),
  585. EagerChecks(getOptOrDefault(ClEagerChecks, EagerChecks)) {}
  586. PreservedAnalyses MemorySanitizerPass::run(Module &M,
  587. ModuleAnalysisManager &AM) {
  588. bool Modified = false;
  589. if (!Options.Kernel) {
  590. insertModuleCtor(M);
  591. Modified = true;
  592. }
  593. auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
  594. for (Function &F : M) {
  595. if (F.empty())
  596. continue;
  597. MemorySanitizer Msan(*F.getParent(), Options);
  598. Modified |=
  599. Msan.sanitizeFunction(F, FAM.getResult<TargetLibraryAnalysis>(F));
  600. }
  601. if (!Modified)
  602. return PreservedAnalyses::all();
  603. PreservedAnalyses PA = PreservedAnalyses::none();
  604. // GlobalsAA is considered stateless and does not get invalidated unless
  605. // explicitly invalidated; PreservedAnalyses::none() is not enough. Sanitizers
  606. // make changes that require GlobalsAA to be invalidated.
  607. PA.abandon<GlobalsAA>();
  608. return PA;
  609. }
  610. void MemorySanitizerPass::printPipeline(
  611. raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
  612. static_cast<PassInfoMixin<MemorySanitizerPass> *>(this)->printPipeline(
  613. OS, MapClassName2PassName);
  614. OS << "<";
  615. if (Options.Recover)
  616. OS << "recover;";
  617. if (Options.Kernel)
  618. OS << "kernel;";
  619. if (Options.EagerChecks)
  620. OS << "eager-checks;";
  621. OS << "track-origins=" << Options.TrackOrigins;
  622. OS << ">";
  623. }
  624. /// Create a non-const global initialized with the given string.
  625. ///
  626. /// Creates a writable global for Str so that we can pass it to the
  627. /// run-time lib. Runtime uses first 4 bytes of the string to store the
  628. /// frame ID, so the string needs to be mutable.
  629. static GlobalVariable *createPrivateConstGlobalForString(Module &M,
  630. StringRef Str) {
  631. Constant *StrConst = ConstantDataArray::getString(M.getContext(), Str);
  632. return new GlobalVariable(M, StrConst->getType(), /*isConstant=*/true,
  633. GlobalValue::PrivateLinkage, StrConst, "");
  634. }
  635. /// Create KMSAN API callbacks.
  636. void MemorySanitizer::createKernelApi(Module &M, const TargetLibraryInfo &TLI) {
  637. IRBuilder<> IRB(*C);
  638. // These will be initialized in insertKmsanPrologue().
  639. RetvalTLS = nullptr;
  640. RetvalOriginTLS = nullptr;
  641. ParamTLS = nullptr;
  642. ParamOriginTLS = nullptr;
  643. VAArgTLS = nullptr;
  644. VAArgOriginTLS = nullptr;
  645. VAArgOverflowSizeTLS = nullptr;
  646. WarningFn = M.getOrInsertFunction("__msan_warning",
  647. TLI.getAttrList(C, {0}, /*Signed=*/false),
  648. IRB.getVoidTy(), IRB.getInt32Ty());
  649. // Requests the per-task context state (kmsan_context_state*) from the
  650. // runtime library.
  651. MsanContextStateTy = StructType::get(
  652. ArrayType::get(IRB.getInt64Ty(), kParamTLSSize / 8),
  653. ArrayType::get(IRB.getInt64Ty(), kRetvalTLSSize / 8),
  654. ArrayType::get(IRB.getInt64Ty(), kParamTLSSize / 8),
  655. ArrayType::get(IRB.getInt64Ty(), kParamTLSSize / 8), /* va_arg_origin */
  656. IRB.getInt64Ty(), ArrayType::get(OriginTy, kParamTLSSize / 4), OriginTy,
  657. OriginTy);
  658. MsanGetContextStateFn = M.getOrInsertFunction(
  659. "__msan_get_context_state", PointerType::get(MsanContextStateTy, 0));
  660. Type *RetTy = StructType::get(PointerType::get(IRB.getInt8Ty(), 0),
  661. PointerType::get(IRB.getInt32Ty(), 0));
  662. for (int ind = 0, size = 1; ind < 4; ind++, size <<= 1) {
  663. std::string name_load =
  664. "__msan_metadata_ptr_for_load_" + std::to_string(size);
  665. std::string name_store =
  666. "__msan_metadata_ptr_for_store_" + std::to_string(size);
  667. MsanMetadataPtrForLoad_1_8[ind] = M.getOrInsertFunction(
  668. name_load, RetTy, PointerType::get(IRB.getInt8Ty(), 0));
  669. MsanMetadataPtrForStore_1_8[ind] = M.getOrInsertFunction(
  670. name_store, RetTy, PointerType::get(IRB.getInt8Ty(), 0));
  671. }
  672. MsanMetadataPtrForLoadN = M.getOrInsertFunction(
  673. "__msan_metadata_ptr_for_load_n", RetTy,
  674. PointerType::get(IRB.getInt8Ty(), 0), IRB.getInt64Ty());
  675. MsanMetadataPtrForStoreN = M.getOrInsertFunction(
  676. "__msan_metadata_ptr_for_store_n", RetTy,
  677. PointerType::get(IRB.getInt8Ty(), 0), IRB.getInt64Ty());
  678. // Functions for poisoning and unpoisoning memory.
  679. MsanPoisonAllocaFn =
  680. M.getOrInsertFunction("__msan_poison_alloca", IRB.getVoidTy(),
  681. IRB.getInt8PtrTy(), IntptrTy, IRB.getInt8PtrTy());
  682. MsanUnpoisonAllocaFn = M.getOrInsertFunction(
  683. "__msan_unpoison_alloca", IRB.getVoidTy(), IRB.getInt8PtrTy(), IntptrTy);
  684. }
  685. static Constant *getOrInsertGlobal(Module &M, StringRef Name, Type *Ty) {
  686. return M.getOrInsertGlobal(Name, Ty, [&] {
  687. return new GlobalVariable(M, Ty, false, GlobalVariable::ExternalLinkage,
  688. nullptr, Name, nullptr,
  689. GlobalVariable::InitialExecTLSModel);
  690. });
  691. }
  692. /// Insert declarations for userspace-specific functions and globals.
  693. void MemorySanitizer::createUserspaceApi(Module &M, const TargetLibraryInfo &TLI) {
  694. IRBuilder<> IRB(*C);
  695. // Create the callback.
  696. // FIXME: this function should have "Cold" calling conv,
  697. // which is not yet implemented.
  698. if (TrackOrigins) {
  699. StringRef WarningFnName = Recover ? "__msan_warning_with_origin"
  700. : "__msan_warning_with_origin_noreturn";
  701. WarningFn = M.getOrInsertFunction(WarningFnName,
  702. TLI.getAttrList(C, {0}, /*Signed=*/false),
  703. IRB.getVoidTy(), IRB.getInt32Ty());
  704. } else {
  705. StringRef WarningFnName =
  706. Recover ? "__msan_warning" : "__msan_warning_noreturn";
  707. WarningFn = M.getOrInsertFunction(WarningFnName, IRB.getVoidTy());
  708. }
  709. // Create the global TLS variables.
  710. RetvalTLS =
  711. getOrInsertGlobal(M, "__msan_retval_tls",
  712. ArrayType::get(IRB.getInt64Ty(), kRetvalTLSSize / 8));
  713. RetvalOriginTLS = getOrInsertGlobal(M, "__msan_retval_origin_tls", OriginTy);
  714. ParamTLS =
  715. getOrInsertGlobal(M, "__msan_param_tls",
  716. ArrayType::get(IRB.getInt64Ty(), kParamTLSSize / 8));
  717. ParamOriginTLS =
  718. getOrInsertGlobal(M, "__msan_param_origin_tls",
  719. ArrayType::get(OriginTy, kParamTLSSize / 4));
  720. VAArgTLS =
  721. getOrInsertGlobal(M, "__msan_va_arg_tls",
  722. ArrayType::get(IRB.getInt64Ty(), kParamTLSSize / 8));
  723. VAArgOriginTLS =
  724. getOrInsertGlobal(M, "__msan_va_arg_origin_tls",
  725. ArrayType::get(OriginTy, kParamTLSSize / 4));
  726. VAArgOverflowSizeTLS =
  727. getOrInsertGlobal(M, "__msan_va_arg_overflow_size_tls", IRB.getInt64Ty());
  728. for (size_t AccessSizeIndex = 0; AccessSizeIndex < kNumberOfAccessSizes;
  729. AccessSizeIndex++) {
  730. unsigned AccessSize = 1 << AccessSizeIndex;
  731. std::string FunctionName = "__msan_maybe_warning_" + itostr(AccessSize);
  732. MaybeWarningFn[AccessSizeIndex] = M.getOrInsertFunction(
  733. FunctionName, TLI.getAttrList(C, {0, 1}, /*Signed=*/false),
  734. IRB.getVoidTy(), IRB.getIntNTy(AccessSize * 8), IRB.getInt32Ty());
  735. FunctionName = "__msan_maybe_store_origin_" + itostr(AccessSize);
  736. MaybeStoreOriginFn[AccessSizeIndex] = M.getOrInsertFunction(
  737. FunctionName, TLI.getAttrList(C, {0, 2}, /*Signed=*/false),
  738. IRB.getVoidTy(), IRB.getIntNTy(AccessSize * 8), IRB.getInt8PtrTy(),
  739. IRB.getInt32Ty());
  740. }
  741. MsanSetAllocaOriginWithDescriptionFn = M.getOrInsertFunction(
  742. "__msan_set_alloca_origin_with_descr", IRB.getVoidTy(),
  743. IRB.getInt8PtrTy(), IntptrTy, IRB.getInt8PtrTy(), IRB.getInt8PtrTy());
  744. MsanSetAllocaOriginNoDescriptionFn = M.getOrInsertFunction(
  745. "__msan_set_alloca_origin_no_descr", IRB.getVoidTy(), IRB.getInt8PtrTy(),
  746. IntptrTy, IRB.getInt8PtrTy());
  747. MsanPoisonStackFn = M.getOrInsertFunction(
  748. "__msan_poison_stack", IRB.getVoidTy(), IRB.getInt8PtrTy(), IntptrTy);
  749. }
  750. /// Insert extern declaration of runtime-provided functions and globals.
  751. void MemorySanitizer::initializeCallbacks(Module &M, const TargetLibraryInfo &TLI) {
  752. // Only do this once.
  753. if (CallbacksInitialized)
  754. return;
  755. IRBuilder<> IRB(*C);
  756. // Initialize callbacks that are common for kernel and userspace
  757. // instrumentation.
  758. MsanChainOriginFn = M.getOrInsertFunction(
  759. "__msan_chain_origin",
  760. TLI.getAttrList(C, {0}, /*Signed=*/false, /*Ret=*/true), IRB.getInt32Ty(),
  761. IRB.getInt32Ty());
  762. MsanSetOriginFn = M.getOrInsertFunction(
  763. "__msan_set_origin", TLI.getAttrList(C, {2}, /*Signed=*/false),
  764. IRB.getVoidTy(), IRB.getInt8PtrTy(), IntptrTy, IRB.getInt32Ty());
  765. MemmoveFn =
  766. M.getOrInsertFunction("__msan_memmove", IRB.getInt8PtrTy(),
  767. IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IntptrTy);
  768. MemcpyFn =
  769. M.getOrInsertFunction("__msan_memcpy", IRB.getInt8PtrTy(),
  770. IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IntptrTy);
  771. MemsetFn = M.getOrInsertFunction(
  772. "__msan_memset", TLI.getAttrList(C, {1}, /*Signed=*/true),
  773. IRB.getInt8PtrTy(), IRB.getInt8PtrTy(), IRB.getInt32Ty(), IntptrTy);
  774. MsanInstrumentAsmStoreFn =
  775. M.getOrInsertFunction("__msan_instrument_asm_store", IRB.getVoidTy(),
  776. PointerType::get(IRB.getInt8Ty(), 0), IntptrTy);
  777. if (CompileKernel) {
  778. createKernelApi(M, TLI);
  779. } else {
  780. createUserspaceApi(M, TLI);
  781. }
  782. CallbacksInitialized = true;
  783. }
  784. FunctionCallee MemorySanitizer::getKmsanShadowOriginAccessFn(bool isStore,
  785. int size) {
  786. FunctionCallee *Fns =
  787. isStore ? MsanMetadataPtrForStore_1_8 : MsanMetadataPtrForLoad_1_8;
  788. switch (size) {
  789. case 1:
  790. return Fns[0];
  791. case 2:
  792. return Fns[1];
  793. case 4:
  794. return Fns[2];
  795. case 8:
  796. return Fns[3];
  797. default:
  798. return nullptr;
  799. }
  800. }
  801. /// Module-level initialization.
  802. ///
  803. /// inserts a call to __msan_init to the module's constructor list.
  804. void MemorySanitizer::initializeModule(Module &M) {
  805. auto &DL = M.getDataLayout();
  806. bool ShadowPassed = ClShadowBase.getNumOccurrences() > 0;
  807. bool OriginPassed = ClOriginBase.getNumOccurrences() > 0;
  808. // Check the overrides first
  809. if (ShadowPassed || OriginPassed) {
  810. CustomMapParams.AndMask = ClAndMask;
  811. CustomMapParams.XorMask = ClXorMask;
  812. CustomMapParams.ShadowBase = ClShadowBase;
  813. CustomMapParams.OriginBase = ClOriginBase;
  814. MapParams = &CustomMapParams;
  815. } else {
  816. Triple TargetTriple(M.getTargetTriple());
  817. switch (TargetTriple.getOS()) {
  818. case Triple::FreeBSD:
  819. switch (TargetTriple.getArch()) {
  820. case Triple::aarch64:
  821. MapParams = FreeBSD_ARM_MemoryMapParams.bits64;
  822. break;
  823. case Triple::x86_64:
  824. MapParams = FreeBSD_X86_MemoryMapParams.bits64;
  825. break;
  826. case Triple::x86:
  827. MapParams = FreeBSD_X86_MemoryMapParams.bits32;
  828. break;
  829. default:
  830. report_fatal_error("unsupported architecture");
  831. }
  832. break;
  833. case Triple::NetBSD:
  834. switch (TargetTriple.getArch()) {
  835. case Triple::x86_64:
  836. MapParams = NetBSD_X86_MemoryMapParams.bits64;
  837. break;
  838. default:
  839. report_fatal_error("unsupported architecture");
  840. }
  841. break;
  842. case Triple::Linux:
  843. switch (TargetTriple.getArch()) {
  844. case Triple::x86_64:
  845. MapParams = Linux_X86_MemoryMapParams.bits64;
  846. break;
  847. case Triple::x86:
  848. MapParams = Linux_X86_MemoryMapParams.bits32;
  849. break;
  850. case Triple::mips64:
  851. case Triple::mips64el:
  852. MapParams = Linux_MIPS_MemoryMapParams.bits64;
  853. break;
  854. case Triple::ppc64:
  855. case Triple::ppc64le:
  856. MapParams = Linux_PowerPC_MemoryMapParams.bits64;
  857. break;
  858. case Triple::systemz:
  859. MapParams = Linux_S390_MemoryMapParams.bits64;
  860. break;
  861. case Triple::aarch64:
  862. case Triple::aarch64_be:
  863. MapParams = Linux_ARM_MemoryMapParams.bits64;
  864. break;
  865. default:
  866. report_fatal_error("unsupported architecture");
  867. }
  868. break;
  869. default:
  870. report_fatal_error("unsupported operating system");
  871. }
  872. }
  873. C = &(M.getContext());
  874. IRBuilder<> IRB(*C);
  875. IntptrTy = IRB.getIntPtrTy(DL);
  876. OriginTy = IRB.getInt32Ty();
  877. ColdCallWeights = MDBuilder(*C).createBranchWeights(1, 1000);
  878. OriginStoreWeights = MDBuilder(*C).createBranchWeights(1, 1000);
  879. if (!CompileKernel) {
  880. if (TrackOrigins)
  881. M.getOrInsertGlobal("__msan_track_origins", IRB.getInt32Ty(), [&] {
  882. return new GlobalVariable(
  883. M, IRB.getInt32Ty(), true, GlobalValue::WeakODRLinkage,
  884. IRB.getInt32(TrackOrigins), "__msan_track_origins");
  885. });
  886. if (Recover)
  887. M.getOrInsertGlobal("__msan_keep_going", IRB.getInt32Ty(), [&] {
  888. return new GlobalVariable(M, IRB.getInt32Ty(), true,
  889. GlobalValue::WeakODRLinkage,
  890. IRB.getInt32(Recover), "__msan_keep_going");
  891. });
  892. }
  893. }
  894. namespace {
  895. /// A helper class that handles instrumentation of VarArg
  896. /// functions on a particular platform.
  897. ///
  898. /// Implementations are expected to insert the instrumentation
  899. /// necessary to propagate argument shadow through VarArg function
  900. /// calls. Visit* methods are called during an InstVisitor pass over
  901. /// the function, and should avoid creating new basic blocks. A new
  902. /// instance of this class is created for each instrumented function.
  903. struct VarArgHelper {
  904. virtual ~VarArgHelper() = default;
  905. /// Visit a CallBase.
  906. virtual void visitCallBase(CallBase &CB, IRBuilder<> &IRB) = 0;
  907. /// Visit a va_start call.
  908. virtual void visitVAStartInst(VAStartInst &I) = 0;
  909. /// Visit a va_copy call.
  910. virtual void visitVACopyInst(VACopyInst &I) = 0;
  911. /// Finalize function instrumentation.
  912. ///
  913. /// This method is called after visiting all interesting (see above)
  914. /// instructions in a function.
  915. virtual void finalizeInstrumentation() = 0;
  916. };
  917. struct MemorySanitizerVisitor;
  918. } // end anonymous namespace
  919. static VarArgHelper *CreateVarArgHelper(Function &Func, MemorySanitizer &Msan,
  920. MemorySanitizerVisitor &Visitor);
  921. static unsigned TypeSizeToSizeIndex(unsigned TypeSize) {
  922. if (TypeSize <= 8)
  923. return 0;
  924. return Log2_32_Ceil((TypeSize + 7) / 8);
  925. }
  926. namespace {
  927. /// Helper class to attach debug information of the given instruction onto new
  928. /// instructions inserted after.
  929. class NextNodeIRBuilder : public IRBuilder<> {
  930. public:
  931. explicit NextNodeIRBuilder(Instruction *IP) : IRBuilder<>(IP->getNextNode()) {
  932. SetCurrentDebugLocation(IP->getDebugLoc());
  933. }
  934. };
  935. /// This class does all the work for a given function. Store and Load
  936. /// instructions store and load corresponding shadow and origin
  937. /// values. Most instructions propagate shadow from arguments to their
  938. /// return values. Certain instructions (most importantly, BranchInst)
  939. /// test their argument shadow and print reports (with a runtime call) if it's
  940. /// non-zero.
  941. struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
  942. Function &F;
  943. MemorySanitizer &MS;
  944. SmallVector<PHINode *, 16> ShadowPHINodes, OriginPHINodes;
  945. ValueMap<Value *, Value *> ShadowMap, OriginMap;
  946. std::unique_ptr<VarArgHelper> VAHelper;
  947. const TargetLibraryInfo *TLI;
  948. Instruction *FnPrologueEnd;
  949. // The following flags disable parts of MSan instrumentation based on
  950. // exclusion list contents and command-line options.
  951. bool InsertChecks;
  952. bool PropagateShadow;
  953. bool PoisonStack;
  954. bool PoisonUndef;
  955. struct ShadowOriginAndInsertPoint {
  956. Value *Shadow;
  957. Value *Origin;
  958. Instruction *OrigIns;
  959. ShadowOriginAndInsertPoint(Value *S, Value *O, Instruction *I)
  960. : Shadow(S), Origin(O), OrigIns(I) {}
  961. };
  962. SmallVector<ShadowOriginAndInsertPoint, 16> InstrumentationList;
  963. DenseMap<const DILocation *, int> LazyWarningDebugLocationCount;
  964. bool InstrumentLifetimeStart = ClHandleLifetimeIntrinsics;
  965. SmallSetVector<AllocaInst *, 16> AllocaSet;
  966. SmallVector<std::pair<IntrinsicInst *, AllocaInst *>, 16> LifetimeStartList;
  967. SmallVector<StoreInst *, 16> StoreList;
  968. int64_t SplittableBlocksCount = 0;
  969. MemorySanitizerVisitor(Function &F, MemorySanitizer &MS,
  970. const TargetLibraryInfo &TLI)
  971. : F(F), MS(MS), VAHelper(CreateVarArgHelper(F, MS, *this)), TLI(&TLI) {
  972. bool SanitizeFunction =
  973. F.hasFnAttribute(Attribute::SanitizeMemory) && !ClDisableChecks;
  974. InsertChecks = SanitizeFunction;
  975. PropagateShadow = SanitizeFunction;
  976. PoisonStack = SanitizeFunction && ClPoisonStack;
  977. PoisonUndef = SanitizeFunction && ClPoisonUndef;
  978. // In the presence of unreachable blocks, we may see Phi nodes with
  979. // incoming nodes from such blocks. Since InstVisitor skips unreachable
  980. // blocks, such nodes will not have any shadow value associated with them.
  981. // It's easier to remove unreachable blocks than deal with missing shadow.
  982. removeUnreachableBlocks(F);
  983. MS.initializeCallbacks(*F.getParent(), TLI);
  984. FnPrologueEnd = IRBuilder<>(F.getEntryBlock().getFirstNonPHI())
  985. .CreateIntrinsic(Intrinsic::donothing, {}, {});
  986. if (MS.CompileKernel) {
  987. IRBuilder<> IRB(FnPrologueEnd);
  988. insertKmsanPrologue(IRB);
  989. }
  990. LLVM_DEBUG(if (!InsertChecks) dbgs()
  991. << "MemorySanitizer is not inserting checks into '"
  992. << F.getName() << "'\n");
  993. }
  994. bool instrumentWithCalls(Value *V) {
  995. // Constants likely will be eliminated by follow-up passes.
  996. if (isa<Constant>(V))
  997. return false;
  998. ++SplittableBlocksCount;
  999. return ClInstrumentationWithCallThreshold >= 0 &&
  1000. SplittableBlocksCount > ClInstrumentationWithCallThreshold;
  1001. }
  1002. bool isInPrologue(Instruction &I) {
  1003. return I.getParent() == FnPrologueEnd->getParent() &&
  1004. (&I == FnPrologueEnd || I.comesBefore(FnPrologueEnd));
  1005. }
  1006. // Creates a new origin and records the stack trace. In general we can call
  1007. // this function for any origin manipulation we like. However it will cost
  1008. // runtime resources. So use this wisely only if it can provide additional
  1009. // information helpful to a user.
  1010. Value *updateOrigin(Value *V, IRBuilder<> &IRB) {
  1011. if (MS.TrackOrigins <= 1)
  1012. return V;
  1013. return IRB.CreateCall(MS.MsanChainOriginFn, V);
  1014. }
  1015. Value *originToIntptr(IRBuilder<> &IRB, Value *Origin) {
  1016. const DataLayout &DL = F.getParent()->getDataLayout();
  1017. unsigned IntptrSize = DL.getTypeStoreSize(MS.IntptrTy);
  1018. if (IntptrSize == kOriginSize)
  1019. return Origin;
  1020. assert(IntptrSize == kOriginSize * 2);
  1021. Origin = IRB.CreateIntCast(Origin, MS.IntptrTy, /* isSigned */ false);
  1022. return IRB.CreateOr(Origin, IRB.CreateShl(Origin, kOriginSize * 8));
  1023. }
  1024. /// Fill memory range with the given origin value.
  1025. void paintOrigin(IRBuilder<> &IRB, Value *Origin, Value *OriginPtr,
  1026. unsigned Size, Align Alignment) {
  1027. const DataLayout &DL = F.getParent()->getDataLayout();
  1028. const Align IntptrAlignment = DL.getABITypeAlign(MS.IntptrTy);
  1029. unsigned IntptrSize = DL.getTypeStoreSize(MS.IntptrTy);
  1030. assert(IntptrAlignment >= kMinOriginAlignment);
  1031. assert(IntptrSize >= kOriginSize);
  1032. unsigned Ofs = 0;
  1033. Align CurrentAlignment = Alignment;
  1034. if (Alignment >= IntptrAlignment && IntptrSize > kOriginSize) {
  1035. Value *IntptrOrigin = originToIntptr(IRB, Origin);
  1036. Value *IntptrOriginPtr =
  1037. IRB.CreatePointerCast(OriginPtr, PointerType::get(MS.IntptrTy, 0));
  1038. for (unsigned i = 0; i < Size / IntptrSize; ++i) {
  1039. Value *Ptr = i ? IRB.CreateConstGEP1_32(MS.IntptrTy, IntptrOriginPtr, i)
  1040. : IntptrOriginPtr;
  1041. IRB.CreateAlignedStore(IntptrOrigin, Ptr, CurrentAlignment);
  1042. Ofs += IntptrSize / kOriginSize;
  1043. CurrentAlignment = IntptrAlignment;
  1044. }
  1045. }
  1046. for (unsigned i = Ofs; i < (Size + kOriginSize - 1) / kOriginSize; ++i) {
  1047. Value *GEP =
  1048. i ? IRB.CreateConstGEP1_32(MS.OriginTy, OriginPtr, i) : OriginPtr;
  1049. IRB.CreateAlignedStore(Origin, GEP, CurrentAlignment);
  1050. CurrentAlignment = kMinOriginAlignment;
  1051. }
  1052. }
  1053. void storeOrigin(IRBuilder<> &IRB, Value *Addr, Value *Shadow, Value *Origin,
  1054. Value *OriginPtr, Align Alignment) {
  1055. const DataLayout &DL = F.getParent()->getDataLayout();
  1056. const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment);
  1057. unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType());
  1058. Value *ConvertedShadow = convertShadowToScalar(Shadow, IRB);
  1059. if (auto *ConstantShadow = dyn_cast<Constant>(ConvertedShadow)) {
  1060. if (!ClCheckConstantShadow || ConstantShadow->isZeroValue()) {
  1061. // Origin is not needed: value is initialized or const shadow is
  1062. // ignored.
  1063. return;
  1064. }
  1065. if (llvm::isKnownNonZero(ConvertedShadow, DL)) {
  1066. // Copy origin as the value is definitely uninitialized.
  1067. paintOrigin(IRB, updateOrigin(Origin, IRB), OriginPtr, StoreSize,
  1068. OriginAlignment);
  1069. return;
  1070. }
  1071. // Fallback to runtime check, which still can be optimized out later.
  1072. }
  1073. unsigned TypeSizeInBits = DL.getTypeSizeInBits(ConvertedShadow->getType());
  1074. unsigned SizeIndex = TypeSizeToSizeIndex(TypeSizeInBits);
  1075. if (instrumentWithCalls(ConvertedShadow) &&
  1076. SizeIndex < kNumberOfAccessSizes && !MS.CompileKernel) {
  1077. FunctionCallee Fn = MS.MaybeStoreOriginFn[SizeIndex];
  1078. Value *ConvertedShadow2 =
  1079. IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex)));
  1080. CallBase *CB = IRB.CreateCall(
  1081. Fn, {ConvertedShadow2,
  1082. IRB.CreatePointerCast(Addr, IRB.getInt8PtrTy()), Origin});
  1083. CB->addParamAttr(0, Attribute::ZExt);
  1084. CB->addParamAttr(2, Attribute::ZExt);
  1085. } else {
  1086. Value *Cmp = convertToBool(ConvertedShadow, IRB, "_mscmp");
  1087. Instruction *CheckTerm = SplitBlockAndInsertIfThen(
  1088. Cmp, &*IRB.GetInsertPoint(), false, MS.OriginStoreWeights);
  1089. IRBuilder<> IRBNew(CheckTerm);
  1090. paintOrigin(IRBNew, updateOrigin(Origin, IRBNew), OriginPtr, StoreSize,
  1091. OriginAlignment);
  1092. }
  1093. }
  1094. void materializeStores() {
  1095. for (StoreInst *SI : StoreList) {
  1096. IRBuilder<> IRB(SI);
  1097. Value *Val = SI->getValueOperand();
  1098. Value *Addr = SI->getPointerOperand();
  1099. Value *Shadow = SI->isAtomic() ? getCleanShadow(Val) : getShadow(Val);
  1100. Value *ShadowPtr, *OriginPtr;
  1101. Type *ShadowTy = Shadow->getType();
  1102. const Align Alignment = SI->getAlign();
  1103. const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment);
  1104. std::tie(ShadowPtr, OriginPtr) =
  1105. getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ true);
  1106. StoreInst *NewSI = IRB.CreateAlignedStore(Shadow, ShadowPtr, Alignment);
  1107. LLVM_DEBUG(dbgs() << " STORE: " << *NewSI << "\n");
  1108. (void)NewSI;
  1109. if (SI->isAtomic())
  1110. SI->setOrdering(addReleaseOrdering(SI->getOrdering()));
  1111. if (MS.TrackOrigins && !SI->isAtomic())
  1112. storeOrigin(IRB, Addr, Shadow, getOrigin(Val), OriginPtr,
  1113. OriginAlignment);
  1114. }
  1115. }
  1116. // Returns true if Debug Location curresponds to multiple warnings.
  1117. bool shouldDisambiguateWarningLocation(const DebugLoc &DebugLoc) {
  1118. if (MS.TrackOrigins < 2)
  1119. return false;
  1120. if (LazyWarningDebugLocationCount.empty())
  1121. for (const auto &I : InstrumentationList)
  1122. ++LazyWarningDebugLocationCount[I.OrigIns->getDebugLoc()];
  1123. return LazyWarningDebugLocationCount[DebugLoc] >= ClDisambiguateWarning;
  1124. }
  1125. /// Helper function to insert a warning at IRB's current insert point.
  1126. void insertWarningFn(IRBuilder<> &IRB, Value *Origin) {
  1127. if (!Origin)
  1128. Origin = (Value *)IRB.getInt32(0);
  1129. assert(Origin->getType()->isIntegerTy());
  1130. if (shouldDisambiguateWarningLocation(IRB.getCurrentDebugLocation())) {
  1131. // Try to create additional origin with debug info of the last origin
  1132. // instruction. It may provide additional information to the user.
  1133. if (Instruction *OI = dyn_cast_or_null<Instruction>(Origin)) {
  1134. assert(MS.TrackOrigins);
  1135. auto NewDebugLoc = OI->getDebugLoc();
  1136. // Origin update with missing or the same debug location provides no
  1137. // additional value.
  1138. if (NewDebugLoc && NewDebugLoc != IRB.getCurrentDebugLocation()) {
  1139. // Insert update just before the check, so we call runtime only just
  1140. // before the report.
  1141. IRBuilder<> IRBOrigin(&*IRB.GetInsertPoint());
  1142. IRBOrigin.SetCurrentDebugLocation(NewDebugLoc);
  1143. Origin = updateOrigin(Origin, IRBOrigin);
  1144. }
  1145. }
  1146. }
  1147. if (MS.CompileKernel || MS.TrackOrigins)
  1148. IRB.CreateCall(MS.WarningFn, Origin)->setCannotMerge();
  1149. else
  1150. IRB.CreateCall(MS.WarningFn)->setCannotMerge();
  1151. // FIXME: Insert UnreachableInst if !MS.Recover?
  1152. // This may invalidate some of the following checks and needs to be done
  1153. // at the very end.
  1154. }
  1155. void materializeOneCheck(IRBuilder<> &IRB, Value *ConvertedShadow,
  1156. Value *Origin) {
  1157. const DataLayout &DL = F.getParent()->getDataLayout();
  1158. unsigned TypeSizeInBits = DL.getTypeSizeInBits(ConvertedShadow->getType());
  1159. unsigned SizeIndex = TypeSizeToSizeIndex(TypeSizeInBits);
  1160. if (instrumentWithCalls(ConvertedShadow) &&
  1161. SizeIndex < kNumberOfAccessSizes && !MS.CompileKernel) {
  1162. FunctionCallee Fn = MS.MaybeWarningFn[SizeIndex];
  1163. Value *ConvertedShadow2 =
  1164. IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex)));
  1165. CallBase *CB = IRB.CreateCall(
  1166. Fn, {ConvertedShadow2,
  1167. MS.TrackOrigins && Origin ? Origin : (Value *)IRB.getInt32(0)});
  1168. CB->addParamAttr(0, Attribute::ZExt);
  1169. CB->addParamAttr(1, Attribute::ZExt);
  1170. } else {
  1171. Value *Cmp = convertToBool(ConvertedShadow, IRB, "_mscmp");
  1172. Instruction *CheckTerm = SplitBlockAndInsertIfThen(
  1173. Cmp, &*IRB.GetInsertPoint(),
  1174. /* Unreachable */ !MS.Recover, MS.ColdCallWeights);
  1175. IRB.SetInsertPoint(CheckTerm);
  1176. insertWarningFn(IRB, Origin);
  1177. LLVM_DEBUG(dbgs() << " CHECK: " << *Cmp << "\n");
  1178. }
  1179. }
  1180. void materializeInstructionChecks(
  1181. ArrayRef<ShadowOriginAndInsertPoint> InstructionChecks) {
  1182. const DataLayout &DL = F.getParent()->getDataLayout();
  1183. // Disable combining in some cases. TrackOrigins checks each shadow to pick
  1184. // correct origin.
  1185. bool Combine = !MS.TrackOrigins;
  1186. Instruction *Instruction = InstructionChecks.front().OrigIns;
  1187. Value *Shadow = nullptr;
  1188. for (const auto &ShadowData : InstructionChecks) {
  1189. assert(ShadowData.OrigIns == Instruction);
  1190. IRBuilder<> IRB(Instruction);
  1191. Value *ConvertedShadow = ShadowData.Shadow;
  1192. if (auto *ConstantShadow = dyn_cast<Constant>(ConvertedShadow)) {
  1193. if (!ClCheckConstantShadow || ConstantShadow->isZeroValue()) {
  1194. // Skip, value is initialized or const shadow is ignored.
  1195. continue;
  1196. }
  1197. if (llvm::isKnownNonZero(ConvertedShadow, DL)) {
  1198. // Report as the value is definitely uninitialized.
  1199. insertWarningFn(IRB, ShadowData.Origin);
  1200. if (!MS.Recover)
  1201. return; // Always fail and stop here, not need to check the rest.
  1202. // Skip entire instruction,
  1203. continue;
  1204. }
  1205. // Fallback to runtime check, which still can be optimized out later.
  1206. }
  1207. if (!Combine) {
  1208. materializeOneCheck(IRB, ConvertedShadow, ShadowData.Origin);
  1209. continue;
  1210. }
  1211. if (!Shadow) {
  1212. Shadow = ConvertedShadow;
  1213. continue;
  1214. }
  1215. Shadow = convertToBool(Shadow, IRB, "_mscmp");
  1216. ConvertedShadow = convertToBool(ConvertedShadow, IRB, "_mscmp");
  1217. Shadow = IRB.CreateOr(Shadow, ConvertedShadow, "_msor");
  1218. }
  1219. if (Shadow) {
  1220. assert(Combine);
  1221. IRBuilder<> IRB(Instruction);
  1222. materializeOneCheck(IRB, Shadow, nullptr);
  1223. }
  1224. }
  1225. void materializeChecks() {
  1226. llvm::stable_sort(InstrumentationList,
  1227. [](const ShadowOriginAndInsertPoint &L,
  1228. const ShadowOriginAndInsertPoint &R) {
  1229. return L.OrigIns < R.OrigIns;
  1230. });
  1231. for (auto I = InstrumentationList.begin();
  1232. I != InstrumentationList.end();) {
  1233. auto J =
  1234. std::find_if(I + 1, InstrumentationList.end(),
  1235. [L = I->OrigIns](const ShadowOriginAndInsertPoint &R) {
  1236. return L != R.OrigIns;
  1237. });
  1238. // Process all checks of instruction at once.
  1239. materializeInstructionChecks(ArrayRef<ShadowOriginAndInsertPoint>(I, J));
  1240. I = J;
  1241. }
  1242. LLVM_DEBUG(dbgs() << "DONE:\n" << F);
  1243. }
  1244. // Returns the last instruction in the new prologue
  1245. void insertKmsanPrologue(IRBuilder<> &IRB) {
  1246. Value *ContextState = IRB.CreateCall(MS.MsanGetContextStateFn, {});
  1247. Constant *Zero = IRB.getInt32(0);
  1248. MS.ParamTLS = IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1249. {Zero, IRB.getInt32(0)}, "param_shadow");
  1250. MS.RetvalTLS = IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1251. {Zero, IRB.getInt32(1)}, "retval_shadow");
  1252. MS.VAArgTLS = IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1253. {Zero, IRB.getInt32(2)}, "va_arg_shadow");
  1254. MS.VAArgOriginTLS = IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1255. {Zero, IRB.getInt32(3)}, "va_arg_origin");
  1256. MS.VAArgOverflowSizeTLS =
  1257. IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1258. {Zero, IRB.getInt32(4)}, "va_arg_overflow_size");
  1259. MS.ParamOriginTLS = IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1260. {Zero, IRB.getInt32(5)}, "param_origin");
  1261. MS.RetvalOriginTLS =
  1262. IRB.CreateGEP(MS.MsanContextStateTy, ContextState,
  1263. {Zero, IRB.getInt32(6)}, "retval_origin");
  1264. }
  1265. /// Add MemorySanitizer instrumentation to a function.
  1266. bool runOnFunction() {
  1267. // Iterate all BBs in depth-first order and create shadow instructions
  1268. // for all instructions (where applicable).
  1269. // For PHI nodes we create dummy shadow PHIs which will be finalized later.
  1270. for (BasicBlock *BB : depth_first(FnPrologueEnd->getParent()))
  1271. visit(*BB);
  1272. // Finalize PHI nodes.
  1273. for (PHINode *PN : ShadowPHINodes) {
  1274. PHINode *PNS = cast<PHINode>(getShadow(PN));
  1275. PHINode *PNO = MS.TrackOrigins ? cast<PHINode>(getOrigin(PN)) : nullptr;
  1276. size_t NumValues = PN->getNumIncomingValues();
  1277. for (size_t v = 0; v < NumValues; v++) {
  1278. PNS->addIncoming(getShadow(PN, v), PN->getIncomingBlock(v));
  1279. if (PNO)
  1280. PNO->addIncoming(getOrigin(PN, v), PN->getIncomingBlock(v));
  1281. }
  1282. }
  1283. VAHelper->finalizeInstrumentation();
  1284. // Poison llvm.lifetime.start intrinsics, if we haven't fallen back to
  1285. // instrumenting only allocas.
  1286. if (InstrumentLifetimeStart) {
  1287. for (auto Item : LifetimeStartList) {
  1288. instrumentAlloca(*Item.second, Item.first);
  1289. AllocaSet.remove(Item.second);
  1290. }
  1291. }
  1292. // Poison the allocas for which we didn't instrument the corresponding
  1293. // lifetime intrinsics.
  1294. for (AllocaInst *AI : AllocaSet)
  1295. instrumentAlloca(*AI);
  1296. // Insert shadow value checks.
  1297. materializeChecks();
  1298. // Delayed instrumentation of StoreInst.
  1299. // This may not add new address checks.
  1300. materializeStores();
  1301. return true;
  1302. }
  1303. /// Compute the shadow type that corresponds to a given Value.
  1304. Type *getShadowTy(Value *V) { return getShadowTy(V->getType()); }
  1305. /// Compute the shadow type that corresponds to a given Type.
  1306. Type *getShadowTy(Type *OrigTy) {
  1307. if (!OrigTy->isSized()) {
  1308. return nullptr;
  1309. }
  1310. // For integer type, shadow is the same as the original type.
  1311. // This may return weird-sized types like i1.
  1312. if (IntegerType *IT = dyn_cast<IntegerType>(OrigTy))
  1313. return IT;
  1314. const DataLayout &DL = F.getParent()->getDataLayout();
  1315. if (VectorType *VT = dyn_cast<VectorType>(OrigTy)) {
  1316. uint32_t EltSize = DL.getTypeSizeInBits(VT->getElementType());
  1317. return FixedVectorType::get(IntegerType::get(*MS.C, EltSize),
  1318. cast<FixedVectorType>(VT)->getNumElements());
  1319. }
  1320. if (ArrayType *AT = dyn_cast<ArrayType>(OrigTy)) {
  1321. return ArrayType::get(getShadowTy(AT->getElementType()),
  1322. AT->getNumElements());
  1323. }
  1324. if (StructType *ST = dyn_cast<StructType>(OrigTy)) {
  1325. SmallVector<Type *, 4> Elements;
  1326. for (unsigned i = 0, n = ST->getNumElements(); i < n; i++)
  1327. Elements.push_back(getShadowTy(ST->getElementType(i)));
  1328. StructType *Res = StructType::get(*MS.C, Elements, ST->isPacked());
  1329. LLVM_DEBUG(dbgs() << "getShadowTy: " << *ST << " ===> " << *Res << "\n");
  1330. return Res;
  1331. }
  1332. uint32_t TypeSize = DL.getTypeSizeInBits(OrigTy);
  1333. return IntegerType::get(*MS.C, TypeSize);
  1334. }
  1335. /// Flatten a vector type.
  1336. Type *getShadowTyNoVec(Type *ty) {
  1337. if (VectorType *vt = dyn_cast<VectorType>(ty))
  1338. return IntegerType::get(*MS.C,
  1339. vt->getPrimitiveSizeInBits().getFixedValue());
  1340. return ty;
  1341. }
  1342. /// Extract combined shadow of struct elements as a bool
  1343. Value *collapseStructShadow(StructType *Struct, Value *Shadow,
  1344. IRBuilder<> &IRB) {
  1345. Value *FalseVal = IRB.getIntN(/* width */ 1, /* value */ 0);
  1346. Value *Aggregator = FalseVal;
  1347. for (unsigned Idx = 0; Idx < Struct->getNumElements(); Idx++) {
  1348. // Combine by ORing together each element's bool shadow
  1349. Value *ShadowItem = IRB.CreateExtractValue(Shadow, Idx);
  1350. Value *ShadowInner = convertShadowToScalar(ShadowItem, IRB);
  1351. Value *ShadowBool = convertToBool(ShadowInner, IRB);
  1352. if (Aggregator != FalseVal)
  1353. Aggregator = IRB.CreateOr(Aggregator, ShadowBool);
  1354. else
  1355. Aggregator = ShadowBool;
  1356. }
  1357. return Aggregator;
  1358. }
  1359. // Extract combined shadow of array elements
  1360. Value *collapseArrayShadow(ArrayType *Array, Value *Shadow,
  1361. IRBuilder<> &IRB) {
  1362. if (!Array->getNumElements())
  1363. return IRB.getIntN(/* width */ 1, /* value */ 0);
  1364. Value *FirstItem = IRB.CreateExtractValue(Shadow, 0);
  1365. Value *Aggregator = convertShadowToScalar(FirstItem, IRB);
  1366. for (unsigned Idx = 1; Idx < Array->getNumElements(); Idx++) {
  1367. Value *ShadowItem = IRB.CreateExtractValue(Shadow, Idx);
  1368. Value *ShadowInner = convertShadowToScalar(ShadowItem, IRB);
  1369. Aggregator = IRB.CreateOr(Aggregator, ShadowInner);
  1370. }
  1371. return Aggregator;
  1372. }
  1373. /// Convert a shadow value to it's flattened variant. The resulting
  1374. /// shadow may not necessarily have the same bit width as the input
  1375. /// value, but it will always be comparable to zero.
  1376. Value *convertShadowToScalar(Value *V, IRBuilder<> &IRB) {
  1377. if (StructType *Struct = dyn_cast<StructType>(V->getType()))
  1378. return collapseStructShadow(Struct, V, IRB);
  1379. if (ArrayType *Array = dyn_cast<ArrayType>(V->getType()))
  1380. return collapseArrayShadow(Array, V, IRB);
  1381. Type *Ty = V->getType();
  1382. Type *NoVecTy = getShadowTyNoVec(Ty);
  1383. if (Ty == NoVecTy)
  1384. return V;
  1385. return IRB.CreateBitCast(V, NoVecTy);
  1386. }
  1387. // Convert a scalar value to an i1 by comparing with 0
  1388. Value *convertToBool(Value *V, IRBuilder<> &IRB, const Twine &name = "") {
  1389. Type *VTy = V->getType();
  1390. if (!VTy->isIntegerTy())
  1391. return convertToBool(convertShadowToScalar(V, IRB), IRB, name);
  1392. if (VTy->getIntegerBitWidth() == 1)
  1393. // Just converting a bool to a bool, so do nothing.
  1394. return V;
  1395. return IRB.CreateICmpNE(V, ConstantInt::get(VTy, 0), name);
  1396. }
  1397. Type *ptrToIntPtrType(Type *PtrTy) const {
  1398. if (FixedVectorType *VectTy = dyn_cast<FixedVectorType>(PtrTy)) {
  1399. return FixedVectorType::get(ptrToIntPtrType(VectTy->getElementType()),
  1400. VectTy->getNumElements());
  1401. }
  1402. assert(PtrTy->isIntOrPtrTy());
  1403. return MS.IntptrTy;
  1404. }
  1405. Type *getPtrToShadowPtrType(Type *IntPtrTy, Type *ShadowTy) const {
  1406. if (FixedVectorType *VectTy = dyn_cast<FixedVectorType>(IntPtrTy)) {
  1407. return FixedVectorType::get(
  1408. getPtrToShadowPtrType(VectTy->getElementType(), ShadowTy),
  1409. VectTy->getNumElements());
  1410. }
  1411. assert(IntPtrTy == MS.IntptrTy);
  1412. return ShadowTy->getPointerTo();
  1413. }
  1414. Constant *constToIntPtr(Type *IntPtrTy, uint64_t C) const {
  1415. if (FixedVectorType *VectTy = dyn_cast<FixedVectorType>(IntPtrTy)) {
  1416. return ConstantDataVector::getSplat(
  1417. VectTy->getNumElements(), constToIntPtr(VectTy->getElementType(), C));
  1418. }
  1419. assert(IntPtrTy == MS.IntptrTy);
  1420. return ConstantInt::get(MS.IntptrTy, C);
  1421. }
  1422. /// Compute the integer shadow offset that corresponds to a given
  1423. /// application address.
  1424. ///
  1425. /// Offset = (Addr & ~AndMask) ^ XorMask
  1426. /// Addr can be a ptr or <N x ptr>. In both cases ShadowTy the shadow type of
  1427. /// a single pointee.
  1428. /// Returns <shadow_ptr, origin_ptr> or <<N x shadow_ptr>, <N x origin_ptr>>.
  1429. Value *getShadowPtrOffset(Value *Addr, IRBuilder<> &IRB) {
  1430. Type *IntptrTy = ptrToIntPtrType(Addr->getType());
  1431. Value *OffsetLong = IRB.CreatePointerCast(Addr, IntptrTy);
  1432. if (uint64_t AndMask = MS.MapParams->AndMask)
  1433. OffsetLong = IRB.CreateAnd(OffsetLong, constToIntPtr(IntptrTy, ~AndMask));
  1434. if (uint64_t XorMask = MS.MapParams->XorMask)
  1435. OffsetLong = IRB.CreateXor(OffsetLong, constToIntPtr(IntptrTy, XorMask));
  1436. return OffsetLong;
  1437. }
  1438. /// Compute the shadow and origin addresses corresponding to a given
  1439. /// application address.
  1440. ///
  1441. /// Shadow = ShadowBase + Offset
  1442. /// Origin = (OriginBase + Offset) & ~3ULL
  1443. /// Addr can be a ptr or <N x ptr>. In both cases ShadowTy the shadow type of
  1444. /// a single pointee.
  1445. /// Returns <shadow_ptr, origin_ptr> or <<N x shadow_ptr>, <N x origin_ptr>>.
  1446. std::pair<Value *, Value *>
  1447. getShadowOriginPtrUserspace(Value *Addr, IRBuilder<> &IRB, Type *ShadowTy,
  1448. MaybeAlign Alignment) {
  1449. Type *IntptrTy = ptrToIntPtrType(Addr->getType());
  1450. Value *ShadowOffset = getShadowPtrOffset(Addr, IRB);
  1451. Value *ShadowLong = ShadowOffset;
  1452. if (uint64_t ShadowBase = MS.MapParams->ShadowBase) {
  1453. ShadowLong =
  1454. IRB.CreateAdd(ShadowLong, constToIntPtr(IntptrTy, ShadowBase));
  1455. }
  1456. Value *ShadowPtr = IRB.CreateIntToPtr(
  1457. ShadowLong, getPtrToShadowPtrType(IntptrTy, ShadowTy));
  1458. Value *OriginPtr = nullptr;
  1459. if (MS.TrackOrigins) {
  1460. Value *OriginLong = ShadowOffset;
  1461. uint64_t OriginBase = MS.MapParams->OriginBase;
  1462. if (OriginBase != 0)
  1463. OriginLong =
  1464. IRB.CreateAdd(OriginLong, constToIntPtr(IntptrTy, OriginBase));
  1465. if (!Alignment || *Alignment < kMinOriginAlignment) {
  1466. uint64_t Mask = kMinOriginAlignment.value() - 1;
  1467. OriginLong = IRB.CreateAnd(OriginLong, constToIntPtr(IntptrTy, ~Mask));
  1468. }
  1469. OriginPtr = IRB.CreateIntToPtr(
  1470. OriginLong, getPtrToShadowPtrType(IntptrTy, MS.OriginTy));
  1471. }
  1472. return std::make_pair(ShadowPtr, OriginPtr);
  1473. }
  1474. std::pair<Value *, Value *> getShadowOriginPtrKernelNoVec(Value *Addr,
  1475. IRBuilder<> &IRB,
  1476. Type *ShadowTy,
  1477. bool isStore) {
  1478. Value *ShadowOriginPtrs;
  1479. const DataLayout &DL = F.getParent()->getDataLayout();
  1480. int Size = DL.getTypeStoreSize(ShadowTy);
  1481. FunctionCallee Getter = MS.getKmsanShadowOriginAccessFn(isStore, Size);
  1482. Value *AddrCast =
  1483. IRB.CreatePointerCast(Addr, PointerType::get(IRB.getInt8Ty(), 0));
  1484. if (Getter) {
  1485. ShadowOriginPtrs = IRB.CreateCall(Getter, AddrCast);
  1486. } else {
  1487. Value *SizeVal = ConstantInt::get(MS.IntptrTy, Size);
  1488. ShadowOriginPtrs = IRB.CreateCall(isStore ? MS.MsanMetadataPtrForStoreN
  1489. : MS.MsanMetadataPtrForLoadN,
  1490. {AddrCast, SizeVal});
  1491. }
  1492. Value *ShadowPtr = IRB.CreateExtractValue(ShadowOriginPtrs, 0);
  1493. ShadowPtr = IRB.CreatePointerCast(ShadowPtr, PointerType::get(ShadowTy, 0));
  1494. Value *OriginPtr = IRB.CreateExtractValue(ShadowOriginPtrs, 1);
  1495. return std::make_pair(ShadowPtr, OriginPtr);
  1496. }
  1497. /// Addr can be a ptr or <N x ptr>. In both cases ShadowTy the shadow type of
  1498. /// a single pointee.
  1499. /// Returns <shadow_ptr, origin_ptr> or <<N x shadow_ptr>, <N x origin_ptr>>.
  1500. std::pair<Value *, Value *> getShadowOriginPtrKernel(Value *Addr,
  1501. IRBuilder<> &IRB,
  1502. Type *ShadowTy,
  1503. bool isStore) {
  1504. FixedVectorType *VectTy = dyn_cast<FixedVectorType>(Addr->getType());
  1505. if (!VectTy) {
  1506. assert(Addr->getType()->isPointerTy());
  1507. return getShadowOriginPtrKernelNoVec(Addr, IRB, ShadowTy, isStore);
  1508. }
  1509. // TODO: Support callbacs with vectors of addresses.
  1510. unsigned NumElements = VectTy->getNumElements();
  1511. Value *ShadowPtrs = ConstantInt::getNullValue(
  1512. FixedVectorType::get(ShadowTy->getPointerTo(), NumElements));
  1513. Value *OriginPtrs = nullptr;
  1514. if (MS.TrackOrigins)
  1515. OriginPtrs = ConstantInt::getNullValue(
  1516. FixedVectorType::get(MS.OriginTy->getPointerTo(), NumElements));
  1517. for (unsigned i = 0; i < NumElements; ++i) {
  1518. Value *OneAddr =
  1519. IRB.CreateExtractElement(Addr, ConstantInt::get(IRB.getInt32Ty(), i));
  1520. auto [ShadowPtr, OriginPtr] =
  1521. getShadowOriginPtrKernelNoVec(OneAddr, IRB, ShadowTy, isStore);
  1522. ShadowPtrs = IRB.CreateInsertElement(
  1523. ShadowPtrs, ShadowPtr, ConstantInt::get(IRB.getInt32Ty(), i));
  1524. if (MS.TrackOrigins)
  1525. OriginPtrs = IRB.CreateInsertElement(
  1526. OriginPtrs, OriginPtr, ConstantInt::get(IRB.getInt32Ty(), i));
  1527. }
  1528. return {ShadowPtrs, OriginPtrs};
  1529. }
  1530. std::pair<Value *, Value *> getShadowOriginPtr(Value *Addr, IRBuilder<> &IRB,
  1531. Type *ShadowTy,
  1532. MaybeAlign Alignment,
  1533. bool isStore) {
  1534. if (MS.CompileKernel)
  1535. return getShadowOriginPtrKernel(Addr, IRB, ShadowTy, isStore);
  1536. return getShadowOriginPtrUserspace(Addr, IRB, ShadowTy, Alignment);
  1537. }
  1538. /// Compute the shadow address for a given function argument.
  1539. ///
  1540. /// Shadow = ParamTLS+ArgOffset.
  1541. Value *getShadowPtrForArgument(Value *A, IRBuilder<> &IRB, int ArgOffset) {
  1542. Value *Base = IRB.CreatePointerCast(MS.ParamTLS, MS.IntptrTy);
  1543. if (ArgOffset)
  1544. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  1545. return IRB.CreateIntToPtr(Base, PointerType::get(getShadowTy(A), 0),
  1546. "_msarg");
  1547. }
  1548. /// Compute the origin address for a given function argument.
  1549. Value *getOriginPtrForArgument(Value *A, IRBuilder<> &IRB, int ArgOffset) {
  1550. if (!MS.TrackOrigins)
  1551. return nullptr;
  1552. Value *Base = IRB.CreatePointerCast(MS.ParamOriginTLS, MS.IntptrTy);
  1553. if (ArgOffset)
  1554. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  1555. return IRB.CreateIntToPtr(Base, PointerType::get(MS.OriginTy, 0),
  1556. "_msarg_o");
  1557. }
  1558. /// Compute the shadow address for a retval.
  1559. Value *getShadowPtrForRetval(Value *A, IRBuilder<> &IRB) {
  1560. return IRB.CreatePointerCast(MS.RetvalTLS,
  1561. PointerType::get(getShadowTy(A), 0), "_msret");
  1562. }
  1563. /// Compute the origin address for a retval.
  1564. Value *getOriginPtrForRetval(IRBuilder<> &IRB) {
  1565. // We keep a single origin for the entire retval. Might be too optimistic.
  1566. return MS.RetvalOriginTLS;
  1567. }
  1568. /// Set SV to be the shadow value for V.
  1569. void setShadow(Value *V, Value *SV) {
  1570. assert(!ShadowMap.count(V) && "Values may only have one shadow");
  1571. ShadowMap[V] = PropagateShadow ? SV : getCleanShadow(V);
  1572. }
  1573. /// Set Origin to be the origin value for V.
  1574. void setOrigin(Value *V, Value *Origin) {
  1575. if (!MS.TrackOrigins)
  1576. return;
  1577. assert(!OriginMap.count(V) && "Values may only have one origin");
  1578. LLVM_DEBUG(dbgs() << "ORIGIN: " << *V << " ==> " << *Origin << "\n");
  1579. OriginMap[V] = Origin;
  1580. }
  1581. Constant *getCleanShadow(Type *OrigTy) {
  1582. Type *ShadowTy = getShadowTy(OrigTy);
  1583. if (!ShadowTy)
  1584. return nullptr;
  1585. return Constant::getNullValue(ShadowTy);
  1586. }
  1587. /// Create a clean shadow value for a given value.
  1588. ///
  1589. /// Clean shadow (all zeroes) means all bits of the value are defined
  1590. /// (initialized).
  1591. Constant *getCleanShadow(Value *V) { return getCleanShadow(V->getType()); }
  1592. /// Create a dirty shadow of a given shadow type.
  1593. Constant *getPoisonedShadow(Type *ShadowTy) {
  1594. assert(ShadowTy);
  1595. if (isa<IntegerType>(ShadowTy) || isa<VectorType>(ShadowTy))
  1596. return Constant::getAllOnesValue(ShadowTy);
  1597. if (ArrayType *AT = dyn_cast<ArrayType>(ShadowTy)) {
  1598. SmallVector<Constant *, 4> Vals(AT->getNumElements(),
  1599. getPoisonedShadow(AT->getElementType()));
  1600. return ConstantArray::get(AT, Vals);
  1601. }
  1602. if (StructType *ST = dyn_cast<StructType>(ShadowTy)) {
  1603. SmallVector<Constant *, 4> Vals;
  1604. for (unsigned i = 0, n = ST->getNumElements(); i < n; i++)
  1605. Vals.push_back(getPoisonedShadow(ST->getElementType(i)));
  1606. return ConstantStruct::get(ST, Vals);
  1607. }
  1608. llvm_unreachable("Unexpected shadow type");
  1609. }
  1610. /// Create a dirty shadow for a given value.
  1611. Constant *getPoisonedShadow(Value *V) {
  1612. Type *ShadowTy = getShadowTy(V);
  1613. if (!ShadowTy)
  1614. return nullptr;
  1615. return getPoisonedShadow(ShadowTy);
  1616. }
  1617. /// Create a clean (zero) origin.
  1618. Value *getCleanOrigin() { return Constant::getNullValue(MS.OriginTy); }
  1619. /// Get the shadow value for a given Value.
  1620. ///
  1621. /// This function either returns the value set earlier with setShadow,
  1622. /// or extracts if from ParamTLS (for function arguments).
  1623. Value *getShadow(Value *V) {
  1624. if (Instruction *I = dyn_cast<Instruction>(V)) {
  1625. if (!PropagateShadow || I->getMetadata(LLVMContext::MD_nosanitize))
  1626. return getCleanShadow(V);
  1627. // For instructions the shadow is already stored in the map.
  1628. Value *Shadow = ShadowMap[V];
  1629. if (!Shadow) {
  1630. LLVM_DEBUG(dbgs() << "No shadow: " << *V << "\n" << *(I->getParent()));
  1631. (void)I;
  1632. assert(Shadow && "No shadow for a value");
  1633. }
  1634. return Shadow;
  1635. }
  1636. if (UndefValue *U = dyn_cast<UndefValue>(V)) {
  1637. Value *AllOnes = (PropagateShadow && PoisonUndef) ? getPoisonedShadow(V)
  1638. : getCleanShadow(V);
  1639. LLVM_DEBUG(dbgs() << "Undef: " << *U << " ==> " << *AllOnes << "\n");
  1640. (void)U;
  1641. return AllOnes;
  1642. }
  1643. if (Argument *A = dyn_cast<Argument>(V)) {
  1644. // For arguments we compute the shadow on demand and store it in the map.
  1645. Value *&ShadowPtr = ShadowMap[V];
  1646. if (ShadowPtr)
  1647. return ShadowPtr;
  1648. Function *F = A->getParent();
  1649. IRBuilder<> EntryIRB(FnPrologueEnd);
  1650. unsigned ArgOffset = 0;
  1651. const DataLayout &DL = F->getParent()->getDataLayout();
  1652. for (auto &FArg : F->args()) {
  1653. if (!FArg.getType()->isSized()) {
  1654. LLVM_DEBUG(dbgs() << "Arg is not sized\n");
  1655. continue;
  1656. }
  1657. unsigned Size = FArg.hasByValAttr()
  1658. ? DL.getTypeAllocSize(FArg.getParamByValType())
  1659. : DL.getTypeAllocSize(FArg.getType());
  1660. if (A == &FArg) {
  1661. bool Overflow = ArgOffset + Size > kParamTLSSize;
  1662. if (FArg.hasByValAttr()) {
  1663. // ByVal pointer itself has clean shadow. We copy the actual
  1664. // argument shadow to the underlying memory.
  1665. // Figure out maximal valid memcpy alignment.
  1666. const Align ArgAlign = DL.getValueOrABITypeAlignment(
  1667. FArg.getParamAlign(), FArg.getParamByValType());
  1668. Value *CpShadowPtr, *CpOriginPtr;
  1669. std::tie(CpShadowPtr, CpOriginPtr) =
  1670. getShadowOriginPtr(V, EntryIRB, EntryIRB.getInt8Ty(), ArgAlign,
  1671. /*isStore*/ true);
  1672. if (!PropagateShadow || Overflow) {
  1673. // ParamTLS overflow.
  1674. EntryIRB.CreateMemSet(
  1675. CpShadowPtr, Constant::getNullValue(EntryIRB.getInt8Ty()),
  1676. Size, ArgAlign);
  1677. } else {
  1678. Value *Base = getShadowPtrForArgument(&FArg, EntryIRB, ArgOffset);
  1679. const Align CopyAlign = std::min(ArgAlign, kShadowTLSAlignment);
  1680. Value *Cpy = EntryIRB.CreateMemCpy(CpShadowPtr, CopyAlign, Base,
  1681. CopyAlign, Size);
  1682. LLVM_DEBUG(dbgs() << " ByValCpy: " << *Cpy << "\n");
  1683. (void)Cpy;
  1684. if (MS.TrackOrigins) {
  1685. Value *OriginPtr =
  1686. getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset);
  1687. // FIXME: OriginSize should be:
  1688. // alignTo(V % kMinOriginAlignment + Size, kMinOriginAlignment)
  1689. unsigned OriginSize = alignTo(Size, kMinOriginAlignment);
  1690. EntryIRB.CreateMemCpy(
  1691. CpOriginPtr,
  1692. /* by getShadowOriginPtr */ kMinOriginAlignment, OriginPtr,
  1693. /* by origin_tls[ArgOffset] */ kMinOriginAlignment,
  1694. OriginSize);
  1695. }
  1696. }
  1697. }
  1698. if (!PropagateShadow || Overflow || FArg.hasByValAttr() ||
  1699. (MS.EagerChecks && FArg.hasAttribute(Attribute::NoUndef))) {
  1700. ShadowPtr = getCleanShadow(V);
  1701. setOrigin(A, getCleanOrigin());
  1702. } else {
  1703. // Shadow over TLS
  1704. Value *Base = getShadowPtrForArgument(&FArg, EntryIRB, ArgOffset);
  1705. ShadowPtr = EntryIRB.CreateAlignedLoad(getShadowTy(&FArg), Base,
  1706. kShadowTLSAlignment);
  1707. if (MS.TrackOrigins) {
  1708. Value *OriginPtr =
  1709. getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset);
  1710. setOrigin(A, EntryIRB.CreateLoad(MS.OriginTy, OriginPtr));
  1711. }
  1712. }
  1713. LLVM_DEBUG(dbgs()
  1714. << " ARG: " << FArg << " ==> " << *ShadowPtr << "\n");
  1715. break;
  1716. }
  1717. ArgOffset += alignTo(Size, kShadowTLSAlignment);
  1718. }
  1719. assert(ShadowPtr && "Could not find shadow for an argument");
  1720. return ShadowPtr;
  1721. }
  1722. // For everything else the shadow is zero.
  1723. return getCleanShadow(V);
  1724. }
  1725. /// Get the shadow for i-th argument of the instruction I.
  1726. Value *getShadow(Instruction *I, int i) {
  1727. return getShadow(I->getOperand(i));
  1728. }
  1729. /// Get the origin for a value.
  1730. Value *getOrigin(Value *V) {
  1731. if (!MS.TrackOrigins)
  1732. return nullptr;
  1733. if (!PropagateShadow || isa<Constant>(V) || isa<InlineAsm>(V))
  1734. return getCleanOrigin();
  1735. assert((isa<Instruction>(V) || isa<Argument>(V)) &&
  1736. "Unexpected value type in getOrigin()");
  1737. if (Instruction *I = dyn_cast<Instruction>(V)) {
  1738. if (I->getMetadata(LLVMContext::MD_nosanitize))
  1739. return getCleanOrigin();
  1740. }
  1741. Value *Origin = OriginMap[V];
  1742. assert(Origin && "Missing origin");
  1743. return Origin;
  1744. }
  1745. /// Get the origin for i-th argument of the instruction I.
  1746. Value *getOrigin(Instruction *I, int i) {
  1747. return getOrigin(I->getOperand(i));
  1748. }
  1749. /// Remember the place where a shadow check should be inserted.
  1750. ///
  1751. /// This location will be later instrumented with a check that will print a
  1752. /// UMR warning in runtime if the shadow value is not 0.
  1753. void insertShadowCheck(Value *Shadow, Value *Origin, Instruction *OrigIns) {
  1754. assert(Shadow);
  1755. if (!InsertChecks)
  1756. return;
  1757. if (!DebugCounter::shouldExecute(DebugInsertCheck)) {
  1758. LLVM_DEBUG(dbgs() << "Skipping check of " << *Shadow << " before "
  1759. << *OrigIns << "\n");
  1760. return;
  1761. }
  1762. #ifndef NDEBUG
  1763. Type *ShadowTy = Shadow->getType();
  1764. assert((isa<IntegerType>(ShadowTy) || isa<VectorType>(ShadowTy) ||
  1765. isa<StructType>(ShadowTy) || isa<ArrayType>(ShadowTy)) &&
  1766. "Can only insert checks for integer, vector, and aggregate shadow "
  1767. "types");
  1768. #endif
  1769. InstrumentationList.push_back(
  1770. ShadowOriginAndInsertPoint(Shadow, Origin, OrigIns));
  1771. }
  1772. /// Remember the place where a shadow check should be inserted.
  1773. ///
  1774. /// This location will be later instrumented with a check that will print a
  1775. /// UMR warning in runtime if the value is not fully defined.
  1776. void insertShadowCheck(Value *Val, Instruction *OrigIns) {
  1777. assert(Val);
  1778. Value *Shadow, *Origin;
  1779. if (ClCheckConstantShadow) {
  1780. Shadow = getShadow(Val);
  1781. if (!Shadow)
  1782. return;
  1783. Origin = getOrigin(Val);
  1784. } else {
  1785. Shadow = dyn_cast_or_null<Instruction>(getShadow(Val));
  1786. if (!Shadow)
  1787. return;
  1788. Origin = dyn_cast_or_null<Instruction>(getOrigin(Val));
  1789. }
  1790. insertShadowCheck(Shadow, Origin, OrigIns);
  1791. }
  1792. AtomicOrdering addReleaseOrdering(AtomicOrdering a) {
  1793. switch (a) {
  1794. case AtomicOrdering::NotAtomic:
  1795. return AtomicOrdering::NotAtomic;
  1796. case AtomicOrdering::Unordered:
  1797. case AtomicOrdering::Monotonic:
  1798. case AtomicOrdering::Release:
  1799. return AtomicOrdering::Release;
  1800. case AtomicOrdering::Acquire:
  1801. case AtomicOrdering::AcquireRelease:
  1802. return AtomicOrdering::AcquireRelease;
  1803. case AtomicOrdering::SequentiallyConsistent:
  1804. return AtomicOrdering::SequentiallyConsistent;
  1805. }
  1806. llvm_unreachable("Unknown ordering");
  1807. }
  1808. Value *makeAddReleaseOrderingTable(IRBuilder<> &IRB) {
  1809. constexpr int NumOrderings = (int)AtomicOrderingCABI::seq_cst + 1;
  1810. uint32_t OrderingTable[NumOrderings] = {};
  1811. OrderingTable[(int)AtomicOrderingCABI::relaxed] =
  1812. OrderingTable[(int)AtomicOrderingCABI::release] =
  1813. (int)AtomicOrderingCABI::release;
  1814. OrderingTable[(int)AtomicOrderingCABI::consume] =
  1815. OrderingTable[(int)AtomicOrderingCABI::acquire] =
  1816. OrderingTable[(int)AtomicOrderingCABI::acq_rel] =
  1817. (int)AtomicOrderingCABI::acq_rel;
  1818. OrderingTable[(int)AtomicOrderingCABI::seq_cst] =
  1819. (int)AtomicOrderingCABI::seq_cst;
  1820. return ConstantDataVector::get(IRB.getContext(),
  1821. ArrayRef(OrderingTable, NumOrderings));
  1822. }
  1823. AtomicOrdering addAcquireOrdering(AtomicOrdering a) {
  1824. switch (a) {
  1825. case AtomicOrdering::NotAtomic:
  1826. return AtomicOrdering::NotAtomic;
  1827. case AtomicOrdering::Unordered:
  1828. case AtomicOrdering::Monotonic:
  1829. case AtomicOrdering::Acquire:
  1830. return AtomicOrdering::Acquire;
  1831. case AtomicOrdering::Release:
  1832. case AtomicOrdering::AcquireRelease:
  1833. return AtomicOrdering::AcquireRelease;
  1834. case AtomicOrdering::SequentiallyConsistent:
  1835. return AtomicOrdering::SequentiallyConsistent;
  1836. }
  1837. llvm_unreachable("Unknown ordering");
  1838. }
  1839. Value *makeAddAcquireOrderingTable(IRBuilder<> &IRB) {
  1840. constexpr int NumOrderings = (int)AtomicOrderingCABI::seq_cst + 1;
  1841. uint32_t OrderingTable[NumOrderings] = {};
  1842. OrderingTable[(int)AtomicOrderingCABI::relaxed] =
  1843. OrderingTable[(int)AtomicOrderingCABI::acquire] =
  1844. OrderingTable[(int)AtomicOrderingCABI::consume] =
  1845. (int)AtomicOrderingCABI::acquire;
  1846. OrderingTable[(int)AtomicOrderingCABI::release] =
  1847. OrderingTable[(int)AtomicOrderingCABI::acq_rel] =
  1848. (int)AtomicOrderingCABI::acq_rel;
  1849. OrderingTable[(int)AtomicOrderingCABI::seq_cst] =
  1850. (int)AtomicOrderingCABI::seq_cst;
  1851. return ConstantDataVector::get(IRB.getContext(),
  1852. ArrayRef(OrderingTable, NumOrderings));
  1853. }
  1854. // ------------------- Visitors.
  1855. using InstVisitor<MemorySanitizerVisitor>::visit;
  1856. void visit(Instruction &I) {
  1857. if (I.getMetadata(LLVMContext::MD_nosanitize))
  1858. return;
  1859. // Don't want to visit if we're in the prologue
  1860. if (isInPrologue(I))
  1861. return;
  1862. InstVisitor<MemorySanitizerVisitor>::visit(I);
  1863. }
  1864. /// Instrument LoadInst
  1865. ///
  1866. /// Loads the corresponding shadow and (optionally) origin.
  1867. /// Optionally, checks that the load address is fully defined.
  1868. void visitLoadInst(LoadInst &I) {
  1869. assert(I.getType()->isSized() && "Load type must have size");
  1870. assert(!I.getMetadata(LLVMContext::MD_nosanitize));
  1871. NextNodeIRBuilder IRB(&I);
  1872. Type *ShadowTy = getShadowTy(&I);
  1873. Value *Addr = I.getPointerOperand();
  1874. Value *ShadowPtr = nullptr, *OriginPtr = nullptr;
  1875. const Align Alignment = I.getAlign();
  1876. if (PropagateShadow) {
  1877. std::tie(ShadowPtr, OriginPtr) =
  1878. getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
  1879. setShadow(&I,
  1880. IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld"));
  1881. } else {
  1882. setShadow(&I, getCleanShadow(&I));
  1883. }
  1884. if (ClCheckAccessAddress)
  1885. insertShadowCheck(I.getPointerOperand(), &I);
  1886. if (I.isAtomic())
  1887. I.setOrdering(addAcquireOrdering(I.getOrdering()));
  1888. if (MS.TrackOrigins) {
  1889. if (PropagateShadow) {
  1890. const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment);
  1891. setOrigin(
  1892. &I, IRB.CreateAlignedLoad(MS.OriginTy, OriginPtr, OriginAlignment));
  1893. } else {
  1894. setOrigin(&I, getCleanOrigin());
  1895. }
  1896. }
  1897. }
  1898. /// Instrument StoreInst
  1899. ///
  1900. /// Stores the corresponding shadow and (optionally) origin.
  1901. /// Optionally, checks that the store address is fully defined.
  1902. void visitStoreInst(StoreInst &I) {
  1903. StoreList.push_back(&I);
  1904. if (ClCheckAccessAddress)
  1905. insertShadowCheck(I.getPointerOperand(), &I);
  1906. }
  1907. void handleCASOrRMW(Instruction &I) {
  1908. assert(isa<AtomicRMWInst>(I) || isa<AtomicCmpXchgInst>(I));
  1909. IRBuilder<> IRB(&I);
  1910. Value *Addr = I.getOperand(0);
  1911. Value *Val = I.getOperand(1);
  1912. Value *ShadowPtr = getShadowOriginPtr(Addr, IRB, getShadowTy(Val), Align(1),
  1913. /*isStore*/ true)
  1914. .first;
  1915. if (ClCheckAccessAddress)
  1916. insertShadowCheck(Addr, &I);
  1917. // Only test the conditional argument of cmpxchg instruction.
  1918. // The other argument can potentially be uninitialized, but we can not
  1919. // detect this situation reliably without possible false positives.
  1920. if (isa<AtomicCmpXchgInst>(I))
  1921. insertShadowCheck(Val, &I);
  1922. IRB.CreateStore(getCleanShadow(Val), ShadowPtr);
  1923. setShadow(&I, getCleanShadow(&I));
  1924. setOrigin(&I, getCleanOrigin());
  1925. }
  1926. void visitAtomicRMWInst(AtomicRMWInst &I) {
  1927. handleCASOrRMW(I);
  1928. I.setOrdering(addReleaseOrdering(I.getOrdering()));
  1929. }
  1930. void visitAtomicCmpXchgInst(AtomicCmpXchgInst &I) {
  1931. handleCASOrRMW(I);
  1932. I.setSuccessOrdering(addReleaseOrdering(I.getSuccessOrdering()));
  1933. }
  1934. // Vector manipulation.
  1935. void visitExtractElementInst(ExtractElementInst &I) {
  1936. insertShadowCheck(I.getOperand(1), &I);
  1937. IRBuilder<> IRB(&I);
  1938. setShadow(&I, IRB.CreateExtractElement(getShadow(&I, 0), I.getOperand(1),
  1939. "_msprop"));
  1940. setOrigin(&I, getOrigin(&I, 0));
  1941. }
  1942. void visitInsertElementInst(InsertElementInst &I) {
  1943. insertShadowCheck(I.getOperand(2), &I);
  1944. IRBuilder<> IRB(&I);
  1945. auto *Shadow0 = getShadow(&I, 0);
  1946. auto *Shadow1 = getShadow(&I, 1);
  1947. setShadow(&I, IRB.CreateInsertElement(Shadow0, Shadow1, I.getOperand(2),
  1948. "_msprop"));
  1949. setOriginForNaryOp(I);
  1950. }
  1951. void visitShuffleVectorInst(ShuffleVectorInst &I) {
  1952. IRBuilder<> IRB(&I);
  1953. auto *Shadow0 = getShadow(&I, 0);
  1954. auto *Shadow1 = getShadow(&I, 1);
  1955. setShadow(&I, IRB.CreateShuffleVector(Shadow0, Shadow1, I.getShuffleMask(),
  1956. "_msprop"));
  1957. setOriginForNaryOp(I);
  1958. }
  1959. // Casts.
  1960. void visitSExtInst(SExtInst &I) {
  1961. IRBuilder<> IRB(&I);
  1962. setShadow(&I, IRB.CreateSExt(getShadow(&I, 0), I.getType(), "_msprop"));
  1963. setOrigin(&I, getOrigin(&I, 0));
  1964. }
  1965. void visitZExtInst(ZExtInst &I) {
  1966. IRBuilder<> IRB(&I);
  1967. setShadow(&I, IRB.CreateZExt(getShadow(&I, 0), I.getType(), "_msprop"));
  1968. setOrigin(&I, getOrigin(&I, 0));
  1969. }
  1970. void visitTruncInst(TruncInst &I) {
  1971. IRBuilder<> IRB(&I);
  1972. setShadow(&I, IRB.CreateTrunc(getShadow(&I, 0), I.getType(), "_msprop"));
  1973. setOrigin(&I, getOrigin(&I, 0));
  1974. }
  1975. void visitBitCastInst(BitCastInst &I) {
  1976. // Special case: if this is the bitcast (there is exactly 1 allowed) between
  1977. // a musttail call and a ret, don't instrument. New instructions are not
  1978. // allowed after a musttail call.
  1979. if (auto *CI = dyn_cast<CallInst>(I.getOperand(0)))
  1980. if (CI->isMustTailCall())
  1981. return;
  1982. IRBuilder<> IRB(&I);
  1983. setShadow(&I, IRB.CreateBitCast(getShadow(&I, 0), getShadowTy(&I)));
  1984. setOrigin(&I, getOrigin(&I, 0));
  1985. }
  1986. void visitPtrToIntInst(PtrToIntInst &I) {
  1987. IRBuilder<> IRB(&I);
  1988. setShadow(&I, IRB.CreateIntCast(getShadow(&I, 0), getShadowTy(&I), false,
  1989. "_msprop_ptrtoint"));
  1990. setOrigin(&I, getOrigin(&I, 0));
  1991. }
  1992. void visitIntToPtrInst(IntToPtrInst &I) {
  1993. IRBuilder<> IRB(&I);
  1994. setShadow(&I, IRB.CreateIntCast(getShadow(&I, 0), getShadowTy(&I), false,
  1995. "_msprop_inttoptr"));
  1996. setOrigin(&I, getOrigin(&I, 0));
  1997. }
  1998. void visitFPToSIInst(CastInst &I) { handleShadowOr(I); }
  1999. void visitFPToUIInst(CastInst &I) { handleShadowOr(I); }
  2000. void visitSIToFPInst(CastInst &I) { handleShadowOr(I); }
  2001. void visitUIToFPInst(CastInst &I) { handleShadowOr(I); }
  2002. void visitFPExtInst(CastInst &I) { handleShadowOr(I); }
  2003. void visitFPTruncInst(CastInst &I) { handleShadowOr(I); }
  2004. /// Propagate shadow for bitwise AND.
  2005. ///
  2006. /// This code is exact, i.e. if, for example, a bit in the left argument
  2007. /// is defined and 0, then neither the value not definedness of the
  2008. /// corresponding bit in B don't affect the resulting shadow.
  2009. void visitAnd(BinaryOperator &I) {
  2010. IRBuilder<> IRB(&I);
  2011. // "And" of 0 and a poisoned value results in unpoisoned value.
  2012. // 1&1 => 1; 0&1 => 0; p&1 => p;
  2013. // 1&0 => 0; 0&0 => 0; p&0 => 0;
  2014. // 1&p => p; 0&p => 0; p&p => p;
  2015. // S = (S1 & S2) | (V1 & S2) | (S1 & V2)
  2016. Value *S1 = getShadow(&I, 0);
  2017. Value *S2 = getShadow(&I, 1);
  2018. Value *V1 = I.getOperand(0);
  2019. Value *V2 = I.getOperand(1);
  2020. if (V1->getType() != S1->getType()) {
  2021. V1 = IRB.CreateIntCast(V1, S1->getType(), false);
  2022. V2 = IRB.CreateIntCast(V2, S2->getType(), false);
  2023. }
  2024. Value *S1S2 = IRB.CreateAnd(S1, S2);
  2025. Value *V1S2 = IRB.CreateAnd(V1, S2);
  2026. Value *S1V2 = IRB.CreateAnd(S1, V2);
  2027. setShadow(&I, IRB.CreateOr({S1S2, V1S2, S1V2}));
  2028. setOriginForNaryOp(I);
  2029. }
  2030. void visitOr(BinaryOperator &I) {
  2031. IRBuilder<> IRB(&I);
  2032. // "Or" of 1 and a poisoned value results in unpoisoned value.
  2033. // 1|1 => 1; 0|1 => 1; p|1 => 1;
  2034. // 1|0 => 1; 0|0 => 0; p|0 => p;
  2035. // 1|p => 1; 0|p => p; p|p => p;
  2036. // S = (S1 & S2) | (~V1 & S2) | (S1 & ~V2)
  2037. Value *S1 = getShadow(&I, 0);
  2038. Value *S2 = getShadow(&I, 1);
  2039. Value *V1 = IRB.CreateNot(I.getOperand(0));
  2040. Value *V2 = IRB.CreateNot(I.getOperand(1));
  2041. if (V1->getType() != S1->getType()) {
  2042. V1 = IRB.CreateIntCast(V1, S1->getType(), false);
  2043. V2 = IRB.CreateIntCast(V2, S2->getType(), false);
  2044. }
  2045. Value *S1S2 = IRB.CreateAnd(S1, S2);
  2046. Value *V1S2 = IRB.CreateAnd(V1, S2);
  2047. Value *S1V2 = IRB.CreateAnd(S1, V2);
  2048. setShadow(&I, IRB.CreateOr({S1S2, V1S2, S1V2}));
  2049. setOriginForNaryOp(I);
  2050. }
  2051. /// Default propagation of shadow and/or origin.
  2052. ///
  2053. /// This class implements the general case of shadow propagation, used in all
  2054. /// cases where we don't know and/or don't care about what the operation
  2055. /// actually does. It converts all input shadow values to a common type
  2056. /// (extending or truncating as necessary), and bitwise OR's them.
  2057. ///
  2058. /// This is much cheaper than inserting checks (i.e. requiring inputs to be
  2059. /// fully initialized), and less prone to false positives.
  2060. ///
  2061. /// This class also implements the general case of origin propagation. For a
  2062. /// Nary operation, result origin is set to the origin of an argument that is
  2063. /// not entirely initialized. If there is more than one such arguments, the
  2064. /// rightmost of them is picked. It does not matter which one is picked if all
  2065. /// arguments are initialized.
  2066. template <bool CombineShadow> class Combiner {
  2067. Value *Shadow = nullptr;
  2068. Value *Origin = nullptr;
  2069. IRBuilder<> &IRB;
  2070. MemorySanitizerVisitor *MSV;
  2071. public:
  2072. Combiner(MemorySanitizerVisitor *MSV, IRBuilder<> &IRB)
  2073. : IRB(IRB), MSV(MSV) {}
  2074. /// Add a pair of shadow and origin values to the mix.
  2075. Combiner &Add(Value *OpShadow, Value *OpOrigin) {
  2076. if (CombineShadow) {
  2077. assert(OpShadow);
  2078. if (!Shadow)
  2079. Shadow = OpShadow;
  2080. else {
  2081. OpShadow = MSV->CreateShadowCast(IRB, OpShadow, Shadow->getType());
  2082. Shadow = IRB.CreateOr(Shadow, OpShadow, "_msprop");
  2083. }
  2084. }
  2085. if (MSV->MS.TrackOrigins) {
  2086. assert(OpOrigin);
  2087. if (!Origin) {
  2088. Origin = OpOrigin;
  2089. } else {
  2090. Constant *ConstOrigin = dyn_cast<Constant>(OpOrigin);
  2091. // No point in adding something that might result in 0 origin value.
  2092. if (!ConstOrigin || !ConstOrigin->isNullValue()) {
  2093. Value *FlatShadow = MSV->convertShadowToScalar(OpShadow, IRB);
  2094. Value *Cond =
  2095. IRB.CreateICmpNE(FlatShadow, MSV->getCleanShadow(FlatShadow));
  2096. Origin = IRB.CreateSelect(Cond, OpOrigin, Origin);
  2097. }
  2098. }
  2099. }
  2100. return *this;
  2101. }
  2102. /// Add an application value to the mix.
  2103. Combiner &Add(Value *V) {
  2104. Value *OpShadow = MSV->getShadow(V);
  2105. Value *OpOrigin = MSV->MS.TrackOrigins ? MSV->getOrigin(V) : nullptr;
  2106. return Add(OpShadow, OpOrigin);
  2107. }
  2108. /// Set the current combined values as the given instruction's shadow
  2109. /// and origin.
  2110. void Done(Instruction *I) {
  2111. if (CombineShadow) {
  2112. assert(Shadow);
  2113. Shadow = MSV->CreateShadowCast(IRB, Shadow, MSV->getShadowTy(I));
  2114. MSV->setShadow(I, Shadow);
  2115. }
  2116. if (MSV->MS.TrackOrigins) {
  2117. assert(Origin);
  2118. MSV->setOrigin(I, Origin);
  2119. }
  2120. }
  2121. };
  2122. using ShadowAndOriginCombiner = Combiner<true>;
  2123. using OriginCombiner = Combiner<false>;
  2124. /// Propagate origin for arbitrary operation.
  2125. void setOriginForNaryOp(Instruction &I) {
  2126. if (!MS.TrackOrigins)
  2127. return;
  2128. IRBuilder<> IRB(&I);
  2129. OriginCombiner OC(this, IRB);
  2130. for (Use &Op : I.operands())
  2131. OC.Add(Op.get());
  2132. OC.Done(&I);
  2133. }
  2134. size_t VectorOrPrimitiveTypeSizeInBits(Type *Ty) {
  2135. assert(!(Ty->isVectorTy() && Ty->getScalarType()->isPointerTy()) &&
  2136. "Vector of pointers is not a valid shadow type");
  2137. return Ty->isVectorTy() ? cast<FixedVectorType>(Ty)->getNumElements() *
  2138. Ty->getScalarSizeInBits()
  2139. : Ty->getPrimitiveSizeInBits();
  2140. }
  2141. /// Cast between two shadow types, extending or truncating as
  2142. /// necessary.
  2143. Value *CreateShadowCast(IRBuilder<> &IRB, Value *V, Type *dstTy,
  2144. bool Signed = false) {
  2145. Type *srcTy = V->getType();
  2146. size_t srcSizeInBits = VectorOrPrimitiveTypeSizeInBits(srcTy);
  2147. size_t dstSizeInBits = VectorOrPrimitiveTypeSizeInBits(dstTy);
  2148. if (srcSizeInBits > 1 && dstSizeInBits == 1)
  2149. return IRB.CreateICmpNE(V, getCleanShadow(V));
  2150. if (dstTy->isIntegerTy() && srcTy->isIntegerTy())
  2151. return IRB.CreateIntCast(V, dstTy, Signed);
  2152. if (dstTy->isVectorTy() && srcTy->isVectorTy() &&
  2153. cast<FixedVectorType>(dstTy)->getNumElements() ==
  2154. cast<FixedVectorType>(srcTy)->getNumElements())
  2155. return IRB.CreateIntCast(V, dstTy, Signed);
  2156. Value *V1 = IRB.CreateBitCast(V, Type::getIntNTy(*MS.C, srcSizeInBits));
  2157. Value *V2 =
  2158. IRB.CreateIntCast(V1, Type::getIntNTy(*MS.C, dstSizeInBits), Signed);
  2159. return IRB.CreateBitCast(V2, dstTy);
  2160. // TODO: handle struct types.
  2161. }
  2162. /// Cast an application value to the type of its own shadow.
  2163. Value *CreateAppToShadowCast(IRBuilder<> &IRB, Value *V) {
  2164. Type *ShadowTy = getShadowTy(V);
  2165. if (V->getType() == ShadowTy)
  2166. return V;
  2167. if (V->getType()->isPtrOrPtrVectorTy())
  2168. return IRB.CreatePtrToInt(V, ShadowTy);
  2169. else
  2170. return IRB.CreateBitCast(V, ShadowTy);
  2171. }
  2172. /// Propagate shadow for arbitrary operation.
  2173. void handleShadowOr(Instruction &I) {
  2174. IRBuilder<> IRB(&I);
  2175. ShadowAndOriginCombiner SC(this, IRB);
  2176. for (Use &Op : I.operands())
  2177. SC.Add(Op.get());
  2178. SC.Done(&I);
  2179. }
  2180. void visitFNeg(UnaryOperator &I) { handleShadowOr(I); }
  2181. // Handle multiplication by constant.
  2182. //
  2183. // Handle a special case of multiplication by constant that may have one or
  2184. // more zeros in the lower bits. This makes corresponding number of lower bits
  2185. // of the result zero as well. We model it by shifting the other operand
  2186. // shadow left by the required number of bits. Effectively, we transform
  2187. // (X * (A * 2**B)) to ((X << B) * A) and instrument (X << B) as (Sx << B).
  2188. // We use multiplication by 2**N instead of shift to cover the case of
  2189. // multiplication by 0, which may occur in some elements of a vector operand.
  2190. void handleMulByConstant(BinaryOperator &I, Constant *ConstArg,
  2191. Value *OtherArg) {
  2192. Constant *ShadowMul;
  2193. Type *Ty = ConstArg->getType();
  2194. if (auto *VTy = dyn_cast<VectorType>(Ty)) {
  2195. unsigned NumElements = cast<FixedVectorType>(VTy)->getNumElements();
  2196. Type *EltTy = VTy->getElementType();
  2197. SmallVector<Constant *, 16> Elements;
  2198. for (unsigned Idx = 0; Idx < NumElements; ++Idx) {
  2199. if (ConstantInt *Elt =
  2200. dyn_cast<ConstantInt>(ConstArg->getAggregateElement(Idx))) {
  2201. const APInt &V = Elt->getValue();
  2202. APInt V2 = APInt(V.getBitWidth(), 1) << V.countTrailingZeros();
  2203. Elements.push_back(ConstantInt::get(EltTy, V2));
  2204. } else {
  2205. Elements.push_back(ConstantInt::get(EltTy, 1));
  2206. }
  2207. }
  2208. ShadowMul = ConstantVector::get(Elements);
  2209. } else {
  2210. if (ConstantInt *Elt = dyn_cast<ConstantInt>(ConstArg)) {
  2211. const APInt &V = Elt->getValue();
  2212. APInt V2 = APInt(V.getBitWidth(), 1) << V.countTrailingZeros();
  2213. ShadowMul = ConstantInt::get(Ty, V2);
  2214. } else {
  2215. ShadowMul = ConstantInt::get(Ty, 1);
  2216. }
  2217. }
  2218. IRBuilder<> IRB(&I);
  2219. setShadow(&I,
  2220. IRB.CreateMul(getShadow(OtherArg), ShadowMul, "msprop_mul_cst"));
  2221. setOrigin(&I, getOrigin(OtherArg));
  2222. }
  2223. void visitMul(BinaryOperator &I) {
  2224. Constant *constOp0 = dyn_cast<Constant>(I.getOperand(0));
  2225. Constant *constOp1 = dyn_cast<Constant>(I.getOperand(1));
  2226. if (constOp0 && !constOp1)
  2227. handleMulByConstant(I, constOp0, I.getOperand(1));
  2228. else if (constOp1 && !constOp0)
  2229. handleMulByConstant(I, constOp1, I.getOperand(0));
  2230. else
  2231. handleShadowOr(I);
  2232. }
  2233. void visitFAdd(BinaryOperator &I) { handleShadowOr(I); }
  2234. void visitFSub(BinaryOperator &I) { handleShadowOr(I); }
  2235. void visitFMul(BinaryOperator &I) { handleShadowOr(I); }
  2236. void visitAdd(BinaryOperator &I) { handleShadowOr(I); }
  2237. void visitSub(BinaryOperator &I) { handleShadowOr(I); }
  2238. void visitXor(BinaryOperator &I) { handleShadowOr(I); }
  2239. void handleIntegerDiv(Instruction &I) {
  2240. IRBuilder<> IRB(&I);
  2241. // Strict on the second argument.
  2242. insertShadowCheck(I.getOperand(1), &I);
  2243. setShadow(&I, getShadow(&I, 0));
  2244. setOrigin(&I, getOrigin(&I, 0));
  2245. }
  2246. void visitUDiv(BinaryOperator &I) { handleIntegerDiv(I); }
  2247. void visitSDiv(BinaryOperator &I) { handleIntegerDiv(I); }
  2248. void visitURem(BinaryOperator &I) { handleIntegerDiv(I); }
  2249. void visitSRem(BinaryOperator &I) { handleIntegerDiv(I); }
  2250. // Floating point division is side-effect free. We can not require that the
  2251. // divisor is fully initialized and must propagate shadow. See PR37523.
  2252. void visitFDiv(BinaryOperator &I) { handleShadowOr(I); }
  2253. void visitFRem(BinaryOperator &I) { handleShadowOr(I); }
  2254. /// Instrument == and != comparisons.
  2255. ///
  2256. /// Sometimes the comparison result is known even if some of the bits of the
  2257. /// arguments are not.
  2258. void handleEqualityComparison(ICmpInst &I) {
  2259. IRBuilder<> IRB(&I);
  2260. Value *A = I.getOperand(0);
  2261. Value *B = I.getOperand(1);
  2262. Value *Sa = getShadow(A);
  2263. Value *Sb = getShadow(B);
  2264. // Get rid of pointers and vectors of pointers.
  2265. // For ints (and vectors of ints), types of A and Sa match,
  2266. // and this is a no-op.
  2267. A = IRB.CreatePointerCast(A, Sa->getType());
  2268. B = IRB.CreatePointerCast(B, Sb->getType());
  2269. // A == B <==> (C = A^B) == 0
  2270. // A != B <==> (C = A^B) != 0
  2271. // Sc = Sa | Sb
  2272. Value *C = IRB.CreateXor(A, B);
  2273. Value *Sc = IRB.CreateOr(Sa, Sb);
  2274. // Now dealing with i = (C == 0) comparison (or C != 0, does not matter now)
  2275. // Result is defined if one of the following is true
  2276. // * there is a defined 1 bit in C
  2277. // * C is fully defined
  2278. // Si = !(C & ~Sc) && Sc
  2279. Value *Zero = Constant::getNullValue(Sc->getType());
  2280. Value *MinusOne = Constant::getAllOnesValue(Sc->getType());
  2281. Value *LHS = IRB.CreateICmpNE(Sc, Zero);
  2282. Value *RHS =
  2283. IRB.CreateICmpEQ(IRB.CreateAnd(IRB.CreateXor(Sc, MinusOne), C), Zero);
  2284. Value *Si = IRB.CreateAnd(LHS, RHS);
  2285. Si->setName("_msprop_icmp");
  2286. setShadow(&I, Si);
  2287. setOriginForNaryOp(I);
  2288. }
  2289. /// Build the lowest possible value of V, taking into account V's
  2290. /// uninitialized bits.
  2291. Value *getLowestPossibleValue(IRBuilder<> &IRB, Value *A, Value *Sa,
  2292. bool isSigned) {
  2293. if (isSigned) {
  2294. // Split shadow into sign bit and other bits.
  2295. Value *SaOtherBits = IRB.CreateLShr(IRB.CreateShl(Sa, 1), 1);
  2296. Value *SaSignBit = IRB.CreateXor(Sa, SaOtherBits);
  2297. // Maximise the undefined shadow bit, minimize other undefined bits.
  2298. return IRB.CreateOr(IRB.CreateAnd(A, IRB.CreateNot(SaOtherBits)),
  2299. SaSignBit);
  2300. } else {
  2301. // Minimize undefined bits.
  2302. return IRB.CreateAnd(A, IRB.CreateNot(Sa));
  2303. }
  2304. }
  2305. /// Build the highest possible value of V, taking into account V's
  2306. /// uninitialized bits.
  2307. Value *getHighestPossibleValue(IRBuilder<> &IRB, Value *A, Value *Sa,
  2308. bool isSigned) {
  2309. if (isSigned) {
  2310. // Split shadow into sign bit and other bits.
  2311. Value *SaOtherBits = IRB.CreateLShr(IRB.CreateShl(Sa, 1), 1);
  2312. Value *SaSignBit = IRB.CreateXor(Sa, SaOtherBits);
  2313. // Minimise the undefined shadow bit, maximise other undefined bits.
  2314. return IRB.CreateOr(IRB.CreateAnd(A, IRB.CreateNot(SaSignBit)),
  2315. SaOtherBits);
  2316. } else {
  2317. // Maximize undefined bits.
  2318. return IRB.CreateOr(A, Sa);
  2319. }
  2320. }
  2321. /// Instrument relational comparisons.
  2322. ///
  2323. /// This function does exact shadow propagation for all relational
  2324. /// comparisons of integers, pointers and vectors of those.
  2325. /// FIXME: output seems suboptimal when one of the operands is a constant
  2326. void handleRelationalComparisonExact(ICmpInst &I) {
  2327. IRBuilder<> IRB(&I);
  2328. Value *A = I.getOperand(0);
  2329. Value *B = I.getOperand(1);
  2330. Value *Sa = getShadow(A);
  2331. Value *Sb = getShadow(B);
  2332. // Get rid of pointers and vectors of pointers.
  2333. // For ints (and vectors of ints), types of A and Sa match,
  2334. // and this is a no-op.
  2335. A = IRB.CreatePointerCast(A, Sa->getType());
  2336. B = IRB.CreatePointerCast(B, Sb->getType());
  2337. // Let [a0, a1] be the interval of possible values of A, taking into account
  2338. // its undefined bits. Let [b0, b1] be the interval of possible values of B.
  2339. // Then (A cmp B) is defined iff (a0 cmp b1) == (a1 cmp b0).
  2340. bool IsSigned = I.isSigned();
  2341. Value *S1 = IRB.CreateICmp(I.getPredicate(),
  2342. getLowestPossibleValue(IRB, A, Sa, IsSigned),
  2343. getHighestPossibleValue(IRB, B, Sb, IsSigned));
  2344. Value *S2 = IRB.CreateICmp(I.getPredicate(),
  2345. getHighestPossibleValue(IRB, A, Sa, IsSigned),
  2346. getLowestPossibleValue(IRB, B, Sb, IsSigned));
  2347. Value *Si = IRB.CreateXor(S1, S2);
  2348. setShadow(&I, Si);
  2349. setOriginForNaryOp(I);
  2350. }
  2351. /// Instrument signed relational comparisons.
  2352. ///
  2353. /// Handle sign bit tests: x<0, x>=0, x<=-1, x>-1 by propagating the highest
  2354. /// bit of the shadow. Everything else is delegated to handleShadowOr().
  2355. void handleSignedRelationalComparison(ICmpInst &I) {
  2356. Constant *constOp;
  2357. Value *op = nullptr;
  2358. CmpInst::Predicate pre;
  2359. if ((constOp = dyn_cast<Constant>(I.getOperand(1)))) {
  2360. op = I.getOperand(0);
  2361. pre = I.getPredicate();
  2362. } else if ((constOp = dyn_cast<Constant>(I.getOperand(0)))) {
  2363. op = I.getOperand(1);
  2364. pre = I.getSwappedPredicate();
  2365. } else {
  2366. handleShadowOr(I);
  2367. return;
  2368. }
  2369. if ((constOp->isNullValue() &&
  2370. (pre == CmpInst::ICMP_SLT || pre == CmpInst::ICMP_SGE)) ||
  2371. (constOp->isAllOnesValue() &&
  2372. (pre == CmpInst::ICMP_SGT || pre == CmpInst::ICMP_SLE))) {
  2373. IRBuilder<> IRB(&I);
  2374. Value *Shadow = IRB.CreateICmpSLT(getShadow(op), getCleanShadow(op),
  2375. "_msprop_icmp_s");
  2376. setShadow(&I, Shadow);
  2377. setOrigin(&I, getOrigin(op));
  2378. } else {
  2379. handleShadowOr(I);
  2380. }
  2381. }
  2382. void visitICmpInst(ICmpInst &I) {
  2383. if (!ClHandleICmp) {
  2384. handleShadowOr(I);
  2385. return;
  2386. }
  2387. if (I.isEquality()) {
  2388. handleEqualityComparison(I);
  2389. return;
  2390. }
  2391. assert(I.isRelational());
  2392. if (ClHandleICmpExact) {
  2393. handleRelationalComparisonExact(I);
  2394. return;
  2395. }
  2396. if (I.isSigned()) {
  2397. handleSignedRelationalComparison(I);
  2398. return;
  2399. }
  2400. assert(I.isUnsigned());
  2401. if ((isa<Constant>(I.getOperand(0)) || isa<Constant>(I.getOperand(1)))) {
  2402. handleRelationalComparisonExact(I);
  2403. return;
  2404. }
  2405. handleShadowOr(I);
  2406. }
  2407. void visitFCmpInst(FCmpInst &I) { handleShadowOr(I); }
  2408. void handleShift(BinaryOperator &I) {
  2409. IRBuilder<> IRB(&I);
  2410. // If any of the S2 bits are poisoned, the whole thing is poisoned.
  2411. // Otherwise perform the same shift on S1.
  2412. Value *S1 = getShadow(&I, 0);
  2413. Value *S2 = getShadow(&I, 1);
  2414. Value *S2Conv =
  2415. IRB.CreateSExt(IRB.CreateICmpNE(S2, getCleanShadow(S2)), S2->getType());
  2416. Value *V2 = I.getOperand(1);
  2417. Value *Shift = IRB.CreateBinOp(I.getOpcode(), S1, V2);
  2418. setShadow(&I, IRB.CreateOr(Shift, S2Conv));
  2419. setOriginForNaryOp(I);
  2420. }
  2421. void visitShl(BinaryOperator &I) { handleShift(I); }
  2422. void visitAShr(BinaryOperator &I) { handleShift(I); }
  2423. void visitLShr(BinaryOperator &I) { handleShift(I); }
  2424. void handleFunnelShift(IntrinsicInst &I) {
  2425. IRBuilder<> IRB(&I);
  2426. // If any of the S2 bits are poisoned, the whole thing is poisoned.
  2427. // Otherwise perform the same shift on S0 and S1.
  2428. Value *S0 = getShadow(&I, 0);
  2429. Value *S1 = getShadow(&I, 1);
  2430. Value *S2 = getShadow(&I, 2);
  2431. Value *S2Conv =
  2432. IRB.CreateSExt(IRB.CreateICmpNE(S2, getCleanShadow(S2)), S2->getType());
  2433. Value *V2 = I.getOperand(2);
  2434. Function *Intrin = Intrinsic::getDeclaration(
  2435. I.getModule(), I.getIntrinsicID(), S2Conv->getType());
  2436. Value *Shift = IRB.CreateCall(Intrin, {S0, S1, V2});
  2437. setShadow(&I, IRB.CreateOr(Shift, S2Conv));
  2438. setOriginForNaryOp(I);
  2439. }
  2440. /// Instrument llvm.memmove
  2441. ///
  2442. /// At this point we don't know if llvm.memmove will be inlined or not.
  2443. /// If we don't instrument it and it gets inlined,
  2444. /// our interceptor will not kick in and we will lose the memmove.
  2445. /// If we instrument the call here, but it does not get inlined,
  2446. /// we will memove the shadow twice: which is bad in case
  2447. /// of overlapping regions. So, we simply lower the intrinsic to a call.
  2448. ///
  2449. /// Similar situation exists for memcpy and memset.
  2450. void visitMemMoveInst(MemMoveInst &I) {
  2451. getShadow(I.getArgOperand(1)); // Ensure shadow initialized
  2452. IRBuilder<> IRB(&I);
  2453. IRB.CreateCall(
  2454. MS.MemmoveFn,
  2455. {IRB.CreatePointerCast(I.getArgOperand(0), IRB.getInt8PtrTy()),
  2456. IRB.CreatePointerCast(I.getArgOperand(1), IRB.getInt8PtrTy()),
  2457. IRB.CreateIntCast(I.getArgOperand(2), MS.IntptrTy, false)});
  2458. I.eraseFromParent();
  2459. }
  2460. /// Instrument memcpy
  2461. ///
  2462. /// Similar to memmove: avoid copying shadow twice. This is somewhat
  2463. /// unfortunate as it may slowdown small constant memcpys.
  2464. /// FIXME: consider doing manual inline for small constant sizes and proper
  2465. /// alignment.
  2466. ///
  2467. /// Note: This also handles memcpy.inline, which promises no calls to external
  2468. /// functions as an optimization. However, with instrumentation enabled this
  2469. /// is difficult to promise; additionally, we know that the MSan runtime
  2470. /// exists and provides __msan_memcpy(). Therefore, we assume that with
  2471. /// instrumentation it's safe to turn memcpy.inline into a call to
  2472. /// __msan_memcpy(). Should this be wrong, such as when implementing memcpy()
  2473. /// itself, instrumentation should be disabled with the no_sanitize attribute.
  2474. void visitMemCpyInst(MemCpyInst &I) {
  2475. getShadow(I.getArgOperand(1)); // Ensure shadow initialized
  2476. IRBuilder<> IRB(&I);
  2477. IRB.CreateCall(
  2478. MS.MemcpyFn,
  2479. {IRB.CreatePointerCast(I.getArgOperand(0), IRB.getInt8PtrTy()),
  2480. IRB.CreatePointerCast(I.getArgOperand(1), IRB.getInt8PtrTy()),
  2481. IRB.CreateIntCast(I.getArgOperand(2), MS.IntptrTy, false)});
  2482. I.eraseFromParent();
  2483. }
  2484. // Same as memcpy.
  2485. void visitMemSetInst(MemSetInst &I) {
  2486. IRBuilder<> IRB(&I);
  2487. IRB.CreateCall(
  2488. MS.MemsetFn,
  2489. {IRB.CreatePointerCast(I.getArgOperand(0), IRB.getInt8PtrTy()),
  2490. IRB.CreateIntCast(I.getArgOperand(1), IRB.getInt32Ty(), false),
  2491. IRB.CreateIntCast(I.getArgOperand(2), MS.IntptrTy, false)});
  2492. I.eraseFromParent();
  2493. }
  2494. void visitVAStartInst(VAStartInst &I) { VAHelper->visitVAStartInst(I); }
  2495. void visitVACopyInst(VACopyInst &I) { VAHelper->visitVACopyInst(I); }
  2496. /// Handle vector store-like intrinsics.
  2497. ///
  2498. /// Instrument intrinsics that look like a simple SIMD store: writes memory,
  2499. /// has 1 pointer argument and 1 vector argument, returns void.
  2500. bool handleVectorStoreIntrinsic(IntrinsicInst &I) {
  2501. IRBuilder<> IRB(&I);
  2502. Value *Addr = I.getArgOperand(0);
  2503. Value *Shadow = getShadow(&I, 1);
  2504. Value *ShadowPtr, *OriginPtr;
  2505. // We don't know the pointer alignment (could be unaligned SSE store!).
  2506. // Have to assume to worst case.
  2507. std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr(
  2508. Addr, IRB, Shadow->getType(), Align(1), /*isStore*/ true);
  2509. IRB.CreateAlignedStore(Shadow, ShadowPtr, Align(1));
  2510. if (ClCheckAccessAddress)
  2511. insertShadowCheck(Addr, &I);
  2512. // FIXME: factor out common code from materializeStores
  2513. if (MS.TrackOrigins)
  2514. IRB.CreateStore(getOrigin(&I, 1), OriginPtr);
  2515. return true;
  2516. }
  2517. /// Handle vector load-like intrinsics.
  2518. ///
  2519. /// Instrument intrinsics that look like a simple SIMD load: reads memory,
  2520. /// has 1 pointer argument, returns a vector.
  2521. bool handleVectorLoadIntrinsic(IntrinsicInst &I) {
  2522. IRBuilder<> IRB(&I);
  2523. Value *Addr = I.getArgOperand(0);
  2524. Type *ShadowTy = getShadowTy(&I);
  2525. Value *ShadowPtr = nullptr, *OriginPtr = nullptr;
  2526. if (PropagateShadow) {
  2527. // We don't know the pointer alignment (could be unaligned SSE load!).
  2528. // Have to assume to worst case.
  2529. const Align Alignment = Align(1);
  2530. std::tie(ShadowPtr, OriginPtr) =
  2531. getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
  2532. setShadow(&I,
  2533. IRB.CreateAlignedLoad(ShadowTy, ShadowPtr, Alignment, "_msld"));
  2534. } else {
  2535. setShadow(&I, getCleanShadow(&I));
  2536. }
  2537. if (ClCheckAccessAddress)
  2538. insertShadowCheck(Addr, &I);
  2539. if (MS.TrackOrigins) {
  2540. if (PropagateShadow)
  2541. setOrigin(&I, IRB.CreateLoad(MS.OriginTy, OriginPtr));
  2542. else
  2543. setOrigin(&I, getCleanOrigin());
  2544. }
  2545. return true;
  2546. }
  2547. /// Handle (SIMD arithmetic)-like intrinsics.
  2548. ///
  2549. /// Instrument intrinsics with any number of arguments of the same type,
  2550. /// equal to the return type. The type should be simple (no aggregates or
  2551. /// pointers; vectors are fine).
  2552. /// Caller guarantees that this intrinsic does not access memory.
  2553. bool maybeHandleSimpleNomemIntrinsic(IntrinsicInst &I) {
  2554. Type *RetTy = I.getType();
  2555. if (!(RetTy->isIntOrIntVectorTy() || RetTy->isFPOrFPVectorTy() ||
  2556. RetTy->isX86_MMXTy()))
  2557. return false;
  2558. unsigned NumArgOperands = I.arg_size();
  2559. for (unsigned i = 0; i < NumArgOperands; ++i) {
  2560. Type *Ty = I.getArgOperand(i)->getType();
  2561. if (Ty != RetTy)
  2562. return false;
  2563. }
  2564. IRBuilder<> IRB(&I);
  2565. ShadowAndOriginCombiner SC(this, IRB);
  2566. for (unsigned i = 0; i < NumArgOperands; ++i)
  2567. SC.Add(I.getArgOperand(i));
  2568. SC.Done(&I);
  2569. return true;
  2570. }
  2571. /// Heuristically instrument unknown intrinsics.
  2572. ///
  2573. /// The main purpose of this code is to do something reasonable with all
  2574. /// random intrinsics we might encounter, most importantly - SIMD intrinsics.
  2575. /// We recognize several classes of intrinsics by their argument types and
  2576. /// ModRefBehaviour and apply special instrumentation when we are reasonably
  2577. /// sure that we know what the intrinsic does.
  2578. ///
  2579. /// We special-case intrinsics where this approach fails. See llvm.bswap
  2580. /// handling as an example of that.
  2581. bool handleUnknownIntrinsic(IntrinsicInst &I) {
  2582. unsigned NumArgOperands = I.arg_size();
  2583. if (NumArgOperands == 0)
  2584. return false;
  2585. if (NumArgOperands == 2 && I.getArgOperand(0)->getType()->isPointerTy() &&
  2586. I.getArgOperand(1)->getType()->isVectorTy() &&
  2587. I.getType()->isVoidTy() && !I.onlyReadsMemory()) {
  2588. // This looks like a vector store.
  2589. return handleVectorStoreIntrinsic(I);
  2590. }
  2591. if (NumArgOperands == 1 && I.getArgOperand(0)->getType()->isPointerTy() &&
  2592. I.getType()->isVectorTy() && I.onlyReadsMemory()) {
  2593. // This looks like a vector load.
  2594. return handleVectorLoadIntrinsic(I);
  2595. }
  2596. if (I.doesNotAccessMemory())
  2597. if (maybeHandleSimpleNomemIntrinsic(I))
  2598. return true;
  2599. // FIXME: detect and handle SSE maskstore/maskload
  2600. return false;
  2601. }
  2602. void handleInvariantGroup(IntrinsicInst &I) {
  2603. setShadow(&I, getShadow(&I, 0));
  2604. setOrigin(&I, getOrigin(&I, 0));
  2605. }
  2606. void handleLifetimeStart(IntrinsicInst &I) {
  2607. if (!PoisonStack)
  2608. return;
  2609. AllocaInst *AI = llvm::findAllocaForValue(I.getArgOperand(1));
  2610. if (!AI)
  2611. InstrumentLifetimeStart = false;
  2612. LifetimeStartList.push_back(std::make_pair(&I, AI));
  2613. }
  2614. void handleBswap(IntrinsicInst &I) {
  2615. IRBuilder<> IRB(&I);
  2616. Value *Op = I.getArgOperand(0);
  2617. Type *OpType = Op->getType();
  2618. Function *BswapFunc = Intrinsic::getDeclaration(
  2619. F.getParent(), Intrinsic::bswap, ArrayRef(&OpType, 1));
  2620. setShadow(&I, IRB.CreateCall(BswapFunc, getShadow(Op)));
  2621. setOrigin(&I, getOrigin(Op));
  2622. }
  2623. void handleCountZeroes(IntrinsicInst &I) {
  2624. IRBuilder<> IRB(&I);
  2625. Value *Src = I.getArgOperand(0);
  2626. // Set the Output shadow based on input Shadow
  2627. Value *BoolShadow = IRB.CreateIsNotNull(getShadow(Src), "_mscz_bs");
  2628. // If zero poison is requested, mix in with the shadow
  2629. Constant *IsZeroPoison = cast<Constant>(I.getOperand(1));
  2630. if (!IsZeroPoison->isZeroValue()) {
  2631. Value *BoolZeroPoison = IRB.CreateIsNull(Src, "_mscz_bzp");
  2632. BoolShadow = IRB.CreateOr(BoolShadow, BoolZeroPoison, "_mscz_bs");
  2633. }
  2634. Value *OutputShadow =
  2635. IRB.CreateSExt(BoolShadow, getShadowTy(Src), "_mscz_os");
  2636. setShadow(&I, OutputShadow);
  2637. setOriginForNaryOp(I);
  2638. }
  2639. // Instrument vector convert intrinsic.
  2640. //
  2641. // This function instruments intrinsics like cvtsi2ss:
  2642. // %Out = int_xxx_cvtyyy(%ConvertOp)
  2643. // or
  2644. // %Out = int_xxx_cvtyyy(%CopyOp, %ConvertOp)
  2645. // Intrinsic converts \p NumUsedElements elements of \p ConvertOp to the same
  2646. // number \p Out elements, and (if has 2 arguments) copies the rest of the
  2647. // elements from \p CopyOp.
  2648. // In most cases conversion involves floating-point value which may trigger a
  2649. // hardware exception when not fully initialized. For this reason we require
  2650. // \p ConvertOp[0:NumUsedElements] to be fully initialized and trap otherwise.
  2651. // We copy the shadow of \p CopyOp[NumUsedElements:] to \p
  2652. // Out[NumUsedElements:]. This means that intrinsics without \p CopyOp always
  2653. // return a fully initialized value.
  2654. void handleVectorConvertIntrinsic(IntrinsicInst &I, int NumUsedElements,
  2655. bool HasRoundingMode = false) {
  2656. IRBuilder<> IRB(&I);
  2657. Value *CopyOp, *ConvertOp;
  2658. assert((!HasRoundingMode ||
  2659. isa<ConstantInt>(I.getArgOperand(I.arg_size() - 1))) &&
  2660. "Invalid rounding mode");
  2661. switch (I.arg_size() - HasRoundingMode) {
  2662. case 2:
  2663. CopyOp = I.getArgOperand(0);
  2664. ConvertOp = I.getArgOperand(1);
  2665. break;
  2666. case 1:
  2667. ConvertOp = I.getArgOperand(0);
  2668. CopyOp = nullptr;
  2669. break;
  2670. default:
  2671. llvm_unreachable("Cvt intrinsic with unsupported number of arguments.");
  2672. }
  2673. // The first *NumUsedElements* elements of ConvertOp are converted to the
  2674. // same number of output elements. The rest of the output is copied from
  2675. // CopyOp, or (if not available) filled with zeroes.
  2676. // Combine shadow for elements of ConvertOp that are used in this operation,
  2677. // and insert a check.
  2678. // FIXME: consider propagating shadow of ConvertOp, at least in the case of
  2679. // int->any conversion.
  2680. Value *ConvertShadow = getShadow(ConvertOp);
  2681. Value *AggShadow = nullptr;
  2682. if (ConvertOp->getType()->isVectorTy()) {
  2683. AggShadow = IRB.CreateExtractElement(
  2684. ConvertShadow, ConstantInt::get(IRB.getInt32Ty(), 0));
  2685. for (int i = 1; i < NumUsedElements; ++i) {
  2686. Value *MoreShadow = IRB.CreateExtractElement(
  2687. ConvertShadow, ConstantInt::get(IRB.getInt32Ty(), i));
  2688. AggShadow = IRB.CreateOr(AggShadow, MoreShadow);
  2689. }
  2690. } else {
  2691. AggShadow = ConvertShadow;
  2692. }
  2693. assert(AggShadow->getType()->isIntegerTy());
  2694. insertShadowCheck(AggShadow, getOrigin(ConvertOp), &I);
  2695. // Build result shadow by zero-filling parts of CopyOp shadow that come from
  2696. // ConvertOp.
  2697. if (CopyOp) {
  2698. assert(CopyOp->getType() == I.getType());
  2699. assert(CopyOp->getType()->isVectorTy());
  2700. Value *ResultShadow = getShadow(CopyOp);
  2701. Type *EltTy = cast<VectorType>(ResultShadow->getType())->getElementType();
  2702. for (int i = 0; i < NumUsedElements; ++i) {
  2703. ResultShadow = IRB.CreateInsertElement(
  2704. ResultShadow, ConstantInt::getNullValue(EltTy),
  2705. ConstantInt::get(IRB.getInt32Ty(), i));
  2706. }
  2707. setShadow(&I, ResultShadow);
  2708. setOrigin(&I, getOrigin(CopyOp));
  2709. } else {
  2710. setShadow(&I, getCleanShadow(&I));
  2711. setOrigin(&I, getCleanOrigin());
  2712. }
  2713. }
  2714. // Given a scalar or vector, extract lower 64 bits (or less), and return all
  2715. // zeroes if it is zero, and all ones otherwise.
  2716. Value *Lower64ShadowExtend(IRBuilder<> &IRB, Value *S, Type *T) {
  2717. if (S->getType()->isVectorTy())
  2718. S = CreateShadowCast(IRB, S, IRB.getInt64Ty(), /* Signed */ true);
  2719. assert(S->getType()->getPrimitiveSizeInBits() <= 64);
  2720. Value *S2 = IRB.CreateICmpNE(S, getCleanShadow(S));
  2721. return CreateShadowCast(IRB, S2, T, /* Signed */ true);
  2722. }
  2723. // Given a vector, extract its first element, and return all
  2724. // zeroes if it is zero, and all ones otherwise.
  2725. Value *LowerElementShadowExtend(IRBuilder<> &IRB, Value *S, Type *T) {
  2726. Value *S1 = IRB.CreateExtractElement(S, (uint64_t)0);
  2727. Value *S2 = IRB.CreateICmpNE(S1, getCleanShadow(S1));
  2728. return CreateShadowCast(IRB, S2, T, /* Signed */ true);
  2729. }
  2730. Value *VariableShadowExtend(IRBuilder<> &IRB, Value *S) {
  2731. Type *T = S->getType();
  2732. assert(T->isVectorTy());
  2733. Value *S2 = IRB.CreateICmpNE(S, getCleanShadow(S));
  2734. return IRB.CreateSExt(S2, T);
  2735. }
  2736. // Instrument vector shift intrinsic.
  2737. //
  2738. // This function instruments intrinsics like int_x86_avx2_psll_w.
  2739. // Intrinsic shifts %In by %ShiftSize bits.
  2740. // %ShiftSize may be a vector. In that case the lower 64 bits determine shift
  2741. // size, and the rest is ignored. Behavior is defined even if shift size is
  2742. // greater than register (or field) width.
  2743. void handleVectorShiftIntrinsic(IntrinsicInst &I, bool Variable) {
  2744. assert(I.arg_size() == 2);
  2745. IRBuilder<> IRB(&I);
  2746. // If any of the S2 bits are poisoned, the whole thing is poisoned.
  2747. // Otherwise perform the same shift on S1.
  2748. Value *S1 = getShadow(&I, 0);
  2749. Value *S2 = getShadow(&I, 1);
  2750. Value *S2Conv = Variable ? VariableShadowExtend(IRB, S2)
  2751. : Lower64ShadowExtend(IRB, S2, getShadowTy(&I));
  2752. Value *V1 = I.getOperand(0);
  2753. Value *V2 = I.getOperand(1);
  2754. Value *Shift = IRB.CreateCall(I.getFunctionType(), I.getCalledOperand(),
  2755. {IRB.CreateBitCast(S1, V1->getType()), V2});
  2756. Shift = IRB.CreateBitCast(Shift, getShadowTy(&I));
  2757. setShadow(&I, IRB.CreateOr(Shift, S2Conv));
  2758. setOriginForNaryOp(I);
  2759. }
  2760. // Get an X86_MMX-sized vector type.
  2761. Type *getMMXVectorTy(unsigned EltSizeInBits) {
  2762. const unsigned X86_MMXSizeInBits = 64;
  2763. assert(EltSizeInBits != 0 && (X86_MMXSizeInBits % EltSizeInBits) == 0 &&
  2764. "Illegal MMX vector element size");
  2765. return FixedVectorType::get(IntegerType::get(*MS.C, EltSizeInBits),
  2766. X86_MMXSizeInBits / EltSizeInBits);
  2767. }
  2768. // Returns a signed counterpart for an (un)signed-saturate-and-pack
  2769. // intrinsic.
  2770. Intrinsic::ID getSignedPackIntrinsic(Intrinsic::ID id) {
  2771. switch (id) {
  2772. case Intrinsic::x86_sse2_packsswb_128:
  2773. case Intrinsic::x86_sse2_packuswb_128:
  2774. return Intrinsic::x86_sse2_packsswb_128;
  2775. case Intrinsic::x86_sse2_packssdw_128:
  2776. case Intrinsic::x86_sse41_packusdw:
  2777. return Intrinsic::x86_sse2_packssdw_128;
  2778. case Intrinsic::x86_avx2_packsswb:
  2779. case Intrinsic::x86_avx2_packuswb:
  2780. return Intrinsic::x86_avx2_packsswb;
  2781. case Intrinsic::x86_avx2_packssdw:
  2782. case Intrinsic::x86_avx2_packusdw:
  2783. return Intrinsic::x86_avx2_packssdw;
  2784. case Intrinsic::x86_mmx_packsswb:
  2785. case Intrinsic::x86_mmx_packuswb:
  2786. return Intrinsic::x86_mmx_packsswb;
  2787. case Intrinsic::x86_mmx_packssdw:
  2788. return Intrinsic::x86_mmx_packssdw;
  2789. default:
  2790. llvm_unreachable("unexpected intrinsic id");
  2791. }
  2792. }
  2793. // Instrument vector pack intrinsic.
  2794. //
  2795. // This function instruments intrinsics like x86_mmx_packsswb, that
  2796. // packs elements of 2 input vectors into half as many bits with saturation.
  2797. // Shadow is propagated with the signed variant of the same intrinsic applied
  2798. // to sext(Sa != zeroinitializer), sext(Sb != zeroinitializer).
  2799. // EltSizeInBits is used only for x86mmx arguments.
  2800. void handleVectorPackIntrinsic(IntrinsicInst &I, unsigned EltSizeInBits = 0) {
  2801. assert(I.arg_size() == 2);
  2802. bool isX86_MMX = I.getOperand(0)->getType()->isX86_MMXTy();
  2803. IRBuilder<> IRB(&I);
  2804. Value *S1 = getShadow(&I, 0);
  2805. Value *S2 = getShadow(&I, 1);
  2806. assert(isX86_MMX || S1->getType()->isVectorTy());
  2807. // SExt and ICmpNE below must apply to individual elements of input vectors.
  2808. // In case of x86mmx arguments, cast them to appropriate vector types and
  2809. // back.
  2810. Type *T = isX86_MMX ? getMMXVectorTy(EltSizeInBits) : S1->getType();
  2811. if (isX86_MMX) {
  2812. S1 = IRB.CreateBitCast(S1, T);
  2813. S2 = IRB.CreateBitCast(S2, T);
  2814. }
  2815. Value *S1_ext =
  2816. IRB.CreateSExt(IRB.CreateICmpNE(S1, Constant::getNullValue(T)), T);
  2817. Value *S2_ext =
  2818. IRB.CreateSExt(IRB.CreateICmpNE(S2, Constant::getNullValue(T)), T);
  2819. if (isX86_MMX) {
  2820. Type *X86_MMXTy = Type::getX86_MMXTy(*MS.C);
  2821. S1_ext = IRB.CreateBitCast(S1_ext, X86_MMXTy);
  2822. S2_ext = IRB.CreateBitCast(S2_ext, X86_MMXTy);
  2823. }
  2824. Function *ShadowFn = Intrinsic::getDeclaration(
  2825. F.getParent(), getSignedPackIntrinsic(I.getIntrinsicID()));
  2826. Value *S =
  2827. IRB.CreateCall(ShadowFn, {S1_ext, S2_ext}, "_msprop_vector_pack");
  2828. if (isX86_MMX)
  2829. S = IRB.CreateBitCast(S, getShadowTy(&I));
  2830. setShadow(&I, S);
  2831. setOriginForNaryOp(I);
  2832. }
  2833. // Instrument sum-of-absolute-differences intrinsic.
  2834. void handleVectorSadIntrinsic(IntrinsicInst &I) {
  2835. const unsigned SignificantBitsPerResultElement = 16;
  2836. bool isX86_MMX = I.getOperand(0)->getType()->isX86_MMXTy();
  2837. Type *ResTy = isX86_MMX ? IntegerType::get(*MS.C, 64) : I.getType();
  2838. unsigned ZeroBitsPerResultElement =
  2839. ResTy->getScalarSizeInBits() - SignificantBitsPerResultElement;
  2840. IRBuilder<> IRB(&I);
  2841. auto *Shadow0 = getShadow(&I, 0);
  2842. auto *Shadow1 = getShadow(&I, 1);
  2843. Value *S = IRB.CreateOr(Shadow0, Shadow1);
  2844. S = IRB.CreateBitCast(S, ResTy);
  2845. S = IRB.CreateSExt(IRB.CreateICmpNE(S, Constant::getNullValue(ResTy)),
  2846. ResTy);
  2847. S = IRB.CreateLShr(S, ZeroBitsPerResultElement);
  2848. S = IRB.CreateBitCast(S, getShadowTy(&I));
  2849. setShadow(&I, S);
  2850. setOriginForNaryOp(I);
  2851. }
  2852. // Instrument multiply-add intrinsic.
  2853. void handleVectorPmaddIntrinsic(IntrinsicInst &I,
  2854. unsigned EltSizeInBits = 0) {
  2855. bool isX86_MMX = I.getOperand(0)->getType()->isX86_MMXTy();
  2856. Type *ResTy = isX86_MMX ? getMMXVectorTy(EltSizeInBits * 2) : I.getType();
  2857. IRBuilder<> IRB(&I);
  2858. auto *Shadow0 = getShadow(&I, 0);
  2859. auto *Shadow1 = getShadow(&I, 1);
  2860. Value *S = IRB.CreateOr(Shadow0, Shadow1);
  2861. S = IRB.CreateBitCast(S, ResTy);
  2862. S = IRB.CreateSExt(IRB.CreateICmpNE(S, Constant::getNullValue(ResTy)),
  2863. ResTy);
  2864. S = IRB.CreateBitCast(S, getShadowTy(&I));
  2865. setShadow(&I, S);
  2866. setOriginForNaryOp(I);
  2867. }
  2868. // Instrument compare-packed intrinsic.
  2869. // Basically, an or followed by sext(icmp ne 0) to end up with all-zeros or
  2870. // all-ones shadow.
  2871. void handleVectorComparePackedIntrinsic(IntrinsicInst &I) {
  2872. IRBuilder<> IRB(&I);
  2873. Type *ResTy = getShadowTy(&I);
  2874. auto *Shadow0 = getShadow(&I, 0);
  2875. auto *Shadow1 = getShadow(&I, 1);
  2876. Value *S0 = IRB.CreateOr(Shadow0, Shadow1);
  2877. Value *S = IRB.CreateSExt(
  2878. IRB.CreateICmpNE(S0, Constant::getNullValue(ResTy)), ResTy);
  2879. setShadow(&I, S);
  2880. setOriginForNaryOp(I);
  2881. }
  2882. // Instrument compare-scalar intrinsic.
  2883. // This handles both cmp* intrinsics which return the result in the first
  2884. // element of a vector, and comi* which return the result as i32.
  2885. void handleVectorCompareScalarIntrinsic(IntrinsicInst &I) {
  2886. IRBuilder<> IRB(&I);
  2887. auto *Shadow0 = getShadow(&I, 0);
  2888. auto *Shadow1 = getShadow(&I, 1);
  2889. Value *S0 = IRB.CreateOr(Shadow0, Shadow1);
  2890. Value *S = LowerElementShadowExtend(IRB, S0, getShadowTy(&I));
  2891. setShadow(&I, S);
  2892. setOriginForNaryOp(I);
  2893. }
  2894. // Instrument generic vector reduction intrinsics
  2895. // by ORing together all their fields.
  2896. void handleVectorReduceIntrinsic(IntrinsicInst &I) {
  2897. IRBuilder<> IRB(&I);
  2898. Value *S = IRB.CreateOrReduce(getShadow(&I, 0));
  2899. setShadow(&I, S);
  2900. setOrigin(&I, getOrigin(&I, 0));
  2901. }
  2902. // Instrument vector.reduce.or intrinsic.
  2903. // Valid (non-poisoned) set bits in the operand pull low the
  2904. // corresponding shadow bits.
  2905. void handleVectorReduceOrIntrinsic(IntrinsicInst &I) {
  2906. IRBuilder<> IRB(&I);
  2907. Value *OperandShadow = getShadow(&I, 0);
  2908. Value *OperandUnsetBits = IRB.CreateNot(I.getOperand(0));
  2909. Value *OperandUnsetOrPoison = IRB.CreateOr(OperandUnsetBits, OperandShadow);
  2910. // Bit N is clean if any field's bit N is 1 and unpoison
  2911. Value *OutShadowMask = IRB.CreateAndReduce(OperandUnsetOrPoison);
  2912. // Otherwise, it is clean if every field's bit N is unpoison
  2913. Value *OrShadow = IRB.CreateOrReduce(OperandShadow);
  2914. Value *S = IRB.CreateAnd(OutShadowMask, OrShadow);
  2915. setShadow(&I, S);
  2916. setOrigin(&I, getOrigin(&I, 0));
  2917. }
  2918. // Instrument vector.reduce.and intrinsic.
  2919. // Valid (non-poisoned) unset bits in the operand pull down the
  2920. // corresponding shadow bits.
  2921. void handleVectorReduceAndIntrinsic(IntrinsicInst &I) {
  2922. IRBuilder<> IRB(&I);
  2923. Value *OperandShadow = getShadow(&I, 0);
  2924. Value *OperandSetOrPoison = IRB.CreateOr(I.getOperand(0), OperandShadow);
  2925. // Bit N is clean if any field's bit N is 0 and unpoison
  2926. Value *OutShadowMask = IRB.CreateAndReduce(OperandSetOrPoison);
  2927. // Otherwise, it is clean if every field's bit N is unpoison
  2928. Value *OrShadow = IRB.CreateOrReduce(OperandShadow);
  2929. Value *S = IRB.CreateAnd(OutShadowMask, OrShadow);
  2930. setShadow(&I, S);
  2931. setOrigin(&I, getOrigin(&I, 0));
  2932. }
  2933. void handleStmxcsr(IntrinsicInst &I) {
  2934. IRBuilder<> IRB(&I);
  2935. Value *Addr = I.getArgOperand(0);
  2936. Type *Ty = IRB.getInt32Ty();
  2937. Value *ShadowPtr =
  2938. getShadowOriginPtr(Addr, IRB, Ty, Align(1), /*isStore*/ true).first;
  2939. IRB.CreateStore(getCleanShadow(Ty),
  2940. IRB.CreatePointerCast(ShadowPtr, Ty->getPointerTo()));
  2941. if (ClCheckAccessAddress)
  2942. insertShadowCheck(Addr, &I);
  2943. }
  2944. void handleLdmxcsr(IntrinsicInst &I) {
  2945. if (!InsertChecks)
  2946. return;
  2947. IRBuilder<> IRB(&I);
  2948. Value *Addr = I.getArgOperand(0);
  2949. Type *Ty = IRB.getInt32Ty();
  2950. const Align Alignment = Align(1);
  2951. Value *ShadowPtr, *OriginPtr;
  2952. std::tie(ShadowPtr, OriginPtr) =
  2953. getShadowOriginPtr(Addr, IRB, Ty, Alignment, /*isStore*/ false);
  2954. if (ClCheckAccessAddress)
  2955. insertShadowCheck(Addr, &I);
  2956. Value *Shadow = IRB.CreateAlignedLoad(Ty, ShadowPtr, Alignment, "_ldmxcsr");
  2957. Value *Origin = MS.TrackOrigins ? IRB.CreateLoad(MS.OriginTy, OriginPtr)
  2958. : getCleanOrigin();
  2959. insertShadowCheck(Shadow, Origin, &I);
  2960. }
  2961. void handleMaskedExpandLoad(IntrinsicInst &I) {
  2962. IRBuilder<> IRB(&I);
  2963. Value *Ptr = I.getArgOperand(0);
  2964. Value *Mask = I.getArgOperand(1);
  2965. Value *PassThru = I.getArgOperand(2);
  2966. if (ClCheckAccessAddress) {
  2967. insertShadowCheck(Ptr, &I);
  2968. insertShadowCheck(Mask, &I);
  2969. }
  2970. if (!PropagateShadow) {
  2971. setShadow(&I, getCleanShadow(&I));
  2972. setOrigin(&I, getCleanOrigin());
  2973. return;
  2974. }
  2975. Type *ShadowTy = getShadowTy(&I);
  2976. Type *ElementShadowTy = cast<FixedVectorType>(ShadowTy)->getElementType();
  2977. auto [ShadowPtr, OriginPtr] =
  2978. getShadowOriginPtr(Ptr, IRB, ElementShadowTy, {}, /*isStore*/ false);
  2979. Value *Shadow = IRB.CreateMaskedExpandLoad(
  2980. ShadowTy, ShadowPtr, Mask, getShadow(PassThru), "_msmaskedexpload");
  2981. setShadow(&I, Shadow);
  2982. // TODO: Store origins.
  2983. setOrigin(&I, getCleanOrigin());
  2984. }
  2985. void handleMaskedCompressStore(IntrinsicInst &I) {
  2986. IRBuilder<> IRB(&I);
  2987. Value *Values = I.getArgOperand(0);
  2988. Value *Ptr = I.getArgOperand(1);
  2989. Value *Mask = I.getArgOperand(2);
  2990. if (ClCheckAccessAddress) {
  2991. insertShadowCheck(Ptr, &I);
  2992. insertShadowCheck(Mask, &I);
  2993. }
  2994. Value *Shadow = getShadow(Values);
  2995. Type *ElementShadowTy =
  2996. getShadowTy(cast<FixedVectorType>(Values->getType())->getElementType());
  2997. auto [ShadowPtr, OriginPtrs] =
  2998. getShadowOriginPtr(Ptr, IRB, ElementShadowTy, {}, /*isStore*/ true);
  2999. IRB.CreateMaskedCompressStore(Shadow, ShadowPtr, Mask);
  3000. // TODO: Store origins.
  3001. }
  3002. void handleMaskedGather(IntrinsicInst &I) {
  3003. IRBuilder<> IRB(&I);
  3004. Value *Ptrs = I.getArgOperand(0);
  3005. const Align Alignment(
  3006. cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
  3007. Value *Mask = I.getArgOperand(2);
  3008. Value *PassThru = I.getArgOperand(3);
  3009. Type *PtrsShadowTy = getShadowTy(Ptrs);
  3010. if (ClCheckAccessAddress) {
  3011. insertShadowCheck(Mask, &I);
  3012. Value *MaskedPtrShadow = IRB.CreateSelect(
  3013. Mask, getShadow(Ptrs), Constant::getNullValue((PtrsShadowTy)),
  3014. "_msmaskedptrs");
  3015. insertShadowCheck(MaskedPtrShadow, getOrigin(Ptrs), &I);
  3016. }
  3017. if (!PropagateShadow) {
  3018. setShadow(&I, getCleanShadow(&I));
  3019. setOrigin(&I, getCleanOrigin());
  3020. return;
  3021. }
  3022. Type *ShadowTy = getShadowTy(&I);
  3023. Type *ElementShadowTy = cast<FixedVectorType>(ShadowTy)->getElementType();
  3024. auto [ShadowPtrs, OriginPtrs] = getShadowOriginPtr(
  3025. Ptrs, IRB, ElementShadowTy, Alignment, /*isStore*/ false);
  3026. Value *Shadow =
  3027. IRB.CreateMaskedGather(ShadowTy, ShadowPtrs, Alignment, Mask,
  3028. getShadow(PassThru), "_msmaskedgather");
  3029. setShadow(&I, Shadow);
  3030. // TODO: Store origins.
  3031. setOrigin(&I, getCleanOrigin());
  3032. }
  3033. void handleMaskedScatter(IntrinsicInst &I) {
  3034. IRBuilder<> IRB(&I);
  3035. Value *Values = I.getArgOperand(0);
  3036. Value *Ptrs = I.getArgOperand(1);
  3037. const Align Alignment(
  3038. cast<ConstantInt>(I.getArgOperand(2))->getZExtValue());
  3039. Value *Mask = I.getArgOperand(3);
  3040. Type *PtrsShadowTy = getShadowTy(Ptrs);
  3041. if (ClCheckAccessAddress) {
  3042. insertShadowCheck(Mask, &I);
  3043. Value *MaskedPtrShadow = IRB.CreateSelect(
  3044. Mask, getShadow(Ptrs), Constant::getNullValue((PtrsShadowTy)),
  3045. "_msmaskedptrs");
  3046. insertShadowCheck(MaskedPtrShadow, getOrigin(Ptrs), &I);
  3047. }
  3048. Value *Shadow = getShadow(Values);
  3049. Type *ElementShadowTy =
  3050. getShadowTy(cast<FixedVectorType>(Values->getType())->getElementType());
  3051. auto [ShadowPtrs, OriginPtrs] = getShadowOriginPtr(
  3052. Ptrs, IRB, ElementShadowTy, Alignment, /*isStore*/ true);
  3053. IRB.CreateMaskedScatter(Shadow, ShadowPtrs, Alignment, Mask);
  3054. // TODO: Store origin.
  3055. }
  3056. void handleMaskedStore(IntrinsicInst &I) {
  3057. IRBuilder<> IRB(&I);
  3058. Value *V = I.getArgOperand(0);
  3059. Value *Ptr = I.getArgOperand(1);
  3060. const Align Alignment(
  3061. cast<ConstantInt>(I.getArgOperand(2))->getZExtValue());
  3062. Value *Mask = I.getArgOperand(3);
  3063. Value *Shadow = getShadow(V);
  3064. if (ClCheckAccessAddress) {
  3065. insertShadowCheck(Ptr, &I);
  3066. insertShadowCheck(Mask, &I);
  3067. }
  3068. Value *ShadowPtr;
  3069. Value *OriginPtr;
  3070. std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr(
  3071. Ptr, IRB, Shadow->getType(), Alignment, /*isStore*/ true);
  3072. IRB.CreateMaskedStore(Shadow, ShadowPtr, Alignment, Mask);
  3073. if (!MS.TrackOrigins)
  3074. return;
  3075. auto &DL = F.getParent()->getDataLayout();
  3076. paintOrigin(IRB, getOrigin(V), OriginPtr,
  3077. DL.getTypeStoreSize(Shadow->getType()),
  3078. std::max(Alignment, kMinOriginAlignment));
  3079. }
  3080. void handleMaskedLoad(IntrinsicInst &I) {
  3081. IRBuilder<> IRB(&I);
  3082. Value *Ptr = I.getArgOperand(0);
  3083. const Align Alignment(
  3084. cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
  3085. Value *Mask = I.getArgOperand(2);
  3086. Value *PassThru = I.getArgOperand(3);
  3087. if (ClCheckAccessAddress) {
  3088. insertShadowCheck(Ptr, &I);
  3089. insertShadowCheck(Mask, &I);
  3090. }
  3091. if (!PropagateShadow) {
  3092. setShadow(&I, getCleanShadow(&I));
  3093. setOrigin(&I, getCleanOrigin());
  3094. return;
  3095. }
  3096. Type *ShadowTy = getShadowTy(&I);
  3097. Value *ShadowPtr, *OriginPtr;
  3098. std::tie(ShadowPtr, OriginPtr) =
  3099. getShadowOriginPtr(Ptr, IRB, ShadowTy, Alignment, /*isStore*/ false);
  3100. setShadow(&I, IRB.CreateMaskedLoad(ShadowTy, ShadowPtr, Alignment, Mask,
  3101. getShadow(PassThru), "_msmaskedld"));
  3102. if (!MS.TrackOrigins)
  3103. return;
  3104. // Choose between PassThru's and the loaded value's origins.
  3105. Value *MaskedPassThruShadow = IRB.CreateAnd(
  3106. getShadow(PassThru), IRB.CreateSExt(IRB.CreateNeg(Mask), ShadowTy));
  3107. Value *ConvertedShadow = convertShadowToScalar(MaskedPassThruShadow, IRB);
  3108. Value *NotNull = convertToBool(ConvertedShadow, IRB, "_mscmp");
  3109. Value *PtrOrigin = IRB.CreateLoad(MS.OriginTy, OriginPtr);
  3110. Value *Origin = IRB.CreateSelect(NotNull, getOrigin(PassThru), PtrOrigin);
  3111. setOrigin(&I, Origin);
  3112. }
  3113. // Instrument BMI / BMI2 intrinsics.
  3114. // All of these intrinsics are Z = I(X, Y)
  3115. // where the types of all operands and the result match, and are either i32 or
  3116. // i64. The following instrumentation happens to work for all of them:
  3117. // Sz = I(Sx, Y) | (sext (Sy != 0))
  3118. void handleBmiIntrinsic(IntrinsicInst &I) {
  3119. IRBuilder<> IRB(&I);
  3120. Type *ShadowTy = getShadowTy(&I);
  3121. // If any bit of the mask operand is poisoned, then the whole thing is.
  3122. Value *SMask = getShadow(&I, 1);
  3123. SMask = IRB.CreateSExt(IRB.CreateICmpNE(SMask, getCleanShadow(ShadowTy)),
  3124. ShadowTy);
  3125. // Apply the same intrinsic to the shadow of the first operand.
  3126. Value *S = IRB.CreateCall(I.getCalledFunction(),
  3127. {getShadow(&I, 0), I.getOperand(1)});
  3128. S = IRB.CreateOr(SMask, S);
  3129. setShadow(&I, S);
  3130. setOriginForNaryOp(I);
  3131. }
  3132. SmallVector<int, 8> getPclmulMask(unsigned Width, bool OddElements) {
  3133. SmallVector<int, 8> Mask;
  3134. for (unsigned X = OddElements ? 1 : 0; X < Width; X += 2) {
  3135. Mask.append(2, X);
  3136. }
  3137. return Mask;
  3138. }
  3139. // Instrument pclmul intrinsics.
  3140. // These intrinsics operate either on odd or on even elements of the input
  3141. // vectors, depending on the constant in the 3rd argument, ignoring the rest.
  3142. // Replace the unused elements with copies of the used ones, ex:
  3143. // (0, 1, 2, 3) -> (0, 0, 2, 2) (even case)
  3144. // or
  3145. // (0, 1, 2, 3) -> (1, 1, 3, 3) (odd case)
  3146. // and then apply the usual shadow combining logic.
  3147. void handlePclmulIntrinsic(IntrinsicInst &I) {
  3148. IRBuilder<> IRB(&I);
  3149. unsigned Width =
  3150. cast<FixedVectorType>(I.getArgOperand(0)->getType())->getNumElements();
  3151. assert(isa<ConstantInt>(I.getArgOperand(2)) &&
  3152. "pclmul 3rd operand must be a constant");
  3153. unsigned Imm = cast<ConstantInt>(I.getArgOperand(2))->getZExtValue();
  3154. Value *Shuf0 = IRB.CreateShuffleVector(getShadow(&I, 0),
  3155. getPclmulMask(Width, Imm & 0x01));
  3156. Value *Shuf1 = IRB.CreateShuffleVector(getShadow(&I, 1),
  3157. getPclmulMask(Width, Imm & 0x10));
  3158. ShadowAndOriginCombiner SOC(this, IRB);
  3159. SOC.Add(Shuf0, getOrigin(&I, 0));
  3160. SOC.Add(Shuf1, getOrigin(&I, 1));
  3161. SOC.Done(&I);
  3162. }
  3163. // Instrument _mm_*_sd|ss intrinsics
  3164. void handleUnarySdSsIntrinsic(IntrinsicInst &I) {
  3165. IRBuilder<> IRB(&I);
  3166. unsigned Width =
  3167. cast<FixedVectorType>(I.getArgOperand(0)->getType())->getNumElements();
  3168. Value *First = getShadow(&I, 0);
  3169. Value *Second = getShadow(&I, 1);
  3170. // First element of second operand, remaining elements of first operand
  3171. SmallVector<int, 16> Mask;
  3172. Mask.push_back(Width);
  3173. for (unsigned i = 1; i < Width; i++)
  3174. Mask.push_back(i);
  3175. Value *Shadow = IRB.CreateShuffleVector(First, Second, Mask);
  3176. setShadow(&I, Shadow);
  3177. setOriginForNaryOp(I);
  3178. }
  3179. void handleVtestIntrinsic(IntrinsicInst &I) {
  3180. IRBuilder<> IRB(&I);
  3181. Value *Shadow0 = getShadow(&I, 0);
  3182. Value *Shadow1 = getShadow(&I, 1);
  3183. Value *Or = IRB.CreateOr(Shadow0, Shadow1);
  3184. Value *NZ = IRB.CreateICmpNE(Or, Constant::getNullValue(Or->getType()));
  3185. Value *Scalar = convertShadowToScalar(NZ, IRB);
  3186. Value *Shadow = IRB.CreateZExt(Scalar, getShadowTy(&I));
  3187. setShadow(&I, Shadow);
  3188. setOriginForNaryOp(I);
  3189. }
  3190. void handleBinarySdSsIntrinsic(IntrinsicInst &I) {
  3191. IRBuilder<> IRB(&I);
  3192. unsigned Width =
  3193. cast<FixedVectorType>(I.getArgOperand(0)->getType())->getNumElements();
  3194. Value *First = getShadow(&I, 0);
  3195. Value *Second = getShadow(&I, 1);
  3196. Value *OrShadow = IRB.CreateOr(First, Second);
  3197. // First element of both OR'd together, remaining elements of first operand
  3198. SmallVector<int, 16> Mask;
  3199. Mask.push_back(Width);
  3200. for (unsigned i = 1; i < Width; i++)
  3201. Mask.push_back(i);
  3202. Value *Shadow = IRB.CreateShuffleVector(First, OrShadow, Mask);
  3203. setShadow(&I, Shadow);
  3204. setOriginForNaryOp(I);
  3205. }
  3206. // Instrument abs intrinsic.
  3207. // handleUnknownIntrinsic can't handle it because of the last
  3208. // is_int_min_poison argument which does not match the result type.
  3209. void handleAbsIntrinsic(IntrinsicInst &I) {
  3210. assert(I.getType()->isIntOrIntVectorTy());
  3211. assert(I.getArgOperand(0)->getType() == I.getType());
  3212. // FIXME: Handle is_int_min_poison.
  3213. IRBuilder<> IRB(&I);
  3214. setShadow(&I, getShadow(&I, 0));
  3215. setOrigin(&I, getOrigin(&I, 0));
  3216. }
  3217. void visitIntrinsicInst(IntrinsicInst &I) {
  3218. switch (I.getIntrinsicID()) {
  3219. case Intrinsic::abs:
  3220. handleAbsIntrinsic(I);
  3221. break;
  3222. case Intrinsic::lifetime_start:
  3223. handleLifetimeStart(I);
  3224. break;
  3225. case Intrinsic::launder_invariant_group:
  3226. case Intrinsic::strip_invariant_group:
  3227. handleInvariantGroup(I);
  3228. break;
  3229. case Intrinsic::bswap:
  3230. handleBswap(I);
  3231. break;
  3232. case Intrinsic::ctlz:
  3233. case Intrinsic::cttz:
  3234. handleCountZeroes(I);
  3235. break;
  3236. case Intrinsic::masked_compressstore:
  3237. handleMaskedCompressStore(I);
  3238. break;
  3239. case Intrinsic::masked_expandload:
  3240. handleMaskedExpandLoad(I);
  3241. break;
  3242. case Intrinsic::masked_gather:
  3243. handleMaskedGather(I);
  3244. break;
  3245. case Intrinsic::masked_scatter:
  3246. handleMaskedScatter(I);
  3247. break;
  3248. case Intrinsic::masked_store:
  3249. handleMaskedStore(I);
  3250. break;
  3251. case Intrinsic::masked_load:
  3252. handleMaskedLoad(I);
  3253. break;
  3254. case Intrinsic::vector_reduce_and:
  3255. handleVectorReduceAndIntrinsic(I);
  3256. break;
  3257. case Intrinsic::vector_reduce_or:
  3258. handleVectorReduceOrIntrinsic(I);
  3259. break;
  3260. case Intrinsic::vector_reduce_add:
  3261. case Intrinsic::vector_reduce_xor:
  3262. case Intrinsic::vector_reduce_mul:
  3263. handleVectorReduceIntrinsic(I);
  3264. break;
  3265. case Intrinsic::x86_sse_stmxcsr:
  3266. handleStmxcsr(I);
  3267. break;
  3268. case Intrinsic::x86_sse_ldmxcsr:
  3269. handleLdmxcsr(I);
  3270. break;
  3271. case Intrinsic::x86_avx512_vcvtsd2usi64:
  3272. case Intrinsic::x86_avx512_vcvtsd2usi32:
  3273. case Intrinsic::x86_avx512_vcvtss2usi64:
  3274. case Intrinsic::x86_avx512_vcvtss2usi32:
  3275. case Intrinsic::x86_avx512_cvttss2usi64:
  3276. case Intrinsic::x86_avx512_cvttss2usi:
  3277. case Intrinsic::x86_avx512_cvttsd2usi64:
  3278. case Intrinsic::x86_avx512_cvttsd2usi:
  3279. case Intrinsic::x86_avx512_cvtusi2ss:
  3280. case Intrinsic::x86_avx512_cvtusi642sd:
  3281. case Intrinsic::x86_avx512_cvtusi642ss:
  3282. handleVectorConvertIntrinsic(I, 1, true);
  3283. break;
  3284. case Intrinsic::x86_sse2_cvtsd2si64:
  3285. case Intrinsic::x86_sse2_cvtsd2si:
  3286. case Intrinsic::x86_sse2_cvtsd2ss:
  3287. case Intrinsic::x86_sse2_cvttsd2si64:
  3288. case Intrinsic::x86_sse2_cvttsd2si:
  3289. case Intrinsic::x86_sse_cvtss2si64:
  3290. case Intrinsic::x86_sse_cvtss2si:
  3291. case Intrinsic::x86_sse_cvttss2si64:
  3292. case Intrinsic::x86_sse_cvttss2si:
  3293. handleVectorConvertIntrinsic(I, 1);
  3294. break;
  3295. case Intrinsic::x86_sse_cvtps2pi:
  3296. case Intrinsic::x86_sse_cvttps2pi:
  3297. handleVectorConvertIntrinsic(I, 2);
  3298. break;
  3299. case Intrinsic::x86_avx512_psll_w_512:
  3300. case Intrinsic::x86_avx512_psll_d_512:
  3301. case Intrinsic::x86_avx512_psll_q_512:
  3302. case Intrinsic::x86_avx512_pslli_w_512:
  3303. case Intrinsic::x86_avx512_pslli_d_512:
  3304. case Intrinsic::x86_avx512_pslli_q_512:
  3305. case Intrinsic::x86_avx512_psrl_w_512:
  3306. case Intrinsic::x86_avx512_psrl_d_512:
  3307. case Intrinsic::x86_avx512_psrl_q_512:
  3308. case Intrinsic::x86_avx512_psra_w_512:
  3309. case Intrinsic::x86_avx512_psra_d_512:
  3310. case Intrinsic::x86_avx512_psra_q_512:
  3311. case Intrinsic::x86_avx512_psrli_w_512:
  3312. case Intrinsic::x86_avx512_psrli_d_512:
  3313. case Intrinsic::x86_avx512_psrli_q_512:
  3314. case Intrinsic::x86_avx512_psrai_w_512:
  3315. case Intrinsic::x86_avx512_psrai_d_512:
  3316. case Intrinsic::x86_avx512_psrai_q_512:
  3317. case Intrinsic::x86_avx512_psra_q_256:
  3318. case Intrinsic::x86_avx512_psra_q_128:
  3319. case Intrinsic::x86_avx512_psrai_q_256:
  3320. case Intrinsic::x86_avx512_psrai_q_128:
  3321. case Intrinsic::x86_avx2_psll_w:
  3322. case Intrinsic::x86_avx2_psll_d:
  3323. case Intrinsic::x86_avx2_psll_q:
  3324. case Intrinsic::x86_avx2_pslli_w:
  3325. case Intrinsic::x86_avx2_pslli_d:
  3326. case Intrinsic::x86_avx2_pslli_q:
  3327. case Intrinsic::x86_avx2_psrl_w:
  3328. case Intrinsic::x86_avx2_psrl_d:
  3329. case Intrinsic::x86_avx2_psrl_q:
  3330. case Intrinsic::x86_avx2_psra_w:
  3331. case Intrinsic::x86_avx2_psra_d:
  3332. case Intrinsic::x86_avx2_psrli_w:
  3333. case Intrinsic::x86_avx2_psrli_d:
  3334. case Intrinsic::x86_avx2_psrli_q:
  3335. case Intrinsic::x86_avx2_psrai_w:
  3336. case Intrinsic::x86_avx2_psrai_d:
  3337. case Intrinsic::x86_sse2_psll_w:
  3338. case Intrinsic::x86_sse2_psll_d:
  3339. case Intrinsic::x86_sse2_psll_q:
  3340. case Intrinsic::x86_sse2_pslli_w:
  3341. case Intrinsic::x86_sse2_pslli_d:
  3342. case Intrinsic::x86_sse2_pslli_q:
  3343. case Intrinsic::x86_sse2_psrl_w:
  3344. case Intrinsic::x86_sse2_psrl_d:
  3345. case Intrinsic::x86_sse2_psrl_q:
  3346. case Intrinsic::x86_sse2_psra_w:
  3347. case Intrinsic::x86_sse2_psra_d:
  3348. case Intrinsic::x86_sse2_psrli_w:
  3349. case Intrinsic::x86_sse2_psrli_d:
  3350. case Intrinsic::x86_sse2_psrli_q:
  3351. case Intrinsic::x86_sse2_psrai_w:
  3352. case Intrinsic::x86_sse2_psrai_d:
  3353. case Intrinsic::x86_mmx_psll_w:
  3354. case Intrinsic::x86_mmx_psll_d:
  3355. case Intrinsic::x86_mmx_psll_q:
  3356. case Intrinsic::x86_mmx_pslli_w:
  3357. case Intrinsic::x86_mmx_pslli_d:
  3358. case Intrinsic::x86_mmx_pslli_q:
  3359. case Intrinsic::x86_mmx_psrl_w:
  3360. case Intrinsic::x86_mmx_psrl_d:
  3361. case Intrinsic::x86_mmx_psrl_q:
  3362. case Intrinsic::x86_mmx_psra_w:
  3363. case Intrinsic::x86_mmx_psra_d:
  3364. case Intrinsic::x86_mmx_psrli_w:
  3365. case Intrinsic::x86_mmx_psrli_d:
  3366. case Intrinsic::x86_mmx_psrli_q:
  3367. case Intrinsic::x86_mmx_psrai_w:
  3368. case Intrinsic::x86_mmx_psrai_d:
  3369. handleVectorShiftIntrinsic(I, /* Variable */ false);
  3370. break;
  3371. case Intrinsic::x86_avx2_psllv_d:
  3372. case Intrinsic::x86_avx2_psllv_d_256:
  3373. case Intrinsic::x86_avx512_psllv_d_512:
  3374. case Intrinsic::x86_avx2_psllv_q:
  3375. case Intrinsic::x86_avx2_psllv_q_256:
  3376. case Intrinsic::x86_avx512_psllv_q_512:
  3377. case Intrinsic::x86_avx2_psrlv_d:
  3378. case Intrinsic::x86_avx2_psrlv_d_256:
  3379. case Intrinsic::x86_avx512_psrlv_d_512:
  3380. case Intrinsic::x86_avx2_psrlv_q:
  3381. case Intrinsic::x86_avx2_psrlv_q_256:
  3382. case Intrinsic::x86_avx512_psrlv_q_512:
  3383. case Intrinsic::x86_avx2_psrav_d:
  3384. case Intrinsic::x86_avx2_psrav_d_256:
  3385. case Intrinsic::x86_avx512_psrav_d_512:
  3386. case Intrinsic::x86_avx512_psrav_q_128:
  3387. case Intrinsic::x86_avx512_psrav_q_256:
  3388. case Intrinsic::x86_avx512_psrav_q_512:
  3389. handleVectorShiftIntrinsic(I, /* Variable */ true);
  3390. break;
  3391. case Intrinsic::x86_sse2_packsswb_128:
  3392. case Intrinsic::x86_sse2_packssdw_128:
  3393. case Intrinsic::x86_sse2_packuswb_128:
  3394. case Intrinsic::x86_sse41_packusdw:
  3395. case Intrinsic::x86_avx2_packsswb:
  3396. case Intrinsic::x86_avx2_packssdw:
  3397. case Intrinsic::x86_avx2_packuswb:
  3398. case Intrinsic::x86_avx2_packusdw:
  3399. handleVectorPackIntrinsic(I);
  3400. break;
  3401. case Intrinsic::x86_mmx_packsswb:
  3402. case Intrinsic::x86_mmx_packuswb:
  3403. handleVectorPackIntrinsic(I, 16);
  3404. break;
  3405. case Intrinsic::x86_mmx_packssdw:
  3406. handleVectorPackIntrinsic(I, 32);
  3407. break;
  3408. case Intrinsic::x86_mmx_psad_bw:
  3409. case Intrinsic::x86_sse2_psad_bw:
  3410. case Intrinsic::x86_avx2_psad_bw:
  3411. handleVectorSadIntrinsic(I);
  3412. break;
  3413. case Intrinsic::x86_sse2_pmadd_wd:
  3414. case Intrinsic::x86_avx2_pmadd_wd:
  3415. case Intrinsic::x86_ssse3_pmadd_ub_sw_128:
  3416. case Intrinsic::x86_avx2_pmadd_ub_sw:
  3417. handleVectorPmaddIntrinsic(I);
  3418. break;
  3419. case Intrinsic::x86_ssse3_pmadd_ub_sw:
  3420. handleVectorPmaddIntrinsic(I, 8);
  3421. break;
  3422. case Intrinsic::x86_mmx_pmadd_wd:
  3423. handleVectorPmaddIntrinsic(I, 16);
  3424. break;
  3425. case Intrinsic::x86_sse_cmp_ss:
  3426. case Intrinsic::x86_sse2_cmp_sd:
  3427. case Intrinsic::x86_sse_comieq_ss:
  3428. case Intrinsic::x86_sse_comilt_ss:
  3429. case Intrinsic::x86_sse_comile_ss:
  3430. case Intrinsic::x86_sse_comigt_ss:
  3431. case Intrinsic::x86_sse_comige_ss:
  3432. case Intrinsic::x86_sse_comineq_ss:
  3433. case Intrinsic::x86_sse_ucomieq_ss:
  3434. case Intrinsic::x86_sse_ucomilt_ss:
  3435. case Intrinsic::x86_sse_ucomile_ss:
  3436. case Intrinsic::x86_sse_ucomigt_ss:
  3437. case Intrinsic::x86_sse_ucomige_ss:
  3438. case Intrinsic::x86_sse_ucomineq_ss:
  3439. case Intrinsic::x86_sse2_comieq_sd:
  3440. case Intrinsic::x86_sse2_comilt_sd:
  3441. case Intrinsic::x86_sse2_comile_sd:
  3442. case Intrinsic::x86_sse2_comigt_sd:
  3443. case Intrinsic::x86_sse2_comige_sd:
  3444. case Intrinsic::x86_sse2_comineq_sd:
  3445. case Intrinsic::x86_sse2_ucomieq_sd:
  3446. case Intrinsic::x86_sse2_ucomilt_sd:
  3447. case Intrinsic::x86_sse2_ucomile_sd:
  3448. case Intrinsic::x86_sse2_ucomigt_sd:
  3449. case Intrinsic::x86_sse2_ucomige_sd:
  3450. case Intrinsic::x86_sse2_ucomineq_sd:
  3451. handleVectorCompareScalarIntrinsic(I);
  3452. break;
  3453. case Intrinsic::x86_avx_cmp_pd_256:
  3454. case Intrinsic::x86_avx_cmp_ps_256:
  3455. case Intrinsic::x86_sse2_cmp_pd:
  3456. case Intrinsic::x86_sse_cmp_ps:
  3457. handleVectorComparePackedIntrinsic(I);
  3458. break;
  3459. case Intrinsic::x86_bmi_bextr_32:
  3460. case Intrinsic::x86_bmi_bextr_64:
  3461. case Intrinsic::x86_bmi_bzhi_32:
  3462. case Intrinsic::x86_bmi_bzhi_64:
  3463. case Intrinsic::x86_bmi_pdep_32:
  3464. case Intrinsic::x86_bmi_pdep_64:
  3465. case Intrinsic::x86_bmi_pext_32:
  3466. case Intrinsic::x86_bmi_pext_64:
  3467. handleBmiIntrinsic(I);
  3468. break;
  3469. case Intrinsic::x86_pclmulqdq:
  3470. case Intrinsic::x86_pclmulqdq_256:
  3471. case Intrinsic::x86_pclmulqdq_512:
  3472. handlePclmulIntrinsic(I);
  3473. break;
  3474. case Intrinsic::x86_sse41_round_sd:
  3475. case Intrinsic::x86_sse41_round_ss:
  3476. handleUnarySdSsIntrinsic(I);
  3477. break;
  3478. case Intrinsic::x86_sse2_max_sd:
  3479. case Intrinsic::x86_sse_max_ss:
  3480. case Intrinsic::x86_sse2_min_sd:
  3481. case Intrinsic::x86_sse_min_ss:
  3482. handleBinarySdSsIntrinsic(I);
  3483. break;
  3484. case Intrinsic::x86_avx_vtestc_pd:
  3485. case Intrinsic::x86_avx_vtestc_pd_256:
  3486. case Intrinsic::x86_avx_vtestc_ps:
  3487. case Intrinsic::x86_avx_vtestc_ps_256:
  3488. case Intrinsic::x86_avx_vtestnzc_pd:
  3489. case Intrinsic::x86_avx_vtestnzc_pd_256:
  3490. case Intrinsic::x86_avx_vtestnzc_ps:
  3491. case Intrinsic::x86_avx_vtestnzc_ps_256:
  3492. case Intrinsic::x86_avx_vtestz_pd:
  3493. case Intrinsic::x86_avx_vtestz_pd_256:
  3494. case Intrinsic::x86_avx_vtestz_ps:
  3495. case Intrinsic::x86_avx_vtestz_ps_256:
  3496. case Intrinsic::x86_avx_ptestc_256:
  3497. case Intrinsic::x86_avx_ptestnzc_256:
  3498. case Intrinsic::x86_avx_ptestz_256:
  3499. case Intrinsic::x86_sse41_ptestc:
  3500. case Intrinsic::x86_sse41_ptestnzc:
  3501. case Intrinsic::x86_sse41_ptestz:
  3502. handleVtestIntrinsic(I);
  3503. break;
  3504. case Intrinsic::fshl:
  3505. case Intrinsic::fshr:
  3506. handleFunnelShift(I);
  3507. break;
  3508. case Intrinsic::is_constant:
  3509. // The result of llvm.is.constant() is always defined.
  3510. setShadow(&I, getCleanShadow(&I));
  3511. setOrigin(&I, getCleanOrigin());
  3512. break;
  3513. default:
  3514. if (!handleUnknownIntrinsic(I))
  3515. visitInstruction(I);
  3516. break;
  3517. }
  3518. }
  3519. void visitLibAtomicLoad(CallBase &CB) {
  3520. // Since we use getNextNode here, we can't have CB terminate the BB.
  3521. assert(isa<CallInst>(CB));
  3522. IRBuilder<> IRB(&CB);
  3523. Value *Size = CB.getArgOperand(0);
  3524. Value *SrcPtr = CB.getArgOperand(1);
  3525. Value *DstPtr = CB.getArgOperand(2);
  3526. Value *Ordering = CB.getArgOperand(3);
  3527. // Convert the call to have at least Acquire ordering to make sure
  3528. // the shadow operations aren't reordered before it.
  3529. Value *NewOrdering =
  3530. IRB.CreateExtractElement(makeAddAcquireOrderingTable(IRB), Ordering);
  3531. CB.setArgOperand(3, NewOrdering);
  3532. NextNodeIRBuilder NextIRB(&CB);
  3533. Value *SrcShadowPtr, *SrcOriginPtr;
  3534. std::tie(SrcShadowPtr, SrcOriginPtr) =
  3535. getShadowOriginPtr(SrcPtr, NextIRB, NextIRB.getInt8Ty(), Align(1),
  3536. /*isStore*/ false);
  3537. Value *DstShadowPtr =
  3538. getShadowOriginPtr(DstPtr, NextIRB, NextIRB.getInt8Ty(), Align(1),
  3539. /*isStore*/ true)
  3540. .first;
  3541. NextIRB.CreateMemCpy(DstShadowPtr, Align(1), SrcShadowPtr, Align(1), Size);
  3542. if (MS.TrackOrigins) {
  3543. Value *SrcOrigin = NextIRB.CreateAlignedLoad(MS.OriginTy, SrcOriginPtr,
  3544. kMinOriginAlignment);
  3545. Value *NewOrigin = updateOrigin(SrcOrigin, NextIRB);
  3546. NextIRB.CreateCall(MS.MsanSetOriginFn, {DstPtr, Size, NewOrigin});
  3547. }
  3548. }
  3549. void visitLibAtomicStore(CallBase &CB) {
  3550. IRBuilder<> IRB(&CB);
  3551. Value *Size = CB.getArgOperand(0);
  3552. Value *DstPtr = CB.getArgOperand(2);
  3553. Value *Ordering = CB.getArgOperand(3);
  3554. // Convert the call to have at least Release ordering to make sure
  3555. // the shadow operations aren't reordered after it.
  3556. Value *NewOrdering =
  3557. IRB.CreateExtractElement(makeAddReleaseOrderingTable(IRB), Ordering);
  3558. CB.setArgOperand(3, NewOrdering);
  3559. Value *DstShadowPtr =
  3560. getShadowOriginPtr(DstPtr, IRB, IRB.getInt8Ty(), Align(1),
  3561. /*isStore*/ true)
  3562. .first;
  3563. // Atomic store always paints clean shadow/origin. See file header.
  3564. IRB.CreateMemSet(DstShadowPtr, getCleanShadow(IRB.getInt8Ty()), Size,
  3565. Align(1));
  3566. }
  3567. void visitCallBase(CallBase &CB) {
  3568. assert(!CB.getMetadata(LLVMContext::MD_nosanitize));
  3569. if (CB.isInlineAsm()) {
  3570. // For inline asm (either a call to asm function, or callbr instruction),
  3571. // do the usual thing: check argument shadow and mark all outputs as
  3572. // clean. Note that any side effects of the inline asm that are not
  3573. // immediately visible in its constraints are not handled.
  3574. if (ClHandleAsmConservative && MS.CompileKernel)
  3575. visitAsmInstruction(CB);
  3576. else
  3577. visitInstruction(CB);
  3578. return;
  3579. }
  3580. LibFunc LF;
  3581. if (TLI->getLibFunc(CB, LF)) {
  3582. // libatomic.a functions need to have special handling because there isn't
  3583. // a good way to intercept them or compile the library with
  3584. // instrumentation.
  3585. switch (LF) {
  3586. case LibFunc_atomic_load:
  3587. if (!isa<CallInst>(CB)) {
  3588. llvm::errs() << "MSAN -- cannot instrument invoke of libatomic load."
  3589. "Ignoring!\n";
  3590. break;
  3591. }
  3592. visitLibAtomicLoad(CB);
  3593. return;
  3594. case LibFunc_atomic_store:
  3595. visitLibAtomicStore(CB);
  3596. return;
  3597. default:
  3598. break;
  3599. }
  3600. }
  3601. if (auto *Call = dyn_cast<CallInst>(&CB)) {
  3602. assert(!isa<IntrinsicInst>(Call) && "intrinsics are handled elsewhere");
  3603. // We are going to insert code that relies on the fact that the callee
  3604. // will become a non-readonly function after it is instrumented by us. To
  3605. // prevent this code from being optimized out, mark that function
  3606. // non-readonly in advance.
  3607. // TODO: We can likely do better than dropping memory() completely here.
  3608. AttributeMask B;
  3609. B.addAttribute(Attribute::Memory).addAttribute(Attribute::Speculatable);
  3610. Call->removeFnAttrs(B);
  3611. if (Function *Func = Call->getCalledFunction()) {
  3612. Func->removeFnAttrs(B);
  3613. }
  3614. maybeMarkSanitizerLibraryCallNoBuiltin(Call, TLI);
  3615. }
  3616. IRBuilder<> IRB(&CB);
  3617. bool MayCheckCall = MS.EagerChecks;
  3618. if (Function *Func = CB.getCalledFunction()) {
  3619. // __sanitizer_unaligned_{load,store} functions may be called by users
  3620. // and always expects shadows in the TLS. So don't check them.
  3621. MayCheckCall &= !Func->getName().startswith("__sanitizer_unaligned_");
  3622. }
  3623. unsigned ArgOffset = 0;
  3624. LLVM_DEBUG(dbgs() << " CallSite: " << CB << "\n");
  3625. for (const auto &[i, A] : llvm::enumerate(CB.args())) {
  3626. if (!A->getType()->isSized()) {
  3627. LLVM_DEBUG(dbgs() << "Arg " << i << " is not sized: " << CB << "\n");
  3628. continue;
  3629. }
  3630. unsigned Size = 0;
  3631. const DataLayout &DL = F.getParent()->getDataLayout();
  3632. bool ByVal = CB.paramHasAttr(i, Attribute::ByVal);
  3633. bool NoUndef = CB.paramHasAttr(i, Attribute::NoUndef);
  3634. bool EagerCheck = MayCheckCall && !ByVal && NoUndef;
  3635. if (EagerCheck) {
  3636. insertShadowCheck(A, &CB);
  3637. Size = DL.getTypeAllocSize(A->getType());
  3638. } else {
  3639. Value *Store = nullptr;
  3640. // Compute the Shadow for arg even if it is ByVal, because
  3641. // in that case getShadow() will copy the actual arg shadow to
  3642. // __msan_param_tls.
  3643. Value *ArgShadow = getShadow(A);
  3644. Value *ArgShadowBase = getShadowPtrForArgument(A, IRB, ArgOffset);
  3645. LLVM_DEBUG(dbgs() << " Arg#" << i << ": " << *A
  3646. << " Shadow: " << *ArgShadow << "\n");
  3647. if (ByVal) {
  3648. // ByVal requires some special handling as it's too big for a single
  3649. // load
  3650. assert(A->getType()->isPointerTy() &&
  3651. "ByVal argument is not a pointer!");
  3652. Size = DL.getTypeAllocSize(CB.getParamByValType(i));
  3653. if (ArgOffset + Size > kParamTLSSize)
  3654. break;
  3655. const MaybeAlign ParamAlignment(CB.getParamAlign(i));
  3656. MaybeAlign Alignment = std::nullopt;
  3657. if (ParamAlignment)
  3658. Alignment = std::min(*ParamAlignment, kShadowTLSAlignment);
  3659. Value *AShadowPtr, *AOriginPtr;
  3660. std::tie(AShadowPtr, AOriginPtr) =
  3661. getShadowOriginPtr(A, IRB, IRB.getInt8Ty(), Alignment,
  3662. /*isStore*/ false);
  3663. if (!PropagateShadow) {
  3664. Store = IRB.CreateMemSet(ArgShadowBase,
  3665. Constant::getNullValue(IRB.getInt8Ty()),
  3666. Size, Alignment);
  3667. } else {
  3668. Store = IRB.CreateMemCpy(ArgShadowBase, Alignment, AShadowPtr,
  3669. Alignment, Size);
  3670. if (MS.TrackOrigins) {
  3671. Value *ArgOriginBase = getOriginPtrForArgument(A, IRB, ArgOffset);
  3672. // FIXME: OriginSize should be:
  3673. // alignTo(A % kMinOriginAlignment + Size, kMinOriginAlignment)
  3674. unsigned OriginSize = alignTo(Size, kMinOriginAlignment);
  3675. IRB.CreateMemCpy(
  3676. ArgOriginBase,
  3677. /* by origin_tls[ArgOffset] */ kMinOriginAlignment,
  3678. AOriginPtr,
  3679. /* by getShadowOriginPtr */ kMinOriginAlignment, OriginSize);
  3680. }
  3681. }
  3682. } else {
  3683. // Any other parameters mean we need bit-grained tracking of uninit
  3684. // data
  3685. Size = DL.getTypeAllocSize(A->getType());
  3686. if (ArgOffset + Size > kParamTLSSize)
  3687. break;
  3688. Store = IRB.CreateAlignedStore(ArgShadow, ArgShadowBase,
  3689. kShadowTLSAlignment);
  3690. Constant *Cst = dyn_cast<Constant>(ArgShadow);
  3691. if (MS.TrackOrigins && !(Cst && Cst->isNullValue())) {
  3692. IRB.CreateStore(getOrigin(A),
  3693. getOriginPtrForArgument(A, IRB, ArgOffset));
  3694. }
  3695. }
  3696. (void)Store;
  3697. assert(Store != nullptr);
  3698. LLVM_DEBUG(dbgs() << " Param:" << *Store << "\n");
  3699. }
  3700. assert(Size != 0);
  3701. ArgOffset += alignTo(Size, kShadowTLSAlignment);
  3702. }
  3703. LLVM_DEBUG(dbgs() << " done with call args\n");
  3704. FunctionType *FT = CB.getFunctionType();
  3705. if (FT->isVarArg()) {
  3706. VAHelper->visitCallBase(CB, IRB);
  3707. }
  3708. // Now, get the shadow for the RetVal.
  3709. if (!CB.getType()->isSized())
  3710. return;
  3711. // Don't emit the epilogue for musttail call returns.
  3712. if (isa<CallInst>(CB) && cast<CallInst>(CB).isMustTailCall())
  3713. return;
  3714. if (MayCheckCall && CB.hasRetAttr(Attribute::NoUndef)) {
  3715. setShadow(&CB, getCleanShadow(&CB));
  3716. setOrigin(&CB, getCleanOrigin());
  3717. return;
  3718. }
  3719. IRBuilder<> IRBBefore(&CB);
  3720. // Until we have full dynamic coverage, make sure the retval shadow is 0.
  3721. Value *Base = getShadowPtrForRetval(&CB, IRBBefore);
  3722. IRBBefore.CreateAlignedStore(getCleanShadow(&CB), Base,
  3723. kShadowTLSAlignment);
  3724. BasicBlock::iterator NextInsn;
  3725. if (isa<CallInst>(CB)) {
  3726. NextInsn = ++CB.getIterator();
  3727. assert(NextInsn != CB.getParent()->end());
  3728. } else {
  3729. BasicBlock *NormalDest = cast<InvokeInst>(CB).getNormalDest();
  3730. if (!NormalDest->getSinglePredecessor()) {
  3731. // FIXME: this case is tricky, so we are just conservative here.
  3732. // Perhaps we need to split the edge between this BB and NormalDest,
  3733. // but a naive attempt to use SplitEdge leads to a crash.
  3734. setShadow(&CB, getCleanShadow(&CB));
  3735. setOrigin(&CB, getCleanOrigin());
  3736. return;
  3737. }
  3738. // FIXME: NextInsn is likely in a basic block that has not been visited
  3739. // yet. Anything inserted there will be instrumented by MSan later!
  3740. NextInsn = NormalDest->getFirstInsertionPt();
  3741. assert(NextInsn != NormalDest->end() &&
  3742. "Could not find insertion point for retval shadow load");
  3743. }
  3744. IRBuilder<> IRBAfter(&*NextInsn);
  3745. Value *RetvalShadow = IRBAfter.CreateAlignedLoad(
  3746. getShadowTy(&CB), getShadowPtrForRetval(&CB, IRBAfter),
  3747. kShadowTLSAlignment, "_msret");
  3748. setShadow(&CB, RetvalShadow);
  3749. if (MS.TrackOrigins)
  3750. setOrigin(&CB, IRBAfter.CreateLoad(MS.OriginTy,
  3751. getOriginPtrForRetval(IRBAfter)));
  3752. }
  3753. bool isAMustTailRetVal(Value *RetVal) {
  3754. if (auto *I = dyn_cast<BitCastInst>(RetVal)) {
  3755. RetVal = I->getOperand(0);
  3756. }
  3757. if (auto *I = dyn_cast<CallInst>(RetVal)) {
  3758. return I->isMustTailCall();
  3759. }
  3760. return false;
  3761. }
  3762. void visitReturnInst(ReturnInst &I) {
  3763. IRBuilder<> IRB(&I);
  3764. Value *RetVal = I.getReturnValue();
  3765. if (!RetVal)
  3766. return;
  3767. // Don't emit the epilogue for musttail call returns.
  3768. if (isAMustTailRetVal(RetVal))
  3769. return;
  3770. Value *ShadowPtr = getShadowPtrForRetval(RetVal, IRB);
  3771. bool HasNoUndef = F.hasRetAttribute(Attribute::NoUndef);
  3772. bool StoreShadow = !(MS.EagerChecks && HasNoUndef);
  3773. // FIXME: Consider using SpecialCaseList to specify a list of functions that
  3774. // must always return fully initialized values. For now, we hardcode "main".
  3775. bool EagerCheck = (MS.EagerChecks && HasNoUndef) || (F.getName() == "main");
  3776. Value *Shadow = getShadow(RetVal);
  3777. bool StoreOrigin = true;
  3778. if (EagerCheck) {
  3779. insertShadowCheck(RetVal, &I);
  3780. Shadow = getCleanShadow(RetVal);
  3781. StoreOrigin = false;
  3782. }
  3783. // The caller may still expect information passed over TLS if we pass our
  3784. // check
  3785. if (StoreShadow) {
  3786. IRB.CreateAlignedStore(Shadow, ShadowPtr, kShadowTLSAlignment);
  3787. if (MS.TrackOrigins && StoreOrigin)
  3788. IRB.CreateStore(getOrigin(RetVal), getOriginPtrForRetval(IRB));
  3789. }
  3790. }
  3791. void visitPHINode(PHINode &I) {
  3792. IRBuilder<> IRB(&I);
  3793. if (!PropagateShadow) {
  3794. setShadow(&I, getCleanShadow(&I));
  3795. setOrigin(&I, getCleanOrigin());
  3796. return;
  3797. }
  3798. ShadowPHINodes.push_back(&I);
  3799. setShadow(&I, IRB.CreatePHI(getShadowTy(&I), I.getNumIncomingValues(),
  3800. "_msphi_s"));
  3801. if (MS.TrackOrigins)
  3802. setOrigin(
  3803. &I, IRB.CreatePHI(MS.OriginTy, I.getNumIncomingValues(), "_msphi_o"));
  3804. }
  3805. Value *getLocalVarIdptr(AllocaInst &I) {
  3806. ConstantInt *IntConst =
  3807. ConstantInt::get(Type::getInt32Ty((*F.getParent()).getContext()), 0);
  3808. return new GlobalVariable(*F.getParent(), IntConst->getType(),
  3809. /*isConstant=*/false, GlobalValue::PrivateLinkage,
  3810. IntConst);
  3811. }
  3812. Value *getLocalVarDescription(AllocaInst &I) {
  3813. return createPrivateConstGlobalForString(*F.getParent(), I.getName());
  3814. }
  3815. void poisonAllocaUserspace(AllocaInst &I, IRBuilder<> &IRB, Value *Len) {
  3816. if (PoisonStack && ClPoisonStackWithCall) {
  3817. IRB.CreateCall(MS.MsanPoisonStackFn,
  3818. {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len});
  3819. } else {
  3820. Value *ShadowBase, *OriginBase;
  3821. std::tie(ShadowBase, OriginBase) = getShadowOriginPtr(
  3822. &I, IRB, IRB.getInt8Ty(), Align(1), /*isStore*/ true);
  3823. Value *PoisonValue = IRB.getInt8(PoisonStack ? ClPoisonStackPattern : 0);
  3824. IRB.CreateMemSet(ShadowBase, PoisonValue, Len, I.getAlign());
  3825. }
  3826. if (PoisonStack && MS.TrackOrigins) {
  3827. Value *Idptr = getLocalVarIdptr(I);
  3828. if (ClPrintStackNames) {
  3829. Value *Descr = getLocalVarDescription(I);
  3830. IRB.CreateCall(MS.MsanSetAllocaOriginWithDescriptionFn,
  3831. {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len,
  3832. IRB.CreatePointerCast(Idptr, IRB.getInt8PtrTy()),
  3833. IRB.CreatePointerCast(Descr, IRB.getInt8PtrTy())});
  3834. } else {
  3835. IRB.CreateCall(MS.MsanSetAllocaOriginNoDescriptionFn,
  3836. {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len,
  3837. IRB.CreatePointerCast(Idptr, IRB.getInt8PtrTy())});
  3838. }
  3839. }
  3840. }
  3841. void poisonAllocaKmsan(AllocaInst &I, IRBuilder<> &IRB, Value *Len) {
  3842. Value *Descr = getLocalVarDescription(I);
  3843. if (PoisonStack) {
  3844. IRB.CreateCall(MS.MsanPoisonAllocaFn,
  3845. {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len,
  3846. IRB.CreatePointerCast(Descr, IRB.getInt8PtrTy())});
  3847. } else {
  3848. IRB.CreateCall(MS.MsanUnpoisonAllocaFn,
  3849. {IRB.CreatePointerCast(&I, IRB.getInt8PtrTy()), Len});
  3850. }
  3851. }
  3852. void instrumentAlloca(AllocaInst &I, Instruction *InsPoint = nullptr) {
  3853. if (!InsPoint)
  3854. InsPoint = &I;
  3855. NextNodeIRBuilder IRB(InsPoint);
  3856. const DataLayout &DL = F.getParent()->getDataLayout();
  3857. uint64_t TypeSize = DL.getTypeAllocSize(I.getAllocatedType());
  3858. Value *Len = ConstantInt::get(MS.IntptrTy, TypeSize);
  3859. if (I.isArrayAllocation())
  3860. Len = IRB.CreateMul(Len,
  3861. IRB.CreateZExtOrTrunc(I.getArraySize(), MS.IntptrTy));
  3862. if (MS.CompileKernel)
  3863. poisonAllocaKmsan(I, IRB, Len);
  3864. else
  3865. poisonAllocaUserspace(I, IRB, Len);
  3866. }
  3867. void visitAllocaInst(AllocaInst &I) {
  3868. setShadow(&I, getCleanShadow(&I));
  3869. setOrigin(&I, getCleanOrigin());
  3870. // We'll get to this alloca later unless it's poisoned at the corresponding
  3871. // llvm.lifetime.start.
  3872. AllocaSet.insert(&I);
  3873. }
  3874. void visitSelectInst(SelectInst &I) {
  3875. IRBuilder<> IRB(&I);
  3876. // a = select b, c, d
  3877. Value *B = I.getCondition();
  3878. Value *C = I.getTrueValue();
  3879. Value *D = I.getFalseValue();
  3880. Value *Sb = getShadow(B);
  3881. Value *Sc = getShadow(C);
  3882. Value *Sd = getShadow(D);
  3883. // Result shadow if condition shadow is 0.
  3884. Value *Sa0 = IRB.CreateSelect(B, Sc, Sd);
  3885. Value *Sa1;
  3886. if (I.getType()->isAggregateType()) {
  3887. // To avoid "sign extending" i1 to an arbitrary aggregate type, we just do
  3888. // an extra "select". This results in much more compact IR.
  3889. // Sa = select Sb, poisoned, (select b, Sc, Sd)
  3890. Sa1 = getPoisonedShadow(getShadowTy(I.getType()));
  3891. } else {
  3892. // Sa = select Sb, [ (c^d) | Sc | Sd ], [ b ? Sc : Sd ]
  3893. // If Sb (condition is poisoned), look for bits in c and d that are equal
  3894. // and both unpoisoned.
  3895. // If !Sb (condition is unpoisoned), simply pick one of Sc and Sd.
  3896. // Cast arguments to shadow-compatible type.
  3897. C = CreateAppToShadowCast(IRB, C);
  3898. D = CreateAppToShadowCast(IRB, D);
  3899. // Result shadow if condition shadow is 1.
  3900. Sa1 = IRB.CreateOr({IRB.CreateXor(C, D), Sc, Sd});
  3901. }
  3902. Value *Sa = IRB.CreateSelect(Sb, Sa1, Sa0, "_msprop_select");
  3903. setShadow(&I, Sa);
  3904. if (MS.TrackOrigins) {
  3905. // Origins are always i32, so any vector conditions must be flattened.
  3906. // FIXME: consider tracking vector origins for app vectors?
  3907. if (B->getType()->isVectorTy()) {
  3908. Type *FlatTy = getShadowTyNoVec(B->getType());
  3909. B = IRB.CreateICmpNE(IRB.CreateBitCast(B, FlatTy),
  3910. ConstantInt::getNullValue(FlatTy));
  3911. Sb = IRB.CreateICmpNE(IRB.CreateBitCast(Sb, FlatTy),
  3912. ConstantInt::getNullValue(FlatTy));
  3913. }
  3914. // a = select b, c, d
  3915. // Oa = Sb ? Ob : (b ? Oc : Od)
  3916. setOrigin(
  3917. &I, IRB.CreateSelect(Sb, getOrigin(I.getCondition()),
  3918. IRB.CreateSelect(B, getOrigin(I.getTrueValue()),
  3919. getOrigin(I.getFalseValue()))));
  3920. }
  3921. }
  3922. void visitLandingPadInst(LandingPadInst &I) {
  3923. // Do nothing.
  3924. // See https://github.com/google/sanitizers/issues/504
  3925. setShadow(&I, getCleanShadow(&I));
  3926. setOrigin(&I, getCleanOrigin());
  3927. }
  3928. void visitCatchSwitchInst(CatchSwitchInst &I) {
  3929. setShadow(&I, getCleanShadow(&I));
  3930. setOrigin(&I, getCleanOrigin());
  3931. }
  3932. void visitFuncletPadInst(FuncletPadInst &I) {
  3933. setShadow(&I, getCleanShadow(&I));
  3934. setOrigin(&I, getCleanOrigin());
  3935. }
  3936. void visitGetElementPtrInst(GetElementPtrInst &I) { handleShadowOr(I); }
  3937. void visitExtractValueInst(ExtractValueInst &I) {
  3938. IRBuilder<> IRB(&I);
  3939. Value *Agg = I.getAggregateOperand();
  3940. LLVM_DEBUG(dbgs() << "ExtractValue: " << I << "\n");
  3941. Value *AggShadow = getShadow(Agg);
  3942. LLVM_DEBUG(dbgs() << " AggShadow: " << *AggShadow << "\n");
  3943. Value *ResShadow = IRB.CreateExtractValue(AggShadow, I.getIndices());
  3944. LLVM_DEBUG(dbgs() << " ResShadow: " << *ResShadow << "\n");
  3945. setShadow(&I, ResShadow);
  3946. setOriginForNaryOp(I);
  3947. }
  3948. void visitInsertValueInst(InsertValueInst &I) {
  3949. IRBuilder<> IRB(&I);
  3950. LLVM_DEBUG(dbgs() << "InsertValue: " << I << "\n");
  3951. Value *AggShadow = getShadow(I.getAggregateOperand());
  3952. Value *InsShadow = getShadow(I.getInsertedValueOperand());
  3953. LLVM_DEBUG(dbgs() << " AggShadow: " << *AggShadow << "\n");
  3954. LLVM_DEBUG(dbgs() << " InsShadow: " << *InsShadow << "\n");
  3955. Value *Res = IRB.CreateInsertValue(AggShadow, InsShadow, I.getIndices());
  3956. LLVM_DEBUG(dbgs() << " Res: " << *Res << "\n");
  3957. setShadow(&I, Res);
  3958. setOriginForNaryOp(I);
  3959. }
  3960. void dumpInst(Instruction &I) {
  3961. if (CallInst *CI = dyn_cast<CallInst>(&I)) {
  3962. errs() << "ZZZ call " << CI->getCalledFunction()->getName() << "\n";
  3963. } else {
  3964. errs() << "ZZZ " << I.getOpcodeName() << "\n";
  3965. }
  3966. errs() << "QQQ " << I << "\n";
  3967. }
  3968. void visitResumeInst(ResumeInst &I) {
  3969. LLVM_DEBUG(dbgs() << "Resume: " << I << "\n");
  3970. // Nothing to do here.
  3971. }
  3972. void visitCleanupReturnInst(CleanupReturnInst &CRI) {
  3973. LLVM_DEBUG(dbgs() << "CleanupReturn: " << CRI << "\n");
  3974. // Nothing to do here.
  3975. }
  3976. void visitCatchReturnInst(CatchReturnInst &CRI) {
  3977. LLVM_DEBUG(dbgs() << "CatchReturn: " << CRI << "\n");
  3978. // Nothing to do here.
  3979. }
  3980. void instrumentAsmArgument(Value *Operand, Type *ElemTy, Instruction &I,
  3981. IRBuilder<> &IRB, const DataLayout &DL,
  3982. bool isOutput) {
  3983. // For each assembly argument, we check its value for being initialized.
  3984. // If the argument is a pointer, we assume it points to a single element
  3985. // of the corresponding type (or to a 8-byte word, if the type is unsized).
  3986. // Each such pointer is instrumented with a call to the runtime library.
  3987. Type *OpType = Operand->getType();
  3988. // Check the operand value itself.
  3989. insertShadowCheck(Operand, &I);
  3990. if (!OpType->isPointerTy() || !isOutput) {
  3991. assert(!isOutput);
  3992. return;
  3993. }
  3994. if (!ElemTy->isSized())
  3995. return;
  3996. int Size = DL.getTypeStoreSize(ElemTy);
  3997. Value *Ptr = IRB.CreatePointerCast(Operand, IRB.getInt8PtrTy());
  3998. Value *SizeVal = ConstantInt::get(MS.IntptrTy, Size);
  3999. IRB.CreateCall(MS.MsanInstrumentAsmStoreFn, {Ptr, SizeVal});
  4000. }
  4001. /// Get the number of output arguments returned by pointers.
  4002. int getNumOutputArgs(InlineAsm *IA, CallBase *CB) {
  4003. int NumRetOutputs = 0;
  4004. int NumOutputs = 0;
  4005. Type *RetTy = cast<Value>(CB)->getType();
  4006. if (!RetTy->isVoidTy()) {
  4007. // Register outputs are returned via the CallInst return value.
  4008. auto *ST = dyn_cast<StructType>(RetTy);
  4009. if (ST)
  4010. NumRetOutputs = ST->getNumElements();
  4011. else
  4012. NumRetOutputs = 1;
  4013. }
  4014. InlineAsm::ConstraintInfoVector Constraints = IA->ParseConstraints();
  4015. for (const InlineAsm::ConstraintInfo &Info : Constraints) {
  4016. switch (Info.Type) {
  4017. case InlineAsm::isOutput:
  4018. NumOutputs++;
  4019. break;
  4020. default:
  4021. break;
  4022. }
  4023. }
  4024. return NumOutputs - NumRetOutputs;
  4025. }
  4026. void visitAsmInstruction(Instruction &I) {
  4027. // Conservative inline assembly handling: check for poisoned shadow of
  4028. // asm() arguments, then unpoison the result and all the memory locations
  4029. // pointed to by those arguments.
  4030. // An inline asm() statement in C++ contains lists of input and output
  4031. // arguments used by the assembly code. These are mapped to operands of the
  4032. // CallInst as follows:
  4033. // - nR register outputs ("=r) are returned by value in a single structure
  4034. // (SSA value of the CallInst);
  4035. // - nO other outputs ("=m" and others) are returned by pointer as first
  4036. // nO operands of the CallInst;
  4037. // - nI inputs ("r", "m" and others) are passed to CallInst as the
  4038. // remaining nI operands.
  4039. // The total number of asm() arguments in the source is nR+nO+nI, and the
  4040. // corresponding CallInst has nO+nI+1 operands (the last operand is the
  4041. // function to be called).
  4042. const DataLayout &DL = F.getParent()->getDataLayout();
  4043. CallBase *CB = cast<CallBase>(&I);
  4044. IRBuilder<> IRB(&I);
  4045. InlineAsm *IA = cast<InlineAsm>(CB->getCalledOperand());
  4046. int OutputArgs = getNumOutputArgs(IA, CB);
  4047. // The last operand of a CallInst is the function itself.
  4048. int NumOperands = CB->getNumOperands() - 1;
  4049. // Check input arguments. Doing so before unpoisoning output arguments, so
  4050. // that we won't overwrite uninit values before checking them.
  4051. for (int i = OutputArgs; i < NumOperands; i++) {
  4052. Value *Operand = CB->getOperand(i);
  4053. instrumentAsmArgument(Operand, CB->getParamElementType(i), I, IRB, DL,
  4054. /*isOutput*/ false);
  4055. }
  4056. // Unpoison output arguments. This must happen before the actual InlineAsm
  4057. // call, so that the shadow for memory published in the asm() statement
  4058. // remains valid.
  4059. for (int i = 0; i < OutputArgs; i++) {
  4060. Value *Operand = CB->getOperand(i);
  4061. instrumentAsmArgument(Operand, CB->getParamElementType(i), I, IRB, DL,
  4062. /*isOutput*/ true);
  4063. }
  4064. setShadow(&I, getCleanShadow(&I));
  4065. setOrigin(&I, getCleanOrigin());
  4066. }
  4067. void visitFreezeInst(FreezeInst &I) {
  4068. // Freeze always returns a fully defined value.
  4069. setShadow(&I, getCleanShadow(&I));
  4070. setOrigin(&I, getCleanOrigin());
  4071. }
  4072. void visitInstruction(Instruction &I) {
  4073. // Everything else: stop propagating and check for poisoned shadow.
  4074. if (ClDumpStrictInstructions)
  4075. dumpInst(I);
  4076. LLVM_DEBUG(dbgs() << "DEFAULT: " << I << "\n");
  4077. for (size_t i = 0, n = I.getNumOperands(); i < n; i++) {
  4078. Value *Operand = I.getOperand(i);
  4079. if (Operand->getType()->isSized())
  4080. insertShadowCheck(Operand, &I);
  4081. }
  4082. setShadow(&I, getCleanShadow(&I));
  4083. setOrigin(&I, getCleanOrigin());
  4084. }
  4085. };
  4086. /// AMD64-specific implementation of VarArgHelper.
  4087. struct VarArgAMD64Helper : public VarArgHelper {
  4088. // An unfortunate workaround for asymmetric lowering of va_arg stuff.
  4089. // See a comment in visitCallBase for more details.
  4090. static const unsigned AMD64GpEndOffset = 48; // AMD64 ABI Draft 0.99.6 p3.5.7
  4091. static const unsigned AMD64FpEndOffsetSSE = 176;
  4092. // If SSE is disabled, fp_offset in va_list is zero.
  4093. static const unsigned AMD64FpEndOffsetNoSSE = AMD64GpEndOffset;
  4094. unsigned AMD64FpEndOffset;
  4095. Function &F;
  4096. MemorySanitizer &MS;
  4097. MemorySanitizerVisitor &MSV;
  4098. Value *VAArgTLSCopy = nullptr;
  4099. Value *VAArgTLSOriginCopy = nullptr;
  4100. Value *VAArgOverflowSize = nullptr;
  4101. SmallVector<CallInst *, 16> VAStartInstrumentationList;
  4102. enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory };
  4103. VarArgAMD64Helper(Function &F, MemorySanitizer &MS,
  4104. MemorySanitizerVisitor &MSV)
  4105. : F(F), MS(MS), MSV(MSV) {
  4106. AMD64FpEndOffset = AMD64FpEndOffsetSSE;
  4107. for (const auto &Attr : F.getAttributes().getFnAttrs()) {
  4108. if (Attr.isStringAttribute() &&
  4109. (Attr.getKindAsString() == "target-features")) {
  4110. if (Attr.getValueAsString().contains("-sse"))
  4111. AMD64FpEndOffset = AMD64FpEndOffsetNoSSE;
  4112. break;
  4113. }
  4114. }
  4115. }
  4116. ArgKind classifyArgument(Value *arg) {
  4117. // A very rough approximation of X86_64 argument classification rules.
  4118. Type *T = arg->getType();
  4119. if (T->isFPOrFPVectorTy() || T->isX86_MMXTy())
  4120. return AK_FloatingPoint;
  4121. if (T->isIntegerTy() && T->getPrimitiveSizeInBits() <= 64)
  4122. return AK_GeneralPurpose;
  4123. if (T->isPointerTy())
  4124. return AK_GeneralPurpose;
  4125. return AK_Memory;
  4126. }
  4127. // For VarArg functions, store the argument shadow in an ABI-specific format
  4128. // that corresponds to va_list layout.
  4129. // We do this because Clang lowers va_arg in the frontend, and this pass
  4130. // only sees the low level code that deals with va_list internals.
  4131. // A much easier alternative (provided that Clang emits va_arg instructions)
  4132. // would have been to associate each live instance of va_list with a copy of
  4133. // MSanParamTLS, and extract shadow on va_arg() call in the argument list
  4134. // order.
  4135. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
  4136. unsigned GpOffset = 0;
  4137. unsigned FpOffset = AMD64GpEndOffset;
  4138. unsigned OverflowOffset = AMD64FpEndOffset;
  4139. const DataLayout &DL = F.getParent()->getDataLayout();
  4140. for (const auto &[ArgNo, A] : llvm::enumerate(CB.args())) {
  4141. bool IsFixed = ArgNo < CB.getFunctionType()->getNumParams();
  4142. bool IsByVal = CB.paramHasAttr(ArgNo, Attribute::ByVal);
  4143. if (IsByVal) {
  4144. // ByVal arguments always go to the overflow area.
  4145. // Fixed arguments passed through the overflow area will be stepped
  4146. // over by va_start, so don't count them towards the offset.
  4147. if (IsFixed)
  4148. continue;
  4149. assert(A->getType()->isPointerTy());
  4150. Type *RealTy = CB.getParamByValType(ArgNo);
  4151. uint64_t ArgSize = DL.getTypeAllocSize(RealTy);
  4152. Value *ShadowBase = getShadowPtrForVAArgument(
  4153. RealTy, IRB, OverflowOffset, alignTo(ArgSize, 8));
  4154. Value *OriginBase = nullptr;
  4155. if (MS.TrackOrigins)
  4156. OriginBase = getOriginPtrForVAArgument(RealTy, IRB, OverflowOffset);
  4157. OverflowOffset += alignTo(ArgSize, 8);
  4158. if (!ShadowBase)
  4159. continue;
  4160. Value *ShadowPtr, *OriginPtr;
  4161. std::tie(ShadowPtr, OriginPtr) =
  4162. MSV.getShadowOriginPtr(A, IRB, IRB.getInt8Ty(), kShadowTLSAlignment,
  4163. /*isStore*/ false);
  4164. IRB.CreateMemCpy(ShadowBase, kShadowTLSAlignment, ShadowPtr,
  4165. kShadowTLSAlignment, ArgSize);
  4166. if (MS.TrackOrigins)
  4167. IRB.CreateMemCpy(OriginBase, kShadowTLSAlignment, OriginPtr,
  4168. kShadowTLSAlignment, ArgSize);
  4169. } else {
  4170. ArgKind AK = classifyArgument(A);
  4171. if (AK == AK_GeneralPurpose && GpOffset >= AMD64GpEndOffset)
  4172. AK = AK_Memory;
  4173. if (AK == AK_FloatingPoint && FpOffset >= AMD64FpEndOffset)
  4174. AK = AK_Memory;
  4175. Value *ShadowBase, *OriginBase = nullptr;
  4176. switch (AK) {
  4177. case AK_GeneralPurpose:
  4178. ShadowBase =
  4179. getShadowPtrForVAArgument(A->getType(), IRB, GpOffset, 8);
  4180. if (MS.TrackOrigins)
  4181. OriginBase = getOriginPtrForVAArgument(A->getType(), IRB, GpOffset);
  4182. GpOffset += 8;
  4183. break;
  4184. case AK_FloatingPoint:
  4185. ShadowBase =
  4186. getShadowPtrForVAArgument(A->getType(), IRB, FpOffset, 16);
  4187. if (MS.TrackOrigins)
  4188. OriginBase = getOriginPtrForVAArgument(A->getType(), IRB, FpOffset);
  4189. FpOffset += 16;
  4190. break;
  4191. case AK_Memory:
  4192. if (IsFixed)
  4193. continue;
  4194. uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
  4195. ShadowBase =
  4196. getShadowPtrForVAArgument(A->getType(), IRB, OverflowOffset, 8);
  4197. if (MS.TrackOrigins)
  4198. OriginBase =
  4199. getOriginPtrForVAArgument(A->getType(), IRB, OverflowOffset);
  4200. OverflowOffset += alignTo(ArgSize, 8);
  4201. }
  4202. // Take fixed arguments into account for GpOffset and FpOffset,
  4203. // but don't actually store shadows for them.
  4204. // TODO(glider): don't call get*PtrForVAArgument() for them.
  4205. if (IsFixed)
  4206. continue;
  4207. if (!ShadowBase)
  4208. continue;
  4209. Value *Shadow = MSV.getShadow(A);
  4210. IRB.CreateAlignedStore(Shadow, ShadowBase, kShadowTLSAlignment);
  4211. if (MS.TrackOrigins) {
  4212. Value *Origin = MSV.getOrigin(A);
  4213. unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType());
  4214. MSV.paintOrigin(IRB, Origin, OriginBase, StoreSize,
  4215. std::max(kShadowTLSAlignment, kMinOriginAlignment));
  4216. }
  4217. }
  4218. }
  4219. Constant *OverflowSize =
  4220. ConstantInt::get(IRB.getInt64Ty(), OverflowOffset - AMD64FpEndOffset);
  4221. IRB.CreateStore(OverflowSize, MS.VAArgOverflowSizeTLS);
  4222. }
  4223. /// Compute the shadow address for a given va_arg.
  4224. Value *getShadowPtrForVAArgument(Type *Ty, IRBuilder<> &IRB,
  4225. unsigned ArgOffset, unsigned ArgSize) {
  4226. // Make sure we don't overflow __msan_va_arg_tls.
  4227. if (ArgOffset + ArgSize > kParamTLSSize)
  4228. return nullptr;
  4229. Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
  4230. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  4231. return IRB.CreateIntToPtr(Base, PointerType::get(MSV.getShadowTy(Ty), 0),
  4232. "_msarg_va_s");
  4233. }
  4234. /// Compute the origin address for a given va_arg.
  4235. Value *getOriginPtrForVAArgument(Type *Ty, IRBuilder<> &IRB, int ArgOffset) {
  4236. Value *Base = IRB.CreatePointerCast(MS.VAArgOriginTLS, MS.IntptrTy);
  4237. // getOriginPtrForVAArgument() is always called after
  4238. // getShadowPtrForVAArgument(), so __msan_va_arg_origin_tls can never
  4239. // overflow.
  4240. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  4241. return IRB.CreateIntToPtr(Base, PointerType::get(MS.OriginTy, 0),
  4242. "_msarg_va_o");
  4243. }
  4244. void unpoisonVAListTagForInst(IntrinsicInst &I) {
  4245. IRBuilder<> IRB(&I);
  4246. Value *VAListTag = I.getArgOperand(0);
  4247. Value *ShadowPtr, *OriginPtr;
  4248. const Align Alignment = Align(8);
  4249. std::tie(ShadowPtr, OriginPtr) =
  4250. MSV.getShadowOriginPtr(VAListTag, IRB, IRB.getInt8Ty(), Alignment,
  4251. /*isStore*/ true);
  4252. // Unpoison the whole __va_list_tag.
  4253. // FIXME: magic ABI constants.
  4254. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4255. /* size */ 24, Alignment, false);
  4256. // We shouldn't need to zero out the origins, as they're only checked for
  4257. // nonzero shadow.
  4258. }
  4259. void visitVAStartInst(VAStartInst &I) override {
  4260. if (F.getCallingConv() == CallingConv::Win64)
  4261. return;
  4262. VAStartInstrumentationList.push_back(&I);
  4263. unpoisonVAListTagForInst(I);
  4264. }
  4265. void visitVACopyInst(VACopyInst &I) override {
  4266. if (F.getCallingConv() == CallingConv::Win64)
  4267. return;
  4268. unpoisonVAListTagForInst(I);
  4269. }
  4270. void finalizeInstrumentation() override {
  4271. assert(!VAArgOverflowSize && !VAArgTLSCopy &&
  4272. "finalizeInstrumentation called twice");
  4273. if (!VAStartInstrumentationList.empty()) {
  4274. // If there is a va_start in this function, make a backup copy of
  4275. // va_arg_tls somewhere in the function entry block.
  4276. IRBuilder<> IRB(MSV.FnPrologueEnd);
  4277. VAArgOverflowSize =
  4278. IRB.CreateLoad(IRB.getInt64Ty(), MS.VAArgOverflowSizeTLS);
  4279. Value *CopySize = IRB.CreateAdd(
  4280. ConstantInt::get(MS.IntptrTy, AMD64FpEndOffset), VAArgOverflowSize);
  4281. VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  4282. IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);
  4283. if (MS.TrackOrigins) {
  4284. VAArgTLSOriginCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  4285. IRB.CreateMemCpy(VAArgTLSOriginCopy, Align(8), MS.VAArgOriginTLS,
  4286. Align(8), CopySize);
  4287. }
  4288. }
  4289. // Instrument va_start.
  4290. // Copy va_list shadow from the backup copy of the TLS contents.
  4291. for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
  4292. CallInst *OrigInst = VAStartInstrumentationList[i];
  4293. NextNodeIRBuilder IRB(OrigInst);
  4294. Value *VAListTag = OrigInst->getArgOperand(0);
  4295. Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  4296. Value *RegSaveAreaPtrPtr = IRB.CreateIntToPtr(
  4297. IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4298. ConstantInt::get(MS.IntptrTy, 16)),
  4299. PointerType::get(RegSaveAreaPtrTy, 0));
  4300. Value *RegSaveAreaPtr =
  4301. IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);
  4302. Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr;
  4303. const Align Alignment = Align(16);
  4304. std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =
  4305. MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4306. Alignment, /*isStore*/ true);
  4307. IRB.CreateMemCpy(RegSaveAreaShadowPtr, Alignment, VAArgTLSCopy, Alignment,
  4308. AMD64FpEndOffset);
  4309. if (MS.TrackOrigins)
  4310. IRB.CreateMemCpy(RegSaveAreaOriginPtr, Alignment, VAArgTLSOriginCopy,
  4311. Alignment, AMD64FpEndOffset);
  4312. Type *OverflowArgAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  4313. Value *OverflowArgAreaPtrPtr = IRB.CreateIntToPtr(
  4314. IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4315. ConstantInt::get(MS.IntptrTy, 8)),
  4316. PointerType::get(OverflowArgAreaPtrTy, 0));
  4317. Value *OverflowArgAreaPtr =
  4318. IRB.CreateLoad(OverflowArgAreaPtrTy, OverflowArgAreaPtrPtr);
  4319. Value *OverflowArgAreaShadowPtr, *OverflowArgAreaOriginPtr;
  4320. std::tie(OverflowArgAreaShadowPtr, OverflowArgAreaOriginPtr) =
  4321. MSV.getShadowOriginPtr(OverflowArgAreaPtr, IRB, IRB.getInt8Ty(),
  4322. Alignment, /*isStore*/ true);
  4323. Value *SrcPtr = IRB.CreateConstGEP1_32(IRB.getInt8Ty(), VAArgTLSCopy,
  4324. AMD64FpEndOffset);
  4325. IRB.CreateMemCpy(OverflowArgAreaShadowPtr, Alignment, SrcPtr, Alignment,
  4326. VAArgOverflowSize);
  4327. if (MS.TrackOrigins) {
  4328. SrcPtr = IRB.CreateConstGEP1_32(IRB.getInt8Ty(), VAArgTLSOriginCopy,
  4329. AMD64FpEndOffset);
  4330. IRB.CreateMemCpy(OverflowArgAreaOriginPtr, Alignment, SrcPtr, Alignment,
  4331. VAArgOverflowSize);
  4332. }
  4333. }
  4334. }
  4335. };
  4336. /// MIPS64-specific implementation of VarArgHelper.
  4337. struct VarArgMIPS64Helper : public VarArgHelper {
  4338. Function &F;
  4339. MemorySanitizer &MS;
  4340. MemorySanitizerVisitor &MSV;
  4341. Value *VAArgTLSCopy = nullptr;
  4342. Value *VAArgSize = nullptr;
  4343. SmallVector<CallInst *, 16> VAStartInstrumentationList;
  4344. VarArgMIPS64Helper(Function &F, MemorySanitizer &MS,
  4345. MemorySanitizerVisitor &MSV)
  4346. : F(F), MS(MS), MSV(MSV) {}
  4347. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
  4348. unsigned VAArgOffset = 0;
  4349. const DataLayout &DL = F.getParent()->getDataLayout();
  4350. for (Value *A :
  4351. llvm::drop_begin(CB.args(), CB.getFunctionType()->getNumParams())) {
  4352. Triple TargetTriple(F.getParent()->getTargetTriple());
  4353. Value *Base;
  4354. uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
  4355. if (TargetTriple.getArch() == Triple::mips64) {
  4356. // Adjusting the shadow for argument with size < 8 to match the
  4357. // placement of bits in big endian system
  4358. if (ArgSize < 8)
  4359. VAArgOffset += (8 - ArgSize);
  4360. }
  4361. Base = getShadowPtrForVAArgument(A->getType(), IRB, VAArgOffset, ArgSize);
  4362. VAArgOffset += ArgSize;
  4363. VAArgOffset = alignTo(VAArgOffset, 8);
  4364. if (!Base)
  4365. continue;
  4366. IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment);
  4367. }
  4368. Constant *TotalVAArgSize = ConstantInt::get(IRB.getInt64Ty(), VAArgOffset);
  4369. // Here using VAArgOverflowSizeTLS as VAArgSizeTLS to avoid creation of
  4370. // a new class member i.e. it is the total size of all VarArgs.
  4371. IRB.CreateStore(TotalVAArgSize, MS.VAArgOverflowSizeTLS);
  4372. }
  4373. /// Compute the shadow address for a given va_arg.
  4374. Value *getShadowPtrForVAArgument(Type *Ty, IRBuilder<> &IRB,
  4375. unsigned ArgOffset, unsigned ArgSize) {
  4376. // Make sure we don't overflow __msan_va_arg_tls.
  4377. if (ArgOffset + ArgSize > kParamTLSSize)
  4378. return nullptr;
  4379. Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
  4380. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  4381. return IRB.CreateIntToPtr(Base, PointerType::get(MSV.getShadowTy(Ty), 0),
  4382. "_msarg");
  4383. }
  4384. void visitVAStartInst(VAStartInst &I) override {
  4385. IRBuilder<> IRB(&I);
  4386. VAStartInstrumentationList.push_back(&I);
  4387. Value *VAListTag = I.getArgOperand(0);
  4388. Value *ShadowPtr, *OriginPtr;
  4389. const Align Alignment = Align(8);
  4390. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4391. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4392. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4393. /* size */ 8, Alignment, false);
  4394. }
  4395. void visitVACopyInst(VACopyInst &I) override {
  4396. IRBuilder<> IRB(&I);
  4397. VAStartInstrumentationList.push_back(&I);
  4398. Value *VAListTag = I.getArgOperand(0);
  4399. Value *ShadowPtr, *OriginPtr;
  4400. const Align Alignment = Align(8);
  4401. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4402. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4403. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4404. /* size */ 8, Alignment, false);
  4405. }
  4406. void finalizeInstrumentation() override {
  4407. assert(!VAArgSize && !VAArgTLSCopy &&
  4408. "finalizeInstrumentation called twice");
  4409. IRBuilder<> IRB(MSV.FnPrologueEnd);
  4410. VAArgSize = IRB.CreateLoad(IRB.getInt64Ty(), MS.VAArgOverflowSizeTLS);
  4411. Value *CopySize =
  4412. IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, 0), VAArgSize);
  4413. if (!VAStartInstrumentationList.empty()) {
  4414. // If there is a va_start in this function, make a backup copy of
  4415. // va_arg_tls somewhere in the function entry block.
  4416. VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  4417. IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);
  4418. }
  4419. // Instrument va_start.
  4420. // Copy va_list shadow from the backup copy of the TLS contents.
  4421. for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
  4422. CallInst *OrigInst = VAStartInstrumentationList[i];
  4423. NextNodeIRBuilder IRB(OrigInst);
  4424. Value *VAListTag = OrigInst->getArgOperand(0);
  4425. Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  4426. Value *RegSaveAreaPtrPtr =
  4427. IRB.CreateIntToPtr(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4428. PointerType::get(RegSaveAreaPtrTy, 0));
  4429. Value *RegSaveAreaPtr =
  4430. IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);
  4431. Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr;
  4432. const Align Alignment = Align(8);
  4433. std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =
  4434. MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4435. Alignment, /*isStore*/ true);
  4436. IRB.CreateMemCpy(RegSaveAreaShadowPtr, Alignment, VAArgTLSCopy, Alignment,
  4437. CopySize);
  4438. }
  4439. }
  4440. };
  4441. /// AArch64-specific implementation of VarArgHelper.
  4442. struct VarArgAArch64Helper : public VarArgHelper {
  4443. static const unsigned kAArch64GrArgSize = 64;
  4444. static const unsigned kAArch64VrArgSize = 128;
  4445. static const unsigned AArch64GrBegOffset = 0;
  4446. static const unsigned AArch64GrEndOffset = kAArch64GrArgSize;
  4447. // Make VR space aligned to 16 bytes.
  4448. static const unsigned AArch64VrBegOffset = AArch64GrEndOffset;
  4449. static const unsigned AArch64VrEndOffset =
  4450. AArch64VrBegOffset + kAArch64VrArgSize;
  4451. static const unsigned AArch64VAEndOffset = AArch64VrEndOffset;
  4452. Function &F;
  4453. MemorySanitizer &MS;
  4454. MemorySanitizerVisitor &MSV;
  4455. Value *VAArgTLSCopy = nullptr;
  4456. Value *VAArgOverflowSize = nullptr;
  4457. SmallVector<CallInst *, 16> VAStartInstrumentationList;
  4458. enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory };
  4459. VarArgAArch64Helper(Function &F, MemorySanitizer &MS,
  4460. MemorySanitizerVisitor &MSV)
  4461. : F(F), MS(MS), MSV(MSV) {}
  4462. ArgKind classifyArgument(Value *arg) {
  4463. Type *T = arg->getType();
  4464. if (T->isFPOrFPVectorTy())
  4465. return AK_FloatingPoint;
  4466. if ((T->isIntegerTy() && T->getPrimitiveSizeInBits() <= 64) ||
  4467. (T->isPointerTy()))
  4468. return AK_GeneralPurpose;
  4469. return AK_Memory;
  4470. }
  4471. // The instrumentation stores the argument shadow in a non ABI-specific
  4472. // format because it does not know which argument is named (since Clang,
  4473. // like x86_64 case, lowers the va_args in the frontend and this pass only
  4474. // sees the low level code that deals with va_list internals).
  4475. // The first seven GR registers are saved in the first 56 bytes of the
  4476. // va_arg tls arra, followers by the first 8 FP/SIMD registers, and then
  4477. // the remaining arguments.
  4478. // Using constant offset within the va_arg TLS array allows fast copy
  4479. // in the finalize instrumentation.
  4480. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
  4481. unsigned GrOffset = AArch64GrBegOffset;
  4482. unsigned VrOffset = AArch64VrBegOffset;
  4483. unsigned OverflowOffset = AArch64VAEndOffset;
  4484. const DataLayout &DL = F.getParent()->getDataLayout();
  4485. for (const auto &[ArgNo, A] : llvm::enumerate(CB.args())) {
  4486. bool IsFixed = ArgNo < CB.getFunctionType()->getNumParams();
  4487. ArgKind AK = classifyArgument(A);
  4488. if (AK == AK_GeneralPurpose && GrOffset >= AArch64GrEndOffset)
  4489. AK = AK_Memory;
  4490. if (AK == AK_FloatingPoint && VrOffset >= AArch64VrEndOffset)
  4491. AK = AK_Memory;
  4492. Value *Base;
  4493. switch (AK) {
  4494. case AK_GeneralPurpose:
  4495. Base = getShadowPtrForVAArgument(A->getType(), IRB, GrOffset, 8);
  4496. GrOffset += 8;
  4497. break;
  4498. case AK_FloatingPoint:
  4499. Base = getShadowPtrForVAArgument(A->getType(), IRB, VrOffset, 8);
  4500. VrOffset += 16;
  4501. break;
  4502. case AK_Memory:
  4503. // Don't count fixed arguments in the overflow area - va_start will
  4504. // skip right over them.
  4505. if (IsFixed)
  4506. continue;
  4507. uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
  4508. Base = getShadowPtrForVAArgument(A->getType(), IRB, OverflowOffset,
  4509. alignTo(ArgSize, 8));
  4510. OverflowOffset += alignTo(ArgSize, 8);
  4511. break;
  4512. }
  4513. // Count Gp/Vr fixed arguments to their respective offsets, but don't
  4514. // bother to actually store a shadow.
  4515. if (IsFixed)
  4516. continue;
  4517. if (!Base)
  4518. continue;
  4519. IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment);
  4520. }
  4521. Constant *OverflowSize =
  4522. ConstantInt::get(IRB.getInt64Ty(), OverflowOffset - AArch64VAEndOffset);
  4523. IRB.CreateStore(OverflowSize, MS.VAArgOverflowSizeTLS);
  4524. }
  4525. /// Compute the shadow address for a given va_arg.
  4526. Value *getShadowPtrForVAArgument(Type *Ty, IRBuilder<> &IRB,
  4527. unsigned ArgOffset, unsigned ArgSize) {
  4528. // Make sure we don't overflow __msan_va_arg_tls.
  4529. if (ArgOffset + ArgSize > kParamTLSSize)
  4530. return nullptr;
  4531. Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
  4532. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  4533. return IRB.CreateIntToPtr(Base, PointerType::get(MSV.getShadowTy(Ty), 0),
  4534. "_msarg");
  4535. }
  4536. void visitVAStartInst(VAStartInst &I) override {
  4537. IRBuilder<> IRB(&I);
  4538. VAStartInstrumentationList.push_back(&I);
  4539. Value *VAListTag = I.getArgOperand(0);
  4540. Value *ShadowPtr, *OriginPtr;
  4541. const Align Alignment = Align(8);
  4542. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4543. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4544. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4545. /* size */ 32, Alignment, false);
  4546. }
  4547. void visitVACopyInst(VACopyInst &I) override {
  4548. IRBuilder<> IRB(&I);
  4549. VAStartInstrumentationList.push_back(&I);
  4550. Value *VAListTag = I.getArgOperand(0);
  4551. Value *ShadowPtr, *OriginPtr;
  4552. const Align Alignment = Align(8);
  4553. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4554. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4555. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4556. /* size */ 32, Alignment, false);
  4557. }
  4558. // Retrieve a va_list field of 'void*' size.
  4559. Value *getVAField64(IRBuilder<> &IRB, Value *VAListTag, int offset) {
  4560. Value *SaveAreaPtrPtr = IRB.CreateIntToPtr(
  4561. IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4562. ConstantInt::get(MS.IntptrTy, offset)),
  4563. Type::getInt64PtrTy(*MS.C));
  4564. return IRB.CreateLoad(Type::getInt64Ty(*MS.C), SaveAreaPtrPtr);
  4565. }
  4566. // Retrieve a va_list field of 'int' size.
  4567. Value *getVAField32(IRBuilder<> &IRB, Value *VAListTag, int offset) {
  4568. Value *SaveAreaPtr = IRB.CreateIntToPtr(
  4569. IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4570. ConstantInt::get(MS.IntptrTy, offset)),
  4571. Type::getInt32PtrTy(*MS.C));
  4572. Value *SaveArea32 = IRB.CreateLoad(IRB.getInt32Ty(), SaveAreaPtr);
  4573. return IRB.CreateSExt(SaveArea32, MS.IntptrTy);
  4574. }
  4575. void finalizeInstrumentation() override {
  4576. assert(!VAArgOverflowSize && !VAArgTLSCopy &&
  4577. "finalizeInstrumentation called twice");
  4578. if (!VAStartInstrumentationList.empty()) {
  4579. // If there is a va_start in this function, make a backup copy of
  4580. // va_arg_tls somewhere in the function entry block.
  4581. IRBuilder<> IRB(MSV.FnPrologueEnd);
  4582. VAArgOverflowSize =
  4583. IRB.CreateLoad(IRB.getInt64Ty(), MS.VAArgOverflowSizeTLS);
  4584. Value *CopySize = IRB.CreateAdd(
  4585. ConstantInt::get(MS.IntptrTy, AArch64VAEndOffset), VAArgOverflowSize);
  4586. VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  4587. IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);
  4588. }
  4589. Value *GrArgSize = ConstantInt::get(MS.IntptrTy, kAArch64GrArgSize);
  4590. Value *VrArgSize = ConstantInt::get(MS.IntptrTy, kAArch64VrArgSize);
  4591. // Instrument va_start, copy va_list shadow from the backup copy of
  4592. // the TLS contents.
  4593. for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
  4594. CallInst *OrigInst = VAStartInstrumentationList[i];
  4595. NextNodeIRBuilder IRB(OrigInst);
  4596. Value *VAListTag = OrigInst->getArgOperand(0);
  4597. // The variadic ABI for AArch64 creates two areas to save the incoming
  4598. // argument registers (one for 64-bit general register xn-x7 and another
  4599. // for 128-bit FP/SIMD vn-v7).
  4600. // We need then to propagate the shadow arguments on both regions
  4601. // 'va::__gr_top + va::__gr_offs' and 'va::__vr_top + va::__vr_offs'.
  4602. // The remaining arguments are saved on shadow for 'va::stack'.
  4603. // One caveat is it requires only to propagate the non-named arguments,
  4604. // however on the call site instrumentation 'all' the arguments are
  4605. // saved. So to copy the shadow values from the va_arg TLS array
  4606. // we need to adjust the offset for both GR and VR fields based on
  4607. // the __{gr,vr}_offs value (since they are stores based on incoming
  4608. // named arguments).
  4609. // Read the stack pointer from the va_list.
  4610. Value *StackSaveAreaPtr = getVAField64(IRB, VAListTag, 0);
  4611. // Read both the __gr_top and __gr_off and add them up.
  4612. Value *GrTopSaveAreaPtr = getVAField64(IRB, VAListTag, 8);
  4613. Value *GrOffSaveArea = getVAField32(IRB, VAListTag, 24);
  4614. Value *GrRegSaveAreaPtr = IRB.CreateAdd(GrTopSaveAreaPtr, GrOffSaveArea);
  4615. // Read both the __vr_top and __vr_off and add them up.
  4616. Value *VrTopSaveAreaPtr = getVAField64(IRB, VAListTag, 16);
  4617. Value *VrOffSaveArea = getVAField32(IRB, VAListTag, 28);
  4618. Value *VrRegSaveAreaPtr = IRB.CreateAdd(VrTopSaveAreaPtr, VrOffSaveArea);
  4619. // It does not know how many named arguments is being used and, on the
  4620. // callsite all the arguments were saved. Since __gr_off is defined as
  4621. // '0 - ((8 - named_gr) * 8)', the idea is to just propagate the variadic
  4622. // argument by ignoring the bytes of shadow from named arguments.
  4623. Value *GrRegSaveAreaShadowPtrOff =
  4624. IRB.CreateAdd(GrArgSize, GrOffSaveArea);
  4625. Value *GrRegSaveAreaShadowPtr =
  4626. MSV.getShadowOriginPtr(GrRegSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4627. Align(8), /*isStore*/ true)
  4628. .first;
  4629. Value *GrSrcPtr = IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy,
  4630. GrRegSaveAreaShadowPtrOff);
  4631. Value *GrCopySize = IRB.CreateSub(GrArgSize, GrRegSaveAreaShadowPtrOff);
  4632. IRB.CreateMemCpy(GrRegSaveAreaShadowPtr, Align(8), GrSrcPtr, Align(8),
  4633. GrCopySize);
  4634. // Again, but for FP/SIMD values.
  4635. Value *VrRegSaveAreaShadowPtrOff =
  4636. IRB.CreateAdd(VrArgSize, VrOffSaveArea);
  4637. Value *VrRegSaveAreaShadowPtr =
  4638. MSV.getShadowOriginPtr(VrRegSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4639. Align(8), /*isStore*/ true)
  4640. .first;
  4641. Value *VrSrcPtr = IRB.CreateInBoundsGEP(
  4642. IRB.getInt8Ty(),
  4643. IRB.CreateInBoundsGEP(IRB.getInt8Ty(), VAArgTLSCopy,
  4644. IRB.getInt32(AArch64VrBegOffset)),
  4645. VrRegSaveAreaShadowPtrOff);
  4646. Value *VrCopySize = IRB.CreateSub(VrArgSize, VrRegSaveAreaShadowPtrOff);
  4647. IRB.CreateMemCpy(VrRegSaveAreaShadowPtr, Align(8), VrSrcPtr, Align(8),
  4648. VrCopySize);
  4649. // And finally for remaining arguments.
  4650. Value *StackSaveAreaShadowPtr =
  4651. MSV.getShadowOriginPtr(StackSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4652. Align(16), /*isStore*/ true)
  4653. .first;
  4654. Value *StackSrcPtr = IRB.CreateInBoundsGEP(
  4655. IRB.getInt8Ty(), VAArgTLSCopy, IRB.getInt32(AArch64VAEndOffset));
  4656. IRB.CreateMemCpy(StackSaveAreaShadowPtr, Align(16), StackSrcPtr,
  4657. Align(16), VAArgOverflowSize);
  4658. }
  4659. }
  4660. };
  4661. /// PowerPC64-specific implementation of VarArgHelper.
  4662. struct VarArgPowerPC64Helper : public VarArgHelper {
  4663. Function &F;
  4664. MemorySanitizer &MS;
  4665. MemorySanitizerVisitor &MSV;
  4666. Value *VAArgTLSCopy = nullptr;
  4667. Value *VAArgSize = nullptr;
  4668. SmallVector<CallInst *, 16> VAStartInstrumentationList;
  4669. VarArgPowerPC64Helper(Function &F, MemorySanitizer &MS,
  4670. MemorySanitizerVisitor &MSV)
  4671. : F(F), MS(MS), MSV(MSV) {}
  4672. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
  4673. // For PowerPC, we need to deal with alignment of stack arguments -
  4674. // they are mostly aligned to 8 bytes, but vectors and i128 arrays
  4675. // are aligned to 16 bytes, byvals can be aligned to 8 or 16 bytes,
  4676. // For that reason, we compute current offset from stack pointer (which is
  4677. // always properly aligned), and offset for the first vararg, then subtract
  4678. // them.
  4679. unsigned VAArgBase;
  4680. Triple TargetTriple(F.getParent()->getTargetTriple());
  4681. // Parameter save area starts at 48 bytes from frame pointer for ABIv1,
  4682. // and 32 bytes for ABIv2. This is usually determined by target
  4683. // endianness, but in theory could be overridden by function attribute.
  4684. if (TargetTriple.getArch() == Triple::ppc64)
  4685. VAArgBase = 48;
  4686. else
  4687. VAArgBase = 32;
  4688. unsigned VAArgOffset = VAArgBase;
  4689. const DataLayout &DL = F.getParent()->getDataLayout();
  4690. for (const auto &[ArgNo, A] : llvm::enumerate(CB.args())) {
  4691. bool IsFixed = ArgNo < CB.getFunctionType()->getNumParams();
  4692. bool IsByVal = CB.paramHasAttr(ArgNo, Attribute::ByVal);
  4693. if (IsByVal) {
  4694. assert(A->getType()->isPointerTy());
  4695. Type *RealTy = CB.getParamByValType(ArgNo);
  4696. uint64_t ArgSize = DL.getTypeAllocSize(RealTy);
  4697. Align ArgAlign = CB.getParamAlign(ArgNo).value_or(Align(8));
  4698. if (ArgAlign < 8)
  4699. ArgAlign = Align(8);
  4700. VAArgOffset = alignTo(VAArgOffset, ArgAlign);
  4701. if (!IsFixed) {
  4702. Value *Base = getShadowPtrForVAArgument(
  4703. RealTy, IRB, VAArgOffset - VAArgBase, ArgSize);
  4704. if (Base) {
  4705. Value *AShadowPtr, *AOriginPtr;
  4706. std::tie(AShadowPtr, AOriginPtr) =
  4707. MSV.getShadowOriginPtr(A, IRB, IRB.getInt8Ty(),
  4708. kShadowTLSAlignment, /*isStore*/ false);
  4709. IRB.CreateMemCpy(Base, kShadowTLSAlignment, AShadowPtr,
  4710. kShadowTLSAlignment, ArgSize);
  4711. }
  4712. }
  4713. VAArgOffset += alignTo(ArgSize, Align(8));
  4714. } else {
  4715. Value *Base;
  4716. uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
  4717. Align ArgAlign = Align(8);
  4718. if (A->getType()->isArrayTy()) {
  4719. // Arrays are aligned to element size, except for long double
  4720. // arrays, which are aligned to 8 bytes.
  4721. Type *ElementTy = A->getType()->getArrayElementType();
  4722. if (!ElementTy->isPPC_FP128Ty())
  4723. ArgAlign = Align(DL.getTypeAllocSize(ElementTy));
  4724. } else if (A->getType()->isVectorTy()) {
  4725. // Vectors are naturally aligned.
  4726. ArgAlign = Align(ArgSize);
  4727. }
  4728. if (ArgAlign < 8)
  4729. ArgAlign = Align(8);
  4730. VAArgOffset = alignTo(VAArgOffset, ArgAlign);
  4731. if (DL.isBigEndian()) {
  4732. // Adjusting the shadow for argument with size < 8 to match the
  4733. // placement of bits in big endian system
  4734. if (ArgSize < 8)
  4735. VAArgOffset += (8 - ArgSize);
  4736. }
  4737. if (!IsFixed) {
  4738. Base = getShadowPtrForVAArgument(A->getType(), IRB,
  4739. VAArgOffset - VAArgBase, ArgSize);
  4740. if (Base)
  4741. IRB.CreateAlignedStore(MSV.getShadow(A), Base, kShadowTLSAlignment);
  4742. }
  4743. VAArgOffset += ArgSize;
  4744. VAArgOffset = alignTo(VAArgOffset, Align(8));
  4745. }
  4746. if (IsFixed)
  4747. VAArgBase = VAArgOffset;
  4748. }
  4749. Constant *TotalVAArgSize =
  4750. ConstantInt::get(IRB.getInt64Ty(), VAArgOffset - VAArgBase);
  4751. // Here using VAArgOverflowSizeTLS as VAArgSizeTLS to avoid creation of
  4752. // a new class member i.e. it is the total size of all VarArgs.
  4753. IRB.CreateStore(TotalVAArgSize, MS.VAArgOverflowSizeTLS);
  4754. }
  4755. /// Compute the shadow address for a given va_arg.
  4756. Value *getShadowPtrForVAArgument(Type *Ty, IRBuilder<> &IRB,
  4757. unsigned ArgOffset, unsigned ArgSize) {
  4758. // Make sure we don't overflow __msan_va_arg_tls.
  4759. if (ArgOffset + ArgSize > kParamTLSSize)
  4760. return nullptr;
  4761. Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
  4762. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  4763. return IRB.CreateIntToPtr(Base, PointerType::get(MSV.getShadowTy(Ty), 0),
  4764. "_msarg");
  4765. }
  4766. void visitVAStartInst(VAStartInst &I) override {
  4767. IRBuilder<> IRB(&I);
  4768. VAStartInstrumentationList.push_back(&I);
  4769. Value *VAListTag = I.getArgOperand(0);
  4770. Value *ShadowPtr, *OriginPtr;
  4771. const Align Alignment = Align(8);
  4772. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4773. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4774. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4775. /* size */ 8, Alignment, false);
  4776. }
  4777. void visitVACopyInst(VACopyInst &I) override {
  4778. IRBuilder<> IRB(&I);
  4779. Value *VAListTag = I.getArgOperand(0);
  4780. Value *ShadowPtr, *OriginPtr;
  4781. const Align Alignment = Align(8);
  4782. std::tie(ShadowPtr, OriginPtr) = MSV.getShadowOriginPtr(
  4783. VAListTag, IRB, IRB.getInt8Ty(), Alignment, /*isStore*/ true);
  4784. // Unpoison the whole __va_list_tag.
  4785. // FIXME: magic ABI constants.
  4786. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  4787. /* size */ 8, Alignment, false);
  4788. }
  4789. void finalizeInstrumentation() override {
  4790. assert(!VAArgSize && !VAArgTLSCopy &&
  4791. "finalizeInstrumentation called twice");
  4792. IRBuilder<> IRB(MSV.FnPrologueEnd);
  4793. VAArgSize = IRB.CreateLoad(IRB.getInt64Ty(), MS.VAArgOverflowSizeTLS);
  4794. Value *CopySize =
  4795. IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, 0), VAArgSize);
  4796. if (!VAStartInstrumentationList.empty()) {
  4797. // If there is a va_start in this function, make a backup copy of
  4798. // va_arg_tls somewhere in the function entry block.
  4799. VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  4800. IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);
  4801. }
  4802. // Instrument va_start.
  4803. // Copy va_list shadow from the backup copy of the TLS contents.
  4804. for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
  4805. CallInst *OrigInst = VAStartInstrumentationList[i];
  4806. NextNodeIRBuilder IRB(OrigInst);
  4807. Value *VAListTag = OrigInst->getArgOperand(0);
  4808. Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  4809. Value *RegSaveAreaPtrPtr =
  4810. IRB.CreateIntToPtr(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  4811. PointerType::get(RegSaveAreaPtrTy, 0));
  4812. Value *RegSaveAreaPtr =
  4813. IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);
  4814. Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr;
  4815. const Align Alignment = Align(8);
  4816. std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =
  4817. MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(),
  4818. Alignment, /*isStore*/ true);
  4819. IRB.CreateMemCpy(RegSaveAreaShadowPtr, Alignment, VAArgTLSCopy, Alignment,
  4820. CopySize);
  4821. }
  4822. }
  4823. };
  4824. /// SystemZ-specific implementation of VarArgHelper.
  4825. struct VarArgSystemZHelper : public VarArgHelper {
  4826. static const unsigned SystemZGpOffset = 16;
  4827. static const unsigned SystemZGpEndOffset = 56;
  4828. static const unsigned SystemZFpOffset = 128;
  4829. static const unsigned SystemZFpEndOffset = 160;
  4830. static const unsigned SystemZMaxVrArgs = 8;
  4831. static const unsigned SystemZRegSaveAreaSize = 160;
  4832. static const unsigned SystemZOverflowOffset = 160;
  4833. static const unsigned SystemZVAListTagSize = 32;
  4834. static const unsigned SystemZOverflowArgAreaPtrOffset = 16;
  4835. static const unsigned SystemZRegSaveAreaPtrOffset = 24;
  4836. Function &F;
  4837. MemorySanitizer &MS;
  4838. MemorySanitizerVisitor &MSV;
  4839. Value *VAArgTLSCopy = nullptr;
  4840. Value *VAArgTLSOriginCopy = nullptr;
  4841. Value *VAArgOverflowSize = nullptr;
  4842. SmallVector<CallInst *, 16> VAStartInstrumentationList;
  4843. enum class ArgKind {
  4844. GeneralPurpose,
  4845. FloatingPoint,
  4846. Vector,
  4847. Memory,
  4848. Indirect,
  4849. };
  4850. enum class ShadowExtension { None, Zero, Sign };
  4851. VarArgSystemZHelper(Function &F, MemorySanitizer &MS,
  4852. MemorySanitizerVisitor &MSV)
  4853. : F(F), MS(MS), MSV(MSV) {}
  4854. ArgKind classifyArgument(Type *T, bool IsSoftFloatABI) {
  4855. // T is a SystemZABIInfo::classifyArgumentType() output, and there are
  4856. // only a few possibilities of what it can be. In particular, enums, single
  4857. // element structs and large types have already been taken care of.
  4858. // Some i128 and fp128 arguments are converted to pointers only in the
  4859. // back end.
  4860. if (T->isIntegerTy(128) || T->isFP128Ty())
  4861. return ArgKind::Indirect;
  4862. if (T->isFloatingPointTy())
  4863. return IsSoftFloatABI ? ArgKind::GeneralPurpose : ArgKind::FloatingPoint;
  4864. if (T->isIntegerTy() || T->isPointerTy())
  4865. return ArgKind::GeneralPurpose;
  4866. if (T->isVectorTy())
  4867. return ArgKind::Vector;
  4868. return ArgKind::Memory;
  4869. }
  4870. ShadowExtension getShadowExtension(const CallBase &CB, unsigned ArgNo) {
  4871. // ABI says: "One of the simple integer types no more than 64 bits wide.
  4872. // ... If such an argument is shorter than 64 bits, replace it by a full
  4873. // 64-bit integer representing the same number, using sign or zero
  4874. // extension". Shadow for an integer argument has the same type as the
  4875. // argument itself, so it can be sign or zero extended as well.
  4876. bool ZExt = CB.paramHasAttr(ArgNo, Attribute::ZExt);
  4877. bool SExt = CB.paramHasAttr(ArgNo, Attribute::SExt);
  4878. if (ZExt) {
  4879. assert(!SExt);
  4880. return ShadowExtension::Zero;
  4881. }
  4882. if (SExt) {
  4883. assert(!ZExt);
  4884. return ShadowExtension::Sign;
  4885. }
  4886. return ShadowExtension::None;
  4887. }
  4888. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {
  4889. bool IsSoftFloatABI = CB.getCalledFunction()
  4890. ->getFnAttribute("use-soft-float")
  4891. .getValueAsBool();
  4892. unsigned GpOffset = SystemZGpOffset;
  4893. unsigned FpOffset = SystemZFpOffset;
  4894. unsigned VrIndex = 0;
  4895. unsigned OverflowOffset = SystemZOverflowOffset;
  4896. const DataLayout &DL = F.getParent()->getDataLayout();
  4897. for (const auto &[ArgNo, A] : llvm::enumerate(CB.args())) {
  4898. bool IsFixed = ArgNo < CB.getFunctionType()->getNumParams();
  4899. // SystemZABIInfo does not produce ByVal parameters.
  4900. assert(!CB.paramHasAttr(ArgNo, Attribute::ByVal));
  4901. Type *T = A->getType();
  4902. ArgKind AK = classifyArgument(T, IsSoftFloatABI);
  4903. if (AK == ArgKind::Indirect) {
  4904. T = PointerType::get(T, 0);
  4905. AK = ArgKind::GeneralPurpose;
  4906. }
  4907. if (AK == ArgKind::GeneralPurpose && GpOffset >= SystemZGpEndOffset)
  4908. AK = ArgKind::Memory;
  4909. if (AK == ArgKind::FloatingPoint && FpOffset >= SystemZFpEndOffset)
  4910. AK = ArgKind::Memory;
  4911. if (AK == ArgKind::Vector && (VrIndex >= SystemZMaxVrArgs || !IsFixed))
  4912. AK = ArgKind::Memory;
  4913. Value *ShadowBase = nullptr;
  4914. Value *OriginBase = nullptr;
  4915. ShadowExtension SE = ShadowExtension::None;
  4916. switch (AK) {
  4917. case ArgKind::GeneralPurpose: {
  4918. // Always keep track of GpOffset, but store shadow only for varargs.
  4919. uint64_t ArgSize = 8;
  4920. if (GpOffset + ArgSize <= kParamTLSSize) {
  4921. if (!IsFixed) {
  4922. SE = getShadowExtension(CB, ArgNo);
  4923. uint64_t GapSize = 0;
  4924. if (SE == ShadowExtension::None) {
  4925. uint64_t ArgAllocSize = DL.getTypeAllocSize(T);
  4926. assert(ArgAllocSize <= ArgSize);
  4927. GapSize = ArgSize - ArgAllocSize;
  4928. }
  4929. ShadowBase = getShadowAddrForVAArgument(IRB, GpOffset + GapSize);
  4930. if (MS.TrackOrigins)
  4931. OriginBase = getOriginPtrForVAArgument(IRB, GpOffset + GapSize);
  4932. }
  4933. GpOffset += ArgSize;
  4934. } else {
  4935. GpOffset = kParamTLSSize;
  4936. }
  4937. break;
  4938. }
  4939. case ArgKind::FloatingPoint: {
  4940. // Always keep track of FpOffset, but store shadow only for varargs.
  4941. uint64_t ArgSize = 8;
  4942. if (FpOffset + ArgSize <= kParamTLSSize) {
  4943. if (!IsFixed) {
  4944. // PoP says: "A short floating-point datum requires only the
  4945. // left-most 32 bit positions of a floating-point register".
  4946. // Therefore, in contrast to AK_GeneralPurpose and AK_Memory,
  4947. // don't extend shadow and don't mind the gap.
  4948. ShadowBase = getShadowAddrForVAArgument(IRB, FpOffset);
  4949. if (MS.TrackOrigins)
  4950. OriginBase = getOriginPtrForVAArgument(IRB, FpOffset);
  4951. }
  4952. FpOffset += ArgSize;
  4953. } else {
  4954. FpOffset = kParamTLSSize;
  4955. }
  4956. break;
  4957. }
  4958. case ArgKind::Vector: {
  4959. // Keep track of VrIndex. No need to store shadow, since vector varargs
  4960. // go through AK_Memory.
  4961. assert(IsFixed);
  4962. VrIndex++;
  4963. break;
  4964. }
  4965. case ArgKind::Memory: {
  4966. // Keep track of OverflowOffset and store shadow only for varargs.
  4967. // Ignore fixed args, since we need to copy only the vararg portion of
  4968. // the overflow area shadow.
  4969. if (!IsFixed) {
  4970. uint64_t ArgAllocSize = DL.getTypeAllocSize(T);
  4971. uint64_t ArgSize = alignTo(ArgAllocSize, 8);
  4972. if (OverflowOffset + ArgSize <= kParamTLSSize) {
  4973. SE = getShadowExtension(CB, ArgNo);
  4974. uint64_t GapSize =
  4975. SE == ShadowExtension::None ? ArgSize - ArgAllocSize : 0;
  4976. ShadowBase =
  4977. getShadowAddrForVAArgument(IRB, OverflowOffset + GapSize);
  4978. if (MS.TrackOrigins)
  4979. OriginBase =
  4980. getOriginPtrForVAArgument(IRB, OverflowOffset + GapSize);
  4981. OverflowOffset += ArgSize;
  4982. } else {
  4983. OverflowOffset = kParamTLSSize;
  4984. }
  4985. }
  4986. break;
  4987. }
  4988. case ArgKind::Indirect:
  4989. llvm_unreachable("Indirect must be converted to GeneralPurpose");
  4990. }
  4991. if (ShadowBase == nullptr)
  4992. continue;
  4993. Value *Shadow = MSV.getShadow(A);
  4994. if (SE != ShadowExtension::None)
  4995. Shadow = MSV.CreateShadowCast(IRB, Shadow, IRB.getInt64Ty(),
  4996. /*Signed*/ SE == ShadowExtension::Sign);
  4997. ShadowBase = IRB.CreateIntToPtr(
  4998. ShadowBase, PointerType::get(Shadow->getType(), 0), "_msarg_va_s");
  4999. IRB.CreateStore(Shadow, ShadowBase);
  5000. if (MS.TrackOrigins) {
  5001. Value *Origin = MSV.getOrigin(A);
  5002. unsigned StoreSize = DL.getTypeStoreSize(Shadow->getType());
  5003. MSV.paintOrigin(IRB, Origin, OriginBase, StoreSize,
  5004. kMinOriginAlignment);
  5005. }
  5006. }
  5007. Constant *OverflowSize = ConstantInt::get(
  5008. IRB.getInt64Ty(), OverflowOffset - SystemZOverflowOffset);
  5009. IRB.CreateStore(OverflowSize, MS.VAArgOverflowSizeTLS);
  5010. }
  5011. Value *getShadowAddrForVAArgument(IRBuilder<> &IRB, unsigned ArgOffset) {
  5012. Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
  5013. return IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  5014. }
  5015. Value *getOriginPtrForVAArgument(IRBuilder<> &IRB, int ArgOffset) {
  5016. Value *Base = IRB.CreatePointerCast(MS.VAArgOriginTLS, MS.IntptrTy);
  5017. Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
  5018. return IRB.CreateIntToPtr(Base, PointerType::get(MS.OriginTy, 0),
  5019. "_msarg_va_o");
  5020. }
  5021. void unpoisonVAListTagForInst(IntrinsicInst &I) {
  5022. IRBuilder<> IRB(&I);
  5023. Value *VAListTag = I.getArgOperand(0);
  5024. Value *ShadowPtr, *OriginPtr;
  5025. const Align Alignment = Align(8);
  5026. std::tie(ShadowPtr, OriginPtr) =
  5027. MSV.getShadowOriginPtr(VAListTag, IRB, IRB.getInt8Ty(), Alignment,
  5028. /*isStore*/ true);
  5029. IRB.CreateMemSet(ShadowPtr, Constant::getNullValue(IRB.getInt8Ty()),
  5030. SystemZVAListTagSize, Alignment, false);
  5031. }
  5032. void visitVAStartInst(VAStartInst &I) override {
  5033. VAStartInstrumentationList.push_back(&I);
  5034. unpoisonVAListTagForInst(I);
  5035. }
  5036. void visitVACopyInst(VACopyInst &I) override { unpoisonVAListTagForInst(I); }
  5037. void copyRegSaveArea(IRBuilder<> &IRB, Value *VAListTag) {
  5038. Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  5039. Value *RegSaveAreaPtrPtr = IRB.CreateIntToPtr(
  5040. IRB.CreateAdd(
  5041. IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  5042. ConstantInt::get(MS.IntptrTy, SystemZRegSaveAreaPtrOffset)),
  5043. PointerType::get(RegSaveAreaPtrTy, 0));
  5044. Value *RegSaveAreaPtr = IRB.CreateLoad(RegSaveAreaPtrTy, RegSaveAreaPtrPtr);
  5045. Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr;
  5046. const Align Alignment = Align(8);
  5047. std::tie(RegSaveAreaShadowPtr, RegSaveAreaOriginPtr) =
  5048. MSV.getShadowOriginPtr(RegSaveAreaPtr, IRB, IRB.getInt8Ty(), Alignment,
  5049. /*isStore*/ true);
  5050. // TODO(iii): copy only fragments filled by visitCallBase()
  5051. IRB.CreateMemCpy(RegSaveAreaShadowPtr, Alignment, VAArgTLSCopy, Alignment,
  5052. SystemZRegSaveAreaSize);
  5053. if (MS.TrackOrigins)
  5054. IRB.CreateMemCpy(RegSaveAreaOriginPtr, Alignment, VAArgTLSOriginCopy,
  5055. Alignment, SystemZRegSaveAreaSize);
  5056. }
  5057. void copyOverflowArea(IRBuilder<> &IRB, Value *VAListTag) {
  5058. Type *OverflowArgAreaPtrTy = Type::getInt64PtrTy(*MS.C);
  5059. Value *OverflowArgAreaPtrPtr = IRB.CreateIntToPtr(
  5060. IRB.CreateAdd(
  5061. IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
  5062. ConstantInt::get(MS.IntptrTy, SystemZOverflowArgAreaPtrOffset)),
  5063. PointerType::get(OverflowArgAreaPtrTy, 0));
  5064. Value *OverflowArgAreaPtr =
  5065. IRB.CreateLoad(OverflowArgAreaPtrTy, OverflowArgAreaPtrPtr);
  5066. Value *OverflowArgAreaShadowPtr, *OverflowArgAreaOriginPtr;
  5067. const Align Alignment = Align(8);
  5068. std::tie(OverflowArgAreaShadowPtr, OverflowArgAreaOriginPtr) =
  5069. MSV.getShadowOriginPtr(OverflowArgAreaPtr, IRB, IRB.getInt8Ty(),
  5070. Alignment, /*isStore*/ true);
  5071. Value *SrcPtr = IRB.CreateConstGEP1_32(IRB.getInt8Ty(), VAArgTLSCopy,
  5072. SystemZOverflowOffset);
  5073. IRB.CreateMemCpy(OverflowArgAreaShadowPtr, Alignment, SrcPtr, Alignment,
  5074. VAArgOverflowSize);
  5075. if (MS.TrackOrigins) {
  5076. SrcPtr = IRB.CreateConstGEP1_32(IRB.getInt8Ty(), VAArgTLSOriginCopy,
  5077. SystemZOverflowOffset);
  5078. IRB.CreateMemCpy(OverflowArgAreaOriginPtr, Alignment, SrcPtr, Alignment,
  5079. VAArgOverflowSize);
  5080. }
  5081. }
  5082. void finalizeInstrumentation() override {
  5083. assert(!VAArgOverflowSize && !VAArgTLSCopy &&
  5084. "finalizeInstrumentation called twice");
  5085. if (!VAStartInstrumentationList.empty()) {
  5086. // If there is a va_start in this function, make a backup copy of
  5087. // va_arg_tls somewhere in the function entry block.
  5088. IRBuilder<> IRB(MSV.FnPrologueEnd);
  5089. VAArgOverflowSize =
  5090. IRB.CreateLoad(IRB.getInt64Ty(), MS.VAArgOverflowSizeTLS);
  5091. Value *CopySize =
  5092. IRB.CreateAdd(ConstantInt::get(MS.IntptrTy, SystemZOverflowOffset),
  5093. VAArgOverflowSize);
  5094. VAArgTLSCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  5095. IRB.CreateMemCpy(VAArgTLSCopy, Align(8), MS.VAArgTLS, Align(8), CopySize);
  5096. if (MS.TrackOrigins) {
  5097. VAArgTLSOriginCopy = IRB.CreateAlloca(Type::getInt8Ty(*MS.C), CopySize);
  5098. IRB.CreateMemCpy(VAArgTLSOriginCopy, Align(8), MS.VAArgOriginTLS,
  5099. Align(8), CopySize);
  5100. }
  5101. }
  5102. // Instrument va_start.
  5103. // Copy va_list shadow from the backup copy of the TLS contents.
  5104. for (size_t VaStartNo = 0, VaStartNum = VAStartInstrumentationList.size();
  5105. VaStartNo < VaStartNum; VaStartNo++) {
  5106. CallInst *OrigInst = VAStartInstrumentationList[VaStartNo];
  5107. NextNodeIRBuilder IRB(OrigInst);
  5108. Value *VAListTag = OrigInst->getArgOperand(0);
  5109. copyRegSaveArea(IRB, VAListTag);
  5110. copyOverflowArea(IRB, VAListTag);
  5111. }
  5112. }
  5113. };
  5114. /// A no-op implementation of VarArgHelper.
  5115. struct VarArgNoOpHelper : public VarArgHelper {
  5116. VarArgNoOpHelper(Function &F, MemorySanitizer &MS,
  5117. MemorySanitizerVisitor &MSV) {}
  5118. void visitCallBase(CallBase &CB, IRBuilder<> &IRB) override {}
  5119. void visitVAStartInst(VAStartInst &I) override {}
  5120. void visitVACopyInst(VACopyInst &I) override {}
  5121. void finalizeInstrumentation() override {}
  5122. };
  5123. } // end anonymous namespace
  5124. static VarArgHelper *CreateVarArgHelper(Function &Func, MemorySanitizer &Msan,
  5125. MemorySanitizerVisitor &Visitor) {
  5126. // VarArg handling is only implemented on AMD64. False positives are possible
  5127. // on other platforms.
  5128. Triple TargetTriple(Func.getParent()->getTargetTriple());
  5129. if (TargetTriple.getArch() == Triple::x86_64)
  5130. return new VarArgAMD64Helper(Func, Msan, Visitor);
  5131. else if (TargetTriple.isMIPS64())
  5132. return new VarArgMIPS64Helper(Func, Msan, Visitor);
  5133. else if (TargetTriple.getArch() == Triple::aarch64)
  5134. return new VarArgAArch64Helper(Func, Msan, Visitor);
  5135. else if (TargetTriple.getArch() == Triple::ppc64 ||
  5136. TargetTriple.getArch() == Triple::ppc64le)
  5137. return new VarArgPowerPC64Helper(Func, Msan, Visitor);
  5138. else if (TargetTriple.getArch() == Triple::systemz)
  5139. return new VarArgSystemZHelper(Func, Msan, Visitor);
  5140. else
  5141. return new VarArgNoOpHelper(Func, Msan, Visitor);
  5142. }
  5143. bool MemorySanitizer::sanitizeFunction(Function &F, TargetLibraryInfo &TLI) {
  5144. if (!CompileKernel && F.getName() == kMsanModuleCtorName)
  5145. return false;
  5146. if (F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation))
  5147. return false;
  5148. MemorySanitizerVisitor Visitor(F, *this, TLI);
  5149. // Clear out memory attributes.
  5150. AttributeMask B;
  5151. B.addAttribute(Attribute::Memory).addAttribute(Attribute::Speculatable);
  5152. F.removeFnAttrs(B);
  5153. return Visitor.runOnFunction();
  5154. }