1//===- SanitizerStats.h - Sanitizer statistics gathering -------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Declares functions and data structures for sanitizer statistics gathering. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H 14#define LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H 15 16#include "llvm/IR/IRBuilder.h" 17 18namespace llvm { 19 20// Number of bits in data that are used for the sanitizer kind. Needs to match 21// __sanitizer::kKindBits in compiler-rt/lib/stats/stats.h 22enum { kSanitizerStatKindBits = 3 }; 23 24enum SanitizerStatKind { 25 SanStat_CFI_VCall, 26 SanStat_CFI_NVCall, 27 SanStat_CFI_DerivedCast, 28 SanStat_CFI_UnrelatedCast, 29 SanStat_CFI_ICall, 30}; 31 32struct SanitizerStatReport { 33 SanitizerStatReport(Module *M); 34 35 /// Generates code into B that increments a location-specific counter tagged 36 /// with the given sanitizer kind SK. 37 void create(IRBuilder<> &B, SanitizerStatKind SK); 38 39 /// Finalize module stats array and add global constructor to register it. 40 void finish(); 41 42private: 43 Module *M; 44 GlobalVariable *ModuleStatsGV; 45 ArrayType *StatTy; 46 StructType *EmptyModuleStatsTy; 47 48 std::vector<Constant *> Inits; 49 ArrayType *makeModuleStatsArrayTy(); 50 StructType *makeModuleStatsTy(); 51}; 52 53} 54 55#endif 56