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