Targets.cpp 143 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498
  1. //===--- Targets.cpp - Implement -arch option and targets -----------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements construction of a TargetInfo object from a
  11. // target triple.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Basic/TargetInfo.h"
  15. #include "clang/Basic/Builtins.h"
  16. #include "clang/Basic/Diagnostic.h"
  17. #include "clang/Basic/LangOptions.h"
  18. #include "clang/Basic/MacroBuilder.h"
  19. #include "clang/Basic/TargetBuiltins.h"
  20. #include "clang/Basic/TargetOptions.h"
  21. #include "llvm/ADT/APFloat.h"
  22. #include "llvm/ADT/OwningPtr.h"
  23. #include "llvm/ADT/STLExtras.h"
  24. #include "llvm/ADT/StringRef.h"
  25. #include "llvm/ADT/StringSwitch.h"
  26. #include "llvm/ADT/Triple.h"
  27. #include "llvm/MC/MCSectionMachO.h"
  28. #include "llvm/Support/ErrorHandling.h"
  29. #include "llvm/Type.h"
  30. #include <algorithm>
  31. using namespace clang;
  32. //===----------------------------------------------------------------------===//
  33. // Common code shared among targets.
  34. //===----------------------------------------------------------------------===//
  35. /// DefineStd - Define a macro name and standard variants. For example if
  36. /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
  37. /// when in GNU mode.
  38. static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
  39. const LangOptions &Opts) {
  40. assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
  41. // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
  42. // in the user's namespace.
  43. if (Opts.GNUMode)
  44. Builder.defineMacro(MacroName);
  45. // Define __unix.
  46. Builder.defineMacro("__" + MacroName);
  47. // Define __unix__.
  48. Builder.defineMacro("__" + MacroName + "__");
  49. }
  50. static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
  51. bool Tuning = true) {
  52. Builder.defineMacro("__" + CPUName);
  53. Builder.defineMacro("__" + CPUName + "__");
  54. if (Tuning)
  55. Builder.defineMacro("__tune_" + CPUName + "__");
  56. }
  57. //===----------------------------------------------------------------------===//
  58. // Defines specific to certain operating systems.
  59. //===----------------------------------------------------------------------===//
  60. namespace {
  61. template<typename TgtInfo>
  62. class OSTargetInfo : public TgtInfo {
  63. protected:
  64. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  65. MacroBuilder &Builder) const=0;
  66. public:
  67. OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
  68. virtual void getTargetDefines(const LangOptions &Opts,
  69. MacroBuilder &Builder) const {
  70. TgtInfo::getTargetDefines(Opts, Builder);
  71. getOSDefines(Opts, TgtInfo::getTriple(), Builder);
  72. }
  73. };
  74. } // end anonymous namespace
  75. static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
  76. const llvm::Triple &Triple,
  77. StringRef &PlatformName,
  78. VersionTuple &PlatformMinVersion) {
  79. Builder.defineMacro("__APPLE_CC__", "5621");
  80. Builder.defineMacro("__APPLE__");
  81. Builder.defineMacro("__MACH__");
  82. Builder.defineMacro("OBJC_NEW_PROPERTIES");
  83. if (!Opts.ObjCAutoRefCount) {
  84. // __weak is always defined, for use in blocks and with objc pointers.
  85. Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
  86. // Darwin defines __strong even in C mode (just to nothing).
  87. if (Opts.getGC() != LangOptions::NonGC)
  88. Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
  89. else
  90. Builder.defineMacro("__strong", "");
  91. // __unsafe_unretained is defined to nothing in non-ARC mode. We even
  92. // allow this in C, since one might have block pointers in structs that
  93. // are used in pure C code and in Objective-C ARC.
  94. Builder.defineMacro("__unsafe_unretained", "");
  95. }
  96. if (Opts.Static)
  97. Builder.defineMacro("__STATIC__");
  98. else
  99. Builder.defineMacro("__DYNAMIC__");
  100. if (Opts.POSIXThreads)
  101. Builder.defineMacro("_REENTRANT");
  102. // Get the platform type and version number from the triple.
  103. unsigned Maj, Min, Rev;
  104. if (Triple.isMacOSX()) {
  105. Triple.getMacOSXVersion(Maj, Min, Rev);
  106. PlatformName = "macosx";
  107. } else {
  108. Triple.getOSVersion(Maj, Min, Rev);
  109. PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
  110. }
  111. // If -target arch-pc-win32-macho option specified, we're
  112. // generating code for Win32 ABI. No need to emit
  113. // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
  114. if (PlatformName == "win32") {
  115. PlatformMinVersion = VersionTuple(Maj, Min, Rev);
  116. return;
  117. }
  118. // Set the appropriate OS version define.
  119. if (Triple.getOS() == llvm::Triple::IOS) {
  120. assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
  121. char Str[6];
  122. Str[0] = '0' + Maj;
  123. Str[1] = '0' + (Min / 10);
  124. Str[2] = '0' + (Min % 10);
  125. Str[3] = '0' + (Rev / 10);
  126. Str[4] = '0' + (Rev % 10);
  127. Str[5] = '\0';
  128. Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
  129. } else {
  130. // Note that the Driver allows versions which aren't representable in the
  131. // define (because we only get a single digit for the minor and micro
  132. // revision numbers). So, we limit them to the maximum representable
  133. // version.
  134. assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
  135. assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
  136. char Str[5];
  137. Str[0] = '0' + (Maj / 10);
  138. Str[1] = '0' + (Maj % 10);
  139. Str[2] = '0' + std::min(Min, 9U);
  140. Str[3] = '0' + std::min(Rev, 9U);
  141. Str[4] = '\0';
  142. Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
  143. }
  144. PlatformMinVersion = VersionTuple(Maj, Min, Rev);
  145. }
  146. namespace {
  147. template<typename Target>
  148. class DarwinTargetInfo : public OSTargetInfo<Target> {
  149. protected:
  150. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  151. MacroBuilder &Builder) const {
  152. getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
  153. this->PlatformMinVersion);
  154. }
  155. public:
  156. DarwinTargetInfo(const std::string& triple) :
  157. OSTargetInfo<Target>(triple) {
  158. llvm::Triple T = llvm::Triple(triple);
  159. this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
  160. this->MCountName = "\01mcount";
  161. }
  162. virtual std::string isValidSectionSpecifier(StringRef SR) const {
  163. // Let MCSectionMachO validate this.
  164. StringRef Segment, Section;
  165. unsigned TAA, StubSize;
  166. bool HasTAA;
  167. return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
  168. TAA, HasTAA, StubSize);
  169. }
  170. virtual const char *getStaticInitSectionSpecifier() const {
  171. // FIXME: We should return 0 when building kexts.
  172. return "__TEXT,__StaticInit,regular,pure_instructions";
  173. }
  174. /// Darwin does not support protected visibility. Darwin's "default"
  175. /// is very similar to ELF's "protected"; Darwin requires a "weak"
  176. /// attribute on declarations that can be dynamically replaced.
  177. virtual bool hasProtectedVisibility() const {
  178. return false;
  179. }
  180. };
  181. // DragonFlyBSD Target
  182. template<typename Target>
  183. class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
  184. protected:
  185. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  186. MacroBuilder &Builder) const {
  187. // DragonFly defines; list based off of gcc output
  188. Builder.defineMacro("__DragonFly__");
  189. Builder.defineMacro("__DragonFly_cc_version", "100001");
  190. Builder.defineMacro("__ELF__");
  191. Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
  192. Builder.defineMacro("__tune_i386__");
  193. DefineStd(Builder, "unix", Opts);
  194. }
  195. public:
  196. DragonFlyBSDTargetInfo(const std::string &triple)
  197. : OSTargetInfo<Target>(triple) {
  198. this->UserLabelPrefix = "";
  199. llvm::Triple Triple(triple);
  200. switch (Triple.getArch()) {
  201. default:
  202. case llvm::Triple::x86:
  203. case llvm::Triple::x86_64:
  204. this->MCountName = ".mcount";
  205. break;
  206. }
  207. }
  208. };
  209. // FreeBSD Target
  210. template<typename Target>
  211. class FreeBSDTargetInfo : public OSTargetInfo<Target> {
  212. protected:
  213. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  214. MacroBuilder &Builder) const {
  215. // FreeBSD defines; list based off of gcc output
  216. unsigned Release = Triple.getOSMajorVersion();
  217. if (Release == 0U)
  218. Release = 8;
  219. Builder.defineMacro("__FreeBSD__", Twine(Release));
  220. Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
  221. Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
  222. DefineStd(Builder, "unix", Opts);
  223. Builder.defineMacro("__ELF__");
  224. }
  225. public:
  226. FreeBSDTargetInfo(const std::string &triple)
  227. : OSTargetInfo<Target>(triple) {
  228. this->UserLabelPrefix = "";
  229. llvm::Triple Triple(triple);
  230. switch (Triple.getArch()) {
  231. default:
  232. case llvm::Triple::x86:
  233. case llvm::Triple::x86_64:
  234. this->MCountName = ".mcount";
  235. break;
  236. case llvm::Triple::mips:
  237. case llvm::Triple::mipsel:
  238. case llvm::Triple::ppc:
  239. case llvm::Triple::ppc64:
  240. this->MCountName = "_mcount";
  241. break;
  242. case llvm::Triple::arm:
  243. this->MCountName = "__mcount";
  244. break;
  245. }
  246. }
  247. };
  248. // Minix Target
  249. template<typename Target>
  250. class MinixTargetInfo : public OSTargetInfo<Target> {
  251. protected:
  252. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  253. MacroBuilder &Builder) const {
  254. // Minix defines
  255. Builder.defineMacro("__minix", "3");
  256. Builder.defineMacro("_EM_WSIZE", "4");
  257. Builder.defineMacro("_EM_PSIZE", "4");
  258. Builder.defineMacro("_EM_SSIZE", "2");
  259. Builder.defineMacro("_EM_LSIZE", "4");
  260. Builder.defineMacro("_EM_FSIZE", "4");
  261. Builder.defineMacro("_EM_DSIZE", "8");
  262. Builder.defineMacro("__ELF__");
  263. DefineStd(Builder, "unix", Opts);
  264. }
  265. public:
  266. MinixTargetInfo(const std::string &triple)
  267. : OSTargetInfo<Target>(triple) {
  268. this->UserLabelPrefix = "";
  269. }
  270. };
  271. // Linux target
  272. template<typename Target>
  273. class LinuxTargetInfo : public OSTargetInfo<Target> {
  274. protected:
  275. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  276. MacroBuilder &Builder) const {
  277. // Linux defines; list based off of gcc output
  278. DefineStd(Builder, "unix", Opts);
  279. DefineStd(Builder, "linux", Opts);
  280. Builder.defineMacro("__gnu_linux__");
  281. Builder.defineMacro("__ELF__");
  282. if (Triple.getEnvironment() == llvm::Triple::ANDROIDEABI)
  283. Builder.defineMacro("__ANDROID__", "1");
  284. if (Opts.POSIXThreads)
  285. Builder.defineMacro("_REENTRANT");
  286. if (Opts.CPlusPlus)
  287. Builder.defineMacro("_GNU_SOURCE");
  288. }
  289. public:
  290. LinuxTargetInfo(const std::string& triple)
  291. : OSTargetInfo<Target>(triple) {
  292. this->UserLabelPrefix = "";
  293. this->WIntType = TargetInfo::UnsignedInt;
  294. }
  295. virtual const char *getStaticInitSectionSpecifier() const {
  296. return ".text.startup";
  297. }
  298. };
  299. // NetBSD Target
  300. template<typename Target>
  301. class NetBSDTargetInfo : public OSTargetInfo<Target> {
  302. protected:
  303. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  304. MacroBuilder &Builder) const {
  305. // NetBSD defines; list based off of gcc output
  306. Builder.defineMacro("__NetBSD__");
  307. Builder.defineMacro("__unix__");
  308. Builder.defineMacro("__ELF__");
  309. if (Opts.POSIXThreads)
  310. Builder.defineMacro("_POSIX_THREADS");
  311. }
  312. public:
  313. NetBSDTargetInfo(const std::string &triple)
  314. : OSTargetInfo<Target>(triple) {
  315. this->UserLabelPrefix = "";
  316. }
  317. };
  318. // OpenBSD Target
  319. template<typename Target>
  320. class OpenBSDTargetInfo : public OSTargetInfo<Target> {
  321. protected:
  322. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  323. MacroBuilder &Builder) const {
  324. // OpenBSD defines; list based off of gcc output
  325. Builder.defineMacro("__OpenBSD__");
  326. DefineStd(Builder, "unix", Opts);
  327. Builder.defineMacro("__ELF__");
  328. if (Opts.POSIXThreads)
  329. Builder.defineMacro("_REENTRANT");
  330. }
  331. public:
  332. OpenBSDTargetInfo(const std::string &triple)
  333. : OSTargetInfo<Target>(triple) {
  334. this->UserLabelPrefix = "";
  335. this->TLSSupported = false;
  336. llvm::Triple Triple(triple);
  337. switch (Triple.getArch()) {
  338. default:
  339. case llvm::Triple::x86:
  340. case llvm::Triple::x86_64:
  341. case llvm::Triple::arm:
  342. case llvm::Triple::sparc:
  343. this->MCountName = "__mcount";
  344. break;
  345. case llvm::Triple::mips64:
  346. case llvm::Triple::mips64el:
  347. case llvm::Triple::ppc:
  348. case llvm::Triple::sparcv9:
  349. this->MCountName = "_mcount";
  350. break;
  351. }
  352. }
  353. };
  354. // Bitrig Target
  355. template<typename Target>
  356. class BitrigTargetInfo : public OSTargetInfo<Target> {
  357. protected:
  358. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  359. MacroBuilder &Builder) const {
  360. // Bitrig defines; list based off of gcc output
  361. Builder.defineMacro("__Bitrig__");
  362. DefineStd(Builder, "unix", Opts);
  363. Builder.defineMacro("__ELF__");
  364. if (Opts.POSIXThreads)
  365. Builder.defineMacro("_REENTRANT");
  366. }
  367. public:
  368. BitrigTargetInfo(const std::string &triple)
  369. : OSTargetInfo<Target>(triple) {
  370. this->UserLabelPrefix = "";
  371. this->TLSSupported = false;
  372. this->MCountName = "__mcount";
  373. }
  374. };
  375. // PSP Target
  376. template<typename Target>
  377. class PSPTargetInfo : public OSTargetInfo<Target> {
  378. protected:
  379. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  380. MacroBuilder &Builder) const {
  381. // PSP defines; list based on the output of the pspdev gcc toolchain.
  382. Builder.defineMacro("PSP");
  383. Builder.defineMacro("_PSP");
  384. Builder.defineMacro("__psp__");
  385. Builder.defineMacro("__ELF__");
  386. }
  387. public:
  388. PSPTargetInfo(const std::string& triple)
  389. : OSTargetInfo<Target>(triple) {
  390. this->UserLabelPrefix = "";
  391. }
  392. };
  393. // PS3 PPU Target
  394. template<typename Target>
  395. class PS3PPUTargetInfo : public OSTargetInfo<Target> {
  396. protected:
  397. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  398. MacroBuilder &Builder) const {
  399. // PS3 PPU defines.
  400. Builder.defineMacro("__PPC__");
  401. Builder.defineMacro("__PPU__");
  402. Builder.defineMacro("__CELLOS_LV2__");
  403. Builder.defineMacro("__ELF__");
  404. Builder.defineMacro("__LP32__");
  405. Builder.defineMacro("_ARCH_PPC64");
  406. Builder.defineMacro("__powerpc64__");
  407. }
  408. public:
  409. PS3PPUTargetInfo(const std::string& triple)
  410. : OSTargetInfo<Target>(triple) {
  411. this->UserLabelPrefix = "";
  412. this->LongWidth = this->LongAlign = 32;
  413. this->PointerWidth = this->PointerAlign = 32;
  414. this->IntMaxType = TargetInfo::SignedLongLong;
  415. this->UIntMaxType = TargetInfo::UnsignedLongLong;
  416. this->Int64Type = TargetInfo::SignedLongLong;
  417. this->SizeType = TargetInfo::UnsignedInt;
  418. this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  419. "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
  420. }
  421. };
  422. // FIXME: Need a real SPU target.
  423. // PS3 SPU Target
  424. template<typename Target>
  425. class PS3SPUTargetInfo : public OSTargetInfo<Target> {
  426. protected:
  427. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  428. MacroBuilder &Builder) const {
  429. // PS3 PPU defines.
  430. Builder.defineMacro("__SPU__");
  431. Builder.defineMacro("__ELF__");
  432. }
  433. public:
  434. PS3SPUTargetInfo(const std::string& triple)
  435. : OSTargetInfo<Target>(triple) {
  436. this->UserLabelPrefix = "";
  437. }
  438. };
  439. // AuroraUX target
  440. template<typename Target>
  441. class AuroraUXTargetInfo : public OSTargetInfo<Target> {
  442. protected:
  443. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  444. MacroBuilder &Builder) const {
  445. DefineStd(Builder, "sun", Opts);
  446. DefineStd(Builder, "unix", Opts);
  447. Builder.defineMacro("__ELF__");
  448. Builder.defineMacro("__svr4__");
  449. Builder.defineMacro("__SVR4");
  450. }
  451. public:
  452. AuroraUXTargetInfo(const std::string& triple)
  453. : OSTargetInfo<Target>(triple) {
  454. this->UserLabelPrefix = "";
  455. this->WCharType = this->SignedLong;
  456. // FIXME: WIntType should be SignedLong
  457. }
  458. };
  459. // Solaris target
  460. template<typename Target>
  461. class SolarisTargetInfo : public OSTargetInfo<Target> {
  462. protected:
  463. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  464. MacroBuilder &Builder) const {
  465. DefineStd(Builder, "sun", Opts);
  466. DefineStd(Builder, "unix", Opts);
  467. Builder.defineMacro("__ELF__");
  468. Builder.defineMacro("__svr4__");
  469. Builder.defineMacro("__SVR4");
  470. // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
  471. // newer, but to 500 for everything else. feature_test.h has a check to
  472. // ensure that you are not using C99 with an old version of X/Open or C89
  473. // with a new version.
  474. if (Opts.C99 || Opts.C11)
  475. Builder.defineMacro("_XOPEN_SOURCE", "600");
  476. else
  477. Builder.defineMacro("_XOPEN_SOURCE", "500");
  478. if (Opts.CPlusPlus)
  479. Builder.defineMacro("__C99FEATURES__");
  480. Builder.defineMacro("_LARGEFILE_SOURCE");
  481. Builder.defineMacro("_LARGEFILE64_SOURCE");
  482. Builder.defineMacro("__EXTENSIONS__");
  483. Builder.defineMacro("_REENTRANT");
  484. }
  485. public:
  486. SolarisTargetInfo(const std::string& triple)
  487. : OSTargetInfo<Target>(triple) {
  488. this->UserLabelPrefix = "";
  489. this->WCharType = this->SignedInt;
  490. // FIXME: WIntType should be SignedLong
  491. }
  492. };
  493. // Windows target
  494. template<typename Target>
  495. class WindowsTargetInfo : public OSTargetInfo<Target> {
  496. protected:
  497. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  498. MacroBuilder &Builder) const {
  499. Builder.defineMacro("_WIN32");
  500. }
  501. void getVisualStudioDefines(const LangOptions &Opts,
  502. MacroBuilder &Builder) const {
  503. if (Opts.CPlusPlus) {
  504. if (Opts.RTTI)
  505. Builder.defineMacro("_CPPRTTI");
  506. if (Opts.Exceptions)
  507. Builder.defineMacro("_CPPUNWIND");
  508. }
  509. if (!Opts.CharIsSigned)
  510. Builder.defineMacro("_CHAR_UNSIGNED");
  511. // FIXME: POSIXThreads isn't exactly the option this should be defined for,
  512. // but it works for now.
  513. if (Opts.POSIXThreads)
  514. Builder.defineMacro("_MT");
  515. if (Opts.MSCVersion != 0)
  516. Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
  517. if (Opts.MicrosoftExt) {
  518. Builder.defineMacro("_MSC_EXTENSIONS");
  519. if (Opts.CPlusPlus0x) {
  520. Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
  521. Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
  522. Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
  523. }
  524. }
  525. Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
  526. }
  527. public:
  528. WindowsTargetInfo(const std::string &triple)
  529. : OSTargetInfo<Target>(triple) {}
  530. };
  531. } // end anonymous namespace.
  532. //===----------------------------------------------------------------------===//
  533. // Specific target implementations.
  534. //===----------------------------------------------------------------------===//
  535. namespace {
  536. // PPC abstract base class
  537. class PPCTargetInfo : public TargetInfo {
  538. static const Builtin::Info BuiltinInfo[];
  539. static const char * const GCCRegNames[];
  540. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  541. std::string CPU;
  542. public:
  543. PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
  544. LongDoubleWidth = LongDoubleAlign = 128;
  545. LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
  546. }
  547. /// \brief Flags for architecture specific defines.
  548. typedef enum {
  549. ArchDefineNone = 0,
  550. ArchDefineName = 1 << 0, // <name> is substituted for arch name.
  551. ArchDefinePpcgr = 1 << 1,
  552. ArchDefinePpcsq = 1 << 2,
  553. ArchDefine440 = 1 << 3,
  554. ArchDefine603 = 1 << 4,
  555. ArchDefine604 = 1 << 5,
  556. ArchDefinePwr4 = 1 << 6,
  557. ArchDefinePwr6 = 1 << 7
  558. } ArchDefineTypes;
  559. virtual bool setCPU(const std::string &Name) {
  560. bool CPUKnown = llvm::StringSwitch<bool>(Name)
  561. .Case("generic", true)
  562. .Case("440", true)
  563. .Case("450", true)
  564. .Case("601", true)
  565. .Case("602", true)
  566. .Case("603", true)
  567. .Case("603e", true)
  568. .Case("603ev", true)
  569. .Case("604", true)
  570. .Case("604e", true)
  571. .Case("620", true)
  572. .Case("g3", true)
  573. .Case("7400", true)
  574. .Case("g4", true)
  575. .Case("7450", true)
  576. .Case("g4+", true)
  577. .Case("750", true)
  578. .Case("970", true)
  579. .Case("g5", true)
  580. .Case("a2", true)
  581. .Case("pwr6", true)
  582. .Case("pwr7", true)
  583. .Case("ppc", true)
  584. .Case("ppc64", true)
  585. .Default(false);
  586. if (CPUKnown)
  587. CPU = Name;
  588. return CPUKnown;
  589. }
  590. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  591. unsigned &NumRecords) const {
  592. Records = BuiltinInfo;
  593. NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
  594. }
  595. virtual bool isCLZForZeroUndef() const { return false; }
  596. virtual void getTargetDefines(const LangOptions &Opts,
  597. MacroBuilder &Builder) const;
  598. virtual bool hasFeature(StringRef Feature) const;
  599. virtual void getGCCRegNames(const char * const *&Names,
  600. unsigned &NumNames) const;
  601. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  602. unsigned &NumAliases) const;
  603. virtual bool validateAsmConstraint(const char *&Name,
  604. TargetInfo::ConstraintInfo &Info) const {
  605. switch (*Name) {
  606. default: return false;
  607. case 'O': // Zero
  608. break;
  609. case 'b': // Base register
  610. case 'f': // Floating point register
  611. Info.setAllowsRegister();
  612. break;
  613. // FIXME: The following are added to allow parsing.
  614. // I just took a guess at what the actions should be.
  615. // Also, is more specific checking needed? I.e. specific registers?
  616. case 'd': // Floating point register (containing 64-bit value)
  617. case 'v': // Altivec vector register
  618. Info.setAllowsRegister();
  619. break;
  620. case 'w':
  621. switch (Name[1]) {
  622. case 'd':// VSX vector register to hold vector double data
  623. case 'f':// VSX vector register to hold vector float data
  624. case 's':// VSX vector register to hold scalar float data
  625. case 'a':// Any VSX register
  626. break;
  627. default:
  628. return false;
  629. }
  630. Info.setAllowsRegister();
  631. Name++; // Skip over 'w'.
  632. break;
  633. case 'h': // `MQ', `CTR', or `LINK' register
  634. case 'q': // `MQ' register
  635. case 'c': // `CTR' register
  636. case 'l': // `LINK' register
  637. case 'x': // `CR' register (condition register) number 0
  638. case 'y': // `CR' register (condition register)
  639. case 'z': // `XER[CA]' carry bit (part of the XER register)
  640. Info.setAllowsRegister();
  641. break;
  642. case 'I': // Signed 16-bit constant
  643. case 'J': // Unsigned 16-bit constant shifted left 16 bits
  644. // (use `L' instead for SImode constants)
  645. case 'K': // Unsigned 16-bit constant
  646. case 'L': // Signed 16-bit constant shifted left 16 bits
  647. case 'M': // Constant larger than 31
  648. case 'N': // Exact power of 2
  649. case 'P': // Constant whose negation is a signed 16-bit constant
  650. case 'G': // Floating point constant that can be loaded into a
  651. // register with one instruction per word
  652. case 'H': // Integer/Floating point constant that can be loaded
  653. // into a register using three instructions
  654. break;
  655. case 'm': // Memory operand. Note that on PowerPC targets, m can
  656. // include addresses that update the base register. It
  657. // is therefore only safe to use `m' in an asm statement
  658. // if that asm statement accesses the operand exactly once.
  659. // The asm statement must also use `%U<opno>' as a
  660. // placeholder for the "update" flag in the corresponding
  661. // load or store instruction. For example:
  662. // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
  663. // is correct but:
  664. // asm ("st %1,%0" : "=m" (mem) : "r" (val));
  665. // is not. Use es rather than m if you don't want the base
  666. // register to be updated.
  667. case 'e':
  668. if (Name[1] != 's')
  669. return false;
  670. // es: A "stable" memory operand; that is, one which does not
  671. // include any automodification of the base register. Unlike
  672. // `m', this constraint can be used in asm statements that
  673. // might access the operand several times, or that might not
  674. // access it at all.
  675. Info.setAllowsMemory();
  676. Name++; // Skip over 'e'.
  677. break;
  678. case 'Q': // Memory operand that is an offset from a register (it is
  679. // usually better to use `m' or `es' in asm statements)
  680. case 'Z': // Memory operand that is an indexed or indirect from a
  681. // register (it is usually better to use `m' or `es' in
  682. // asm statements)
  683. Info.setAllowsMemory();
  684. Info.setAllowsRegister();
  685. break;
  686. case 'R': // AIX TOC entry
  687. case 'a': // Address operand that is an indexed or indirect from a
  688. // register (`p' is preferable for asm statements)
  689. case 'S': // Constant suitable as a 64-bit mask operand
  690. case 'T': // Constant suitable as a 32-bit mask operand
  691. case 'U': // System V Release 4 small data area reference
  692. case 't': // AND masks that can be performed by two rldic{l, r}
  693. // instructions
  694. case 'W': // Vector constant that does not require memory
  695. case 'j': // Vector constant that is all zeros.
  696. break;
  697. // End FIXME.
  698. }
  699. return true;
  700. }
  701. virtual const char *getClobbers() const {
  702. return "";
  703. }
  704. };
  705. const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
  706. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  707. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  708. ALL_LANGUAGES },
  709. #include "clang/Basic/BuiltinsPPC.def"
  710. };
  711. /// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
  712. /// #defines that are not tied to a specific subtarget.
  713. void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
  714. MacroBuilder &Builder) const {
  715. // Target identification.
  716. Builder.defineMacro("__ppc__");
  717. Builder.defineMacro("_ARCH_PPC");
  718. Builder.defineMacro("__powerpc__");
  719. Builder.defineMacro("__POWERPC__");
  720. if (PointerWidth == 64) {
  721. Builder.defineMacro("_ARCH_PPC64");
  722. Builder.defineMacro("_LP64");
  723. Builder.defineMacro("__LP64__");
  724. Builder.defineMacro("__powerpc64__");
  725. Builder.defineMacro("__ppc64__");
  726. } else {
  727. Builder.defineMacro("__ppc__");
  728. }
  729. // Target properties.
  730. if (getTriple().getOS() != llvm::Triple::NetBSD &&
  731. getTriple().getOS() != llvm::Triple::OpenBSD)
  732. Builder.defineMacro("_BIG_ENDIAN");
  733. Builder.defineMacro("__BIG_ENDIAN__");
  734. // Subtarget options.
  735. Builder.defineMacro("__NATURAL_ALIGNMENT__");
  736. Builder.defineMacro("__REGISTER_PREFIX__", "");
  737. // FIXME: Should be controlled by command line option.
  738. Builder.defineMacro("__LONG_DOUBLE_128__");
  739. if (Opts.AltiVec) {
  740. Builder.defineMacro("__VEC__", "10206");
  741. Builder.defineMacro("__ALTIVEC__");
  742. }
  743. // CPU identification.
  744. ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
  745. .Case("440", ArchDefineName)
  746. .Case("450", ArchDefineName | ArchDefine440)
  747. .Case("601", ArchDefineName)
  748. .Case("602", ArchDefineName | ArchDefinePpcgr)
  749. .Case("603", ArchDefineName | ArchDefinePpcgr)
  750. .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
  751. .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
  752. .Case("604", ArchDefineName | ArchDefinePpcgr)
  753. .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
  754. .Case("620", ArchDefineName | ArchDefinePpcgr)
  755. .Case("7400", ArchDefineName | ArchDefinePpcgr)
  756. .Case("7450", ArchDefineName | ArchDefinePpcgr)
  757. .Case("750", ArchDefineName | ArchDefinePpcgr)
  758. .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
  759. | ArchDefinePpcsq)
  760. .Case("pwr6", ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
  761. .Case("pwr7", ArchDefineName | ArchDefinePwr6 | ArchDefinePpcgr
  762. | ArchDefinePpcsq)
  763. .Default(ArchDefineNone);
  764. if (defs & ArchDefineName)
  765. Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
  766. if (defs & ArchDefinePpcgr)
  767. Builder.defineMacro("_ARCH_PPCGR");
  768. if (defs & ArchDefinePpcsq)
  769. Builder.defineMacro("_ARCH_PPCSQ");
  770. if (defs & ArchDefine440)
  771. Builder.defineMacro("_ARCH_440");
  772. if (defs & ArchDefine603)
  773. Builder.defineMacro("_ARCH_603");
  774. if (defs & ArchDefine604)
  775. Builder.defineMacro("_ARCH_604");
  776. if (defs & (ArchDefinePwr4 | ArchDefinePwr6))
  777. Builder.defineMacro("_ARCH_PWR4");
  778. if (defs & ArchDefinePwr6) {
  779. Builder.defineMacro("_ARCH_PWR5");
  780. Builder.defineMacro("_ARCH_PWR6");
  781. }
  782. }
  783. bool PPCTargetInfo::hasFeature(StringRef Feature) const {
  784. return Feature == "powerpc";
  785. }
  786. const char * const PPCTargetInfo::GCCRegNames[] = {
  787. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  788. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  789. "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  790. "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
  791. "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
  792. "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
  793. "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
  794. "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
  795. "mq", "lr", "ctr", "ap",
  796. "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
  797. "xer",
  798. "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
  799. "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
  800. "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
  801. "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
  802. "vrsave", "vscr",
  803. "spe_acc", "spefscr",
  804. "sfp"
  805. };
  806. void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
  807. unsigned &NumNames) const {
  808. Names = GCCRegNames;
  809. NumNames = llvm::array_lengthof(GCCRegNames);
  810. }
  811. const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
  812. // While some of these aliases do map to different registers
  813. // they still share the same register name.
  814. { { "0" }, "r0" },
  815. { { "1"}, "r1" },
  816. { { "2" }, "r2" },
  817. { { "3" }, "r3" },
  818. { { "4" }, "r4" },
  819. { { "5" }, "r5" },
  820. { { "6" }, "r6" },
  821. { { "7" }, "r7" },
  822. { { "8" }, "r8" },
  823. { { "9" }, "r9" },
  824. { { "10" }, "r10" },
  825. { { "11" }, "r11" },
  826. { { "12" }, "r12" },
  827. { { "13" }, "r13" },
  828. { { "14" }, "r14" },
  829. { { "15" }, "r15" },
  830. { { "16" }, "r16" },
  831. { { "17" }, "r17" },
  832. { { "18" }, "r18" },
  833. { { "19" }, "r19" },
  834. { { "20" }, "r20" },
  835. { { "21" }, "r21" },
  836. { { "22" }, "r22" },
  837. { { "23" }, "r23" },
  838. { { "24" }, "r24" },
  839. { { "25" }, "r25" },
  840. { { "26" }, "r26" },
  841. { { "27" }, "r27" },
  842. { { "28" }, "r28" },
  843. { { "29" }, "r29" },
  844. { { "30" }, "r30" },
  845. { { "31" }, "r31" },
  846. { { "fr0" }, "f0" },
  847. { { "fr1" }, "f1" },
  848. { { "fr2" }, "f2" },
  849. { { "fr3" }, "f3" },
  850. { { "fr4" }, "f4" },
  851. { { "fr5" }, "f5" },
  852. { { "fr6" }, "f6" },
  853. { { "fr7" }, "f7" },
  854. { { "fr8" }, "f8" },
  855. { { "fr9" }, "f9" },
  856. { { "fr10" }, "f10" },
  857. { { "fr11" }, "f11" },
  858. { { "fr12" }, "f12" },
  859. { { "fr13" }, "f13" },
  860. { { "fr14" }, "f14" },
  861. { { "fr15" }, "f15" },
  862. { { "fr16" }, "f16" },
  863. { { "fr17" }, "f17" },
  864. { { "fr18" }, "f18" },
  865. { { "fr19" }, "f19" },
  866. { { "fr20" }, "f20" },
  867. { { "fr21" }, "f21" },
  868. { { "fr22" }, "f22" },
  869. { { "fr23" }, "f23" },
  870. { { "fr24" }, "f24" },
  871. { { "fr25" }, "f25" },
  872. { { "fr26" }, "f26" },
  873. { { "fr27" }, "f27" },
  874. { { "fr28" }, "f28" },
  875. { { "fr29" }, "f29" },
  876. { { "fr30" }, "f30" },
  877. { { "fr31" }, "f31" },
  878. { { "cc" }, "cr0" },
  879. };
  880. void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  881. unsigned &NumAliases) const {
  882. Aliases = GCCRegAliases;
  883. NumAliases = llvm::array_lengthof(GCCRegAliases);
  884. }
  885. } // end anonymous namespace.
  886. namespace {
  887. class PPC32TargetInfo : public PPCTargetInfo {
  888. public:
  889. PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
  890. DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  891. "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
  892. switch (getTriple().getOS()) {
  893. case llvm::Triple::Linux:
  894. case llvm::Triple::FreeBSD:
  895. case llvm::Triple::NetBSD:
  896. SizeType = UnsignedInt;
  897. PtrDiffType = SignedInt;
  898. IntPtrType = SignedInt;
  899. break;
  900. default:
  901. break;
  902. }
  903. if (getTriple().getOS() == llvm::Triple::FreeBSD) {
  904. LongDoubleWidth = LongDoubleAlign = 64;
  905. LongDoubleFormat = &llvm::APFloat::IEEEdouble;
  906. }
  907. }
  908. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  909. // This is the ELF definition, and is overridden by the Darwin sub-target
  910. return TargetInfo::PowerABIBuiltinVaList;
  911. }
  912. };
  913. } // end anonymous namespace.
  914. namespace {
  915. class PPC64TargetInfo : public PPCTargetInfo {
  916. public:
  917. PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
  918. LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
  919. IntMaxType = SignedLong;
  920. UIntMaxType = UnsignedLong;
  921. Int64Type = SignedLong;
  922. DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  923. "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
  924. if (getTriple().getOS() == llvm::Triple::FreeBSD) {
  925. LongDoubleWidth = LongDoubleAlign = 64;
  926. LongDoubleFormat = &llvm::APFloat::IEEEdouble;
  927. }
  928. }
  929. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  930. return TargetInfo::CharPtrBuiltinVaList;
  931. }
  932. };
  933. } // end anonymous namespace.
  934. namespace {
  935. class DarwinPPC32TargetInfo :
  936. public DarwinTargetInfo<PPC32TargetInfo> {
  937. public:
  938. DarwinPPC32TargetInfo(const std::string& triple)
  939. : DarwinTargetInfo<PPC32TargetInfo>(triple) {
  940. HasAlignMac68kSupport = true;
  941. BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
  942. LongLongAlign = 32;
  943. SuitableAlign = 128;
  944. DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  945. "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
  946. }
  947. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  948. return TargetInfo::CharPtrBuiltinVaList;
  949. }
  950. };
  951. class DarwinPPC64TargetInfo :
  952. public DarwinTargetInfo<PPC64TargetInfo> {
  953. public:
  954. DarwinPPC64TargetInfo(const std::string& triple)
  955. : DarwinTargetInfo<PPC64TargetInfo>(triple) {
  956. HasAlignMac68kSupport = true;
  957. SuitableAlign = 128;
  958. }
  959. };
  960. } // end anonymous namespace.
  961. namespace {
  962. static const unsigned NVPTXAddrSpaceMap[] = {
  963. 1, // opencl_global
  964. 3, // opencl_local
  965. 4, // opencl_constant
  966. 1, // cuda_device
  967. 4, // cuda_constant
  968. 3, // cuda_shared
  969. };
  970. class NVPTXTargetInfo : public TargetInfo {
  971. static const char * const GCCRegNames[];
  972. static const Builtin::Info BuiltinInfo[];
  973. std::vector<llvm::StringRef> AvailableFeatures;
  974. public:
  975. NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
  976. BigEndian = false;
  977. TLSSupported = false;
  978. LongWidth = LongAlign = 64;
  979. AddrSpaceMap = &NVPTXAddrSpaceMap;
  980. // Define available target features
  981. // These must be defined in sorted order!
  982. NoAsmVariants = true;
  983. }
  984. virtual void getTargetDefines(const LangOptions &Opts,
  985. MacroBuilder &Builder) const {
  986. Builder.defineMacro("__PTX__");
  987. Builder.defineMacro("__NVPTX__");
  988. }
  989. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  990. unsigned &NumRecords) const {
  991. Records = BuiltinInfo;
  992. NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
  993. }
  994. virtual bool hasFeature(StringRef Feature) const {
  995. return Feature == "ptx" || Feature == "nvptx";
  996. }
  997. virtual void getGCCRegNames(const char * const *&Names,
  998. unsigned &NumNames) const;
  999. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  1000. unsigned &NumAliases) const {
  1001. // No aliases.
  1002. Aliases = 0;
  1003. NumAliases = 0;
  1004. }
  1005. virtual bool validateAsmConstraint(const char *&Name,
  1006. TargetInfo::ConstraintInfo &info) const {
  1007. // FIXME: implement
  1008. return true;
  1009. }
  1010. virtual const char *getClobbers() const {
  1011. // FIXME: Is this really right?
  1012. return "";
  1013. }
  1014. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  1015. // FIXME: implement
  1016. return TargetInfo::CharPtrBuiltinVaList;
  1017. }
  1018. virtual bool setCPU(const std::string &Name) {
  1019. return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
  1020. }
  1021. virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
  1022. StringRef Name,
  1023. bool Enabled) const;
  1024. };
  1025. const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
  1026. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  1027. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  1028. ALL_LANGUAGES },
  1029. #include "clang/Basic/BuiltinsNVPTX.def"
  1030. };
  1031. const char * const NVPTXTargetInfo::GCCRegNames[] = {
  1032. "r0"
  1033. };
  1034. void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
  1035. unsigned &NumNames) const {
  1036. Names = GCCRegNames;
  1037. NumNames = llvm::array_lengthof(GCCRegNames);
  1038. }
  1039. bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
  1040. StringRef Name,
  1041. bool Enabled) const {
  1042. if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
  1043. Name)) {
  1044. Features[Name] = Enabled;
  1045. return true;
  1046. } else {
  1047. return false;
  1048. }
  1049. }
  1050. class NVPTX32TargetInfo : public NVPTXTargetInfo {
  1051. public:
  1052. NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
  1053. PointerWidth = PointerAlign = 32;
  1054. SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
  1055. DescriptionString
  1056. = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
  1057. "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
  1058. "n16:32:64";
  1059. }
  1060. };
  1061. class NVPTX64TargetInfo : public NVPTXTargetInfo {
  1062. public:
  1063. NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
  1064. PointerWidth = PointerAlign = 64;
  1065. SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
  1066. DescriptionString
  1067. = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
  1068. "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
  1069. "n16:32:64";
  1070. }
  1071. };
  1072. }
  1073. namespace {
  1074. // MBlaze abstract base class
  1075. class MBlazeTargetInfo : public TargetInfo {
  1076. static const char * const GCCRegNames[];
  1077. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  1078. public:
  1079. MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
  1080. DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
  1081. }
  1082. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  1083. unsigned &NumRecords) const {
  1084. // FIXME: Implement.
  1085. Records = 0;
  1086. NumRecords = 0;
  1087. }
  1088. virtual void getTargetDefines(const LangOptions &Opts,
  1089. MacroBuilder &Builder) const;
  1090. virtual bool hasFeature(StringRef Feature) const {
  1091. return Feature == "mblaze";
  1092. }
  1093. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  1094. return TargetInfo::CharPtrBuiltinVaList;
  1095. }
  1096. virtual const char *getTargetPrefix() const {
  1097. return "mblaze";
  1098. }
  1099. virtual void getGCCRegNames(const char * const *&Names,
  1100. unsigned &NumNames) const;
  1101. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  1102. unsigned &NumAliases) const;
  1103. virtual bool validateAsmConstraint(const char *&Name,
  1104. TargetInfo::ConstraintInfo &Info) const {
  1105. switch (*Name) {
  1106. default: return false;
  1107. case 'O': // Zero
  1108. return true;
  1109. case 'b': // Base register
  1110. case 'f': // Floating point register
  1111. Info.setAllowsRegister();
  1112. return true;
  1113. }
  1114. }
  1115. virtual const char *getClobbers() const {
  1116. return "";
  1117. }
  1118. };
  1119. /// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
  1120. /// #defines that are not tied to a specific subtarget.
  1121. void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
  1122. MacroBuilder &Builder) const {
  1123. // Target identification.
  1124. Builder.defineMacro("__microblaze__");
  1125. Builder.defineMacro("_ARCH_MICROBLAZE");
  1126. Builder.defineMacro("__MICROBLAZE__");
  1127. // Target properties.
  1128. Builder.defineMacro("_BIG_ENDIAN");
  1129. Builder.defineMacro("__BIG_ENDIAN__");
  1130. // Subtarget options.
  1131. Builder.defineMacro("__REGISTER_PREFIX__", "");
  1132. }
  1133. const char * const MBlazeTargetInfo::GCCRegNames[] = {
  1134. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  1135. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  1136. "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  1137. "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
  1138. "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
  1139. "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
  1140. "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
  1141. "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
  1142. "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
  1143. "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
  1144. };
  1145. void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
  1146. unsigned &NumNames) const {
  1147. Names = GCCRegNames;
  1148. NumNames = llvm::array_lengthof(GCCRegNames);
  1149. }
  1150. const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
  1151. { {"f0"}, "r0" },
  1152. { {"f1"}, "r1" },
  1153. { {"f2"}, "r2" },
  1154. { {"f3"}, "r3" },
  1155. { {"f4"}, "r4" },
  1156. { {"f5"}, "r5" },
  1157. { {"f6"}, "r6" },
  1158. { {"f7"}, "r7" },
  1159. { {"f8"}, "r8" },
  1160. { {"f9"}, "r9" },
  1161. { {"f10"}, "r10" },
  1162. { {"f11"}, "r11" },
  1163. { {"f12"}, "r12" },
  1164. { {"f13"}, "r13" },
  1165. { {"f14"}, "r14" },
  1166. { {"f15"}, "r15" },
  1167. { {"f16"}, "r16" },
  1168. { {"f17"}, "r17" },
  1169. { {"f18"}, "r18" },
  1170. { {"f19"}, "r19" },
  1171. { {"f20"}, "r20" },
  1172. { {"f21"}, "r21" },
  1173. { {"f22"}, "r22" },
  1174. { {"f23"}, "r23" },
  1175. { {"f24"}, "r24" },
  1176. { {"f25"}, "r25" },
  1177. { {"f26"}, "r26" },
  1178. { {"f27"}, "r27" },
  1179. { {"f28"}, "r28" },
  1180. { {"f29"}, "r29" },
  1181. { {"f30"}, "r30" },
  1182. { {"f31"}, "r31" },
  1183. };
  1184. void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  1185. unsigned &NumAliases) const {
  1186. Aliases = GCCRegAliases;
  1187. NumAliases = llvm::array_lengthof(GCCRegAliases);
  1188. }
  1189. } // end anonymous namespace.
  1190. namespace {
  1191. // Namespace for x86 abstract base class
  1192. const Builtin::Info BuiltinInfo[] = {
  1193. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  1194. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  1195. ALL_LANGUAGES },
  1196. #include "clang/Basic/BuiltinsX86.def"
  1197. };
  1198. static const char* const GCCRegNames[] = {
  1199. "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
  1200. "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
  1201. "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
  1202. "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
  1203. "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
  1204. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  1205. "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
  1206. "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
  1207. "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
  1208. };
  1209. const TargetInfo::AddlRegName AddlRegNames[] = {
  1210. { { "al", "ah", "eax", "rax" }, 0 },
  1211. { { "bl", "bh", "ebx", "rbx" }, 3 },
  1212. { { "cl", "ch", "ecx", "rcx" }, 2 },
  1213. { { "dl", "dh", "edx", "rdx" }, 1 },
  1214. { { "esi", "rsi" }, 4 },
  1215. { { "edi", "rdi" }, 5 },
  1216. { { "esp", "rsp" }, 7 },
  1217. { { "ebp", "rbp" }, 6 },
  1218. };
  1219. // X86 target abstract base class; x86-32 and x86-64 are very close, so
  1220. // most of the implementation can be shared.
  1221. class X86TargetInfo : public TargetInfo {
  1222. enum X86SSEEnum {
  1223. NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
  1224. } SSELevel;
  1225. enum MMX3DNowEnum {
  1226. NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
  1227. } MMX3DNowLevel;
  1228. bool HasAES;
  1229. bool HasPCLMUL;
  1230. bool HasLZCNT;
  1231. bool HasRDRND;
  1232. bool HasBMI;
  1233. bool HasBMI2;
  1234. bool HasPOPCNT;
  1235. bool HasSSE4a;
  1236. bool HasFMA4;
  1237. bool HasFMA;
  1238. bool HasXOP;
  1239. /// \brief Enumeration of all of the X86 CPUs supported by Clang.
  1240. ///
  1241. /// Each enumeration represents a particular CPU supported by Clang. These
  1242. /// loosely correspond to the options passed to '-march' or '-mtune' flags.
  1243. enum CPUKind {
  1244. CK_Generic,
  1245. /// \name i386
  1246. /// i386-generation processors.
  1247. //@{
  1248. CK_i386,
  1249. //@}
  1250. /// \name i486
  1251. /// i486-generation processors.
  1252. //@{
  1253. CK_i486,
  1254. CK_WinChipC6,
  1255. CK_WinChip2,
  1256. CK_C3,
  1257. //@}
  1258. /// \name i586
  1259. /// i586-generation processors, P5 microarchitecture based.
  1260. //@{
  1261. CK_i586,
  1262. CK_Pentium,
  1263. CK_PentiumMMX,
  1264. //@}
  1265. /// \name i686
  1266. /// i686-generation processors, P6 / Pentium M microarchitecture based.
  1267. //@{
  1268. CK_i686,
  1269. CK_PentiumPro,
  1270. CK_Pentium2,
  1271. CK_Pentium3,
  1272. CK_Pentium3M,
  1273. CK_PentiumM,
  1274. CK_C3_2,
  1275. /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
  1276. /// Clang however has some logic to suport this.
  1277. // FIXME: Warn, deprecate, and potentially remove this.
  1278. CK_Yonah,
  1279. //@}
  1280. /// \name Netburst
  1281. /// Netburst microarchitecture based processors.
  1282. //@{
  1283. CK_Pentium4,
  1284. CK_Pentium4M,
  1285. CK_Prescott,
  1286. CK_Nocona,
  1287. //@}
  1288. /// \name Core
  1289. /// Core microarchitecture based processors.
  1290. //@{
  1291. CK_Core2,
  1292. /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
  1293. /// codename which GCC no longer accepts as an option to -march, but Clang
  1294. /// has some logic for recognizing it.
  1295. // FIXME: Warn, deprecate, and potentially remove this.
  1296. CK_Penryn,
  1297. //@}
  1298. /// \name Atom
  1299. /// Atom processors
  1300. //@{
  1301. CK_Atom,
  1302. //@}
  1303. /// \name Nehalem
  1304. /// Nehalem microarchitecture based processors.
  1305. //@{
  1306. CK_Corei7,
  1307. CK_Corei7AVX,
  1308. CK_CoreAVXi,
  1309. CK_CoreAVX2,
  1310. //@}
  1311. /// \name K6
  1312. /// K6 architecture processors.
  1313. //@{
  1314. CK_K6,
  1315. CK_K6_2,
  1316. CK_K6_3,
  1317. //@}
  1318. /// \name K7
  1319. /// K7 architecture processors.
  1320. //@{
  1321. CK_Athlon,
  1322. CK_AthlonThunderbird,
  1323. CK_Athlon4,
  1324. CK_AthlonXP,
  1325. CK_AthlonMP,
  1326. //@}
  1327. /// \name K8
  1328. /// K8 architecture processors.
  1329. //@{
  1330. CK_Athlon64,
  1331. CK_Athlon64SSE3,
  1332. CK_AthlonFX,
  1333. CK_K8,
  1334. CK_K8SSE3,
  1335. CK_Opteron,
  1336. CK_OpteronSSE3,
  1337. CK_AMDFAM10,
  1338. //@}
  1339. /// \name Bobcat
  1340. /// Bobcat architecture processors.
  1341. //@{
  1342. CK_BTVER1,
  1343. //@}
  1344. /// \name Bulldozer
  1345. /// Bulldozer architecture processors.
  1346. //@{
  1347. CK_BDVER1,
  1348. CK_BDVER2,
  1349. //@}
  1350. /// This specification is deprecated and will be removed in the future.
  1351. /// Users should prefer \see CK_K8.
  1352. // FIXME: Warn on this when the CPU is set to it.
  1353. CK_x86_64,
  1354. //@}
  1355. /// \name Geode
  1356. /// Geode processors.
  1357. //@{
  1358. CK_Geode
  1359. //@}
  1360. } CPU;
  1361. public:
  1362. X86TargetInfo(const std::string& triple)
  1363. : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
  1364. HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
  1365. HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasSSE4a(false),
  1366. HasFMA4(false), HasFMA(false), HasXOP(false), CPU(CK_Generic) {
  1367. BigEndian = false;
  1368. LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
  1369. }
  1370. virtual unsigned getFloatEvalMethod() const {
  1371. // X87 evaluates with 80 bits "long double" precision.
  1372. return SSELevel == NoSSE ? 2 : 0;
  1373. }
  1374. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  1375. unsigned &NumRecords) const {
  1376. Records = BuiltinInfo;
  1377. NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
  1378. }
  1379. virtual void getGCCRegNames(const char * const *&Names,
  1380. unsigned &NumNames) const {
  1381. Names = GCCRegNames;
  1382. NumNames = llvm::array_lengthof(GCCRegNames);
  1383. }
  1384. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  1385. unsigned &NumAliases) const {
  1386. Aliases = 0;
  1387. NumAliases = 0;
  1388. }
  1389. virtual void getGCCAddlRegNames(const AddlRegName *&Names,
  1390. unsigned &NumNames) const {
  1391. Names = AddlRegNames;
  1392. NumNames = llvm::array_lengthof(AddlRegNames);
  1393. }
  1394. virtual bool validateAsmConstraint(const char *&Name,
  1395. TargetInfo::ConstraintInfo &info) const;
  1396. virtual std::string convertConstraint(const char *&Constraint) const;
  1397. virtual const char *getClobbers() const {
  1398. return "~{dirflag},~{fpsr},~{flags}";
  1399. }
  1400. virtual void getTargetDefines(const LangOptions &Opts,
  1401. MacroBuilder &Builder) const;
  1402. virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
  1403. StringRef Name,
  1404. bool Enabled) const;
  1405. virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
  1406. virtual bool hasFeature(StringRef Feature) const;
  1407. virtual void HandleTargetFeatures(std::vector<std::string> &Features);
  1408. virtual const char* getABI() const {
  1409. if (PointerWidth == 64 && SSELevel >= AVX)
  1410. return "avx";
  1411. else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow)
  1412. return "no-mmx";
  1413. return "";
  1414. }
  1415. virtual bool setCPU(const std::string &Name) {
  1416. CPU = llvm::StringSwitch<CPUKind>(Name)
  1417. .Case("i386", CK_i386)
  1418. .Case("i486", CK_i486)
  1419. .Case("winchip-c6", CK_WinChipC6)
  1420. .Case("winchip2", CK_WinChip2)
  1421. .Case("c3", CK_C3)
  1422. .Case("i586", CK_i586)
  1423. .Case("pentium", CK_Pentium)
  1424. .Case("pentium-mmx", CK_PentiumMMX)
  1425. .Case("i686", CK_i686)
  1426. .Case("pentiumpro", CK_PentiumPro)
  1427. .Case("pentium2", CK_Pentium2)
  1428. .Case("pentium3", CK_Pentium3)
  1429. .Case("pentium3m", CK_Pentium3M)
  1430. .Case("pentium-m", CK_PentiumM)
  1431. .Case("c3-2", CK_C3_2)
  1432. .Case("yonah", CK_Yonah)
  1433. .Case("pentium4", CK_Pentium4)
  1434. .Case("pentium4m", CK_Pentium4M)
  1435. .Case("prescott", CK_Prescott)
  1436. .Case("nocona", CK_Nocona)
  1437. .Case("core2", CK_Core2)
  1438. .Case("penryn", CK_Penryn)
  1439. .Case("atom", CK_Atom)
  1440. .Case("corei7", CK_Corei7)
  1441. .Case("corei7-avx", CK_Corei7AVX)
  1442. .Case("core-avx-i", CK_CoreAVXi)
  1443. .Case("core-avx2", CK_CoreAVX2)
  1444. .Case("k6", CK_K6)
  1445. .Case("k6-2", CK_K6_2)
  1446. .Case("k6-3", CK_K6_3)
  1447. .Case("athlon", CK_Athlon)
  1448. .Case("athlon-tbird", CK_AthlonThunderbird)
  1449. .Case("athlon-4", CK_Athlon4)
  1450. .Case("athlon-xp", CK_AthlonXP)
  1451. .Case("athlon-mp", CK_AthlonMP)
  1452. .Case("athlon64", CK_Athlon64)
  1453. .Case("athlon64-sse3", CK_Athlon64SSE3)
  1454. .Case("athlon-fx", CK_AthlonFX)
  1455. .Case("k8", CK_K8)
  1456. .Case("k8-sse3", CK_K8SSE3)
  1457. .Case("opteron", CK_Opteron)
  1458. .Case("opteron-sse3", CK_OpteronSSE3)
  1459. .Case("amdfam10", CK_AMDFAM10)
  1460. .Case("btver1", CK_BTVER1)
  1461. .Case("bdver1", CK_BDVER1)
  1462. .Case("bdver2", CK_BDVER2)
  1463. .Case("x86-64", CK_x86_64)
  1464. .Case("geode", CK_Geode)
  1465. .Default(CK_Generic);
  1466. // Perform any per-CPU checks necessary to determine if this CPU is
  1467. // acceptable.
  1468. // FIXME: This results in terrible diagnostics. Clang just says the CPU is
  1469. // invalid without explaining *why*.
  1470. switch (CPU) {
  1471. case CK_Generic:
  1472. // No processor selected!
  1473. return false;
  1474. case CK_i386:
  1475. case CK_i486:
  1476. case CK_WinChipC6:
  1477. case CK_WinChip2:
  1478. case CK_C3:
  1479. case CK_i586:
  1480. case CK_Pentium:
  1481. case CK_PentiumMMX:
  1482. case CK_i686:
  1483. case CK_PentiumPro:
  1484. case CK_Pentium2:
  1485. case CK_Pentium3:
  1486. case CK_Pentium3M:
  1487. case CK_PentiumM:
  1488. case CK_Yonah:
  1489. case CK_C3_2:
  1490. case CK_Pentium4:
  1491. case CK_Pentium4M:
  1492. case CK_Prescott:
  1493. case CK_K6:
  1494. case CK_K6_2:
  1495. case CK_K6_3:
  1496. case CK_Athlon:
  1497. case CK_AthlonThunderbird:
  1498. case CK_Athlon4:
  1499. case CK_AthlonXP:
  1500. case CK_AthlonMP:
  1501. case CK_Geode:
  1502. // Only accept certain architectures when compiling in 32-bit mode.
  1503. if (PointerWidth != 32)
  1504. return false;
  1505. // Fallthrough
  1506. case CK_Nocona:
  1507. case CK_Core2:
  1508. case CK_Penryn:
  1509. case CK_Atom:
  1510. case CK_Corei7:
  1511. case CK_Corei7AVX:
  1512. case CK_CoreAVXi:
  1513. case CK_CoreAVX2:
  1514. case CK_Athlon64:
  1515. case CK_Athlon64SSE3:
  1516. case CK_AthlonFX:
  1517. case CK_K8:
  1518. case CK_K8SSE3:
  1519. case CK_Opteron:
  1520. case CK_OpteronSSE3:
  1521. case CK_AMDFAM10:
  1522. case CK_BTVER1:
  1523. case CK_BDVER1:
  1524. case CK_BDVER2:
  1525. case CK_x86_64:
  1526. return true;
  1527. }
  1528. llvm_unreachable("Unhandled CPU kind");
  1529. }
  1530. };
  1531. void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
  1532. // FIXME: This should not be here.
  1533. Features["3dnow"] = false;
  1534. Features["3dnowa"] = false;
  1535. Features["mmx"] = false;
  1536. Features["sse"] = false;
  1537. Features["sse2"] = false;
  1538. Features["sse3"] = false;
  1539. Features["ssse3"] = false;
  1540. Features["sse41"] = false;
  1541. Features["sse42"] = false;
  1542. Features["sse4a"] = false;
  1543. Features["aes"] = false;
  1544. Features["pclmul"] = false;
  1545. Features["avx"] = false;
  1546. Features["avx2"] = false;
  1547. Features["lzcnt"] = false;
  1548. Features["rdrand"] = false;
  1549. Features["bmi"] = false;
  1550. Features["bmi2"] = false;
  1551. Features["popcnt"] = false;
  1552. Features["fma4"] = false;
  1553. Features["fma"] = false;
  1554. Features["xop"] = false;
  1555. // FIXME: This *really* should not be here.
  1556. // X86_64 always has SSE2.
  1557. if (PointerWidth == 64)
  1558. Features["sse2"] = Features["sse"] = Features["mmx"] = true;
  1559. switch (CPU) {
  1560. case CK_Generic:
  1561. case CK_i386:
  1562. case CK_i486:
  1563. case CK_i586:
  1564. case CK_Pentium:
  1565. case CK_i686:
  1566. case CK_PentiumPro:
  1567. break;
  1568. case CK_PentiumMMX:
  1569. case CK_Pentium2:
  1570. setFeatureEnabled(Features, "mmx", true);
  1571. break;
  1572. case CK_Pentium3:
  1573. case CK_Pentium3M:
  1574. setFeatureEnabled(Features, "mmx", true);
  1575. setFeatureEnabled(Features, "sse", true);
  1576. break;
  1577. case CK_PentiumM:
  1578. case CK_Pentium4:
  1579. case CK_Pentium4M:
  1580. case CK_x86_64:
  1581. setFeatureEnabled(Features, "mmx", true);
  1582. setFeatureEnabled(Features, "sse2", true);
  1583. break;
  1584. case CK_Yonah:
  1585. case CK_Prescott:
  1586. case CK_Nocona:
  1587. setFeatureEnabled(Features, "mmx", true);
  1588. setFeatureEnabled(Features, "sse3", true);
  1589. break;
  1590. case CK_Core2:
  1591. setFeatureEnabled(Features, "mmx", true);
  1592. setFeatureEnabled(Features, "ssse3", true);
  1593. break;
  1594. case CK_Penryn:
  1595. setFeatureEnabled(Features, "mmx", true);
  1596. setFeatureEnabled(Features, "sse4.1", true);
  1597. break;
  1598. case CK_Atom:
  1599. setFeatureEnabled(Features, "mmx", true);
  1600. setFeatureEnabled(Features, "ssse3", true);
  1601. break;
  1602. case CK_Corei7:
  1603. setFeatureEnabled(Features, "mmx", true);
  1604. setFeatureEnabled(Features, "sse4", true);
  1605. break;
  1606. case CK_Corei7AVX:
  1607. setFeatureEnabled(Features, "mmx", true);
  1608. setFeatureEnabled(Features, "avx", true);
  1609. setFeatureEnabled(Features, "aes", true);
  1610. setFeatureEnabled(Features, "pclmul", true);
  1611. break;
  1612. case CK_CoreAVXi:
  1613. setFeatureEnabled(Features, "mmx", true);
  1614. setFeatureEnabled(Features, "avx", true);
  1615. setFeatureEnabled(Features, "aes", true);
  1616. setFeatureEnabled(Features, "pclmul", true);
  1617. setFeatureEnabled(Features, "rdrnd", true);
  1618. break;
  1619. case CK_CoreAVX2:
  1620. setFeatureEnabled(Features, "mmx", true);
  1621. setFeatureEnabled(Features, "avx2", true);
  1622. setFeatureEnabled(Features, "aes", true);
  1623. setFeatureEnabled(Features, "pclmul", true);
  1624. setFeatureEnabled(Features, "lzcnt", true);
  1625. setFeatureEnabled(Features, "rdrnd", true);
  1626. setFeatureEnabled(Features, "bmi", true);
  1627. setFeatureEnabled(Features, "bmi2", true);
  1628. setFeatureEnabled(Features, "fma", true);
  1629. break;
  1630. case CK_K6:
  1631. case CK_WinChipC6:
  1632. setFeatureEnabled(Features, "mmx", true);
  1633. break;
  1634. case CK_K6_2:
  1635. case CK_K6_3:
  1636. case CK_WinChip2:
  1637. case CK_C3:
  1638. setFeatureEnabled(Features, "3dnow", true);
  1639. break;
  1640. case CK_Athlon:
  1641. case CK_AthlonThunderbird:
  1642. case CK_Geode:
  1643. setFeatureEnabled(Features, "3dnowa", true);
  1644. break;
  1645. case CK_Athlon4:
  1646. case CK_AthlonXP:
  1647. case CK_AthlonMP:
  1648. setFeatureEnabled(Features, "sse", true);
  1649. setFeatureEnabled(Features, "3dnowa", true);
  1650. break;
  1651. case CK_K8:
  1652. case CK_Opteron:
  1653. case CK_Athlon64:
  1654. case CK_AthlonFX:
  1655. setFeatureEnabled(Features, "sse2", true);
  1656. setFeatureEnabled(Features, "3dnowa", true);
  1657. break;
  1658. case CK_K8SSE3:
  1659. case CK_OpteronSSE3:
  1660. case CK_Athlon64SSE3:
  1661. setFeatureEnabled(Features, "sse3", true);
  1662. setFeatureEnabled(Features, "3dnowa", true);
  1663. break;
  1664. case CK_AMDFAM10:
  1665. setFeatureEnabled(Features, "sse3", true);
  1666. setFeatureEnabled(Features, "sse4a", true);
  1667. setFeatureEnabled(Features, "3dnowa", true);
  1668. break;
  1669. case CK_BTVER1:
  1670. setFeatureEnabled(Features, "ssse3", true);
  1671. setFeatureEnabled(Features, "sse4a", true);
  1672. break;
  1673. case CK_BDVER1:
  1674. case CK_BDVER2:
  1675. setFeatureEnabled(Features, "avx", true);
  1676. setFeatureEnabled(Features, "xop", true);
  1677. setFeatureEnabled(Features, "aes", true);
  1678. setFeatureEnabled(Features, "pclmul", true);
  1679. break;
  1680. case CK_C3_2:
  1681. setFeatureEnabled(Features, "mmx", true);
  1682. setFeatureEnabled(Features, "sse", true);
  1683. break;
  1684. }
  1685. }
  1686. bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
  1687. StringRef Name,
  1688. bool Enabled) const {
  1689. // FIXME: This *really* should not be here. We need some way of translating
  1690. // options into llvm subtarget features.
  1691. if (!Features.count(Name) &&
  1692. (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
  1693. Name != "rdrnd"))
  1694. return false;
  1695. // FIXME: this should probably use a switch with fall through.
  1696. if (Enabled) {
  1697. if (Name == "mmx")
  1698. Features["mmx"] = true;
  1699. else if (Name == "sse")
  1700. Features["mmx"] = Features["sse"] = true;
  1701. else if (Name == "sse2")
  1702. Features["mmx"] = Features["sse"] = Features["sse2"] = true;
  1703. else if (Name == "sse3")
  1704. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1705. true;
  1706. else if (Name == "ssse3")
  1707. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1708. Features["ssse3"] = true;
  1709. else if (Name == "sse4" || Name == "sse4.2")
  1710. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1711. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1712. Features["popcnt"] = true;
  1713. else if (Name == "sse4.1")
  1714. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1715. Features["ssse3"] = Features["sse41"] = true;
  1716. else if (Name == "3dnow")
  1717. Features["mmx"] = Features["3dnow"] = true;
  1718. else if (Name == "3dnowa")
  1719. Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
  1720. else if (Name == "aes")
  1721. Features["sse"] = Features["sse2"] = Features["aes"] = true;
  1722. else if (Name == "pclmul")
  1723. Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
  1724. else if (Name == "avx")
  1725. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1726. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1727. Features["popcnt"] = Features["avx"] = true;
  1728. else if (Name == "avx2")
  1729. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1730. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1731. Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
  1732. else if (Name == "fma")
  1733. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1734. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1735. Features["popcnt"] = Features["avx"] = Features["fma"] = true;
  1736. else if (Name == "fma4")
  1737. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1738. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1739. Features["popcnt"] = Features["avx"] = Features["sse4a"] =
  1740. Features["fma4"] = true;
  1741. else if (Name == "xop")
  1742. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1743. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1744. Features["popcnt"] = Features["avx"] = Features["sse4a"] =
  1745. Features["fma4"] = Features["xop"] = true;
  1746. else if (Name == "sse4a")
  1747. Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
  1748. Features["sse4a"] = true;
  1749. else if (Name == "lzcnt")
  1750. Features["lzcnt"] = true;
  1751. else if (Name == "rdrnd")
  1752. Features["rdrand"] = true;
  1753. else if (Name == "bmi")
  1754. Features["bmi"] = true;
  1755. else if (Name == "bmi2")
  1756. Features["bmi2"] = true;
  1757. else if (Name == "popcnt")
  1758. Features["popcnt"] = true;
  1759. } else {
  1760. if (Name == "mmx")
  1761. Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
  1762. else if (Name == "sse")
  1763. Features["sse"] = Features["sse2"] = Features["sse3"] =
  1764. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1765. Features["sse4a"] = Features["avx"] = Features["avx2"] =
  1766. Features["fma"] = Features["fma4"] = Features["aes"] =
  1767. Features["pclmul"] = Features["xop"] = false;
  1768. else if (Name == "sse2")
  1769. Features["sse2"] = Features["sse3"] = Features["ssse3"] =
  1770. Features["sse41"] = Features["sse42"] = Features["sse4a"] =
  1771. Features["avx"] = Features["avx2"] = Features["fma"] =
  1772. Features["fma4"] = Features["aes"] = Features["pclmul"] =
  1773. Features["xop"] = false;
  1774. else if (Name == "sse3")
  1775. Features["sse3"] = Features["ssse3"] = Features["sse41"] =
  1776. Features["sse42"] = Features["sse4a"] = Features["avx"] =
  1777. Features["avx2"] = Features["fma"] = Features["fma4"] =
  1778. Features["xop"] = false;
  1779. else if (Name == "ssse3")
  1780. Features["ssse3"] = Features["sse41"] = Features["sse42"] =
  1781. Features["avx"] = Features["avx2"] = Features["fma"] = false;
  1782. else if (Name == "sse4" || Name == "sse4.1")
  1783. Features["sse41"] = Features["sse42"] = Features["avx"] =
  1784. Features["avx2"] = Features["fma"] = false;
  1785. else if (Name == "sse4.2")
  1786. Features["sse42"] = Features["avx"] = Features["avx2"] =
  1787. Features["fma"] = false;
  1788. else if (Name == "3dnow")
  1789. Features["3dnow"] = Features["3dnowa"] = false;
  1790. else if (Name == "3dnowa")
  1791. Features["3dnowa"] = false;
  1792. else if (Name == "aes")
  1793. Features["aes"] = false;
  1794. else if (Name == "pclmul")
  1795. Features["pclmul"] = false;
  1796. else if (Name == "avx")
  1797. Features["avx"] = Features["avx2"] = Features["fma"] =
  1798. Features["fma4"] = Features["xop"] = false;
  1799. else if (Name == "avx2")
  1800. Features["avx2"] = false;
  1801. else if (Name == "fma")
  1802. Features["fma"] = false;
  1803. else if (Name == "sse4a")
  1804. Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
  1805. else if (Name == "lzcnt")
  1806. Features["lzcnt"] = false;
  1807. else if (Name == "rdrnd")
  1808. Features["rdrand"] = false;
  1809. else if (Name == "bmi")
  1810. Features["bmi"] = false;
  1811. else if (Name == "bmi2")
  1812. Features["bmi2"] = false;
  1813. else if (Name == "popcnt")
  1814. Features["popcnt"] = false;
  1815. else if (Name == "fma4")
  1816. Features["fma4"] = Features["xop"] = false;
  1817. else if (Name == "xop")
  1818. Features["xop"] = false;
  1819. }
  1820. return true;
  1821. }
  1822. /// HandleTargetOptions - Perform initialization based on the user
  1823. /// configured set of features.
  1824. void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
  1825. // Remember the maximum enabled sselevel.
  1826. for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
  1827. // Ignore disabled features.
  1828. if (Features[i][0] == '-')
  1829. continue;
  1830. StringRef Feature = StringRef(Features[i]).substr(1);
  1831. if (Feature == "aes") {
  1832. HasAES = true;
  1833. continue;
  1834. }
  1835. if (Feature == "pclmul") {
  1836. HasPCLMUL = true;
  1837. continue;
  1838. }
  1839. if (Feature == "lzcnt") {
  1840. HasLZCNT = true;
  1841. continue;
  1842. }
  1843. if (Feature == "rdrand") {
  1844. HasRDRND = true;
  1845. continue;
  1846. }
  1847. if (Feature == "bmi") {
  1848. HasBMI = true;
  1849. continue;
  1850. }
  1851. if (Feature == "bmi2") {
  1852. HasBMI2 = true;
  1853. continue;
  1854. }
  1855. if (Feature == "popcnt") {
  1856. HasPOPCNT = true;
  1857. continue;
  1858. }
  1859. if (Feature == "sse4a") {
  1860. HasSSE4a = true;
  1861. continue;
  1862. }
  1863. if (Feature == "fma4") {
  1864. HasFMA4 = true;
  1865. continue;
  1866. }
  1867. if (Feature == "fma") {
  1868. HasFMA = true;
  1869. continue;
  1870. }
  1871. if (Feature == "xop") {
  1872. HasXOP = true;
  1873. continue;
  1874. }
  1875. assert(Features[i][0] == '+' && "Invalid target feature!");
  1876. X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
  1877. .Case("avx2", AVX2)
  1878. .Case("avx", AVX)
  1879. .Case("sse42", SSE42)
  1880. .Case("sse41", SSE41)
  1881. .Case("ssse3", SSSE3)
  1882. .Case("sse3", SSE3)
  1883. .Case("sse2", SSE2)
  1884. .Case("sse", SSE1)
  1885. .Default(NoSSE);
  1886. SSELevel = std::max(SSELevel, Level);
  1887. MMX3DNowEnum ThreeDNowLevel =
  1888. llvm::StringSwitch<MMX3DNowEnum>(Feature)
  1889. .Case("3dnowa", AMD3DNowAthlon)
  1890. .Case("3dnow", AMD3DNow)
  1891. .Case("mmx", MMX)
  1892. .Default(NoMMX3DNow);
  1893. MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
  1894. }
  1895. // Don't tell the backend if we're turning off mmx; it will end up disabling
  1896. // SSE, which we don't want.
  1897. std::vector<std::string>::iterator it;
  1898. it = std::find(Features.begin(), Features.end(), "-mmx");
  1899. if (it != Features.end())
  1900. Features.erase(it);
  1901. }
  1902. /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
  1903. /// definitions for this particular subtarget.
  1904. void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
  1905. MacroBuilder &Builder) const {
  1906. // Target identification.
  1907. if (PointerWidth == 64) {
  1908. if (getLongWidth() == 64) {
  1909. Builder.defineMacro("_LP64");
  1910. Builder.defineMacro("__LP64__");
  1911. }
  1912. Builder.defineMacro("__amd64__");
  1913. Builder.defineMacro("__amd64");
  1914. Builder.defineMacro("__x86_64");
  1915. Builder.defineMacro("__x86_64__");
  1916. } else {
  1917. DefineStd(Builder, "i386", Opts);
  1918. }
  1919. // Subtarget options.
  1920. // FIXME: We are hard-coding the tune parameters based on the CPU, but they
  1921. // truly should be based on -mtune options.
  1922. switch (CPU) {
  1923. case CK_Generic:
  1924. break;
  1925. case CK_i386:
  1926. // The rest are coming from the i386 define above.
  1927. Builder.defineMacro("__tune_i386__");
  1928. break;
  1929. case CK_i486:
  1930. case CK_WinChipC6:
  1931. case CK_WinChip2:
  1932. case CK_C3:
  1933. defineCPUMacros(Builder, "i486");
  1934. break;
  1935. case CK_PentiumMMX:
  1936. Builder.defineMacro("__pentium_mmx__");
  1937. Builder.defineMacro("__tune_pentium_mmx__");
  1938. // Fallthrough
  1939. case CK_i586:
  1940. case CK_Pentium:
  1941. defineCPUMacros(Builder, "i586");
  1942. defineCPUMacros(Builder, "pentium");
  1943. break;
  1944. case CK_Pentium3:
  1945. case CK_Pentium3M:
  1946. case CK_PentiumM:
  1947. Builder.defineMacro("__tune_pentium3__");
  1948. // Fallthrough
  1949. case CK_Pentium2:
  1950. case CK_C3_2:
  1951. Builder.defineMacro("__tune_pentium2__");
  1952. // Fallthrough
  1953. case CK_PentiumPro:
  1954. Builder.defineMacro("__tune_i686__");
  1955. Builder.defineMacro("__tune_pentiumpro__");
  1956. // Fallthrough
  1957. case CK_i686:
  1958. Builder.defineMacro("__i686");
  1959. Builder.defineMacro("__i686__");
  1960. // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
  1961. Builder.defineMacro("__pentiumpro");
  1962. Builder.defineMacro("__pentiumpro__");
  1963. break;
  1964. case CK_Pentium4:
  1965. case CK_Pentium4M:
  1966. defineCPUMacros(Builder, "pentium4");
  1967. break;
  1968. case CK_Yonah:
  1969. case CK_Prescott:
  1970. case CK_Nocona:
  1971. defineCPUMacros(Builder, "nocona");
  1972. break;
  1973. case CK_Core2:
  1974. case CK_Penryn:
  1975. defineCPUMacros(Builder, "core2");
  1976. break;
  1977. case CK_Atom:
  1978. defineCPUMacros(Builder, "atom");
  1979. break;
  1980. case CK_Corei7:
  1981. case CK_Corei7AVX:
  1982. case CK_CoreAVXi:
  1983. case CK_CoreAVX2:
  1984. defineCPUMacros(Builder, "corei7");
  1985. break;
  1986. case CK_K6_2:
  1987. Builder.defineMacro("__k6_2__");
  1988. Builder.defineMacro("__tune_k6_2__");
  1989. // Fallthrough
  1990. case CK_K6_3:
  1991. if (CPU != CK_K6_2) { // In case of fallthrough
  1992. // FIXME: GCC may be enabling these in cases where some other k6
  1993. // architecture is specified but -m3dnow is explicitly provided. The
  1994. // exact semantics need to be determined and emulated here.
  1995. Builder.defineMacro("__k6_3__");
  1996. Builder.defineMacro("__tune_k6_3__");
  1997. }
  1998. // Fallthrough
  1999. case CK_K6:
  2000. defineCPUMacros(Builder, "k6");
  2001. break;
  2002. case CK_Athlon:
  2003. case CK_AthlonThunderbird:
  2004. case CK_Athlon4:
  2005. case CK_AthlonXP:
  2006. case CK_AthlonMP:
  2007. defineCPUMacros(Builder, "athlon");
  2008. if (SSELevel != NoSSE) {
  2009. Builder.defineMacro("__athlon_sse__");
  2010. Builder.defineMacro("__tune_athlon_sse__");
  2011. }
  2012. break;
  2013. case CK_K8:
  2014. case CK_K8SSE3:
  2015. case CK_x86_64:
  2016. case CK_Opteron:
  2017. case CK_OpteronSSE3:
  2018. case CK_Athlon64:
  2019. case CK_Athlon64SSE3:
  2020. case CK_AthlonFX:
  2021. defineCPUMacros(Builder, "k8");
  2022. break;
  2023. case CK_AMDFAM10:
  2024. defineCPUMacros(Builder, "amdfam10");
  2025. break;
  2026. case CK_BTVER1:
  2027. defineCPUMacros(Builder, "btver1");
  2028. break;
  2029. case CK_BDVER1:
  2030. defineCPUMacros(Builder, "bdver1");
  2031. break;
  2032. case CK_BDVER2:
  2033. defineCPUMacros(Builder, "bdver2");
  2034. break;
  2035. case CK_Geode:
  2036. defineCPUMacros(Builder, "geode");
  2037. break;
  2038. }
  2039. // Target properties.
  2040. Builder.defineMacro("__LITTLE_ENDIAN__");
  2041. Builder.defineMacro("__REGISTER_PREFIX__", "");
  2042. // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
  2043. // functions in glibc header files that use FP Stack inline asm which the
  2044. // backend can't deal with (PR879).
  2045. Builder.defineMacro("__NO_MATH_INLINES");
  2046. if (HasAES)
  2047. Builder.defineMacro("__AES__");
  2048. if (HasPCLMUL)
  2049. Builder.defineMacro("__PCLMUL__");
  2050. if (HasLZCNT)
  2051. Builder.defineMacro("__LZCNT__");
  2052. if (HasRDRND)
  2053. Builder.defineMacro("__RDRND__");
  2054. if (HasBMI)
  2055. Builder.defineMacro("__BMI__");
  2056. if (HasBMI2)
  2057. Builder.defineMacro("__BMI2__");
  2058. if (HasPOPCNT)
  2059. Builder.defineMacro("__POPCNT__");
  2060. if (HasSSE4a)
  2061. Builder.defineMacro("__SSE4A__");
  2062. if (HasFMA4)
  2063. Builder.defineMacro("__FMA4__");
  2064. if (HasFMA)
  2065. Builder.defineMacro("__FMA__");
  2066. if (HasXOP)
  2067. Builder.defineMacro("__XOP__");
  2068. // Each case falls through to the previous one here.
  2069. switch (SSELevel) {
  2070. case AVX2:
  2071. Builder.defineMacro("__AVX2__");
  2072. case AVX:
  2073. Builder.defineMacro("__AVX__");
  2074. case SSE42:
  2075. Builder.defineMacro("__SSE4_2__");
  2076. case SSE41:
  2077. Builder.defineMacro("__SSE4_1__");
  2078. case SSSE3:
  2079. Builder.defineMacro("__SSSE3__");
  2080. case SSE3:
  2081. Builder.defineMacro("__SSE3__");
  2082. case SSE2:
  2083. Builder.defineMacro("__SSE2__");
  2084. Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
  2085. case SSE1:
  2086. Builder.defineMacro("__SSE__");
  2087. Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
  2088. case NoSSE:
  2089. break;
  2090. }
  2091. if (Opts.MicrosoftExt && PointerWidth == 32) {
  2092. switch (SSELevel) {
  2093. case AVX2:
  2094. case AVX:
  2095. case SSE42:
  2096. case SSE41:
  2097. case SSSE3:
  2098. case SSE3:
  2099. case SSE2:
  2100. Builder.defineMacro("_M_IX86_FP", Twine(2));
  2101. break;
  2102. case SSE1:
  2103. Builder.defineMacro("_M_IX86_FP", Twine(1));
  2104. break;
  2105. default:
  2106. Builder.defineMacro("_M_IX86_FP", Twine(0));
  2107. }
  2108. }
  2109. // Each case falls through to the previous one here.
  2110. switch (MMX3DNowLevel) {
  2111. case AMD3DNowAthlon:
  2112. Builder.defineMacro("__3dNOW_A__");
  2113. case AMD3DNow:
  2114. Builder.defineMacro("__3dNOW__");
  2115. case MMX:
  2116. Builder.defineMacro("__MMX__");
  2117. case NoMMX3DNow:
  2118. break;
  2119. }
  2120. }
  2121. bool X86TargetInfo::hasFeature(StringRef Feature) const {
  2122. return llvm::StringSwitch<bool>(Feature)
  2123. .Case("aes", HasAES)
  2124. .Case("avx", SSELevel >= AVX)
  2125. .Case("avx2", SSELevel >= AVX2)
  2126. .Case("bmi", HasBMI)
  2127. .Case("bmi2", HasBMI2)
  2128. .Case("fma", HasFMA)
  2129. .Case("fma4", HasFMA4)
  2130. .Case("lzcnt", HasLZCNT)
  2131. .Case("rdrnd", HasRDRND)
  2132. .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
  2133. .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
  2134. .Case("mmx", MMX3DNowLevel >= MMX)
  2135. .Case("pclmul", HasPCLMUL)
  2136. .Case("popcnt", HasPOPCNT)
  2137. .Case("sse", SSELevel >= SSE1)
  2138. .Case("sse2", SSELevel >= SSE2)
  2139. .Case("sse3", SSELevel >= SSE3)
  2140. .Case("ssse3", SSELevel >= SSSE3)
  2141. .Case("sse41", SSELevel >= SSE41)
  2142. .Case("sse42", SSELevel >= SSE42)
  2143. .Case("sse4a", HasSSE4a)
  2144. .Case("x86", true)
  2145. .Case("x86_32", PointerWidth == 32)
  2146. .Case("x86_64", PointerWidth == 64)
  2147. .Case("xop", HasXOP)
  2148. .Default(false);
  2149. }
  2150. bool
  2151. X86TargetInfo::validateAsmConstraint(const char *&Name,
  2152. TargetInfo::ConstraintInfo &Info) const {
  2153. switch (*Name) {
  2154. default: return false;
  2155. case 'Y': // first letter of a pair:
  2156. switch (*(Name+1)) {
  2157. default: return false;
  2158. case '0': // First SSE register.
  2159. case 't': // Any SSE register, when SSE2 is enabled.
  2160. case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
  2161. case 'm': // any MMX register, when inter-unit moves enabled.
  2162. break; // falls through to setAllowsRegister.
  2163. }
  2164. case 'a': // eax.
  2165. case 'b': // ebx.
  2166. case 'c': // ecx.
  2167. case 'd': // edx.
  2168. case 'S': // esi.
  2169. case 'D': // edi.
  2170. case 'A': // edx:eax.
  2171. case 'f': // any x87 floating point stack register.
  2172. case 't': // top of floating point stack.
  2173. case 'u': // second from top of floating point stack.
  2174. case 'q': // Any register accessible as [r]l: a, b, c, and d.
  2175. case 'y': // Any MMX register.
  2176. case 'x': // Any SSE register.
  2177. case 'Q': // Any register accessible as [r]h: a, b, c, and d.
  2178. case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
  2179. case 'l': // "Index" registers: any general register that can be used as an
  2180. // index in a base+index memory access.
  2181. Info.setAllowsRegister();
  2182. return true;
  2183. case 'C': // SSE floating point constant.
  2184. case 'G': // x87 floating point constant.
  2185. case 'e': // 32-bit signed integer constant for use with zero-extending
  2186. // x86_64 instructions.
  2187. case 'Z': // 32-bit unsigned integer constant for use with zero-extending
  2188. // x86_64 instructions.
  2189. return true;
  2190. }
  2191. }
  2192. std::string
  2193. X86TargetInfo::convertConstraint(const char *&Constraint) const {
  2194. switch (*Constraint) {
  2195. case 'a': return std::string("{ax}");
  2196. case 'b': return std::string("{bx}");
  2197. case 'c': return std::string("{cx}");
  2198. case 'd': return std::string("{dx}");
  2199. case 'S': return std::string("{si}");
  2200. case 'D': return std::string("{di}");
  2201. case 'p': // address
  2202. return std::string("im");
  2203. case 't': // top of floating point stack.
  2204. return std::string("{st}");
  2205. case 'u': // second from top of floating point stack.
  2206. return std::string("{st(1)}"); // second from top of floating point stack.
  2207. default:
  2208. return std::string(1, *Constraint);
  2209. }
  2210. }
  2211. } // end anonymous namespace
  2212. namespace {
  2213. // X86-32 generic target
  2214. class X86_32TargetInfo : public X86TargetInfo {
  2215. public:
  2216. X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
  2217. DoubleAlign = LongLongAlign = 32;
  2218. LongDoubleWidth = 96;
  2219. LongDoubleAlign = 32;
  2220. SuitableAlign = 128;
  2221. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2222. "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
  2223. "a0:0:64-f80:32:32-n8:16:32-S128";
  2224. SizeType = UnsignedInt;
  2225. PtrDiffType = SignedInt;
  2226. IntPtrType = SignedInt;
  2227. RegParmMax = 3;
  2228. // Use fpret for all types.
  2229. RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
  2230. (1 << TargetInfo::Double) |
  2231. (1 << TargetInfo::LongDouble));
  2232. // x86-32 has atomics up to 8 bytes
  2233. // FIXME: Check that we actually have cmpxchg8b before setting
  2234. // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
  2235. MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
  2236. }
  2237. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  2238. return TargetInfo::CharPtrBuiltinVaList;
  2239. }
  2240. int getEHDataRegisterNumber(unsigned RegNo) const {
  2241. if (RegNo == 0) return 0;
  2242. if (RegNo == 1) return 2;
  2243. return -1;
  2244. }
  2245. };
  2246. } // end anonymous namespace
  2247. namespace {
  2248. class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
  2249. public:
  2250. NetBSDI386TargetInfo(const std::string &triple) :
  2251. NetBSDTargetInfo<X86_32TargetInfo>(triple) {
  2252. }
  2253. virtual unsigned getFloatEvalMethod() const {
  2254. // NetBSD defaults to "double" rounding
  2255. return 1;
  2256. }
  2257. };
  2258. } // end anonymous namespace
  2259. namespace {
  2260. class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
  2261. public:
  2262. OpenBSDI386TargetInfo(const std::string& triple) :
  2263. OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
  2264. SizeType = UnsignedLong;
  2265. IntPtrType = SignedLong;
  2266. PtrDiffType = SignedLong;
  2267. }
  2268. };
  2269. } // end anonymous namespace
  2270. namespace {
  2271. class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
  2272. public:
  2273. BitrigI386TargetInfo(const std::string& triple) :
  2274. BitrigTargetInfo<X86_32TargetInfo>(triple) {
  2275. SizeType = UnsignedLong;
  2276. IntPtrType = SignedLong;
  2277. PtrDiffType = SignedLong;
  2278. }
  2279. };
  2280. } // end anonymous namespace
  2281. namespace {
  2282. class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
  2283. public:
  2284. DarwinI386TargetInfo(const std::string& triple) :
  2285. DarwinTargetInfo<X86_32TargetInfo>(triple) {
  2286. LongDoubleWidth = 128;
  2287. LongDoubleAlign = 128;
  2288. SuitableAlign = 128;
  2289. MaxVectorAlign = 256;
  2290. SizeType = UnsignedLong;
  2291. IntPtrType = SignedLong;
  2292. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2293. "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
  2294. "a0:0:64-f80:128:128-n8:16:32-S128";
  2295. HasAlignMac68kSupport = true;
  2296. }
  2297. };
  2298. } // end anonymous namespace
  2299. namespace {
  2300. // x86-32 Windows target
  2301. class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
  2302. public:
  2303. WindowsX86_32TargetInfo(const std::string& triple)
  2304. : WindowsTargetInfo<X86_32TargetInfo>(triple) {
  2305. TLSSupported = false;
  2306. WCharType = UnsignedShort;
  2307. DoubleAlign = LongLongAlign = 64;
  2308. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2309. "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
  2310. "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
  2311. }
  2312. virtual void getTargetDefines(const LangOptions &Opts,
  2313. MacroBuilder &Builder) const {
  2314. WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
  2315. }
  2316. };
  2317. } // end anonymous namespace
  2318. namespace {
  2319. // x86-32 Windows Visual Studio target
  2320. class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
  2321. public:
  2322. VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
  2323. : WindowsX86_32TargetInfo(triple) {
  2324. LongDoubleWidth = LongDoubleAlign = 64;
  2325. LongDoubleFormat = &llvm::APFloat::IEEEdouble;
  2326. }
  2327. virtual void getTargetDefines(const LangOptions &Opts,
  2328. MacroBuilder &Builder) const {
  2329. WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
  2330. WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
  2331. // The value of the following reflects processor type.
  2332. // 300=386, 400=486, 500=Pentium, 600=Blend (default)
  2333. // We lost the original triple, so we use the default.
  2334. Builder.defineMacro("_M_IX86", "600");
  2335. }
  2336. };
  2337. } // end anonymous namespace
  2338. namespace {
  2339. // x86-32 MinGW target
  2340. class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
  2341. public:
  2342. MinGWX86_32TargetInfo(const std::string& triple)
  2343. : WindowsX86_32TargetInfo(triple) {
  2344. }
  2345. virtual void getTargetDefines(const LangOptions &Opts,
  2346. MacroBuilder &Builder) const {
  2347. WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
  2348. DefineStd(Builder, "WIN32", Opts);
  2349. DefineStd(Builder, "WINNT", Opts);
  2350. Builder.defineMacro("_X86_");
  2351. Builder.defineMacro("__MSVCRT__");
  2352. Builder.defineMacro("__MINGW32__");
  2353. // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
  2354. // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
  2355. if (Opts.MicrosoftExt)
  2356. // Provide "as-is" __declspec.
  2357. Builder.defineMacro("__declspec", "__declspec");
  2358. else
  2359. // Provide alias of __attribute__ like mingw32-gcc.
  2360. Builder.defineMacro("__declspec(a)", "__attribute__((a))");
  2361. }
  2362. };
  2363. } // end anonymous namespace
  2364. namespace {
  2365. // x86-32 Cygwin target
  2366. class CygwinX86_32TargetInfo : public X86_32TargetInfo {
  2367. public:
  2368. CygwinX86_32TargetInfo(const std::string& triple)
  2369. : X86_32TargetInfo(triple) {
  2370. TLSSupported = false;
  2371. WCharType = UnsignedShort;
  2372. DoubleAlign = LongLongAlign = 64;
  2373. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2374. "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
  2375. "a0:0:64-f80:32:32-n8:16:32-S32";
  2376. }
  2377. virtual void getTargetDefines(const LangOptions &Opts,
  2378. MacroBuilder &Builder) const {
  2379. X86_32TargetInfo::getTargetDefines(Opts, Builder);
  2380. Builder.defineMacro("__CYGWIN__");
  2381. Builder.defineMacro("__CYGWIN32__");
  2382. DefineStd(Builder, "unix", Opts);
  2383. if (Opts.CPlusPlus)
  2384. Builder.defineMacro("_GNU_SOURCE");
  2385. }
  2386. };
  2387. } // end anonymous namespace
  2388. namespace {
  2389. // x86-32 Haiku target
  2390. class HaikuX86_32TargetInfo : public X86_32TargetInfo {
  2391. public:
  2392. HaikuX86_32TargetInfo(const std::string& triple)
  2393. : X86_32TargetInfo(triple) {
  2394. SizeType = UnsignedLong;
  2395. IntPtrType = SignedLong;
  2396. PtrDiffType = SignedLong;
  2397. this->UserLabelPrefix = "";
  2398. }
  2399. virtual void getTargetDefines(const LangOptions &Opts,
  2400. MacroBuilder &Builder) const {
  2401. X86_32TargetInfo::getTargetDefines(Opts, Builder);
  2402. Builder.defineMacro("__INTEL__");
  2403. Builder.defineMacro("__HAIKU__");
  2404. }
  2405. };
  2406. } // end anonymous namespace
  2407. // RTEMS Target
  2408. template<typename Target>
  2409. class RTEMSTargetInfo : public OSTargetInfo<Target> {
  2410. protected:
  2411. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  2412. MacroBuilder &Builder) const {
  2413. // RTEMS defines; list based off of gcc output
  2414. Builder.defineMacro("__rtems__");
  2415. Builder.defineMacro("__ELF__");
  2416. }
  2417. public:
  2418. RTEMSTargetInfo(const std::string &triple)
  2419. : OSTargetInfo<Target>(triple) {
  2420. this->UserLabelPrefix = "";
  2421. llvm::Triple Triple(triple);
  2422. switch (Triple.getArch()) {
  2423. default:
  2424. case llvm::Triple::x86:
  2425. // this->MCountName = ".mcount";
  2426. break;
  2427. case llvm::Triple::mips:
  2428. case llvm::Triple::mipsel:
  2429. case llvm::Triple::ppc:
  2430. case llvm::Triple::ppc64:
  2431. // this->MCountName = "_mcount";
  2432. break;
  2433. case llvm::Triple::arm:
  2434. // this->MCountName = "__mcount";
  2435. break;
  2436. }
  2437. }
  2438. };
  2439. namespace {
  2440. // x86-32 RTEMS target
  2441. class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
  2442. public:
  2443. RTEMSX86_32TargetInfo(const std::string& triple)
  2444. : X86_32TargetInfo(triple) {
  2445. SizeType = UnsignedLong;
  2446. IntPtrType = SignedLong;
  2447. PtrDiffType = SignedLong;
  2448. this->UserLabelPrefix = "";
  2449. }
  2450. virtual void getTargetDefines(const LangOptions &Opts,
  2451. MacroBuilder &Builder) const {
  2452. X86_32TargetInfo::getTargetDefines(Opts, Builder);
  2453. Builder.defineMacro("__INTEL__");
  2454. Builder.defineMacro("__rtems__");
  2455. }
  2456. };
  2457. } // end anonymous namespace
  2458. namespace {
  2459. // x86-64 generic target
  2460. class X86_64TargetInfo : public X86TargetInfo {
  2461. public:
  2462. X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
  2463. LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
  2464. LongDoubleWidth = 128;
  2465. LongDoubleAlign = 128;
  2466. LargeArrayMinWidth = 128;
  2467. LargeArrayAlign = 128;
  2468. SuitableAlign = 128;
  2469. IntMaxType = SignedLong;
  2470. UIntMaxType = UnsignedLong;
  2471. Int64Type = SignedLong;
  2472. RegParmMax = 6;
  2473. DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2474. "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
  2475. "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
  2476. // Use fpret only for long double.
  2477. RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
  2478. // Use fp2ret for _Complex long double.
  2479. ComplexLongDoubleUsesFP2Ret = true;
  2480. // x86-64 has atomics up to 16 bytes.
  2481. // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
  2482. // on CPUs with cmpxchg16b
  2483. MaxAtomicPromoteWidth = 128;
  2484. MaxAtomicInlineWidth = 64;
  2485. }
  2486. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  2487. return TargetInfo::X86_64ABIBuiltinVaList;
  2488. }
  2489. int getEHDataRegisterNumber(unsigned RegNo) const {
  2490. if (RegNo == 0) return 0;
  2491. if (RegNo == 1) return 1;
  2492. return -1;
  2493. }
  2494. };
  2495. } // end anonymous namespace
  2496. namespace {
  2497. // x86-64 Windows target
  2498. class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
  2499. public:
  2500. WindowsX86_64TargetInfo(const std::string& triple)
  2501. : WindowsTargetInfo<X86_64TargetInfo>(triple) {
  2502. TLSSupported = false;
  2503. WCharType = UnsignedShort;
  2504. LongWidth = LongAlign = 32;
  2505. DoubleAlign = LongLongAlign = 64;
  2506. IntMaxType = SignedLongLong;
  2507. UIntMaxType = UnsignedLongLong;
  2508. Int64Type = SignedLongLong;
  2509. SizeType = UnsignedLongLong;
  2510. PtrDiffType = SignedLongLong;
  2511. IntPtrType = SignedLongLong;
  2512. this->UserLabelPrefix = "";
  2513. }
  2514. virtual void getTargetDefines(const LangOptions &Opts,
  2515. MacroBuilder &Builder) const {
  2516. WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
  2517. Builder.defineMacro("_WIN64");
  2518. }
  2519. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  2520. return TargetInfo::CharPtrBuiltinVaList;
  2521. }
  2522. };
  2523. } // end anonymous namespace
  2524. namespace {
  2525. // x86-64 Windows Visual Studio target
  2526. class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
  2527. public:
  2528. VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
  2529. : WindowsX86_64TargetInfo(triple) {
  2530. LongDoubleWidth = LongDoubleAlign = 64;
  2531. LongDoubleFormat = &llvm::APFloat::IEEEdouble;
  2532. }
  2533. virtual void getTargetDefines(const LangOptions &Opts,
  2534. MacroBuilder &Builder) const {
  2535. WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
  2536. WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
  2537. Builder.defineMacro("_M_X64");
  2538. Builder.defineMacro("_M_AMD64");
  2539. }
  2540. };
  2541. } // end anonymous namespace
  2542. namespace {
  2543. // x86-64 MinGW target
  2544. class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
  2545. public:
  2546. MinGWX86_64TargetInfo(const std::string& triple)
  2547. : WindowsX86_64TargetInfo(triple) {
  2548. }
  2549. virtual void getTargetDefines(const LangOptions &Opts,
  2550. MacroBuilder &Builder) const {
  2551. WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
  2552. DefineStd(Builder, "WIN64", Opts);
  2553. Builder.defineMacro("__MSVCRT__");
  2554. Builder.defineMacro("__MINGW32__");
  2555. Builder.defineMacro("__MINGW64__");
  2556. // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
  2557. // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
  2558. if (Opts.MicrosoftExt)
  2559. // Provide "as-is" __declspec.
  2560. Builder.defineMacro("__declspec", "__declspec");
  2561. else
  2562. // Provide alias of __attribute__ like mingw32-gcc.
  2563. Builder.defineMacro("__declspec(a)", "__attribute__((a))");
  2564. }
  2565. };
  2566. } // end anonymous namespace
  2567. namespace {
  2568. class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
  2569. public:
  2570. DarwinX86_64TargetInfo(const std::string& triple)
  2571. : DarwinTargetInfo<X86_64TargetInfo>(triple) {
  2572. Int64Type = SignedLongLong;
  2573. MaxVectorAlign = 256;
  2574. }
  2575. };
  2576. } // end anonymous namespace
  2577. namespace {
  2578. class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
  2579. public:
  2580. OpenBSDX86_64TargetInfo(const std::string& triple)
  2581. : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
  2582. IntMaxType = SignedLongLong;
  2583. UIntMaxType = UnsignedLongLong;
  2584. Int64Type = SignedLongLong;
  2585. }
  2586. };
  2587. } // end anonymous namespace
  2588. namespace {
  2589. class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
  2590. public:
  2591. BitrigX86_64TargetInfo(const std::string& triple)
  2592. : BitrigTargetInfo<X86_64TargetInfo>(triple) {
  2593. IntMaxType = SignedLongLong;
  2594. UIntMaxType = UnsignedLongLong;
  2595. Int64Type = SignedLongLong;
  2596. }
  2597. };
  2598. } // end anonymous namespace
  2599. namespace {
  2600. class ARMTargetInfo : public TargetInfo {
  2601. // Possible FPU choices.
  2602. enum FPUMode {
  2603. NoFPU,
  2604. VFP2FPU,
  2605. VFP3FPU,
  2606. NeonFPU
  2607. };
  2608. static bool FPUModeIsVFP(FPUMode Mode) {
  2609. return Mode >= VFP2FPU && Mode <= NeonFPU;
  2610. }
  2611. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  2612. static const char * const GCCRegNames[];
  2613. std::string ABI, CPU;
  2614. unsigned FPU : 3;
  2615. unsigned IsThumb : 1;
  2616. // Initialized via features.
  2617. unsigned SoftFloat : 1;
  2618. unsigned SoftFloatABI : 1;
  2619. static const Builtin::Info BuiltinInfo[];
  2620. public:
  2621. ARMTargetInfo(const std::string &TripleStr)
  2622. : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s")
  2623. {
  2624. BigEndian = false;
  2625. SizeType = UnsignedInt;
  2626. PtrDiffType = SignedInt;
  2627. // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
  2628. WCharType = UnsignedInt;
  2629. // {} in inline assembly are neon specifiers, not assembly variant
  2630. // specifiers.
  2631. NoAsmVariants = true;
  2632. // FIXME: Should we just treat this as a feature?
  2633. IsThumb = getTriple().getArchName().startswith("thumb");
  2634. if (IsThumb) {
  2635. // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
  2636. // so set preferred for small types to 32.
  2637. DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
  2638. "i64:64:64-f32:32:32-f64:64:64-"
  2639. "v64:64:64-v128:64:128-a0:0:32-n32-S64");
  2640. } else {
  2641. DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2642. "i64:64:64-f32:32:32-f64:64:64-"
  2643. "v64:64:64-v128:64:128-a0:0:64-n32-S64");
  2644. }
  2645. // ARM targets default to using the ARM C++ ABI.
  2646. CXXABI = CXXABI_ARM;
  2647. // ARM has atomics up to 8 bytes
  2648. // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
  2649. MaxAtomicPromoteWidth = 64;
  2650. // Do force alignment of members that follow zero length bitfields. If
  2651. // the alignment of the zero-length bitfield is greater than the member
  2652. // that follows it, `bar', `bar' will be aligned as the type of the
  2653. // zero length bitfield.
  2654. UseZeroLengthBitfieldAlignment = true;
  2655. }
  2656. virtual const char *getABI() const { return ABI.c_str(); }
  2657. virtual bool setABI(const std::string &Name) {
  2658. ABI = Name;
  2659. // The defaults (above) are for AAPCS, check if we need to change them.
  2660. //
  2661. // FIXME: We need support for -meabi... we could just mangle it into the
  2662. // name.
  2663. if (Name == "apcs-gnu") {
  2664. DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
  2665. SizeType = UnsignedLong;
  2666. // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
  2667. WCharType = SignedInt;
  2668. // Do not respect the alignment of bit-field types when laying out
  2669. // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
  2670. UseBitFieldTypeAlignment = false;
  2671. /// gcc forces the alignment to 4 bytes, regardless of the type of the
  2672. /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
  2673. /// gcc.
  2674. ZeroLengthBitfieldBoundary = 32;
  2675. if (IsThumb) {
  2676. // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
  2677. // so set preferred for small types to 32.
  2678. DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
  2679. "i64:32:64-f32:32:32-f64:32:64-"
  2680. "v64:32:64-v128:32:128-a0:0:32-n32-S32");
  2681. } else {
  2682. DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  2683. "i64:32:64-f32:32:32-f64:32:64-"
  2684. "v64:32:64-v128:32:128-a0:0:32-n32-S32");
  2685. }
  2686. // FIXME: Override "preferred align" for double and long long.
  2687. } else if (Name == "aapcs") {
  2688. // FIXME: Enumerated types are variable width in straight AAPCS.
  2689. } else if (Name == "aapcs-linux") {
  2690. ;
  2691. } else
  2692. return false;
  2693. return true;
  2694. }
  2695. void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
  2696. if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
  2697. Features["vfp2"] = true;
  2698. else if (CPU == "cortex-a8" || CPU == "cortex-a9")
  2699. Features["neon"] = true;
  2700. }
  2701. virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
  2702. StringRef Name,
  2703. bool Enabled) const {
  2704. if (Name == "soft-float" || Name == "soft-float-abi" ||
  2705. Name == "vfp2" || Name == "vfp3" || Name == "neon" || Name == "d16" ||
  2706. Name == "neonfp") {
  2707. Features[Name] = Enabled;
  2708. } else
  2709. return false;
  2710. return true;
  2711. }
  2712. virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
  2713. FPU = NoFPU;
  2714. SoftFloat = SoftFloatABI = false;
  2715. for (unsigned i = 0, e = Features.size(); i != e; ++i) {
  2716. if (Features[i] == "+soft-float")
  2717. SoftFloat = true;
  2718. else if (Features[i] == "+soft-float-abi")
  2719. SoftFloatABI = true;
  2720. else if (Features[i] == "+vfp2")
  2721. FPU = VFP2FPU;
  2722. else if (Features[i] == "+vfp3")
  2723. FPU = VFP3FPU;
  2724. else if (Features[i] == "+neon")
  2725. FPU = NeonFPU;
  2726. }
  2727. // Remove front-end specific options which the backend handles differently.
  2728. std::vector<std::string>::iterator it;
  2729. it = std::find(Features.begin(), Features.end(), "+soft-float");
  2730. if (it != Features.end())
  2731. Features.erase(it);
  2732. it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
  2733. if (it != Features.end())
  2734. Features.erase(it);
  2735. }
  2736. virtual bool hasFeature(StringRef Feature) const {
  2737. return llvm::StringSwitch<bool>(Feature)
  2738. .Case("arm", true)
  2739. .Case("softfloat", SoftFloat)
  2740. .Case("thumb", IsThumb)
  2741. .Case("neon", FPU == NeonFPU && !SoftFloat &&
  2742. StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
  2743. .Default(false);
  2744. }
  2745. static const char *getCPUDefineSuffix(StringRef Name) {
  2746. return llvm::StringSwitch<const char*>(Name)
  2747. .Cases("arm8", "arm810", "4")
  2748. .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
  2749. .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
  2750. .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
  2751. .Case("ep9312", "4T")
  2752. .Cases("arm10tdmi", "arm1020t", "5T")
  2753. .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
  2754. .Case("arm926ej-s", "5TEJ")
  2755. .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
  2756. .Cases("xscale", "iwmmxt", "5TE")
  2757. .Case("arm1136j-s", "6J")
  2758. .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
  2759. .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
  2760. .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
  2761. .Cases("cortex-a8", "cortex-a9", "7A")
  2762. .Case("cortex-m3", "7M")
  2763. .Case("cortex-m4", "7M")
  2764. .Case("cortex-m0", "6M")
  2765. .Default(0);
  2766. }
  2767. virtual bool setCPU(const std::string &Name) {
  2768. if (!getCPUDefineSuffix(Name))
  2769. return false;
  2770. CPU = Name;
  2771. return true;
  2772. }
  2773. virtual void getTargetDefines(const LangOptions &Opts,
  2774. MacroBuilder &Builder) const {
  2775. // Target identification.
  2776. Builder.defineMacro("__arm");
  2777. Builder.defineMacro("__arm__");
  2778. // Target properties.
  2779. Builder.defineMacro("__ARMEL__");
  2780. Builder.defineMacro("__LITTLE_ENDIAN__");
  2781. Builder.defineMacro("__REGISTER_PREFIX__", "");
  2782. StringRef CPUArch = getCPUDefineSuffix(CPU);
  2783. Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
  2784. // Subtarget options.
  2785. // FIXME: It's more complicated than this and we don't really support
  2786. // interworking.
  2787. if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
  2788. Builder.defineMacro("__THUMB_INTERWORK__");
  2789. if (ABI == "aapcs" || ABI == "aapcs-linux")
  2790. Builder.defineMacro("__ARM_EABI__");
  2791. if (SoftFloat)
  2792. Builder.defineMacro("__SOFTFP__");
  2793. if (CPU == "xscale")
  2794. Builder.defineMacro("__XSCALE__");
  2795. bool IsARMv7 = CPUArch.startswith("7");
  2796. if (IsThumb) {
  2797. Builder.defineMacro("__THUMBEL__");
  2798. Builder.defineMacro("__thumb__");
  2799. if (CPUArch == "6T2" || IsARMv7)
  2800. Builder.defineMacro("__thumb2__");
  2801. }
  2802. // Note, this is always on in gcc, even though it doesn't make sense.
  2803. Builder.defineMacro("__APCS_32__");
  2804. if (FPUModeIsVFP((FPUMode) FPU))
  2805. Builder.defineMacro("__VFP_FP__");
  2806. // This only gets set when Neon instructions are actually available, unlike
  2807. // the VFP define, hence the soft float and arch check. This is subtly
  2808. // different from gcc, we follow the intent which was that it should be set
  2809. // when Neon instructions are actually available.
  2810. if (FPU == NeonFPU && !SoftFloat && IsARMv7)
  2811. Builder.defineMacro("__ARM_NEON__");
  2812. }
  2813. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  2814. unsigned &NumRecords) const {
  2815. Records = BuiltinInfo;
  2816. NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
  2817. }
  2818. virtual bool isCLZForZeroUndef() const { return false; }
  2819. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  2820. return TargetInfo::VoidPtrBuiltinVaList;
  2821. }
  2822. virtual void getGCCRegNames(const char * const *&Names,
  2823. unsigned &NumNames) const;
  2824. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  2825. unsigned &NumAliases) const;
  2826. virtual bool validateAsmConstraint(const char *&Name,
  2827. TargetInfo::ConstraintInfo &Info) const {
  2828. // FIXME: Check if this is complete
  2829. switch (*Name) {
  2830. default:
  2831. case 'l': // r0-r7
  2832. case 'h': // r8-r15
  2833. case 'w': // VFP Floating point register single precision
  2834. case 'P': // VFP Floating point register double precision
  2835. Info.setAllowsRegister();
  2836. return true;
  2837. case 'Q': // A memory address that is a single base register.
  2838. Info.setAllowsMemory();
  2839. return true;
  2840. case 'U': // a memory reference...
  2841. switch (Name[1]) {
  2842. case 'q': // ...ARMV4 ldrsb
  2843. case 'v': // ...VFP load/store (reg+constant offset)
  2844. case 'y': // ...iWMMXt load/store
  2845. case 't': // address valid for load/store opaque types wider
  2846. // than 128-bits
  2847. case 'n': // valid address for Neon doubleword vector load/store
  2848. case 'm': // valid address for Neon element and structure load/store
  2849. case 's': // valid address for non-offset loads/stores of quad-word
  2850. // values in four ARM registers
  2851. Info.setAllowsMemory();
  2852. Name++;
  2853. return true;
  2854. }
  2855. }
  2856. return false;
  2857. }
  2858. virtual std::string convertConstraint(const char *&Constraint) const {
  2859. std::string R;
  2860. switch (*Constraint) {
  2861. case 'U': // Two-character constraint; add "^" hint for later parsing.
  2862. R = std::string("^") + std::string(Constraint, 2);
  2863. Constraint++;
  2864. break;
  2865. case 'p': // 'p' should be translated to 'r' by default.
  2866. R = std::string("r");
  2867. break;
  2868. default:
  2869. return std::string(1, *Constraint);
  2870. }
  2871. return R;
  2872. }
  2873. virtual const char *getClobbers() const {
  2874. // FIXME: Is this really right?
  2875. return "";
  2876. }
  2877. };
  2878. const char * const ARMTargetInfo::GCCRegNames[] = {
  2879. // Integer registers
  2880. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  2881. "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
  2882. // Float registers
  2883. "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
  2884. "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
  2885. "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
  2886. "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
  2887. // Double registers
  2888. "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
  2889. "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
  2890. "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
  2891. "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
  2892. // Quad registers
  2893. "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
  2894. "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
  2895. };
  2896. void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
  2897. unsigned &NumNames) const {
  2898. Names = GCCRegNames;
  2899. NumNames = llvm::array_lengthof(GCCRegNames);
  2900. }
  2901. const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
  2902. { { "a1" }, "r0" },
  2903. { { "a2" }, "r1" },
  2904. { { "a3" }, "r2" },
  2905. { { "a4" }, "r3" },
  2906. { { "v1" }, "r4" },
  2907. { { "v2" }, "r5" },
  2908. { { "v3" }, "r6" },
  2909. { { "v4" }, "r7" },
  2910. { { "v5" }, "r8" },
  2911. { { "v6", "rfp" }, "r9" },
  2912. { { "sl" }, "r10" },
  2913. { { "fp" }, "r11" },
  2914. { { "ip" }, "r12" },
  2915. { { "r13" }, "sp" },
  2916. { { "r14" }, "lr" },
  2917. { { "r15" }, "pc" },
  2918. // The S, D and Q registers overlap, but aren't really aliases; we
  2919. // don't want to substitute one of these for a different-sized one.
  2920. };
  2921. void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  2922. unsigned &NumAliases) const {
  2923. Aliases = GCCRegAliases;
  2924. NumAliases = llvm::array_lengthof(GCCRegAliases);
  2925. }
  2926. const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
  2927. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  2928. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  2929. ALL_LANGUAGES },
  2930. #include "clang/Basic/BuiltinsARM.def"
  2931. };
  2932. } // end anonymous namespace.
  2933. namespace {
  2934. class DarwinARMTargetInfo :
  2935. public DarwinTargetInfo<ARMTargetInfo> {
  2936. protected:
  2937. virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  2938. MacroBuilder &Builder) const {
  2939. getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
  2940. }
  2941. public:
  2942. DarwinARMTargetInfo(const std::string& triple)
  2943. : DarwinTargetInfo<ARMTargetInfo>(triple) {
  2944. HasAlignMac68kSupport = true;
  2945. // iOS always has 64-bit atomic instructions.
  2946. // FIXME: This should be based off of the target features in ARMTargetInfo.
  2947. MaxAtomicInlineWidth = 64;
  2948. }
  2949. };
  2950. } // end anonymous namespace.
  2951. namespace {
  2952. // Hexagon abstract base class
  2953. class HexagonTargetInfo : public TargetInfo {
  2954. static const Builtin::Info BuiltinInfo[];
  2955. static const char * const GCCRegNames[];
  2956. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  2957. std::string CPU;
  2958. public:
  2959. HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
  2960. BigEndian = false;
  2961. DescriptionString = ("e-p:32:32:32-"
  2962. "i64:64:64-i32:32:32-i16:16:16-i1:32:32"
  2963. "f64:64:64-f32:32:32-a0:0-n32");
  2964. // {} in inline assembly are packet specifiers, not assembly variant
  2965. // specifiers.
  2966. NoAsmVariants = true;
  2967. }
  2968. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  2969. unsigned &NumRecords) const {
  2970. Records = BuiltinInfo;
  2971. NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
  2972. }
  2973. virtual bool validateAsmConstraint(const char *&Name,
  2974. TargetInfo::ConstraintInfo &Info) const {
  2975. return true;
  2976. }
  2977. virtual void getTargetDefines(const LangOptions &Opts,
  2978. MacroBuilder &Builder) const;
  2979. virtual bool hasFeature(StringRef Feature) const {
  2980. return Feature == "hexagon";
  2981. }
  2982. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  2983. return TargetInfo::CharPtrBuiltinVaList;
  2984. }
  2985. virtual void getGCCRegNames(const char * const *&Names,
  2986. unsigned &NumNames) const;
  2987. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  2988. unsigned &NumAliases) const;
  2989. virtual const char *getClobbers() const {
  2990. return "";
  2991. }
  2992. static const char *getHexagonCPUSuffix(StringRef Name) {
  2993. return llvm::StringSwitch<const char*>(Name)
  2994. .Case("hexagonv2", "2")
  2995. .Case("hexagonv3", "3")
  2996. .Case("hexagonv4", "4")
  2997. .Case("hexagonv5", "5")
  2998. .Default(0);
  2999. }
  3000. virtual bool setCPU(const std::string &Name) {
  3001. if (!getHexagonCPUSuffix(Name))
  3002. return false;
  3003. CPU = Name;
  3004. return true;
  3005. }
  3006. };
  3007. void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
  3008. MacroBuilder &Builder) const {
  3009. Builder.defineMacro("qdsp6");
  3010. Builder.defineMacro("__qdsp6", "1");
  3011. Builder.defineMacro("__qdsp6__", "1");
  3012. Builder.defineMacro("hexagon");
  3013. Builder.defineMacro("__hexagon", "1");
  3014. Builder.defineMacro("__hexagon__", "1");
  3015. if(CPU == "hexagonv1") {
  3016. Builder.defineMacro("__HEXAGON_V1__");
  3017. Builder.defineMacro("__HEXAGON_ARCH__", "1");
  3018. if(Opts.HexagonQdsp6Compat) {
  3019. Builder.defineMacro("__QDSP6_V1__");
  3020. Builder.defineMacro("__QDSP6_ARCH__", "1");
  3021. }
  3022. }
  3023. else if(CPU == "hexagonv2") {
  3024. Builder.defineMacro("__HEXAGON_V2__");
  3025. Builder.defineMacro("__HEXAGON_ARCH__", "2");
  3026. if(Opts.HexagonQdsp6Compat) {
  3027. Builder.defineMacro("__QDSP6_V2__");
  3028. Builder.defineMacro("__QDSP6_ARCH__", "2");
  3029. }
  3030. }
  3031. else if(CPU == "hexagonv3") {
  3032. Builder.defineMacro("__HEXAGON_V3__");
  3033. Builder.defineMacro("__HEXAGON_ARCH__", "3");
  3034. if(Opts.HexagonQdsp6Compat) {
  3035. Builder.defineMacro("__QDSP6_V3__");
  3036. Builder.defineMacro("__QDSP6_ARCH__", "3");
  3037. }
  3038. }
  3039. else if(CPU == "hexagonv4") {
  3040. Builder.defineMacro("__HEXAGON_V4__");
  3041. Builder.defineMacro("__HEXAGON_ARCH__", "4");
  3042. if(Opts.HexagonQdsp6Compat) {
  3043. Builder.defineMacro("__QDSP6_V4__");
  3044. Builder.defineMacro("__QDSP6_ARCH__", "4");
  3045. }
  3046. }
  3047. else if(CPU == "hexagonv5") {
  3048. Builder.defineMacro("__HEXAGON_V5__");
  3049. Builder.defineMacro("__HEXAGON_ARCH__", "5");
  3050. if(Opts.HexagonQdsp6Compat) {
  3051. Builder.defineMacro("__QDSP6_V5__");
  3052. Builder.defineMacro("__QDSP6_ARCH__", "5");
  3053. }
  3054. }
  3055. }
  3056. const char * const HexagonTargetInfo::GCCRegNames[] = {
  3057. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  3058. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  3059. "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  3060. "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
  3061. "p0", "p1", "p2", "p3",
  3062. "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
  3063. };
  3064. void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
  3065. unsigned &NumNames) const {
  3066. Names = GCCRegNames;
  3067. NumNames = llvm::array_lengthof(GCCRegNames);
  3068. }
  3069. const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
  3070. { { "sp" }, "r29" },
  3071. { { "fp" }, "r30" },
  3072. { { "lr" }, "r31" },
  3073. };
  3074. void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  3075. unsigned &NumAliases) const {
  3076. Aliases = GCCRegAliases;
  3077. NumAliases = llvm::array_lengthof(GCCRegAliases);
  3078. }
  3079. const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
  3080. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  3081. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  3082. ALL_LANGUAGES },
  3083. #include "clang/Basic/BuiltinsHexagon.def"
  3084. };
  3085. }
  3086. namespace {
  3087. class SparcV8TargetInfo : public TargetInfo {
  3088. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  3089. static const char * const GCCRegNames[];
  3090. bool SoftFloat;
  3091. public:
  3092. SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
  3093. // FIXME: Support Sparc quad-precision long double?
  3094. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
  3095. "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
  3096. }
  3097. virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
  3098. StringRef Name,
  3099. bool Enabled) const {
  3100. if (Name == "soft-float")
  3101. Features[Name] = Enabled;
  3102. else
  3103. return false;
  3104. return true;
  3105. }
  3106. virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
  3107. SoftFloat = false;
  3108. for (unsigned i = 0, e = Features.size(); i != e; ++i)
  3109. if (Features[i] == "+soft-float")
  3110. SoftFloat = true;
  3111. }
  3112. virtual void getTargetDefines(const LangOptions &Opts,
  3113. MacroBuilder &Builder) const {
  3114. DefineStd(Builder, "sparc", Opts);
  3115. Builder.defineMacro("__sparcv8");
  3116. Builder.defineMacro("__REGISTER_PREFIX__", "");
  3117. if (SoftFloat)
  3118. Builder.defineMacro("SOFT_FLOAT", "1");
  3119. }
  3120. virtual bool hasFeature(StringRef Feature) const {
  3121. return llvm::StringSwitch<bool>(Feature)
  3122. .Case("softfloat", SoftFloat)
  3123. .Case("sparc", true)
  3124. .Default(false);
  3125. }
  3126. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  3127. unsigned &NumRecords) const {
  3128. // FIXME: Implement!
  3129. }
  3130. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  3131. return TargetInfo::VoidPtrBuiltinVaList;
  3132. }
  3133. virtual void getGCCRegNames(const char * const *&Names,
  3134. unsigned &NumNames) const;
  3135. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3136. unsigned &NumAliases) const;
  3137. virtual bool validateAsmConstraint(const char *&Name,
  3138. TargetInfo::ConstraintInfo &info) const {
  3139. // FIXME: Implement!
  3140. return false;
  3141. }
  3142. virtual const char *getClobbers() const {
  3143. // FIXME: Implement!
  3144. return "";
  3145. }
  3146. };
  3147. const char * const SparcV8TargetInfo::GCCRegNames[] = {
  3148. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  3149. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
  3150. "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
  3151. "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
  3152. };
  3153. void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
  3154. unsigned &NumNames) const {
  3155. Names = GCCRegNames;
  3156. NumNames = llvm::array_lengthof(GCCRegNames);
  3157. }
  3158. const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
  3159. { { "g0" }, "r0" },
  3160. { { "g1" }, "r1" },
  3161. { { "g2" }, "r2" },
  3162. { { "g3" }, "r3" },
  3163. { { "g4" }, "r4" },
  3164. { { "g5" }, "r5" },
  3165. { { "g6" }, "r6" },
  3166. { { "g7" }, "r7" },
  3167. { { "o0" }, "r8" },
  3168. { { "o1" }, "r9" },
  3169. { { "o2" }, "r10" },
  3170. { { "o3" }, "r11" },
  3171. { { "o4" }, "r12" },
  3172. { { "o5" }, "r13" },
  3173. { { "o6", "sp" }, "r14" },
  3174. { { "o7" }, "r15" },
  3175. { { "l0" }, "r16" },
  3176. { { "l1" }, "r17" },
  3177. { { "l2" }, "r18" },
  3178. { { "l3" }, "r19" },
  3179. { { "l4" }, "r20" },
  3180. { { "l5" }, "r21" },
  3181. { { "l6" }, "r22" },
  3182. { { "l7" }, "r23" },
  3183. { { "i0" }, "r24" },
  3184. { { "i1" }, "r25" },
  3185. { { "i2" }, "r26" },
  3186. { { "i3" }, "r27" },
  3187. { { "i4" }, "r28" },
  3188. { { "i5" }, "r29" },
  3189. { { "i6", "fp" }, "r30" },
  3190. { { "i7" }, "r31" },
  3191. };
  3192. void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  3193. unsigned &NumAliases) const {
  3194. Aliases = GCCRegAliases;
  3195. NumAliases = llvm::array_lengthof(GCCRegAliases);
  3196. }
  3197. } // end anonymous namespace.
  3198. namespace {
  3199. class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
  3200. public:
  3201. AuroraUXSparcV8TargetInfo(const std::string& triple) :
  3202. AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
  3203. SizeType = UnsignedInt;
  3204. PtrDiffType = SignedInt;
  3205. }
  3206. };
  3207. class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
  3208. public:
  3209. SolarisSparcV8TargetInfo(const std::string& triple) :
  3210. SolarisTargetInfo<SparcV8TargetInfo>(triple) {
  3211. SizeType = UnsignedInt;
  3212. PtrDiffType = SignedInt;
  3213. }
  3214. };
  3215. } // end anonymous namespace.
  3216. namespace {
  3217. class MSP430TargetInfo : public TargetInfo {
  3218. static const char * const GCCRegNames[];
  3219. public:
  3220. MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
  3221. BigEndian = false;
  3222. TLSSupported = false;
  3223. IntWidth = 16; IntAlign = 16;
  3224. LongWidth = 32; LongLongWidth = 64;
  3225. LongAlign = LongLongAlign = 16;
  3226. PointerWidth = 16; PointerAlign = 16;
  3227. SuitableAlign = 16;
  3228. SizeType = UnsignedInt;
  3229. IntMaxType = SignedLong;
  3230. UIntMaxType = UnsignedLong;
  3231. IntPtrType = SignedShort;
  3232. PtrDiffType = SignedInt;
  3233. SigAtomicType = SignedLong;
  3234. DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
  3235. }
  3236. virtual void getTargetDefines(const LangOptions &Opts,
  3237. MacroBuilder &Builder) const {
  3238. Builder.defineMacro("MSP430");
  3239. Builder.defineMacro("__MSP430__");
  3240. // FIXME: defines for different 'flavours' of MCU
  3241. }
  3242. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  3243. unsigned &NumRecords) const {
  3244. // FIXME: Implement.
  3245. Records = 0;
  3246. NumRecords = 0;
  3247. }
  3248. virtual bool hasFeature(StringRef Feature) const {
  3249. return Feature == "msp430";
  3250. }
  3251. virtual void getGCCRegNames(const char * const *&Names,
  3252. unsigned &NumNames) const;
  3253. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3254. unsigned &NumAliases) const {
  3255. // No aliases.
  3256. Aliases = 0;
  3257. NumAliases = 0;
  3258. }
  3259. virtual bool validateAsmConstraint(const char *&Name,
  3260. TargetInfo::ConstraintInfo &info) const {
  3261. // No target constraints for now.
  3262. return false;
  3263. }
  3264. virtual const char *getClobbers() const {
  3265. // FIXME: Is this really right?
  3266. return "";
  3267. }
  3268. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  3269. // FIXME: implement
  3270. return TargetInfo::CharPtrBuiltinVaList;
  3271. }
  3272. };
  3273. const char * const MSP430TargetInfo::GCCRegNames[] = {
  3274. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
  3275. "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
  3276. };
  3277. void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
  3278. unsigned &NumNames) const {
  3279. Names = GCCRegNames;
  3280. NumNames = llvm::array_lengthof(GCCRegNames);
  3281. }
  3282. }
  3283. namespace {
  3284. // LLVM and Clang cannot be used directly to output native binaries for
  3285. // target, but is used to compile C code to llvm bitcode with correct
  3286. // type and alignment information.
  3287. //
  3288. // TCE uses the llvm bitcode as input and uses it for generating customized
  3289. // target processor and program binary. TCE co-design environment is
  3290. // publicly available in http://tce.cs.tut.fi
  3291. static const unsigned TCEOpenCLAddrSpaceMap[] = {
  3292. 3, // opencl_global
  3293. 4, // opencl_local
  3294. 5, // opencl_constant
  3295. 0, // cuda_device
  3296. 0, // cuda_constant
  3297. 0 // cuda_shared
  3298. };
  3299. class TCETargetInfo : public TargetInfo{
  3300. public:
  3301. TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
  3302. TLSSupported = false;
  3303. IntWidth = 32;
  3304. LongWidth = LongLongWidth = 32;
  3305. PointerWidth = 32;
  3306. IntAlign = 32;
  3307. LongAlign = LongLongAlign = 32;
  3308. PointerAlign = 32;
  3309. SuitableAlign = 32;
  3310. SizeType = UnsignedInt;
  3311. IntMaxType = SignedLong;
  3312. UIntMaxType = UnsignedLong;
  3313. IntPtrType = SignedInt;
  3314. PtrDiffType = SignedInt;
  3315. FloatWidth = 32;
  3316. FloatAlign = 32;
  3317. DoubleWidth = 32;
  3318. DoubleAlign = 32;
  3319. LongDoubleWidth = 32;
  3320. LongDoubleAlign = 32;
  3321. FloatFormat = &llvm::APFloat::IEEEsingle;
  3322. DoubleFormat = &llvm::APFloat::IEEEsingle;
  3323. LongDoubleFormat = &llvm::APFloat::IEEEsingle;
  3324. DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
  3325. "i16:16:32-i32:32:32-i64:32:32-"
  3326. "f32:32:32-f64:32:32-v64:32:32-"
  3327. "v128:32:32-a0:0:32-n32";
  3328. AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
  3329. }
  3330. virtual void getTargetDefines(const LangOptions &Opts,
  3331. MacroBuilder &Builder) const {
  3332. DefineStd(Builder, "tce", Opts);
  3333. Builder.defineMacro("__TCE__");
  3334. Builder.defineMacro("__TCE_V1__");
  3335. }
  3336. virtual bool hasFeature(StringRef Feature) const {
  3337. return Feature == "tce";
  3338. }
  3339. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  3340. unsigned &NumRecords) const {}
  3341. virtual const char *getClobbers() const {
  3342. return "";
  3343. }
  3344. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  3345. return TargetInfo::VoidPtrBuiltinVaList;
  3346. }
  3347. virtual void getGCCRegNames(const char * const *&Names,
  3348. unsigned &NumNames) const {}
  3349. virtual bool validateAsmConstraint(const char *&Name,
  3350. TargetInfo::ConstraintInfo &info) const {
  3351. return true;
  3352. }
  3353. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3354. unsigned &NumAliases) const {}
  3355. };
  3356. }
  3357. namespace {
  3358. class MipsTargetInfoBase : public TargetInfo {
  3359. static const Builtin::Info BuiltinInfo[];
  3360. std::string CPU;
  3361. bool IsMips16;
  3362. enum MipsFloatABI {
  3363. HardFloat, SingleFloat, SoftFloat
  3364. } FloatABI;
  3365. enum DspRevEnum {
  3366. NoDSP, DSP1, DSP2
  3367. } DspRev;
  3368. protected:
  3369. std::string ABI;
  3370. public:
  3371. MipsTargetInfoBase(const std::string& triple,
  3372. const std::string& ABIStr,
  3373. const std::string& CPUStr)
  3374. : TargetInfo(triple),
  3375. CPU(CPUStr),
  3376. IsMips16(false),
  3377. FloatABI(HardFloat),
  3378. DspRev(NoDSP),
  3379. ABI(ABIStr)
  3380. {}
  3381. virtual const char *getABI() const { return ABI.c_str(); }
  3382. virtual bool setABI(const std::string &Name) = 0;
  3383. virtual bool setCPU(const std::string &Name) {
  3384. CPU = Name;
  3385. return true;
  3386. }
  3387. void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
  3388. Features[ABI] = true;
  3389. Features[CPU] = true;
  3390. }
  3391. virtual void getArchDefines(const LangOptions &Opts,
  3392. MacroBuilder &Builder) const {
  3393. switch (FloatABI) {
  3394. case HardFloat:
  3395. Builder.defineMacro("__mips_hard_float", Twine(1));
  3396. break;
  3397. case SingleFloat:
  3398. Builder.defineMacro("__mips_hard_float", Twine(1));
  3399. Builder.defineMacro("__mips_single_float", Twine(1));
  3400. break;
  3401. case SoftFloat:
  3402. Builder.defineMacro("__mips_soft_float", Twine(1));
  3403. break;
  3404. }
  3405. if (IsMips16)
  3406. Builder.defineMacro("__mips16", Twine(1));
  3407. switch (DspRev) {
  3408. default:
  3409. break;
  3410. case DSP1:
  3411. Builder.defineMacro("__mips_dsp_rev", Twine(1));
  3412. Builder.defineMacro("__mips_dsp", Twine(1));
  3413. break;
  3414. case DSP2:
  3415. Builder.defineMacro("__mips_dsp_rev", Twine(2));
  3416. Builder.defineMacro("__mips_dspr2", Twine(1));
  3417. Builder.defineMacro("__mips_dsp", Twine(1));
  3418. break;
  3419. }
  3420. Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
  3421. Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
  3422. Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
  3423. }
  3424. virtual void getTargetDefines(const LangOptions &Opts,
  3425. MacroBuilder &Builder) const = 0;
  3426. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  3427. unsigned &NumRecords) const {
  3428. Records = BuiltinInfo;
  3429. NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
  3430. }
  3431. virtual bool hasFeature(StringRef Feature) const {
  3432. return Feature == "mips";
  3433. }
  3434. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  3435. return TargetInfo::VoidPtrBuiltinVaList;
  3436. }
  3437. virtual void getGCCRegNames(const char * const *&Names,
  3438. unsigned &NumNames) const {
  3439. static const char * const GCCRegNames[] = {
  3440. // CPU register names
  3441. // Must match second column of GCCRegAliases
  3442. "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
  3443. "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
  3444. "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
  3445. "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
  3446. // Floating point register names
  3447. "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
  3448. "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
  3449. "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
  3450. "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
  3451. // Hi/lo and condition register names
  3452. "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
  3453. "$fcc5","$fcc6","$fcc7"
  3454. };
  3455. Names = GCCRegNames;
  3456. NumNames = llvm::array_lengthof(GCCRegNames);
  3457. }
  3458. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3459. unsigned &NumAliases) const = 0;
  3460. virtual bool validateAsmConstraint(const char *&Name,
  3461. TargetInfo::ConstraintInfo &Info) const {
  3462. switch (*Name) {
  3463. default:
  3464. return false;
  3465. case 'r': // CPU registers.
  3466. case 'd': // Equivalent to "r" unless generating MIPS16 code.
  3467. case 'y': // Equivalent to "r", backwards compatibility only.
  3468. case 'f': // floating-point registers.
  3469. case 'c': // $25 for indirect jumps
  3470. case 'l': // lo register
  3471. case 'x': // hilo register pair
  3472. Info.setAllowsRegister();
  3473. return true;
  3474. }
  3475. }
  3476. virtual const char *getClobbers() const {
  3477. // FIXME: Implement!
  3478. return "";
  3479. }
  3480. virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
  3481. StringRef Name,
  3482. bool Enabled) const {
  3483. if (Name == "soft-float" || Name == "single-float" ||
  3484. Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
  3485. Name == "mips32" || Name == "mips32r2" ||
  3486. Name == "mips64" || Name == "mips64r2" ||
  3487. Name == "mips16" || Name == "dsp" || Name == "dspr2") {
  3488. Features[Name] = Enabled;
  3489. return true;
  3490. }
  3491. return false;
  3492. }
  3493. virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
  3494. IsMips16 = false;
  3495. FloatABI = HardFloat;
  3496. DspRev = NoDSP;
  3497. for (std::vector<std::string>::iterator it = Features.begin(),
  3498. ie = Features.end(); it != ie; ++it) {
  3499. if (*it == "+single-float")
  3500. FloatABI = SingleFloat;
  3501. else if (*it == "+soft-float")
  3502. FloatABI = SoftFloat;
  3503. else if (*it == "+mips16")
  3504. IsMips16 = true;
  3505. else if (*it == "+dsp")
  3506. DspRev = std::max(DspRev, DSP1);
  3507. else if (*it == "+dspr2")
  3508. DspRev = std::max(DspRev, DSP2);
  3509. }
  3510. // Remove front-end specific option.
  3511. std::vector<std::string>::iterator it =
  3512. std::find(Features.begin(), Features.end(), "+soft-float");
  3513. if (it != Features.end())
  3514. Features.erase(it);
  3515. }
  3516. };
  3517. const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
  3518. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
  3519. #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
  3520. ALL_LANGUAGES },
  3521. #include "clang/Basic/BuiltinsMips.def"
  3522. };
  3523. class Mips32TargetInfoBase : public MipsTargetInfoBase {
  3524. public:
  3525. Mips32TargetInfoBase(const std::string& triple) :
  3526. MipsTargetInfoBase(triple, "o32", "mips32") {
  3527. SizeType = UnsignedInt;
  3528. PtrDiffType = SignedInt;
  3529. }
  3530. virtual bool setABI(const std::string &Name) {
  3531. if ((Name == "o32") || (Name == "eabi")) {
  3532. ABI = Name;
  3533. return true;
  3534. } else
  3535. return false;
  3536. }
  3537. virtual void getArchDefines(const LangOptions &Opts,
  3538. MacroBuilder &Builder) const {
  3539. MipsTargetInfoBase::getArchDefines(Opts, Builder);
  3540. if (ABI == "o32") {
  3541. Builder.defineMacro("__mips_o32");
  3542. Builder.defineMacro("_ABIO32", "1");
  3543. Builder.defineMacro("_MIPS_SIM", "_ABIO32");
  3544. }
  3545. else if (ABI == "eabi")
  3546. Builder.defineMacro("__mips_eabi");
  3547. else
  3548. llvm_unreachable("Invalid ABI for Mips32.");
  3549. }
  3550. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3551. unsigned &NumAliases) const {
  3552. static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
  3553. { { "at" }, "$1" },
  3554. { { "v0" }, "$2" },
  3555. { { "v1" }, "$3" },
  3556. { { "a0" }, "$4" },
  3557. { { "a1" }, "$5" },
  3558. { { "a2" }, "$6" },
  3559. { { "a3" }, "$7" },
  3560. { { "t0" }, "$8" },
  3561. { { "t1" }, "$9" },
  3562. { { "t2" }, "$10" },
  3563. { { "t3" }, "$11" },
  3564. { { "t4" }, "$12" },
  3565. { { "t5" }, "$13" },
  3566. { { "t6" }, "$14" },
  3567. { { "t7" }, "$15" },
  3568. { { "s0" }, "$16" },
  3569. { { "s1" }, "$17" },
  3570. { { "s2" }, "$18" },
  3571. { { "s3" }, "$19" },
  3572. { { "s4" }, "$20" },
  3573. { { "s5" }, "$21" },
  3574. { { "s6" }, "$22" },
  3575. { { "s7" }, "$23" },
  3576. { { "t8" }, "$24" },
  3577. { { "t9" }, "$25" },
  3578. { { "k0" }, "$26" },
  3579. { { "k1" }, "$27" },
  3580. { { "gp" }, "$28" },
  3581. { { "sp","$sp" }, "$29" },
  3582. { { "fp","$fp" }, "$30" },
  3583. { { "ra" }, "$31" }
  3584. };
  3585. Aliases = GCCRegAliases;
  3586. NumAliases = llvm::array_lengthof(GCCRegAliases);
  3587. }
  3588. };
  3589. class Mips32EBTargetInfo : public Mips32TargetInfoBase {
  3590. public:
  3591. Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
  3592. DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3593. "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
  3594. }
  3595. virtual void getTargetDefines(const LangOptions &Opts,
  3596. MacroBuilder &Builder) const {
  3597. DefineStd(Builder, "mips", Opts);
  3598. Builder.defineMacro("_mips");
  3599. DefineStd(Builder, "MIPSEB", Opts);
  3600. Builder.defineMacro("_MIPSEB");
  3601. Builder.defineMacro("__REGISTER_PREFIX__", "");
  3602. getArchDefines(Opts, Builder);
  3603. }
  3604. };
  3605. class Mips32ELTargetInfo : public Mips32TargetInfoBase {
  3606. public:
  3607. Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
  3608. BigEndian = false;
  3609. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3610. "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
  3611. }
  3612. virtual void getTargetDefines(const LangOptions &Opts,
  3613. MacroBuilder &Builder) const {
  3614. DefineStd(Builder, "mips", Opts);
  3615. Builder.defineMacro("_mips");
  3616. DefineStd(Builder, "MIPSEL", Opts);
  3617. Builder.defineMacro("_MIPSEL");
  3618. Builder.defineMacro("__REGISTER_PREFIX__", "");
  3619. getArchDefines(Opts, Builder);
  3620. }
  3621. };
  3622. class Mips64TargetInfoBase : public MipsTargetInfoBase {
  3623. virtual void SetDescriptionString(const std::string &Name) = 0;
  3624. public:
  3625. Mips64TargetInfoBase(const std::string& triple) :
  3626. MipsTargetInfoBase(triple, "n64", "mips64") {
  3627. LongWidth = LongAlign = 64;
  3628. PointerWidth = PointerAlign = 64;
  3629. LongDoubleWidth = LongDoubleAlign = 128;
  3630. LongDoubleFormat = &llvm::APFloat::IEEEquad;
  3631. SuitableAlign = 128;
  3632. }
  3633. virtual bool setABI(const std::string &Name) {
  3634. SetDescriptionString(Name);
  3635. if (Name != "n32" && Name != "n64")
  3636. return false;
  3637. ABI = Name;
  3638. if (Name == "n32") {
  3639. LongWidth = LongAlign = 32;
  3640. PointerWidth = PointerAlign = 32;
  3641. }
  3642. return true;
  3643. }
  3644. virtual void getArchDefines(const LangOptions &Opts,
  3645. MacroBuilder &Builder) const {
  3646. MipsTargetInfoBase::getArchDefines(Opts, Builder);
  3647. if (ABI == "n32") {
  3648. Builder.defineMacro("__mips_n32");
  3649. Builder.defineMacro("_ABIN32", "2");
  3650. Builder.defineMacro("_MIPS_SIM", "_ABIN32");
  3651. }
  3652. else if (ABI == "n64") {
  3653. Builder.defineMacro("__mips_n64");
  3654. Builder.defineMacro("_ABI64", "3");
  3655. Builder.defineMacro("_MIPS_SIM", "_ABI64");
  3656. }
  3657. else
  3658. llvm_unreachable("Invalid ABI for Mips64.");
  3659. }
  3660. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3661. unsigned &NumAliases) const {
  3662. static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
  3663. { { "at" }, "$1" },
  3664. { { "v0" }, "$2" },
  3665. { { "v1" }, "$3" },
  3666. { { "a0" }, "$4" },
  3667. { { "a1" }, "$5" },
  3668. { { "a2" }, "$6" },
  3669. { { "a3" }, "$7" },
  3670. { { "a4" }, "$8" },
  3671. { { "a5" }, "$9" },
  3672. { { "a6" }, "$10" },
  3673. { { "a7" }, "$11" },
  3674. { { "t0" }, "$12" },
  3675. { { "t1" }, "$13" },
  3676. { { "t2" }, "$14" },
  3677. { { "t3" }, "$15" },
  3678. { { "s0" }, "$16" },
  3679. { { "s1" }, "$17" },
  3680. { { "s2" }, "$18" },
  3681. { { "s3" }, "$19" },
  3682. { { "s4" }, "$20" },
  3683. { { "s5" }, "$21" },
  3684. { { "s6" }, "$22" },
  3685. { { "s7" }, "$23" },
  3686. { { "t8" }, "$24" },
  3687. { { "t9" }, "$25" },
  3688. { { "k0" }, "$26" },
  3689. { { "k1" }, "$27" },
  3690. { { "gp" }, "$28" },
  3691. { { "sp","$sp" }, "$29" },
  3692. { { "fp","$fp" }, "$30" },
  3693. { { "ra" }, "$31" }
  3694. };
  3695. Aliases = GCCRegAliases;
  3696. NumAliases = llvm::array_lengthof(GCCRegAliases);
  3697. }
  3698. };
  3699. class Mips64EBTargetInfo : public Mips64TargetInfoBase {
  3700. virtual void SetDescriptionString(const std::string &Name) {
  3701. // Change DescriptionString only if ABI is n32.
  3702. if (Name == "n32")
  3703. DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3704. "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
  3705. "v64:64:64-n32";
  3706. }
  3707. public:
  3708. Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
  3709. // Default ABI is n64.
  3710. DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3711. "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
  3712. "v64:64:64-n32";
  3713. }
  3714. virtual void getTargetDefines(const LangOptions &Opts,
  3715. MacroBuilder &Builder) const {
  3716. DefineStd(Builder, "mips", Opts);
  3717. Builder.defineMacro("_mips");
  3718. DefineStd(Builder, "MIPSEB", Opts);
  3719. Builder.defineMacro("_MIPSEB");
  3720. Builder.defineMacro("__REGISTER_PREFIX__", "");
  3721. getArchDefines(Opts, Builder);
  3722. }
  3723. };
  3724. class Mips64ELTargetInfo : public Mips64TargetInfoBase {
  3725. virtual void SetDescriptionString(const std::string &Name) {
  3726. // Change DescriptionString only if ABI is n32.
  3727. if (Name == "n32")
  3728. DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3729. "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
  3730. "-v64:64:64-n32";
  3731. }
  3732. public:
  3733. Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
  3734. // Default ABI is n64.
  3735. BigEndian = false;
  3736. DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
  3737. "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
  3738. "v64:64:64-n32";
  3739. }
  3740. virtual void getTargetDefines(const LangOptions &Opts,
  3741. MacroBuilder &Builder) const {
  3742. DefineStd(Builder, "mips", Opts);
  3743. Builder.defineMacro("_mips");
  3744. DefineStd(Builder, "MIPSEL", Opts);
  3745. Builder.defineMacro("_MIPSEL");
  3746. Builder.defineMacro("__REGISTER_PREFIX__", "");
  3747. getArchDefines(Opts, Builder);
  3748. }
  3749. };
  3750. } // end anonymous namespace.
  3751. namespace {
  3752. class PNaClTargetInfo : public TargetInfo {
  3753. public:
  3754. PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
  3755. BigEndian = false;
  3756. this->UserLabelPrefix = "";
  3757. this->LongAlign = 32;
  3758. this->LongWidth = 32;
  3759. this->PointerAlign = 32;
  3760. this->PointerWidth = 32;
  3761. this->IntMaxType = TargetInfo::SignedLongLong;
  3762. this->UIntMaxType = TargetInfo::UnsignedLongLong;
  3763. this->Int64Type = TargetInfo::SignedLongLong;
  3764. this->DoubleAlign = 64;
  3765. this->LongDoubleWidth = 64;
  3766. this->LongDoubleAlign = 64;
  3767. this->SizeType = TargetInfo::UnsignedInt;
  3768. this->PtrDiffType = TargetInfo::SignedInt;
  3769. this->IntPtrType = TargetInfo::SignedInt;
  3770. this->RegParmMax = 2;
  3771. DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
  3772. "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
  3773. }
  3774. void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
  3775. }
  3776. virtual void getArchDefines(const LangOptions &Opts,
  3777. MacroBuilder &Builder) const {
  3778. Builder.defineMacro("__le32__");
  3779. Builder.defineMacro("__pnacl__");
  3780. }
  3781. virtual void getTargetDefines(const LangOptions &Opts,
  3782. MacroBuilder &Builder) const {
  3783. DefineStd(Builder, "unix", Opts);
  3784. Builder.defineMacro("__ELF__");
  3785. if (Opts.POSIXThreads)
  3786. Builder.defineMacro("_REENTRANT");
  3787. if (Opts.CPlusPlus)
  3788. Builder.defineMacro("_GNU_SOURCE");
  3789. Builder.defineMacro("__LITTLE_ENDIAN__");
  3790. Builder.defineMacro("__native_client__");
  3791. getArchDefines(Opts, Builder);
  3792. }
  3793. virtual bool hasFeature(StringRef Feature) const {
  3794. return Feature == "pnacl";
  3795. }
  3796. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  3797. unsigned &NumRecords) const {
  3798. }
  3799. virtual BuiltinVaListKind getBuiltinVaListKind() const {
  3800. return TargetInfo::PNaClABIBuiltinVaList;
  3801. }
  3802. virtual void getGCCRegNames(const char * const *&Names,
  3803. unsigned &NumNames) const;
  3804. virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
  3805. unsigned &NumAliases) const;
  3806. virtual bool validateAsmConstraint(const char *&Name,
  3807. TargetInfo::ConstraintInfo &Info) const {
  3808. return false;
  3809. }
  3810. virtual const char *getClobbers() const {
  3811. return "";
  3812. }
  3813. };
  3814. void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
  3815. unsigned &NumNames) const {
  3816. Names = NULL;
  3817. NumNames = 0;
  3818. }
  3819. void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
  3820. unsigned &NumAliases) const {
  3821. Aliases = NULL;
  3822. NumAliases = 0;
  3823. }
  3824. } // end anonymous namespace.
  3825. //===----------------------------------------------------------------------===//
  3826. // Driver code
  3827. //===----------------------------------------------------------------------===//
  3828. static TargetInfo *AllocateTarget(const std::string &T) {
  3829. llvm::Triple Triple(T);
  3830. llvm::Triple::OSType os = Triple.getOS();
  3831. switch (Triple.getArch()) {
  3832. default:
  3833. return NULL;
  3834. case llvm::Triple::hexagon:
  3835. return new HexagonTargetInfo(T);
  3836. case llvm::Triple::arm:
  3837. case llvm::Triple::thumb:
  3838. if (Triple.isOSDarwin())
  3839. return new DarwinARMTargetInfo(T);
  3840. switch (os) {
  3841. case llvm::Triple::Linux:
  3842. return new LinuxTargetInfo<ARMTargetInfo>(T);
  3843. case llvm::Triple::FreeBSD:
  3844. return new FreeBSDTargetInfo<ARMTargetInfo>(T);
  3845. case llvm::Triple::NetBSD:
  3846. return new NetBSDTargetInfo<ARMTargetInfo>(T);
  3847. case llvm::Triple::OpenBSD:
  3848. return new OpenBSDTargetInfo<ARMTargetInfo>(T);
  3849. case llvm::Triple::Bitrig:
  3850. return new BitrigTargetInfo<ARMTargetInfo>(T);
  3851. case llvm::Triple::RTEMS:
  3852. return new RTEMSTargetInfo<ARMTargetInfo>(T);
  3853. default:
  3854. return new ARMTargetInfo(T);
  3855. }
  3856. case llvm::Triple::msp430:
  3857. return new MSP430TargetInfo(T);
  3858. case llvm::Triple::mips:
  3859. switch (os) {
  3860. case llvm::Triple::Linux:
  3861. return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
  3862. case llvm::Triple::RTEMS:
  3863. return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
  3864. case llvm::Triple::FreeBSD:
  3865. return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
  3866. case llvm::Triple::NetBSD:
  3867. return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
  3868. default:
  3869. return new Mips32EBTargetInfo(T);
  3870. }
  3871. case llvm::Triple::mipsel:
  3872. switch (os) {
  3873. case llvm::Triple::Linux:
  3874. return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
  3875. case llvm::Triple::RTEMS:
  3876. return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
  3877. case llvm::Triple::FreeBSD:
  3878. return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
  3879. case llvm::Triple::NetBSD:
  3880. return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
  3881. default:
  3882. return new Mips32ELTargetInfo(T);
  3883. }
  3884. case llvm::Triple::mips64:
  3885. switch (os) {
  3886. case llvm::Triple::Linux:
  3887. return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
  3888. case llvm::Triple::RTEMS:
  3889. return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
  3890. case llvm::Triple::FreeBSD:
  3891. return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
  3892. case llvm::Triple::NetBSD:
  3893. return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
  3894. case llvm::Triple::OpenBSD:
  3895. return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
  3896. default:
  3897. return new Mips64EBTargetInfo(T);
  3898. }
  3899. case llvm::Triple::mips64el:
  3900. switch (os) {
  3901. case llvm::Triple::Linux:
  3902. return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
  3903. case llvm::Triple::RTEMS:
  3904. return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
  3905. case llvm::Triple::FreeBSD:
  3906. return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
  3907. case llvm::Triple::NetBSD:
  3908. return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
  3909. case llvm::Triple::OpenBSD:
  3910. return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
  3911. default:
  3912. return new Mips64ELTargetInfo(T);
  3913. }
  3914. case llvm::Triple::le32:
  3915. switch (os) {
  3916. case llvm::Triple::NativeClient:
  3917. return new PNaClTargetInfo(T);
  3918. default:
  3919. return NULL;
  3920. }
  3921. case llvm::Triple::ppc:
  3922. if (Triple.isOSDarwin())
  3923. return new DarwinPPC32TargetInfo(T);
  3924. switch (os) {
  3925. case llvm::Triple::Linux:
  3926. return new LinuxTargetInfo<PPC32TargetInfo>(T);
  3927. case llvm::Triple::FreeBSD:
  3928. return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
  3929. case llvm::Triple::NetBSD:
  3930. return new NetBSDTargetInfo<PPC32TargetInfo>(T);
  3931. case llvm::Triple::OpenBSD:
  3932. return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
  3933. case llvm::Triple::RTEMS:
  3934. return new RTEMSTargetInfo<PPC32TargetInfo>(T);
  3935. default:
  3936. return new PPC32TargetInfo(T);
  3937. }
  3938. case llvm::Triple::ppc64:
  3939. if (Triple.isOSDarwin())
  3940. return new DarwinPPC64TargetInfo(T);
  3941. switch (os) {
  3942. case llvm::Triple::Linux:
  3943. return new LinuxTargetInfo<PPC64TargetInfo>(T);
  3944. case llvm::Triple::Lv2:
  3945. return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
  3946. case llvm::Triple::FreeBSD:
  3947. return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
  3948. case llvm::Triple::NetBSD:
  3949. return new NetBSDTargetInfo<PPC64TargetInfo>(T);
  3950. default:
  3951. return new PPC64TargetInfo(T);
  3952. }
  3953. case llvm::Triple::nvptx:
  3954. return new NVPTX32TargetInfo(T);
  3955. case llvm::Triple::nvptx64:
  3956. return new NVPTX64TargetInfo(T);
  3957. case llvm::Triple::mblaze:
  3958. return new MBlazeTargetInfo(T);
  3959. case llvm::Triple::sparc:
  3960. switch (os) {
  3961. case llvm::Triple::Linux:
  3962. return new LinuxTargetInfo<SparcV8TargetInfo>(T);
  3963. case llvm::Triple::AuroraUX:
  3964. return new AuroraUXSparcV8TargetInfo(T);
  3965. case llvm::Triple::Solaris:
  3966. return new SolarisSparcV8TargetInfo(T);
  3967. case llvm::Triple::NetBSD:
  3968. return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
  3969. case llvm::Triple::OpenBSD:
  3970. return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
  3971. case llvm::Triple::RTEMS:
  3972. return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
  3973. default:
  3974. return new SparcV8TargetInfo(T);
  3975. }
  3976. // FIXME: Need a real SPU target.
  3977. case llvm::Triple::cellspu:
  3978. return new PS3SPUTargetInfo<PPC64TargetInfo>(T);
  3979. case llvm::Triple::tce:
  3980. return new TCETargetInfo(T);
  3981. case llvm::Triple::x86:
  3982. if (Triple.isOSDarwin())
  3983. return new DarwinI386TargetInfo(T);
  3984. switch (os) {
  3985. case llvm::Triple::AuroraUX:
  3986. return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
  3987. case llvm::Triple::Linux:
  3988. return new LinuxTargetInfo<X86_32TargetInfo>(T);
  3989. case llvm::Triple::DragonFly:
  3990. return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
  3991. case llvm::Triple::NetBSD:
  3992. return new NetBSDI386TargetInfo(T);
  3993. case llvm::Triple::OpenBSD:
  3994. return new OpenBSDI386TargetInfo(T);
  3995. case llvm::Triple::Bitrig:
  3996. return new BitrigI386TargetInfo(T);
  3997. case llvm::Triple::FreeBSD:
  3998. return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
  3999. case llvm::Triple::Minix:
  4000. return new MinixTargetInfo<X86_32TargetInfo>(T);
  4001. case llvm::Triple::Solaris:
  4002. return new SolarisTargetInfo<X86_32TargetInfo>(T);
  4003. case llvm::Triple::Cygwin:
  4004. return new CygwinX86_32TargetInfo(T);
  4005. case llvm::Triple::MinGW32:
  4006. return new MinGWX86_32TargetInfo(T);
  4007. case llvm::Triple::Win32:
  4008. return new VisualStudioWindowsX86_32TargetInfo(T);
  4009. case llvm::Triple::Haiku:
  4010. return new HaikuX86_32TargetInfo(T);
  4011. case llvm::Triple::RTEMS:
  4012. return new RTEMSX86_32TargetInfo(T);
  4013. default:
  4014. return new X86_32TargetInfo(T);
  4015. }
  4016. case llvm::Triple::x86_64:
  4017. if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
  4018. return new DarwinX86_64TargetInfo(T);
  4019. switch (os) {
  4020. case llvm::Triple::AuroraUX:
  4021. return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
  4022. case llvm::Triple::Linux:
  4023. return new LinuxTargetInfo<X86_64TargetInfo>(T);
  4024. case llvm::Triple::DragonFly:
  4025. return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
  4026. case llvm::Triple::NetBSD:
  4027. return new NetBSDTargetInfo<X86_64TargetInfo>(T);
  4028. case llvm::Triple::OpenBSD:
  4029. return new OpenBSDX86_64TargetInfo(T);
  4030. case llvm::Triple::Bitrig:
  4031. return new BitrigX86_64TargetInfo(T);
  4032. case llvm::Triple::FreeBSD:
  4033. return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
  4034. case llvm::Triple::Solaris:
  4035. return new SolarisTargetInfo<X86_64TargetInfo>(T);
  4036. case llvm::Triple::MinGW32:
  4037. return new MinGWX86_64TargetInfo(T);
  4038. case llvm::Triple::Win32: // This is what Triple.h supports now.
  4039. return new VisualStudioWindowsX86_64TargetInfo(T);
  4040. default:
  4041. return new X86_64TargetInfo(T);
  4042. }
  4043. }
  4044. }
  4045. /// CreateTargetInfo - Return the target info object for the specified target
  4046. /// triple.
  4047. TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
  4048. TargetOptions &Opts) {
  4049. llvm::Triple Triple(Opts.Triple);
  4050. // Construct the target
  4051. OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
  4052. if (!Target) {
  4053. Diags.Report(diag::err_target_unknown_triple) << Triple.str();
  4054. return 0;
  4055. }
  4056. // Set the target CPU if specified.
  4057. if (!Opts.CPU.empty() && !Target->setCPU(Opts.CPU)) {
  4058. Diags.Report(diag::err_target_unknown_cpu) << Opts.CPU;
  4059. return 0;
  4060. }
  4061. // Set the target ABI if specified.
  4062. if (!Opts.ABI.empty() && !Target->setABI(Opts.ABI)) {
  4063. Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
  4064. return 0;
  4065. }
  4066. // Set the target C++ ABI.
  4067. if (!Opts.CXXABI.empty() && !Target->setCXXABI(Opts.CXXABI)) {
  4068. Diags.Report(diag::err_target_unknown_cxxabi) << Opts.CXXABI;
  4069. return 0;
  4070. }
  4071. // Compute the default target features, we need the target to handle this
  4072. // because features may have dependencies on one another.
  4073. llvm::StringMap<bool> Features;
  4074. Target->getDefaultFeatures(Features);
  4075. // Apply the user specified deltas.
  4076. // First the enables.
  4077. for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
  4078. ie = Opts.Features.end(); it != ie; ++it) {
  4079. const char *Name = it->c_str();
  4080. if (Name[0] != '+')
  4081. continue;
  4082. // Apply the feature via the target.
  4083. if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
  4084. Diags.Report(diag::err_target_invalid_feature) << Name;
  4085. return 0;
  4086. }
  4087. }
  4088. // Then the disables.
  4089. for (std::vector<std::string>::const_iterator it = Opts.Features.begin(),
  4090. ie = Opts.Features.end(); it != ie; ++it) {
  4091. const char *Name = it->c_str();
  4092. if (Name[0] == '+')
  4093. continue;
  4094. // Apply the feature via the target.
  4095. if (Name[0] != '-' ||
  4096. !Target->setFeatureEnabled(Features, Name + 1, false)) {
  4097. Diags.Report(diag::err_target_invalid_feature) << Name;
  4098. return 0;
  4099. }
  4100. }
  4101. // Add the features to the compile options.
  4102. //
  4103. // FIXME: If we are completely confident that we have the right set, we only
  4104. // need to pass the minuses.
  4105. Opts.Features.clear();
  4106. for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
  4107. ie = Features.end(); it != ie; ++it)
  4108. Opts.Features.push_back((it->second ? "+" : "-") + it->first().str());
  4109. Target->HandleTargetFeatures(Opts.Features);
  4110. return Target.take();
  4111. }