TripleTest.cpp 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082
  1. //===----------- Triple.cpp - Triple unit tests ---------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "gtest/gtest.h"
  10. #include "llvm/ADT/Triple.h"
  11. using namespace llvm;
  12. namespace {
  13. TEST(TripleTest, BasicParsing) {
  14. Triple T;
  15. T = Triple("");
  16. EXPECT_EQ("", T.getArchName().str());
  17. EXPECT_EQ("", T.getVendorName().str());
  18. EXPECT_EQ("", T.getOSName().str());
  19. EXPECT_EQ("", T.getEnvironmentName().str());
  20. T = Triple("-");
  21. EXPECT_EQ("", T.getArchName().str());
  22. EXPECT_EQ("", T.getVendorName().str());
  23. EXPECT_EQ("", T.getOSName().str());
  24. EXPECT_EQ("", T.getEnvironmentName().str());
  25. T = Triple("--");
  26. EXPECT_EQ("", T.getArchName().str());
  27. EXPECT_EQ("", T.getVendorName().str());
  28. EXPECT_EQ("", T.getOSName().str());
  29. EXPECT_EQ("", T.getEnvironmentName().str());
  30. T = Triple("---");
  31. EXPECT_EQ("", T.getArchName().str());
  32. EXPECT_EQ("", T.getVendorName().str());
  33. EXPECT_EQ("", T.getOSName().str());
  34. EXPECT_EQ("", T.getEnvironmentName().str());
  35. T = Triple("----");
  36. EXPECT_EQ("", T.getArchName().str());
  37. EXPECT_EQ("", T.getVendorName().str());
  38. EXPECT_EQ("", T.getOSName().str());
  39. EXPECT_EQ("-", T.getEnvironmentName().str());
  40. T = Triple("a");
  41. EXPECT_EQ("a", T.getArchName().str());
  42. EXPECT_EQ("", T.getVendorName().str());
  43. EXPECT_EQ("", T.getOSName().str());
  44. EXPECT_EQ("", T.getEnvironmentName().str());
  45. T = Triple("a-b");
  46. EXPECT_EQ("a", T.getArchName().str());
  47. EXPECT_EQ("b", T.getVendorName().str());
  48. EXPECT_EQ("", T.getOSName().str());
  49. EXPECT_EQ("", T.getEnvironmentName().str());
  50. T = Triple("a-b-c");
  51. EXPECT_EQ("a", T.getArchName().str());
  52. EXPECT_EQ("b", T.getVendorName().str());
  53. EXPECT_EQ("c", T.getOSName().str());
  54. EXPECT_EQ("", T.getEnvironmentName().str());
  55. T = Triple("a-b-c-d");
  56. EXPECT_EQ("a", T.getArchName().str());
  57. EXPECT_EQ("b", T.getVendorName().str());
  58. EXPECT_EQ("c", T.getOSName().str());
  59. EXPECT_EQ("d", T.getEnvironmentName().str());
  60. }
  61. TEST(TripleTest, ParsedIDs) {
  62. Triple T;
  63. T = Triple("i386-apple-darwin");
  64. EXPECT_EQ(Triple::x86, T.getArch());
  65. EXPECT_EQ(Triple::Apple, T.getVendor());
  66. EXPECT_EQ(Triple::Darwin, T.getOS());
  67. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  68. T = Triple("x86_64-pc-linux-gnu");
  69. EXPECT_EQ(Triple::x86_64, T.getArch());
  70. EXPECT_EQ(Triple::PC, T.getVendor());
  71. EXPECT_EQ(Triple::Linux, T.getOS());
  72. EXPECT_EQ(Triple::GNU, T.getEnvironment());
  73. T = Triple("powerpc-bgp-linux");
  74. EXPECT_EQ(Triple::ppc, T.getArch());
  75. EXPECT_EQ(Triple::BGP, T.getVendor());
  76. EXPECT_EQ(Triple::Linux, T.getOS());
  77. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  78. T = Triple("powerpc-bgp-cnk");
  79. EXPECT_EQ(Triple::ppc, T.getArch());
  80. EXPECT_EQ(Triple::BGP, T.getVendor());
  81. EXPECT_EQ(Triple::CNK, T.getOS());
  82. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  83. T = Triple("powerpc64-bgq-linux");
  84. EXPECT_EQ(Triple::ppc64, T.getArch());
  85. EXPECT_EQ(Triple::BGQ, T.getVendor());
  86. EXPECT_EQ(Triple::Linux, T.getOS());
  87. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  88. T = Triple("powerpc-ibm-aix");
  89. EXPECT_EQ(Triple::ppc, T.getArch());
  90. EXPECT_EQ(Triple::IBM, T.getVendor());
  91. EXPECT_EQ(Triple::AIX, T.getOS());
  92. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  93. T = Triple("powerpc64-ibm-aix");
  94. EXPECT_EQ(Triple::ppc64, T.getArch());
  95. EXPECT_EQ(Triple::IBM, T.getVendor());
  96. EXPECT_EQ(Triple::AIX, T.getOS());
  97. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  98. T = Triple("powerpc-dunno-notsure");
  99. EXPECT_EQ(Triple::ppc, T.getArch());
  100. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  101. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  102. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  103. T = Triple("arm-none-none-eabi");
  104. EXPECT_EQ(Triple::arm, T.getArch());
  105. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  106. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  107. EXPECT_EQ(Triple::EABI, T.getEnvironment());
  108. T = Triple("armv6hl-none-linux-gnueabi");
  109. EXPECT_EQ(Triple::arm, T.getArch());
  110. EXPECT_EQ(Triple::Linux, T.getOS());
  111. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  112. EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
  113. T = Triple("armv7hl-none-linux-gnueabi");
  114. EXPECT_EQ(Triple::arm, T.getArch());
  115. EXPECT_EQ(Triple::Linux, T.getOS());
  116. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  117. EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
  118. T = Triple("amdil-unknown-unknown");
  119. EXPECT_EQ(Triple::amdil, T.getArch());
  120. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  121. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  122. T = Triple("amdil64-unknown-unknown");
  123. EXPECT_EQ(Triple::amdil64, T.getArch());
  124. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  125. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  126. T = Triple("hsail-unknown-unknown");
  127. EXPECT_EQ(Triple::hsail, T.getArch());
  128. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  129. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  130. T = Triple("hsail64-unknown-unknown");
  131. EXPECT_EQ(Triple::hsail64, T.getArch());
  132. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  133. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  134. T = Triple("sparcel-unknown-unknown");
  135. EXPECT_EQ(Triple::sparcel, T.getArch());
  136. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  137. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  138. T = Triple("spir-unknown-unknown");
  139. EXPECT_EQ(Triple::spir, T.getArch());
  140. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  141. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  142. T = Triple("spir64-unknown-unknown");
  143. EXPECT_EQ(Triple::spir64, T.getArch());
  144. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  145. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  146. T = Triple("x86_64-unknown-cloudabi");
  147. EXPECT_EQ(Triple::x86_64, T.getArch());
  148. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  149. EXPECT_EQ(Triple::CloudABI, T.getOS());
  150. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  151. T = Triple("wasm32-unknown-unknown");
  152. EXPECT_EQ(Triple::wasm32, T.getArch());
  153. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  154. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  155. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  156. T = Triple("wasm64-unknown-unknown");
  157. EXPECT_EQ(Triple::wasm64, T.getArch());
  158. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  159. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  160. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  161. T = Triple("huh");
  162. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  163. }
  164. static std::string Join(StringRef A, StringRef B, StringRef C) {
  165. std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C;
  166. return Str;
  167. }
  168. static std::string Join(StringRef A, StringRef B, StringRef C, StringRef D) {
  169. std::string Str = A; Str += '-'; Str += B; Str += '-'; Str += C; Str += '-';
  170. Str += D; return Str;
  171. }
  172. TEST(TripleTest, Normalization) {
  173. EXPECT_EQ("", Triple::normalize(""));
  174. EXPECT_EQ("-", Triple::normalize("-"));
  175. EXPECT_EQ("--", Triple::normalize("--"));
  176. EXPECT_EQ("---", Triple::normalize("---"));
  177. EXPECT_EQ("----", Triple::normalize("----"));
  178. EXPECT_EQ("a", Triple::normalize("a"));
  179. EXPECT_EQ("a-b", Triple::normalize("a-b"));
  180. EXPECT_EQ("a-b-c", Triple::normalize("a-b-c"));
  181. EXPECT_EQ("a-b-c-d", Triple::normalize("a-b-c-d"));
  182. EXPECT_EQ("i386-b-c", Triple::normalize("i386-b-c"));
  183. EXPECT_EQ("i386-a-c", Triple::normalize("a-i386-c"));
  184. EXPECT_EQ("i386-a-b", Triple::normalize("a-b-i386"));
  185. EXPECT_EQ("i386-a-b-c", Triple::normalize("a-b-c-i386"));
  186. EXPECT_EQ("a-pc-c", Triple::normalize("a-pc-c"));
  187. EXPECT_EQ("-pc-b-c", Triple::normalize("pc-b-c"));
  188. EXPECT_EQ("a-pc-b", Triple::normalize("a-b-pc"));
  189. EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
  190. EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
  191. EXPECT_EQ("--linux-b-c", Triple::normalize("linux-b-c"));
  192. EXPECT_EQ("a--linux-c", Triple::normalize("a-linux-c"));
  193. EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
  194. EXPECT_EQ("i386-pc-", Triple::normalize("-pc-i386"));
  195. EXPECT_EQ("-pc-linux-c", Triple::normalize("linux-pc-c"));
  196. EXPECT_EQ("-pc-linux", Triple::normalize("linux-pc-"));
  197. EXPECT_EQ("i386", Triple::normalize("i386"));
  198. EXPECT_EQ("-pc", Triple::normalize("pc"));
  199. EXPECT_EQ("--linux", Triple::normalize("linux"));
  200. EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-gnu-linux"));
  201. // Check that normalizing a permutated set of valid components returns a
  202. // triple with the unpermuted components.
  203. StringRef C[4];
  204. for (int Arch = 1+Triple::UnknownArch; Arch <= Triple::LastArchType; ++Arch) {
  205. C[0] = Triple::getArchTypeName(Triple::ArchType(Arch));
  206. for (int Vendor = 1+Triple::UnknownVendor; Vendor <= Triple::LastVendorType;
  207. ++Vendor) {
  208. C[1] = Triple::getVendorTypeName(Triple::VendorType(Vendor));
  209. for (int OS = 1+Triple::UnknownOS; OS <= Triple::LastOSType; ++OS) {
  210. if (OS == Triple::Win32)
  211. continue;
  212. C[2] = Triple::getOSTypeName(Triple::OSType(OS));
  213. std::string E = Join(C[0], C[1], C[2]);
  214. EXPECT_EQ(E, Triple::normalize(Join(C[0], C[1], C[2])));
  215. EXPECT_EQ(E, Triple::normalize(Join(C[0], C[2], C[1])));
  216. EXPECT_EQ(E, Triple::normalize(Join(C[1], C[2], C[0])));
  217. EXPECT_EQ(E, Triple::normalize(Join(C[1], C[0], C[2])));
  218. EXPECT_EQ(E, Triple::normalize(Join(C[2], C[0], C[1])));
  219. EXPECT_EQ(E, Triple::normalize(Join(C[2], C[1], C[0])));
  220. for (int Env = 1 + Triple::UnknownEnvironment; Env <= Triple::LastEnvironmentType;
  221. ++Env) {
  222. C[3] = Triple::getEnvironmentTypeName(Triple::EnvironmentType(Env));
  223. std::string F = Join(C[0], C[1], C[2], C[3]);
  224. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[2], C[3])));
  225. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[1], C[3], C[2])));
  226. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[3], C[1])));
  227. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[2], C[1], C[3])));
  228. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[1], C[2])));
  229. EXPECT_EQ(F, Triple::normalize(Join(C[0], C[3], C[2], C[1])));
  230. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[3], C[0])));
  231. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[2], C[0], C[3])));
  232. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[0], C[2])));
  233. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[3], C[2], C[0])));
  234. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[2], C[3])));
  235. EXPECT_EQ(F, Triple::normalize(Join(C[1], C[0], C[3], C[2])));
  236. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[0], C[1])));
  237. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[3], C[1], C[0])));
  238. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[1], C[3])));
  239. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[0], C[3], C[1])));
  240. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[3], C[0])));
  241. EXPECT_EQ(F, Triple::normalize(Join(C[2], C[1], C[0], C[3])));
  242. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[1], C[2])));
  243. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[0], C[2], C[1])));
  244. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[2], C[0])));
  245. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[1], C[0], C[2])));
  246. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[0], C[1])));
  247. EXPECT_EQ(F, Triple::normalize(Join(C[3], C[2], C[1], C[0])));
  248. }
  249. }
  250. }
  251. }
  252. // Various real-world funky triples. The value returned by GCC's config.sub
  253. // is given in the comment.
  254. EXPECT_EQ("i386--windows-gnu", Triple::normalize("i386-mingw32")); // i386-pc-mingw32
  255. EXPECT_EQ("x86_64--linux-gnu", Triple::normalize("x86_64-linux-gnu")); // x86_64-pc-linux-gnu
  256. EXPECT_EQ("i486--linux-gnu", Triple::normalize("i486-linux-gnu")); // i486-pc-linux-gnu
  257. EXPECT_EQ("i386-redhat-linux", Triple::normalize("i386-redhat-linux")); // i386-redhat-linux-gnu
  258. EXPECT_EQ("i686--linux", Triple::normalize("i686-linux")); // i686-pc-linux-gnu
  259. EXPECT_EQ("arm-none--eabi", Triple::normalize("arm-none-eabi")); // arm-none-eabi
  260. }
  261. TEST(TripleTest, MutateName) {
  262. Triple T;
  263. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  264. EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
  265. EXPECT_EQ(Triple::UnknownOS, T.getOS());
  266. EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
  267. T.setArchName("i386");
  268. EXPECT_EQ(Triple::x86, T.getArch());
  269. EXPECT_EQ("i386--", T.getTriple());
  270. T.setVendorName("pc");
  271. EXPECT_EQ(Triple::x86, T.getArch());
  272. EXPECT_EQ(Triple::PC, T.getVendor());
  273. EXPECT_EQ("i386-pc-", T.getTriple());
  274. T.setOSName("linux");
  275. EXPECT_EQ(Triple::x86, T.getArch());
  276. EXPECT_EQ(Triple::PC, T.getVendor());
  277. EXPECT_EQ(Triple::Linux, T.getOS());
  278. EXPECT_EQ("i386-pc-linux", T.getTriple());
  279. T.setEnvironmentName("gnu");
  280. EXPECT_EQ(Triple::x86, T.getArch());
  281. EXPECT_EQ(Triple::PC, T.getVendor());
  282. EXPECT_EQ(Triple::Linux, T.getOS());
  283. EXPECT_EQ("i386-pc-linux-gnu", T.getTriple());
  284. T.setOSName("freebsd");
  285. EXPECT_EQ(Triple::x86, T.getArch());
  286. EXPECT_EQ(Triple::PC, T.getVendor());
  287. EXPECT_EQ(Triple::FreeBSD, T.getOS());
  288. EXPECT_EQ("i386-pc-freebsd-gnu", T.getTriple());
  289. T.setOSAndEnvironmentName("darwin");
  290. EXPECT_EQ(Triple::x86, T.getArch());
  291. EXPECT_EQ(Triple::PC, T.getVendor());
  292. EXPECT_EQ(Triple::Darwin, T.getOS());
  293. EXPECT_EQ("i386-pc-darwin", T.getTriple());
  294. }
  295. TEST(TripleTest, BitWidthPredicates) {
  296. Triple T;
  297. EXPECT_FALSE(T.isArch16Bit());
  298. EXPECT_FALSE(T.isArch32Bit());
  299. EXPECT_FALSE(T.isArch64Bit());
  300. T.setArch(Triple::arm);
  301. EXPECT_FALSE(T.isArch16Bit());
  302. EXPECT_TRUE(T.isArch32Bit());
  303. EXPECT_FALSE(T.isArch64Bit());
  304. T.setArch(Triple::hexagon);
  305. EXPECT_FALSE(T.isArch16Bit());
  306. EXPECT_TRUE(T.isArch32Bit());
  307. EXPECT_FALSE(T.isArch64Bit());
  308. T.setArch(Triple::mips);
  309. EXPECT_FALSE(T.isArch16Bit());
  310. EXPECT_TRUE(T.isArch32Bit());
  311. EXPECT_FALSE(T.isArch64Bit());
  312. T.setArch(Triple::mips64);
  313. EXPECT_FALSE(T.isArch16Bit());
  314. EXPECT_FALSE(T.isArch32Bit());
  315. EXPECT_TRUE(T.isArch64Bit());
  316. T.setArch(Triple::msp430);
  317. EXPECT_TRUE(T.isArch16Bit());
  318. EXPECT_FALSE(T.isArch32Bit());
  319. EXPECT_FALSE(T.isArch64Bit());
  320. T.setArch(Triple::ppc);
  321. EXPECT_FALSE(T.isArch16Bit());
  322. EXPECT_TRUE(T.isArch32Bit());
  323. EXPECT_FALSE(T.isArch64Bit());
  324. T.setArch(Triple::ppc64);
  325. EXPECT_FALSE(T.isArch16Bit());
  326. EXPECT_FALSE(T.isArch32Bit());
  327. EXPECT_TRUE(T.isArch64Bit());
  328. T.setArch(Triple::x86);
  329. EXPECT_FALSE(T.isArch16Bit());
  330. EXPECT_TRUE(T.isArch32Bit());
  331. EXPECT_FALSE(T.isArch64Bit());
  332. T.setArch(Triple::x86_64);
  333. EXPECT_FALSE(T.isArch16Bit());
  334. EXPECT_FALSE(T.isArch32Bit());
  335. EXPECT_TRUE(T.isArch64Bit());
  336. T.setArch(Triple::amdil);
  337. EXPECT_FALSE(T.isArch16Bit());
  338. EXPECT_TRUE(T.isArch32Bit());
  339. EXPECT_FALSE(T.isArch64Bit());
  340. T.setArch(Triple::amdil64);
  341. EXPECT_FALSE(T.isArch16Bit());
  342. EXPECT_FALSE(T.isArch32Bit());
  343. EXPECT_TRUE(T.isArch64Bit());
  344. T.setArch(Triple::hsail);
  345. EXPECT_FALSE(T.isArch16Bit());
  346. EXPECT_TRUE(T.isArch32Bit());
  347. EXPECT_FALSE(T.isArch64Bit());
  348. T.setArch(Triple::hsail64);
  349. EXPECT_FALSE(T.isArch16Bit());
  350. EXPECT_FALSE(T.isArch32Bit());
  351. EXPECT_TRUE(T.isArch64Bit());
  352. T.setArch(Triple::spir);
  353. EXPECT_FALSE(T.isArch16Bit());
  354. EXPECT_TRUE(T.isArch32Bit());
  355. EXPECT_FALSE(T.isArch64Bit());
  356. T.setArch(Triple::spir64);
  357. EXPECT_FALSE(T.isArch16Bit());
  358. EXPECT_FALSE(T.isArch32Bit());
  359. EXPECT_TRUE(T.isArch64Bit());
  360. T.setArch(Triple::sparc);
  361. EXPECT_FALSE(T.isArch16Bit());
  362. EXPECT_TRUE(T.isArch32Bit());
  363. EXPECT_FALSE(T.isArch64Bit());
  364. T.setArch(Triple::sparcel);
  365. EXPECT_FALSE(T.isArch16Bit());
  366. EXPECT_TRUE(T.isArch32Bit());
  367. EXPECT_FALSE(T.isArch64Bit());
  368. T.setArch(Triple::sparcv9);
  369. EXPECT_FALSE(T.isArch16Bit());
  370. EXPECT_FALSE(T.isArch32Bit());
  371. EXPECT_TRUE(T.isArch64Bit());
  372. T.setArch(Triple::wasm32);
  373. EXPECT_FALSE(T.isArch16Bit());
  374. EXPECT_TRUE(T.isArch32Bit());
  375. EXPECT_FALSE(T.isArch64Bit());
  376. T.setArch(Triple::wasm64);
  377. EXPECT_FALSE(T.isArch16Bit());
  378. EXPECT_FALSE(T.isArch32Bit());
  379. EXPECT_TRUE(T.isArch64Bit());
  380. }
  381. TEST(TripleTest, BitWidthArchVariants) {
  382. Triple T;
  383. EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
  384. EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
  385. T.setArch(Triple::UnknownArch);
  386. EXPECT_EQ(Triple::UnknownArch, T.get32BitArchVariant().getArch());
  387. EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
  388. T.setArch(Triple::mips);
  389. EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
  390. EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
  391. T.setArch(Triple::mipsel);
  392. EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
  393. EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
  394. T.setArch(Triple::ppc);
  395. EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
  396. EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
  397. T.setArch(Triple::nvptx);
  398. EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
  399. EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
  400. T.setArch(Triple::sparc);
  401. EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
  402. EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
  403. T.setArch(Triple::x86);
  404. EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
  405. EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
  406. T.setArch(Triple::mips64);
  407. EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch());
  408. EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch());
  409. T.setArch(Triple::mips64el);
  410. EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch());
  411. EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch());
  412. T.setArch(Triple::ppc64);
  413. EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch());
  414. EXPECT_EQ(Triple::ppc64, T.get64BitArchVariant().getArch());
  415. T.setArch(Triple::nvptx64);
  416. EXPECT_EQ(Triple::nvptx, T.get32BitArchVariant().getArch());
  417. EXPECT_EQ(Triple::nvptx64, T.get64BitArchVariant().getArch());
  418. T.setArch(Triple::sparcv9);
  419. EXPECT_EQ(Triple::sparc, T.get32BitArchVariant().getArch());
  420. EXPECT_EQ(Triple::sparcv9, T.get64BitArchVariant().getArch());
  421. T.setArch(Triple::x86_64);
  422. EXPECT_EQ(Triple::x86, T.get32BitArchVariant().getArch());
  423. EXPECT_EQ(Triple::x86_64, T.get64BitArchVariant().getArch());
  424. T.setArch(Triple::amdil);
  425. EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
  426. EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
  427. T.setArch(Triple::amdil64);
  428. EXPECT_EQ(Triple::amdil, T.get32BitArchVariant().getArch());
  429. EXPECT_EQ(Triple::amdil64, T.get64BitArchVariant().getArch());
  430. T.setArch(Triple::hsail);
  431. EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
  432. EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
  433. T.setArch(Triple::hsail64);
  434. EXPECT_EQ(Triple::hsail, T.get32BitArchVariant().getArch());
  435. EXPECT_EQ(Triple::hsail64, T.get64BitArchVariant().getArch());
  436. T.setArch(Triple::spir);
  437. EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
  438. EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
  439. T.setArch(Triple::spir64);
  440. EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
  441. EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
  442. T.setArch(Triple::wasm32);
  443. EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
  444. EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
  445. T.setArch(Triple::wasm64);
  446. EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
  447. EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
  448. }
  449. TEST(TripleTest, EndianArchVariants) {
  450. Triple T;
  451. EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
  452. EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
  453. T.setArch(Triple::UnknownArch);
  454. EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
  455. EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
  456. T.setArch(Triple::aarch64_be);
  457. EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
  458. EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
  459. T.setArch(Triple::aarch64);
  460. EXPECT_EQ(Triple::aarch64_be, T.getBigEndianArchVariant().getArch());
  461. EXPECT_EQ(Triple::aarch64, T.getLittleEndianArchVariant().getArch());
  462. T.setArch(Triple::armeb);
  463. EXPECT_EQ(Triple::armeb, T.getBigEndianArchVariant().getArch());
  464. EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
  465. T.setArch(Triple::arm);
  466. EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
  467. EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch());
  468. T.setArch(Triple::bpfeb);
  469. EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
  470. EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
  471. T.setArch(Triple::bpfel);
  472. EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());
  473. EXPECT_EQ(Triple::bpfel, T.getLittleEndianArchVariant().getArch());
  474. T.setArch(Triple::mips64);
  475. EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
  476. EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
  477. T.setArch(Triple::mips64el);
  478. EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch());
  479. EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());
  480. T.setArch(Triple::mips);
  481. EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
  482. EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
  483. T.setArch(Triple::mipsel);
  484. EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch());
  485. EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch());
  486. T.setArch(Triple::ppc);
  487. EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch());
  488. EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
  489. T.setArch(Triple::ppc64);
  490. EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
  491. EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
  492. T.setArch(Triple::ppc64le);
  493. EXPECT_EQ(Triple::ppc64, T.getBigEndianArchVariant().getArch());
  494. EXPECT_EQ(Triple::ppc64le, T.getLittleEndianArchVariant().getArch());
  495. T.setArch(Triple::sparc);
  496. EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
  497. EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
  498. T.setArch(Triple::sparcel);
  499. EXPECT_EQ(Triple::sparc, T.getBigEndianArchVariant().getArch());
  500. EXPECT_EQ(Triple::sparcel, T.getLittleEndianArchVariant().getArch());
  501. T.setArch(Triple::thumb);
  502. EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
  503. EXPECT_EQ(Triple::thumb, T.getLittleEndianArchVariant().getArch());
  504. T.setArch(Triple::thumbeb);
  505. EXPECT_EQ(Triple::thumbeb, T.getBigEndianArchVariant().getArch());
  506. EXPECT_EQ(Triple::UnknownArch, T.getLittleEndianArchVariant().getArch());
  507. }
  508. TEST(TripleTest, getOSVersion) {
  509. Triple T;
  510. unsigned Major, Minor, Micro;
  511. T = Triple("i386-apple-darwin9");
  512. EXPECT_TRUE(T.isMacOSX());
  513. EXPECT_FALSE(T.isiOS());
  514. EXPECT_FALSE(T.isArch16Bit());
  515. EXPECT_TRUE(T.isArch32Bit());
  516. EXPECT_FALSE(T.isArch64Bit());
  517. T.getMacOSXVersion(Major, Minor, Micro);
  518. EXPECT_EQ((unsigned)10, Major);
  519. EXPECT_EQ((unsigned)5, Minor);
  520. EXPECT_EQ((unsigned)0, Micro);
  521. T.getiOSVersion(Major, Minor, Micro);
  522. EXPECT_EQ((unsigned)5, Major);
  523. EXPECT_EQ((unsigned)0, Minor);
  524. EXPECT_EQ((unsigned)0, Micro);
  525. T = Triple("x86_64-apple-darwin9");
  526. EXPECT_TRUE(T.isMacOSX());
  527. EXPECT_FALSE(T.isiOS());
  528. EXPECT_FALSE(T.isArch16Bit());
  529. EXPECT_FALSE(T.isArch32Bit());
  530. EXPECT_TRUE(T.isArch64Bit());
  531. T.getMacOSXVersion(Major, Minor, Micro);
  532. EXPECT_EQ((unsigned)10, Major);
  533. EXPECT_EQ((unsigned)5, Minor);
  534. EXPECT_EQ((unsigned)0, Micro);
  535. T.getiOSVersion(Major, Minor, Micro);
  536. EXPECT_EQ((unsigned)5, Major);
  537. EXPECT_EQ((unsigned)0, Minor);
  538. EXPECT_EQ((unsigned)0, Micro);
  539. T = Triple("x86_64-apple-macosx");
  540. EXPECT_TRUE(T.isMacOSX());
  541. EXPECT_FALSE(T.isiOS());
  542. EXPECT_FALSE(T.isArch16Bit());
  543. EXPECT_FALSE(T.isArch32Bit());
  544. EXPECT_TRUE(T.isArch64Bit());
  545. T.getMacOSXVersion(Major, Minor, Micro);
  546. EXPECT_EQ((unsigned)10, Major);
  547. EXPECT_EQ((unsigned)4, Minor);
  548. EXPECT_EQ((unsigned)0, Micro);
  549. T.getiOSVersion(Major, Minor, Micro);
  550. EXPECT_EQ((unsigned)5, Major);
  551. EXPECT_EQ((unsigned)0, Minor);
  552. EXPECT_EQ((unsigned)0, Micro);
  553. T = Triple("x86_64-apple-macosx10.7");
  554. EXPECT_TRUE(T.isMacOSX());
  555. EXPECT_FALSE(T.isiOS());
  556. EXPECT_FALSE(T.isArch16Bit());
  557. EXPECT_FALSE(T.isArch32Bit());
  558. EXPECT_TRUE(T.isArch64Bit());
  559. T.getMacOSXVersion(Major, Minor, Micro);
  560. EXPECT_EQ((unsigned)10, Major);
  561. EXPECT_EQ((unsigned)7, Minor);
  562. EXPECT_EQ((unsigned)0, Micro);
  563. T.getiOSVersion(Major, Minor, Micro);
  564. EXPECT_EQ((unsigned)5, Major);
  565. EXPECT_EQ((unsigned)0, Minor);
  566. EXPECT_EQ((unsigned)0, Micro);
  567. T = Triple("armv7-apple-ios");
  568. EXPECT_FALSE(T.isMacOSX());
  569. EXPECT_TRUE(T.isiOS());
  570. EXPECT_FALSE(T.isArch16Bit());
  571. EXPECT_TRUE(T.isArch32Bit());
  572. EXPECT_FALSE(T.isArch64Bit());
  573. T.getMacOSXVersion(Major, Minor, Micro);
  574. EXPECT_EQ((unsigned)10, Major);
  575. EXPECT_EQ((unsigned)4, Minor);
  576. EXPECT_EQ((unsigned)0, Micro);
  577. T.getiOSVersion(Major, Minor, Micro);
  578. EXPECT_EQ((unsigned)5, Major);
  579. EXPECT_EQ((unsigned)0, Minor);
  580. EXPECT_EQ((unsigned)0, Micro);
  581. T = Triple("armv7-apple-ios7.0");
  582. EXPECT_FALSE(T.isMacOSX());
  583. EXPECT_TRUE(T.isiOS());
  584. EXPECT_FALSE(T.isArch16Bit());
  585. EXPECT_TRUE(T.isArch32Bit());
  586. EXPECT_FALSE(T.isArch64Bit());
  587. T.getMacOSXVersion(Major, Minor, Micro);
  588. EXPECT_EQ((unsigned)10, Major);
  589. EXPECT_EQ((unsigned)4, Minor);
  590. EXPECT_EQ((unsigned)0, Micro);
  591. T.getiOSVersion(Major, Minor, Micro);
  592. EXPECT_EQ((unsigned)7, Major);
  593. EXPECT_EQ((unsigned)0, Minor);
  594. EXPECT_EQ((unsigned)0, Micro);
  595. }
  596. TEST(TripleTest, FileFormat) {
  597. EXPECT_EQ(Triple::ELF, Triple("i686-unknown-linux-gnu").getObjectFormat());
  598. EXPECT_EQ(Triple::ELF, Triple("i686-unknown-freebsd").getObjectFormat());
  599. EXPECT_EQ(Triple::ELF, Triple("i686-unknown-netbsd").getObjectFormat());
  600. EXPECT_EQ(Triple::ELF, Triple("i686--win32-elf").getObjectFormat());
  601. EXPECT_EQ(Triple::ELF, Triple("i686---elf").getObjectFormat());
  602. EXPECT_EQ(Triple::MachO, Triple("i686-apple-macosx").getObjectFormat());
  603. EXPECT_EQ(Triple::MachO, Triple("i686-apple-ios").getObjectFormat());
  604. EXPECT_EQ(Triple::MachO, Triple("i686---macho").getObjectFormat());
  605. EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat());
  606. EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat());
  607. EXPECT_EQ(Triple::ELF, Triple("i686-pc-cygwin-elf").getObjectFormat());
  608. Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
  609. EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
  610. Triple GNUWindowsNormalized(Triple::normalize("i686-pc-windows-gnu-elf"));
  611. EXPECT_EQ(Triple::ELF, GNUWindowsNormalized.getObjectFormat());
  612. Triple CygnusNormalised(Triple::normalize("i686-pc-windows-cygnus-elf"));
  613. EXPECT_EQ(Triple::ELF, CygnusNormalised.getObjectFormat());
  614. Triple CygwinNormalized(Triple::normalize("i686-pc-cygwin-elf"));
  615. EXPECT_EQ(Triple::ELF, CygwinNormalized.getObjectFormat());
  616. Triple T = Triple("");
  617. T.setObjectFormat(Triple::ELF);
  618. EXPECT_EQ(Triple::ELF, T.getObjectFormat());
  619. }
  620. TEST(TripleTest, NormalizeWindows) {
  621. EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-win32"));
  622. EXPECT_EQ("i686--windows-msvc", Triple::normalize("i686-win32"));
  623. EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32"));
  624. EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32"));
  625. EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-mingw32-w64"));
  626. EXPECT_EQ("i686--windows-gnu", Triple::normalize("i686-mingw32-w64"));
  627. EXPECT_EQ("i686-pc-windows-cygnus", Triple::normalize("i686-pc-cygwin"));
  628. EXPECT_EQ("i686--windows-cygnus", Triple::normalize("i686-cygwin"));
  629. EXPECT_EQ("x86_64-pc-windows-msvc", Triple::normalize("x86_64-pc-win32"));
  630. EXPECT_EQ("x86_64--windows-msvc", Triple::normalize("x86_64-win32"));
  631. EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32"));
  632. EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32"));
  633. EXPECT_EQ("x86_64-pc-windows-gnu", Triple::normalize("x86_64-pc-mingw32-w64"));
  634. EXPECT_EQ("x86_64--windows-gnu", Triple::normalize("x86_64-mingw32-w64"));
  635. EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-win32-elf"));
  636. EXPECT_EQ("i686--windows-elf", Triple::normalize("i686-win32-elf"));
  637. EXPECT_EQ("i686-pc-windows-macho", Triple::normalize("i686-pc-win32-macho"));
  638. EXPECT_EQ("i686--windows-macho", Triple::normalize("i686-win32-macho"));
  639. EXPECT_EQ("x86_64-pc-windows-elf", Triple::normalize("x86_64-pc-win32-elf"));
  640. EXPECT_EQ("x86_64--windows-elf", Triple::normalize("x86_64-win32-elf"));
  641. EXPECT_EQ("x86_64-pc-windows-macho", Triple::normalize("x86_64-pc-win32-macho"));
  642. EXPECT_EQ("x86_64--windows-macho", Triple::normalize("x86_64-win32-macho"));
  643. EXPECT_EQ("i686-pc-windows-cygnus",
  644. Triple::normalize("i686-pc-windows-cygnus"));
  645. EXPECT_EQ("i686-pc-windows-gnu", Triple::normalize("i686-pc-windows-gnu"));
  646. EXPECT_EQ("i686-pc-windows-itanium", Triple::normalize("i686-pc-windows-itanium"));
  647. EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc"));
  648. EXPECT_EQ("i686-pc-windows-elf", Triple::normalize("i686-pc-windows-elf-elf"));
  649. }
  650. TEST(TripleTest, getARMCPUForArch) {
  651. // Standard ARM Architectures.
  652. {
  653. llvm::Triple Triple("armv4-unknown-eabi");
  654. EXPECT_STREQ("strongarm", Triple.getARMCPUForArch());
  655. }
  656. {
  657. llvm::Triple Triple("armv4t-unknown-eabi");
  658. EXPECT_STREQ("arm7tdmi", Triple.getARMCPUForArch());
  659. }
  660. {
  661. llvm::Triple Triple("armv5-unknown-eabi");
  662. EXPECT_STREQ("arm10tdmi", Triple.getARMCPUForArch());
  663. }
  664. {
  665. llvm::Triple Triple("armv5t-unknown-eabi");
  666. EXPECT_STREQ("arm10tdmi", Triple.getARMCPUForArch());
  667. }
  668. {
  669. llvm::Triple Triple("armv5e-unknown-eabi");
  670. EXPECT_STREQ("arm1022e", Triple.getARMCPUForArch());
  671. }
  672. {
  673. llvm::Triple Triple("armv5tej-unknown-eabi");
  674. EXPECT_STREQ("arm926ej-s", Triple.getARMCPUForArch());
  675. }
  676. {
  677. llvm::Triple Triple("armv6-unknown-eabi");
  678. EXPECT_STREQ("arm1136jf-s", Triple.getARMCPUForArch());
  679. }
  680. {
  681. llvm::Triple Triple("armv6j-unknown-eabi");
  682. EXPECT_STREQ("arm1136j-s", Triple.getARMCPUForArch());
  683. }
  684. {
  685. llvm::Triple Triple("armv6k-unknown-eabi");
  686. EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
  687. }
  688. {
  689. llvm::Triple Triple("armv6zk-unknown-eabi");
  690. EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
  691. }
  692. {
  693. llvm::Triple Triple("armv6t2-unknown-eabi");
  694. EXPECT_STREQ("arm1156t2-s", Triple.getARMCPUForArch());
  695. }
  696. {
  697. llvm::Triple Triple("armv6m-unknown-eabi");
  698. EXPECT_STREQ("cortex-m0", Triple.getARMCPUForArch());
  699. }
  700. {
  701. llvm::Triple Triple("armv7-unknown-eabi");
  702. EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch());
  703. }
  704. {
  705. llvm::Triple Triple("armv7a-unknown-eabi");
  706. EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch());
  707. }
  708. {
  709. llvm::Triple Triple("armv7m-unknown-eabi");
  710. EXPECT_STREQ("cortex-m3", Triple.getARMCPUForArch());
  711. }
  712. {
  713. llvm::Triple Triple("armv7r-unknown-eabi");
  714. EXPECT_STREQ("cortex-r4", Triple.getARMCPUForArch());
  715. }
  716. {
  717. llvm::Triple Triple("armv7r-unknown-eabi");
  718. EXPECT_STREQ("cortex-r4", Triple.getARMCPUForArch());
  719. }
  720. {
  721. llvm::Triple Triple("armv7r-unknown-eabi");
  722. EXPECT_STREQ("cortex-r4", Triple.getARMCPUForArch());
  723. }
  724. {
  725. llvm::Triple Triple("armv7r-unknown-eabi");
  726. EXPECT_STREQ("cortex-r4", Triple.getARMCPUForArch());
  727. }
  728. {
  729. llvm::Triple Triple("armv8a-unknown-eabi");
  730. EXPECT_STREQ("cortex-a53", Triple.getARMCPUForArch());
  731. }
  732. {
  733. llvm::Triple Triple("armv8.1a-unknown-eabi");
  734. EXPECT_STREQ("generic", Triple.getARMCPUForArch());
  735. }
  736. // Non-synonym names, using -march style, not default arch.
  737. {
  738. llvm::Triple Triple("arm");
  739. EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch("armv7-a"));
  740. }
  741. {
  742. llvm::Triple Triple("arm");
  743. EXPECT_STREQ("cortex-m3", Triple.getARMCPUForArch("armv7-m"));
  744. }
  745. {
  746. llvm::Triple Triple("arm");
  747. EXPECT_STREQ("cortex-a53", Triple.getARMCPUForArch("armv8"));
  748. }
  749. {
  750. llvm::Triple Triple("arm");
  751. EXPECT_STREQ("cortex-a53", Triple.getARMCPUForArch("armv8-a"));
  752. }
  753. // Platform specific defaults.
  754. {
  755. llvm::Triple Triple("arm--nacl");
  756. EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch());
  757. }
  758. {
  759. llvm::Triple Triple("armv6-unknown-freebsd");
  760. EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
  761. }
  762. {
  763. llvm::Triple Triple("thumbv6-unknown-freebsd");
  764. EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
  765. }
  766. {
  767. llvm::Triple Triple("armebv6-unknown-freebsd");
  768. EXPECT_STREQ("arm1176jzf-s", Triple.getARMCPUForArch());
  769. }
  770. {
  771. llvm::Triple Triple("arm--win32");
  772. EXPECT_STREQ("cortex-a9", Triple.getARMCPUForArch());
  773. }
  774. // Some alternative architectures
  775. {
  776. llvm::Triple Triple("xscale-unknown-eabi");
  777. EXPECT_STREQ("xscale", Triple.getARMCPUForArch());
  778. }
  779. {
  780. llvm::Triple Triple("iwmmxt-unknown-eabi");
  781. EXPECT_STREQ("iwmmxt", Triple.getARMCPUForArch());
  782. }
  783. {
  784. llvm::Triple Triple("armv7s-apple-ios7");
  785. EXPECT_STREQ("swift", Triple.getARMCPUForArch());
  786. }
  787. {
  788. llvm::Triple Triple("armv7em-apple-ios7");
  789. EXPECT_STREQ("cortex-m4", Triple.getARMCPUForArch());
  790. }
  791. {
  792. llvm::Triple Triple("armv7l-linux-gnueabihf");
  793. EXPECT_STREQ("cortex-a8", Triple.getARMCPUForArch());
  794. }
  795. {
  796. llvm::Triple Triple("armv6sm-apple-ios7");
  797. EXPECT_STREQ("cortex-m0", Triple.getARMCPUForArch());
  798. }
  799. // armeb is permitted, but armebeb is not
  800. {
  801. llvm::Triple Triple("armeb-none-eabi");
  802. EXPECT_STREQ("arm7tdmi", Triple.getARMCPUForArch());
  803. }
  804. {
  805. llvm::Triple Triple("armebeb-none-eabi");
  806. EXPECT_EQ(nullptr, Triple.getARMCPUForArch());
  807. }
  808. {
  809. llvm::Triple Triple("armebv6eb-none-eabi");
  810. EXPECT_EQ(nullptr, Triple.getARMCPUForArch());
  811. }
  812. // armebv6 and armv6eb are permitted, but armebv6eb is not
  813. {
  814. llvm::Triple Triple("armebv6-non-eabi");
  815. EXPECT_STREQ("arm1136jf-s", Triple.getARMCPUForArch());
  816. }
  817. {
  818. llvm::Triple Triple("armv6eb-none-eabi");
  819. EXPECT_STREQ("arm1136jf-s", Triple.getARMCPUForArch());
  820. }
  821. // xscaleeb is permitted, but armebxscale is not
  822. {
  823. llvm::Triple Triple("xscaleeb-none-eabi");
  824. EXPECT_STREQ("xscale", Triple.getARMCPUForArch());
  825. }
  826. {
  827. llvm::Triple Triple("armebxscale-none-eabi");
  828. EXPECT_EQ(nullptr, Triple.getARMCPUForArch());
  829. }
  830. }
  831. TEST(TripleTest, NormalizeARM) {
  832. EXPECT_EQ("armv6--netbsd-eabi", Triple::normalize("armv6-netbsd-eabi"));
  833. EXPECT_EQ("armv7--netbsd-eabi", Triple::normalize("armv7-netbsd-eabi"));
  834. EXPECT_EQ("armv6eb--netbsd-eabi", Triple::normalize("armv6eb-netbsd-eabi"));
  835. EXPECT_EQ("armv7eb--netbsd-eabi", Triple::normalize("armv7eb-netbsd-eabi"));
  836. EXPECT_EQ("armv6--netbsd-eabihf", Triple::normalize("armv6-netbsd-eabihf"));
  837. EXPECT_EQ("armv7--netbsd-eabihf", Triple::normalize("armv7-netbsd-eabihf"));
  838. EXPECT_EQ("armv6eb--netbsd-eabihf", Triple::normalize("armv6eb-netbsd-eabihf"));
  839. EXPECT_EQ("armv7eb--netbsd-eabihf", Triple::normalize("armv7eb-netbsd-eabihf"));
  840. Triple T;
  841. T = Triple("armv6--netbsd-eabi");
  842. EXPECT_EQ(Triple::arm, T.getArch());
  843. T = Triple("armv6eb--netbsd-eabi");
  844. EXPECT_EQ(Triple::armeb, T.getArch());
  845. }
  846. TEST(TripleTest, ParseARMArch) {
  847. // ARM
  848. {
  849. Triple T = Triple("arm");
  850. EXPECT_EQ(Triple::arm, T.getArch());
  851. }
  852. {
  853. Triple T = Triple("armv6t2");
  854. EXPECT_EQ(Triple::arm, T.getArch());
  855. }
  856. {
  857. Triple T = Triple("armv8");
  858. EXPECT_EQ(Triple::arm, T.getArch());
  859. }
  860. {
  861. Triple T = Triple("armeb");
  862. EXPECT_EQ(Triple::armeb, T.getArch());
  863. }
  864. {
  865. Triple T = Triple("armv5eb");
  866. EXPECT_EQ(Triple::armeb, T.getArch());
  867. }
  868. {
  869. Triple T = Triple("armebv7m");
  870. EXPECT_EQ(Triple::armeb, T.getArch());
  871. }
  872. {
  873. Triple T = Triple("armv7eb");
  874. EXPECT_EQ(Triple::armeb, T.getArch());
  875. }
  876. // THUMB
  877. {
  878. Triple T = Triple("thumb");
  879. EXPECT_EQ(Triple::thumb, T.getArch());
  880. }
  881. {
  882. Triple T = Triple("thumbv7a");
  883. EXPECT_EQ(Triple::thumb, T.getArch());
  884. }
  885. {
  886. Triple T = Triple("thumbeb");
  887. EXPECT_EQ(Triple::thumbeb, T.getArch());
  888. }
  889. {
  890. Triple T = Triple("thumbv4teb");
  891. EXPECT_EQ(Triple::thumbeb, T.getArch());
  892. }
  893. {
  894. Triple T = Triple("thumbebv7");
  895. EXPECT_EQ(Triple::thumbeb, T.getArch());
  896. }
  897. {
  898. Triple T = Triple("armv6m");
  899. EXPECT_EQ(Triple::thumb, T.getArch());
  900. }
  901. {
  902. Triple T = Triple("thumbv2");
  903. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  904. }
  905. {
  906. Triple T = Triple("thumbebv6eb");
  907. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  908. }
  909. // AARCH64
  910. {
  911. Triple T = Triple("arm64");
  912. EXPECT_EQ(Triple::aarch64, T.getArch());
  913. }
  914. {
  915. Triple T = Triple("aarch64");
  916. EXPECT_EQ(Triple::aarch64, T.getArch());
  917. }
  918. {
  919. Triple T = Triple("aarch64_be");
  920. EXPECT_EQ(Triple::aarch64_be, T.getArch());
  921. }
  922. {
  923. Triple T = Triple("aarch64be");
  924. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  925. }
  926. {
  927. Triple T = Triple("arm64be");
  928. EXPECT_EQ(Triple::UnknownArch, T.getArch());
  929. }
  930. }
  931. } // end anonymous namespace