Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- MCAsmMacro.h - Assembly Macros ---------------------------*- 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. #ifndef LLVM_MC_MCASMMACRO_H
  10. #define LLVM_MC_MCASMMACRO_H
  11.  
  12. #include "llvm/ADT/APInt.h"
  13. #include "llvm/ADT/StringRef.h"
  14. #include "llvm/Support/Debug.h"
  15. #include "llvm/Support/SMLoc.h"
  16. #include <vector>
  17.  
  18. namespace llvm {
  19.  
  20. /// Target independent representation for an assembler token.
  21. class AsmToken {
  22. public:
  23.   enum TokenKind {
  24.     // Markers
  25.     Eof, Error,
  26.  
  27.     // String values.
  28.     Identifier,
  29.     String,
  30.  
  31.     // Integer values.
  32.     Integer,
  33.     BigNum, // larger than 64 bits
  34.  
  35.     // Real values.
  36.     Real,
  37.  
  38.     // Comments
  39.     Comment,
  40.     HashDirective,
  41.     // No-value.
  42.     EndOfStatement,
  43.     Colon,
  44.     Space,
  45.     Plus, Minus, Tilde,
  46.     Slash,     // '/'
  47.     BackSlash, // '\'
  48.     LParen, RParen, LBrac, RBrac, LCurly, RCurly,
  49.     Star, Dot, Comma, Dollar, Equal, EqualEqual,
  50.  
  51.     Pipe, PipePipe, Caret,
  52.     Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash,
  53.     Less, LessEqual, LessLess, LessGreater,
  54.     Greater, GreaterEqual, GreaterGreater, At, MinusGreater,
  55.  
  56.     // MIPS unary expression operators such as %neg.
  57.     PercentCall16, PercentCall_Hi, PercentCall_Lo, PercentDtprel_Hi,
  58.     PercentDtprel_Lo, PercentGot, PercentGot_Disp, PercentGot_Hi, PercentGot_Lo,
  59.     PercentGot_Ofst, PercentGot_Page, PercentGottprel, PercentGp_Rel, PercentHi,
  60.     PercentHigher, PercentHighest, PercentLo, PercentNeg, PercentPcrel_Hi,
  61.     PercentPcrel_Lo, PercentTlsgd, PercentTlsldm, PercentTprel_Hi,
  62.     PercentTprel_Lo
  63.   };
  64.  
  65. private:
  66.   TokenKind Kind;
  67.  
  68.   /// A reference to the entire token contents; this is always a pointer into
  69.   /// a memory buffer owned by the source manager.
  70.   StringRef Str;
  71.  
  72.   APInt IntVal;
  73.  
  74. public:
  75.   AsmToken() = default;
  76.   AsmToken(TokenKind Kind, StringRef Str, APInt IntVal)
  77.       : Kind(Kind), Str(Str), IntVal(std::move(IntVal)) {}
  78.   AsmToken(TokenKind Kind, StringRef Str, int64_t IntVal = 0)
  79.       : Kind(Kind), Str(Str), IntVal(64, IntVal, true) {}
  80.  
  81.   TokenKind getKind() const { return Kind; }
  82.   bool is(TokenKind K) const { return Kind == K; }
  83.   bool isNot(TokenKind K) const { return Kind != K; }
  84.  
  85.   SMLoc getLoc() const;
  86.   SMLoc getEndLoc() const;
  87.   SMRange getLocRange() const;
  88.  
  89.   /// Get the contents of a string token (without quotes).
  90.   StringRef getStringContents() const {
  91.     assert(Kind == String && "This token isn't a string!");
  92.     return Str.slice(1, Str.size() - 1);
  93.   }
  94.  
  95.   /// Get the identifier string for the current token, which should be an
  96.   /// identifier or a string. This gets the portion of the string which should
  97.   /// be used as the identifier, e.g., it does not include the quotes on
  98.   /// strings.
  99.   StringRef getIdentifier() const {
  100.     if (Kind == Identifier)
  101.       return getString();
  102.     return getStringContents();
  103.   }
  104.  
  105.   /// Get the string for the current token, this includes all characters (for
  106.   /// example, the quotes on strings) in the token.
  107.   ///
  108.   /// The returned StringRef points into the source manager's memory buffer, and
  109.   /// is safe to store across calls to Lex().
  110.   StringRef getString() const { return Str; }
  111.  
  112.   // FIXME: Don't compute this in advance, it makes every token larger, and is
  113.   // also not generally what we want (it is nicer for recovery etc. to lex 123br
  114.   // as a single token, then diagnose as an invalid number).
  115.   int64_t getIntVal() const {
  116.     assert(Kind == Integer && "This token isn't an integer!");
  117.     return IntVal.getZExtValue();
  118.   }
  119.  
  120.   APInt getAPIntVal() const {
  121.     assert((Kind == Integer || Kind == BigNum) &&
  122.            "This token isn't an integer!");
  123.     return IntVal;
  124.   }
  125.  
  126.   void dump(raw_ostream &OS) const;
  127. };
  128.  
  129. struct MCAsmMacroParameter {
  130.   StringRef Name;
  131.   std::vector<AsmToken> Value;
  132.   bool Required = false;
  133.   bool Vararg = false;
  134.  
  135. #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  136.   void dump() const { dump(dbgs()); }
  137.   LLVM_DUMP_METHOD void dump(raw_ostream &OS) const;
  138. #endif
  139. };
  140.  
  141. typedef std::vector<MCAsmMacroParameter> MCAsmMacroParameters;
  142. struct MCAsmMacro {
  143.   StringRef Name;
  144.   StringRef Body;
  145.   MCAsmMacroParameters Parameters;
  146.   std::vector<std::string> Locals;
  147.   bool IsFunction = false;
  148.  
  149. public:
  150.   MCAsmMacro(StringRef N, StringRef B, MCAsmMacroParameters P)
  151.       : Name(N), Body(B), Parameters(std::move(P)) {}
  152.   MCAsmMacro(StringRef N, StringRef B, MCAsmMacroParameters P,
  153.              std::vector<std::string> L, bool F)
  154.       : Name(N), Body(B), Parameters(std::move(P)), Locals(std::move(L)),
  155.         IsFunction(F) {}
  156.  
  157. #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  158.   void dump() const { dump(dbgs()); }
  159.   LLVM_DUMP_METHOD void dump(raw_ostream &OS) const;
  160. #endif
  161. };
  162. } // namespace llvm
  163.  
  164. #endif
  165.