sageBuilderAsm.h

Go to the documentation of this file.
00001 #ifndef ROSE_SAGEBUILDERASM_H
00002 #define ROSE_SAGEBUILDERASM_H
00003 
00004 namespace SageBuilderAsm
00005    {
00006   // DQ (10/26/2009): I don't think this should be used (it is a copy of the constructor).
00007   // SgAsmx86Instruction* buildx86Instruction( rose_addr_t address = 0, std::string mnemonic = "", X86InstructionKind kind = x86_unknown_instruction, X86InstructionSize baseSize = x86_insnsize_none, X86InstructionSize operandSize = x86_insnsize_none, X86InstructionSize addressSize = x86_insnsize_none);
00008 
00009   // This is the simplest interface for the construction of an instruction.
00010      SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind );
00011 
00012   // Not clear which of these will be most useful (take a list of one or two operands).
00013      SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmExpression* operand );
00014      SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmExpression* lhs, SgAsmExpression* rhs );
00015 
00016   // Not clear which of these will be most useful (take an operand list).
00017      SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmOperandList* operands );
00018 
00019   // Build functions for SgAsmOperandList
00020      SgAsmOperandList* buildSgAsmOperandList();
00021      SgAsmOperandList* buildSgAsmOperandList( SgAsmExpression* operand );
00022      SgAsmOperandList* buildSgAsmOperandList( SgAsmExpression* lhs = NULL, SgAsmExpression* rhs = NULL );
00023 
00024 template <class T> T* buildAsmUnaryExpression(SgAsmExpression* operand = NULL);
00025 
00026 // SgAsmUnaryMinus * buildAsmUnaryMinus(SgAsmExpression* op = NULL);
00027 
00028 #define BUILD_UNARY_PROTO(suffix) SgAsmUnary##suffix * buildAsmUnary##suffix(SgAsmExpression* op = NULL);
00029 
00030 // There are more unary operators to add still
00031 BUILD_UNARY_PROTO(Plus)
00032 
00033 // BUILD_UNARY_PROTO(UnaryMinus)
00034 
00035 
00036 template <class T> T* buildAsmBinaryExpression(SgAsmExpression* lhs = NULL, SgAsmExpression* rhs = NULL);
00037 
00038 #define BUILD_BINARY_PROTO(suffix) SgAsmBinary##suffix * buildAsmBinary##suffix(SgAsmExpression* lhs = NULL, SgAsmExpression* rhs = NULL);
00039 
00040 // There are more binary operators to add still
00041 BUILD_BINARY_PROTO(Add)
00042 BUILD_BINARY_PROTO(Divide)
00043 BUILD_BINARY_PROTO(Mod)
00044 BUILD_BINARY_PROTO(Multiply)
00045 BUILD_BINARY_PROTO(Subtract)
00046 
00047   // These functions are copies of the "make" functions (wrappers for the "make" functions) to provide a consistant interface for the future API.
00048      SgAsmQuadWordValueExpression* buildAsmQWordValue(uint64_t val);
00049      SgAsmBinarySubtract* buildAsmSubtract(SgAsmExpression* lhs, SgAsmExpression* rhs);
00050      SgAsmBinaryAddPreupdate* buildAsmAddPreupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00051      SgAsmBinarySubtractPreupdate* buildAsmSubtractPreupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00052      SgAsmBinaryAddPostupdate* buildAsmAddPostupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00053      SgAsmBinarySubtractPostupdate* buildAsmSubtractPostupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00054      SgAsmBinaryMultiply* buildAsmMul(SgAsmExpression* lhs, SgAsmExpression* rhs);
00055      SgAsmBinaryLsl* buildAsmLsl(SgAsmExpression* lhs, SgAsmExpression* rhs);
00056      SgAsmBinaryLsr* buildAsmLsr(SgAsmExpression* lhs, SgAsmExpression* rhs);
00057      SgAsmBinaryAsr* buildAsmAsr(SgAsmExpression* lhs, SgAsmExpression* rhs);
00058      SgAsmBinaryRor* buildAsmRor(SgAsmExpression* lhs, SgAsmExpression* rhs);
00059      SgAsmUnaryRrx* buildAsmRrx(SgAsmExpression* lhs);
00060      SgAsmUnaryArmSpecialRegisterList* buildAsmArmSpecialRegisterList(SgAsmExpression* lhs);
00061      SgAsmExprListExp* buildAsmExprListExp();
00062 
00063   // Implemented versions of "make" functions wrapped as "build" functions.
00064      SgAsmDoubleWordValueExpression* buildAsmDWordValue(uint32_t val);
00065      SgAsmByteValueExpression* buildAsmByteValue(uint8_t val);
00066      SgAsmWordValueExpression* buildAsmWordValue(uint16_t val);
00067 
00068      SgAsmMemoryReferenceExpression* buildAsmMemoryReferenceExpression(SgAsmExpression* addr, SgAsmExpression* segment = NULL, SgAsmType* t = NULL);
00069      SgAsmBinaryAdd*                 buildAsmAddExpression(SgAsmExpression* lhs, SgAsmExpression* rhs);
00070 
00071      SgAsmTypeByte*           buildAsmTypeByte();
00072      SgAsmTypeWord*           buildAsmTypeWord();
00073      SgAsmTypeDoubleWord*     buildAsmTypeDoubleWord();
00074      SgAsmTypeQuadWord*       buildAsmTypeQuadWord();
00075      SgAsmTypeSingleFloat*    buildAsmTypeSingleFloat();
00076      SgAsmTypeDoubleFloat*    buildAsmTypeDoubleFloat();
00077      SgAsmType128bitFloat*    buildAsmType128bitFloat();
00078      SgAsmType80bitFloat*     buildAsmType80bitFloat();
00079      SgAsmTypeDoubleQuadWord* buildAsmTypeDoubleQuadWord();
00080      SgAsmTypeVector*         buildAsmTypeVector();
00081 
00082   // DQ (5/1/2010): Support for building multi-byte NOP instructions.
00083      SgAsmInstruction* buildMultibyteNopInstruction(int n);
00084 
00085 #if 1
00086   // DQ (10/28/2009): These functions are not similar in name to the 
00087   // associated "build" functions in the sageBuilder.h.  They are however
00088   // needed elsewhere in ROSE (src/frontend/Disassemblers directory).
00089 
00090      SgAsmByteValueExpression* makeByteValue(uint8_t val);
00091      SgAsmWordValueExpression* makeWordValue(uint16_t val);
00092      SgAsmDoubleWordValueExpression* makeDWordValue(uint32_t val);
00093      SgAsmQuadWordValueExpression* makeQWordValue(uint64_t val);
00094      SgAsmMemoryReferenceExpression* makeMemoryReference(SgAsmExpression* addr, SgAsmExpression* segment = NULL, SgAsmType* t = NULL);
00095      SgAsmBinaryAdd* makeAdd(SgAsmExpression* lhs, SgAsmExpression* rhs);
00096      SgAsmBinarySubtract* makeSubtract(SgAsmExpression* lhs, SgAsmExpression* rhs);
00097      SgAsmBinaryAddPreupdate* makeAddPreupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00098      SgAsmBinarySubtractPreupdate* makeSubtractPreupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00099      SgAsmBinaryAddPostupdate* makeAddPostupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00100      SgAsmBinarySubtractPostupdate* makeSubtractPostupdate(SgAsmExpression* lhs, SgAsmExpression* rhs);
00101      SgAsmBinaryMultiply* makeMul(SgAsmExpression* lhs, SgAsmExpression* rhs);
00102      SgAsmBinaryLsl* makeLsl(SgAsmExpression* lhs, SgAsmExpression* rhs);
00103      SgAsmBinaryLsr* makeLsr(SgAsmExpression* lhs, SgAsmExpression* rhs);
00104      SgAsmBinaryAsr* makeAsr(SgAsmExpression* lhs, SgAsmExpression* rhs);
00105      SgAsmBinaryRor* makeRor(SgAsmExpression* lhs, SgAsmExpression* rhs);
00106      SgAsmUnaryRrx* makeRrx(SgAsmExpression* lhs);
00107      SgAsmUnaryArmSpecialRegisterList* makeArmSpecialRegisterList(SgAsmExpression* lhs);
00108      SgAsmExprListExp* makeExprListExp();
00109 #endif
00110 
00111     template <typename Insn> // For correct subtype to be returned
00112     inline Insn* appendOperand(Insn* insn, SgAsmExpression* op)
00113        {
00114          SgAsmOperandList* operands = insn->get_operandList();
00115          operands->get_operands().push_back(op);
00116          op->set_parent(operands);
00117          return insn; // For chaining this operation
00118        }
00119 
00120   // end of SageBuilderAsm namespace
00121    }
00122 #endif // ROSE_SAGEBUILDERASM_H

Generated on Sat May 19 00:53:07 2012 for ROSE by  doxygen 1.4.7