blob: 84e58ffd9bf062d746ec3b193748338d6688e161 [file] [log] [blame]
Daniel Dunbara1f04642009-06-29 20:40:36 +00001//===- AsmExpr.h - Assembly file expressions --------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef ASMEXPR_H
11#define ASMEXPR_H
12
13#include "llvm/Support/Casting.h"
14#include "llvm/Support/DataTypes.h"
15
16namespace llvm {
17class MCContext;
18class MCSymbol;
Daniel Dunbarc6c054e2009-06-30 01:49:52 +000019class MCValue;
Daniel Dunbara1f04642009-06-29 20:40:36 +000020
Daniel Dunbard06b3102009-07-01 15:14:50 +000021/// AsmExpr - Base class for the full range of assembler expressions which are
22/// needed for parsing.
Daniel Dunbara1f04642009-06-29 20:40:36 +000023class AsmExpr {
24public:
25 enum AsmExprKind {
Daniel Dunbard06b3102009-07-01 15:14:50 +000026 Binary, ///< Binary expressions.
27 Constant, ///< Constant expressions.
28 SymbolRef, ///< References to labels and assigned expressions.
29 Unary ///< Unary expressions.
Daniel Dunbara1f04642009-06-29 20:40:36 +000030 };
31
32private:
33 AsmExprKind Kind;
34
35protected:
36 AsmExpr(AsmExprKind _Kind) : Kind(_Kind) {}
37
38public:
39 virtual ~AsmExpr();
40
41 AsmExprKind getKind() const { return Kind; }
42
43 /// EvaluateAsAbsolute - Try to evaluate the expression to an absolute value.
44 ///
Daniel Dunbarc6c054e2009-06-30 01:49:52 +000045 /// @param Res - The absolute value, if evaluation succeeds.
Daniel Dunbara1f04642009-06-29 20:40:36 +000046 /// @result - True on success.
47 bool EvaluateAsAbsolute(MCContext &Ctx, int64_t &Res) const;
48
Daniel Dunbarc6c054e2009-06-30 01:49:52 +000049 /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable
Daniel Dunbard06b3102009-07-01 15:14:50 +000050 /// value, i.e. an expression of the fixed form (a - b + constant).
Daniel Dunbarc6c054e2009-06-30 01:49:52 +000051 ///
52 /// @param Res - The relocatable value, if evaluation succeeds.
53 /// @result - True on success.
54 bool EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const;
55
Daniel Dunbara1f04642009-06-29 20:40:36 +000056 static bool classof(const AsmExpr *) { return true; }
57};
58
Daniel Dunbard06b3102009-07-01 15:14:50 +000059//// AsmConstantExpr - Represent a constant integer expression.
Daniel Dunbara1f04642009-06-29 20:40:36 +000060class AsmConstantExpr : public AsmExpr {
61 int64_t Value;
62
63public:
64 AsmConstantExpr(int64_t _Value)
65 : AsmExpr(AsmExpr::Constant), Value(_Value) {}
66
67 int64_t getValue() const { return Value; }
68
69 static bool classof(const AsmExpr *E) {
70 return E->getKind() == AsmExpr::Constant;
71 }
72 static bool classof(const AsmConstantExpr *) { return true; }
73};
74
Daniel Dunbard06b3102009-07-01 15:14:50 +000075/// AsmSymbolRefExpr - Represent a reference to a symbol from inside an
76/// expression.
77///
78/// A symbol reference in an expression may be a use of a label, a use of an
79/// assembler variable (defined constant), or constitute an implicit definition
80/// of the symbol as external.
Daniel Dunbara1f04642009-06-29 20:40:36 +000081class AsmSymbolRefExpr : public AsmExpr {
82 MCSymbol *Symbol;
83
84public:
85 AsmSymbolRefExpr(MCSymbol *_Symbol)
86 : AsmExpr(AsmExpr::SymbolRef), Symbol(_Symbol) {}
87
88 MCSymbol *getSymbol() const { return Symbol; }
89
90 static bool classof(const AsmExpr *E) {
91 return E->getKind() == AsmExpr::SymbolRef;
92 }
93 static bool classof(const AsmSymbolRefExpr *) { return true; }
94};
95
Daniel Dunbard06b3102009-07-01 15:14:50 +000096/// AsmUnaryExpr - Unary assembler expressions.
Daniel Dunbara1f04642009-06-29 20:40:36 +000097class AsmUnaryExpr : public AsmExpr {
98public:
99 enum Opcode {
Daniel Dunbard06b3102009-07-01 15:14:50 +0000100 LNot, ///< Logical negation.
101 Minus, ///< Unary minus.
102 Not, ///< Bitwise negation.
103 Plus ///< Unary plus.
Daniel Dunbara1f04642009-06-29 20:40:36 +0000104 };
105
106private:
107 Opcode Op;
108 AsmExpr *Expr;
109
110public:
111 AsmUnaryExpr(Opcode _Op, AsmExpr *_Expr)
112 : AsmExpr(AsmExpr::Unary), Op(_Op), Expr(_Expr) {}
113 ~AsmUnaryExpr() {
114 delete Expr;
115 }
116
117 Opcode getOpcode() const { return Op; }
118
119 AsmExpr *getSubExpr() const { return Expr; }
120
121 static bool classof(const AsmExpr *E) {
122 return E->getKind() == AsmExpr::Unary;
123 }
124 static bool classof(const AsmUnaryExpr *) { return true; }
125};
126
Daniel Dunbard06b3102009-07-01 15:14:50 +0000127/// AsmBinaryExpr - Binary assembler expressions.
Daniel Dunbara1f04642009-06-29 20:40:36 +0000128class AsmBinaryExpr : public AsmExpr {
129public:
130 enum Opcode {
Daniel Dunbard06b3102009-07-01 15:14:50 +0000131 Add, ///< Addition.
132 And, ///< Bitwise and.
133 Div, ///< Division.
134 EQ, ///< Equality comparison.
135 GT, ///< Greater than comparison.
136 GTE, ///< Greater than or equal comparison.
137 LAnd, ///< Logical and.
138 LOr, ///< Logical or.
139 LT, ///< Less than comparison.
140 LTE, ///< Less than or equal comparison.
141 Mod, ///< Modulus.
142 Mul, ///< Multiplication.
143 NE, ///< Inequality comparison.
144 Or, ///< Bitwise or.
145 Shl, ///< Bitwise shift left.
146 Shr, ///< Bitwise shift right.
147 Sub, ///< Subtraction.
148 Xor ///< Bitwise exclusive or.
Daniel Dunbara1f04642009-06-29 20:40:36 +0000149 };
150
151private:
152 Opcode Op;
153 AsmExpr *LHS, *RHS;
154
155public:
156 AsmBinaryExpr(Opcode _Op, AsmExpr *_LHS, AsmExpr *_RHS)
157 : AsmExpr(AsmExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {}
158 ~AsmBinaryExpr() {
159 delete LHS;
160 delete RHS;
161 }
162
163 Opcode getOpcode() const { return Op; }
164
Daniel Dunbard06b3102009-07-01 15:14:50 +0000165 /// getLHS - Get the left-hand side expression of the binary operator.
Daniel Dunbara1f04642009-06-29 20:40:36 +0000166 AsmExpr *getLHS() const { return LHS; }
Daniel Dunbard06b3102009-07-01 15:14:50 +0000167
168 /// getRHS - Get the right-hand side expression of the binary operator.
Daniel Dunbara1f04642009-06-29 20:40:36 +0000169 AsmExpr *getRHS() const { return RHS; }
170
171 static bool classof(const AsmExpr *E) {
172 return E->getKind() == AsmExpr::Binary;
173 }
174 static bool classof(const AsmBinaryExpr *) { return true; }
175};
176
177} // end namespace llvm
178
179#endif