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