00001 #ifndef ROSE_SAGEBUILDERASM_H
00002 #define ROSE_SAGEBUILDERASM_H
00003
00004 namespace SageBuilderAsm
00005 {
00006
00007
00008
00009
00010 SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind );
00011
00012
00013 SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmExpression* operand );
00014 SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmExpression* lhs, SgAsmExpression* rhs );
00015
00016
00017 SgAsmx86Instruction* buildx86Instruction( X86InstructionKind kind, SgAsmOperandList* operands );
00018
00019
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
00027
00028 #define BUILD_UNARY_PROTO(suffix) SgAsmUnary##suffix * buildAsmUnary##suffix(SgAsmExpression* op = NULL);
00029
00030
00031 BUILD_UNARY_PROTO(Plus)
00032
00033
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
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
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
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
00083 SgAsmInstruction* buildMultibyteNopInstruction(int n);
00084
00085 #if 1
00086
00087
00088
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>
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;
00118 }
00119
00120
00121 }
00122 #endif // ROSE_SAGEBUILDERASM_H