void SingleImplPass::run_pass(DexClassesVector& dexen, ConfigFiles& cfg, PassManager& mgr) { auto scope = build_class_scope(dexen); int max_steps = 0; while (true) { DEBUG_ONLY size_t scope_size = scope.size(); TypeToTypes intfs_to_classes; TypeSet intfs; build_type_maps(scope, intfs_to_classes, intfs); TypeMap single_impl; collect_single_impl(intfs_to_classes, single_impl); std::unique_ptr<SingleImplAnalysis> single_impls = SingleImplAnalysis::analyze( scope, dexen[0], single_impl, intfs, m_pass_config); auto optimized = optimize(std::move(single_impls), scope); if (optimized == 0 || ++max_steps >= MAX_PASSES) break; removed_count += optimized; assert(scope_size > scope.size()); } TRACE(INTF, 1, "Removed interfaces %ld\n", removed_count); TRACE(INTF, 1, "Updated invoke-interface to invoke-virtual %ld\n", s_invoke_intf_count); post_dexen_changes(scope, dexen); }
void SingleImplPass::run_pass(DexStoresVector& stores, ConfigFiles& cfg, PassManager& mgr) { auto scope = build_class_scope(stores); ClassHierarchy ch = build_type_hierarchy(scope); int max_steps = 0; size_t previous_invoke_intf_count = s_invoke_intf_count; removed_count = 0; while (true) { DEBUG_ONLY size_t scope_size = scope.size(); TypeToTypes intfs_to_classes; TypeSet intfs; build_type_maps(scope, intfs_to_classes, intfs); TypeMap single_impl; collect_single_impl(intfs_to_classes, single_impl); std::unique_ptr<SingleImplAnalysis> single_impls = SingleImplAnalysis::analyze( scope, stores, single_impl, intfs, m_pass_config); auto optimized = optimize( std::move(single_impls), ch, scope, m_pass_config); if (optimized == 0 || ++max_steps >= MAX_PASSES) break; removed_count += optimized; assert(scope_size > scope.size()); } TRACE(INTF, 1, "Removed interfaces %ld\n", removed_count); TRACE(INTF, 1, "Updated invoke-interface to invoke-virtual %ld\n", s_invoke_intf_count - previous_invoke_intf_count); mgr.incr_metric(METRIC_REMOVED_INTERFACES, removed_count); mgr.incr_metric(METRIC_INVOKE_INT_TO_VIRT, s_invoke_intf_count - previous_invoke_intf_count); post_dexen_changes(scope, stores); }