MCExpr.h revision 5d917a8952c09a345180ec36f0df4ee5dd5eddea
128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//===- MCExpr.h - Assembly Level Expressions --------------------*- C++ -*-===// 2fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 3fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// The LLVM Compiler Infrastructure 4fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 5fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// License. See LICENSE.TXT for details. 7fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 8fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar//===----------------------------------------------------------------------===// 9fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar#ifndef LLVM_MC_MCEXPR_H 1128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar#define LLVM_MC_MCEXPR_H 12fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 13fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#include "llvm/Support/Casting.h" 148b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/DataTypes.h" 15fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 16fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarnamespace llvm { 17684c593d05db0bd277268fc9d8c05bce138c745aChris Lattnerclass MCAsmInfo; 18fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCContext; 19fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCSymbol; 2015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbarclass MCValue; 2187392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbarclass raw_ostream; 224f3e7aa154577c86791908e73a9fec075fdea0baChris Lattnerclass StringRef; 23fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCExpr - Base class for the full range of assembler expressions which are 259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar/// needed for parsing. 2628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCExpr { 27fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 2828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar enum ExprKind { 291aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Binary, ///< Binary expressions. 301aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Constant, ///< Constant expressions. 311aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar SymbolRef, ///< References to labels and assigned expressions. 325d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner Unary, ///< Unary expressions. 335d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner Target ///< Target specific expression. 34fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 36fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 3728c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind Kind; 389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCExpr(const MCExpr&); // DO NOT IMPLEMENT 409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar void operator=(const MCExpr&); // DO NOT IMPLEMENT 419643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 42fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprotected: 4328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar MCExpr(ExprKind _Kind) : Kind(_Kind) {} 449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 45fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 48fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 4928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind getKind() const { return Kind; } 50fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 5287392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @name Utility Methods 5387392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @{ 5487392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar 558cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner void print(raw_ostream &OS) const; 5687392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar void dump() const; 5787392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar 5887392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @} 599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Expression Evaluation 609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 62fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// EvaluateAsAbsolute - Try to evaluate the expression to an absolute value. 63fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// 6415d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The absolute value, if evaluation succeeds. 65fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// @result - True on success. 66e00b011e6a2597fcc3da88da91a8ffda6eebfcdaDaniel Dunbar bool EvaluateAsAbsolute(int64_t &Res) const; 67fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 6815d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable 691aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// value, i.e. an expression of the fixed form (a - b + constant). 7015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// 7115d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The relocatable value, if evaluation succeeds. 7215d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @result - True on success. 73e00b011e6a2597fcc3da88da91a8ffda6eebfcdaDaniel Dunbar bool EvaluateAsRelocatable(MCValue &Res) const; 7415d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar 759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 7728c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCExpr *) { return true; } 78fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 798cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner 808cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattnerinline raw_ostream &operator<<(raw_ostream &OS, const MCExpr &E) { 818cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner E.print(OS); 828cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner return OS; 838cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner} 84fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 8528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//// MCConstantExpr - Represent a constant integer expression. 8628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCConstantExpr : public MCExpr { 87fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t Value; 88fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCConstantExpr(int64_t _Value) 9028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Constant), Value(_Value) {} 919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCConstantExpr *Create(int64_t Value, MCContext &Ctx); 979643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1019643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 102fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t getValue() const { return Value; } 103fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1069643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1079643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Constant; 108fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 10928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCConstantExpr *) { return true; } 110fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 111fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 11228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCSymbolRefExpr - Represent a reference to a symbol from inside an 1131aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// expression. 1141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// 1151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// A symbol reference in an expression may be a use of a label, a use of an 1161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// assembler variable (defined constant), or constitute an implicit definition 1171aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// of the symbol as external. 11828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCSymbolRefExpr : public MCExpr { 1199643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol *Symbol; 120fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCSymbolRefExpr(const MCSymbol *_Symbol) 12228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol) {} 123fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1269643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1289643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); 1292928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar static const MCSymbolRefExpr *Create(StringRef Name, MCContext &Ctx); 1307eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar 1319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol &getSymbol() const { return *Symbol; } 1369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::SymbolRef; 141fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 14228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCSymbolRefExpr *) { return true; } 143fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 144fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 14528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCUnaryExpr - Unary assembler expressions. 14628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCUnaryExpr : public MCExpr { 147fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 148fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1491aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LNot, ///< Logical negation. 1501aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Minus, ///< Unary minus. 1511aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Not, ///< Bitwise negation. 1521aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Plus ///< Unary plus. 153fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 154fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 155fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 156fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 1579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *Expr; 158fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCUnaryExpr(Opcode _Op, const MCExpr *_Expr) 16028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Unary), Op(_Op), Expr(_Expr) {} 1619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *Create(Opcode Op, const MCExpr *Expr, 1679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx); 1689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateLNot(const MCExpr *Expr, MCContext &Ctx) { 1699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LNot, Expr, Ctx); 1709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateMinus(const MCExpr *Expr, MCContext &Ctx) { 1729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Minus, Expr, Ctx); 1739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateNot(const MCExpr *Expr, MCContext &Ctx) { 1759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Not, Expr, Ctx); 176fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 1779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreatePlus(const MCExpr *Expr, MCContext &Ctx) { 1789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Plus, Expr, Ctx); 1799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 184fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this unary expression. 186fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 187fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getSubExpr - Get the child of this unary expression. 1899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getSubExpr() const { return Expr; } 190fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Unary; 195fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 19628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCUnaryExpr *) { return true; } 197fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 198fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 19928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCBinaryExpr - Binary assembler expressions. 20028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCBinaryExpr : public MCExpr { 201fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 202fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 2031aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Add, ///< Addition. 2041aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar And, ///< Bitwise and. 2051aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Div, ///< Division. 2061aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar EQ, ///< Equality comparison. 2071aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GT, ///< Greater than comparison. 2081aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GTE, ///< Greater than or equal comparison. 2091aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LAnd, ///< Logical and. 2101aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LOr, ///< Logical or. 2111aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LT, ///< Less than comparison. 2121aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LTE, ///< Less than or equal comparison. 2131aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mod, ///< Modulus. 2141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mul, ///< Multiplication. 2151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar NE, ///< Inequality comparison. 2161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Or, ///< Bitwise or. 2171aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shl, ///< Bitwise shift left. 2181aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shr, ///< Bitwise shift right. 2191aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Sub, ///< Subtraction. 2201aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Xor ///< Bitwise exclusive or. 221fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 222fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 223fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 224fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 2259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *LHS, *RHS; 226fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCBinaryExpr(Opcode _Op, const MCExpr *_LHS, const MCExpr *_RHS) 22828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {} 2299643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 2319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 2329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 2339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *Create(Opcode Op, const MCExpr *LHS, 2359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *RHS, MCContext &Ctx); 2369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAdd(const MCExpr *LHS, const MCExpr *RHS, 2379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Add, LHS, RHS, Ctx); 2399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAnd(const MCExpr *LHS, const MCExpr *RHS, 2419643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(And, LHS, RHS, Ctx); 2439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateDiv(const MCExpr *LHS, const MCExpr *RHS, 2459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Div, LHS, RHS, Ctx); 2479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateEQ(const MCExpr *LHS, const MCExpr *RHS, 2499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(EQ, LHS, RHS, Ctx); 2519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2529643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGT(const MCExpr *LHS, const MCExpr *RHS, 2539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2549643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GT, LHS, RHS, Ctx); 2559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGTE(const MCExpr *LHS, const MCExpr *RHS, 2579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GTE, LHS, RHS, Ctx); 2599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLAnd(const MCExpr *LHS, const MCExpr *RHS, 2619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LAnd, LHS, RHS, Ctx); 263fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 2649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLOr(const MCExpr *LHS, const MCExpr *RHS, 2659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LOr, LHS, RHS, Ctx); 2679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLT(const MCExpr *LHS, const MCExpr *RHS, 2699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LT, LHS, RHS, Ctx); 2719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLTE(const MCExpr *LHS, const MCExpr *RHS, 2739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LTE, LHS, RHS, Ctx); 2759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMod(const MCExpr *LHS, const MCExpr *RHS, 2779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mod, LHS, RHS, Ctx); 2799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMul(const MCExpr *LHS, const MCExpr *RHS, 2819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mul, LHS, RHS, Ctx); 2839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateNE(const MCExpr *LHS, const MCExpr *RHS, 2859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2869643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(NE, LHS, RHS, Ctx); 2879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateOr(const MCExpr *LHS, const MCExpr *RHS, 2899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Or, LHS, RHS, Ctx); 2919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShl(const MCExpr *LHS, const MCExpr *RHS, 2939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shl, LHS, RHS, Ctx); 2959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShr(const MCExpr *LHS, const MCExpr *RHS, 2979643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shr, LHS, RHS, Ctx); 2999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateSub(const MCExpr *LHS, const MCExpr *RHS, 3019643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 3029643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Sub, LHS, RHS, Ctx); 3039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateXor(const MCExpr *LHS, const MCExpr *RHS, 3059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 3069643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Xor, LHS, RHS, Ctx); 3079643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3089643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3099643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 3109643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 3119643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 312fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3139643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this binary expression. 314fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 315fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getLHS - Get the left-hand side expression of the binary operator. 3179643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getLHS() const { return LHS; } 3181aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar 3191aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getRHS - Get the right-hand side expression of the binary operator. 3209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getRHS() const { return RHS; } 3219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3229643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 323fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 3259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Binary; 326fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 32728c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCBinaryExpr *) { return true; } 328fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 329fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3305d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner/// MCTargetExpr - This is an extension point for target-specific MCExpr 3315d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner/// subclasses to implement. 3325d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner/// 3335d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner/// NOTE: All subclasses are required to have trivial destructors because 3345d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner/// MCExprs are bump pointer allocated and not destructed. 3355d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattnerclass MCTargetExpr : public MCExpr { 3365d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner virtual ~MCTargetExpr(); // Not accessible. 3375d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattnerprotected: 3385d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner MCTargetExpr() : MCExpr(Target) {} 3395d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner 3405d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattnerpublic: 3415d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner 3425d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner virtual void PrintImpl(raw_ostream &OS) const = 0; 3435d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner virtual bool EvaluateAsRelocatableImpl(MCValue &Res) const = 0; 3445d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner 3455d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner 3465d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner static bool classof(const MCExpr *E) { 3475d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner return E->getKind() == MCExpr::Target; 3485d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner } 3495d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner static bool classof(const MCTargetExpr *) { return true; } 3505d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner}; 3515d917a8952c09a345180ec36f0df4ee5dd5eddeaChris Lattner 352fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar} // end namespace llvm 353fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 354fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#endif 355