1303231Sdim//===- SanitizerStats.h - Sanitizer statistics gathering -------*- C++ -*-===// 2303231Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6303231Sdim// 7303231Sdim//===----------------------------------------------------------------------===// 8303231Sdim// 9303231Sdim// Declares functions and data structures for sanitizer statistics gathering. 10303231Sdim// 11303231Sdim//===----------------------------------------------------------------------===// 12303231Sdim 13303231Sdim#ifndef LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H 14303231Sdim#define LLVM_TRANSFORMS_UTILS_SANITIZERSTATS_H 15303231Sdim 16303231Sdim#include "llvm/IR/IRBuilder.h" 17303231Sdim 18303231Sdimnamespace llvm { 19303231Sdim 20303231Sdim// Number of bits in data that are used for the sanitizer kind. Needs to match 21303231Sdim// __sanitizer::kKindBits in compiler-rt/lib/stats/stats.h 22303231Sdimenum { kSanitizerStatKindBits = 3 }; 23303231Sdim 24303231Sdimenum SanitizerStatKind { 25303231Sdim SanStat_CFI_VCall, 26303231Sdim SanStat_CFI_NVCall, 27303231Sdim SanStat_CFI_DerivedCast, 28303231Sdim SanStat_CFI_UnrelatedCast, 29303231Sdim SanStat_CFI_ICall, 30303231Sdim}; 31303231Sdim 32303231Sdimstruct SanitizerStatReport { 33303231Sdim SanitizerStatReport(Module *M); 34303231Sdim 35303231Sdim /// Generates code into B that increments a location-specific counter tagged 36303231Sdim /// with the given sanitizer kind SK. 37303231Sdim void create(IRBuilder<> &B, SanitizerStatKind SK); 38303231Sdim 39303231Sdim /// Finalize module stats array and add global constructor to register it. 40303231Sdim void finish(); 41303231Sdim 42303231Sdimprivate: 43303231Sdim Module *M; 44303231Sdim GlobalVariable *ModuleStatsGV; 45303231Sdim ArrayType *StatTy; 46303231Sdim StructType *EmptyModuleStatsTy; 47303231Sdim 48303231Sdim std::vector<Constant *> Inits; 49303231Sdim ArrayType *makeModuleStatsArrayTy(); 50303231Sdim StructType *makeModuleStatsTy(); 51303231Sdim}; 52303231Sdim 53303231Sdim} 54303231Sdim 55303231Sdim#endif 56