Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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