• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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