//--------------------------------------------------------- void unrollRecordAssigns(StmtEditor& editor, Stmt* S) { const RecordType *RT; for (stmt_iterator<BinaryOperator> i = stmt_ibegin(S), e = stmt_iend(S); i != e;) { BinaryOperator* BO = *i; if (BO->getOpcode() == BO_Assign && (RT = BO->getType()->getAsStructureType()) != 0 && editor.getStatementOfExpression(BO) == BO) // ensures top level assign { CompoundStmt* CS = editor.ensureCompoundParent(BO); std::vector<Stmt*> compoundStmts(CS->child_begin(), CS->child_end()); std::vector<Stmt*>::iterator insertPos = std::find(compoundStmts.begin(), compoundStmts.end(), BO); assert(insertPos != compoundStmts.end()); insertPos = compoundStmts.erase(insertPos); RecordAssignUnroller unroller(editor, RT->getDecl(), BO); compoundStmts.insert(insertPos, unroller.compoundStmts.begin(), unroller.compoundStmts.end()); editor.replaceStmts(CS, &compoundStmts[0], compoundStmts.size()); i = stmt_ibegin(S); } else { ++i; } } }
//--------------------------------------------------------- void removeInnerAssigns(StmtEditor& editor, Stmt* S) { for (stmt_iterator<BinaryOperator> i = stmt_ibegin(S), e = stmt_iend(S); i != e;) { if (i->getOpcode() == BO_Assign && isa<Expr>(editor.getParent(*i))) { Stmt* exprStmt = editor.getStatementOfExpression(*i); CompoundStmt* CS = editor.ensureCompoundParent(exprStmt); std::vector<Stmt*> compoundStmts(CS->child_begin(), CS->child_end()); std::vector<Stmt*>::iterator insertPos = std::find(compoundStmts.begin(), compoundStmts.end(), exprStmt); assert(insertPos != compoundStmts.end()); compoundStmts.insert(insertPos, *i); editor.replaceStatement(*i, selectInnerAssignResult(*i)); editor.replaceStmts(CS, &compoundStmts[0], compoundStmts.size()); i = stmt_ibegin(S); } else { ++i; } } }