1 //===- LLLexer.h - Lexer for LLVM Assembly Files ----------------*- C++ -*-===// 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 // This class represents the Lexer for .ll files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_ASMPARSER_LLLEXER_H 14 #define LLVM_ASMPARSER_LLLEXER_H 15 16 #include "LLToken.h" 17 #include "llvm/ADT/APFloat.h" 18 #include "llvm/ADT/APSInt.h" 19 #include "llvm/Support/SMLoc.h" 20 #include <string> 21 22 namespace llvm { 23 class Type; 24 class SMDiagnostic; 25 class SourceMgr; 26 class LLVMContext; 27 28 class LLLexer { 29 const char *CurPtr; 30 StringRef CurBuf; 31 SMDiagnostic &ErrorInfo; 32 SourceMgr &SM; 33 LLVMContext &Context; 34 35 // Information about the current token. 36 const char *TokStart; 37 lltok::Kind CurKind; 38 std::string StrVal; 39 unsigned UIntVal = 0; 40 Type *TyVal = nullptr; 41 APFloat APFloatVal{0.0}; 42 APSInt APSIntVal{0}; 43 44 // When false (default), an identifier ending in ':' is a label token. 45 // When true, the ':' is treated as a separate token. 46 bool IgnoreColonInIdentifiers = false; 47 48 public: 49 explicit LLLexer(StringRef StartBuf, SourceMgr &SM, SMDiagnostic &, 50 LLVMContext &C); 51 Lex()52 lltok::Kind Lex() { 53 return CurKind = LexToken(); 54 } 55 56 typedef SMLoc LocTy; getLoc()57 LocTy getLoc() const { return SMLoc::getFromPointer(TokStart); } getKind()58 lltok::Kind getKind() const { return CurKind; } getStrVal()59 const std::string &getStrVal() const { return StrVal; } getTyVal()60 Type *getTyVal() const { return TyVal; } getUIntVal()61 unsigned getUIntVal() const { return UIntVal; } getAPSIntVal()62 const APSInt &getAPSIntVal() const { return APSIntVal; } getAPFloatVal()63 const APFloat &getAPFloatVal() const { return APFloatVal; } 64 setIgnoreColonInIdentifiers(bool val)65 void setIgnoreColonInIdentifiers(bool val) { 66 IgnoreColonInIdentifiers = val; 67 } 68 69 bool Error(LocTy ErrorLoc, const Twine &Msg) const; Error(const Twine & Msg)70 bool Error(const Twine &Msg) const { return Error(getLoc(), Msg); } 71 72 void Warning(LocTy WarningLoc, const Twine &Msg) const; Warning(const Twine & Msg)73 void Warning(const Twine &Msg) const { return Warning(getLoc(), Msg); } 74 75 private: 76 lltok::Kind LexToken(); 77 78 int getNextChar(); 79 void SkipLineComment(); 80 lltok::Kind ReadString(lltok::Kind kind); 81 bool ReadVarName(); 82 83 lltok::Kind LexIdentifier(); 84 lltok::Kind LexDigitOrNegative(); 85 lltok::Kind LexPositive(); 86 lltok::Kind LexAt(); 87 lltok::Kind LexDollar(); 88 lltok::Kind LexExclaim(); 89 lltok::Kind LexPercent(); 90 lltok::Kind LexUIntID(lltok::Kind Token); 91 lltok::Kind LexVar(lltok::Kind Var, lltok::Kind VarID); 92 lltok::Kind LexQuote(); 93 lltok::Kind Lex0x(); 94 lltok::Kind LexHash(); 95 lltok::Kind LexCaret(); 96 97 uint64_t atoull(const char *Buffer, const char *End); 98 uint64_t HexIntToVal(const char *Buffer, const char *End); 99 void HexToIntPair(const char *Buffer, const char *End, uint64_t Pair[2]); 100 void FP80HexToIntPair(const char *Buffer, const char *End, uint64_t Pair[2]); 101 }; 102 } // end namespace llvm 103 104 #endif 105