Home | History | Annotate | Line # | Download | only in Utils
      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 
     18 namespace 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
     22 enum { kSanitizerStatKindBits = 3 };
     23 
     24 enum SanitizerStatKind {
     25   SanStat_CFI_VCall,
     26   SanStat_CFI_NVCall,
     27   SanStat_CFI_DerivedCast,
     28   SanStat_CFI_UnrelatedCast,
     29   SanStat_CFI_ICall,
     30 };
     31 
     32 struct 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 
     42 private:
     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