MCExpr.h revision f82f4490b130eca55b08d605456a4ceacccf288a
1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez//===- MCExpr.h - Assembly Level Expressions --------------------*- C++ -*-===// 2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// 3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// The LLVM Compiler Infrastructure 4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// 5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// This file is distributed under the University of Illinois Open Source 6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// License. See LICENSE.TXT for details. 7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez// 8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez//===----------------------------------------------------------------------===// 9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#ifndef LLVM_MC_MCEXPR_H 11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define LLVM_MC_MCEXPR_H 12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "llvm/Support/Casting.h" 14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "llvm/System/DataTypes.h" 15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznamespace llvm { 17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCAsmInfo; 18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCAsmLayout; 19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCContext; 20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCSymbol; 21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCValue; 22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass raw_ostream; 23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass StringRef; 24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/// MCExpr - Base class for the full range of assembler expressions which are 26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/// needed for parsing. 27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCExpr { 28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpublic: 29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez enum ExprKind { 308983855012301c8ebc023edf42ddf5e423189585Viktor Novotný Binary, ///< Binary expressions. 31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Constant, ///< Constant expressions. 32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez SymbolRef, ///< References to labels and assigned expressions. 33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Unary, ///< Unary expressions. 34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Target ///< Target specific expression. 35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez }; 36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezprivate: 38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ExprKind Kind; 39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 40f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg MCExpr(const MCExpr&); // DO NOT IMPLEMENT 41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez void operator=(const MCExpr&); // DO NOT IMPLEMENT 42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezprotected: 44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {} 45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpublic: 47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @name Accessors 48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @{ 49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ExprKind getKind() const { return Kind; } 51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @} 53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @name Utility Methods 54f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg /// @{ 55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez void print(raw_ostream &OS) const; 57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez void dump() const; 5819c46d3d7bd2dc190bb83855c4ffa65a3bc830d7Mathias Fröhlich 59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @} 60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @name Expression Evaluation 61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @{ 62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// EvaluateAsAbsolute - Try to evaluate the expression to an absolute value. 64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// 65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @param Res - The absolute value, if evaluation succeeds. 66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @param Layout - The assembler layout object to use for evaluating symbol 67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// values. If not given, then only non-symbolic expressions will be 68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// evaluated. 69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @result - True on success. 70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez bool EvaluateAsAbsolute(int64_t &Res, MCAsmLayout *Layout = 0) const; 71f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable 73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// value, i.e. an expression of the fixed form (a - b + constant). 742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /// 75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @param Res - The relocatable value, if evaluation succeeds. 76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @param Layout - The assembler layout object to use for evaluating values. 77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @result - True on success. 78bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez bool EvaluateAsRelocatable(MCValue &Res, MCAsmLayout *Layout = 0) const; 79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @} 81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static bool classof(const MCExpr *) { return true; } 83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}; 84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezinline raw_ostream &operator<<(raw_ostream &OS, const MCExpr &E) { 86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez E.print(OS); 87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return OS; 88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez} 89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez//// MCConstantExpr - Represent a constant integer expression. 91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezclass MCConstantExpr : public MCExpr { 92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez int64_t Value; 93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez explicit MCConstantExpr(int64_t _Value) 95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez : MCExpr(MCExpr::Constant), Value(_Value) {} 96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 97f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggspublic: 98f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @name Construction 99f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @{ 100f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 101f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCConstantExpr *Create(int64_t Value, MCContext &Ctx); 102f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 103f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @} 104f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @name Accessors 105f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @{ 106f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 107f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs int64_t getValue() const { return Value; } 108f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 109f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @} 110f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 111f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static bool classof(const MCExpr *E) { 112f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs return E->getKind() == MCExpr::Constant; 113f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs } 114f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static bool classof(const MCConstantExpr *) { return true; } 115f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs}; 116f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 117f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// MCSymbolRefExpr - Represent a reference to a symbol from inside an 118f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// expression. 119f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// 120f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// A symbol reference in an expression may be a use of a label, a use of an 121f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// assembler variable (defined constant), or constitute an implicit definition 122f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// of the symbol as external. 123f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggsclass MCSymbolRefExpr : public MCExpr { 124f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs const MCSymbol *Symbol; 125f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 126f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs explicit MCSymbolRefExpr(const MCSymbol *_Symbol) 127f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol) {} 128f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 129f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggspublic: 130f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @name Construction 131f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @{ 132f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 133f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); 134f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCSymbolRefExpr *Create(StringRef Name, MCContext &Ctx); 135f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 136f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// CreateTemp - Create a reference to an assembler temporary label with the 137f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// specified name. 138f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCSymbolRefExpr *CreateTemp(StringRef Name, MCContext &Ctx); 139f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 140f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @} 141f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @name Accessors 142f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @{ 143f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 144f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs const MCSymbol &getSymbol() const { return *Symbol; } 145f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 146f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs /// @} 147f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 148f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static bool classof(const MCExpr *E) { 149f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs return E->getKind() == MCExpr::SymbolRef; 150f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs } 151f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static bool classof(const MCSymbolRefExpr *) { return true; } 152f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs}; 153f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 154f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// MCUnaryExpr - Unary assembler expressions. 155f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggsclass MCUnaryExpr : public MCExpr { 156f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggspublic: 157f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs enum Opcode { 158f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs LNot, ///< Logical negation. 159f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Minus, ///< Unary minus. 160f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Not, ///< Bitwise negation. 161f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Plus ///< Unary plus. 162f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs }; 163f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs 164f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggsprivate: 165f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Opcode Op; 166f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs const MCExpr *Expr; 167f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCUnaryExpr(Opcode _Op, const MCExpr *_Expr) 169f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs : MCExpr(MCExpr::Unary), Op(_Op), Expr(_Expr) {} 1702e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 171f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggspublic: 1722e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /// @name Construction 1732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /// @{ 1742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs static const MCUnaryExpr *Create(Opcode Op, const MCExpr *Expr, 176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx); 177f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCUnaryExpr *CreateLNot(const MCExpr *Expr, MCContext &Ctx) { 178f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs return Create(LNot, Expr, Ctx); 179f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs } 180f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs static const MCUnaryExpr *CreateMinus(const MCExpr *Expr, MCContext &Ctx) { 181f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs return Create(Minus, Expr, Ctx); 182f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs } 183bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCUnaryExpr *CreateNot(const MCExpr *Expr, MCContext &Ctx) { 184bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(Not, Expr, Ctx); 185bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 186f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg static const MCUnaryExpr *CreatePlus(const MCExpr *Expr, MCContext &Ctx) { 187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(Plus, Expr, Ctx); 1882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 1892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs /// @} 191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @name Accessors 192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @{ 193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 194f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg /// getOpcode - Get the kind of this unary expression. 195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Opcode getOpcode() const { return Op; } 196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// getSubExpr - Get the child of this unary expression. 198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const MCExpr *getSubExpr() const { return Expr; } 199f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg 200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @} 201bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 202bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static bool classof(const MCExpr *E) { 203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return E->getKind() == MCExpr::Unary; 204bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 205bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static bool classof(const MCUnaryExpr *) { return true; } 206f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs}; 2072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 208f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs/// MCBinaryExpr - Binary assembler expressions. 209f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggsclass MCBinaryExpr : public MCExpr { 210f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggspublic: 211f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs enum Opcode { 212f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Add, ///< Addition. 213f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs And, ///< Bitwise and. 214f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs Div, ///< Signed division. 215bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez EQ, ///< Equality comparison. 216f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs GT, ///< Signed greater than comparison (result is either 0 or some 217bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ///< target-specific non-zero value) 2182e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs GTE, ///< Signed greater than or equal comparison (result is either 0 or 219f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs ///< some target-specific non-zero value). 220bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez LAnd, ///< Logical and. 221bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez LOr, ///< Logical or. 222f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs LT, ///< Signed less than comparison (result is either 0 or 2232e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs ///< some target-specific non-zero value). 2242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs LTE, ///< Signed less than or equal comparison (result is either 0 or 225bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez ///< some target-specific non-zero value). 2262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs Mod, ///< Signed remainder. 2272e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs Mul, ///< Multiplication. 228bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez NE, ///< Inequality comparison. 229bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Or, ///< Bitwise or. 230bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Shl, ///< Shift left. 231f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg Shr, ///< Shift right (arithmetic or logical, depending on target) 232bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Sub, ///< Subtraction. 233bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Xor ///< Bitwise exclusive or. 234bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez }; 235bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 236f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergprivate: 237bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez Opcode Op; 238bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const MCExpr *LHS, *RHS; 239bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 240bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCBinaryExpr(Opcode _Op, const MCExpr *_LHS, const MCExpr *_RHS) 241f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg : MCExpr(MCExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {} 242bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 243bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezpublic: 244bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @name Construction 245bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez /// @{ 246bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez 2478f1051dca2d2ea4a4d38f251a5f98fc2a9d097c9Francisco Jerez static const MCBinaryExpr *Create(Opcode Op, const MCExpr *LHS, 248bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez const MCExpr *RHS, MCContext &Ctx); 249bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateAdd(const MCExpr *LHS, const MCExpr *RHS, 250bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 251f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg return Create(Add, LHS, RHS, Ctx); 252bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 253bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateAnd(const MCExpr *LHS, const MCExpr *RHS, 254bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 255bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(And, LHS, RHS, Ctx); 256bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 257bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateDiv(const MCExpr *LHS, const MCExpr *RHS, 2588f1051dca2d2ea4a4d38f251a5f98fc2a9d097c9Francisco Jerez MCContext &Ctx) { 259bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(Div, LHS, RHS, Ctx); 260bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 261bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateEQ(const MCExpr *LHS, const MCExpr *RHS, 262bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 263f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg return Create(EQ, LHS, RHS, Ctx); 264bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 265bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateGT(const MCExpr *LHS, const MCExpr *RHS, 266bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 267bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(GT, LHS, RHS, Ctx); 268bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 269bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateGTE(const MCExpr *LHS, const MCExpr *RHS, 270bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 271bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(GTE, LHS, RHS, Ctx); 272bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 273bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateLAnd(const MCExpr *LHS, const MCExpr *RHS, 274bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 275bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(LAnd, LHS, RHS, Ctx); 276bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 277bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateLOr(const MCExpr *LHS, const MCExpr *RHS, 278bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 279bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(LOr, LHS, RHS, Ctx); 280bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 281bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateLT(const MCExpr *LHS, const MCExpr *RHS, 282bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 283bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(LT, LHS, RHS, Ctx); 284bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 285bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateLTE(const MCExpr *LHS, const MCExpr *RHS, 286bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 287bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(LTE, LHS, RHS, Ctx); 288bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez } 289bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateMod(const MCExpr *LHS, const MCExpr *RHS, 290bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 291bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez return Create(Mod, LHS, RHS, Ctx); 292f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg } 293bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez static const MCBinaryExpr *CreateMul(const MCExpr *LHS, const MCExpr *RHS, 294bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez MCContext &Ctx) { 295 return Create(Mul, LHS, RHS, Ctx); 296 } 297 static const MCBinaryExpr *CreateNE(const MCExpr *LHS, const MCExpr *RHS, 298 MCContext &Ctx) { 299 return Create(NE, LHS, RHS, Ctx); 300 } 301 static const MCBinaryExpr *CreateOr(const MCExpr *LHS, const MCExpr *RHS, 302 MCContext &Ctx) { 303 return Create(Or, LHS, RHS, Ctx); 304 } 305 static const MCBinaryExpr *CreateShl(const MCExpr *LHS, const MCExpr *RHS, 306 MCContext &Ctx) { 307 return Create(Shl, LHS, RHS, Ctx); 308 } 309 static const MCBinaryExpr *CreateShr(const MCExpr *LHS, const MCExpr *RHS, 310 MCContext &Ctx) { 311 return Create(Shr, LHS, RHS, Ctx); 312 } 313 static const MCBinaryExpr *CreateSub(const MCExpr *LHS, const MCExpr *RHS, 314 MCContext &Ctx) { 315 return Create(Sub, LHS, RHS, Ctx); 316 } 317 static const MCBinaryExpr *CreateXor(const MCExpr *LHS, const MCExpr *RHS, 318 MCContext &Ctx) { 319 return Create(Xor, LHS, RHS, Ctx); 320 } 321 322 /// @} 323 /// @name Accessors 324 /// @{ 325 326 /// getOpcode - Get the kind of this binary expression. 327 Opcode getOpcode() const { return Op; } 328 329 /// getLHS - Get the left-hand side expression of the binary operator. 330 const MCExpr *getLHS() const { return LHS; } 331 332 /// getRHS - Get the right-hand side expression of the binary operator. 333 const MCExpr *getRHS() const { return RHS; } 334 335 /// @} 336 337 static bool classof(const MCExpr *E) { 338 return E->getKind() == MCExpr::Binary; 339 } 340 static bool classof(const MCBinaryExpr *) { return true; } 341}; 342 343/// MCTargetExpr - This is an extension point for target-specific MCExpr 344/// subclasses to implement. 345/// 346/// NOTE: All subclasses are required to have trivial destructors because 347/// MCExprs are bump pointer allocated and not destructed. 348class MCTargetExpr : public MCExpr { 349 virtual void Anchor(); 350protected: 351 MCTargetExpr() : MCExpr(Target) {} 352 virtual ~MCTargetExpr() {} 353public: 354 355 virtual void PrintImpl(raw_ostream &OS) const = 0; 356 virtual bool EvaluateAsRelocatableImpl(MCValue &Res, 357 MCAsmLayout *Layout) const = 0; 358 359 360 static bool classof(const MCExpr *E) { 361 return E->getKind() == MCExpr::Target; 362 } 363 static bool classof(const MCTargetExpr *) { return true; } 364}; 365 366} // end namespace llvm 367 368#endif 369