From 096962021d551bce15b736d86a87ec36fe6072fa Mon Sep 17 00:00:00 2001 From: Xiaozhu Meng Date: Wed, 23 Aug 2017 14:21:36 -0500 Subject: [PATCH] 1. When we find potential indexing variable with table stride being 1, we need to make sure that we have already found the table base to declare this variable as the table index. 2. Add constants multiplication in AST simplification --- parseAPI/src/IndirectASTVisitor.C | 30 ++++++++++++++++++++---------- parseAPI/src/IndirectAnalyzer.C | 2 -- parseAPI/src/SymbolicExpression.C | 21 ++++++--------------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/parseAPI/src/IndirectASTVisitor.C b/parseAPI/src/IndirectASTVisitor.C index 96d12a35e9..4eeec9bc9b 100644 --- a/parseAPI/src/IndirectASTVisitor.C +++ b/parseAPI/src/IndirectASTVisitor.C @@ -295,18 +295,28 @@ AST::Ptr JumpTableFormatVisitor::visit(DataflowAPI::RoseAST *ast) { ast->val().op == ROSEOperation::shiftLOp || ast->val().op == ROSEOperation::rotateLOp) && memoryReadLayer > 0) { if (ast->child(0)->getID() == AST::V_ConstantAST && ast->child(1)->getID() == AST::V_VariableAST) { - findIndex = true; - numOfVar++; - VariableAST::Ptr varAst = boost::static_pointer_cast(ast->child(1)); - index = varAst->val().reg; - return AST::Ptr(); + ConstantAST::Ptr constAst = boost::static_pointer_cast(ast->child(0)); + if (!((ast->val().op == ROSEOperation::uMultOp || ast->val().op == ROSEOperation::sMultOp) && + !findTableBase && + constAst->val().val == 1)) { + findIndex = true; + numOfVar++; + VariableAST::Ptr varAst = boost::static_pointer_cast(ast->child(1)); + index = varAst->val().reg; + return AST::Ptr(); + } } if (ast->child(1)->getID() == AST::V_ConstantAST && ast->child(0)->getID() == AST::V_VariableAST) { - findIndex = true; - numOfVar++; - VariableAST::Ptr varAst = boost::static_pointer_cast(ast->child(0)); - index = varAst->val().reg; - return AST::Ptr(); + ConstantAST::Ptr constAst = boost::static_pointer_cast(ast->child(1)); + if (!((ast->val().op == ROSEOperation::uMultOp || ast->val().op == ROSEOperation::sMultOp) && + !findTableBase && + constAst->val().val == 1)) { + findIndex = true; + numOfVar++; + VariableAST::Ptr varAst = boost::static_pointer_cast(ast->child(0)); + index = varAst->val().reg; + return AST::Ptr(); + } } } diff --git a/parseAPI/src/IndirectAnalyzer.C b/parseAPI/src/IndirectAnalyzer.C index 0ecbfe9134..a3697c4fa3 100644 --- a/parseAPI/src/IndirectAnalyzer.C +++ b/parseAPI/src/IndirectAnalyzer.C @@ -58,8 +58,6 @@ static bool IsVariableArgumentFormat(AST::Ptr t, AbsRegion &index) { } bool IndirectControlFlowAnalyzer::NewJumpTableAnalysis(std::vector >& outEdges) { -// if (block->last() == 0x55121c) dyn_debug_parsing=1; else dyn_debug_parsing=0; - parsing_printf("Apply indirect control flow analysis at %lx\n", block->last()); parsing_printf("Looking for thunk\n"); diff --git a/parseAPI/src/SymbolicExpression.C b/parseAPI/src/SymbolicExpression.C index a331ff8816..9c035fa00d 100644 --- a/parseAPI/src/SymbolicExpression.C +++ b/parseAPI/src/SymbolicExpression.C @@ -109,21 +109,7 @@ AST::Ptr SymbolicExpression::SimplifyRoot(AST::Ptr ast, Address addr, bool keepM size_t size = child1->val().size + child0->val().size; return ConstantAST::create(Constant(val,size)); } - if (roseAST->child(1)->getID() == AST::V_ConstantAST) { - ConstantAST::Ptr child1 = boost::static_pointer_cast(roseAST->child(1)); - if (child1->val().val == 0) { - return roseAST->child(0); - } - } - if (roseAST->child(0)->getID() == AST::V_VariableAST && roseAST->child(1)->getID() == AST::V_VariableAST) { - VariableAST::Ptr child0 = boost::static_pointer_cast(roseAST->child(0)); - VariableAST::Ptr child1 = boost::static_pointer_cast(roseAST->child(1)); - if (child0->val() == child1->val()) { - return roseAST->child(0); - } - } - break; - + return roseAST->child(0); } case ROSEOperation::addOp: // We simplify the addition as much as we can @@ -167,6 +153,11 @@ AST::Ptr SymbolicExpression::SimplifyRoot(AST::Ptr ast, Address addr, bool keepM break; case ROSEOperation::sMultOp: case ROSEOperation::uMultOp: + if (roseAST->child(0)->getID() == AST::V_ConstantAST && roseAST->child(1)->getID() == AST::V_ConstantAST) { + ConstantAST::Ptr child0 = boost::static_pointer_cast(roseAST->child(0)); + ConstantAST::Ptr child1 = boost::static_pointer_cast(roseAST->child(1)); + return ConstantAST::create(Constant(child0->val().val * child1->val().val, 64)); + } if (roseAST->child(0)->getID() == AST::V_ConstantAST) { ConstantAST::Ptr child0 = boost::static_pointer_cast(roseAST->child(0)); if (child0->val().val == 1 && !keepMultiOne) return roseAST->child(1);