1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "verify_mark.h"
17 #include "verification.h"
18 #include "verify_annotation.h"
19 #include "class_hierarchy.h"
20 #include "utils.h"
21
22 namespace maple {
23 #ifdef NOT_USED
Run(MIRModule * module,ModuleResultMgr * mgr)24 AnalysisResult *DoVerifyMark::Run(MIRModule *module, ModuleResultMgr *mgr)
25 {
26 LogInfo::MapleLogger() << "Start marking verification result" << '\n';
27
28 CHECK_FATAL(module != nullptr, "Module should not be null");
29
30 auto chaAnalysis = mgr->GetAnalysisResult(MoPhase_CHA, module);
31 if (chaAnalysis == nullptr) {
32 LogInfo::MapleLogger() << "Can't find class hierarchy result" << '\n';
33 return nullptr;
34 }
35 auto verifyAnalysis = mgr->GetAnalysisResult(MoPhase_VERIFICATION, module);
36 if (verifyAnalysis == nullptr) {
37 LogInfo::MapleLogger() << "Can't find verification result" << '\n';
38 return nullptr;
39 }
40
41 auto klassHierarchy = static_cast<KlassHierarchy *>(chaAnalysis);
42 const auto *verifyResult = static_cast<VerificationPhaseResult *>(verifyAnalysis);
43 const auto &verifyResultMap = verifyResult->GetDeferredClassesPragma();
44 for (auto &classResult : verifyResultMap) {
45 if (IsSystemPreloadedClass(classResult.first)) {
46 continue;
47 }
48 Klass &klass = utils::ToRef(klassHierarchy->GetKlassFromName(classResult.first));
49 klass.SetFlag(kClassRuntimeVerify);
50 LogInfo::MapleLogger() << "class " << klass.GetKlassName() << " is Set as NOT VERIFIED\n";
51 AddAnnotations(*module, klass, classResult.second);
52 }
53
54 LogInfo::MapleLogger() << "Finished marking verification result" << '\n';
55 return nullptr;
56 }
57
AddAnnotations(MIRModule & module,const Klass & klass,const std::vector<const VerifyPragmaInfo * > & pragmaInfoVec)58 void DoVerifyMark::AddAnnotations(MIRModule &module, const Klass &klass,
59 const std::vector<const VerifyPragmaInfo *> &pragmaInfoVec)
60 {
61 MIRStructType *mirStructType = klass.GetMIRStructType();
62 if (mirStructType == nullptr || pragmaInfoVec.empty()) {
63 return;
64 }
65 const auto &className = klass.GetKlassName();
66 std::vector<const AssignableCheckPragma *> assignableCheckPragmaVec;
67 for (auto *pragmaItem : pragmaInfoVec) {
68 switch (pragmaItem->GetPragmaType()) {
69 case kThrowVerifyError: {
70 auto *pragma = static_cast<const ThrowVerifyErrorPragma *>(pragmaItem);
71 AddVerfAnnoThrowVerifyError(module, *pragma, *mirStructType);
72 LogInfo::MapleLogger() << "\tInserted throw verify error annotation for class " << className
73 << std::endl;
74 LogInfo::MapleLogger() << "\tError: " << pragma->GetMessage() << std::endl;
75 break;
76 }
77 case kAssignableCheck: {
78 auto *pragma = static_cast<const AssignableCheckPragma *>(pragmaItem);
79 assignableCheckPragmaVec.push_back(pragma);
80 LogInfo::MapleLogger() << "\tInserted deferred assignable check from " << pragma->GetFromType()
81 << " to " << pragma->GetToType() << " in class " << className << '\n';
82 break;
83 }
84 case kExtendFinalCheck: {
85 AddVerfAnnoExtendFinalCheck(module, *mirStructType);
86 break;
87 }
88 case kOverrideFinalCheck: {
89 AddVerfAnnoOverrideFinalCheck(module, *mirStructType);
90 break;
91 }
92 default:
93 CHECK_FATAL(false, "\nError: Unknown Verify PragmaInfoType");
94 }
95 }
96 AddVerfAnnoAssignableCheck(module, assignableCheckPragmaVec, *mirStructType);
97 }
98 #endif
99 } // namespace maple
100