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,16 +1,16 @@
|
|
|
1
|
-
import { BasicBlock } from '../BasicBlock';
|
|
2
|
-
/**
|
|
3
|
-
* Builder for condition in CFG
|
|
4
|
-
*/
|
|
5
|
-
export declare class ConditionBuilder {
|
|
6
|
-
rebuildBlocksContainConditionalOperator(basicBlockSet: Set<BasicBlock>, isArkUIBuilder: boolean): void;
|
|
7
|
-
private relinkPrevAndSuccOfBlockContainConditionalOperator;
|
|
8
|
-
private generateBlocksContainConditionalOperatorGroup;
|
|
9
|
-
private generateBlocksContainSingleConditionalOperator;
|
|
10
|
-
private generateBlockWithoutConditionalOperator;
|
|
11
|
-
private deleteDummyConditionalOperatorStmt;
|
|
12
|
-
private findFirstConditionalOperator;
|
|
13
|
-
private removeUnnecessaryBlocksInConditionalOperator;
|
|
14
|
-
private replaceTempRecursively;
|
|
15
|
-
}
|
|
1
|
+
import { BasicBlock } from '../BasicBlock';
|
|
2
|
+
/**
|
|
3
|
+
* Builder for condition in CFG
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConditionBuilder {
|
|
6
|
+
rebuildBlocksContainConditionalOperator(basicBlockSet: Set<BasicBlock>, isArkUIBuilder: boolean): void;
|
|
7
|
+
private relinkPrevAndSuccOfBlockContainConditionalOperator;
|
|
8
|
+
private generateBlocksContainConditionalOperatorGroup;
|
|
9
|
+
private generateBlocksContainSingleConditionalOperator;
|
|
10
|
+
private generateBlockWithoutConditionalOperator;
|
|
11
|
+
private deleteDummyConditionalOperatorStmt;
|
|
12
|
+
private findFirstConditionalOperator;
|
|
13
|
+
private removeUnnecessaryBlocksInConditionalOperator;
|
|
14
|
+
private replaceTempRecursively;
|
|
15
|
+
}
|
|
16
16
|
//# sourceMappingURL=ConditionBuilder.d.ts.map
|
|
@@ -1,252 +1,252 @@
|
|
|
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.ConditionBuilder = void 0;
|
|
18
|
-
const BasicBlock_1 = require("../BasicBlock");
|
|
19
|
-
const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
|
|
20
|
-
const Stmt_1 = require("../../base/Stmt");
|
|
21
|
-
const Local_1 = require("../../base/Local");
|
|
22
|
-
const IRUtils_1 = require("../../common/IRUtils");
|
|
23
|
-
/**
|
|
24
|
-
* Builder for condition in CFG
|
|
25
|
-
*/
|
|
26
|
-
class ConditionBuilder {
|
|
27
|
-
rebuildBlocksContainConditionalOperator(basicBlockSet, isArkUIBuilder) {
|
|
28
|
-
var _a;
|
|
29
|
-
if (isArkUIBuilder) {
|
|
30
|
-
this.deleteDummyConditionalOperatorStmt(basicBlockSet);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const currBasicBlocks = Array.from(basicBlockSet);
|
|
34
|
-
for (const currBasicBlock of currBasicBlocks) {
|
|
35
|
-
const stmtsInCurrBasicBlock = Array.from(currBasicBlock.getStmts());
|
|
36
|
-
const stmtsCnt = stmtsInCurrBasicBlock.length;
|
|
37
|
-
let conditionalOperatorEndPos = -1;
|
|
38
|
-
for (let i = stmtsCnt - 1; i >= 0; i--) {
|
|
39
|
-
const stmt = stmtsInCurrBasicBlock[i];
|
|
40
|
-
if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT))) {
|
|
41
|
-
conditionalOperatorEndPos = i;
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
if (conditionalOperatorEndPos === -1) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
let { generatedTopBlock: generatedTopBlock, generatedBottomBlocks: generatedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(stmtsInCurrBasicBlock.slice(0, conditionalOperatorEndPos + 1), basicBlockSet);
|
|
49
|
-
if (conditionalOperatorEndPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
|
|
50
|
-
const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(stmtsInCurrBasicBlock.slice(conditionalOperatorEndPos + 1));
|
|
51
|
-
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
52
|
-
generatedBottomBlock.addSuccessorBlock(extraBlock);
|
|
53
|
-
extraBlock.addPredecessorBlock(generatedBottomBlock);
|
|
54
|
-
});
|
|
55
|
-
basicBlockSet.add(extraBlock);
|
|
56
|
-
generatedBottomBlocks = this.removeUnnecessaryBlocksInConditionalOperator(extraBlock, basicBlockSet);
|
|
57
|
-
}
|
|
58
|
-
this.relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks);
|
|
59
|
-
basicBlockSet.delete(currBasicBlock);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks) {
|
|
63
|
-
const predecessorsOfCurrBasicBlock = Array.from(currBasicBlock.getPredecessors());
|
|
64
|
-
predecessorsOfCurrBasicBlock.forEach(predecessor => {
|
|
65
|
-
predecessor.removeSuccessorBlock(currBasicBlock);
|
|
66
|
-
currBasicBlock.removePredecessorBlock(predecessor);
|
|
67
|
-
generatedTopBlock.addPredecessorBlock(predecessor);
|
|
68
|
-
predecessor.addSuccessorBlock(generatedTopBlock);
|
|
69
|
-
});
|
|
70
|
-
const successorsOfCurrBasicBlock = Array.from(currBasicBlock.getSuccessors());
|
|
71
|
-
successorsOfCurrBasicBlock.forEach(successor => {
|
|
72
|
-
successor.removePredecessorBlock(currBasicBlock);
|
|
73
|
-
currBasicBlock.removeSuccessorBlock(successor);
|
|
74
|
-
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
75
|
-
generatedBottomBlock.addSuccessorBlock(successor);
|
|
76
|
-
successor.addPredecessorBlock(generatedBottomBlock);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
generateBlocksContainConditionalOperatorGroup(sourceStmts, basicBlockSet) {
|
|
81
|
-
const { firstEndPos: firstEndPos } = this.findFirstConditionalOperator(sourceStmts);
|
|
82
|
-
if (firstEndPos === -1) {
|
|
83
|
-
return this.generateBlockWithoutConditionalOperator(sourceStmts);
|
|
84
|
-
}
|
|
85
|
-
const { generatedTopBlock: firstGeneratedTopBlock, generatedBottomBlocks: firstGeneratedBottomBlocks, generatedAllBlocks: firstGeneratedAllBlocks, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(0, firstEndPos + 1));
|
|
86
|
-
const generatedTopBlock = firstGeneratedTopBlock;
|
|
87
|
-
let generatedBottomBlocks = firstGeneratedBottomBlocks;
|
|
88
|
-
firstGeneratedAllBlocks.forEach(block => basicBlockSet.add(block));
|
|
89
|
-
const stmtsCnt = sourceStmts.length;
|
|
90
|
-
if (firstEndPos !== stmtsCnt - 1) { // need handle other conditional operators
|
|
91
|
-
const { generatedTopBlock: restGeneratedTopBlock, generatedBottomBlocks: restGeneratedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(sourceStmts.slice(firstEndPos + 1, stmtsCnt), basicBlockSet);
|
|
92
|
-
firstGeneratedBottomBlocks.forEach(firstGeneratedBottomBlock => {
|
|
93
|
-
firstGeneratedBottomBlock.addSuccessorBlock(restGeneratedTopBlock);
|
|
94
|
-
restGeneratedTopBlock.addPredecessorBlock(firstGeneratedBottomBlock);
|
|
95
|
-
});
|
|
96
|
-
restGeneratedBottomBlocks.forEach(block => basicBlockSet.add(block));
|
|
97
|
-
this.removeUnnecessaryBlocksInConditionalOperator(restGeneratedTopBlock, basicBlockSet);
|
|
98
|
-
generatedBottomBlocks = restGeneratedBottomBlocks;
|
|
99
|
-
}
|
|
100
|
-
return { generatedTopBlock, generatedBottomBlocks };
|
|
101
|
-
}
|
|
102
|
-
generateBlocksContainSingleConditionalOperator(sourceStmts) {
|
|
103
|
-
const { firstIfTruePos: ifTruePos, firstIfFalsePos: ifFalsePos, firstEndPos: endPos, } = this.findFirstConditionalOperator(sourceStmts);
|
|
104
|
-
if (endPos === -1) {
|
|
105
|
-
return this.generateBlockWithoutConditionalOperator(sourceStmts);
|
|
106
|
-
}
|
|
107
|
-
const { generatedTopBlock: generatedTopBlock, generatedAllBlocks: generatedAllBlocks, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(0, ifTruePos));
|
|
108
|
-
let generatedBottomBlocks = [];
|
|
109
|
-
const { generatedTopBlock: generatedTopBlockOfTrueBranch, generatedBottomBlocks: generatedBottomBlocksOfTrueBranch, generatedAllBlocks: generatedAllBlocksOfTrueBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifTruePos + 1, ifFalsePos));
|
|
110
|
-
generatedBottomBlocks.push(...generatedBottomBlocksOfTrueBranch);
|
|
111
|
-
generatedAllBlocks.push(...generatedAllBlocksOfTrueBranch);
|
|
112
|
-
const { generatedTopBlock: generatedTopBlockOfFalseBranch, generatedBottomBlocks: generatedBottomBlocksOfFalseBranch, generatedAllBlocks: generatedAllBlocksOfFalseBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifFalsePos + 1, endPos));
|
|
113
|
-
generatedBottomBlocks.push(...generatedBottomBlocksOfFalseBranch);
|
|
114
|
-
generatedAllBlocks.push(...generatedAllBlocksOfFalseBranch);
|
|
115
|
-
generatedTopBlock.addSuccessorBlock(generatedTopBlockOfTrueBranch);
|
|
116
|
-
generatedTopBlockOfTrueBranch.addPredecessorBlock(generatedTopBlock);
|
|
117
|
-
generatedTopBlock.addSuccessorBlock(generatedTopBlockOfFalseBranch);
|
|
118
|
-
generatedTopBlockOfFalseBranch.addPredecessorBlock(generatedTopBlock);
|
|
119
|
-
const stmtsCnt = sourceStmts.length;
|
|
120
|
-
if (endPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
|
|
121
|
-
const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(endPos + 1));
|
|
122
|
-
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
123
|
-
generatedBottomBlock.addSuccessorBlock(extraBlock);
|
|
124
|
-
extraBlock.addPredecessorBlock(generatedBottomBlock);
|
|
125
|
-
});
|
|
126
|
-
generatedBottomBlocks = [extraBlock];
|
|
127
|
-
generatedAllBlocks.push(extraBlock);
|
|
128
|
-
}
|
|
129
|
-
return { generatedTopBlock, generatedBottomBlocks, generatedAllBlocks };
|
|
130
|
-
}
|
|
131
|
-
generateBlockWithoutConditionalOperator(sourceStmts) {
|
|
132
|
-
const generatedBlock = new BasicBlock_1.BasicBlock();
|
|
133
|
-
sourceStmts.forEach(stmt => generatedBlock.addStmt(stmt));
|
|
134
|
-
return {
|
|
135
|
-
generatedTopBlock: generatedBlock,
|
|
136
|
-
generatedBottomBlocks: [generatedBlock],
|
|
137
|
-
generatedAllBlocks: [generatedBlock],
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
deleteDummyConditionalOperatorStmt(basicBlockSet) {
|
|
141
|
-
var _a;
|
|
142
|
-
for (const basicBlock of basicBlockSet) {
|
|
143
|
-
const stmts = Array.from(basicBlock.getStmts());
|
|
144
|
-
for (const stmt of stmts) {
|
|
145
|
-
if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR))) {
|
|
146
|
-
basicBlock.remove(stmt);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
findFirstConditionalOperator(stmts) {
|
|
152
|
-
let firstIfTruePos = -1;
|
|
153
|
-
let firstIfFalsePos = -1;
|
|
154
|
-
let firstEndPos = -1;
|
|
155
|
-
let firstConditionalOperatorNo = '';
|
|
156
|
-
for (let i = 0; i < stmts.length; i++) {
|
|
157
|
-
const stmt = stmts[i];
|
|
158
|
-
if (stmt instanceof ArkIRTransformer_1.DummyStmt) {
|
|
159
|
-
if (stmt.toString()
|
|
160
|
-
.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT) && firstIfTruePos ===
|
|
161
|
-
-1) {
|
|
162
|
-
firstIfTruePos = i;
|
|
163
|
-
firstConditionalOperatorNo =
|
|
164
|
-
stmt.toString().replace(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT, '');
|
|
165
|
-
}
|
|
166
|
-
else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_FALSE_STMT +
|
|
167
|
-
firstConditionalOperatorNo) {
|
|
168
|
-
firstIfFalsePos = i;
|
|
169
|
-
}
|
|
170
|
-
else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT +
|
|
171
|
-
firstConditionalOperatorNo) {
|
|
172
|
-
firstEndPos = i;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return { firstIfTruePos, firstIfFalsePos, firstEndPos };
|
|
177
|
-
}
|
|
178
|
-
removeUnnecessaryBlocksInConditionalOperator(bottomBlock, allBlocks) {
|
|
179
|
-
const firstStmtInBottom = bottomBlock.getStmts()[0];
|
|
180
|
-
if (!(firstStmtInBottom instanceof Stmt_1.ArkAssignStmt)) {
|
|
181
|
-
return [bottomBlock];
|
|
182
|
-
}
|
|
183
|
-
const targetValue = firstStmtInBottom.getLeftOp();
|
|
184
|
-
const tempResultValue = firstStmtInBottom.getRightOp();
|
|
185
|
-
if (!(targetValue instanceof Local_1.Local && IRUtils_1.IRUtils.isTempLocal(tempResultValue))) {
|
|
186
|
-
return [bottomBlock];
|
|
187
|
-
}
|
|
188
|
-
const oldPredecessors = Array.from(bottomBlock.getPredecessors());
|
|
189
|
-
const newPredecessors = [];
|
|
190
|
-
for (const predecessor of oldPredecessors) {
|
|
191
|
-
predecessor.removeSuccessorBlock(bottomBlock);
|
|
192
|
-
newPredecessors.push(...this.replaceTempRecursively(predecessor, targetValue, tempResultValue, allBlocks));
|
|
193
|
-
}
|
|
194
|
-
bottomBlock.remove(firstStmtInBottom);
|
|
195
|
-
if (bottomBlock.getStmts().length === 0) { // must be a new block without successors
|
|
196
|
-
allBlocks.delete(bottomBlock);
|
|
197
|
-
return newPredecessors;
|
|
198
|
-
}
|
|
199
|
-
oldPredecessors.forEach((oldPredecessor) => {
|
|
200
|
-
bottomBlock.removePredecessorBlock(oldPredecessor);
|
|
201
|
-
});
|
|
202
|
-
newPredecessors.forEach((newPredecessor) => {
|
|
203
|
-
bottomBlock.addPredecessorBlock(newPredecessor);
|
|
204
|
-
newPredecessor.addSuccessorBlock(bottomBlock);
|
|
205
|
-
});
|
|
206
|
-
return [bottomBlock];
|
|
207
|
-
}
|
|
208
|
-
replaceTempRecursively(currBottomBlock, targetLocal, tempResultLocal, allBlocks) {
|
|
209
|
-
const stmts = currBottomBlock.getStmts();
|
|
210
|
-
const stmtsCnt = stmts.length;
|
|
211
|
-
let tempResultReassignStmt = null;
|
|
212
|
-
for (let i = stmtsCnt - 1; i >= 0; i--) {
|
|
213
|
-
const stmt = stmts[i];
|
|
214
|
-
if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getLeftOp() === tempResultLocal) {
|
|
215
|
-
if (IRUtils_1.IRUtils.isTempLocal(stmt.getRightOp())) {
|
|
216
|
-
tempResultReassignStmt = stmt;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
stmt.setLeftOp(targetLocal);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
let newBottomBlocks = [];
|
|
224
|
-
if (tempResultReassignStmt) {
|
|
225
|
-
const oldPredecessors = currBottomBlock.getPredecessors();
|
|
226
|
-
const newPredecessors = [];
|
|
227
|
-
const prevTempResultLocal = tempResultReassignStmt.getRightOp();
|
|
228
|
-
for (const predecessor of oldPredecessors) {
|
|
229
|
-
predecessor.removeSuccessorBlock(currBottomBlock);
|
|
230
|
-
newPredecessors.push(...this.replaceTempRecursively(predecessor, targetLocal, prevTempResultLocal, allBlocks));
|
|
231
|
-
}
|
|
232
|
-
currBottomBlock.remove(tempResultReassignStmt);
|
|
233
|
-
if (currBottomBlock.getStmts().length === 0) {
|
|
234
|
-
// remove this block
|
|
235
|
-
newBottomBlocks = newPredecessors;
|
|
236
|
-
allBlocks.delete(currBottomBlock);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
currBottomBlock.getPredecessors().splice(0, oldPredecessors.length, ...newPredecessors);
|
|
240
|
-
newPredecessors.forEach((newPredecessor) => {
|
|
241
|
-
newPredecessor.addSuccessorBlock(currBottomBlock);
|
|
242
|
-
});
|
|
243
|
-
newBottomBlocks = [currBottomBlock];
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
newBottomBlocks = [currBottomBlock];
|
|
248
|
-
}
|
|
249
|
-
return newBottomBlocks;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
exports.ConditionBuilder = ConditionBuilder;
|
|
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.ConditionBuilder = void 0;
|
|
18
|
+
const BasicBlock_1 = require("../BasicBlock");
|
|
19
|
+
const ArkIRTransformer_1 = require("../../common/ArkIRTransformer");
|
|
20
|
+
const Stmt_1 = require("../../base/Stmt");
|
|
21
|
+
const Local_1 = require("../../base/Local");
|
|
22
|
+
const IRUtils_1 = require("../../common/IRUtils");
|
|
23
|
+
/**
|
|
24
|
+
* Builder for condition in CFG
|
|
25
|
+
*/
|
|
26
|
+
class ConditionBuilder {
|
|
27
|
+
rebuildBlocksContainConditionalOperator(basicBlockSet, isArkUIBuilder) {
|
|
28
|
+
var _a;
|
|
29
|
+
if (isArkUIBuilder) {
|
|
30
|
+
this.deleteDummyConditionalOperatorStmt(basicBlockSet);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const currBasicBlocks = Array.from(basicBlockSet);
|
|
34
|
+
for (const currBasicBlock of currBasicBlocks) {
|
|
35
|
+
const stmtsInCurrBasicBlock = Array.from(currBasicBlock.getStmts());
|
|
36
|
+
const stmtsCnt = stmtsInCurrBasicBlock.length;
|
|
37
|
+
let conditionalOperatorEndPos = -1;
|
|
38
|
+
for (let i = stmtsCnt - 1; i >= 0; i--) {
|
|
39
|
+
const stmt = stmtsInCurrBasicBlock[i];
|
|
40
|
+
if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT))) {
|
|
41
|
+
conditionalOperatorEndPos = i;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (conditionalOperatorEndPos === -1) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
let { generatedTopBlock: generatedTopBlock, generatedBottomBlocks: generatedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(stmtsInCurrBasicBlock.slice(0, conditionalOperatorEndPos + 1), basicBlockSet);
|
|
49
|
+
if (conditionalOperatorEndPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
|
|
50
|
+
const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(stmtsInCurrBasicBlock.slice(conditionalOperatorEndPos + 1));
|
|
51
|
+
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
52
|
+
generatedBottomBlock.addSuccessorBlock(extraBlock);
|
|
53
|
+
extraBlock.addPredecessorBlock(generatedBottomBlock);
|
|
54
|
+
});
|
|
55
|
+
basicBlockSet.add(extraBlock);
|
|
56
|
+
generatedBottomBlocks = this.removeUnnecessaryBlocksInConditionalOperator(extraBlock, basicBlockSet);
|
|
57
|
+
}
|
|
58
|
+
this.relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks);
|
|
59
|
+
basicBlockSet.delete(currBasicBlock);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
relinkPrevAndSuccOfBlockContainConditionalOperator(currBasicBlock, generatedTopBlock, generatedBottomBlocks) {
|
|
63
|
+
const predecessorsOfCurrBasicBlock = Array.from(currBasicBlock.getPredecessors());
|
|
64
|
+
predecessorsOfCurrBasicBlock.forEach(predecessor => {
|
|
65
|
+
predecessor.removeSuccessorBlock(currBasicBlock);
|
|
66
|
+
currBasicBlock.removePredecessorBlock(predecessor);
|
|
67
|
+
generatedTopBlock.addPredecessorBlock(predecessor);
|
|
68
|
+
predecessor.addSuccessorBlock(generatedTopBlock);
|
|
69
|
+
});
|
|
70
|
+
const successorsOfCurrBasicBlock = Array.from(currBasicBlock.getSuccessors());
|
|
71
|
+
successorsOfCurrBasicBlock.forEach(successor => {
|
|
72
|
+
successor.removePredecessorBlock(currBasicBlock);
|
|
73
|
+
currBasicBlock.removeSuccessorBlock(successor);
|
|
74
|
+
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
75
|
+
generatedBottomBlock.addSuccessorBlock(successor);
|
|
76
|
+
successor.addPredecessorBlock(generatedBottomBlock);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
generateBlocksContainConditionalOperatorGroup(sourceStmts, basicBlockSet) {
|
|
81
|
+
const { firstEndPos: firstEndPos } = this.findFirstConditionalOperator(sourceStmts);
|
|
82
|
+
if (firstEndPos === -1) {
|
|
83
|
+
return this.generateBlockWithoutConditionalOperator(sourceStmts);
|
|
84
|
+
}
|
|
85
|
+
const { generatedTopBlock: firstGeneratedTopBlock, generatedBottomBlocks: firstGeneratedBottomBlocks, generatedAllBlocks: firstGeneratedAllBlocks, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(0, firstEndPos + 1));
|
|
86
|
+
const generatedTopBlock = firstGeneratedTopBlock;
|
|
87
|
+
let generatedBottomBlocks = firstGeneratedBottomBlocks;
|
|
88
|
+
firstGeneratedAllBlocks.forEach(block => basicBlockSet.add(block));
|
|
89
|
+
const stmtsCnt = sourceStmts.length;
|
|
90
|
+
if (firstEndPos !== stmtsCnt - 1) { // need handle other conditional operators
|
|
91
|
+
const { generatedTopBlock: restGeneratedTopBlock, generatedBottomBlocks: restGeneratedBottomBlocks, } = this.generateBlocksContainConditionalOperatorGroup(sourceStmts.slice(firstEndPos + 1, stmtsCnt), basicBlockSet);
|
|
92
|
+
firstGeneratedBottomBlocks.forEach(firstGeneratedBottomBlock => {
|
|
93
|
+
firstGeneratedBottomBlock.addSuccessorBlock(restGeneratedTopBlock);
|
|
94
|
+
restGeneratedTopBlock.addPredecessorBlock(firstGeneratedBottomBlock);
|
|
95
|
+
});
|
|
96
|
+
restGeneratedBottomBlocks.forEach(block => basicBlockSet.add(block));
|
|
97
|
+
this.removeUnnecessaryBlocksInConditionalOperator(restGeneratedTopBlock, basicBlockSet);
|
|
98
|
+
generatedBottomBlocks = restGeneratedBottomBlocks;
|
|
99
|
+
}
|
|
100
|
+
return { generatedTopBlock, generatedBottomBlocks };
|
|
101
|
+
}
|
|
102
|
+
generateBlocksContainSingleConditionalOperator(sourceStmts) {
|
|
103
|
+
const { firstIfTruePos: ifTruePos, firstIfFalsePos: ifFalsePos, firstEndPos: endPos, } = this.findFirstConditionalOperator(sourceStmts);
|
|
104
|
+
if (endPos === -1) {
|
|
105
|
+
return this.generateBlockWithoutConditionalOperator(sourceStmts);
|
|
106
|
+
}
|
|
107
|
+
const { generatedTopBlock: generatedTopBlock, generatedAllBlocks: generatedAllBlocks, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(0, ifTruePos));
|
|
108
|
+
let generatedBottomBlocks = [];
|
|
109
|
+
const { generatedTopBlock: generatedTopBlockOfTrueBranch, generatedBottomBlocks: generatedBottomBlocksOfTrueBranch, generatedAllBlocks: generatedAllBlocksOfTrueBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifTruePos + 1, ifFalsePos));
|
|
110
|
+
generatedBottomBlocks.push(...generatedBottomBlocksOfTrueBranch);
|
|
111
|
+
generatedAllBlocks.push(...generatedAllBlocksOfTrueBranch);
|
|
112
|
+
const { generatedTopBlock: generatedTopBlockOfFalseBranch, generatedBottomBlocks: generatedBottomBlocksOfFalseBranch, generatedAllBlocks: generatedAllBlocksOfFalseBranch, } = this.generateBlocksContainSingleConditionalOperator(sourceStmts.slice(ifFalsePos + 1, endPos));
|
|
113
|
+
generatedBottomBlocks.push(...generatedBottomBlocksOfFalseBranch);
|
|
114
|
+
generatedAllBlocks.push(...generatedAllBlocksOfFalseBranch);
|
|
115
|
+
generatedTopBlock.addSuccessorBlock(generatedTopBlockOfTrueBranch);
|
|
116
|
+
generatedTopBlockOfTrueBranch.addPredecessorBlock(generatedTopBlock);
|
|
117
|
+
generatedTopBlock.addSuccessorBlock(generatedTopBlockOfFalseBranch);
|
|
118
|
+
generatedTopBlockOfFalseBranch.addPredecessorBlock(generatedTopBlock);
|
|
119
|
+
const stmtsCnt = sourceStmts.length;
|
|
120
|
+
if (endPos !== stmtsCnt - 1) { // need create a new basic block for rest statements
|
|
121
|
+
const { generatedTopBlock: extraBlock, } = this.generateBlockWithoutConditionalOperator(sourceStmts.slice(endPos + 1));
|
|
122
|
+
generatedBottomBlocks.forEach(generatedBottomBlock => {
|
|
123
|
+
generatedBottomBlock.addSuccessorBlock(extraBlock);
|
|
124
|
+
extraBlock.addPredecessorBlock(generatedBottomBlock);
|
|
125
|
+
});
|
|
126
|
+
generatedBottomBlocks = [extraBlock];
|
|
127
|
+
generatedAllBlocks.push(extraBlock);
|
|
128
|
+
}
|
|
129
|
+
return { generatedTopBlock, generatedBottomBlocks, generatedAllBlocks };
|
|
130
|
+
}
|
|
131
|
+
generateBlockWithoutConditionalOperator(sourceStmts) {
|
|
132
|
+
const generatedBlock = new BasicBlock_1.BasicBlock();
|
|
133
|
+
sourceStmts.forEach(stmt => generatedBlock.addStmt(stmt));
|
|
134
|
+
return {
|
|
135
|
+
generatedTopBlock: generatedBlock,
|
|
136
|
+
generatedBottomBlocks: [generatedBlock],
|
|
137
|
+
generatedAllBlocks: [generatedBlock],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
deleteDummyConditionalOperatorStmt(basicBlockSet) {
|
|
141
|
+
var _a;
|
|
142
|
+
for (const basicBlock of basicBlockSet) {
|
|
143
|
+
const stmts = Array.from(basicBlock.getStmts());
|
|
144
|
+
for (const stmt of stmts) {
|
|
145
|
+
if (stmt instanceof ArkIRTransformer_1.DummyStmt && ((_a = stmt.toString()) === null || _a === void 0 ? void 0 : _a.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR))) {
|
|
146
|
+
basicBlock.remove(stmt);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
findFirstConditionalOperator(stmts) {
|
|
152
|
+
let firstIfTruePos = -1;
|
|
153
|
+
let firstIfFalsePos = -1;
|
|
154
|
+
let firstEndPos = -1;
|
|
155
|
+
let firstConditionalOperatorNo = '';
|
|
156
|
+
for (let i = 0; i < stmts.length; i++) {
|
|
157
|
+
const stmt = stmts[i];
|
|
158
|
+
if (stmt instanceof ArkIRTransformer_1.DummyStmt) {
|
|
159
|
+
if (stmt.toString()
|
|
160
|
+
.startsWith(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT) && firstIfTruePos ===
|
|
161
|
+
-1) {
|
|
162
|
+
firstIfTruePos = i;
|
|
163
|
+
firstConditionalOperatorNo =
|
|
164
|
+
stmt.toString().replace(ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_TRUE_STMT, '');
|
|
165
|
+
}
|
|
166
|
+
else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_IF_FALSE_STMT +
|
|
167
|
+
firstConditionalOperatorNo) {
|
|
168
|
+
firstIfFalsePos = i;
|
|
169
|
+
}
|
|
170
|
+
else if (stmt.toString() === ArkIRTransformer_1.ArkIRTransformer.DUMMY_CONDITIONAL_OPERATOR_END_STMT +
|
|
171
|
+
firstConditionalOperatorNo) {
|
|
172
|
+
firstEndPos = i;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { firstIfTruePos, firstIfFalsePos, firstEndPos };
|
|
177
|
+
}
|
|
178
|
+
removeUnnecessaryBlocksInConditionalOperator(bottomBlock, allBlocks) {
|
|
179
|
+
const firstStmtInBottom = bottomBlock.getStmts()[0];
|
|
180
|
+
if (!(firstStmtInBottom instanceof Stmt_1.ArkAssignStmt)) {
|
|
181
|
+
return [bottomBlock];
|
|
182
|
+
}
|
|
183
|
+
const targetValue = firstStmtInBottom.getLeftOp();
|
|
184
|
+
const tempResultValue = firstStmtInBottom.getRightOp();
|
|
185
|
+
if (!(targetValue instanceof Local_1.Local && IRUtils_1.IRUtils.isTempLocal(tempResultValue))) {
|
|
186
|
+
return [bottomBlock];
|
|
187
|
+
}
|
|
188
|
+
const oldPredecessors = Array.from(bottomBlock.getPredecessors());
|
|
189
|
+
const newPredecessors = [];
|
|
190
|
+
for (const predecessor of oldPredecessors) {
|
|
191
|
+
predecessor.removeSuccessorBlock(bottomBlock);
|
|
192
|
+
newPredecessors.push(...this.replaceTempRecursively(predecessor, targetValue, tempResultValue, allBlocks));
|
|
193
|
+
}
|
|
194
|
+
bottomBlock.remove(firstStmtInBottom);
|
|
195
|
+
if (bottomBlock.getStmts().length === 0) { // must be a new block without successors
|
|
196
|
+
allBlocks.delete(bottomBlock);
|
|
197
|
+
return newPredecessors;
|
|
198
|
+
}
|
|
199
|
+
oldPredecessors.forEach((oldPredecessor) => {
|
|
200
|
+
bottomBlock.removePredecessorBlock(oldPredecessor);
|
|
201
|
+
});
|
|
202
|
+
newPredecessors.forEach((newPredecessor) => {
|
|
203
|
+
bottomBlock.addPredecessorBlock(newPredecessor);
|
|
204
|
+
newPredecessor.addSuccessorBlock(bottomBlock);
|
|
205
|
+
});
|
|
206
|
+
return [bottomBlock];
|
|
207
|
+
}
|
|
208
|
+
replaceTempRecursively(currBottomBlock, targetLocal, tempResultLocal, allBlocks) {
|
|
209
|
+
const stmts = currBottomBlock.getStmts();
|
|
210
|
+
const stmtsCnt = stmts.length;
|
|
211
|
+
let tempResultReassignStmt = null;
|
|
212
|
+
for (let i = stmtsCnt - 1; i >= 0; i--) {
|
|
213
|
+
const stmt = stmts[i];
|
|
214
|
+
if (stmt instanceof Stmt_1.ArkAssignStmt && stmt.getLeftOp() === tempResultLocal) {
|
|
215
|
+
if (IRUtils_1.IRUtils.isTempLocal(stmt.getRightOp())) {
|
|
216
|
+
tempResultReassignStmt = stmt;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
stmt.setLeftOp(targetLocal);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
let newBottomBlocks = [];
|
|
224
|
+
if (tempResultReassignStmt) {
|
|
225
|
+
const oldPredecessors = currBottomBlock.getPredecessors();
|
|
226
|
+
const newPredecessors = [];
|
|
227
|
+
const prevTempResultLocal = tempResultReassignStmt.getRightOp();
|
|
228
|
+
for (const predecessor of oldPredecessors) {
|
|
229
|
+
predecessor.removeSuccessorBlock(currBottomBlock);
|
|
230
|
+
newPredecessors.push(...this.replaceTempRecursively(predecessor, targetLocal, prevTempResultLocal, allBlocks));
|
|
231
|
+
}
|
|
232
|
+
currBottomBlock.remove(tempResultReassignStmt);
|
|
233
|
+
if (currBottomBlock.getStmts().length === 0) {
|
|
234
|
+
// remove this block
|
|
235
|
+
newBottomBlocks = newPredecessors;
|
|
236
|
+
allBlocks.delete(currBottomBlock);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
currBottomBlock.getPredecessors().splice(0, oldPredecessors.length, ...newPredecessors);
|
|
240
|
+
newPredecessors.forEach((newPredecessor) => {
|
|
241
|
+
newPredecessor.addSuccessorBlock(currBottomBlock);
|
|
242
|
+
});
|
|
243
|
+
newBottomBlocks = [currBottomBlock];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
newBottomBlocks = [currBottomBlock];
|
|
248
|
+
}
|
|
249
|
+
return newBottomBlocks;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.ConditionBuilder = ConditionBuilder;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { BasicBlock } from '../BasicBlock';
|
|
2
|
-
import { BlockBuilder } from './CfgBuilder';
|
|
3
|
-
/**
|
|
4
|
-
* Builder for loop in CFG
|
|
5
|
-
*/
|
|
6
|
-
export declare class LoopBuilder {
|
|
7
|
-
rebuildBlocksInLoop(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blocksContainLoopCondition: Set<BlockBuilder>, basicBlockSet: Set<BasicBlock>, blockBuilders: BlockBuilder[]): void;
|
|
8
|
-
private doesPrevBlockBuilderContainLoop;
|
|
9
|
-
private insertBeforeConditionBlockBuilder;
|
|
10
|
-
private getBlockFromMap;
|
|
11
|
-
private collectBlocksBeforeAndReenter;
|
|
12
|
-
private getCollectedBlocks;
|
|
13
|
-
private createAndLinkBlocks;
|
|
14
|
-
private updatePredecessors;
|
|
15
|
-
private getNewPrevBlocks;
|
|
16
|
-
private updateConditionBlockBuilder;
|
|
17
|
-
private finalizeInsertion;
|
|
18
|
-
private findIteratorIdx;
|
|
19
|
-
private adjustIncrementorStmts;
|
|
20
|
-
}
|
|
1
|
+
import { BasicBlock } from '../BasicBlock';
|
|
2
|
+
import { BlockBuilder } from './CfgBuilder';
|
|
3
|
+
/**
|
|
4
|
+
* Builder for loop in CFG
|
|
5
|
+
*/
|
|
6
|
+
export declare class LoopBuilder {
|
|
7
|
+
rebuildBlocksInLoop(blockBuilderToCfgBlock: Map<BlockBuilder, BasicBlock>, blocksContainLoopCondition: Set<BlockBuilder>, basicBlockSet: Set<BasicBlock>, blockBuilders: BlockBuilder[]): void;
|
|
8
|
+
private doesPrevBlockBuilderContainLoop;
|
|
9
|
+
private insertBeforeConditionBlockBuilder;
|
|
10
|
+
private getBlockFromMap;
|
|
11
|
+
private collectBlocksBeforeAndReenter;
|
|
12
|
+
private getCollectedBlocks;
|
|
13
|
+
private createAndLinkBlocks;
|
|
14
|
+
private updatePredecessors;
|
|
15
|
+
private getNewPrevBlocks;
|
|
16
|
+
private updateConditionBlockBuilder;
|
|
17
|
+
private finalizeInsertion;
|
|
18
|
+
private findIteratorIdx;
|
|
19
|
+
private adjustIncrementorStmts;
|
|
20
|
+
}
|
|
21
21
|
//# sourceMappingURL=LoopBuilder.d.ts.map
|