1b5b86d263a651566cb25c0f406f75ceffb771029Kostya Serebryany//===-- BlackList.h - blacklist for sanitizers ------------------*- C++ -*-===//
2a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//
3a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//                     The LLVM Compiler Infrastructure
4a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//
5a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany// This file is distributed under the University of Illinois Open Source
6a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany// License. See LICENSE.TXT for details.
7a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//===----------------------------------------------------------------------===//
8a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//
9a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany// This is a utility class for instrumentation passes (like AddressSanitizer
102c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// or ThreadSanitizer) to avoid instrumenting some functions or global
112c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// variables based on a user-supplied blacklist.
122c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany//
132c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// The blacklist disables instrumentation of various functions and global
142c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// variables.  Each line contains a prefix, followed by a wild card expression.
152c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// ---
162c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// fun:*_ZN4base6subtle*
1759a4a47a7bea7cc17877c6a3954ad9f8309ff1cbKostya Serebryany// global:*global_with_bad_access_or_initialization*
1859a4a47a7bea7cc17877c6a3954ad9f8309ff1cbKostya Serebryany// global-init:*global_with_initialization_issues*
192c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// src:file_with_tricky_code.cc
202c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// ---
212c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// Note that the wild card is in fact an llvm::Regex, but * is automatically
222c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// replaced with .*
232c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// This is similar to the "ignore" feature of ThreadSanitizer.
242c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores
25a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//
26a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//===----------------------------------------------------------------------===//
27a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany//
28a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany
292c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany#include "llvm/ADT/StringMap.h"
30a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany
31a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryanynamespace llvm {
32a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryanyclass Function;
332c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryanyclass GlobalVariable;
342c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryanyclass Module;
35a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryanyclass Regex;
362c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryanyclass StringRef;
37a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany
38b5b86d263a651566cb25c0f406f75ceffb771029Kostya Serebryanyclass BlackList {
39a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany public:
40b5b86d263a651566cb25c0f406f75ceffb771029Kostya Serebryany  BlackList(const StringRef Path);
412c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  // Returns whether either this function or it's source file are blacklisted.
42a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany  bool isIn(const Function &F);
432c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  // Returns whether either this global or it's source file are blacklisted.
442c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  bool isIn(const GlobalVariable &G);
452c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  // Returns whether this module is blacklisted by filename.
462c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  bool isIn(const Module &M);
4759a4a47a7bea7cc17877c6a3954ad9f8309ff1cbKostya Serebryany  // Returns whether a global should be excluded from initialization checking.
4859a4a47a7bea7cc17877c6a3954ad9f8309ff1cbKostya Serebryany  bool isInInit(const GlobalVariable &G);
49a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany private:
502c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  StringMap<Regex*> Entries;
512c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany
522c5380666a15f21e0eedebeb77d3e557f861143fKostya Serebryany  bool inSection(const StringRef Section, const StringRef Query);
53a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany};
54a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany
55a1c45044099cf7fb4a072f1326f164706d5bb2e2Kostya Serebryany}  // namespace llvm
56