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