Home | History | Annotate | Line # | Download | only in AsmParser
      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_LIB_ASMPARSER_LLLEXER_H
     14 #define LLVM_LIB_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;
     40     Type *TyVal;
     41     APFloat APFloatVal;
     42     APSInt  APSIntVal;
     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;
     47 
     48   public:
     49     explicit LLLexer(StringRef StartBuf, SourceMgr &SM, SMDiagnostic &,
     50                      LLVMContext &C);
     51 
     52     lltok::Kind Lex() {
     53       return CurKind = LexToken();
     54     }
     55 
     56     typedef SMLoc LocTy;
     57     LocTy getLoc() const { return SMLoc::getFromPointer(TokStart); }
     58     lltok::Kind getKind() const { return CurKind; }
     59     const std::string &getStrVal() const { return StrVal; }
     60     Type *getTyVal() const { return TyVal; }
     61     unsigned getUIntVal() const { return UIntVal; }
     62     const APSInt &getAPSIntVal() const { return APSIntVal; }
     63     const APFloat &getAPFloatVal() const { return APFloatVal; }
     64 
     65     void setIgnoreColonInIdentifiers(bool val) {
     66       IgnoreColonInIdentifiers = val;
     67     }
     68 
     69     bool Error(LocTy ErrorLoc, const Twine &Msg) const;
     70     bool Error(const Twine &Msg) const { return Error(getLoc(), Msg); }
     71 
     72     void Warning(LocTy WarningLoc, const Twine &Msg) const;
     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