• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 #ifndef LIBLLVMBACKEND_TRANSFORMS_PASSES_GC_INTRUSION_CHECK_H
17 #define LIBLLVMBACKEND_TRANSFORMS_PASSES_GC_INTRUSION_CHECK_H
18 
19 #include <llvm/IR/PassManager.h>
20 
21 namespace ark::llvmbackend {
22 struct LLVMCompilerOptions;
23 }  // namespace ark::llvmbackend
24 
25 namespace llvm {
26 class GCRelocateInst;
27 class GCStatepointInst;
28 }  // namespace llvm
29 
30 namespace ark::llvmbackend::passes {
31 
32 class GcIntrusionCheck : public llvm::PassInfoMixin<GcIntrusionCheck> {
33 public:
34     static constexpr llvm::StringRef ARG_NAME = "gc-intrusion-check";
35 
36     static bool ShouldInsert(const ark::llvmbackend::LLVMCompilerOptions *options);
37 
38     // NOLINTNEXTLINE(readability-identifier-naming)
39     llvm::PreservedAnalyses run(llvm::Function &function, llvm::FunctionAnalysisManager &analysisManager);
40 
41 private:
42     void CheckStatepoint(const llvm::Function &func, const llvm::GCStatepointInst &statepoint);
43 
44     void CheckRelocate(const llvm::Function &func, const llvm::GCRelocateInst &relocate);
45 
46     void CheckInstruction(const llvm::Function &func, const llvm::Instruction &inst);
47 
48     const llvm::Instruction *FindDefOrStatepoint(const llvm::Instruction *start, const llvm::Instruction *def);
49 
50     const llvm::Instruction *FindDefOrStatepointRecursive(const llvm::Instruction *start, const llvm::Instruction *def,
51                                                           llvm::DenseSet<const llvm::BasicBlock *> *visited);
52 
53     bool IsHiddenGcRef(llvm::Value *ref);
54 
55     llvm::ArrayRef<llvm::Use> GetBundle(const llvm::GCStatepointInst &call, uint32_t id);
56 };
57 
58 }  // namespace ark::llvmbackend::passes
59 
60 #endif  //  LIBLLVMBACKEND_TRANSFORMS_PASSES_GC_INTRUSION_CHECK_H
61