From 4434646c29dfb8a0316b71c73a65714ddd6b8ba3 Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Sun, 30 Oct 2011 16:13:46 +0000 Subject: [PATCH] Handling MUL, in the process of handling TRUNC Former-commit-id: a14f5cfa471a47e37e6f2b2bfeaa25363bd886fa --- libtransform/include/transform.hpp | 17 ++++++++--------- libtransform/src/integertransform.cpp | 8 ++++---- libtransform/src/transform.cpp | 21 +++++++++++---------- libtransform/tests/Makefile | 2 +- libtransform/tests/mul.c | 13 ++++++------- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/libtransform/include/transform.hpp b/libtransform/include/transform.hpp index fbd8e639e..fc9e0bc79 100644 --- a/libtransform/include/transform.hpp +++ b/libtransform/include/transform.hpp @@ -7,12 +7,14 @@ #include <libIRDB-core.hpp> -using namespace std; -using namespace libIRDB; #include "MEDS_InstructionCheckAnnotation.hpp" #include "VirtualOffset.hpp" +using namespace std; +using namespace libIRDB; +using namespace MEDS_Annotation; + namespace libTransform { @@ -21,13 +23,10 @@ class Transform { public: Transform(VariantID_t *, VariantIR_t *, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions); - protected: - enum Register { EAX, EBX, ECX, EDX, AX, BX, CX, DX }; - protected: void addInstruction(Instruction_t *p_instr, string p_dataBits, Instruction_t *p_fallThrough, Instruction_t *p_target); - void addPushRegister(Instruction_t *p_instr, Register, Instruction_t *p_fallThrough); - void addPopRegister(Instruction_t *p_instr, Register, Instruction_t *p_fallThrough); + void addPushRegister(Instruction_t *p_instr, Register::RegisterName, Instruction_t *p_fallThrough); + void addPopRegister(Instruction_t *p_instr, Register::RegisterName, Instruction_t *p_fallThrough); Instruction_t* addCallbackHandler(string p_detector, Instruction_t *p_instr); @@ -37,8 +36,8 @@ class Transform { VariantID_t* getVariantID() { return m_variantID; } VariantIR_t* getVariantIR() { return m_variantIR; } - std::map<VirtualOffset, MEDS_InstructionCheckAnnotation>* getAnnotations(); - set<std::string>* getFilteredFunctions();; + std::map<VirtualOffset, MEDS_InstructionCheckAnnotation>* getAnnotations() { return m_annotations; } + set<std::string>* getFilteredFunctions() { return m_filteredFunctions; } private: VariantID_t *m_variantID; diff --git a/libtransform/src/integertransform.cpp b/libtransform/src/integertransform.cpp index 5e1d97bd7..bdaee13e7 100644 --- a/libtransform/src/integertransform.cpp +++ b/libtransform/src/integertransform.cpp @@ -144,8 +144,8 @@ void IntegerTransform::addTruncationCheck32to16(Instruction_t *p_instruction, co Instruction_t* pop_eax_i = allocateNewInstruction(fileID, func); // start instrumentation - addPushRegister(push_ecx_i, ECX, push_eax_i); - addPushRegister(push_eax_i, EAX, movzx_i); + addPushRegister(push_ecx_i, Register::ECX, push_eax_i); + addPushRegister(push_eax_i, Register::EAX, movzx_i); // movzx ecx, word [esp + 2] ; copy upper 16 bits into ecx (zero-extend) dataBits.resize(7); @@ -180,10 +180,10 @@ void IntegerTransform::addTruncationCheck32to16(Instruction_t *p_instruction, co addInstruction(jecxz2_i, dataBits, addCallbackHandler(string(TRUNCATION_DETECTOR), pop_eax_i), pop_eax_i); // pop eax ; restore eax - addPopRegister(pop_eax_i, EAX, pop_ecx_i); + addPopRegister(pop_eax_i, Register::EAX, pop_ecx_i); // pop ecx ; restore ecx - addPopRegister(pop_ecx_i, ECX, p_instruction); + addPopRegister(pop_ecx_i, Register::ECX, p_instruction); } else if (p_annotation.isUnsigned()) { diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp index 4acae47bd..8aecae77f 100644 --- a/libtransform/src/transform.cpp +++ b/libtransform/src/transform.cpp @@ -1,6 +1,7 @@ #include "transform.hpp" using namespace libTransform; +using namespace MEDS_Annotation; Transform::Transform(VariantID_t *p_variantID, VariantIR_t *p_variantIR, std::map<VirtualOffset, MEDS_InstructionCheckAnnotation> *p_annotations, set<std::string> *p_filteredFunctions) { @@ -23,25 +24,25 @@ void Transform::addInstruction(Instruction_t *p_instr, string p_dataBits, Instru m_variantIR->GetInstructions().insert(p_instr); } -void Transform::addPushRegister(Instruction_t *p_instr, Register p_reg, Instruction_t *p_fallThrough) +void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p_reg, Instruction_t *p_fallThrough) { string dataBits; dataBits.resize(2); dataBits[0] = 0x66; - if (p_reg == EAX) + if (p_reg == Register::EAX) { dataBits[1] = 0x50; } - else if (p_reg == EBX) + else if (p_reg == Register::EBX) { dataBits[1] = 0x53; } - else if (p_reg == ECX) + else if (p_reg == Register::ECX) { dataBits[1] = 0x51; } - else if (p_reg == EDX) + else if (p_reg == Register::EDX) { dataBits[1] = 0x52; } @@ -53,25 +54,25 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register p_reg, Instruct addInstruction(p_instr, dataBits, p_fallThrough, NULL); } -void Transform::addPopRegister(Instruction_t *p_instr, Register p_reg, Instruction_t *p_fallThrough) +void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_reg, Instruction_t *p_fallThrough) { string dataBits; dataBits.resize(2); dataBits[0] = 0x66; - if (p_reg == EAX) + if (p_reg == Register::EAX) { dataBits[1] = 0x58; } - else if (p_reg == EBX) + else if (p_reg == Register::EBX) { dataBits[1] = 0x5b; } - else if (p_reg == ECX) + else if (p_reg == Register::ECX) { dataBits[1] = 0x59; } - else if (p_reg == EDX) + else if (p_reg == Register::EDX) { dataBits[1] = 0x5a; } diff --git a/libtransform/tests/Makefile b/libtransform/tests/Makefile index fc0729356..d838f2454 100644 --- a/libtransform/tests/Makefile +++ b/libtransform/tests/Makefile @@ -17,7 +17,7 @@ all: env_check ${exes} .o.exe: # ${PEASOUP_HOME}/tools/ps_link.sh $< -o $@ - gcc $< -o $@ + gcc -g $< -o $@ ${PEASOUP_HOME}/tools/ps_analyze.sh $@ $@ --step ilr=off --step concolic=off --step p1transform=off .c.o: diff --git a/libtransform/tests/mul.c b/libtransform/tests/mul.c index dcd54426f..2b8adb3fa 100644 --- a/libtransform/tests/mul.c +++ b/libtransform/tests/mul.c @@ -1,12 +1,11 @@ + int main(int argc, char **argv) { - int a = atoi(argv[1]); - int b = atoi(argv[2]); - - int c = a * b; + unsigned a = (unsigned) atoi(argv[1]); + unsigned b = (unsigned) atoi(argv[2]); + unsigned d = a * b; + printf("%u * %u = %u\n", a, b, d); - printf("%d * %d = %d\n", a, b, c); + printf("hello, how are you?"); - unsigned d = (unsigned)a * (unsigned)b; - printf("%u * %u = %u\n", (unsigned)a, (unsigned)b, d); } -- GitLab