Viewing file: MCAsmMacro.h (4.86 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- MCAsmMacro.h - Assembly Macros ---------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===//
#ifndef LLVM_MC_MCASMMACRO_H #define LLVM_MC_MCASMMACRO_H
#include "llvm/ADT/APInt.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Debug.h" #include "llvm/Support/SMLoc.h" #include <vector>
namespace llvm {
/// Target independent representation for an assembler token. class AsmToken { public: enum TokenKind { // Markers Eof, Error,
// String values. Identifier, String,
// Integer values. Integer, BigNum, // larger than 64 bits
// Real values. Real,
// Comments Comment, HashDirective, // No-value. EndOfStatement, Colon, Space, Plus, Minus, Tilde, Slash, // '/' BackSlash, // '\' LParen, RParen, LBrac, RBrac, LCurly, RCurly, Question, Star, Dot, Comma, Dollar, Equal, EqualEqual,
Pipe, PipePipe, Caret, Amp, AmpAmp, Exclaim, ExclaimEqual, Percent, Hash, Less, LessEqual, LessLess, LessGreater, Greater, GreaterEqual, GreaterGreater, At, MinusGreater,
// MIPS unary expression operators such as %neg. PercentCall16, PercentCall_Hi, PercentCall_Lo, PercentDtprel_Hi, PercentDtprel_Lo, PercentGot, PercentGot_Disp, PercentGot_Hi, PercentGot_Lo, PercentGot_Ofst, PercentGot_Page, PercentGottprel, PercentGp_Rel, PercentHi, PercentHigher, PercentHighest, PercentLo, PercentNeg, PercentPcrel_Hi, PercentPcrel_Lo, PercentTlsgd, PercentTlsldm, PercentTprel_Hi, PercentTprel_Lo };
private: TokenKind Kind = TokenKind::Eof;
/// A reference to the entire token contents; this is always a pointer into /// a memory buffer owned by the source manager. StringRef Str;
APInt IntVal;
public: AsmToken() = default; AsmToken(TokenKind Kind, StringRef Str, APInt IntVal) : Kind(Kind), Str(Str), IntVal(std::move(IntVal)) {} AsmToken(TokenKind Kind, StringRef Str, int64_t IntVal = 0) : Kind(Kind), Str(Str), IntVal(64, IntVal, true) {}
TokenKind getKind() const { return Kind; } bool is(TokenKind K) const { return Kind == K; } bool isNot(TokenKind K) const { return Kind != K; }
SMLoc getLoc() const; SMLoc getEndLoc() const; SMRange getLocRange() const;
/// Get the contents of a string token (without quotes). StringRef getStringContents() const { assert(Kind == String && "This token isn't a string!"); return Str.slice(1, Str.size() - 1); }
/// Get the identifier string for the current token, which should be an /// identifier or a string. This gets the portion of the string which should /// be used as the identifier, e.g., it does not include the quotes on /// strings. StringRef getIdentifier() const { if (Kind == Identifier) return getString(); return getStringContents(); }
/// Get the string for the current token, this includes all characters (for /// example, the quotes on strings) in the token. /// /// The returned StringRef points into the source manager's memory buffer, and /// is safe to store across calls to Lex(). StringRef getString() const { return Str; }
// FIXME: Don't compute this in advance, it makes every token larger, and is // also not generally what we want (it is nicer for recovery etc. to lex 123br // as a single token, then diagnose as an invalid number). int64_t getIntVal() const { assert(Kind == Integer && "This token isn't an integer!"); return IntVal.getZExtValue(); }
APInt getAPIntVal() const { assert((Kind == Integer || Kind == BigNum) && "This token isn't an integer!"); return IntVal; }
void dump(raw_ostream &OS) const; };
struct MCAsmMacroParameter { StringRef Name; std::vector<AsmToken> Value; bool Required = false; bool Vararg = false;
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) void dump() const { dump(dbgs()); } LLVM_DUMP_METHOD void dump(raw_ostream &OS) const; #endif };
typedef std::vector<MCAsmMacroParameter> MCAsmMacroParameters; struct MCAsmMacro { StringRef Name; StringRef Body; MCAsmMacroParameters Parameters; std::vector<std::string> Locals; bool IsFunction = false; unsigned Count = 0;
public: MCAsmMacro(StringRef N, StringRef B, MCAsmMacroParameters P) : Name(N), Body(B), Parameters(std::move(P)) {} MCAsmMacro(StringRef N, StringRef B, MCAsmMacroParameters P, std::vector<std::string> L, bool F) : Name(N), Body(B), Parameters(std::move(P)), Locals(std::move(L)), IsFunction(F) {}
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) void dump() const { dump(dbgs()); } LLVM_DUMP_METHOD void dump(raw_ostream &OS) const; #endif }; } // namespace llvm
#endif
|