LLVM 22.0.0git
LLLexer.cpp
Go to the documentation of this file.
1//===- LLLexer.cpp - Lexer for .ll Files ----------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Implement the Lexer for .ll files.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/APInt.h"
15#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/Twine.h"
19#include "llvm/IR/Instruction.h"
22#include <cassert>
23#include <cctype>
24#include <cstdio>
25
26using namespace llvm;
27
28// Both the lexer and parser can issue error messages. If the lexer issues a
29// lexer error, since we do not terminate execution immediately, usually that
30// is followed by the parser issuing a parser error. However, the error issued
31// by the lexer is more relevant in that case as opposed to potentially more
32// generic parser error. So instead of always recording the last error message
33// use the `Priority` to establish a priority, with Lexer > Parser > None. We
34// record the issued message only if the message has same or higher priority
35// than the existing one. This prevents lexer errors from being overwritten by
36// parser errors.
37void LLLexer::Error(LocTy ErrorLoc, const Twine &Msg,
38 LLLexer::ErrorPriority Priority) {
39 if (Priority < ErrorInfo.Priority)
40 return;
41 ErrorInfo.Error = SM.GetMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
42 ErrorInfo.Priority = Priority;
43}
44
45void LLLexer::Warning(LocTy WarningLoc, const Twine &Msg) const {
46 SM.PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
47}
48
49//===----------------------------------------------------------------------===//
50// Helper functions.
51//===----------------------------------------------------------------------===//
52
53// atoull - Convert an ascii string of decimal digits into the unsigned long
54// long representation... this does not have to do input error checking,
55// because we know that the input will be matched by a suitable regex...
56//
57uint64_t LLLexer::atoull(const char *Buffer, const char *End) {
58 uint64_t Result = 0;
59 for (; Buffer != End; Buffer++) {
60 uint64_t OldRes = Result;
61 Result *= 10;
62 Result += *Buffer-'0';
63 if (Result < OldRes) { // overflow detected.
64 LexError("constant bigger than 64 bits detected");
65 return 0;
66 }
67 }
68 return Result;
69}
70
71uint64_t LLLexer::HexIntToVal(const char *Buffer, const char *End) {
72 uint64_t Result = 0;
73 for (; Buffer != End; ++Buffer) {
74 uint64_t OldRes = Result;
75 Result *= 16;
76 Result += hexDigitValue(*Buffer);
77
78 if (Result < OldRes) { // overflow detected.
79 LexError("constant bigger than 64 bits detected");
80 return 0;
81 }
82 }
83 return Result;
84}
85
86void LLLexer::HexToIntPair(const char *Buffer, const char *End,
87 uint64_t Pair[2]) {
88 Pair[0] = 0;
89 if (End - Buffer >= 16) {
90 for (int i = 0; i < 16; i++, Buffer++) {
91 assert(Buffer != End);
92 Pair[0] *= 16;
93 Pair[0] += hexDigitValue(*Buffer);
94 }
95 }
96 Pair[1] = 0;
97 for (int i = 0; i < 16 && Buffer != End; i++, Buffer++) {
98 Pair[1] *= 16;
99 Pair[1] += hexDigitValue(*Buffer);
100 }
101 if (Buffer != End)
102 LexError("constant bigger than 128 bits detected");
103}
104
105/// FP80HexToIntPair - translate an 80 bit FP80 number (20 hexits) into
106/// { low64, high16 } as usual for an APInt.
107void LLLexer::FP80HexToIntPair(const char *Buffer, const char *End,
108 uint64_t Pair[2]) {
109 Pair[1] = 0;
110 for (int i=0; i<4 && Buffer != End; i++, Buffer++) {
111 assert(Buffer != End);
112 Pair[1] *= 16;
113 Pair[1] += hexDigitValue(*Buffer);
114 }
115 Pair[0] = 0;
116 for (int i = 0; i < 16 && Buffer != End; i++, Buffer++) {
117 Pair[0] *= 16;
118 Pair[0] += hexDigitValue(*Buffer);
119 }
120 if (Buffer != End)
121 LexError("constant bigger than 128 bits detected");
122}
123
124// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
125// appropriate character.
126static void UnEscapeLexed(std::string &Str) {
127 if (Str.empty()) return;
128
129 char *Buffer = &Str[0], *EndBuffer = Buffer+Str.size();
130 char *BOut = Buffer;
131 for (char *BIn = Buffer; BIn != EndBuffer; ) {
132 if (BIn[0] == '\\') {
133 if (BIn < EndBuffer-1 && BIn[1] == '\\') {
134 *BOut++ = '\\'; // Two \ becomes one
135 BIn += 2;
136 } else if (BIn < EndBuffer-2 &&
137 isxdigit(static_cast<unsigned char>(BIn[1])) &&
138 isxdigit(static_cast<unsigned char>(BIn[2]))) {
139 *BOut = hexDigitValue(BIn[1]) * 16 + hexDigitValue(BIn[2]);
140 BIn += 3; // Skip over handled chars
141 ++BOut;
142 } else {
143 *BOut++ = *BIn++;
144 }
145 } else {
146 *BOut++ = *BIn++;
147 }
148 }
149 Str.resize(BOut-Buffer);
150}
151
152/// isLabelChar - Return true for [-a-zA-Z$._0-9].
153static bool isLabelChar(char C) {
154 return isalnum(static_cast<unsigned char>(C)) || C == '-' || C == '$' ||
155 C == '.' || C == '_';
156}
157
158/// isLabelTail - Return true if this pointer points to a valid end of a label.
159static const char *isLabelTail(const char *CurPtr) {
160 while (true) {
161 if (CurPtr[0] == ':') return CurPtr+1;
162 if (!isLabelChar(CurPtr[0])) return nullptr;
163 ++CurPtr;
164 }
165}
166
167//===----------------------------------------------------------------------===//
168// Lexer definition.
169//===----------------------------------------------------------------------===//
170
172 LLVMContext &C)
173 : CurBuf(StartBuf), ErrorInfo(Err), SM(SM), Context(C) {
174 CurPtr = CurBuf.begin();
175}
176
177int LLLexer::getNextChar() {
178 char CurChar = *CurPtr++;
179 switch (CurChar) {
180 default: return (unsigned char)CurChar;
181 case 0:
182 // A nul character in the stream is either the end of the current buffer or
183 // a random nul in the file. Disambiguate that here.
184 if (CurPtr-1 != CurBuf.end())
185 return 0; // Just whitespace.
186
187 // Otherwise, return end of file.
188 --CurPtr; // Another call to lex will return EOF again.
189 return EOF;
190 }
191}
192
193lltok::Kind LLLexer::LexToken() {
194 while (true) {
195 TokStart = CurPtr;
196
197 int CurChar = getNextChar();
198 switch (CurChar) {
199 default:
200 // Handle letters: [a-zA-Z_]
201 if (isalpha(static_cast<unsigned char>(CurChar)) || CurChar == '_')
202 return LexIdentifier();
203 return lltok::Error;
204 case EOF: return lltok::Eof;
205 case 0:
206 case ' ':
207 case '\t':
208 case '\n':
209 case '\r':
210 // Ignore whitespace.
211 continue;
212 case '+': return LexPositive();
213 case '@': return LexAt();
214 case '$': return LexDollar();
215 case '%': return LexPercent();
216 case '"': return LexQuote();
217 case '.':
218 if (const char *Ptr = isLabelTail(CurPtr)) {
219 CurPtr = Ptr;
220 StrVal.assign(TokStart, CurPtr-1);
221 return lltok::LabelStr;
222 }
223 if (CurPtr[0] == '.' && CurPtr[1] == '.') {
224 CurPtr += 2;
225 return lltok::dotdotdot;
226 }
227 return lltok::Error;
228 case ';':
229 SkipLineComment();
230 continue;
231 case '!': return LexExclaim();
232 case '^':
233 return LexCaret();
234 case ':':
235 return lltok::colon;
236 case '#': return LexHash();
237 case '0': case '1': case '2': case '3': case '4':
238 case '5': case '6': case '7': case '8': case '9':
239 case '-':
240 return LexDigitOrNegative();
241 case '=': return lltok::equal;
242 case '[': return lltok::lsquare;
243 case ']': return lltok::rsquare;
244 case '{': return lltok::lbrace;
245 case '}': return lltok::rbrace;
246 case '<': return lltok::less;
247 case '>': return lltok::greater;
248 case '(': return lltok::lparen;
249 case ')': return lltok::rparen;
250 case ',': return lltok::comma;
251 case '*': return lltok::star;
252 case '|': return lltok::bar;
253 case '/':
254 if (getNextChar() != '*')
255 return lltok::Error;
256 if (SkipCComment())
257 return lltok::Error;
258 continue;
259 }
260 }
261}
262
263void LLLexer::SkipLineComment() {
264 while (true) {
265 if (CurPtr[0] == '\n' || CurPtr[0] == '\r' || getNextChar() == EOF)
266 return;
267 }
268}
269
270/// This skips C-style /**/ comments. Returns true if there
271/// was an error.
272bool LLLexer::SkipCComment() {
273 while (true) {
274 int CurChar = getNextChar();
275 switch (CurChar) {
276 case EOF:
277 LexError("unterminated comment");
278 return true;
279 case '*':
280 // End of the comment?
281 CurChar = getNextChar();
282 if (CurChar == '/')
283 return false;
284 if (CurChar == EOF) {
285 LexError("unterminated comment");
286 return true;
287 }
288 }
289 }
290}
291
292/// Lex all tokens that start with an @ character.
293/// GlobalVar @\"[^\"]*\"
294/// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]*
295/// GlobalVarID @[0-9]+
296lltok::Kind LLLexer::LexAt() {
297 return LexVar(lltok::GlobalVar, lltok::GlobalID);
298}
299
300lltok::Kind LLLexer::LexDollar() {
301 if (const char *Ptr = isLabelTail(TokStart)) {
302 CurPtr = Ptr;
303 StrVal.assign(TokStart, CurPtr - 1);
304 return lltok::LabelStr;
305 }
306
307 // Handle DollarStringConstant: $\"[^\"]*\"
308 if (CurPtr[0] == '"') {
309 ++CurPtr;
310
311 while (true) {
312 int CurChar = getNextChar();
313
314 if (CurChar == EOF) {
315 LexError("end of file in COMDAT variable name");
316 return lltok::Error;
317 }
318 if (CurChar == '"') {
319 StrVal.assign(TokStart + 2, CurPtr - 1);
320 UnEscapeLexed(StrVal);
321 if (StringRef(StrVal).contains(0)) {
322 LexError("NUL character is not allowed in names");
323 return lltok::Error;
324 }
325 return lltok::ComdatVar;
326 }
327 }
328 }
329
330 // Handle ComdatVarName: $[-a-zA-Z$._][-a-zA-Z$._0-9]*
331 if (ReadVarName())
332 return lltok::ComdatVar;
333
334 return lltok::Error;
335}
336
337/// ReadString - Read a string until the closing quote.
338lltok::Kind LLLexer::ReadString(lltok::Kind kind) {
339 const char *Start = CurPtr;
340 while (true) {
341 int CurChar = getNextChar();
342
343 if (CurChar == EOF) {
344 LexError("end of file in string constant");
345 return lltok::Error;
346 }
347 if (CurChar == '"') {
348 StrVal.assign(Start, CurPtr-1);
349 UnEscapeLexed(StrVal);
350 return kind;
351 }
352 }
353}
354
355/// ReadVarName - Read the rest of a token containing a variable name.
356bool LLLexer::ReadVarName() {
357 const char *NameStart = CurPtr;
358 if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
359 CurPtr[0] == '-' || CurPtr[0] == '$' ||
360 CurPtr[0] == '.' || CurPtr[0] == '_') {
361 ++CurPtr;
362 while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
363 CurPtr[0] == '-' || CurPtr[0] == '$' ||
364 CurPtr[0] == '.' || CurPtr[0] == '_')
365 ++CurPtr;
366
367 StrVal.assign(NameStart, CurPtr);
368 return true;
369 }
370 return false;
371}
372
373// Lex an ID: [0-9]+. On success, the ID is stored in UIntVal and Token is
374// returned, otherwise the Error token is returned.
375lltok::Kind LLLexer::LexUIntID(lltok::Kind Token) {
376 if (!isdigit(static_cast<unsigned char>(CurPtr[0])))
377 return lltok::Error;
378
379 for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
380 /*empty*/;
381
382 uint64_t Val = atoull(TokStart + 1, CurPtr);
383 if ((unsigned)Val != Val)
384 LexError("invalid value number (too large)");
385 UIntVal = unsigned(Val);
386 return Token;
387}
388
389lltok::Kind LLLexer::LexVar(lltok::Kind Var, lltok::Kind VarID) {
390 // Handle StringConstant: \"[^\"]*\"
391 if (CurPtr[0] == '"') {
392 ++CurPtr;
393
394 while (true) {
395 int CurChar = getNextChar();
396
397 if (CurChar == EOF) {
398 LexError("end of file in global variable name");
399 return lltok::Error;
400 }
401 if (CurChar == '"') {
402 StrVal.assign(TokStart+2, CurPtr-1);
403 UnEscapeLexed(StrVal);
404 if (StringRef(StrVal).contains(0)) {
405 LexError("NUL character is not allowed in names");
406 return lltok::Error;
407 }
408 return Var;
409 }
410 }
411 }
412
413 // Handle VarName: [-a-zA-Z$._][-a-zA-Z$._0-9]*
414 if (ReadVarName())
415 return Var;
416
417 // Handle VarID: [0-9]+
418 return LexUIntID(VarID);
419}
420
421/// Lex all tokens that start with a % character.
422/// LocalVar ::= %\"[^\"]*\"
423/// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]*
424/// LocalVarID ::= %[0-9]+
425lltok::Kind LLLexer::LexPercent() {
426 return LexVar(lltok::LocalVar, lltok::LocalVarID);
427}
428
429/// Lex all tokens that start with a " character.
430/// QuoteLabel "[^"]+":
431/// StringConstant "[^"]*"
432lltok::Kind LLLexer::LexQuote() {
433 lltok::Kind kind = ReadString(lltok::StringConstant);
434 if (kind == lltok::Error || kind == lltok::Eof)
435 return kind;
436
437 if (CurPtr[0] == ':') {
438 ++CurPtr;
439 if (StringRef(StrVal).contains(0)) {
440 LexError("NUL character is not allowed in names");
441 kind = lltok::Error;
442 } else {
443 kind = lltok::LabelStr;
444 }
445 }
446
447 return kind;
448}
449
450/// Lex all tokens that start with a ! character.
451/// !foo
452/// !
453lltok::Kind LLLexer::LexExclaim() {
454 // Lex a metadata name as a MetadataVar.
455 if (isalpha(static_cast<unsigned char>(CurPtr[0])) ||
456 CurPtr[0] == '-' || CurPtr[0] == '$' ||
457 CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\') {
458 ++CurPtr;
459 while (isalnum(static_cast<unsigned char>(CurPtr[0])) ||
460 CurPtr[0] == '-' || CurPtr[0] == '$' ||
461 CurPtr[0] == '.' || CurPtr[0] == '_' || CurPtr[0] == '\\')
462 ++CurPtr;
463
464 StrVal.assign(TokStart+1, CurPtr); // Skip !
465 UnEscapeLexed(StrVal);
466 return lltok::MetadataVar;
467 }
468 return lltok::exclaim;
469}
470
471/// Lex all tokens that start with a ^ character.
472/// SummaryID ::= ^[0-9]+
473lltok::Kind LLLexer::LexCaret() {
474 // Handle SummaryID: ^[0-9]+
475 return LexUIntID(lltok::SummaryID);
476}
477
478/// Lex all tokens that start with a # character.
479/// AttrGrpID ::= #[0-9]+
480/// Hash ::= #
481lltok::Kind LLLexer::LexHash() {
482 // Handle AttrGrpID: #[0-9]+
483 if (isdigit(static_cast<unsigned char>(CurPtr[0])))
484 return LexUIntID(lltok::AttrGrpID);
485 return lltok::hash;
486}
487
488/// Lex a label, integer type, keyword, or hexadecimal integer constant.
489/// Label [-a-zA-Z$._0-9]+:
490/// IntegerType i[0-9]+
491/// Keyword sdiv, float, ...
492/// HexIntConstant [us]0x[0-9A-Fa-f]+
493lltok::Kind LLLexer::LexIdentifier() {
494 const char *StartChar = CurPtr;
495 const char *IntEnd = CurPtr[-1] == 'i' ? nullptr : StartChar;
496 const char *KeywordEnd = nullptr;
497
498 for (; isLabelChar(*CurPtr); ++CurPtr) {
499 // If we decide this is an integer, remember the end of the sequence.
500 if (!IntEnd && !isdigit(static_cast<unsigned char>(*CurPtr)))
501 IntEnd = CurPtr;
502 if (!KeywordEnd && !isalnum(static_cast<unsigned char>(*CurPtr)) &&
503 *CurPtr != '_')
504 KeywordEnd = CurPtr;
505 }
506
507 // If we stopped due to a colon, unless we were directed to ignore it,
508 // this really is a label.
509 if (!IgnoreColonInIdentifiers && *CurPtr == ':') {
510 StrVal.assign(StartChar-1, CurPtr++);
511 return lltok::LabelStr;
512 }
513
514 // Otherwise, this wasn't a label. If this was valid as an integer type,
515 // return it.
516 if (!IntEnd) IntEnd = CurPtr;
517 if (IntEnd != StartChar) {
518 CurPtr = IntEnd;
519 uint64_t NumBits = atoull(StartChar, CurPtr);
520 if (NumBits < IntegerType::MIN_INT_BITS ||
521 NumBits > IntegerType::MAX_INT_BITS) {
522 LexError("bitwidth for integer type out of range");
523 return lltok::Error;
524 }
525 TyVal = IntegerType::get(Context, NumBits);
526 return lltok::Type;
527 }
528
529 // Otherwise, this was a letter sequence. See which keyword this is.
530 if (!KeywordEnd) KeywordEnd = CurPtr;
531 CurPtr = KeywordEnd;
532 --StartChar;
533 StringRef Keyword(StartChar, CurPtr - StartChar);
534
535#define KEYWORD(STR) \
536 do { \
537 if (Keyword == #STR) \
538 return lltok::kw_##STR; \
539 } while (false)
540
541 KEYWORD(true); KEYWORD(false);
542 KEYWORD(declare); KEYWORD(define);
543 KEYWORD(global); KEYWORD(constant);
544
545 KEYWORD(dso_local);
546 KEYWORD(dso_preemptable);
547
548 KEYWORD(private);
549 KEYWORD(internal);
550 KEYWORD(available_externally);
551 KEYWORD(linkonce);
552 KEYWORD(linkonce_odr);
553 KEYWORD(weak); // Use as a linkage, and a modifier for "cmpxchg".
554 KEYWORD(weak_odr);
555 KEYWORD(appending);
556 KEYWORD(dllimport);
557 KEYWORD(dllexport);
558 KEYWORD(common);
559 KEYWORD(default);
560 KEYWORD(hidden);
561 KEYWORD(protected);
562 KEYWORD(unnamed_addr);
563 KEYWORD(local_unnamed_addr);
564 KEYWORD(externally_initialized);
565 KEYWORD(extern_weak);
566 KEYWORD(external);
567 KEYWORD(thread_local);
568 KEYWORD(localdynamic);
569 KEYWORD(initialexec);
570 KEYWORD(localexec);
571 KEYWORD(zeroinitializer);
572 KEYWORD(undef);
573 KEYWORD(null);
574 KEYWORD(none);
575 KEYWORD(poison);
576 KEYWORD(to);
577 KEYWORD(caller);
578 KEYWORD(within);
579 KEYWORD(from);
580 KEYWORD(tail);
581 KEYWORD(musttail);
582 KEYWORD(notail);
583 KEYWORD(target);
584 KEYWORD(triple);
585 KEYWORD(source_filename);
586 KEYWORD(unwind);
587 KEYWORD(datalayout);
588 KEYWORD(volatile);
589 KEYWORD(atomic);
590 KEYWORD(unordered);
591 KEYWORD(monotonic);
596 KEYWORD(syncscope);
597
598 KEYWORD(nnan);
599 KEYWORD(ninf);
600 KEYWORD(nsz);
601 KEYWORD(arcp);
603 KEYWORD(reassoc);
604 KEYWORD(afn);
605 KEYWORD(fast);
606 KEYWORD(nuw);
607 KEYWORD(nsw);
608 KEYWORD(nusw);
609 KEYWORD(exact);
610 KEYWORD(disjoint);
611 KEYWORD(inbounds);
612 KEYWORD(nneg);
613 KEYWORD(samesign);
614 KEYWORD(inrange);
615 KEYWORD(addrspace);
616 KEYWORD(section);
618 KEYWORD(code_model);
619 KEYWORD(alias);
620 KEYWORD(ifunc);
621 KEYWORD(module);
622 KEYWORD(asm);
623 KEYWORD(sideeffect);
624 KEYWORD(inteldialect);
625 KEYWORD(gc);
626 KEYWORD(prefix);
627 KEYWORD(prologue);
628
629 KEYWORD(no_sanitize_address);
630 KEYWORD(no_sanitize_hwaddress);
631 KEYWORD(sanitize_address_dyninit);
632
633 KEYWORD(ccc);
634 KEYWORD(fastcc);
635 KEYWORD(coldcc);
636 KEYWORD(cfguard_checkcc);
637 KEYWORD(x86_stdcallcc);
638 KEYWORD(x86_fastcallcc);
639 KEYWORD(x86_thiscallcc);
640 KEYWORD(x86_vectorcallcc);
641 KEYWORD(arm_apcscc);
642 KEYWORD(arm_aapcscc);
643 KEYWORD(arm_aapcs_vfpcc);
644 KEYWORD(aarch64_vector_pcs);
645 KEYWORD(aarch64_sve_vector_pcs);
646 KEYWORD(aarch64_sme_preservemost_from_x0);
647 KEYWORD(aarch64_sme_preservemost_from_x1);
648 KEYWORD(aarch64_sme_preservemost_from_x2);
649 KEYWORD(msp430_intrcc);
650 KEYWORD(avr_intrcc);
651 KEYWORD(avr_signalcc);
652 KEYWORD(ptx_kernel);
653 KEYWORD(ptx_device);
654 KEYWORD(spir_kernel);
655 KEYWORD(spir_func);
656 KEYWORD(intel_ocl_bicc);
657 KEYWORD(x86_64_sysvcc);
658 KEYWORD(win64cc);
659 KEYWORD(x86_regcallcc);
660 KEYWORD(swiftcc);
661 KEYWORD(swifttailcc);
662 KEYWORD(anyregcc);
663 KEYWORD(preserve_mostcc);
664 KEYWORD(preserve_allcc);
665 KEYWORD(preserve_nonecc);
666 KEYWORD(ghccc);
667 KEYWORD(x86_intrcc);
668 KEYWORD(hhvmcc);
669 KEYWORD(hhvm_ccc);
670 KEYWORD(cxx_fast_tlscc);
671 KEYWORD(amdgpu_vs);
672 KEYWORD(amdgpu_ls);
673 KEYWORD(amdgpu_hs);
674 KEYWORD(amdgpu_es);
675 KEYWORD(amdgpu_gs);
676 KEYWORD(amdgpu_ps);
677 KEYWORD(amdgpu_cs);
678 KEYWORD(amdgpu_cs_chain);
679 KEYWORD(amdgpu_cs_chain_preserve);
680 KEYWORD(amdgpu_kernel);
681 KEYWORD(amdgpu_gfx);
682 KEYWORD(amdgpu_gfx_whole_wave);
683 KEYWORD(tailcc);
684 KEYWORD(m68k_rtdcc);
685 KEYWORD(graalcc);
686 KEYWORD(riscv_vector_cc);
687 KEYWORD(riscv_vls_cc);
688
689 KEYWORD(cc);
690 KEYWORD(c);
691
692 KEYWORD(attributes);
693 KEYWORD(sync);
694 KEYWORD(async);
695
696#define GET_ATTR_NAMES
697#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
698 KEYWORD(DISPLAY_NAME);
699#include "llvm/IR/Attributes.inc"
700
701 KEYWORD(read);
702 KEYWORD(write);
703 KEYWORD(readwrite);
704 KEYWORD(argmem);
705 KEYWORD(inaccessiblemem);
706 KEYWORD(errnomem);
707 KEYWORD(argmemonly);
708 KEYWORD(inaccessiblememonly);
709 KEYWORD(inaccessiblemem_or_argmemonly);
710 KEYWORD(nocapture);
711 KEYWORD(address_is_null);
712 KEYWORD(address);
713 KEYWORD(provenance);
714 KEYWORD(read_provenance);
715
716 // nofpclass attribute
717 KEYWORD(all);
718 KEYWORD(nan);
719 KEYWORD(snan);
720 KEYWORD(qnan);
721 KEYWORD(inf);
722 // ninf already a keyword
723 KEYWORD(pinf);
724 KEYWORD(norm);
725 KEYWORD(nnorm);
726 KEYWORD(pnorm);
727 // sub already a keyword
728 KEYWORD(nsub);
729 KEYWORD(psub);
730 KEYWORD(zero);
731 KEYWORD(nzero);
732 KEYWORD(pzero);
733
734 KEYWORD(type);
735 KEYWORD(opaque);
736
737 KEYWORD(comdat);
738
739 // Comdat types
740 KEYWORD(any);
741 KEYWORD(exactmatch);
742 KEYWORD(largest);
743 KEYWORD(nodeduplicate);
744 KEYWORD(samesize);
745
746 KEYWORD(eq); KEYWORD(ne); KEYWORD(slt); KEYWORD(sgt); KEYWORD(sle);
747 KEYWORD(sge); KEYWORD(ult); KEYWORD(ugt); KEYWORD(ule); KEYWORD(uge);
748 KEYWORD(oeq); KEYWORD(one); KEYWORD(olt); KEYWORD(ogt); KEYWORD(ole);
749 KEYWORD(oge); KEYWORD(ord); KEYWORD(uno); KEYWORD(ueq); KEYWORD(une);
750
751 KEYWORD(xchg); KEYWORD(nand); KEYWORD(max); KEYWORD(min); KEYWORD(umax);
752 KEYWORD(umin); KEYWORD(fmax); KEYWORD(fmin);
753 KEYWORD(fmaximum);
754 KEYWORD(fminimum);
755 KEYWORD(uinc_wrap);
756 KEYWORD(udec_wrap);
757 KEYWORD(usub_cond);
758 KEYWORD(usub_sat);
759
760 KEYWORD(splat);
761 KEYWORD(vscale);
762 KEYWORD(x);
763 KEYWORD(blockaddress);
764 KEYWORD(dso_local_equivalent);
765 KEYWORD(no_cfi);
766 KEYWORD(ptrauth);
767
768 // Metadata types.
769 KEYWORD(distinct);
770
771 // Use-list order directives.
772 KEYWORD(uselistorder);
773 KEYWORD(uselistorder_bb);
774
775 KEYWORD(personality);
777 KEYWORD(catch);
778 KEYWORD(filter);
779
780 // Summary index keywords.
781 KEYWORD(path);
782 KEYWORD(hash);
783 KEYWORD(gv);
784 KEYWORD(guid);
785 KEYWORD(name);
786 KEYWORD(summaries);
787 KEYWORD(flags);
788 KEYWORD(blockcount);
789 KEYWORD(linkage);
790 KEYWORD(visibility);
791 KEYWORD(notEligibleToImport);
792 KEYWORD(live);
793 KEYWORD(dsoLocal);
794 KEYWORD(canAutoHide);
795 KEYWORD(importType);
796 KEYWORD(definition);
797 KEYWORD(declaration);
799 KEYWORD(insts);
800 KEYWORD(funcFlags);
801 KEYWORD(readNone);
802 KEYWORD(readOnly);
803 KEYWORD(noRecurse);
804 KEYWORD(returnDoesNotAlias);
805 KEYWORD(noInline);
806 KEYWORD(alwaysInline);
807 KEYWORD(noUnwind);
808 KEYWORD(mayThrow);
809 KEYWORD(hasUnknownCall);
810 KEYWORD(mustBeUnreachable);
811 KEYWORD(calls);
812 KEYWORD(callee);
813 KEYWORD(params);
814 KEYWORD(param);
815 KEYWORD(hotness);
816 KEYWORD(unknown);
817 KEYWORD(critical);
818 KEYWORD(relbf);
819 KEYWORD(variable);
820 KEYWORD(vTableFuncs);
821 KEYWORD(virtFunc);
822 KEYWORD(aliasee);
823 KEYWORD(refs);
824 KEYWORD(typeIdInfo);
825 KEYWORD(typeTests);
826 KEYWORD(typeTestAssumeVCalls);
827 KEYWORD(typeCheckedLoadVCalls);
828 KEYWORD(typeTestAssumeConstVCalls);
829 KEYWORD(typeCheckedLoadConstVCalls);
830 KEYWORD(vFuncId);
831 KEYWORD(offset);
832 KEYWORD(args);
833 KEYWORD(typeid);
834 KEYWORD(typeidCompatibleVTable);
835 KEYWORD(summary);
836 KEYWORD(typeTestRes);
837 KEYWORD(kind);
838 KEYWORD(unsat);
839 KEYWORD(byteArray);
840 KEYWORD(inline);
841 KEYWORD(single);
843 KEYWORD(sizeM1BitWidth);
844 KEYWORD(alignLog2);
845 KEYWORD(sizeM1);
846 KEYWORD(bitMask);
847 KEYWORD(inlineBits);
848 KEYWORD(vcall_visibility);
849 KEYWORD(wpdResolutions);
850 KEYWORD(wpdRes);
851 KEYWORD(indir);
852 KEYWORD(singleImpl);
853 KEYWORD(branchFunnel);
854 KEYWORD(singleImplName);
855 KEYWORD(resByArg);
856 KEYWORD(byArg);
857 KEYWORD(uniformRetVal);
858 KEYWORD(uniqueRetVal);
859 KEYWORD(virtualConstProp);
860 KEYWORD(info);
861 KEYWORD(byte);
862 KEYWORD(bit);
863 KEYWORD(varFlags);
864 KEYWORD(callsites);
865 KEYWORD(clones);
866 KEYWORD(stackIds);
867 KEYWORD(allocs);
868 KEYWORD(versions);
869 KEYWORD(memProf);
870 KEYWORD(notcold);
871
872#undef KEYWORD
873
874 // Keywords for types.
875#define TYPEKEYWORD(STR, LLVMTY) \
876 do { \
877 if (Keyword == STR) { \
878 TyVal = LLVMTY; \
879 return lltok::Type; \
880 } \
881 } while (false)
882
883 TYPEKEYWORD("void", Type::getVoidTy(Context));
884 TYPEKEYWORD("half", Type::getHalfTy(Context));
885 TYPEKEYWORD("bfloat", Type::getBFloatTy(Context));
886 TYPEKEYWORD("float", Type::getFloatTy(Context));
887 TYPEKEYWORD("double", Type::getDoubleTy(Context));
888 TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context));
889 TYPEKEYWORD("fp128", Type::getFP128Ty(Context));
890 TYPEKEYWORD("ppc_fp128", Type::getPPC_FP128Ty(Context));
891 TYPEKEYWORD("label", Type::getLabelTy(Context));
892 TYPEKEYWORD("metadata", Type::getMetadataTy(Context));
893 TYPEKEYWORD("x86_amx", Type::getX86_AMXTy(Context));
894 TYPEKEYWORD("token", Type::getTokenTy(Context));
895 TYPEKEYWORD("ptr", PointerType::getUnqual(Context));
896
897#undef TYPEKEYWORD
898
899 // Keywords for instructions.
900#define INSTKEYWORD(STR, Enum) \
901 do { \
902 if (Keyword == #STR) { \
903 UIntVal = Instruction::Enum; \
904 return lltok::kw_##STR; \
905 } \
906 } while (false)
907
908 INSTKEYWORD(fneg, FNeg);
909
910 INSTKEYWORD(add, Add); INSTKEYWORD(fadd, FAdd);
911 INSTKEYWORD(sub, Sub); INSTKEYWORD(fsub, FSub);
912 INSTKEYWORD(mul, Mul); INSTKEYWORD(fmul, FMul);
913 INSTKEYWORD(udiv, UDiv); INSTKEYWORD(sdiv, SDiv); INSTKEYWORD(fdiv, FDiv);
914 INSTKEYWORD(urem, URem); INSTKEYWORD(srem, SRem); INSTKEYWORD(frem, FRem);
915 INSTKEYWORD(shl, Shl); INSTKEYWORD(lshr, LShr); INSTKEYWORD(ashr, AShr);
916 INSTKEYWORD(and, And); INSTKEYWORD(or, Or); INSTKEYWORD(xor, Xor);
917 INSTKEYWORD(icmp, ICmp); INSTKEYWORD(fcmp, FCmp);
918
919 INSTKEYWORD(phi, PHI);
920 INSTKEYWORD(call, Call);
921 INSTKEYWORD(trunc, Trunc);
922 INSTKEYWORD(zext, ZExt);
923 INSTKEYWORD(sext, SExt);
924 INSTKEYWORD(fptrunc, FPTrunc);
925 INSTKEYWORD(fpext, FPExt);
926 INSTKEYWORD(uitofp, UIToFP);
927 INSTKEYWORD(sitofp, SIToFP);
928 INSTKEYWORD(fptoui, FPToUI);
929 INSTKEYWORD(fptosi, FPToSI);
930 INSTKEYWORD(inttoptr, IntToPtr);
931 INSTKEYWORD(ptrtoaddr, PtrToAddr);
932 INSTKEYWORD(ptrtoint, PtrToInt);
933 INSTKEYWORD(bitcast, BitCast);
934 INSTKEYWORD(addrspacecast, AddrSpaceCast);
935 INSTKEYWORD(select, Select);
936 INSTKEYWORD(va_arg, VAArg);
937 INSTKEYWORD(ret, Ret);
938 INSTKEYWORD(br, Br);
939 INSTKEYWORD(switch, Switch);
940 INSTKEYWORD(indirectbr, IndirectBr);
941 INSTKEYWORD(invoke, Invoke);
942 INSTKEYWORD(resume, Resume);
943 INSTKEYWORD(unreachable, Unreachable);
944 INSTKEYWORD(callbr, CallBr);
945
946 INSTKEYWORD(alloca, Alloca);
947 INSTKEYWORD(load, Load);
948 INSTKEYWORD(store, Store);
949 INSTKEYWORD(cmpxchg, AtomicCmpXchg);
950 INSTKEYWORD(atomicrmw, AtomicRMW);
951 INSTKEYWORD(fence, Fence);
952 INSTKEYWORD(getelementptr, GetElementPtr);
953
954 INSTKEYWORD(extractelement, ExtractElement);
955 INSTKEYWORD(insertelement, InsertElement);
956 INSTKEYWORD(shufflevector, ShuffleVector);
957 INSTKEYWORD(extractvalue, ExtractValue);
958 INSTKEYWORD(insertvalue, InsertValue);
959 INSTKEYWORD(landingpad, LandingPad);
960 INSTKEYWORD(cleanupret, CleanupRet);
961 INSTKEYWORD(catchret, CatchRet);
962 INSTKEYWORD(catchswitch, CatchSwitch);
963 INSTKEYWORD(catchpad, CatchPad);
964 INSTKEYWORD(cleanuppad, CleanupPad);
965
966 INSTKEYWORD(freeze, Freeze);
967
968#undef INSTKEYWORD
969
970#define DWKEYWORD(TYPE, TOKEN) \
971 do { \
972 if (Keyword.starts_with("DW_" #TYPE "_")) { \
973 StrVal.assign(Keyword.begin(), Keyword.end()); \
974 return lltok::TOKEN; \
975 } \
976 } while (false)
977
978 DWKEYWORD(TAG, DwarfTag);
979 DWKEYWORD(ATE, DwarfAttEncoding);
980 DWKEYWORD(VIRTUALITY, DwarfVirtuality);
981 DWKEYWORD(LANG, DwarfLang);
982 DWKEYWORD(CC, DwarfCC);
983 DWKEYWORD(OP, DwarfOp);
984 DWKEYWORD(MACINFO, DwarfMacinfo);
985 DWKEYWORD(APPLE_ENUM_KIND, DwarfEnumKind);
986
987#undef DWKEYWORD
988
989// Keywords for debug record types.
990#define DBGRECORDTYPEKEYWORD(STR) \
991 do { \
992 if (Keyword == "dbg_" #STR) { \
993 StrVal = #STR; \
994 return lltok::DbgRecordType; \
995 } \
996 } while (false)
997
999 DBGRECORDTYPEKEYWORD(declare);
1000 DBGRECORDTYPEKEYWORD(assign);
1001 DBGRECORDTYPEKEYWORD(label);
1002#undef DBGRECORDTYPEKEYWORD
1003
1004 if (Keyword.starts_with("DIFlag")) {
1005 StrVal.assign(Keyword.begin(), Keyword.end());
1006 return lltok::DIFlag;
1007 }
1008
1009 if (Keyword.starts_with("DISPFlag")) {
1010 StrVal.assign(Keyword.begin(), Keyword.end());
1011 return lltok::DISPFlag;
1012 }
1013
1014 if (Keyword.starts_with("CSK_")) {
1015 StrVal.assign(Keyword.begin(), Keyword.end());
1016 return lltok::ChecksumKind;
1017 }
1018
1019 if (Keyword == "NoDebug" || Keyword == "FullDebug" ||
1020 Keyword == "LineTablesOnly" || Keyword == "DebugDirectivesOnly") {
1021 StrVal.assign(Keyword.begin(), Keyword.end());
1022 return lltok::EmissionKind;
1023 }
1024
1025 if (Keyword == "GNU" || Keyword == "Apple" || Keyword == "None" ||
1026 Keyword == "Default") {
1027 StrVal.assign(Keyword.begin(), Keyword.end());
1028 return lltok::NameTableKind;
1029 }
1030
1031 if (Keyword == "Binary" || Keyword == "Decimal" || Keyword == "Rational") {
1032 StrVal.assign(Keyword.begin(), Keyword.end());
1033 return lltok::FixedPointKind;
1034 }
1035
1036 // Check for [us]0x[0-9A-Fa-f]+ which are Hexadecimal constant generated by
1037 // the CFE to avoid forcing it to deal with 64-bit numbers.
1038 if ((TokStart[0] == 'u' || TokStart[0] == 's') &&
1039 TokStart[1] == '0' && TokStart[2] == 'x' &&
1040 isxdigit(static_cast<unsigned char>(TokStart[3]))) {
1041 int len = CurPtr-TokStart-3;
1042 uint32_t bits = len * 4;
1043 StringRef HexStr(TokStart + 3, len);
1044 if (!all_of(HexStr, isxdigit)) {
1045 // Bad token, return it as an error.
1046 CurPtr = TokStart+3;
1047 return lltok::Error;
1048 }
1049 APInt Tmp(bits, HexStr, 16);
1050 uint32_t activeBits = Tmp.getActiveBits();
1051 if (activeBits > 0 && activeBits < bits)
1052 Tmp = Tmp.trunc(activeBits);
1053 APSIntVal = APSInt(Tmp, TokStart[0] == 'u');
1054 return lltok::APSInt;
1055 }
1056
1057 // If this is "cc1234", return this as just "cc".
1058 if (TokStart[0] == 'c' && TokStart[1] == 'c') {
1059 CurPtr = TokStart+2;
1060 return lltok::kw_cc;
1061 }
1062
1063 // Finally, if this isn't known, return an error.
1064 CurPtr = TokStart+1;
1065 return lltok::Error;
1066}
1067
1068/// Lex all tokens that start with a 0x prefix, knowing they match and are not
1069/// labels.
1070/// HexFPConstant 0x[0-9A-Fa-f]+
1071/// HexFP80Constant 0xK[0-9A-Fa-f]+
1072/// HexFP128Constant 0xL[0-9A-Fa-f]+
1073/// HexPPC128Constant 0xM[0-9A-Fa-f]+
1074/// HexHalfConstant 0xH[0-9A-Fa-f]+
1075/// HexBFloatConstant 0xR[0-9A-Fa-f]+
1076lltok::Kind LLLexer::Lex0x() {
1077 CurPtr = TokStart + 2;
1078
1079 char Kind;
1080 if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H' ||
1081 CurPtr[0] == 'R') {
1082 Kind = *CurPtr++;
1083 } else {
1084 Kind = 'J';
1085 }
1086
1087 if (!isxdigit(static_cast<unsigned char>(CurPtr[0]))) {
1088 // Bad token, return it as an error.
1089 CurPtr = TokStart+1;
1090 return lltok::Error;
1091 }
1092
1093 while (isxdigit(static_cast<unsigned char>(CurPtr[0])))
1094 ++CurPtr;
1095
1096 if (Kind == 'J') {
1097 // HexFPConstant - Floating point constant represented in IEEE format as a
1098 // hexadecimal number for when exponential notation is not precise enough.
1099 // Half, BFloat, Float, and double only.
1100 APFloatVal = APFloat(APFloat::IEEEdouble(),
1101 APInt(64, HexIntToVal(TokStart + 2, CurPtr)));
1102 return lltok::APFloat;
1103 }
1104
1105 uint64_t Pair[2];
1106 switch (Kind) {
1107 default: llvm_unreachable("Unknown kind!");
1108 case 'K':
1109 // F80HexFPConstant - x87 long double in hexadecimal format (10 bytes)
1110 FP80HexToIntPair(TokStart+3, CurPtr, Pair);
1111 APFloatVal = APFloat(APFloat::x87DoubleExtended(), APInt(80, Pair));
1112 return lltok::APFloat;
1113 case 'L':
1114 // F128HexFPConstant - IEEE 128-bit in hexadecimal format (16 bytes)
1115 HexToIntPair(TokStart+3, CurPtr, Pair);
1116 APFloatVal = APFloat(APFloat::IEEEquad(), APInt(128, Pair));
1117 return lltok::APFloat;
1118 case 'M':
1119 // PPC128HexFPConstant - PowerPC 128-bit in hexadecimal format (16 bytes)
1120 HexToIntPair(TokStart+3, CurPtr, Pair);
1121 APFloatVal = APFloat(APFloat::PPCDoubleDouble(), APInt(128, Pair));
1122 return lltok::APFloat;
1123 case 'H':
1124 APFloatVal = APFloat(APFloat::IEEEhalf(),
1125 APInt(16,HexIntToVal(TokStart+3, CurPtr)));
1126 return lltok::APFloat;
1127 case 'R':
1128 // Brain floating point
1129 APFloatVal = APFloat(APFloat::BFloat(),
1130 APInt(16, HexIntToVal(TokStart + 3, CurPtr)));
1131 return lltok::APFloat;
1132 }
1133}
1134
1135/// Lex tokens for a label or a numeric constant, possibly starting with -.
1136/// Label [-a-zA-Z$._0-9]+:
1137/// NInteger -[0-9]+
1138/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
1139/// PInteger [0-9]+
1140/// HexFPConstant 0x[0-9A-Fa-f]+
1141/// HexFP80Constant 0xK[0-9A-Fa-f]+
1142/// HexFP128Constant 0xL[0-9A-Fa-f]+
1143/// HexPPC128Constant 0xM[0-9A-Fa-f]+
1144lltok::Kind LLLexer::LexDigitOrNegative() {
1145 // If the letter after the negative is not a number, this is probably a label.
1146 if (!isdigit(static_cast<unsigned char>(TokStart[0])) &&
1147 !isdigit(static_cast<unsigned char>(CurPtr[0]))) {
1148 // Okay, this is not a number after the -, it's probably a label.
1149 if (const char *End = isLabelTail(CurPtr)) {
1150 StrVal.assign(TokStart, End-1);
1151 CurPtr = End;
1152 return lltok::LabelStr;
1153 }
1154
1155 return lltok::Error;
1156 }
1157
1158 // At this point, it is either a label, int or fp constant.
1159
1160 // Skip digits, we have at least one.
1161 for (; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
1162 /*empty*/;
1163
1164 // Check if this is a fully-numeric label:
1165 if (isdigit(TokStart[0]) && CurPtr[0] == ':') {
1166 uint64_t Val = atoull(TokStart, CurPtr);
1167 ++CurPtr; // Skip the colon.
1168 if ((unsigned)Val != Val)
1169 LexError("invalid value number (too large)");
1170 UIntVal = unsigned(Val);
1171 return lltok::LabelID;
1172 }
1173
1174 // Check to see if this really is a string label, e.g. "-1:".
1175 if (isLabelChar(CurPtr[0]) || CurPtr[0] == ':') {
1176 if (const char *End = isLabelTail(CurPtr)) {
1177 StrVal.assign(TokStart, End-1);
1178 CurPtr = End;
1179 return lltok::LabelStr;
1180 }
1181 }
1182
1183 // If the next character is a '.', then it is a fp value, otherwise its
1184 // integer.
1185 if (CurPtr[0] != '.') {
1186 if (TokStart[0] == '0' && TokStart[1] == 'x')
1187 return Lex0x();
1188 APSIntVal = APSInt(StringRef(TokStart, CurPtr - TokStart));
1189 return lltok::APSInt;
1190 }
1191
1192 ++CurPtr;
1193
1194 // Skip over [0-9]*([eE][-+]?[0-9]+)?
1195 while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
1196
1197 if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
1198 if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
1199 ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
1200 isdigit(static_cast<unsigned char>(CurPtr[2])))) {
1201 CurPtr += 2;
1202 while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
1203 }
1204 }
1205
1206 APFloatVal = APFloat(APFloat::IEEEdouble(),
1207 StringRef(TokStart, CurPtr - TokStart));
1208 return lltok::APFloat;
1209}
1210
1211/// Lex a floating point constant starting with +.
1212/// FPConstant [-+]?[0-9]+[.][0-9]*([eE][-+]?[0-9]+)?
1213lltok::Kind LLLexer::LexPositive() {
1214 // If the letter after the negative is a number, this is probably not a
1215 // label.
1216 if (!isdigit(static_cast<unsigned char>(CurPtr[0])))
1217 return lltok::Error;
1218
1219 // Skip digits.
1220 for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
1221 /*empty*/;
1222
1223 // At this point, we need a '.'.
1224 if (CurPtr[0] != '.') {
1225 CurPtr = TokStart+1;
1226 return lltok::Error;
1227 }
1228
1229 ++CurPtr;
1230
1231 // Skip over [0-9]*([eE][-+]?[0-9]+)?
1232 while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
1233
1234 if (CurPtr[0] == 'e' || CurPtr[0] == 'E') {
1235 if (isdigit(static_cast<unsigned char>(CurPtr[1])) ||
1236 ((CurPtr[1] == '-' || CurPtr[1] == '+') &&
1237 isdigit(static_cast<unsigned char>(CurPtr[2])))) {
1238 CurPtr += 2;
1239 while (isdigit(static_cast<unsigned char>(CurPtr[0]))) ++CurPtr;
1240 }
1241 }
1242
1243 APFloatVal = APFloat(APFloat::IEEEdouble(),
1244 StringRef(TokStart, CurPtr - TokStart));
1245 return lltok::APFloat;
1246}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Mark last scratch load
AMDGPU Register Bank Select
Rewrite undef for PHI
This file implements a class to represent arbitrary precision integral constant values and operations...
static void cleanup(BlockFrequencyInfoImplBase &BFI)
Clear all memory not needed downstream.
Prepare callbr
static void zero(T &Obj)
static void UnEscapeLexed(std::string &Str)
Definition LLLexer.cpp:126
static const char * isLabelTail(const char *CurPtr)
isLabelTail - Return true if this pointer points to a valid end of a label.
Definition LLLexer.cpp:159
#define DBGRECORDTYPEKEYWORD(STR)
static bool isLabelChar(char C)
isLabelChar - Return true for [-a-zA-Z$._0-9].
Definition LLLexer.cpp:153
#define TYPEKEYWORD(STR, LLVMTY)
#define DWKEYWORD(TYPE, TOKEN)
#define INSTKEYWORD(STR, Enum)
#define KEYWORD(STR)
lazy value info
nvptx lower args
objc arc contract
static constexpr auto TAG
dot regions Print regions of function to dot true view regions View regions of function(with no function bodies)"
static const char * name
This file contains some templates that are useful if you are working with the STL at all.
#define OP(OPC)
Definition Instruction.h:46
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:480
This file contains some functions that are useful when dealing with strings.
static uint64_t allOnes(unsigned int Count)
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:319
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
void Warning(LocTy WarningLoc, const Twine &Msg) const
Definition LLLexer.cpp:45
LLLexer(StringRef StartBuf, SourceMgr &SM, SMDiagnostic &, LLVMContext &C)
Definition LLLexer.cpp:171
SMLoc LocTy
Definition LLLexer.h:69
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:282
This owns the files read by a parser, handles include stacks, and handles diagnostic wrangling.
Definition SourceMgr.h:32
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
iterator end() const
Definition StringRef.h:122
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static LLVM_ABI Type * getX86_AMXTy(LLVMContext &C)
Definition Type.cpp:292
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
Definition Type.cpp:287
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
Definition Type.cpp:288
static LLVM_ABI Type * getPPC_FP128Ty(LLVMContext &C)
Definition Type.cpp:291
static LLVM_ABI Type * getFP128Ty(LLVMContext &C)
Definition Type.cpp:290
static LLVM_ABI Type * getLabelTy(LLVMContext &C)
Definition Type.cpp:282
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:281
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
Definition Type.cpp:286
static LLVM_ABI Type * getX86_FP80Ty(LLVMContext &C)
Definition Type.cpp:289
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
Definition Type.cpp:285
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
Definition Type.cpp:284
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Definition Type.cpp:283
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ StringConstant
Definition LLToken.h:493
@ NameTableKind
Definition LLToken.h:500
@ FixedPointKind
Definition LLToken.h:501
This is an optimization pass for GlobalISel generic memory operations.
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1707
unsigned hexDigitValue(char C)
Interpret the given character C as a hexadecimal digit and return its value.
LLVM_ABI FPClassTest fneg(FPClassTest Mask)
Return the test mask which returns true if the value's sign bit is flipped.
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
Definition DWP.cpp:622
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ FMul
Product of floats.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ FAdd
Sum of floats.
auto partition(R &&Range, UnaryPredicate P)
Provide wrappers to std::partition which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1957
static LLVM_ABI const fltSemantics & PPCDoubleDouble() LLVM_READNONE
Definition APFloat.cpp:269
static LLVM_ABI const fltSemantics & x87DoubleExtended() LLVM_READNONE
Definition APFloat.cpp:289
static LLVM_ABI const fltSemantics & IEEEquad() LLVM_READNONE
Definition APFloat.cpp:268
static LLVM_ABI const fltSemantics & IEEEdouble() LLVM_READNONE
Definition APFloat.cpp:267
static LLVM_ABI const fltSemantics & IEEEhalf() LLVM_READNONE
Definition APFloat.cpp:264
static LLVM_ABI const fltSemantics & BFloat() LLVM_READNONE
Definition APFloat.cpp:265