diff options
| author | Kostya Serebryany <kcc@google.com> | 2012-03-14 23:22:10 +0000 | 
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2012-03-14 23:22:10 +0000 | 
| commit | 01401cec0001a37790f7178ddc82364e59d96a90 (patch) | |
| tree | a8be880230c7191b9296f839e1c601ad98a9c3bd /llvm/lib/Transforms | |
| parent | 4d1d34fbfc9b01d49c3292c62aea5dafcfa0cf64 (diff) | |
| download | bcm5719-llvm-01401cec0001a37790f7178ddc82364e59d96a90.tar.gz bcm5719-llvm-01401cec0001a37790f7178ddc82364e59d96a90.zip | |
[asan] rename class BlackList to FunctionBlackList and move it into a separate file -- we will need the same functionality in ThreadSanitizer
llvm-svn: 152753
Diffstat (limited to 'llvm/lib/Transforms')
4 files changed, 120 insertions, 70 deletions
| diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 123e3990423..544e22cc017 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -15,6 +15,7 @@  #define DEBUG_TYPE "asan" +#include "FunctionBlackList.h"  #include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/OwningPtr.h"  #include "llvm/ADT/SmallSet.h" @@ -29,8 +30,6 @@  #include "llvm/Support/DataTypes.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/IRBuilder.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Regex.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Support/system_error.h"  #include "llvm/Target/TargetData.h" @@ -126,21 +125,6 @@ static cl::opt<int> ClDebugMax("asan-debug-max", cl::desc("Debug man inst"),  namespace { -// Blacklisted functions are not instrumented. -// The blacklist file contains one or more lines like this: -// --- -// fun:FunctionWildCard -// --- -// This is similar to the "ignore" feature of ThreadSanitizer. -// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores -class BlackList { - public: -  BlackList(const std::string &Path); -  bool isIn(const Function &F); - private: -  Regex *Functions; -}; -  /// AddressSanitizer: instrument the code in module to find memory bugs.  struct AddressSanitizer : public ModulePass {    AddressSanitizer(); @@ -195,7 +179,7 @@ struct AddressSanitizer : public ModulePass {    Function *AsanCtorFunction;    Function *AsanInitFunction;    Instruction *CtorInsertBefore; -  OwningPtr<BlackList> BL; +  OwningPtr<FunctionBlackList> BL;  };  }  // namespace @@ -551,7 +535,7 @@ bool AddressSanitizer::runOnModule(Module &M) {    TD = getAnalysisIfAvailable<TargetData>();    if (!TD)      return false; -  BL.reset(new BlackList(ClBlackListFile)); +  BL.reset(new FunctionBlackList(ClBlackListFile));    CurrentModule = &M;    C = &(M.getContext()); @@ -946,54 +930,3 @@ bool AddressSanitizer::poisonStackInFunction(Module &M, Function &F) {    return true;  } - -BlackList::BlackList(const std::string &Path) { -  Functions = NULL; -  const char *kFunPrefix = "fun:"; -  if (!ClBlackListFile.size()) return; -  std::string Fun; - -  OwningPtr<MemoryBuffer> File; -  if (error_code EC = MemoryBuffer::getFile(ClBlackListFile.c_str(), File)) { -    report_fatal_error("Can't open blacklist file " + ClBlackListFile + ": " + -                       EC.message()); -  } -  MemoryBuffer *Buff = File.take(); -  const char *Data = Buff->getBufferStart(); -  size_t DataLen = Buff->getBufferSize(); -  SmallVector<StringRef, 16> Lines; -  SplitString(StringRef(Data, DataLen), Lines, "\n\r"); -  for (size_t i = 0, numLines = Lines.size(); i < numLines; i++) { -    if (Lines[i].startswith(kFunPrefix)) { -      std::string ThisFunc = Lines[i].substr(strlen(kFunPrefix)); -      std::string ThisFuncRE; -      // add ThisFunc replacing * with .* -      for (size_t j = 0, n = ThisFunc.size(); j < n; j++) { -        if (ThisFunc[j] == '*') -          ThisFuncRE += '.'; -        ThisFuncRE += ThisFunc[j]; -      } -      // Check that the regexp is valid. -      Regex CheckRE(ThisFuncRE); -      std::string Error; -      if (!CheckRE.isValid(Error)) -        report_fatal_error("malformed blacklist regex: " + ThisFunc + -                           ": " + Error); -      // Append to the final regexp. -      if (Fun.size()) -        Fun += "|"; -      Fun += ThisFuncRE; -    } -  } -  if (Fun.size()) { -    Functions = new Regex(Fun); -  } -} - -bool BlackList::isIn(const Function &F) { -  if (Functions) { -    bool Res = Functions->match(F.getName()); -    return Res; -  } -  return false; -} diff --git a/llvm/lib/Transforms/Instrumentation/CMakeLists.txt b/llvm/lib/Transforms/Instrumentation/CMakeLists.txt index f8dbca389e8..e4c8cf105ce 100644 --- a/llvm/lib/Transforms/Instrumentation/CMakeLists.txt +++ b/llvm/lib/Transforms/Instrumentation/CMakeLists.txt @@ -1,6 +1,7 @@  add_llvm_library(LLVMInstrumentation    AddressSanitizer.cpp    EdgeProfiling.cpp +  FunctionBlackList.cpp    GCOVProfiling.cpp    Instrumentation.cpp    OptimalEdgeProfiling.cpp diff --git a/llvm/lib/Transforms/Instrumentation/FunctionBlackList.cpp b/llvm/lib/Transforms/Instrumentation/FunctionBlackList.cpp new file mode 100644 index 00000000000..188ea4d9b3c --- /dev/null +++ b/llvm/lib/Transforms/Instrumentation/FunctionBlackList.cpp @@ -0,0 +1,79 @@ +//===-- FunctionBlackList.cpp - blacklist of functions --------------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This is a utility class for instrumentation passes (like AddressSanitizer  +// or ThreadSanitizer) to avoid instrumenting some functions based on +// user-supplied blacklist. +// +//===----------------------------------------------------------------------===// + +#include "FunctionBlackList.h" +#include "llvm/ADT/OwningPtr.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/Function.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Regex.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/system_error.h" + +namespace llvm { + +FunctionBlackList::FunctionBlackList(const std::string &Path) { +  Functions = NULL; +  const char *kFunPrefix = "fun:"; +  if (!Path.size()) return; +  std::string Fun; + +  OwningPtr<MemoryBuffer> File; +  if (error_code EC = MemoryBuffer::getFile(Path.c_str(), File)) { +    report_fatal_error("Can't open blacklist file " + Path + ": " + +                       EC.message()); +  } +  MemoryBuffer *Buff = File.take(); +  const char *Data = Buff->getBufferStart(); +  size_t DataLen = Buff->getBufferSize(); +  SmallVector<StringRef, 16> Lines; +  SplitString(StringRef(Data, DataLen), Lines, "\n\r"); +  for (size_t i = 0, numLines = Lines.size(); i < numLines; i++) { +    if (Lines[i].startswith(kFunPrefix)) { +      std::string ThisFunc = Lines[i].substr(strlen(kFunPrefix)); +      std::string ThisFuncRE; +      // add ThisFunc replacing * with .* +      for (size_t j = 0, n = ThisFunc.size(); j < n; j++) { +        if (ThisFunc[j] == '*') +          ThisFuncRE += '.'; +        ThisFuncRE += ThisFunc[j]; +      } +      // Check that the regexp is valid. +      Regex CheckRE(ThisFuncRE); +      std::string Error; +      if (!CheckRE.isValid(Error)) +        report_fatal_error("malformed blacklist regex: " + ThisFunc + +                           ": " + Error); +      // Append to the final regexp. +      if (Fun.size()) +        Fun += "|"; +      Fun += ThisFuncRE; +    } +  } +  if (Fun.size()) { +    Functions = new Regex(Fun); +  } +} + +bool FunctionBlackList::isIn(const Function &F) { +  if (Functions) { +    bool Res = Functions->match(F.getName()); +    return Res; +  } +  return false; +} + +}  // namespace llvm diff --git a/llvm/lib/Transforms/Instrumentation/FunctionBlackList.h b/llvm/lib/Transforms/Instrumentation/FunctionBlackList.h new file mode 100644 index 00000000000..c1239b9b7e0 --- /dev/null +++ b/llvm/lib/Transforms/Instrumentation/FunctionBlackList.h @@ -0,0 +1,37 @@ +//===-- FunctionBlackList.cpp - blacklist of functions ----------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +//===----------------------------------------------------------------------===// +// +// This is a utility class for instrumentation passes (like AddressSanitizer +// or ThreadSanitizer) to avoid instrumenting some functions based on +// user-supplied blacklist. +// +//===----------------------------------------------------------------------===// +// + +#include <string> + +namespace llvm { +class Function; +class Regex; + +// Blacklisted functions are not instrumented. +// The blacklist file contains one or more lines like this: +// --- +// fun:FunctionWildCard +// --- +// This is similar to the "ignore" feature of ThreadSanitizer. +// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores +class FunctionBlackList { + public: +  FunctionBlackList(const std::string &Path); +  bool isIn(const Function &F); + private: +  Regex *Functions; +}; + +}  // namespace llvm | 

