arkanalyzer 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Config.d.ts +70 -70
- package/lib/Config.js +198 -198
- package/lib/Scene.d.ts +316 -316
- package/lib/Scene.js +1316 -1316
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -28
- package/lib/callgraph/algorithm/AbstractAnalysis.js +144 -144
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +10 -10
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +69 -69
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +15 -15
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +146 -146
- package/lib/callgraph/common/Statistics.d.ts +57 -57
- package/lib/callgraph/common/Statistics.js +228 -228
- package/lib/callgraph/model/CallGraph.d.ts +96 -96
- package/lib/callgraph/model/CallGraph.js +354 -354
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +15 -15
- package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -106
- package/lib/callgraph/pointerAnalysis/Context.d.ts +37 -37
- package/lib/callgraph/pointerAnalysis/Context.js +155 -155
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +22 -22
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -104
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +5 -5
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +46 -46
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +261 -261
- package/lib/callgraph/pointerAnalysis/Pag.js +930 -930
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +157 -157
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +1399 -1399
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +72 -72
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +573 -573
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +15 -15
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +81 -81
- package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +80 -80
- package/lib/callgraph/pointerAnalysis/PtsDS.js +308 -308
- package/lib/core/base/Constant.d.ts +48 -48
- package/lib/core/base/Constant.js +103 -103
- package/lib/core/base/Decorator.d.ts +15 -15
- package/lib/core/base/Decorator.js +46 -46
- package/lib/core/base/DefUseChain.d.ts +8 -8
- package/lib/core/base/DefUseChain.js +25 -25
- package/lib/core/base/Expr.d.ts +340 -340
- package/lib/core/base/Expr.js +917 -917
- package/lib/core/base/Local.d.ts +104 -104
- package/lib/core/base/Local.js +176 -176
- package/lib/core/base/Position.d.ts +30 -30
- package/lib/core/base/Position.js +147 -147
- package/lib/core/base/Ref.d.ts +173 -173
- package/lib/core/base/Ref.js +374 -374
- package/lib/core/base/Stmt.d.ts +237 -237
- package/lib/core/base/Stmt.js +525 -525
- package/lib/core/base/Trap.d.ts +8 -8
- package/lib/core/base/Trap.js +30 -30
- package/lib/core/base/Type.d.ts +308 -308
- package/lib/core/base/Type.js +639 -639
- package/lib/core/base/TypeExpr.d.ts +71 -71
- package/lib/core/base/TypeExpr.js +155 -155
- package/lib/core/base/Value.d.ts +32 -32
- package/lib/core/base/Value.js +16 -16
- package/lib/core/common/ArkError.d.ts +14 -14
- package/lib/core/common/ArkError.js +28 -28
- package/lib/core/common/ArkIRTransformer.d.ts +67 -67
- package/lib/core/common/ArkIRTransformer.js +690 -690
- package/lib/core/common/ArkValueTransformer.d.ts +89 -89
- package/lib/core/common/ArkValueTransformer.js +1478 -1478
- package/lib/core/common/Builtin.d.ts +36 -36
- package/lib/core/common/Builtin.js +81 -81
- package/lib/core/common/Const.d.ts +21 -21
- package/lib/core/common/Const.js +43 -43
- package/lib/core/common/DummyMainCreater.d.ts +46 -46
- package/lib/core/common/DummyMainCreater.js +319 -319
- package/lib/core/common/EtsConst.d.ts +73 -73
- package/lib/core/common/EtsConst.js +1021 -1021
- package/lib/core/common/ExprUseReplacer.d.ts +21 -21
- package/lib/core/common/ExprUseReplacer.js +124 -124
- package/lib/core/common/IRInference.d.ts +36 -36
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +651 -648
- package/lib/core/common/IRUtils.d.ts +18 -18
- package/lib/core/common/IRUtils.js +141 -141
- package/lib/core/common/ModelUtils.d.ts +70 -70
- package/lib/core/common/ModelUtils.js +712 -712
- package/lib/core/common/RefUseReplacer.d.ts +13 -13
- package/lib/core/common/RefUseReplacer.js +52 -52
- package/lib/core/common/SdkUtils.d.ts +8 -8
- package/lib/core/common/SdkUtils.js +105 -105
- package/lib/core/common/StmtDefReplacer.d.ts +12 -12
- package/lib/core/common/StmtDefReplacer.js +41 -41
- package/lib/core/common/StmtUseReplacer.d.ts +16 -16
- package/lib/core/common/StmtUseReplacer.js +108 -108
- package/lib/core/common/TSConst.d.ts +18 -18
- package/lib/core/common/TSConst.js +36 -36
- package/lib/core/common/TypeInference.d.ts +102 -102
- package/lib/core/common/TypeInference.js +748 -748
- package/lib/core/common/ValueUtil.d.ts +12 -12
- package/lib/core/common/ValueUtil.js +54 -54
- package/lib/core/common/VisibleValue.d.ts +36 -36
- package/lib/core/common/VisibleValue.js +212 -212
- package/lib/core/dataflow/DataflowProblem.d.ts +20 -20
- package/lib/core/dataflow/DataflowProblem.js +20 -20
- package/lib/core/dataflow/DataflowResult.d.ts +7 -7
- package/lib/core/dataflow/DataflowResult.js +26 -26
- package/lib/core/dataflow/DataflowSolver.d.ts +43 -43
- package/lib/core/dataflow/DataflowSolver.js +307 -307
- package/lib/core/dataflow/Edge.d.ts +11 -11
- package/lib/core/dataflow/Edge.js +31 -31
- package/lib/core/dataflow/Fact.d.ts +6 -6
- package/lib/core/dataflow/Fact.js +24 -24
- package/lib/core/dataflow/GenericDataFlow.d.ts +142 -142
- package/lib/core/dataflow/GenericDataFlow.js +109 -109
- package/lib/core/dataflow/ReachingDef.d.ts +62 -62
- package/lib/core/dataflow/ReachingDef.js +168 -168
- package/lib/core/dataflow/UndefinedVariable.d.ts +45 -45
- package/lib/core/dataflow/UndefinedVariable.js +288 -288
- package/lib/core/dataflow/Util.d.ts +9 -9
- package/lib/core/dataflow/Util.js +64 -64
- package/lib/core/graph/BaseExplicitGraph.d.ts +58 -58
- package/lib/core/graph/BaseExplicitGraph.js +157 -157
- package/lib/core/graph/BaseImplicitGraph.d.ts +77 -77
- package/lib/core/graph/BaseImplicitGraph.js +78 -78
- package/lib/core/graph/BasicBlock.d.ts +104 -104
- package/lib/core/graph/BasicBlock.js +280 -280
- package/lib/core/graph/Cfg.d.ts +59 -59
- package/lib/core/graph/Cfg.js +282 -282
- package/lib/core/graph/DependsGraph.d.ts +35 -35
- package/lib/core/graph/DependsGraph.js +87 -87
- package/lib/core/graph/DominanceFinder.d.ts +15 -15
- package/lib/core/graph/DominanceFinder.js +121 -121
- package/lib/core/graph/DominanceTree.d.ts +12 -12
- package/lib/core/graph/DominanceTree.js +70 -70
- package/lib/core/graph/GraphTraits.d.ts +7 -7
- package/lib/core/graph/GraphTraits.js +16 -16
- package/lib/core/graph/Scc.d.ts +61 -61
- package/lib/core/graph/Scc.js +222 -222
- package/lib/core/graph/ViewTree.d.ts +114 -114
- package/lib/core/graph/ViewTree.js +16 -16
- package/lib/core/graph/builder/CfgBuilder.d.ts +176 -176
- package/lib/core/graph/builder/CfgBuilder.js +1139 -1139
- package/lib/core/graph/builder/ConditionBuilder.d.ts +15 -15
- package/lib/core/graph/builder/ConditionBuilder.js +252 -252
- package/lib/core/graph/builder/LoopBuilder.d.ts +20 -20
- package/lib/core/graph/builder/LoopBuilder.js +251 -251
- package/lib/core/graph/builder/SwitchBuilder.d.ts +11 -11
- package/lib/core/graph/builder/SwitchBuilder.js +152 -152
- package/lib/core/graph/builder/TrapBuilder.d.ts +16 -16
- package/lib/core/graph/builder/TrapBuilder.js +272 -272
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts +203 -203
- package/lib/core/graph/builder/ViewTreeBuilder.js +1055 -1055
- package/lib/core/model/ArkBaseModel.d.ts +59 -59
- package/lib/core/model/ArkBaseModel.js +274 -274
- package/lib/core/model/ArkBody.d.ts +24 -24
- package/lib/core/model/ArkBody.js +65 -65
- package/lib/core/model/ArkClass.d.ts +206 -206
- package/lib/core/model/ArkClass.js +439 -439
- package/lib/core/model/ArkExport.d.ts +72 -72
- package/lib/core/model/ArkExport.js +147 -147
- package/lib/core/model/ArkField.d.ts +62 -62
- package/lib/core/model/ArkField.js +113 -113
- package/lib/core/model/ArkFile.d.ts +131 -131
- package/lib/core/model/ArkFile.js +267 -267
- package/lib/core/model/ArkImport.d.ts +44 -44
- package/lib/core/model/ArkImport.js +108 -108
- package/lib/core/model/ArkMetadata.d.ts +31 -31
- package/lib/core/model/ArkMetadata.js +55 -55
- package/lib/core/model/ArkMethod.d.ts +261 -261
- package/lib/core/model/ArkMethod.js +592 -592
- package/lib/core/model/ArkNamespace.d.ts +66 -66
- package/lib/core/model/ArkNamespace.js +209 -209
- package/lib/core/model/ArkSignature.d.ts +162 -162
- package/lib/core/model/ArkSignature.js +379 -379
- package/lib/core/model/builder/ArkClassBuilder.d.ts +12 -12
- package/lib/core/model/builder/ArkClassBuilder.js +454 -454
- package/lib/core/model/builder/ArkExportBuilder.d.ts +24 -24
- package/lib/core/model/builder/ArkExportBuilder.js +210 -210
- package/lib/core/model/builder/ArkFieldBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkFieldBuilder.js +193 -193
- package/lib/core/model/builder/ArkFileBuilder.d.ts +9 -9
- package/lib/core/model/builder/ArkFileBuilder.js +165 -165
- package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -4
- package/lib/core/model/builder/ArkImportBuilder.js +128 -128
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +63 -63
- package/lib/core/model/builder/ArkMethodBuilder.js +486 -486
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -5
- package/lib/core/model/builder/ArkNamespaceBuilder.js +205 -205
- package/lib/core/model/builder/ArkSignatureBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkSignatureBuilder.js +40 -40
- package/lib/core/model/builder/BodyBuilder.d.ts +55 -30
- package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/BodyBuilder.js +542 -371
- package/lib/core/model/builder/builderUtils.d.ts +18 -18
- package/lib/core/model/builder/builderUtils.js +558 -558
- package/lib/index.d.ts +82 -80
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +201 -196
- package/lib/save/ArkStream.d.ts +23 -23
- package/lib/save/ArkStream.js +83 -83
- package/lib/save/DotPrinter.d.ts +43 -43
- package/lib/save/DotPrinter.js +170 -170
- package/lib/save/GraphPrinter.d.ts +16 -16
- package/lib/save/GraphPrinter.js +134 -134
- package/lib/save/JsonPrinter.d.ts +30 -30
- package/lib/save/JsonPrinter.js +580 -580
- package/lib/save/Printer.d.ts +12 -12
- package/lib/save/Printer.js +27 -27
- package/lib/save/PrinterBuilder.d.ts +53 -53
- package/lib/save/PrinterBuilder.js +145 -145
- package/lib/save/ViewTreePrinter.d.ts +14 -14
- package/lib/save/ViewTreePrinter.js +123 -123
- package/lib/save/arkir/ArkIRClassPrinter.d.ts +13 -13
- package/lib/save/arkir/ArkIRClassPrinter.js +92 -92
- package/lib/save/arkir/ArkIRFieldPrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRFieldPrinter.js +64 -64
- package/lib/save/arkir/ArkIRFilePrinter.d.ts +12 -12
- package/lib/save/arkir/ArkIRFilePrinter.js +54 -54
- package/lib/save/arkir/ArkIRMethodPrinter.d.ts +16 -16
- package/lib/save/arkir/ArkIRMethodPrinter.js +159 -159
- package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -66
- package/lib/save/base/BasePrinter.d.ts +23 -23
- package/lib/save/base/BasePrinter.js +70 -70
- package/lib/save/base/ExportPrinter.d.ts +8 -8
- package/lib/save/base/ExportPrinter.js +67 -67
- package/lib/save/base/ImportPrinter.d.ts +9 -9
- package/lib/save/base/ImportPrinter.js +92 -92
- package/lib/save/base/PrinterUtils.d.ts +24 -24
- package/lib/save/base/PrinterUtils.js +208 -208
- package/lib/save/serializeArkIR.d.ts +8 -8
- package/lib/save/serializeArkIR.js +294 -294
- package/lib/save/source/SourceBase.d.ts +22 -22
- package/lib/save/source/SourceBase.js +64 -64
- package/lib/save/source/SourceBody.d.ts +58 -58
- package/lib/save/source/SourceBody.js +296 -296
- package/lib/save/source/SourceClass.d.ts +25 -25
- package/lib/save/source/SourceClass.js +187 -187
- package/lib/save/source/SourceField.d.ts +13 -13
- package/lib/save/source/SourceField.js +73 -73
- package/lib/save/source/SourceFilePrinter.d.ts +12 -12
- package/lib/save/source/SourceFilePrinter.js +69 -69
- package/lib/save/source/SourceMethod.d.ts +22 -22
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +196 -193
- package/lib/save/source/SourceNamespace.d.ts +11 -11
- package/lib/save/source/SourceNamespace.js +83 -83
- package/lib/save/source/SourceStmt.d.ts +178 -178
- package/lib/save/source/SourceStmt.js +838 -838
- package/lib/save/source/SourceTransformer.d.ts +46 -46
- package/lib/save/source/SourceTransformer.js +446 -446
- package/lib/transformer/FunctionTransformer.d.ts +2 -2
- package/lib/transformer/FunctionTransformer.js +17 -17
- package/lib/transformer/SceneTransformer.d.ts +2 -2
- package/lib/transformer/SceneTransformer.js +17 -17
- package/lib/transformer/StaticSingleAssignmentFormer.d.ts +12 -12
- package/lib/transformer/StaticSingleAssignmentFormer.js +259 -259
- package/lib/transformer/Transformer.d.ts +6 -6
- package/lib/transformer/Transformer.js +22 -22
- package/lib/utils/AstTreeUtils.d.ts +4 -4
- package/lib/utils/AstTreeUtils.js +26 -26
- package/lib/utils/CfgStructualAnalysis.d.ts +110 -110
- package/lib/utils/CfgStructualAnalysis.js +1277 -1277
- package/lib/utils/FileUtils.d.ts +18 -18
- package/lib/utils/FileUtils.js +135 -135
- package/lib/utils/SparseBitVector.d.ts +100 -100
- package/lib/utils/SparseBitVector.js +445 -445
- package/lib/utils/callGraphUtils.d.ts +30 -30
- package/lib/utils/callGraphUtils.js +205 -205
- package/lib/utils/crypto_utils.d.ts +5 -5
- package/lib/utils/crypto_utils.js +57 -57
- package/lib/utils/entryMethodUtils.d.ts +13 -13
- package/lib/utils/entryMethodUtils.js +110 -110
- package/lib/utils/getAllFiles.d.ts +9 -9
- package/lib/utils/getAllFiles.js +90 -90
- package/lib/utils/json5parser.d.ts +6 -6
- package/lib/utils/json5parser.js +146 -146
- package/lib/utils/logger.d.ts +18 -18
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +97 -90
- package/lib/utils/pathTransfer.d.ts +1 -1
- package/lib/utils/pathTransfer.js +25 -25
- package/node_modules/json5/lib/cli.js +0 -0
- package/node_modules/ohos-typescript/bin/tsc +0 -0
- package/node_modules/ohos-typescript/bin/tsserver +0 -0
- package/package.json +3 -3
|
@@ -1,251 +1,251 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.LoopBuilder = void 0;
|
|
18
|
-
const BasicBlock_1 = require("../BasicBlock");
|
|
19
|
-
const Stmt_1 = require("../../base/Stmt");
|
|
20
|
-
const Expr_1 = require("../../base/Expr");
|
|
21
|
-
const Builtin_1 = require("../../common/Builtin");
|
|
22
|
-
const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
|
|
23
|
-
const CfgBuilder_1 = require("./CfgBuilder");
|
|
24
|
-
/**
|
|
25
|
-
* Builder for loop in CFG
|
|
26
|
-
*/
|
|
27
|
-
class LoopBuilder {
|
|
28
|
-
rebuildBlocksInLoop(blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, blockBuilders) {
|
|
29
|
-
for (const blockBuilder of blocksContainLoopCondition) {
|
|
30
|
-
if (!blockBuilderToCfgBlock.get(blockBuilder)) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
const block = blockBuilderToCfgBlock.get(blockBuilder);
|
|
34
|
-
const blockId = block.getId();
|
|
35
|
-
const stmts = block.getStmts();
|
|
36
|
-
const stmtsCnt = stmts.length;
|
|
37
|
-
const { ifStmtIdx, iteratorNextStmtIdx, dummyInitializerStmtIdx } = this.findIteratorIdx(stmts);
|
|
38
|
-
if (iteratorNextStmtIdx !== -1 || dummyInitializerStmtIdx !== -1) {
|
|
39
|
-
const lastStmtIdxBeforeCondition = iteratorNextStmtIdx !==
|
|
40
|
-
-1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx;
|
|
41
|
-
const stmtsInsertBeforeCondition = stmts.slice(0, lastStmtIdxBeforeCondition);
|
|
42
|
-
// If the loop body is empty, the loop conditional block should contain its own
|
|
43
|
-
const emptyLoopBody = blockBuilder.nexts.length === 1;
|
|
44
|
-
if (emptyLoopBody) {
|
|
45
|
-
blockBuilder.nexts.splice(0, 0, blockBuilder);
|
|
46
|
-
blockBuilder.lasts.push(blockBuilder);
|
|
47
|
-
block.getSuccessors().splice(0, 0, block);
|
|
48
|
-
block.addPredecessorBlock(block);
|
|
49
|
-
}
|
|
50
|
-
let prevBlockBuilderContainsLoop = this.doesPrevBlockBuilderContainLoop(blockBuilder, blockId, blocksContainLoopCondition);
|
|
51
|
-
if (prevBlockBuilderContainsLoop) {
|
|
52
|
-
// should create an extra block when previous block contains loop condition
|
|
53
|
-
this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, blockBuilder, stmtsInsertBeforeCondition, false, basicBlockSet, blockBuilders);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
const blockBuilderBeforeCondition = blockBuilder.lasts[0];
|
|
57
|
-
const blockBeforeCondition = blockBuilderToCfgBlock.get(blockBuilderBeforeCondition);
|
|
58
|
-
stmtsInsertBeforeCondition.forEach(stmt => blockBeforeCondition === null || blockBeforeCondition === void 0 ? void 0 : blockBeforeCondition.getStmts().push(stmt));
|
|
59
|
-
}
|
|
60
|
-
if (dummyInitializerStmtIdx !== -1 && ifStmtIdx !== stmtsCnt - 1) {
|
|
61
|
-
// put incrementor statements into block which reenters condition
|
|
62
|
-
this.adjustIncrementorStmts(stmts, ifStmtIdx, blockBuilder, blockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders);
|
|
63
|
-
}
|
|
64
|
-
else if (iteratorNextStmtIdx !== -1) {
|
|
65
|
-
// put statements which get value of iterator into block after condition
|
|
66
|
-
const blockBuilderAfterCondition = blockBuilder.nexts[0];
|
|
67
|
-
const blockAfterCondition = blockBuilderToCfgBlock.get(blockBuilderAfterCondition);
|
|
68
|
-
const stmtsAfterCondition = stmts.slice(ifStmtIdx + 1);
|
|
69
|
-
blockAfterCondition === null || blockAfterCondition === void 0 ? void 0 : blockAfterCondition.getStmts().splice(0, 0, ...stmtsAfterCondition);
|
|
70
|
-
}
|
|
71
|
-
// remove statements which should not in condition
|
|
72
|
-
const firstStmtIdxInCondition = iteratorNextStmtIdx !==
|
|
73
|
-
-1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx + 1;
|
|
74
|
-
stmts.splice(0, firstStmtIdxInCondition);
|
|
75
|
-
stmts.splice(ifStmtIdx - firstStmtIdxInCondition + 1);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
doesPrevBlockBuilderContainLoop(currBlockBuilder, currBlockId, blocksContainLoopCondition) {
|
|
80
|
-
let prevBlockBuilderContainsLoop = false;
|
|
81
|
-
for (const prevBlockBuilder of currBlockBuilder.lasts) {
|
|
82
|
-
if (prevBlockBuilder.id < currBlockId && blocksContainLoopCondition.has(prevBlockBuilder)) {
|
|
83
|
-
prevBlockBuilderContainsLoop = true;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return prevBlockBuilderContainsLoop;
|
|
88
|
-
}
|
|
89
|
-
insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, conditionBlockBuilder, stmtsInsertBeforeCondition, collectReenter, basicBlockSet, blockBuilders) {
|
|
90
|
-
if (stmtsInsertBeforeCondition.length === 0) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const blockId = conditionBlockBuilder.id;
|
|
94
|
-
const block = this.getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder);
|
|
95
|
-
const { blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition, } = this.collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId);
|
|
96
|
-
const { collectedBlockBuilders, collectedBlocks, } = this.getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
|
|
97
|
-
const { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition } = this.createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block);
|
|
98
|
-
this.updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
|
|
99
|
-
const { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition } = this.getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
|
|
100
|
-
this.updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition);
|
|
101
|
-
this.finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders);
|
|
102
|
-
}
|
|
103
|
-
getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder) {
|
|
104
|
-
return blockBuilderToCfgBlock.get(conditionBlockBuilder);
|
|
105
|
-
}
|
|
106
|
-
collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId) {
|
|
107
|
-
const blockBuildersBeforeCondition = [];
|
|
108
|
-
const blocksBeforeCondition = [];
|
|
109
|
-
const blockBuildersReenterCondition = [];
|
|
110
|
-
const blocksReenterCondition = [];
|
|
111
|
-
for (const prevBlockBuilder of conditionBlockBuilder.lasts) {
|
|
112
|
-
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
113
|
-
if (prevBlock.getId() < blockId) {
|
|
114
|
-
blockBuildersBeforeCondition.push(prevBlockBuilder);
|
|
115
|
-
blocksBeforeCondition.push(prevBlock);
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
blockBuildersReenterCondition.push(prevBlockBuilder);
|
|
119
|
-
blocksReenterCondition.push(prevBlock);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
|
|
127
|
-
let collectedBlockBuilders = [];
|
|
128
|
-
let collectedBlocks = [];
|
|
129
|
-
if (collectReenter) {
|
|
130
|
-
collectedBlockBuilders = blockBuildersReenterCondition;
|
|
131
|
-
collectedBlocks = blocksReenterCondition;
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
collectedBlockBuilders = blockBuildersBeforeCondition;
|
|
135
|
-
collectedBlocks = blocksBeforeCondition;
|
|
136
|
-
}
|
|
137
|
-
return { collectedBlockBuilders, collectedBlocks };
|
|
138
|
-
}
|
|
139
|
-
createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block) {
|
|
140
|
-
const blockBuilderInsertBeforeCondition = new CfgBuilder_1.BlockBuilder(-1, []);
|
|
141
|
-
blockBuilderInsertBeforeCondition.lasts.push(...collectedBlockBuilders);
|
|
142
|
-
blockBuilderInsertBeforeCondition.nexts.push(conditionBlockBuilder);
|
|
143
|
-
const blockInsertBeforeCondition = new BasicBlock_1.BasicBlock();
|
|
144
|
-
stmtsInsertBeforeCondition.forEach(stmt => blockInsertBeforeCondition.getStmts().push(stmt));
|
|
145
|
-
blockInsertBeforeCondition.getPredecessors().push(...collectedBlocks);
|
|
146
|
-
blockInsertBeforeCondition.addSuccessorBlock(block);
|
|
147
|
-
return { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition };
|
|
148
|
-
}
|
|
149
|
-
updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition) {
|
|
150
|
-
for (const prevBlockBuilder of collectedBlockBuilders) {
|
|
151
|
-
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
152
|
-
for (let j = 0; j < prevBlockBuilder.nexts.length; j++) {
|
|
153
|
-
if (prevBlockBuilder.nexts[j] === conditionBlockBuilder) {
|
|
154
|
-
prevBlockBuilder.nexts[j] = blockBuilderInsertBeforeCondition;
|
|
155
|
-
prevBlock.setSuccessorBlock(j, blockInsertBeforeCondition);
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
|
|
162
|
-
let newPrevBlockBuildersBeforeCondition = [];
|
|
163
|
-
let newPrevBlocksBeforeCondition = [];
|
|
164
|
-
if (collectReenter) {
|
|
165
|
-
newPrevBlockBuildersBeforeCondition = [...blockBuildersBeforeCondition, blockBuilderInsertBeforeCondition];
|
|
166
|
-
newPrevBlocksBeforeCondition = [...blocksBeforeCondition, blockInsertBeforeCondition];
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
newPrevBlockBuildersBeforeCondition = [blockBuilderInsertBeforeCondition, ...blockBuildersReenterCondition];
|
|
170
|
-
newPrevBlocksBeforeCondition = [blockInsertBeforeCondition, ...blocksReenterCondition];
|
|
171
|
-
}
|
|
172
|
-
return { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition };
|
|
173
|
-
}
|
|
174
|
-
updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition) {
|
|
175
|
-
conditionBlockBuilder.lasts = newPrevBlockBuildersBeforeCondition;
|
|
176
|
-
const predecessorsCnt = block.getPredecessors().length;
|
|
177
|
-
block.getPredecessors().splice(0, predecessorsCnt, ...newPrevBlocksBeforeCondition);
|
|
178
|
-
}
|
|
179
|
-
finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders) {
|
|
180
|
-
blockBuilders.push(blockBuilderInsertBeforeCondition);
|
|
181
|
-
basicBlockSet.add(blockInsertBeforeCondition);
|
|
182
|
-
blockBuilderToCfgBlock.set(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
|
|
183
|
-
}
|
|
184
|
-
findIteratorIdx(stmts) {
|
|
185
|
-
let ifStmtIdx = -1;
|
|
186
|
-
let iteratorNextStmtIdx = -1;
|
|
187
|
-
let dummyInitializerStmtIdx = -1;
|
|
188
|
-
const stmtsCnt = stmts.length;
|
|
189
|
-
for (let i = 0; i < stmtsCnt; i++) {
|
|
190
|
-
const stmt = stmts[i];
|
|
191
|
-
if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Expr_1.AbstractInvokeExpr) {
|
|
192
|
-
const invokeExpr = stmt.getRightOp();
|
|
193
|
-
if (invokeExpr.getMethodSignature().getMethodSubSignature()
|
|
194
|
-
.getMethodName() === Builtin_1.Builtin.ITERATOR_NEXT) {
|
|
195
|
-
iteratorNextStmtIdx = i;
|
|
196
|
-
continue;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_LOOP_INITIALIZER_STMT) {
|
|
200
|
-
dummyInitializerStmtIdx = i;
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
if (stmt instanceof Stmt_1.ArkIfStmt) {
|
|
204
|
-
ifStmtIdx = i;
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return {
|
|
209
|
-
ifStmtIdx: ifStmtIdx,
|
|
210
|
-
iteratorNextStmtIdx: iteratorNextStmtIdx,
|
|
211
|
-
dummyInitializerStmtIdx: dummyInitializerStmtIdx,
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
adjustIncrementorStmts(stmts, ifStmtIdx, currBlockBuilder, currBlockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders) {
|
|
215
|
-
const stmtsReenterCondition = stmts.slice(ifStmtIdx + 1);
|
|
216
|
-
if (emptyLoopBody) {
|
|
217
|
-
const incrementorBlockBuilder = new CfgBuilder_1.BlockBuilder(-1, []);
|
|
218
|
-
incrementorBlockBuilder.lasts.push(currBlockBuilder);
|
|
219
|
-
currBlockBuilder.nexts[0] = incrementorBlockBuilder;
|
|
220
|
-
incrementorBlockBuilder.nexts.push(currBlockBuilder);
|
|
221
|
-
currBlockBuilder.lasts[1] = incrementorBlockBuilder;
|
|
222
|
-
const incrementorBlock = new BasicBlock_1.BasicBlock();
|
|
223
|
-
blockBuilderToCfgBlock.set(incrementorBlockBuilder, incrementorBlock);
|
|
224
|
-
stmtsReenterCondition.forEach(stmt => incrementorBlock.getStmts().push(stmt));
|
|
225
|
-
const currBlock = blockBuilderToCfgBlock.get(currBlockBuilder);
|
|
226
|
-
incrementorBlock.getPredecessors().push(currBlock);
|
|
227
|
-
currBlock.setPredecessorBlock(1, incrementorBlock);
|
|
228
|
-
incrementorBlock.addSuccessorBlock(currBlock);
|
|
229
|
-
currBlock.setSuccessorBlock(0, incrementorBlock);
|
|
230
|
-
basicBlockSet.add(incrementorBlock);
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const blockBuildersReenterCondition = [];
|
|
234
|
-
for (const prevBlockBuilder of currBlockBuilder.lasts) {
|
|
235
|
-
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
236
|
-
if (prevBlock.getId() > currBlockId) {
|
|
237
|
-
blockBuildersReenterCondition.push(prevBlockBuilder);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (blockBuildersReenterCondition.length > 1 || blocksContainLoopCondition.has(blockBuildersReenterCondition[0])) {
|
|
241
|
-
// put incrementor statements into an extra block
|
|
242
|
-
this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, currBlockBuilder, stmtsReenterCondition, true, basicBlockSet, blockBuilders);
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// put incrementor statements into prev reenter block
|
|
246
|
-
const blockReenterCondition = blockBuilderToCfgBlock.get(blockBuildersReenterCondition[0]);
|
|
247
|
-
stmtsReenterCondition.forEach(stmt => blockReenterCondition === null || blockReenterCondition === void 0 ? void 0 : blockReenterCondition.getStmts().push(stmt));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
exports.LoopBuilder = LoopBuilder;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.LoopBuilder = void 0;
|
|
18
|
+
const BasicBlock_1 = require("../BasicBlock");
|
|
19
|
+
const Stmt_1 = require("../../base/Stmt");
|
|
20
|
+
const Expr_1 = require("../../base/Expr");
|
|
21
|
+
const Builtin_1 = require("../../common/Builtin");
|
|
22
|
+
const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
|
|
23
|
+
const CfgBuilder_1 = require("./CfgBuilder");
|
|
24
|
+
/**
|
|
25
|
+
* Builder for loop in CFG
|
|
26
|
+
*/
|
|
27
|
+
class LoopBuilder {
|
|
28
|
+
rebuildBlocksInLoop(blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, blockBuilders) {
|
|
29
|
+
for (const blockBuilder of blocksContainLoopCondition) {
|
|
30
|
+
if (!blockBuilderToCfgBlock.get(blockBuilder)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const block = blockBuilderToCfgBlock.get(blockBuilder);
|
|
34
|
+
const blockId = block.getId();
|
|
35
|
+
const stmts = block.getStmts();
|
|
36
|
+
const stmtsCnt = stmts.length;
|
|
37
|
+
const { ifStmtIdx, iteratorNextStmtIdx, dummyInitializerStmtIdx } = this.findIteratorIdx(stmts);
|
|
38
|
+
if (iteratorNextStmtIdx !== -1 || dummyInitializerStmtIdx !== -1) {
|
|
39
|
+
const lastStmtIdxBeforeCondition = iteratorNextStmtIdx !==
|
|
40
|
+
-1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx;
|
|
41
|
+
const stmtsInsertBeforeCondition = stmts.slice(0, lastStmtIdxBeforeCondition);
|
|
42
|
+
// If the loop body is empty, the loop conditional block should contain its own
|
|
43
|
+
const emptyLoopBody = blockBuilder.nexts.length === 1;
|
|
44
|
+
if (emptyLoopBody) {
|
|
45
|
+
blockBuilder.nexts.splice(0, 0, blockBuilder);
|
|
46
|
+
blockBuilder.lasts.push(blockBuilder);
|
|
47
|
+
block.getSuccessors().splice(0, 0, block);
|
|
48
|
+
block.addPredecessorBlock(block);
|
|
49
|
+
}
|
|
50
|
+
let prevBlockBuilderContainsLoop = this.doesPrevBlockBuilderContainLoop(blockBuilder, blockId, blocksContainLoopCondition);
|
|
51
|
+
if (prevBlockBuilderContainsLoop) {
|
|
52
|
+
// should create an extra block when previous block contains loop condition
|
|
53
|
+
this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, blockBuilder, stmtsInsertBeforeCondition, false, basicBlockSet, blockBuilders);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const blockBuilderBeforeCondition = blockBuilder.lasts[0];
|
|
57
|
+
const blockBeforeCondition = blockBuilderToCfgBlock.get(blockBuilderBeforeCondition);
|
|
58
|
+
stmtsInsertBeforeCondition.forEach(stmt => blockBeforeCondition === null || blockBeforeCondition === void 0 ? void 0 : blockBeforeCondition.getStmts().push(stmt));
|
|
59
|
+
}
|
|
60
|
+
if (dummyInitializerStmtIdx !== -1 && ifStmtIdx !== stmtsCnt - 1) {
|
|
61
|
+
// put incrementor statements into block which reenters condition
|
|
62
|
+
this.adjustIncrementorStmts(stmts, ifStmtIdx, blockBuilder, blockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders);
|
|
63
|
+
}
|
|
64
|
+
else if (iteratorNextStmtIdx !== -1) {
|
|
65
|
+
// put statements which get value of iterator into block after condition
|
|
66
|
+
const blockBuilderAfterCondition = blockBuilder.nexts[0];
|
|
67
|
+
const blockAfterCondition = blockBuilderToCfgBlock.get(blockBuilderAfterCondition);
|
|
68
|
+
const stmtsAfterCondition = stmts.slice(ifStmtIdx + 1);
|
|
69
|
+
blockAfterCondition === null || blockAfterCondition === void 0 ? void 0 : blockAfterCondition.getStmts().splice(0, 0, ...stmtsAfterCondition);
|
|
70
|
+
}
|
|
71
|
+
// remove statements which should not in condition
|
|
72
|
+
const firstStmtIdxInCondition = iteratorNextStmtIdx !==
|
|
73
|
+
-1 ? iteratorNextStmtIdx : dummyInitializerStmtIdx + 1;
|
|
74
|
+
stmts.splice(0, firstStmtIdxInCondition);
|
|
75
|
+
stmts.splice(ifStmtIdx - firstStmtIdxInCondition + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
doesPrevBlockBuilderContainLoop(currBlockBuilder, currBlockId, blocksContainLoopCondition) {
|
|
80
|
+
let prevBlockBuilderContainsLoop = false;
|
|
81
|
+
for (const prevBlockBuilder of currBlockBuilder.lasts) {
|
|
82
|
+
if (prevBlockBuilder.id < currBlockId && blocksContainLoopCondition.has(prevBlockBuilder)) {
|
|
83
|
+
prevBlockBuilderContainsLoop = true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return prevBlockBuilderContainsLoop;
|
|
88
|
+
}
|
|
89
|
+
insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, conditionBlockBuilder, stmtsInsertBeforeCondition, collectReenter, basicBlockSet, blockBuilders) {
|
|
90
|
+
if (stmtsInsertBeforeCondition.length === 0) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const blockId = conditionBlockBuilder.id;
|
|
94
|
+
const block = this.getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder);
|
|
95
|
+
const { blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition, } = this.collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId);
|
|
96
|
+
const { collectedBlockBuilders, collectedBlocks, } = this.getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
|
|
97
|
+
const { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition } = this.createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block);
|
|
98
|
+
this.updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
|
|
99
|
+
const { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition } = this.getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition);
|
|
100
|
+
this.updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition);
|
|
101
|
+
this.finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders);
|
|
102
|
+
}
|
|
103
|
+
getBlockFromMap(blockBuilderToCfgBlock, conditionBlockBuilder) {
|
|
104
|
+
return blockBuilderToCfgBlock.get(conditionBlockBuilder);
|
|
105
|
+
}
|
|
106
|
+
collectBlocksBeforeAndReenter(blockBuilderToCfgBlock, conditionBlockBuilder, blockId) {
|
|
107
|
+
const blockBuildersBeforeCondition = [];
|
|
108
|
+
const blocksBeforeCondition = [];
|
|
109
|
+
const blockBuildersReenterCondition = [];
|
|
110
|
+
const blocksReenterCondition = [];
|
|
111
|
+
for (const prevBlockBuilder of conditionBlockBuilder.lasts) {
|
|
112
|
+
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
113
|
+
if (prevBlock.getId() < blockId) {
|
|
114
|
+
blockBuildersBeforeCondition.push(prevBlockBuilder);
|
|
115
|
+
blocksBeforeCondition.push(prevBlock);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
blockBuildersReenterCondition.push(prevBlockBuilder);
|
|
119
|
+
blocksReenterCondition.push(prevBlock);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
getCollectedBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
|
|
127
|
+
let collectedBlockBuilders = [];
|
|
128
|
+
let collectedBlocks = [];
|
|
129
|
+
if (collectReenter) {
|
|
130
|
+
collectedBlockBuilders = blockBuildersReenterCondition;
|
|
131
|
+
collectedBlocks = blocksReenterCondition;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
collectedBlockBuilders = blockBuildersBeforeCondition;
|
|
135
|
+
collectedBlocks = blocksBeforeCondition;
|
|
136
|
+
}
|
|
137
|
+
return { collectedBlockBuilders, collectedBlocks };
|
|
138
|
+
}
|
|
139
|
+
createAndLinkBlocks(collectedBlockBuilders, collectedBlocks, conditionBlockBuilder, stmtsInsertBeforeCondition, block) {
|
|
140
|
+
const blockBuilderInsertBeforeCondition = new CfgBuilder_1.BlockBuilder(-1, []);
|
|
141
|
+
blockBuilderInsertBeforeCondition.lasts.push(...collectedBlockBuilders);
|
|
142
|
+
blockBuilderInsertBeforeCondition.nexts.push(conditionBlockBuilder);
|
|
143
|
+
const blockInsertBeforeCondition = new BasicBlock_1.BasicBlock();
|
|
144
|
+
stmtsInsertBeforeCondition.forEach(stmt => blockInsertBeforeCondition.getStmts().push(stmt));
|
|
145
|
+
blockInsertBeforeCondition.getPredecessors().push(...collectedBlocks);
|
|
146
|
+
blockInsertBeforeCondition.addSuccessorBlock(block);
|
|
147
|
+
return { blockBuilderInsertBeforeCondition, blockInsertBeforeCondition };
|
|
148
|
+
}
|
|
149
|
+
updatePredecessors(collectedBlockBuilders, blockBuilderToCfgBlock, conditionBlockBuilder, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition) {
|
|
150
|
+
for (const prevBlockBuilder of collectedBlockBuilders) {
|
|
151
|
+
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
152
|
+
for (let j = 0; j < prevBlockBuilder.nexts.length; j++) {
|
|
153
|
+
if (prevBlockBuilder.nexts[j] === conditionBlockBuilder) {
|
|
154
|
+
prevBlockBuilder.nexts[j] = blockBuilderInsertBeforeCondition;
|
|
155
|
+
prevBlock.setSuccessorBlock(j, blockInsertBeforeCondition);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
getNewPrevBlocks(collectReenter, blockBuildersBeforeCondition, blocksBeforeCondition, blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, blockBuildersReenterCondition, blocksReenterCondition) {
|
|
162
|
+
let newPrevBlockBuildersBeforeCondition = [];
|
|
163
|
+
let newPrevBlocksBeforeCondition = [];
|
|
164
|
+
if (collectReenter) {
|
|
165
|
+
newPrevBlockBuildersBeforeCondition = [...blockBuildersBeforeCondition, blockBuilderInsertBeforeCondition];
|
|
166
|
+
newPrevBlocksBeforeCondition = [...blocksBeforeCondition, blockInsertBeforeCondition];
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
newPrevBlockBuildersBeforeCondition = [blockBuilderInsertBeforeCondition, ...blockBuildersReenterCondition];
|
|
170
|
+
newPrevBlocksBeforeCondition = [blockInsertBeforeCondition, ...blocksReenterCondition];
|
|
171
|
+
}
|
|
172
|
+
return { newPrevBlockBuildersBeforeCondition, newPrevBlocksBeforeCondition };
|
|
173
|
+
}
|
|
174
|
+
updateConditionBlockBuilder(conditionBlockBuilder, newPrevBlockBuildersBeforeCondition, block, newPrevBlocksBeforeCondition) {
|
|
175
|
+
conditionBlockBuilder.lasts = newPrevBlockBuildersBeforeCondition;
|
|
176
|
+
const predecessorsCnt = block.getPredecessors().length;
|
|
177
|
+
block.getPredecessors().splice(0, predecessorsCnt, ...newPrevBlocksBeforeCondition);
|
|
178
|
+
}
|
|
179
|
+
finalizeInsertion(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition, basicBlockSet, blockBuilderToCfgBlock, blockBuilders) {
|
|
180
|
+
blockBuilders.push(blockBuilderInsertBeforeCondition);
|
|
181
|
+
basicBlockSet.add(blockInsertBeforeCondition);
|
|
182
|
+
blockBuilderToCfgBlock.set(blockBuilderInsertBeforeCondition, blockInsertBeforeCondition);
|
|
183
|
+
}
|
|
184
|
+
findIteratorIdx(stmts) {
|
|
185
|
+
let ifStmtIdx = -1;
|
|
186
|
+
let iteratorNextStmtIdx = -1;
|
|
187
|
+
let dummyInitializerStmtIdx = -1;
|
|
188
|
+
const stmtsCnt = stmts.length;
|
|
189
|
+
for (let i = 0; i < stmtsCnt; i++) {
|
|
190
|
+
const stmt = stmts[i];
|
|
191
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getRightOp() instanceof Expr_1.AbstractInvokeExpr) {
|
|
192
|
+
const invokeExpr = stmt.getRightOp();
|
|
193
|
+
if (invokeExpr.getMethodSignature().getMethodSubSignature()
|
|
194
|
+
.getMethodName() === Builtin_1.Builtin.ITERATOR_NEXT) {
|
|
195
|
+
iteratorNextStmtIdx = i;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_LOOP_INITIALIZER_STMT) {
|
|
200
|
+
dummyInitializerStmtIdx = i;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (stmt instanceof Stmt_1.ArkIfStmt) {
|
|
204
|
+
ifStmtIdx = i;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
ifStmtIdx: ifStmtIdx,
|
|
210
|
+
iteratorNextStmtIdx: iteratorNextStmtIdx,
|
|
211
|
+
dummyInitializerStmtIdx: dummyInitializerStmtIdx,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
adjustIncrementorStmts(stmts, ifStmtIdx, currBlockBuilder, currBlockId, blockBuilderToCfgBlock, blocksContainLoopCondition, basicBlockSet, emptyLoopBody, blockBuilders) {
|
|
215
|
+
const stmtsReenterCondition = stmts.slice(ifStmtIdx + 1);
|
|
216
|
+
if (emptyLoopBody) {
|
|
217
|
+
const incrementorBlockBuilder = new CfgBuilder_1.BlockBuilder(-1, []);
|
|
218
|
+
incrementorBlockBuilder.lasts.push(currBlockBuilder);
|
|
219
|
+
currBlockBuilder.nexts[0] = incrementorBlockBuilder;
|
|
220
|
+
incrementorBlockBuilder.nexts.push(currBlockBuilder);
|
|
221
|
+
currBlockBuilder.lasts[1] = incrementorBlockBuilder;
|
|
222
|
+
const incrementorBlock = new BasicBlock_1.BasicBlock();
|
|
223
|
+
blockBuilderToCfgBlock.set(incrementorBlockBuilder, incrementorBlock);
|
|
224
|
+
stmtsReenterCondition.forEach(stmt => incrementorBlock.getStmts().push(stmt));
|
|
225
|
+
const currBlock = blockBuilderToCfgBlock.get(currBlockBuilder);
|
|
226
|
+
incrementorBlock.getPredecessors().push(currBlock);
|
|
227
|
+
currBlock.setPredecessorBlock(1, incrementorBlock);
|
|
228
|
+
incrementorBlock.addSuccessorBlock(currBlock);
|
|
229
|
+
currBlock.setSuccessorBlock(0, incrementorBlock);
|
|
230
|
+
basicBlockSet.add(incrementorBlock);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const blockBuildersReenterCondition = [];
|
|
234
|
+
for (const prevBlockBuilder of currBlockBuilder.lasts) {
|
|
235
|
+
const prevBlock = blockBuilderToCfgBlock.get(prevBlockBuilder);
|
|
236
|
+
if (prevBlock.getId() > currBlockId) {
|
|
237
|
+
blockBuildersReenterCondition.push(prevBlockBuilder);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (blockBuildersReenterCondition.length > 1 || blocksContainLoopCondition.has(blockBuildersReenterCondition[0])) {
|
|
241
|
+
// put incrementor statements into an extra block
|
|
242
|
+
this.insertBeforeConditionBlockBuilder(blockBuilderToCfgBlock, currBlockBuilder, stmtsReenterCondition, true, basicBlockSet, blockBuilders);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// put incrementor statements into prev reenter block
|
|
246
|
+
const blockReenterCondition = blockBuilderToCfgBlock.get(blockBuildersReenterCondition[0]);
|
|
247
|
+
stmtsReenterCondition.forEach(stmt => blockReenterCondition === null || blockReenterCondition === void 0 ? void 0 : blockReenterCondition.getStmts().push(stmt));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.LoopBuilder = LoopBuilder;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { BasicBlock } from '../BasicBlock';
|
|
2
|
-
import { ArkIRTransformer, ValueAndStmts } from '../../common/ArkIRTransformer';
|
|
3
|
-
import { BlockBuilder } from './CfgBuilder';
|
|
4
|
-
/**
|
|
5
|
-
* Builder for switch statement in CFG
|
|
6
|
-
*/
|
|
7
|
-
export declare class SwitchBuilder {
|
|
8
|
-
buildSwitch(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blockBuildersContainSwitch: BlockBuilder[], valueAndStmtsOfSwitchAndCasesAll: ValueAndStmts[][], arkIRTransformer: ArkIRTransformer, basicBlockSet: Set<BasicBlock>): void;
|
|
9
|
-
private generateIfBlocksForCases;
|
|
10
|
-
private linkIfBlockAndCaseBlock;
|
|
11
|
-
}
|
|
1
|
+
import { BasicBlock } from '../BasicBlock';
|
|
2
|
+
import { ArkIRTransformer, ValueAndStmts } from '../../common/ArkIRTransformer';
|
|
3
|
+
import { BlockBuilder } from './CfgBuilder';
|
|
4
|
+
/**
|
|
5
|
+
* Builder for switch statement in CFG
|
|
6
|
+
*/
|
|
7
|
+
export declare class SwitchBuilder {
|
|
8
|
+
buildSwitch(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blockBuildersContainSwitch: BlockBuilder[], valueAndStmtsOfSwitchAndCasesAll: ValueAndStmts[][], arkIRTransformer: ArkIRTransformer, basicBlockSet: Set<BasicBlock>): void;
|
|
9
|
+
private generateIfBlocksForCases;
|
|
10
|
+
private linkIfBlockAndCaseBlock;
|
|
11
|
+
}
|
|
12
12
|
//# sourceMappingURL=SwitchBuilder.d.ts.map
|