Teach SanitizerBlacklist to blacklist by SourceLocation. NFC.
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 16 Oct 2014 23:50:26 +0000 (23:50 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 16 Oct 2014 23:50:26 +0000 (23:50 +0000)
llvm-svn: 219993

clang/include/clang/Basic/SanitizerBlacklist.h
clang/lib/AST/ASTContext.cpp
clang/lib/AST/Decl.cpp
clang/lib/Basic/SanitizerBlacklist.cpp

index 8fa4357..dfe55a1 100644 (file)
 #define LLVM_CLANG_BASIC_SANITIZERBLACKLIST_H
 
 #include "clang/Basic/LLVM.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/SourceManager.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/SpecialCaseList.h"
 #include <memory>
-#include <string>
 
 namespace llvm {
 class GlobalVariable;
@@ -29,9 +30,10 @@ namespace clang {
 
 class SanitizerBlacklist {
   std::unique_ptr<llvm::SpecialCaseList> SCL;
+  SourceManager &SM;
 
 public:
-  SanitizerBlacklist(const std::string &BlacklistPath);
+  SanitizerBlacklist(StringRef BlacklistPath, SourceManager &SM);
   bool isIn(const llvm::Function &F) const;
   bool isIn(const llvm::GlobalVariable &G,
             StringRef Category = StringRef()) const;
@@ -40,6 +42,8 @@ public:
   bool isBlacklistedFunction(StringRef FunctionName) const;
   bool isBlacklistedFile(StringRef FileName,
                          StringRef Category = StringRef()) const;
+  bool isBlacklistedLocation(SourceLocation Loc,
+                             StringRef Category = StringRef()) const;
 };
 
 }  // end namespace clang
index 0c8fa2a..8f8ae8d 100644 (file)
@@ -738,7 +738,7 @@ ASTContext::ASTContext(LangOptions &LOpts, SourceManager &SM,
       BlockDescriptorExtendedType(nullptr), cudaConfigureCallDecl(nullptr),
       NullTypeSourceInfo(QualType()), FirstLocalImport(), LastLocalImport(),
       SourceMgr(SM), LangOpts(LOpts),
-      SanitizerBL(new SanitizerBlacklist(LangOpts.Sanitize.BlacklistFile)),
+      SanitizerBL(new SanitizerBlacklist(LangOpts.Sanitize.BlacklistFile, SM)),
       AddrSpaceMap(nullptr), Target(nullptr), PrintingPolicy(LOpts),
       Idents(idents), Selectors(sels), BuiltinInfo(builtins),
       DeclarationNames(*this), ExternalSource(nullptr), Listener(nullptr),
index c01272e..0de5459 100644 (file)
@@ -3621,9 +3621,8 @@ bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
   if (!Context.getLangOpts().Sanitize.Address ||
       !Context.getLangOpts().Sanitize.SanitizeAddressFieldPadding)
     return false;
-  auto &Blacklist = Context.getSanitizerBlacklist();
+  const auto &Blacklist = Context.getSanitizerBlacklist();
   const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(this);
-  StringRef Filename = Context.getSourceManager().getFilename(getLocation());
   // We may be able to relax some of these requirements.
   int ReasonToReject = -1;
   if (!CXXRD || CXXRD->isExternCContext())
@@ -3638,7 +3637,7 @@ bool RecordDecl::mayInsertExtraPadding(bool EmitRemark) const {
     ReasonToReject = 4;  // has trivial destructor.
   else if (CXXRD->isStandardLayout())
     ReasonToReject = 5;  // is standard layout.
-  else if (Blacklist.isBlacklistedFile(Filename, "field-padding"))
+  else if (Blacklist.isBlacklistedLocation(getLocation(), "field-padding"))
     ReasonToReject = 6;  // is in a blacklisted file.
   else if (Blacklist.isBlacklistedType(getQualifiedNameAsString(),
                                        "field-padding"))
index 84ec210..f022133 100644 (file)
@@ -29,8 +29,9 @@ static StringRef GetGlobalTypeString(const llvm::GlobalValue &G) {
   return "<unknown type>";
 }
 
-SanitizerBlacklist::SanitizerBlacklist(const std::string &BlacklistPath)
-    : SCL(llvm::SpecialCaseList::createOrDie(BlacklistPath)) {}
+SanitizerBlacklist::SanitizerBlacklist(StringRef BlacklistPath,
+                                       SourceManager &SM)
+    : SCL(llvm::SpecialCaseList::createOrDie(BlacklistPath)), SM(SM) {}
 
 bool SanitizerBlacklist::isIn(const llvm::Function &F) const {
   return isBlacklistedFile(F.getParent()->getModuleIdentifier()) ||
@@ -57,3 +58,9 @@ bool SanitizerBlacklist::isBlacklistedFile(StringRef FileName,
                                            StringRef Category) const {
   return SCL->inSection("src", FileName, Category);
 }
+
+bool SanitizerBlacklist::isBlacklistedLocation(SourceLocation Loc,
+                                               StringRef Category) const {
+  return !Loc.isInvalid() && isBlacklistedFile(SM.getFilename(Loc), Category);
+}
+