LLLexer.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963
  1. //===- LLLexer.cpp - Lexer for .ll Files ----------------------------------===//
  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. // Implement the Lexer for .ll files.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "LLLexer.h"
  14. #include "llvm/ADT/StringExtras.h"
  15. #include "llvm/ADT/Twine.h"
  16. #include "llvm/AsmParser/Parser.h"
  17. #include "llvm/IR/DerivedTypes.h"
  18. #include "llvm/IR/Instruction.h"
  19. #include "llvm/IR/LLVMContext.h"
  20. #include "llvm/Support/ErrorHandling.h"
  21. #include "llvm/Support/MathExtras.h"
  22. #include "llvm/Support/MemoryBuffer.h"
  23. #include "llvm/Support/SourceMgr.h"
  24. #include "llvm/Support/raw_ostream.h"
  25. #include <cctype>
  26. #include <cstdio>
  27. #include <cstdlib>
  28. #include <cstring>
  29. using namespace llvm;
  30. bool LLLexer::Error(LocTy ErrorLoc, const Twine &Msg) const {
  31. ErrorInfo = SM.GetMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
  32. return true;
  33. }
  34. void LLLexer::Warning(LocTy WarningLoc, const Twine &Msg) const {
  35. SM.PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
  36. }
  37. //===----------------------------------------------------------------------===//
  38. // Helper functions.
  39. //===----------------------------------------------------------------------===//
  40. // atoull - Convert an ascii string of decimal digits into the unsigned long
  41. // long representation... this does not have to do input error checking,
  42. // because we know that the input will be matched by a suitable regex...
  43. //
  44. uint64_t LLLexer::atoull(const char *Buffer, const char *End) {
  45. uint64_t Result = 0;
  46. for (; Buffer != End; Buffer++) {
  47. uint64_t OldRes = Result;
  48. Result *= 10;
  49. Result += *Buffer-'0';
  50. if (Result < OldRes) { // Uh, oh, overflow detected!!!
  51. Error("constant bigger than 64 bits detected!");
  52. return 0;
  53. }
  54. }
  55. return Result;
  56. }
  57. uint64_t LLLexer::HexIntToVal(const char *Buffer, const char *End) {
  58. uint64_t Result = 0;
  59. for (; Buffer != End; ++Buffer) {
  60. uint64_t OldRes = Result;
  61. Result *= 16;
  62. Result += hexDigitValue(*Buffer);
  63. if (Result < OldRes) { // Uh, oh, overflow detected!!!
  64. Error("constant bigger than 64 bits detected!");
  65. return 0;
  66. }
  67. }
  68. return Result;
  69. }
  70. void LLLexer::HexToIntPair(const char *Buffer, const char *End,
  71. uint64_t Pair[2]) {
  72. Pair[0] = 0;
  73. if (End - Buffer >= 16) {
  74. for (int i = 0; i < 16; i++, Buffer++) {
  75. assert(Buffer != End);
  76. Pair[0] *= 16;
  77. Pair[0] += hexDigitValue(*Buffer);
  78. }
  79. }
  80. Pair[1] = 0;
  81. for (int i = 0; i < 16 && Buffer != End; i++, Buffer++) {
  82. Pair[1] *= 16;
  83. Pair[1] += hexDigitValue(*Buffer);
  84. }
  85. if (Buffer != End)
  86. Error("constant bigger than 128 bits detected!");
  87. }
  88. /// FP80HexToIntPair - translate an 80 bit FP80 number (20 hexits) into
  89. /// { low64, high16 } as usual for an APInt.
  90. void LLLexer::FP80HexToIntPair(const char *Buffer, const char *End,
  91. uint64_t Pair[2]) {
  92. Pair[1] = 0;
  93. for (int i=0; i<4 && Buffer != End; i++, Buffer++) {
  94. assert(Buffer != End);
  95. Pair[1] *= 16;
  96. Pair[1] += hexDigitValue(*Buffer);
  97. }
  98. Pair[0] = 0;
  99. for (int i=0; i<16; i++, Buffer++) {
  100. Pair[0] *= 16;
  101. Pair[0] += hexDigitValue(*Buffer);
  102. }
  103. if (Buffer != End)
  104. Error("constant bigger than 128 bits detected!");
  105. }
  106. // UnEscapeLexed - Run through the specified buffer and change \xx codes to the
  107. // appropriate character.
  108. static void UnEscapeLexed(std::string &Str) {
  109. if (Str.empty()) return;
  110. char *Buffer = &Str[0], *EndBuffer = Buffer+Str.size();
  111. char *BOut = Buffer;
  112. for (char *BIn = Buffer; BIn != EndBuffer; ) {
  113. if (BIn[0] == '\\') {
  114. if (BIn < EndBuffer-1 && BIn[1] == '\\') {
  115. *BOut++ = '\\'; // Two \ becomes one
  116. BIn += 2;
  117. } else if (BIn < EndBuffer-2 &&
  118. isxdigit(static_cast<unsigned char>(BIn[1])) &&
  119. isxdigit(static_cast<unsigned char>(BIn[2]))) {
  120. *BOut = hexDigitValue(BIn[1]) * 16 + hexDigitValue(BIn[2]);
  121. BIn += 3; // Skip over handled chars
  122. ++BOut;
  123. } else {
  124. *BOut++ = *BIn++;
  125. }
  126. } else {
  127. *BOut++ = *BIn++;
  128. }
  129. }
  130. Str.resize(BOut-Buffer);
  131. }
  132. /// isLabelChar - Return true for [-a-zA-Z$._0-9].
  133. static bool isLabelChar(char C) {
  134. return isalnum(static_cast<unsigned char>(C)) || C == '-' || C == '$' ||
  135. C == '.' || C == '_';
  136. }
  137. /// isLabelTail - Return true if this pointer points to a valid end of a label.
  138. static const char *isLabelTail(const char *CurPtr) {
  139. while (1) {
  140. if (CurPtr[0] == ':') return CurPtr+1;
  141. if (!isLabelChar(CurPtr[0])) return nullptr;
  142. ++CurPtr;
  143. }
  144. }
  145. //===----------------------------------------------------------------------===//
  146. // Lexer definition.
  147. //===----------------------------------------------------------------------===//
  148. LLLexer::LLLexer(StringRef StartBuf, SourceMgr &sm, SMDiagnostic &Err,
  149. LLVMContext &C)
  150. : CurBuf(StartBuf), ErrorInfo(Err), SM(sm), Context(C), APFloatVal(0.0) {
  151. CurPtr = CurBuf.begin();
  152. }
  153. int LLLexer::getNextChar() {
  154. char CurChar = *CurPtr++;
  155. switch (CurChar) {
  156. default: return (unsigned char)CurChar;
  157. case 0:
  158. // A nul character in the stream is either the end of the current buffer or
  159. // a random nul in the file. Disambiguate that here.
  160. if (CurPtr-1 != CurBuf.end())
  161. return 0; // Just whitespace.
  162. // Otherwise, return end of file.
  163. --CurPtr; // Another call to lex will return EOF again.
  164. return EOF;
  165. }
  166. }
  167. lltok::Kind LLLexer::LexToken() {
  168. TokStart = CurPtr;
  169. int CurChar = getNextChar();
  170. switch (CurChar) {
  171. default:
  172. // Handle letters: [a-zA-Z_]
  173. if (isalpha(static_cast<unsigned char>(CurChar)) || CurChar == '_')
  174. return LexIdentifier();
  175. return lltok::Error;
  176. case EOF: return lltok::Eof;
  177. case 0:
  178. case ' ':
  179. case '\t':
  180. case '\n':
  181. case '\r':
  182. // Ignore whitespace.
  183. return LexToken();
  184. case '+': return LexPositive();
  185. case '@': return LexAt();
  186. case '$': return LexDollar();
  187. case '%': return LexPercent();
  188. case '"': return LexQuote();
  189. case '.':
  190. if (const char *Ptr = isLabelTail(CurPtr)) {
  191. CurPtr = Ptr;
  192. StrVal.assign(TokStart, CurPtr-1);
  193. return lltok::LabelStr;
  194. }
  195. if (CurPtr[0] == '.' && CurPtr[1] == '.') {
  196. CurPtr += 2;
  197. return lltok::dotdotdot;
  198. }
  199. return lltok::Error;
  200. case ';':
  201. SkipLineComment();
  202. return LexToken();
  203. case '!': return LexExclaim();
  204. case '#': return LexHash();
  205. case '0': case '1': case '2': case '3': case '4':
  206. case '5': case '6': case '7': case '8': case '9':
  207. case '-':
  208. return LexDigitOrNegative();
  209. case '=': return lltok::equal;
  210. case '[': return lltok::lsquare;
  211. case ']': return lltok::rsquare;
  212. case '{': return lltok::lbrace;
  213. case '}': return lltok::rbrace;
  214. case '<': return lltok::less;
  215. case '>': return lltok::greater;
  216. case '(': return lltok::lparen;
  217. case ')': return lltok::rparen;
  218. case ',': return lltok::comma;
  219. case '*': return lltok::star;
  220. case '|': return lltok::bar;
  221. }
  222. }
  223. void LLLexer::SkipLineComment() {
  224. while (1) {
  225. if (CurPtr[0] == '\n' || CurPtr[0] == '\r' || getNextChar() == EOF)
  226. return;
  227. }
  228. }
  229. /// Lex all tokens that start with an @ character.
  230. /// GlobalVar @\"[^\"]*\"
  231. /// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]*
  232. /// GlobalVarID @[0-9]+
  233. lltok::Kind LLLexer::LexAt() {
  234. return LexVar(lltok::GlobalVar, lltok::GlobalID);
  235. }
  236. lltok::Kind LLLexer::LexDollar() {
  237. if (const char *Ptr = isLabelTail(TokStart)) {
  238. CurPtr = Ptr;
  239. StrVal.assign(TokStart, CurPtr - 1);
  240. return lltok::LabelStr;
  241. }
  242. // Handle DollarStringConstant: $\"[^\"]*\"
  243. if (CurPtr[0] == '"') {
  244. ++CurPtr;
  245. while (1) {
  246. int CurChar = getNextChar();
  247. if (CurChar == EOF) {
  248. Error("end of file in COMDAT variable name");
  249. return lltok::Error;
  250. }
  251. if (CurChar == '"') {
  252. StrVal.assign(TokStart + 2, CurPtr - 1);
  253. UnEscapeLexed(StrVal);
  254. if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
  255. Error("Null bytes are not allowed in names");
  256. return lltok::Error;
  257. }
  258. return lltok::ComdatVar;
  259. }
  260. }
  261. }
  262. // Handle ComdatVarName: $[-a-zA-Z$._][-a-zA-Z$._0-9]*
  263. if (ReadVarName())
  264. return lltok::ComdatVar;
  265. return lltok::Error;
  266. }
  267. /// ReadString - Read a string until the closing quote.
  268. lltok::Kind LLLexer::ReadString(lltok::Kind kind) {
  269. const char *Start = CurPtr;
  270. while (1) {
  271. int CurChar = getNextChar();
  272. if (CurChar == EOF) {
  273. Error("end of file in string constant");
  274. return lltok::Error;
  275. }
  276. if (CurChar == '"') {
  277. StrVal.assign(Start, CurPtr-1);
  278. UnEscapeLexed(StrVal);
  279. return kind;
  280. }
  281. }
  282. }
  283. /// ReadVarName - Read the rest of a token containing a variable name.
  284. bool LLLexer::ReadVarName() {
  285. const char *NameStart = CurPtr;
  286. if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
  287. CurPtr[0] == '-' || CurPtr[0] == '$' ||
  288. CurPtr[0] == '.' || CurPtr[0] == '_') {
  289. ++CurPtr;
  290. while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
  291. CurPtr[0] == '-' || CurPtr[0] == '$' ||
  292. CurPtr[0] == '.' || CurPtr[0] == '_')
  293. ++CurPtr;
  294. StrVal.assign(NameStart, CurPtr);
  295. return true;
  296. }
  297. return false;
  298. }
  299. lltok::Kind LLLexer::LexVar(lltok::Kind Var, lltok::Kind VarID) {
  300. // Handle StringConstant: \"[^\"]*\"
  301. if (CurPtr[0] == '"') {
  302. ++CurPtr;
  303. while (1) {
  304. int CurChar = getNextChar();
  305. if (CurChar == EOF) {
  306. Error("end of file in global variable name");
  307. return lltok::Error;
  308. }
  309. if (CurChar == '"') {
  310. StrVal.assign(TokStart+2, CurPtr-1);
  311. UnEscapeLexed(StrVal);
  312. if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
  313. Error("Null bytes are not allowed in names");
  314. return lltok::Error;
  315. }
  316. return Var;
  317. }
  318. }
  319. }
  320. // Handle VarName: [-a-zA-Z$._][-a-zA-Z$._0-9]*
  321. if (ReadVarName())
  322. return Var;
  323. // Handle VarID: [0-9]+
  324. if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
  325. for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
  326. /*empty*/;
  327. uint64_t Val = atoull(TokStart+1, CurPtr);
  328. if ((unsigned)Val != Val)
  329. Error("invalid value number (too large)!");
  330. UIntVal = unsigned(Val);
  331. return VarID;
  332. }
  333. return lltok::Error;
  334. }
  335. /// Lex all tokens that start with a % character.
  336. /// LocalVar ::= %\"[^\"]*\"
  337. /// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]*
  338. /// LocalVarID ::= %[0-9]+
  339. lltok::Kind LLLexer::LexPercent() {
  340. return LexVar(lltok::LocalVar, lltok::LocalVarID);
  341. }
  342. /// Lex all tokens that start with a " character.
  343. /// QuoteLabel "[^"]+":
  344. /// StringConstant "[^"]*"
  345. lltok::Kind LLLexer::LexQuote() {
  346. lltok::Kind kind = ReadString(lltok::StringConstant);
  347. if (kind == lltok::Error || kind == lltok::Eof)
  348. return kind;
  349. if (CurPtr[0] == ':') {
  350. ++CurPtr;
  351. if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
  352. Error("Null bytes are not allowed in names");
  353. kind = lltok::Error;
  354. } else {
  355. kind = lltok::LabelStr;
  356. }
  357. }
  358. return kind;
  359. }
  360. /// Lex all tokens that start with a ! character.
  361. /// !foo
  362. /// !
  363. lltok::Kind LLLexer::LexExclaim() {
  364. // Lex a metadata name as a MetadataVar.
  365. if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
  366. CurPtr[0] == '-' || CurPtr[0] == '$' ||
  367. CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') {
  368. ++CurPtr;
  369. while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
  370. CurPtr[0] == '-' || CurPtr[0] == '$' ||
  371. CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\')
  372. ++CurPtr;
  373. StrVal.assign(TokStart+1, CurPtr); // Skip !
  374. UnEscapeLexed(StrVal);
  375. return lltok::MetadataVar;
  376. }
  377. return lltok::exclaim;
  378. }
  379. /// Lex all tokens that start with a # character.
  380. /// AttrGrpID ::= #[0-9]+
  381. lltok::Kind LLLexer::LexHash() {
  382. // Handle AttrGrpID: #[0-9]+
  383. if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
  384. for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
  385. /*empty*/;
  386. uint64_t Val = atoull(TokStart+1, CurPtr);
  387. if ((unsigned)Val != Val)
  388. Error("invalid value number (too large)!");
  389. UIntVal = unsigned(Val);
  390. return lltok::AttrGrpID;
  391. }
  392. return lltok::Error;
  393. }
  394. /// Lex a label, integer type, keyword, or hexadecimal integer constant.
  395. /// Label [-a-zA-Z$._0-9]+:
  396. /// IntegerType i[0-9]+
  397. /// Keyword sdiv, float, ...
  398. /// HexIntConstant [us]0x[0-9A-Fa-f]+
  399. lltok::Kind LLLexer::LexIdentifier() {
  400. const char *StartChar = CurPtr;
  401. const char *IntEnd = CurPtr[-1] == 'i' ? nullptr : StartChar;
  402. const char *KeywordEnd = nullptr;
  403. for (; isLabelChar(*CurPtr); ++CurPtr) {
  404. // If we decide this is an integer, remember the end of the sequence.
  405. if (!IntEnd && !isdigit(static_cast<unsigned char>(*CurPtr)))
  406. IntEnd = CurPtr;
  407. if (!KeywordEnd && !isalnum(static_cast<unsigned char>(*CurPtr)) &&
  408. *CurPtr != '_')
  409. KeywordEnd = CurPtr;
  410. }
  411. // If we stopped due to a colon, this really is a label.
  412. if (*CurPtr == ':') {
  413. StrVal.assign(StartChar-1, CurPtr++);
  414. return lltok::LabelStr;
  415. }
  416. // Otherwise, this wasn't a label. If this was valid as an integer type,
  417. // return it.
  418. if (!IntEnd) IntEnd = CurPtr;
  419. if (IntEnd != StartChar) {
  420. CurPtr = IntEnd;
  421. uint64_t NumBits = atoull(StartChar, CurPtr);
  422. if (NumBits < IntegerType::MIN_INT_BITS ||
  423. NumBits > IntegerType::MAX_INT_BITS) {
  424. Error("bitwidth for integer type out of range!");
  425. return lltok::Error;
  426. }
  427. TyVal = IntegerType::get(Context, NumBits);
  428. return lltok::Type;
  429. }
  430. // Otherwise, this was a letter sequence. See which keyword this is.
  431. if (!KeywordEnd) KeywordEnd = CurPtr;
  432. CurPtr = KeywordEnd;
  433. --StartChar;
  434. StringRef Keyword(StartChar, CurPtr - StartChar);
  435. #define KEYWORD(STR) \
  436. do { \
  437. if (Keyword == #STR) \
  438. return lltok::kw_##STR; \
  439. } while (0)
  440. KEYWORD(true); KEYWORD(false);
  441. KEYWORD(declare); KEYWORD(define);
  442. KEYWORD(global); KEYWORD(constant);
  443. KEYWORD(private);
  444. KEYWORD(internal);
  445. KEYWORD(available_externally);
  446. KEYWORD(linkonce);
  447. KEYWORD(linkonce_odr);
  448. KEYWORD(weak); // Use as a linkage, and a modifier for "cmpxchg".
  449. KEYWORD(weak_odr);
  450. KEYWORD(appending);
  451. KEYWORD(dllimport);
  452. KEYWORD(dllexport);
  453. KEYWORD(common);
  454. KEYWORD(default);
  455. KEYWORD(hidden);
  456. KEYWORD(protected);
  457. KEYWORD(unnamed_addr);
  458. KEYWORD(externally_initialized);
  459. KEYWORD(extern_weak);
  460. KEYWORD(external);
  461. KEYWORD(thread_local);
  462. KEYWORD(localdynamic);
  463. KEYWORD(initialexec);
  464. KEYWORD(localexec);
  465. KEYWORD(zeroinitializer);
  466. KEYWORD(undef);
  467. KEYWORD(null);
  468. KEYWORD(to);
  469. KEYWORD(tail);
  470. KEYWORD(musttail);
  471. KEYWORD(target);
  472. KEYWORD(triple);
  473. KEYWORD(unwind);
  474. KEYWORD(deplibs); // FIXME: Remove in 4.0.
  475. KEYWORD(datalayout);
  476. KEYWORD(volatile);
  477. KEYWORD(atomic);
  478. KEYWORD(unordered);
  479. KEYWORD(monotonic);
  480. KEYWORD(acquire);
  481. KEYWORD(release);
  482. KEYWORD(acq_rel);
  483. KEYWORD(seq_cst);
  484. KEYWORD(singlethread);
  485. KEYWORD(nnan);
  486. KEYWORD(ninf);
  487. KEYWORD(nsz);
  488. KEYWORD(arcp);
  489. KEYWORD(fast);
  490. KEYWORD(nuw);
  491. KEYWORD(nsw);
  492. KEYWORD(exact);
  493. KEYWORD(inbounds);
  494. KEYWORD(align);
  495. KEYWORD(addrspace);
  496. KEYWORD(section);
  497. KEYWORD(alias);
  498. KEYWORD(module);
  499. KEYWORD(asm);
  500. KEYWORD(sideeffect);
  501. KEYWORD(alignstack);
  502. KEYWORD(inteldialect);
  503. KEYWORD(gc);
  504. KEYWORD(prefix);
  505. KEYWORD(prologue);
  506. KEYWORD(ccc);
  507. KEYWORD(fastcc);
  508. KEYWORD(coldcc);
  509. KEYWORD(x86_stdcallcc);
  510. KEYWORD(x86_fastcallcc);
  511. KEYWORD(x86_thiscallcc);
  512. KEYWORD(x86_vectorcallcc);
  513. KEYWORD(arm_apcscc);
  514. KEYWORD(arm_aapcscc);
  515. KEYWORD(arm_aapcs_vfpcc);
  516. KEYWORD(msp430_intrcc);
  517. KEYWORD(ptx_kernel);
  518. KEYWORD(ptx_device);
  519. KEYWORD(spir_kernel);
  520. KEYWORD(spir_func);
  521. KEYWORD(intel_ocl_bicc);
  522. KEYWORD(x86_64_sysvcc);
  523. KEYWORD(x86_64_win64cc);
  524. KEYWORD(webkit_jscc);
  525. KEYWORD(anyregcc);
  526. KEYWORD(preserve_mostcc);
  527. KEYWORD(preserve_allcc);
  528. KEYWORD(ghccc);
  529. KEYWORD(cc);
  530. KEYWORD(c);
  531. KEYWORD(attributes);
  532. KEYWORD(alwaysinline);
  533. KEYWORD(argmemonly);
  534. KEYWORD(builtin);
  535. KEYWORD(byval);
  536. KEYWORD(inalloca);
  537. KEYWORD(cold);
  538. KEYWORD(convergent);
  539. KEYWORD(dereferenceable);
  540. KEYWORD(dereferenceable_or_null);
  541. KEYWORD(inlinehint);
  542. KEYWORD(inreg);
  543. KEYWORD(jumptable);
  544. KEYWORD(minsize);
  545. KEYWORD(naked);
  546. KEYWORD(nest);
  547. KEYWORD(noalias);
  548. KEYWORD(nobuiltin);
  549. KEYWORD(nocapture);
  550. KEYWORD(noduplicate);
  551. KEYWORD(noimplicitfloat);
  552. KEYWORD(noinline);
  553. KEYWORD(nonlazybind);
  554. KEYWORD(nonnull);
  555. KEYWORD(noredzone);
  556. KEYWORD(noreturn);
  557. KEYWORD(nounwind);
  558. KEYWORD(optnone);
  559. KEYWORD(optsize);
  560. KEYWORD(readnone);
  561. KEYWORD(readonly);
  562. KEYWORD(returned);
  563. KEYWORD(returns_twice);
  564. KEYWORD(signext);
  565. KEYWORD(sret);
  566. KEYWORD(ssp);
  567. KEYWORD(sspreq);
  568. KEYWORD(sspstrong);
  569. KEYWORD(safestack);
  570. KEYWORD(sanitize_address);
  571. KEYWORD(sanitize_thread);
  572. KEYWORD(sanitize_memory);
  573. KEYWORD(uwtable);
  574. KEYWORD(zeroext);
  575. KEYWORD(type);
  576. KEYWORD(opaque);
  577. KEYWORD(comdat);
  578. // Comdat types
  579. KEYWORD(any);
  580. KEYWORD(exactmatch);
  581. KEYWORD(largest);
  582. KEYWORD(noduplicates);
  583. KEYWORD(samesize);
  584. KEYWORD(eq); KEYWORD(ne); KEYWORD(slt); KEYWORD(sgt); KEYWORD(sle);
  585. KEYWORD(sge); KEYWORD(ult); KEYWORD(ugt); KEYWORD(ule); KEYWORD(uge);
  586. KEYWORD(oeq); KEYWORD(one); KEYWORD(olt); KEYWORD(ogt); KEYWORD(ole);
  587. KEYWORD(oge); KEYWORD(ord); KEYWORD(uno); KEYWORD(ueq); KEYWORD(une);
  588. KEYWORD(xchg); KEYWORD(nand); KEYWORD(max); KEYWORD(min); KEYWORD(umax);
  589. KEYWORD(umin);
  590. KEYWORD(x);
  591. KEYWORD(blockaddress);
  592. // Metadata types.
  593. KEYWORD(distinct);
  594. // Use-list order directives.
  595. KEYWORD(uselistorder);
  596. KEYWORD(uselistorder_bb);
  597. KEYWORD(personality);
  598. KEYWORD(cleanup);
  599. KEYWORD(catch);
  600. KEYWORD(filter);
  601. #undef KEYWORD
  602. // Keywords for types.
  603. #define TYPEKEYWORD(STR, LLVMTY) \
  604. do { \
  605. if (Keyword == STR) { \
  606. TyVal = LLVMTY; \
  607. return lltok::Type; \
  608. } \
  609. } while (false)
  610. TYPEKEYWORD("void", Type::getVoidTy(Context));
  611. TYPEKEYWORD("half", Type::getHalfTy(Context));
  612. TYPEKEYWORD("float", Type::getFloatTy(Context));
  613. TYPEKEYWORD("double", Type::getDoubleTy(Context));
  614. TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context));
  615. TYPEKEYWORD("fp128", Type::getFP128Ty(Context));
  616. TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context));
  617. TYPEKEYWORD("label", Type::getLabelTy(Context));
  618. TYPEKEYWORD("metadata", Type::getMetadataTy(Context));
  619. TYPEKEYWORD("x86_mmx", Type::getX86_MMXTy(Context));
  620. #undef TYPEKEYWORD
  621. // Keywords for instructions.
  622. #define INSTKEYWORD(STR, Enum) \
  623. do { \
  624. if (Keyword == #STR) { \
  625. UIntVal = Instruction::Enum; \
  626. return lltok::kw_##STR; \
  627. } \
  628. } while (false)
  629. INSTKEYWORD(add, Add); INSTKEYWORD(fadd, FAdd);
  630. INSTKEYWORD(sub, Sub); INSTKEYWORD(fsub, FSub);
  631. INSTKEYWORD(mul, Mul); INSTKEYWORD(fmul, FMul);
  632. INSTKEYWORD(udiv, UDiv); INSTKEYWORD(sdiv, SDiv); INSTKEYWORD(fdiv, FDiv);
  633. INSTKEYWORD(urem, URem); INSTKEYWORD(srem, SRem); INSTKEYWORD(frem, FRem);
  634. INSTKEYWORD(shl, Shl); INSTKEYWORD(lshr, LShr); INSTKEYWORD(ashr, AShr);
  635. INSTKEYWORD(and, And); INSTKEYWORD(or, Or); INSTKEYWORD(xor, Xor);
  636. INSTKEYWORD(icmp, ICmp); INSTKEYWORD(fcmp, FCmp);
  637. INSTKEYWORD(phi, PHI);
  638. INSTKEYWORD(call, Call);
  639. INSTKEYWORD(trunc, Trunc);
  640. INSTKEYWORD(zext, ZExt);
  641. INSTKEYWORD(sext, SExt);
  642. INSTKEYWORD(fptrunc, FPTrunc);
  643. INSTKEYWORD(fpext, FPExt);
  644. INSTKEYWORD(uitofp, UIToFP);
  645. INSTKEYWORD(sitofp, SIToFP);
  646. INSTKEYWORD(fptoui, FPToUI);
  647. INSTKEYWORD(fptosi, FPToSI);
  648. INSTKEYWORD(inttoptr, IntToPtr);
  649. INSTKEYWORD(ptrtoint, PtrToInt);
  650. INSTKEYWORD(bitcast, BitCast);
  651. INSTKEYWORD(addrspacecast, AddrSpaceCast);
  652. INSTKEYWORD(select, Select);
  653. INSTKEYWORD(va_arg, VAArg);
  654. INSTKEYWORD(ret, Ret);
  655. INSTKEYWORD(br, Br);
  656. INSTKEYWORD(switch, Switch);
  657. INSTKEYWORD(indirectbr, IndirectBr);
  658. INSTKEYWORD(invoke, Invoke);
  659. INSTKEYWORD(resume, Resume);
  660. INSTKEYWORD(unreachable, Unreachable);
  661. INSTKEYWORD(alloca, Alloca);
  662. INSTKEYWORD(load, Load);
  663. INSTKEYWORD(store, Store);
  664. INSTKEYWORD(cmpxchg, AtomicCmpXchg);
  665. INSTKEYWORD(atomicrmw, AtomicRMW);
  666. INSTKEYWORD(fence, Fence);
  667. INSTKEYWORD(getelementptr, GetElementPtr);
  668. INSTKEYWORD(extractelement, ExtractElement);
  669. INSTKEYWORD(insertelement, InsertElement);
  670. INSTKEYWORD(shufflevector, ShuffleVector);
  671. INSTKEYWORD(extractvalue, ExtractValue);
  672. INSTKEYWORD(insertvalue, InsertValue);
  673. INSTKEYWORD(landingpad, LandingPad);
  674. #undef INSTKEYWORD
  675. #define DWKEYWORD(TYPE, TOKEN) \
  676. do { \
  677. if (Keyword.startswith("DW_" #TYPE "_")) { \
  678. StrVal.assign(Keyword.begin(), Keyword.end()); \
  679. return lltok::TOKEN; \
  680. } \
  681. } while (false)
  682. DWKEYWORD(TAG, DwarfTag);
  683. DWKEYWORD(ATE, DwarfAttEncoding);
  684. DWKEYWORD(VIRTUALITY, DwarfVirtuality);
  685. DWKEYWORD(LANG, DwarfLang);
  686. DWKEYWORD(OP, DwarfOp);
  687. #undef DWKEYWORD
  688. if (Keyword.startswith("DIFlag")) {
  689. StrVal.assign(Keyword.begin(), Keyword.end());
  690. return lltok::DIFlag;
  691. }
  692. // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by
  693. // the CFE to avoid forcing it to deal with 64-bit numbers.
  694. if ((TokStart[0] == 'u' || TokStart[0] == 's') &&
  695. TokStart[1] == '0' && TokStart[2] == 'x' &&
  696. isxdigit(static_cast<unsigned char>(TokStart[3]))) {
  697. int len = CurPtr-TokStart-3;
  698. uint32_t bits = len * 4;
  699. StringRef HexStr(TokStart + 3, len);
  700. if (!std::all_of(HexStr.begin(), HexStr.end(), isxdigit)) {
  701. // Bad token, return it as an error.
  702. CurPtr = TokStart+3;
  703. return lltok::Error;
  704. }
  705. APInt Tmp(bits, HexStr, 16);
  706. uint32_t activeBits = Tmp.getActiveBits();
  707. if (activeBits > 0 && activeBits < bits)
  708. Tmp = Tmp.trunc(activeBits);
  709. APSIntVal = APSInt(Tmp, TokStart[0] == 'u');
  710. return lltok::APSInt;
  711. }
  712. // If this is "cc1234", return this as just "cc".
  713. if (TokStart[0] == 'c' && TokStart[1] == 'c') {
  714. CurPtr = TokStart+2;
  715. return lltok::kw_cc;
  716. }
  717. // Finally, if this isn't known, return an error.
  718. CurPtr = TokStart+1;
  719. return lltok::Error;
  720. }
  721. /// Lex all tokens that start with a 0x prefix, knowing they match and are not
  722. /// labels.
  723. /// HexFPConstant 0x[0-9A-Fa-f]+
  724. /// HexFP80Constant 0xK[0-9A-Fa-f]+
  725. /// HexFP128Constant 0xL[0-9A-Fa-f]+
  726. /// HexPPC128Constant 0xM[0-9A-Fa-f]+
  727. /// HexHalfConstant 0xH[0-9A-Fa-f]+
  728. lltok::Kind LLLexer::Lex0x() {
  729. CurPtr = TokStart + 2;
  730. char Kind;
  731. if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H') {
  732. Kind = *CurPtr++;
  733. } else {
  734. Kind = 'J';
  735. }
  736. if (!isxdigit(static_cast<unsigned char>(CurPtr[0]))) {
  737. // Bad token, return it as an error.
  738. CurPtr = TokStart+1;
  739. return lltok::Error;
  740. }
  741. while (isxdigit(static_cast<unsigned char>(CurPtr[0])))
  742. ++CurPtr;
  743. if (Kind == 'J') {
  744. // HexFPConstant - Floating point constant represented in IEEE format as a
  745. // hexadecimal number for when exponential notation is not precise enough.
  746. // Half, Float, and double only.
  747. APFloatVal = APFloat(BitsToDouble(HexIntToVal(TokStart+2, CurPtr)));
  748. return lltok::APFloat;
  749. }
  750. uint64_t Pair[2];
  751. switch (Kind) {
  752. default: llvm_unreachable("Unknown kind!");
  753. case 'K':
  754. // F80HexFPConstant - x87 long double in hexadecimal format (10 bytes)
  755. FP80HexToIntPair(TokStart+3, CurPtr, Pair);
  756. APFloatVal = APFloat(APFloat::x87DoubleExtended, APInt(80, Pair));
  757. return lltok::APFloat;
  758. case 'L':
  759. // F128HexFPConstant - IEEE 128-bit in hexadecimal format (16 bytes)
  760. HexToIntPair(TokStart+3, CurPtr, Pair);
  761. APFloatVal = APFloat(APFloat::IEEEquad, APInt(128, Pair));
  762. return lltok::APFloat;
  763. case 'M':
  764. // PPC128HexFPConstant - PowerPC 128-bit in hexadecimal format (16 bytes)
  765. HexToIntPair(TokStart+3, CurPtr, Pair);
  766. APFloatVal = APFloat(APFloat::PPCDoubleDouble, APInt(128, Pair));
  767. return lltok::APFloat;
  768. case 'H':
  769. APFloatVal = APFloat(APFloat::IEEEhalf,
  770. APInt(16,HexIntToVal(TokStart+3, CurPtr)));
  771. return lltok::APFloat;
  772. }
  773. }
  774. /// Lex tokens for a label or a numeric constant, possibly starting with -.
  775. /// Label [-a-zA-Z$._0-9]+:
  776. /// NInteger -[0-9]+
  777. /// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
  778. /// PInteger [0-9]+
  779. /// HexFPConstant 0x[0-9A-Fa-f]+
  780. /// HexFP80Constant 0xK[0-9A-Fa-f]+
  781. /// HexFP128Constant 0xL[0-9A-Fa-f]+
  782. /// HexPPC128Constant 0xM[0-9A-Fa-f]+
  783. lltok::Kind LLLexer::LexDigitOrNegative() {
  784. // If the letter after the negative is not a number, this is probably a label.
  785. if (!isdigit(static_cast<unsigned char>(TokStart[0])) &&
  786. !isdigit(static_cast<unsigned char>(CurPtr[0]))) {
  787. // Okay, this is not a number after the -, it's probably a label.
  788. if (const char *End = isLabelTail(CurPtr)) {
  789. StrVal.assign(TokStart, End-1);
  790. CurPtr = End;
  791. return lltok::LabelStr;
  792. }
  793. return lltok::Error;
  794. }
  795. // At this point, it is either a label, int or fp constant.
  796. // Skip digits, we have at least one.
  797. for (; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
  798. /*empty*/;
  799. // Check to see if this really is a label afterall, e.g. "-1:".
  800. if (isLabelChar(CurPtr[0]) || CurPtr[0] == ':') {
  801. if (const char *End = isLabelTail(CurPtr)) {
  802. StrVal.assign(TokStart, End-1);
  803. CurPtr = End;
  804. return lltok::LabelStr;
  805. }
  806. }
  807. // If the next character is a '.', then it is a fp value, otherwise its
  808. // integer.
  809. if (CurPtr[0] != '.') {
  810. if (TokStart[0] == '0' && TokStart[1] == 'x')
  811. return Lex0x();
  812. APSIntVal = APSInt(StringRef(TokStart, CurPtr - TokStart));
  813. return lltok::APSInt;
  814. }
  815. ++CurPtr;
  816. // Skip over [0-9]*([eE][-+]?[0-9]+)?
  817. while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
  818. if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
  819. if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
  820. ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
  821. isdigit(static_cast<unsigned char>(CurPtr[2])))) {
  822. CurPtr += 2;
  823. while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
  824. }
  825. }
  826. APFloatVal = APFloat(std::atof(TokStart));
  827. return lltok::APFloat;
  828. }
  829. /// Lex a floating point constant starting with +.
  830. /// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
  831. lltok::Kind LLLexer::LexPositive() {
  832. // If the letter after the negative is a number, this is probably not a
  833. // label.
  834. if (!isdigit(static_cast<unsigned char>(CurPtr[0])))
  835. return lltok::Error;
  836. // Skip digits.
  837. for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
  838. /*empty*/;
  839. // At this point, we need a '.'.
  840. if (CurPtr[0] != '.') {
  841. CurPtr = TokStart+1;
  842. return lltok::Error;
  843. }
  844. ++CurPtr;
  845. // Skip over [0-9]*([eE][-+]?[0-9]+)?
  846. while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
  847. if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
  848. if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
  849. ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
  850. isdigit(static_cast<unsigned char>(CurPtr[2])))) {
  851. CurPtr += 2;
  852. while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
  853. }
  854. }
  855. APFloatVal = APFloat(std::atof(TokStart));
  856. return lltok::APFloat;
  857. }