| //===- SanitizerStats.h - Sanitizer statistics gathering -------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Declares functions and data structures for sanitizer statistics gathering. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H |
| #define LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H |
| |
| #include "llvm/IR/IRBuilder.h" |
| |
| namespace llvm { |
| |
| // Number of bits in data that are used for the sanitizer kind. Needs to match |
| // __sanitizer::kKindBits in compiler-rt/lib/stats/stats.h |
| enum { kSanitizerStatKindBits = 3 }; |
| |
| enum SanitizerStatKind { |
| SanStat_CFI_VCall, |
| SanStat_CFI_NVCall, |
| SanStat_CFI_DerivedCast, |
| SanStat_CFI_UnrelatedCast, |
| SanStat_CFI_ICall, |
| }; |
| |
| struct SanitizerStatReport { |
| SanitizerStatReport(Module *M); |
| |
| /// Generates code into B that increments a location-specific counter tagged |
| /// with the given sanitizer kind SK. |
| void create(IRBuilder<> &B, SanitizerStatKind SK); |
| |
| /// Finalize module stats array and add global constructor to register it. |
| void finish(); |
| |
| private: |
| Module *M; |
| GlobalVariable *ModuleStatsGV; |
| ArrayType *StatTy; |
| StructType *EmptyModuleStatsTy; |
| |
| std::vector<Constant *> Inits; |
| ArrayType *makeModuleStatsArrayTy(); |
| StructType *makeModuleStatsTy(); |
| }; |
| |
| } |
| |
| #endif |