[clang] 8b6ae9b - [-Wunsafe-buffer-usage] Emit Fix-Its only for C++20 and later standards

2023-02-09 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2023-02-09T17:28:27-08:00
New Revision: 8b6ae9bd7466bd3ceefcd8bd0262b9b085481697

URL: 
https://github.com/llvm/llvm-project/commit/8b6ae9bd7466bd3ceefcd8bd0262b9b085481697
DIFF: 
https://github.com/llvm/llvm-project/commit/8b6ae9bd7466bd3ceefcd8bd0262b9b085481697.diff

LOG: [-Wunsafe-buffer-usage] Emit Fix-Its only for C++20 and later standards

The transformation strategy we are bringing up heavily relies on std::span 
which was introduced as part of C++20.

Differential Revision: https://reviews.llvm.org/D143455

Added: 
clang/test/SemaCXX/warn-unsafe-buffer-usage-no-fixits.cpp

Modified: 
clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
clang/lib/Analysis/UnsafeBufferUsage.cpp
clang/lib/Sema/AnalysisBasedWarnings.cpp

Removed: 




diff  --git a/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h 
b/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
index 926a4fce3ae74..8957ab664ed93 100644
--- a/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
+++ b/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
@@ -53,7 +53,8 @@ class UnsafeBufferUsageHandler {
 
 // This function invokes the analysis and allows the caller to react to it
 // through the handler class.
-void checkUnsafeBufferUsage(const Decl *D, UnsafeBufferUsageHandler );
+void checkUnsafeBufferUsage(const Decl *D, UnsafeBufferUsageHandler ,
+bool EmitFixits);
 
 namespace internal {
 // Tests if any two `FixItHint`s in `FixIts` conflict.  Two `FixItHint`s

diff  --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp 
b/clang/lib/Analysis/UnsafeBufferUsage.cpp
index ebf9b352e7bc7..61c2c4e4b52ad 100644
--- a/clang/lib/Analysis/UnsafeBufferUsage.cpp
+++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp
@@ -1008,7 +1008,8 @@ getNaiveStrategy(const llvm::SmallVectorImpl ) {
 }
 
 void clang::checkUnsafeBufferUsage(const Decl *D,
-   UnsafeBufferUsageHandler ) {
+   UnsafeBufferUsageHandler ,
+   bool EmitFixits) {
   assert(D && D->getBody());
 
   WarningGadgetSets UnsafeOps;
@@ -1016,40 +1017,46 @@ void clang::checkUnsafeBufferUsage(const Decl *D,
   DeclUseTracker Tracker;
 
   {
+// FIXME: We could skip even matching Fixables' matchers if EmitFixits ==
+// false.
 auto [FixableGadgets, WarningGadgets, TrackerRes] = findGadgets(D, 
Handler);
 UnsafeOps = groupWarningGadgetsByVar(std::move(WarningGadgets));
 FixablesForUnsafeVars = groupFixablesByVar(std::move(FixableGadgets));
 Tracker = std::move(TrackerRes);
   }
 
-  // Filter out non-local vars and vars with unclaimed DeclRefExpr-s.
-  for (auto it = FixablesForUnsafeVars.byVar.cbegin();
-   it != FixablesForUnsafeVars.byVar.cend();) {
-// FIXME: Support ParmVarDecl as well.
-if (!it->first->isLocalVarDecl() || Tracker.hasUnclaimedUses(it->first)) {
-  it = FixablesForUnsafeVars.byVar.erase(it);
-} else {
-  ++it;
+  std::map FixItsForVariable;
+
+  if (EmitFixits) {
+// Filter out non-local vars and vars with unclaimed DeclRefExpr-s.
+for (auto it = FixablesForUnsafeVars.byVar.cbegin();
+ it != FixablesForUnsafeVars.byVar.cend();) {
+  // FIXME: Support ParmVarDecl as well.
+  if (!it->first->isLocalVarDecl() || Tracker.hasUnclaimedUses(it->first)) 
{
+it = FixablesForUnsafeVars.byVar.erase(it);
+  } else {
+++it;
+  }
 }
-  }
 
-  llvm::SmallVector UnsafeVars;
-  for (const auto &[VD, ignore] : FixablesForUnsafeVars.byVar)
-UnsafeVars.push_back(VD);
+llvm::SmallVector UnsafeVars;
+for (const auto &[VD, ignore] : FixablesForUnsafeVars.byVar)
+  UnsafeVars.push_back(VD);
 
-  Strategy NaiveStrategy = getNaiveStrategy(UnsafeVars);
-  std::map FixItsForVariable =
-  getFixIts(FixablesForUnsafeVars, NaiveStrategy, Tracker,
-D->getASTContext(), Handler);
+Strategy NaiveStrategy = getNaiveStrategy(UnsafeVars);
+FixItsForVariable = getFixIts(FixablesForUnsafeVars, NaiveStrategy, 
Tracker,
+  D->getASTContext(), Handler);
 
-  // FIXME Detect overlapping FixIts.
+// FIXME Detect overlapping FixIts.
+  }
 
   for (const auto  : UnsafeOps.noVar) {
 Handler.handleUnsafeOperation(G->getBaseStmt(), /*IsRelatedToDecl=*/false);
   }
 
   for (const auto &[VD, WarningGadgets] : UnsafeOps.byVar) {
-auto FixItsIt = FixItsForVariable.find(VD);
+auto FixItsIt =
+EmitFixits ? FixItsForVariable.find(VD) : FixItsForVariable.end();
 Handler.handleFixableVariable(VD, FixItsIt != FixItsForVariable.end()
   ? std::move(FixItsIt->second)
   : FixItList{});

diff  --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp 
b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 

[clang] f252333 - [-Wunsafe-buffer-usage][NFC] Fix Fixables filtering

2023-01-18 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2023-01-18T18:54:48-08:00
New Revision: f252333b978c6b5a04d1cea3d92de16490969ff5

URL: 
https://github.com/llvm/llvm-project/commit/f252333b978c6b5a04d1cea3d92de16490969ff5
DIFF: 
https://github.com/llvm/llvm-project/commit/f252333b978c6b5a04d1cea3d92de16490969ff5.diff

LOG: [-Wunsafe-buffer-usage][NFC] Fix Fixables filtering

We have WIP Fixables for local variables and this central part of the machinery
was dropping Fixables attached to local variables instead of keeping those and
dropping everything else.
We are in the process of rewriting our patches for emitting fixits after we
discovered a conceptual problem in our design.
That is why there's currently no tests that would've detected the issue but
that will change very shortly.

Added: 


Modified: 
clang/lib/Analysis/UnsafeBufferUsage.cpp

Removed: 




diff  --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp 
b/clang/lib/Analysis/UnsafeBufferUsage.cpp
index ec2a09e89989..2f1417487967 100644
--- a/clang/lib/Analysis/UnsafeBufferUsage.cpp
+++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp
@@ -662,7 +662,7 @@ void clang::checkUnsafeBufferUsage(const Decl *D,
   for (auto it = FixablesForUnsafeVars.byVar.cbegin();
it != FixablesForUnsafeVars.byVar.cend();) {
 // FIXME: Support ParmVarDecl as well.
-if (it->first->isLocalVarDecl() || Tracker.hasUnclaimedUses(it->first)) {
+if (!it->first->isLocalVarDecl() || Tracker.hasUnclaimedUses(it->first)) {
   it = FixablesForUnsafeVars.byVar.erase(it);
 } else {
   ++it;



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 237ca43 - [-Wunsafe-buffer-usage] Group diagnostics by variable

2023-01-18 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2023-01-18T15:00:22-08:00
New Revision: 237ca436adf48c72821afd9fa6e031ec1d4a0420

URL: 
https://github.com/llvm/llvm-project/commit/237ca436adf48c72821afd9fa6e031ec1d4a0420
DIFF: 
https://github.com/llvm/llvm-project/commit/237ca436adf48c72821afd9fa6e031ec1d4a0420.diff

LOG: [-Wunsafe-buffer-usage] Group diagnostics by variable

Differential Revision: https://reviews.llvm.org/D141356

Added: 
clang/test/SemaCXX/unsafe-buffer-usage-diag-type.cpp

Modified: 
clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Analysis/UnsafeBufferUsage.cpp
clang/lib/Sema/AnalysisBasedWarnings.cpp
clang/test/SemaCXX/warn-unsafe-buffer-usage-source-ranges.cpp
clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp

Removed: 




diff  --git a/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h 
b/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
index 6a4930f40bdff..e3f87cd0f3660 100644
--- a/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
+++ b/clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h
@@ -31,7 +31,8 @@ class UnsafeBufferUsageHandler {
   using FixItList = llvm::SmallVectorImpl;
 
   /// Invoked when an unsafe operation over raw pointers is found.
-  virtual void handleUnsafeOperation(const Stmt *Operation) = 0;
+  virtual void handleUnsafeOperation(const Stmt *Operation,
+ bool IsRelatedToDecl) = 0;
 
   /// Invoked when a fix is suggested against a variable.
   virtual void handleFixableVariable(const VarDecl *Variable,

diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 02a6c2c4214e8..2ba52728e9485 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11778,12 +11778,16 @@ def err_loongarch_builtin_requires_la64 : Error<
   "this builtin requires target: loongarch64">;
 
 // Unsafe buffer usage diagnostics.
-def warn_unsafe_buffer_expression : Warning<
-  "unchecked operation on raw buffer in expression">,
-  InGroup, DefaultIgnore;
 def warn_unsafe_buffer_variable : Warning<
-  "variable %0 participates in unchecked buffer operations">,
+  "%0 is an %select{unsafe pointer used for buffer access|unsafe buffer that "
+  "does not perform bounds checks}1">,
+  InGroup, DefaultIgnore;
+def warn_unsafe_buffer_operation : Warning<
+  "%select{unsafe pointer operation|unsafe pointer arithmetic|"
+  "unsafe buffer access}0">,
   InGroup, DefaultIgnore;
+def note_unsafe_buffer_operation : Note<
+  "used%select{| in pointer arithmetic| in buffer access}0 here">;
 def err_loongarch_builtin_requires_la32 : Error<
   "this builtin requires target: loongarch32">;
 } // end of sema component.

diff  --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp 
b/clang/lib/Analysis/UnsafeBufferUsage.cpp
index c75eaba820c42..ec2a09e89989b 100644
--- a/clang/lib/Analysis/UnsafeBufferUsage.cpp
+++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp
@@ -680,17 +680,16 @@ void clang::checkUnsafeBufferUsage(const Decl *D,
   // FIXME Detect overlapping FixIts.
 
   for (const auto  : UnsafeOps.noVar) {
-Handler.handleUnsafeOperation(G->getBaseStmt());
+Handler.handleUnsafeOperation(G->getBaseStmt(), /*IsRelatedToDecl=*/false);
   }
 
   for (const auto &[VD, WarningGadgets] : UnsafeOps.byVar) {
 auto FixItsIt = FixItsForVariable.find(VD);
-if (FixItsIt != FixItsForVariable.end()) {
-  Handler.handleFixableVariable(VD, std::move(FixItsIt->second));
-} else {
-  for (const auto  : WarningGadgets) {
-Handler.handleUnsafeOperation(G->getBaseStmt());
-  }
+Handler.handleFixableVariable(VD, FixItsIt != FixItsForVariable.end()
+  ? std::move(FixItsIt->second)
+  : FixItList{});
+for (const auto  : WarningGadgets) {
+  Handler.handleUnsafeOperation(G->getBaseStmt(), 
/*IsRelatedToDecl=*/true);
 }
   }
 }

diff  --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp 
b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 08cf45e5865c0..4530154ac9447 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -2153,12 +2153,15 @@ class UnsafeBufferUsageReporter : public 
UnsafeBufferUsageHandler {
 public:
   UnsafeBufferUsageReporter(Sema ) : S(S) {}
 
-  void handleUnsafeOperation(const Stmt *Operation) override {
+  void handleUnsafeOperation(const Stmt *Operation,
+ bool IsRelatedToDecl) override {
 SourceLocation Loc;
 SourceRange Range;
+unsigned MsgParam = 0;
 if (const auto *ASE = dyn_cast(Operation)) {
   Loc = ASE->getBase()->getExprLoc();
   Range = ASE->getBase()->getSourceRange();
+  MsgParam = 2;
 } else if (const auto *BO = 

[clang] 39a63fc - [-Wunsafe-buffer-usage] Use relevant source locations for warnings

2023-01-18 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2023-01-18T14:18:54-08:00
New Revision: 39a63fc7fe9824313764a9da8565a705d3024b1a

URL: 
https://github.com/llvm/llvm-project/commit/39a63fc7fe9824313764a9da8565a705d3024b1a
DIFF: 
https://github.com/llvm/llvm-project/commit/39a63fc7fe9824313764a9da8565a705d3024b1a.diff

LOG: [-Wunsafe-buffer-usage] Use relevant source locations for warnings

This way we highlight a particular unsafe subexpression by providing more 
accurate
source location than begin of an entire statement.

Differential Revision: https://reviews.llvm.org/D141340

Added: 
clang/test/SemaCXX/warn-unsafe-buffer-usage-source-ranges.cpp

Modified: 
clang/lib/Sema/AnalysisBasedWarnings.cpp

Removed: 




diff  --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp 
b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 3a0f566588c41..08cf45e5865c0 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -16,8 +16,10 @@
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/EvaluatedExprVisitor.h"
+#include "clang/AST/Expr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExprObjC.h"
+#include "clang/AST/OperationKinds.h"
 #include "clang/AST/ParentMap.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/AST/StmtCXX.h"
@@ -2152,8 +2154,35 @@ class UnsafeBufferUsageReporter : public 
UnsafeBufferUsageHandler {
   UnsafeBufferUsageReporter(Sema ) : S(S) {}
 
   void handleUnsafeOperation(const Stmt *Operation) override {
-S.Diag(Operation->getBeginLoc(), diag::warn_unsafe_buffer_expression)
-<< Operation->getSourceRange();
+SourceLocation Loc;
+SourceRange Range;
+if (const auto *ASE = dyn_cast(Operation)) {
+  Loc = ASE->getBase()->getExprLoc();
+  Range = ASE->getBase()->getSourceRange();
+} else if (const auto *BO = dyn_cast(Operation)) {
+  BinaryOperator::Opcode Op = BO->getOpcode();
+  if (Op == BO_Add || Op == BO_AddAssign || Op == BO_Sub ||
+  Op == BO_SubAssign) {
+if (BO->getRHS()->getType()->isIntegerType()) {
+  Loc = BO->getLHS()->getExprLoc();
+  Range = BO->getLHS()->getSourceRange();
+} else {
+  Loc = BO->getRHS()->getExprLoc();
+  Range = BO->getRHS()->getSourceRange();
+}
+  }
+} else if (const auto *UO = dyn_cast(Operation)) {
+  UnaryOperator::Opcode Op = UO->getOpcode();
+  if (Op == UO_PreInc || Op == UO_PreDec || Op == UO_PostInc ||
+  Op == UO_PostDec) {
+Loc = UO->getSubExpr()->getExprLoc();
+Range = UO->getSubExpr()->getSourceRange();
+  }
+} else {
+  Loc = Operation->getBeginLoc();
+  Range = Operation->getSourceRange();
+}
+S.Diag(Loc, diag::warn_unsafe_buffer_expression) << Range;
   }
 
   void handleFixableVariable(const VarDecl *Variable,

diff  --git a/clang/test/SemaCXX/warn-unsafe-buffer-usage-source-ranges.cpp 
b/clang/test/SemaCXX/warn-unsafe-buffer-usage-source-ranges.cpp
new file mode 100644
index 0..35928cc6890ba
--- /dev/null
+++ b/clang/test/SemaCXX/warn-unsafe-buffer-usage-source-ranges.cpp
@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -Wno-everything -Wunsafe-buffer-usage 
-fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s
+
+void foo(int i) {
+  int * ptr;
+
+
+  ptr++;
+  // CHECK-DAG: {7:3-7:6}{{.*}}[-Wunsafe-buffer-usage]
+  ptr--;
+  // CHECK-DAG: {9:3-9:6}{{.*}}[-Wunsafe-buffer-usage]
+  ++ptr;
+  // CHECK-DAG: {11:5-11:8}{{.*}}[-Wunsafe-buffer-usage]
+  --ptr;
+  // CHECK-DAG: {13:5-13:8}{{.*}}[-Wunsafe-buffer-usage]
+
+
+  ptr + 1;
+  // CHECK-DAG: {17:3-17:6}{{.*}}[-Wunsafe-buffer-usage]
+  2 + ptr;
+  // CHECK-DAG: {19:7-19:10}{{.*}}[-Wunsafe-buffer-usage]
+  ptr + i;
+  // CHECK-DAG: {21:3-21:6}{{.*}}[-Wunsafe-buffer-usage]
+  i + ptr;
+  // CHECK-DAG: {23:7-23:10}{{.*}}[-Wunsafe-buffer-usage]
+
+
+  ptr - 3;
+  // CHECK-DAG: {27:3-27:6}{{.*}}[-Wunsafe-buffer-usage]
+  ptr - i;
+  // CHECK-DAG: {29:3-29:6}{{.*}}[-Wunsafe-buffer-usage]
+
+
+  ptr += 4;
+  // CHECK-DAG: {33:3-33:6}{{.*}}[-Wunsafe-buffer-usage]
+  ptr += i;
+  // CHECK-DAG: {35:3-35:6}{{.*}}[-Wunsafe-buffer-usage]
+
+
+  ptr -= 5;
+  // CHECK-DAG: {39:3-39:6}{{.*}}[-Wunsafe-buffer-usage]
+  ptr -= i;
+  // CHECK-DAG: {41:3-41:6}{{.*}}[-Wunsafe-buffer-usage]
+
+
+  ptr[5];
+  // CHECK-DAG: {45:3-45:6}{{.*}}[-Wunsafe-buffer-usage]
+  5[ptr];
+  // CHECK-DAG: {47:5-47:8}{{.*}}[-Wunsafe-buffer-usage]
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 214312e - [-Wunsafe-buffer-usage][NFC] Refactor checkUnsafeBufferUsage

2023-01-17 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2023-01-17T18:00:47-08:00
New Revision: 214312ef7ee495e36a9626a0f8955be9d2bc8b78

URL: 
https://github.com/llvm/llvm-project/commit/214312ef7ee495e36a9626a0f8955be9d2bc8b78
DIFF: 
https://github.com/llvm/llvm-project/commit/214312ef7ee495e36a9626a0f8955be9d2bc8b78.diff

LOG: [-Wunsafe-buffer-usage][NFC] Refactor checkUnsafeBufferUsage

Differential Revision: https://reviews.llvm.org/D141333

Added: 


Modified: 
clang/lib/Analysis/UnsafeBufferUsage.cpp

Removed: 




diff  --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp 
b/clang/lib/Analysis/UnsafeBufferUsage.cpp
index fa72d20bea6f..c75eaba820c4 100644
--- a/clang/lib/Analysis/UnsafeBufferUsage.cpp
+++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp
@@ -7,9 +7,10 @@
 
//===--===//
 
 #include "clang/Analysis/Analyses/UnsafeBufferUsage.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "llvm/ADT/SmallVector.h"
+#include 
 #include 
 
 using namespace llvm;
@@ -383,6 +384,7 @@ class DeclUseTracker {
   DeclUseTracker() = default;
   DeclUseTracker(const DeclUseTracker &) = delete; // Let's avoid copies.
   DeclUseTracker(DeclUseTracker &&) = default;
+  DeclUseTracker =(DeclUseTracker &&) = default;
 
   // Start tracking a freshly discovered DRE.
   void discoverUse(const DeclRefExpr *DRE) { Uses->insert(DRE); }
@@ -556,97 +558,137 @@ static std::tuple findGadg
   return {std::move(CB.FixableGadgets), std::move(CB.WarningGadgets), 
std::move(CB.Tracker)};
 }
 
-void clang::checkUnsafeBufferUsage(const Decl *D,
-   UnsafeBufferUsageHandler ) {
-  assert(D && D->getBody());
-
-  SmallSet WarnedDecls;
-
-  auto [FixableGadgets, WarningGadgets, Tracker] = findGadgets(D);
-
-  DenseMap,
-std::vector>> Map;
+struct WarningGadgetSets {
+  std::map>> byVar;
+  // These Gadgets are not related to pointer variables (e. g. temporaries).
+  llvm::SmallVector, 16> noVar;
+};
 
-  // First, let's sort gadgets by variables. If some gadgets cover more than 
one
+static WarningGadgetSets
+groupWarningGadgetsByVar(WarningGadgetList &) {
+  WarningGadgetSets result;
+  // If some gadgets cover more than one
   // variable, they'll appear more than once in the map.
-  for (const auto  : FixableGadgets) {
-DeclUseList DREs = G->getClaimedVarUseSites();
+  for (auto  : AllUnsafeOperations) {
+DeclUseList ClaimedVarUseSites = G->getClaimedVarUseSites();
 
-// Populate the map.
-for (const DeclRefExpr *DRE : DREs) {
+bool AssociatedWithVarDecl = false;
+for (const DeclRefExpr *DRE : ClaimedVarUseSites) {
   if (const auto *VD = dyn_cast(DRE->getDecl())) {
-Map[VD].first.push_back(G.get());
+result.byVar[VD].emplace(std::move(G));
+AssociatedWithVarDecl = true;
   }
 }
+
+if (!AssociatedWithVarDecl) {
+  result.noVar.emplace_back(std::move(G));
+  continue;
+}
   }
+  return result;
+}
 
-  for (const auto  : WarningGadgets) {
-DeclUseList ClaimedVarUseSites = G->getClaimedVarUseSites();
+struct FixableGadgetSets {
+  std::map>> byVar;
+};
 
-// Populate the map.
-bool Pushed = false;
-for (const DeclRefExpr *DRE : ClaimedVarUseSites) {
+static FixableGadgetSets
+groupFixablesByVar(FixableGadgetList &) {
+  FixableGadgetSets FixablesForUnsafeVars;
+  for (auto  : AllFixableOperations) {
+DeclUseList DREs = F->getClaimedVarUseSites();
+
+for (const DeclRefExpr *DRE : DREs) {
   if (const auto *VD = dyn_cast(DRE->getDecl())) {
-Map[VD].second.push_back(G.get());
-Pushed = true;
+FixablesForUnsafeVars.byVar[VD].emplace(std::move(F));
   }
 }
+  }
+  return FixablesForUnsafeVars;
+}
 
-if (!Pushed) {
-  // We won't return to this gadget later. Emit the warning right away.
-  Handler.handleUnsafeOperation(G->getBaseStmt());
-  continue;
+static std::map
+getFixIts(FixableGadgetSets , const Strategy ) {
+  std::map FixItsForVariable;
+  for (const auto &[VD, Fixables] : FixablesForUnsafeVars.byVar) {
+// TODO fixVariable - fixit for the variable itself
+bool ImpossibleToFix = false;
+llvm::SmallVector FixItsForVD;
+for (const auto  : Fixables) {
+  llvm::Optional Fixits = F->getFixits(S);
+  if (!Fixits) {
+ImpossibleToFix = true;
+break;
+  } else {
+const FixItList CorrectFixes = Fixits.value();
+FixItsForVD.insert(FixItsForVD.end(), CorrectFixes.begin(),
+   CorrectFixes.end());
+  }
 }
+if (ImpossibleToFix)
+  FixItsForVariable.erase(VD);
+else
+  FixItsForVariable[VD].insert(FixItsForVariable[VD].end(),
+   FixItsForVD.begin(), FixItsForVD.end());
   }
+  

[clang] 85d97aa - [analyzer] Support implicit parameter 'self' in path note

2022-09-21 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2022-09-21T17:26:09-07:00
New Revision: 85d97aac80b8e7689a6d957441054aa817bbb192

URL: 
https://github.com/llvm/llvm-project/commit/85d97aac80b8e7689a6d957441054aa817bbb192
DIFF: 
https://github.com/llvm/llvm-project/commit/85d97aac80b8e7689a6d957441054aa817bbb192.diff

LOG: [analyzer] Support implicit parameter 'self' in path note

showBRParamDiagnostics assumed stores happen only via function parameters while 
that
can also happen via implicit parameters like 'self' or 'this'.
The regression test caused a failed assert in the original cast to ParmVarDecl.

Differential Revision: https://reviews.llvm.org/D133815

Added: 
clang/test/Analysis/path-notes-impl-param.m

Modified: 
clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp

Removed: 




diff  --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp 
b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 3796ad51694ae..4f23af07e3ae4 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -1340,13 +1340,12 @@ static void showBRDiagnostics(llvm::raw_svector_ostream 
, StoreInfo SI) {
 static void showBRParamDiagnostics(llvm::raw_svector_ostream ,
StoreInfo SI) {
   const auto *VR = cast(SI.Dest);
-  const auto *Param = cast(VR->getDecl());
+  const auto *D = VR->getDecl();
 
   OS << "Passing ";
 
   if (isa(SI.Value)) {
-OS << (isObjCPointer(Param) ? "nil object reference"
-: "null pointer value");
+OS << (isObjCPointer(D) ? "nil object reference" : "null pointer value");
 
   } else if (SI.Value.isUndef()) {
 OS << "uninitialized value";
@@ -1361,12 +1360,19 @@ static void 
showBRParamDiagnostics(llvm::raw_svector_ostream ,
 OS << "value";
   }
 
-  // Printed parameter indexes are 1-based, not 0-based.
-  unsigned Idx = Param->getFunctionScopeIndex() + 1;
-  OS << " via " << Idx << llvm::getOrdinalSuffix(Idx) << " parameter";
-  if (VR->canPrintPretty()) {
-OS << " ";
-VR->printPretty(OS);
+  if (const auto *Param = dyn_cast(VR->getDecl())) {
+// Printed parameter indexes are 1-based, not 0-based.
+unsigned Idx = Param->getFunctionScopeIndex() + 1;
+OS << " via " << Idx << llvm::getOrdinalSuffix(Idx) << " parameter";
+if (VR->canPrintPretty()) {
+  OS << " ";
+  VR->printPretty(OS);
+}
+  } else if (const auto *ImplParam = dyn_cast(D)) {
+if (ImplParam->getParameterKind() ==
+ImplicitParamDecl::ImplicitParamKind::ObjCSelf) {
+  OS << " via implicit parameter 'self'";
+}
   }
 }
 

diff  --git a/clang/test/Analysis/path-notes-impl-param.m 
b/clang/test/Analysis/path-notes-impl-param.m
new file mode 100644
index 0..cc1069ab96c36
--- /dev/null
+++ b/clang/test/Analysis/path-notes-impl-param.m
@@ -0,0 +1,31 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount 
-analyzer-output=text -verify %s
+
+@protocol NSObject
+@end
+
+@interface NSObject  {}
+- (id)init;
++ (id)alloc;
+- (id)autorelease;
+@end
+
+@interface Foo : NSObject
+@property(nonatomic) int bar;
+@end
+
+@implementation Foo
+-(int)bar {
+  return 0;
+}
+@end
+
+int baz() {
+  Foo *f = [Foo alloc];
+  // expected-note@-1 {{'f' initialized here}}
+  // expected-note@-2 {{Method returns an instance of Foo with a +1 retain 
count}}
+
+  return f.bar;
+  // expected-warning@-1 {{Potential leak of an object stored into 'self' 
[osx.cocoa.RetainCount]}}
+  // expected-note@-2 {{Passing value via implicit parameter 'self'}}
+  // expected-note@-3 {{Object leaked: object allocated and stored into 'self' 
is not referenced later in this execution path and has a retain count of +1}}
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 0376c0f - Revert "[utils] Avoid hardcoding metadata ids in update_cc_test_checks"

2022-05-10 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2022-05-10T14:04:19-07:00
New Revision: 0376c0f271398147b3df79ab20ffb2f375e47215

URL: 
https://github.com/llvm/llvm-project/commit/0376c0f271398147b3df79ab20ffb2f375e47215
DIFF: 
https://github.com/llvm/llvm-project/commit/0376c0f271398147b3df79ab20ffb2f375e47215.diff

LOG: Revert "[utils] Avoid hardcoding metadata ids in update_cc_test_checks"

This reverts commit ce583b14b2ec37b1c168bb92020680cb452502b3.

Added: 


Modified: 
llvm/utils/UpdateTestChecks/common.py

Removed: 
clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
clang/test/utils/update_cc_test_checks/Inputs/srcloc-id.c
clang/test/utils/update_cc_test_checks/Inputs/srcloc-id.expected
clang/test/utils/update_cc_test_checks/Inputs/tbaa-id.c
clang/test/utils/update_cc_test_checks/Inputs/tbaa-id.expected
clang/test/utils/update_cc_test_checks/Inputs/tbaa-struct-id.c
clang/test/utils/update_cc_test_checks/Inputs/tbaa-struct-id.expected
clang/test/utils/update_cc_test_checks/annotation-id.test
clang/test/utils/update_cc_test_checks/nosanitize-id.test
clang/test/utils/update_cc_test_checks/srcloc-id.test
clang/test/utils/update_cc_test_checks/tbaa-id.test
clang/test/utils/update_cc_test_checks/tbaa-struct-id.test



diff  --git a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c 
b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
deleted file mode 100644
index 49c7c58375db5..0
--- a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: %clang_cc1 -ftrivial-auto-var-init=zero 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
-
-void foo_ptr_to_scalar() {
-  unsigned long long* a[100];
-}

diff  --git 
a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected 
b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
deleted file mode 100644
index d28469eb920dc..0
--- a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
+++ /dev/null
@@ -1,17 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
-// RUN: %clang_cc1 -ftrivial-auto-var-init=zero 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
-
-// CHECK-LABEL: @foo_ptr_to_scalar(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:[[A:%.*]] = alloca [100 x i64*], align 16
-// CHECK-NEXT:[[TMP0:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
-// CHECK-NEXT:call void @llvm.lifetime.start.p0i8(i64 800, i8* [[TMP0]]) 
#[[ATTR3:[0-9]+]]
-// CHECK-NEXT:[[TMP1:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
-// CHECK-NEXT:call void @llvm.memset.p0i8.i64(i8* align 16 [[TMP1]], i8 0, 
i64 800, i1 false), !annotation [[ANNT2:![0-9]+]]
-// CHECK-NEXT:[[TMP2:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
-// CHECK-NEXT:call void @llvm.lifetime.end.p0i8(i64 800, i8* [[TMP2]]) 
#[[ATTR3]]
-// CHECK-NEXT:ret void
-//
-void foo_ptr_to_scalar() {
-  unsigned long long* a[100];
-}

diff  --git a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c 
b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
deleted file mode 100644
index d136a861b4214..0
--- a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: %clang_cc1 -fsanitize=shift-exponent,shift-base 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
-
-void foo(int* c, int* shamt) {
-  *c = 1 << (*c << *shamt);
-}

diff  --git 
a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected 
b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
deleted file mode 100644
index e8e1c74e46bc6..0
--- a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
+++ /dev/null
@@ -1,55 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
-// RUN: %clang_cc1 -fsanitize=shift-exponent,shift-base 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
-
-// CHECK-LABEL: @foo(
-// CHECK-NEXT:  entry:
-// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i32*, align 8
-// CHECK-NEXT:[[SHAMT_ADDR:%.*]] = alloca i32*, align 8
-// CHECK-NEXT:store i32* [[C:%.*]], i32** [[C_ADDR]], align 8, !tbaa 
[[TBAA2:![0-9]+]]
-// CHECK-NEXT:store i32* [[SHAMT:%.*]], i32** [[SHAMT_ADDR]], align 8, 
!tbaa [[TBAA2]]
-// CHECK-NEXT:[[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 8, !tbaa 
[[TBAA2]]
-// CHECK-NEXT:[[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4, !tbaa 
[[TBAA6:![0-9]+]]
-// CHECK-NEXT:

[clang] ce583b1 - [utils] Avoid hardcoding metadata ids in update_cc_test_checks

2022-05-10 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2022-05-10T10:17:45-07:00
New Revision: ce583b14b2ec37b1c168bb92020680cb452502b3

URL: 
https://github.com/llvm/llvm-project/commit/ce583b14b2ec37b1c168bb92020680cb452502b3
DIFF: 
https://github.com/llvm/llvm-project/commit/ce583b14b2ec37b1c168bb92020680cb452502b3.diff

LOG: [utils] Avoid hardcoding metadata ids in update_cc_test_checks

Specifically for: !tbaa, !tbaa.struct, !annotation, !srcloc, !nosanitize.

The goal is to avoid test brittleness caused by hardcoded values.

Differential Revision: https://reviews.llvm.org/D123273

Added: 
clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
clang/test/utils/update_cc_test_checks/Inputs/srcloc-id.c
clang/test/utils/update_cc_test_checks/Inputs/srcloc-id.expected
clang/test/utils/update_cc_test_checks/Inputs/tbaa-id.c
clang/test/utils/update_cc_test_checks/Inputs/tbaa-id.expected
clang/test/utils/update_cc_test_checks/Inputs/tbaa-struct-id.c
clang/test/utils/update_cc_test_checks/Inputs/tbaa-struct-id.expected
clang/test/utils/update_cc_test_checks/annotation-id.test
clang/test/utils/update_cc_test_checks/nosanitize-id.test
clang/test/utils/update_cc_test_checks/srcloc-id.test
clang/test/utils/update_cc_test_checks/tbaa-id.test
clang/test/utils/update_cc_test_checks/tbaa-struct-id.test

Modified: 
llvm/utils/UpdateTestChecks/common.py

Removed: 




diff  --git a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c 
b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
new file mode 100644
index 0..49c7c58375db5
--- /dev/null
+++ b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -ftrivial-auto-var-init=zero 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
+
+void foo_ptr_to_scalar() {
+  unsigned long long* a[100];
+}

diff  --git 
a/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected 
b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
new file mode 100644
index 0..d28469eb920dc
--- /dev/null
+++ b/clang/test/utils/update_cc_test_checks/Inputs/annotation-id.expected
@@ -0,0 +1,17 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -ftrivial-auto-var-init=zero 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
+
+// CHECK-LABEL: @foo_ptr_to_scalar(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A:%.*]] = alloca [100 x i64*], align 16
+// CHECK-NEXT:[[TMP0:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
+// CHECK-NEXT:call void @llvm.lifetime.start.p0i8(i64 800, i8* [[TMP0]]) 
#[[ATTR3:[0-9]+]]
+// CHECK-NEXT:[[TMP1:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
+// CHECK-NEXT:call void @llvm.memset.p0i8.i64(i8* align 16 [[TMP1]], i8 0, 
i64 800, i1 false), !annotation [[ANNT2:![0-9]+]]
+// CHECK-NEXT:[[TMP2:%.*]] = bitcast [100 x i64*]* [[A]] to i8*
+// CHECK-NEXT:call void @llvm.lifetime.end.p0i8(i64 800, i8* [[TMP2]]) 
#[[ATTR3]]
+// CHECK-NEXT:ret void
+//
+void foo_ptr_to_scalar() {
+  unsigned long long* a[100];
+}

diff  --git a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c 
b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
new file mode 100644
index 0..d136a861b4214
--- /dev/null
+++ b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -fsanitize=shift-exponent,shift-base 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
+
+void foo(int* c, int* shamt) {
+  *c = 1 << (*c << *shamt);
+}

diff  --git 
a/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected 
b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
new file mode 100644
index 0..e8e1c74e46bc6
--- /dev/null
+++ b/clang/test/utils/update_cc_test_checks/Inputs/nosanitize-id.expected
@@ -0,0 +1,55 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
+// RUN: %clang_cc1 -fsanitize=shift-exponent,shift-base 
-triple=x86_64-unknown-linux-gnu -O1 -disable-llvm-passes -emit-llvm -o - %s | 
FileCheck %s
+
+// CHECK-LABEL: @foo(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i32*, align 8
+// CHECK-NEXT:[[SHAMT_ADDR:%.*]] = alloca i32*, align 8
+// CHECK-NEXT:store i32* [[C:%.*]], i32** [[C_ADDR]], align 8, !tbaa 
[[TBAA2:![0-9]+]]
+// CHECK-NEXT:store i32* [[SHAMT:%.*]], i32** [[SHAMT_ADDR]], align 8, 
!tbaa [[TBAA2]]
+// CHECK-NEXT:[[TMP0:%.*]] = load i32*, i32** [[C_ADDR]], align 8, !tbaa 
[[TBAA2]]
+// 

[clang] fad7e49 - Revert "Add BITINT_MAXWIDTH support"

2022-01-28 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2022-01-28T15:18:49-08:00
New Revision: fad7e491a0770ac4336934030ac67d77e7af5520

URL: 
https://github.com/llvm/llvm-project/commit/fad7e491a0770ac4336934030ac67d77e7af5520
DIFF: 
https://github.com/llvm/llvm-project/commit/fad7e491a0770ac4336934030ac67d77e7af5520.diff

LOG: Revert "Add BITINT_MAXWIDTH support"

This reverts commit 86797fdb6f51d32f285e48b6d3e0fc5b8b852734.

Differential Revision: https://reviews.llvm.org/D117238

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/TargetInfo.h
clang/lib/Frontend/InitPreprocessor.cpp
clang/lib/Headers/limits.h
clang/lib/Sema/SemaType.cpp
clang/test/CodeGen/ext-int-cc.c
clang/test/CodeGen/ext-int.c
clang/test/CodeGenCXX/ext-int.cpp
clang/test/Headers/limits.cpp
clang/test/Preprocessor/init-aarch64.c
clang/test/Preprocessor/init.c
clang/test/Sema/builtins-overflow.c
clang/test/SemaCXX/ext-int.cpp

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4b444bece68a7..f081ff0313e0a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -174,12 +174,7 @@ C Language Changes in Clang
   ``_BitInt(N)`` is supported as an extension in older C modes and in all C++
   modes. Note: the ABI for ``_BitInt(N)`` is still in the process of being
   stabilized, so this type should not yet be used in interfaces that require
-  ABI stability. The maximum width supported by Clang can be obtained from the
-  ``BITINT_MAXWIDTH`` macro in . Currently, Clang supports bit
-  widths <= 128 because backends are not yet able to cope with some math
-  operations (like division) on wider integer types. See
-  `PR44994 `_ for more
-  information.
+  ABI stability.
 - When using ``asm goto`` with outputs whose constraint modifier is ``"+"``, we
   now change the numbering of the labels to occur after hidden tied inputs for
   better compatibility with GCC.  For better portability between 
diff erent

diff  --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index a49342a34f3e8..642c8500364bb 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -590,17 +590,6 @@ class TargetInfo : public virtual TransferrableTargetInfo,
 return false;
   }
 
-  // Different targets may support a 
diff erent maximum width for the _BitInt
-  // type, depending on what operations are supported.
-  virtual size_t getMaxBitIntWidth() const {
-// FIXME: this value should be llvm::IntegerType::MAX_INT_BITS, which is
-// maximum bit width that LLVM claims its IR can support. However, most
-// backends currently have a bug where they only support division
-// operations on types that are <= 128 bits and crash otherwise. We're
-// setting the max supported value to 128 to be conservative.
-return 128;
-  }
-
   /// Determine whether _Float16 is supported on this target.
   virtual bool hasLegalHalfType() const { return HasLegalHalfType; }
 

diff  --git a/clang/lib/Frontend/InitPreprocessor.cpp 
b/clang/lib/Frontend/InitPreprocessor.cpp
index e259ab47c5589..a9023a7a1171e 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -25,7 +25,6 @@
 #include "clang/Serialization/ASTReader.h"
 #include "llvm/ADT/APFloat.h"
 #include "llvm/IR/DataLayout.h"
-#include "llvm/IR/DerivedTypes.h"
 using namespace clang;
 
 static bool MacroBodyEndsInBackslash(StringRef MacroBody) {
@@ -915,13 +914,6 @@ static void InitializePredefinedMacros(const TargetInfo 
,
   Builder.defineMacro("__LONG_WIDTH__", Twine(TI.getLongWidth()));
   Builder.defineMacro("__LLONG_WIDTH__", Twine(TI.getLongLongWidth()));
 
-  size_t BitIntMaxWidth = TI.getMaxBitIntWidth();
-  assert(BitIntMaxWidth <= llvm::IntegerType::MAX_INT_BITS &&
- "Target defined a max bit width larger than LLVM can support!");
-  assert(BitIntMaxWidth >= TI.getLongLongWidth() &&
- "Target defined a max bit width smaller than the C standard allows!");
-  Builder.defineMacro("__BITINT_MAXWIDTH__", Twine(BitIntMaxWidth));
-
   DefineTypeSize("__SCHAR_MAX__", TargetInfo::SignedChar, TI, Builder);
   DefineTypeSize("__SHRT_MAX__", TargetInfo::SignedShort, TI, Builder);
   DefineTypeSize("__INT_MAX__", TargetInfo::SignedInt, TI, Builder);

diff  --git a/clang/lib/Headers/limits.h b/clang/lib/Headers/limits.h
index cfd23a219ee55..c2d3a7cf43539 100644
--- a/clang/lib/Headers/limits.h
+++ b/clang/lib/Headers/limits.h
@@ -78,8 +78,6 @@
 #define LONG_WIDTH   __LONG_WIDTH__
 #define ULLONG_WIDTH __LLONG_WIDTH__
 #define LLONG_WIDTH  __LLONG_WIDTH__
-
-#define BITINT_MAXWIDTH __BITINT_MAXWIDTH__
 #endif
 
 #ifdef __CHAR_UNSIGNED__  /* -funsigned-char */

diff  --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp

[clang] dd01d97 - [clang][dataflow] Avoid MaxIterations overflow

2022-01-24 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2022-01-24T15:58:38-08:00
New Revision: dd01d971aa2c4b464a295ca5c78ff93fc4441dc3

URL: 
https://github.com/llvm/llvm-project/commit/dd01d971aa2c4b464a295ca5c78ff93fc4441dc3
DIFF: 
https://github.com/llvm/llvm-project/commit/dd01d971aa2c4b464a295ca5c78ff93fc4441dc3.diff

LOG: [clang][dataflow] Avoid MaxIterations overflow

unsigned is technically guaranteed to be only 16 bits in which case 1 << 16 
would wrap around to zero.

Differential Revision: https://reviews.llvm.org/D117938

Added: 


Modified: 
clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp

Removed: 




diff  --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp 
b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
index 3782f0f5f69ac..7611395cafb6b 100644
--- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
+++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
@@ -210,8 +210,8 @@ runTypeErasedDataflowAnalysis(const ControlFlowContext 
,
   // FIXME: Consider making the maximum number of iterations configurable.
   // FIXME: Set up statistics (see llvm/ADT/Statistic.h) to count average 
number
   // of iterations, number of functions that time out, etc.
-  unsigned Iterations = 0;
-  static constexpr unsigned MaxIterations = 1 << 16;
+  uint32_t Iterations = 0;
+  static constexpr uint32_t MaxIterations = 1 << 16;
   while (const CFGBlock *Block = Worklist.dequeue()) {
 if (++Iterations > MaxIterations) {
   llvm::errs() << "Maximum number of iterations reached, giving up.\n";



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 8277a51 - [SourceManager] Avoid copying SLocEntry in computeMacroArgsCache

2020-10-22 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-10-22T14:18:28-07:00
New Revision: 8277a513c74b53e5ad7f482f76b27bc8609c66ae

URL: 
https://github.com/llvm/llvm-project/commit/8277a513c74b53e5ad7f482f76b27bc8609c66ae
DIFF: 
https://github.com/llvm/llvm-project/commit/8277a513c74b53e5ad7f482f76b27bc8609c66ae.diff

LOG: [SourceManager] Avoid copying SLocEntry in computeMacroArgsCache

Follow-up to e7870223d8b5

Differential Revision: https://reviews.llvm.org/D86230

Added: 


Modified: 
clang/lib/Basic/SourceManager.cpp

Removed: 




diff  --git a/clang/lib/Basic/SourceManager.cpp 
b/clang/lib/Basic/SourceManager.cpp
index 3bffcb548ebb..db87a6e57741 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -1761,7 +1761,7 @@ void SourceManager::computeMacroArgsCache(MacroArgsMap 
,
 if (Invalid)
   return;
 if (Entry.isFile()) {
-  auto File = Entry.getFile();
+  auto& File = Entry.getFile();
   if (File.getFileCharacteristic() == C_User_ModuleMap ||
   File.getFileCharacteristic() == C_System_ModuleMap)
 continue;



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] e787022 - [SourceManager] Skip module maps when searching files for macro arguments

2020-10-22 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-10-22T12:36:51-07:00
New Revision: e7870223d8b586cd89ffc7fddd63bc40447bd3fb

URL: 
https://github.com/llvm/llvm-project/commit/e7870223d8b586cd89ffc7fddd63bc40447bd3fb
DIFF: 
https://github.com/llvm/llvm-project/commit/e7870223d8b586cd89ffc7fddd63bc40447bd3fb.diff

LOG: [SourceManager] Skip module maps when searching files for macro arguments

Differential Revision: https://reviews.llvm.org/D86230

Added: 


Modified: 
clang/lib/Basic/SourceManager.cpp

Removed: 




diff  --git a/clang/lib/Basic/SourceManager.cpp 
b/clang/lib/Basic/SourceManager.cpp
index 9592b92f59bc..3bffcb548ebb 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -1761,7 +1761,12 @@ void SourceManager::computeMacroArgsCache(MacroArgsMap 
,
 if (Invalid)
   return;
 if (Entry.isFile()) {
-  SourceLocation IncludeLoc = Entry.getFile().getIncludeLoc();
+  auto File = Entry.getFile();
+  if (File.getFileCharacteristic() == C_User_ModuleMap ||
+  File.getFileCharacteristic() == C_System_ModuleMap)
+continue;
+
+  SourceLocation IncludeLoc = File.getIncludeLoc();
   bool IncludedInFID =
   (IncludeLoc.isValid() && isInFileID(IncludeLoc, FID)) ||
   // Predefined header doesn't have a valid include location in main



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 6fd8c69 - [clang] Update warning-wall.c test

2020-09-28 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-28T17:19:51-07:00
New Revision: 6fd8c69049a8fc119278097be6d0bdc3e781f1ba

URL: 
https://github.com/llvm/llvm-project/commit/6fd8c69049a8fc119278097be6d0bdc3e781f1ba
DIFF: 
https://github.com/llvm/llvm-project/commit/6fd8c69049a8fc119278097be6d0bdc3e781f1ba.diff

LOG: [clang] Update warning-wall.c test

Follow-up to 1e86d637eb4f:
[clang] Selectively ena/disa-ble format-insufficient-args warning

Added: 


Modified: 
clang/test/Misc/warning-wall.c

Removed: 




diff  --git a/clang/test/Misc/warning-wall.c b/clang/test/Misc/warning-wall.c
index 9975323f7028..ac2b124e3312 100644
--- a/clang/test/Misc/warning-wall.c
+++ b/clang/test/Misc/warning-wall.c
@@ -9,13 +9,13 @@ CHECK-NEXT:-Wdelete-non-virtual-dtor
 CHECK-NEXT:  -Wdelete-non-abstract-non-virtual-dtor
 CHECK-NEXT:  -Wdelete-abstract-non-virtual-dtor
 CHECK-NEXT:-Wformat
-CHECK-NEXT:  -Wformat-insufficient-args
 CHECK-NEXT:  -Wformat-extra-args
 CHECK-NEXT:  -Wformat-zero-length
 CHECK-NEXT:  -Wnonnull
 CHECK-NEXT:  -Wformat-security
 CHECK-NEXT:  -Wformat-y2k
 CHECK-NEXT:  -Wformat-invalid-specifier
+CHECK-NEXT:  -Wformat-insufficient-args
 CHECK-NEXT:-Wfor-loop-analysis
 CHECK-NEXT:-Wframe-address
 CHECK-NEXT:-Wimplicit



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 1e86d63 - [clang] Selectively ena/disa-ble format-insufficient-args warning

2020-09-28 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-28T16:24:50-07:00
New Revision: 1e86d637eb4f88e03fcd4b9fd78192487dc2a302

URL: 
https://github.com/llvm/llvm-project/commit/1e86d637eb4f88e03fcd4b9fd78192487dc2a302
DIFF: 
https://github.com/llvm/llvm-project/commit/1e86d637eb4f88e03fcd4b9fd78192487dc2a302.diff

LOG: [clang] Selectively ena/disa-ble format-insufficient-args warning

Differential Revision: https://reviews.llvm.org/D87176

Added: 
clang/test/Sema/warn-printf-insufficient-data-args.c

Modified: 
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/test/Misc/warning-wall.c

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index a2f5aeafd457..d8e66bdefca1 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -239,6 +239,7 @@ def ExtraSemi : DiagGroup<"extra-semi", 
[CXX98CompatExtraSemi,
 def GNUFlexibleArrayInitializer : DiagGroup<"gnu-flexible-array-initializer">;
 def GNUFlexibleArrayUnionMember : DiagGroup<"gnu-flexible-array-union-member">;
 def GNUFoldingConstant : DiagGroup<"gnu-folding-constant">;
+def FormatInsufficientArgs : DiagGroup<"format-insufficient-args">;
 def FormatExtraArgs : DiagGroup<"format-extra-args">;
 def FormatZeroLength : DiagGroup<"format-zero-length">;
 
@@ -849,7 +850,8 @@ def FormatPedantic : DiagGroup<"format-pedantic">;
 def FormatTypeConfusion : DiagGroup<"format-type-confusion">;
 def Format : DiagGroup<"format",
[FormatExtraArgs, FormatZeroLength, NonNull,
-FormatSecurity, FormatY2K, FormatInvalidSpecifier]>,
+FormatSecurity, FormatY2K, FormatInvalidSpecifier,
+FormatInsufficientArgs]>,
  DiagCategory<"Format String Issue">;
 def FormatNonLiteral : DiagGroup<"format-nonliteral">;
 def Format2 : DiagGroup<"format=2",

diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 0cb817df9db3..42d50426ccd8 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8921,7 +8921,7 @@ def note_array_declared_here : Note<
   "array %0 declared here">;
 
 def warn_printf_insufficient_data_args : Warning<
-  "more '%%' conversions than data arguments">, InGroup;
+  "more '%%' conversions than data arguments">, 
InGroup;
 def warn_printf_data_arg_not_used : Warning<
   "data argument not used by format string">, InGroup;
 def warn_format_invalid_conversion : Warning<

diff  --git a/clang/test/Misc/warning-wall.c b/clang/test/Misc/warning-wall.c
index c63d4beecff0..9975323f7028 100644
--- a/clang/test/Misc/warning-wall.c
+++ b/clang/test/Misc/warning-wall.c
@@ -9,6 +9,7 @@ CHECK-NEXT:-Wdelete-non-virtual-dtor
 CHECK-NEXT:  -Wdelete-non-abstract-non-virtual-dtor
 CHECK-NEXT:  -Wdelete-abstract-non-virtual-dtor
 CHECK-NEXT:-Wformat
+CHECK-NEXT:  -Wformat-insufficient-args
 CHECK-NEXT:  -Wformat-extra-args
 CHECK-NEXT:  -Wformat-zero-length
 CHECK-NEXT:  -Wnonnull

diff  --git a/clang/test/Sema/warn-printf-insufficient-data-args.c 
b/clang/test/Sema/warn-printf-insufficient-data-args.c
new file mode 100644
index ..a8de7118e8b1
--- /dev/null
+++ b/clang/test/Sema/warn-printf-insufficient-data-args.c
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify=WARNING-ON %s
+// RUN: %clang_cc1 -fsyntax-only -Wno-format-insufficient-args 
-verify=WARNING-OFF %s
+
+
+int printf(const char * format, ...);
+
+int main(void) {
+  int patatino = 42;
+  printf("%i %i", patatino); // WARNING-ON-warning {{more '%' conversions than 
data arguments}}
+  // WARNING-OFF-no-diagnostics
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 47e6851 - [Analyzer][WebKit] Use tri-state types for relevant predicates

2020-09-22 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-22T21:57:24-07:00
New Revision: 47e6851423fd32f0685a643236ad946e23ab14ff

URL: 
https://github.com/llvm/llvm-project/commit/47e6851423fd32f0685a643236ad946e23ab14ff
DIFF: 
https://github.com/llvm/llvm-project/commit/47e6851423fd32f0685a643236ad946e23ab14ff.diff

LOG: [Analyzer][WebKit] Use tri-state types for relevant predicates

Some of the predicates can't always be decided - for example when a type
definition isn't available. At the same time it's necessary to let
client code decide what to do about such cases - specifically we can't
just use true or false values as there are callees with
conflicting strategies how to handle this.

This is a speculative fix for PR47276.

Differential Revision: https://reviews.llvm.org/D88133

Added: 


Modified: 
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp

Removed: 




diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
index 34c072ac2241..9c7a59971763 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
@@ -34,7 +34,9 @@ tryToFindPtrOrigin(const Expr *E, bool 
StopAtFirstRefCountedObj) {
 }
 if (auto *call = dyn_cast(E)) {
   if (auto *memberCall = dyn_cast(call)) {
-if (isGetterOfRefCounted(memberCall->getMethodDecl())) {
+Optional IsGetterOfRefCt =
+isGetterOfRefCounted(memberCall->getMethodDecl());
+if (IsGetterOfRefCt && *IsGetterOfRefCt) {
   E = memberCall->getImplicitObjectArgument();
   if (StopAtFirstRefCountedObj) {
 return {E, true};

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
index 3956db933b35..97f75135bf92 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
@@ -76,8 +76,11 @@ class NoUncountedMemberChecker
 
   if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) {
 // If we don't see the definition we just don't know.
-if (MemberCXXRD->hasDefinition() && isRefCountable(MemberCXXRD))
-  reportBug(Member, MemberType, MemberCXXRD, RD);
+if (MemberCXXRD->hasDefinition()) {
+  llvm::Optional isRCAble = isRefCountable(MemberCXXRD);
+  if (isRCAble && *isRCAble)
+reportBug(Member, MemberType, MemberCXXRD, RD);
+}
   }
 }
   }

diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
index 168cfd511170..a198943c9433 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/ExprCXX.h"
+#include "llvm/ADT/Optional.h"
 
 using llvm::Optional;
 using namespace clang;
@@ -20,6 +21,7 @@ namespace {
 
 bool hasPublicRefAndDeref(const CXXRecordDecl *R) {
   assert(R);
+  assert(R->hasDefinition());
 
   bool hasRef = false;
   bool hasDeref = false;
@@ -43,25 +45,29 @@ bool hasPublicRefAndDeref(const CXXRecordDecl *R) {
 
 namespace clang {
 
-const CXXRecordDecl *isRefCountable(const CXXBaseSpecifier *Base) {
+llvm::Optional
+isRefCountable(const CXXBaseSpecifier *Base) {
   assert(Base);
 
   const Type *T = Base->getType().getTypePtrOrNull();
   if (!T)
-return nullptr;
+return llvm::None;
 
   const CXXRecordDecl *R = T->getAsCXXRecordDecl();
   if (!R)
-return nullptr;
+return llvm::None;
+  if (!R->hasDefinition())
+return llvm::None;
 
   return hasPublicRefAndDeref(R) ? R : nullptr;
 }
 
-bool isRefCountable(const CXXRecordDecl *R) {
+llvm::Optional isRefCountable(const CXXRecordDecl *R) {
   assert(R);
 
   R = R->getDefinition();
-  assert(R);
+  if (!R)
+return llvm::None;
 
   if (hasPublicRefAndDeref(R))
 return true;
@@ -69,13 +75,24 @@ bool isRefCountable(const CXXRecordDecl *R) {
   CXXBasePaths Paths;
   Paths.setOrigin(const_cast(R));
 
-  const auto isRefCountableBase = [](const CXXBaseSpecifier *Base,
- CXXBasePath &) {
-return 

[clang] 8a64689 - [Analyzer][WebKit] UncountedLocalVarsChecker

2020-09-22 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-22T11:05:04-07:00
New Revision: 8a64689e264ce039e4fb0a09c3e136a1c8451838

URL: 
https://github.com/llvm/llvm-project/commit/8a64689e264ce039e4fb0a09c3e136a1c8451838
DIFF: 
https://github.com/llvm/llvm-project/commit/8a64689e264ce039e4fb0a09c3e136a1c8451838.diff

LOG: [Analyzer][WebKit] UncountedLocalVarsChecker

Differential Review: https://reviews.llvm.org/D83259

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 9fb6782cf5a5..dbbd49085dac 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -2538,6 +2538,53 @@ We also define a set of safe transformations which if 
passed a safe value as an
 - casts
 - unary operators like ``&`` or ``*``
 
+alpha.webkit.UncountedLocalVarsChecker
+""
+The goal of this rule is to make sure that any uncounted local variable is 
backed by a ref-counted object with lifetime that is strictly larger than the 
scope of the uncounted local variable. To be on the safe side we require the 
scope of an uncounted variable to be embedded in the scope of ref-counted 
object that backs it.
+
+These are examples of cases that we consider safe:
+
+  .. code-block:: cpp
+void foo1() {
+  RefPtr counted;
+  // The scope of uncounted is EMBEDDED in the scope of counted.
+  {
+RefCountable* uncounted = counted.get(); // ok
+  }
+}
+
+void foo2(RefPtr counted_param) {
+  RefCountable* uncounted = counted_param.get(); // ok
+}
+
+void FooClass::foo_method() {
+  RefCountable* uncounted = this; // ok
+}
+
+Here are some examples of situations that we warn about as they *might* be 
potentially unsafe. The logic is that either we're able to guarantee that an 
argument is safe or it's considered if not a bug then bug-prone.
+
+  .. code-block:: cpp
+
+void foo1() {
+  RefCountable* uncounted = new RefCountable; // warn
+}
+
+RefCountable* global_uncounted;
+void foo2() {
+  RefCountable* uncounted = global_uncounted; // warn
+}
+
+void foo3() {
+  RefPtr counted;
+  // The scope of uncounted is not EMBEDDED in the scope of counted.
+  RefCountable* uncounted = counted.get(); // warn
+}
+
+We don't warn about these cases - we don't consider them necessarily safe but 
since they are very common and usually safe we'd introduce a lot of false 
positives otherwise:
+- variable defined in condition part of an ```if``` statement
+- variable defined in init statement condition of a ```for``` statement
+
+For the time being we also don't warn about uninitialized uncounted local 
variables.
 
 Debug Checkers
 ---

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 3540fe5fe55c..444b00d73f0b 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -1668,4 +1668,8 @@ def UncountedCallArgsChecker : 
Checker<"UncountedCallArgsChecker">,
   HelpText<"Check uncounted call arguments.">,
   Documentation;
 
+def UncountedLocalVarsChecker : Checker<"UncountedLocalVarsChecker">,
+  HelpText<"Check uncounted local variables.">,
+  Documentation;
+
 } // end alpha.webkit

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
index 31f971e33cb2..eb4f30137732 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
@@ -128,6 +128,7 @@ add_clang_library(clangStaticAnalyzerCheckers
   WebKit/RefCntblBaseVirtualDtorChecker.cpp
   WebKit/UncountedCallArgsChecker.cpp
   WebKit/UncountedLambdaCapturesChecker.cpp
+  WebKit/UncountedLocalVarsChecker.cpp
 
   LINK_LIBS
   clangAST

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp
new file mode 100644
index ..101aba732aea
--- /dev/null
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp
@@ -0,0 +1,250 @@
+//===- UncountedLocalVarsChecker.cpp -*- C++ 
-*-==//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "ASTUtils.h"

[clang] ae726fe - [SourceManager] Explicitly check for potential iterator underflow

2020-09-15 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-15T15:54:16-07:00
New Revision: ae726fecae9a1cc9c50de5a9f6e860056f82c556

URL: 
https://github.com/llvm/llvm-project/commit/ae726fecae9a1cc9c50de5a9f6e860056f82c556
DIFF: 
https://github.com/llvm/llvm-project/commit/ae726fecae9a1cc9c50de5a9f6e860056f82c556.diff

LOG: [SourceManager] Explicitly check for potential iterator underflow

Differential Revision: https://reviews.llvm.org/D86231

Added: 


Modified: 
clang/lib/Basic/SourceManager.cpp

Removed: 




diff  --git a/clang/lib/Basic/SourceManager.cpp 
b/clang/lib/Basic/SourceManager.cpp
index 0a76c78cd44f..0f194403bf04 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -1936,6 +1936,11 @@ 
SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const {
 
   assert(!MacroArgsCache->empty());
   MacroArgsMap::iterator I = MacroArgsCache->upper_bound(Offset);
+  // In case every element in MacroArgsCache is greater than Offset we can't
+  // decrement the iterator.
+  if (I == MacroArgsCache->begin())
+return Loc;
+
   --I;
 
   unsigned MacroArgBeginOffs = I->first;



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 7cfc8f0 - [libclang] Add missing dependency on clangRewrite lib

2020-09-04 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-04T14:59:53-07:00
New Revision: 7cfc8f0c7c2440ea8aa722304f9e6ef32472833b

URL: 
https://github.com/llvm/llvm-project/commit/7cfc8f0c7c2440ea8aa722304f9e6ef32472833b
DIFF: 
https://github.com/llvm/llvm-project/commit/7cfc8f0c7c2440ea8aa722304f9e6ef32472833b.diff

LOG: [libclang] Add missing dependency on clangRewrite lib

Differential Revision: https://reviews.llvm.org/D86992

Added: 


Modified: 
clang/tools/libclang/CMakeLists.txt

Removed: 




diff  --git a/clang/tools/libclang/CMakeLists.txt 
b/clang/tools/libclang/CMakeLists.txt
index 4e2c19da0f7c4..c3b9ab6ffb9b0 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -42,6 +42,7 @@ set(LIBS
   clangFrontend
   clangIndex
   clangLex
+  clangRewrite
   clangSema
   clangSerialization
   clangTooling



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 69e5abb - [libclang] Add CXRewriter to libclang API

2020-09-04 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-04T14:17:03-07:00
New Revision: 69e5abb57b70570cf04671a93246e5e624023650

URL: 
https://github.com/llvm/llvm-project/commit/69e5abb57b70570cf04671a93246e5e624023650
DIFF: 
https://github.com/llvm/llvm-project/commit/69e5abb57b70570cf04671a93246e5e624023650.diff

LOG: [libclang] Add CXRewriter to libclang API

Differential Revision: https://reviews.llvm.org/D86992

Added: 
clang/include/clang-c/Rewrite.h
clang/tools/libclang/Rewrite.cpp

Modified: 
clang/tools/libclang/CMakeLists.txt
clang/tools/libclang/libclang.exports
clang/unittests/libclang/LibclangTest.cpp

Removed: 




diff  --git a/clang/include/clang-c/Rewrite.h b/clang/include/clang-c/Rewrite.h
new file mode 100644
index ..ce1b05594b38
--- /dev/null
+++ b/clang/include/clang-c/Rewrite.h
@@ -0,0 +1,63 @@
+/*===-- clang-c/Rewrite.h - C CXRewriter   --*- C 
-*-===*\
+|*
*|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM  
*|
+|* Exceptions.
*|
+|* See https://llvm.org/LICENSE.txt for license information.  
*|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*|
+|*
*|
+|*===--===*/
+
+#ifndef LLVM_CLANG_C_REWRITE_H
+#define LLVM_CLANG_C_REWRITE_H
+
+#include "clang-c/CXString.h"
+#include "clang-c/ExternC.h"
+#include "clang-c/Index.h"
+#include "clang-c/Platform.h"
+
+LLVM_CLANG_C_EXTERN_C_BEGIN
+
+typedef void *CXRewriter;
+
+/**
+ * Create CXRewriter.
+ */
+CINDEX_LINKAGE CXRewriter clang_CXRewriter_create(CXTranslationUnit TU);
+
+/**
+ * Insert the specified string at the specified location in the original 
buffer.
+ */
+CINDEX_LINKAGE void clang_CXRewriter_insertTextBefore(CXRewriter Rew, 
CXSourceLocation Loc,
+   const char *Insert);
+
+/**
+ * Replace the specified range of characters in the input with the specified
+ * replacement.
+ */
+CINDEX_LINKAGE void clang_CXRewriter_replaceText(CXRewriter Rew, CXSourceRange 
ToBeReplaced,
+  const char *Replacement);
+
+/**
+ * Remove the specified range.
+ */
+CINDEX_LINKAGE void clang_CXRewriter_removeText(CXRewriter Rew, CXSourceRange 
ToBeRemoved);
+
+/**
+ * Save all changed files to disk.
+ * Returns 1 if any files were not saved successfully, returns 0 otherwise.
+ */
+CINDEX_LINKAGE int clang_CXRewriter_overwriteChangedFiles(CXRewriter Rew);
+
+/**
+ * Write out rewritten version of the main file to stdout.
+ */
+CINDEX_LINKAGE void clang_CXRewriter_writeMainFileToStdOut(CXRewriter Rew);
+
+/**
+ * Free the given CXRewriter.
+ */
+CINDEX_LINKAGE void clang_CXRewriter_dispose(CXRewriter Rew);
+
+LLVM_CLANG_C_EXTERN_C_END
+
+#endif

diff  --git a/clang/tools/libclang/CMakeLists.txt 
b/clang/tools/libclang/CMakeLists.txt
index a4077140acee..4e2c19da0f7c 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -20,6 +20,7 @@ set(SOURCES
   CXType.cpp
   Indexing.cpp
   FatalErrorHandler.cpp
+  Rewrite.cpp
 
   ADDITIONAL_HEADERS
   CIndexDiagnostic.h

diff  --git a/clang/tools/libclang/Rewrite.cpp 
b/clang/tools/libclang/Rewrite.cpp
new file mode 100644
index ..389232d97acc
--- /dev/null
+++ b/clang/tools/libclang/Rewrite.cpp
@@ -0,0 +1,63 @@
+//===- Rewrite.cpp 
===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "clang-c/Rewrite.h"
+#include "CXSourceLocation.h"
+#include "CXTranslationUnit.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/ASTUnit.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+
+CXRewriter clang_CXRewriter_create(CXTranslationUnit TU) {
+  if (clang::cxtu::isNotUsableTU(TU)) {
+LOG_BAD_TU(TU);
+return {};
+  }
+  clang::ASTUnit *AU = clang::cxtu::getASTUnit(TU);
+  assert(AU);
+  return reinterpret_cast(
+  new clang::Rewriter(AU->getSourceManager(), AU->getLangOpts()));
+}
+
+void clang_CXRewriter_insertTextBefore(CXRewriter Rew, CXSourceLocation Loc,
+const char *Insert) {
+  assert(Rew);
+  clang::Rewriter  = *reinterpret_cast(Rew);
+  R.InsertTextBefore(clang::cxloc::translateSourceLocation(Loc), Insert);
+}
+
+void clang_CXRewriter_replaceText(CXRewriter Rew, CXSourceRange ToBeReplaced,
+   const char *Replacement) {
+  assert(Rew);
+  

[clang] 052f838 - [libclang] Expose couple more AST details via cursors

2020-09-04 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-04T13:38:47-07:00
New Revision: 052f83890349822a606c916b2fee501bc087652b

URL: 
https://github.com/llvm/llvm-project/commit/052f83890349822a606c916b2fee501bc087652b
DIFF: 
https://github.com/llvm/llvm-project/commit/052f83890349822a606c916b2fee501bc087652b.diff

LOG: [libclang] Expose couple more AST details via cursors

Differential Revision: https://reviews.llvm.org/D86991

Added: 


Modified: 
clang/include/clang-c/Index.h
clang/tools/libclang/CIndex.cpp
clang/tools/libclang/libclang.exports
clang/unittests/libclang/LibclangTest.cpp

Removed: 




diff  --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index 5fa728d6d66c..4838937c8da6 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -2940,6 +2940,26 @@ CINDEX_LINKAGE int clang_getCursorPlatformAvailability(
 CINDEX_LINKAGE void
 clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability);
 
+/**
+ * If cursor refers to a variable declaration and it has initializer returns
+ * cursor referring to the initializer otherwise return null cursor.
+ */
+CINDEX_LINKAGE CXCursor clang_Cursor_getVarDeclInitializer(CXCursor cursor);
+
+/**
+ * If cursor refers to a variable declaration that has global storage returns 
1.
+ * If cursor refers to a variable declaration that doesn't have global storage
+ * returns 0. Otherwise returns -1.
+ */
+CINDEX_LINKAGE int clang_Cursor_hasVarDeclGlobalStorage(CXCursor cursor);
+
+/**
+ * If cursor refers to a variable declaration that has external storage
+ * returns 1. If cursor refers to a variable declaration that doesn't have
+ * external storage returns 0. Otherwise returns -1.
+ */
+CINDEX_LINKAGE int clang_Cursor_hasVarDeclExternalStorage(CXCursor cursor);
+
 /**
  * Describe the "language" of the entity referred to by a cursor.
  */

diff  --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 683b517d79fd..87138cd3b4a3 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -8851,6 +8851,42 @@ void clang::PrintLibclangResourceUsage(CXTranslationUnit 
TU) {
   clang_disposeCXTUResourceUsage(Usage);
 }
 
+CXCursor clang_Cursor_getVarDeclInitializer(CXCursor cursor) {
+  const Decl *const D = getCursorDecl(cursor);
+  if (!D)
+return clang_getNullCursor();
+  const auto *const VD = dyn_cast(D);
+  if (!VD)
+return clang_getNullCursor();
+  const Expr *const Init = VD->getInit();
+  if (!Init)
+return clang_getNullCursor();
+
+  return cxcursor::MakeCXCursor(Init, VD, cxcursor::getCursorTU(cursor));
+}
+
+int clang_Cursor_hasVarDeclGlobalStorage(CXCursor cursor) {
+  const Decl *const D = getCursorDecl(cursor);
+  if (!D)
+return -1;
+  const auto *const VD = dyn_cast(D);
+  if (!VD)
+return -1;
+
+  return VD->hasGlobalStorage();
+}
+
+int clang_Cursor_hasVarDeclExternalStorage(CXCursor cursor) {
+  const Decl *const D = getCursorDecl(cursor);
+  if (!D)
+return -1;
+  const auto *const VD = dyn_cast(D);
+  if (!VD)
+return -1;
+
+  return VD->hasExternalStorage();
+}
+
 
//===--===//
 // Misc. utility functions.
 
//===--===//

diff  --git a/clang/tools/libclang/libclang.exports 
b/clang/tools/libclang/libclang.exports
index defbaa91a488..618f99f348fb 100644
--- a/clang/tools/libclang/libclang.exports
+++ b/clang/tools/libclang/libclang.exports
@@ -382,3 +382,6 @@ clang_PrintingPolicy_setProperty
 clang_PrintingPolicy_dispose
 clang_install_aborting_llvm_fatal_error_handler
 clang_uninstall_llvm_fatal_error_handler
+clang_Cursor_getVarDeclInitializer
+clang_Cursor_hasVarDeclGlobalStorage
+clang_Cursor_hasVarDeclExternalStorage

diff  --git a/clang/unittests/libclang/LibclangTest.cpp 
b/clang/unittests/libclang/LibclangTest.cpp
index e2e3a8e887ba..27fe10dfbb0f 100644
--- a/clang/unittests/libclang/LibclangTest.cpp
+++ b/clang/unittests/libclang/LibclangTest.cpp
@@ -736,3 +736,109 @@ TEST_F(LibclangSerializationTest, 
TokenKindsAreCorrectAfterLoading) {
 
   CheckTokenKinds();
 }
+
+TEST_F(LibclangParseTest, clang_getVarDeclInitializer) {
+  std::string Main = "main.cpp";
+  WriteFile(Main, "int foo() { return 5; }; const int a = foo();");
+  ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, 
nullptr,
+   0, TUFlags);
+
+  CXCursor C = clang_getTranslationUnitCursor(ClangTU);
+  clang_visitChildren(
+  C,
+  [](CXCursor cursor, CXCursor parent,
+ CXClientData client_data) -> CXChildVisitResult {
+if (clang_getCursorKind(cursor) == CXCursor_VarDecl) {
+  const CXCursor Initializer = 
clang_Cursor_getVarDeclInitializer(cursor);
+  EXPECT_FALSE(clang_Cursor_isNull(Initializer));
+  CXString Spelling = 

[clang] baf3c77 - [libclang] Add translateCXRangeToCharRange conversion

2020-09-04 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-04T09:41:22-07:00
New Revision: baf3c77bd9f6baf60a09ef3625fef84080642b72

URL: 
https://github.com/llvm/llvm-project/commit/baf3c77bd9f6baf60a09ef3625fef84080642b72
DIFF: 
https://github.com/llvm/llvm-project/commit/baf3c77bd9f6baf60a09ef3625fef84080642b72.diff

LOG: [libclang] Add translateCXRangeToCharRange conversion

Add new conversion with clearly specified semantics.

https://reviews.llvm.org/D86990

Added: 


Modified: 
clang/tools/libclang/CIndex.cpp
clang/tools/libclang/CXSourceLocation.h

Removed: 




diff  --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 93f9797a965e..683b517d79fd 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -164,6 +164,12 @@ CXSourceRange cxloc::translateSourceRange(const 
SourceManager ,
   return Result;
 }
 
+CharSourceRange cxloc::translateCXRangeToCharRange(CXSourceRange R) {
+  return CharSourceRange::getCharRange(
+  SourceLocation::getFromRawEncoding(R.begin_int_data),
+  SourceLocation::getFromRawEncoding(R.end_int_data));
+}
+
 
//===--===//
 // Cursor visitor.
 
//===--===//

diff  --git a/clang/tools/libclang/CXSourceLocation.h 
b/clang/tools/libclang/CXSourceLocation.h
index 6702d0cf9791..ce3d09e1c9eb 100644
--- a/clang/tools/libclang/CXSourceLocation.h
+++ b/clang/tools/libclang/CXSourceLocation.h
@@ -71,7 +71,11 @@ static inline SourceRange 
translateCXSourceRange(CXSourceRange R) {
  SourceLocation::getFromRawEncoding(R.end_int_data));
 }
 
-
+/// Translates CXSourceRange to CharSourceRange.
+/// The semantics of \p R are:
+/// R.begin_int_data is first character of the range.
+/// R.end_int_data is one character past the end of the range.
+CharSourceRange translateCXRangeToCharRange(CXSourceRange R);
 }} // end namespace: clang::cxloc
 
 #endif



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] c9239b2 - [Analyzer][docs][NFC] Fix typo in code example

2020-09-03 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-09-03T09:28:34-07:00
New Revision: c9239b2bf5f00b58aaa431955f24013e0cada0a3

URL: 
https://github.com/llvm/llvm-project/commit/c9239b2bf5f00b58aaa431955f24013e0cada0a3
DIFF: 
https://github.com/llvm/llvm-project/commit/c9239b2bf5f00b58aaa431955f24013e0cada0a3.diff

LOG: [Analyzer][docs][NFC] Fix typo in code example

Added: 


Modified: 
clang/docs/analyzer/checkers.rst

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 3b378f735ebc..7a294f916bcf 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1747,7 +1747,7 @@ Check for integer to enumeration casts that could result 
in undefined values.
  void foo() {
TestEnum t = static_cast(-1);
// warn: the value provided to the cast expression is not in
-the valid range of values for the enum
+   //   the valid range of values for the enum
 
 .. _alpha-cplusplus-InvalidatedIterator:
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 4da126c - [index-while-building] PathIndexer

2020-08-19 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-08-19T11:25:21-07:00
New Revision: 4da126c3748f3b6c6251e45614b12d3aa118d047

URL: 
https://github.com/llvm/llvm-project/commit/4da126c3748f3b6c6251e45614b12d3aa118d047
DIFF: 
https://github.com/llvm/llvm-project/commit/4da126c3748f3b6c6251e45614b12d3aa118d047.diff

LOG: [index-while-building] PathIndexer

Differential Revision: https://reviews.llvm.org/D66854

Added: 
clang/include/clang/IndexSerialization/SerializablePathCollection.h
clang/lib/IndexSerialization/CMakeLists.txt
clang/lib/IndexSerialization/SerializablePathCollection.cpp

Modified: 
clang/lib/CMakeLists.txt

Removed: 




diff  --git 
a/clang/include/clang/IndexSerialization/SerializablePathCollection.h 
b/clang/include/clang/IndexSerialization/SerializablePathCollection.h
new file mode 100644
index ..20cf8fbdad96
--- /dev/null
+++ b/clang/include/clang/IndexSerialization/SerializablePathCollection.h
@@ -0,0 +1,129 @@
+//===--- SerializablePathCollection.h -- Index of paths -*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_INDEX_SerializablePathCollection_H
+#define LLVM_CLANG_INDEX_SerializablePathCollection_H
+
+#include "clang/Basic/FileManager.h"
+#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/iterator.h"
+
+#include 
+#include 
+
+namespace clang {
+namespace index {
+
+/// Pool of strings
+class StringPool {
+  llvm::SmallString<512> Buffer;
+
+public:
+  struct StringOffsetSize {
+std::size_t Offset;
+std::size_t Size;
+
+StringOffsetSize(size_t Offset, size_t Size) : Offset(Offset), Size(Size) 
{}
+  };
+
+  StringOffsetSize add(StringRef Str);
+  StringRef getBuffer() const { return Buffer; }
+};
+
+/// Pool of filesystem paths backed by a StringPool
+class PathPool {
+public:
+  /// Special root directory of a filesystem path.
+  enum class RootDirKind {
+Regular = 0,
+CurrentWorkDir = 1,
+SysRoot = 2,
+  };
+
+  struct DirPath {
+RootDirKind Root;
+StringPool::StringOffsetSize Path;
+
+DirPath(RootDirKind Root, const StringPool::StringOffsetSize )
+: Root(Root), Path(Path) {}
+  };
+
+  struct FilePath {
+DirPath Dir;
+StringPool::StringOffsetSize Filename;
+
+FilePath(const DirPath , const StringPool::StringOffsetSize )
+: Dir(Dir), Filename(Filename) {}
+  };
+
+  /// \returns index of the newly added file in FilePaths.
+  size_t addFilePath(RootDirKind Root, const StringPool::StringOffsetSize ,
+ StringRef Filename);
+
+  /// \returns offset in Paths and size of newly added directory.
+  StringPool::StringOffsetSize addDirPath(StringRef Dir);
+
+  llvm::ArrayRef getFilePaths() const;
+
+  StringRef getPaths() const;
+
+private:
+  StringPool Paths;
+  std::vector FilePaths;
+};
+
+/// Stores file paths and produces serialization-friendly representation.
+class SerializablePathCollection {
+  std::string WorkDir;
+  std::string SysRoot;
+
+  PathPool Paths;
+  llvm::DenseMap UniqueFiles;
+  llvm::StringMap UniqueDirs;
+
+public:
+  const StringPool::StringOffsetSize WorkDirPath;
+  const StringPool::StringOffsetSize SysRootPath;
+  const StringPool::StringOffsetSize OutputFilePath;
+
+  SerializablePathCollection(llvm::StringRef CurrentWorkDir,
+ llvm::StringRef SysRoot,
+ llvm::StringRef OutputFile);
+
+  /// \returns buffer containing all the paths.
+  llvm::StringRef getPathsBuffer() const { return Paths.getPaths(); }
+
+  /// \returns file paths (no directories) backed by buffer exposed in
+  /// getPathsBuffer.
+  ArrayRef getFilePaths() const {
+return Paths.getFilePaths();
+  }
+
+  /// Stores path to \p FE if it hasn't been stored yet.
+  /// \returns index to array exposed by getPathsBuffer().
+  size_t tryStoreFilePath(const clang::FileEntry );
+
+private:
+  /// Stores \p Path if it is non-empty.
+  /// Warning: this method doesn't check for uniqueness.
+  /// \returns offset of \p Path value begin in buffer with stored paths.
+  StringPool::StringOffsetSize storePath(llvm::StringRef Path);
+
+  /// Stores \p dirStr path if it hasn't been stored yet.
+  PathPool::DirPath tryStoreDirPath(llvm::StringRef dirStr);
+};
+
+} // namespace index
+} // namespace clang
+
+#endif // LLVM_CLANG_INDEX_SerializablePathCollection_H

diff  --git a/clang/lib/CMakeLists.txt b/clang/lib/CMakeLists.txt
index c2b6a5a4d5d4..23082789ff9a 100644
--- a/clang/lib/CMakeLists.txt
+++ b/clang/lib/CMakeLists.txt

[clang] 820e8d8 - [Analyzer][WebKit] UncountedLambdaCaptureChecker

2020-08-05 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-08-05T15:23:55-08:00
New Revision: 820e8d8656ecf65ba29ea27c794c833f230c2698

URL: 
https://github.com/llvm/llvm-project/commit/820e8d8656ecf65ba29ea27c794c833f230c2698
DIFF: 
https://github.com/llvm/llvm-project/commit/820e8d8656ecf65ba29ea27c794c833f230c2698.diff

LOG: [Analyzer][WebKit] UncountedLambdaCaptureChecker

Differential Revision: https://reviews.llvm.org/D82837

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 1583da7aff09..3b378f735ebc 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1423,6 +1423,25 @@ Raw pointers and references to uncounted types can't be 
used as class members. O
// ...
  };
 
+.. _webkit-UncountedLambdaCapturesChecker:
+
+webkit.UncountedLambdaCapturesChecker
+"
+Raw pointers and references to uncounted types can't be captured in lambdas. 
Only ref-counted types are allowed.
+
+.. code-block:: cpp
+
+ struct RefCntbl {
+   void ref() {}
+   void deref() {}
+ };
+
+ void foo(RefCntbl* a, RefCntbl& b) {
+   [&, a](){ // warn about 'a'
+ do_something(b); // warn about 'b'
+   };
+ };
+
 .. _alpha-checkers:
 
 Experimental Checkers

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index cbd925400328..a444843c5006 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -1654,6 +1654,10 @@ def NoUncountedMemberChecker : 
Checker<"NoUncountedMemberChecker">,
   HelpText<"Check for no uncounted member variables.">,
   Documentation;
 
+def UncountedLambdaCapturesChecker : Checker<"UncountedLambdaCapturesChecker">,
+  HelpText<"Check uncounted lambda captures.">,
+  Documentation;
+
 } // end webkit
 
 let ParentPackage = WebKitAlpha in {

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
index 9be1fdeb3ebf..31f971e33cb2 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
@@ -127,6 +127,7 @@ add_clang_library(clangStaticAnalyzerCheckers
   WebKit/PtrTypesSemantics.cpp
   WebKit/RefCntblBaseVirtualDtorChecker.cpp
   WebKit/UncountedCallArgsChecker.cpp
+  WebKit/UncountedLambdaCapturesChecker.cpp
 
   LINK_LIBS
   clangAST

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
new file mode 100644
index ..0a387592d350
--- /dev/null
+++ 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
@@ -0,0 +1,106 @@
+//===- UncountedLambdaCapturesChecker.cpp *- C++ 
-*-==//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "DiagOutputUtils.h"
+#include "PtrTypesSemantics.h"
+#include "clang/AST/CXXInheritance.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
+#include "clang/StaticAnalyzer/Core/Checker.h"
+
+using namespace clang;
+using namespace ento;
+
+namespace {
+class UncountedLambdaCapturesChecker
+: public Checker> {
+private:
+  BugType Bug{this, "Lambda capture of uncounted variable",
+  "WebKit coding guidelines"};
+  mutable BugReporter *BR;
+
+public:
+  void checkASTDecl(const TranslationUnitDecl *TUD, AnalysisManager ,
+BugReporter ) const {
+BR = 
+
+// The calls to checkAST* from AnalysisConsumer don't
+// visit template instantiations or lambda classes. We
+// want to visit those, so we make our own RecursiveASTVisitor.
+struct LocalVisitor : public RecursiveASTVisitor {
+  const UncountedLambdaCapturesChecker *Checker;
+  explicit LocalVisitor(const UncountedLambdaCapturesChecker *Checker)
+  : Checker(Checker) {
+assert(Checker);
+  }
+
+  bool shouldVisitTemplateInstantiations() const { return true; }
+  bool shouldVisitImplicitCode() const { return false; }
+
+  bool VisitLambdaExpr(LambdaExpr *L) {
+

[clang] 5e8b4be - [AST][NFC] Simplify a regression test

2020-07-16 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-07-16T12:07:18-07:00
New Revision: 5e8b4be9f8546884889b1f178a6a2c2a5c1c9d1f

URL: 
https://github.com/llvm/llvm-project/commit/5e8b4be9f8546884889b1f178a6a2c2a5c1c9d1f
DIFF: 
https://github.com/llvm/llvm-project/commit/5e8b4be9f8546884889b1f178a6a2c2a5c1c9d1f.diff

LOG: [AST][NFC] Simplify a regression test

Differential Revision: https://reviews.llvm.org/D83438

Added: 


Modified: 
clang/test/AST/regression-new-expr-crash.cpp
clang/unittests/AST/CMakeLists.txt

Removed: 
clang/unittests/AST/HasSideEffectsTest.cpp



diff  --git a/clang/test/AST/regression-new-expr-crash.cpp 
b/clang/test/AST/regression-new-expr-crash.cpp
index 81dd193b93e8..e1d93f92a125 100644
--- a/clang/test/AST/regression-new-expr-crash.cpp
+++ b/clang/test/AST/regression-new-expr-crash.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
 
 struct Bar {int a;};
 const Bar arr[2] = {{1}};
@@ -11,3 +11,8 @@ void foo(int a) {
   Foo *foo_array;
   foo_array = new Foo[arr[0].a];
 }
+
+void Test(int N) {
+  int arr[N];
+  decltype([]{}) *p; // expected-error {{lambda expression in an 
unevaluated operand}}
+}

diff  --git a/clang/unittests/AST/CMakeLists.txt 
b/clang/unittests/AST/CMakeLists.txt
index 185995d5b5a2..2e750ac9ea92 100644
--- a/clang/unittests/AST/CMakeLists.txt
+++ b/clang/unittests/AST/CMakeLists.txt
@@ -26,7 +26,6 @@ add_clang_unittest(ASTTests
   DeclTest.cpp
   EvaluateAsRValueTest.cpp
   ExternalASTSourceTest.cpp
-  HasSideEffectsTest.cpp
   NamedDeclPrinterTest.cpp
   RecursiveASTVisitorTest.cpp
   SizelessTypesTest.cpp

diff  --git a/clang/unittests/AST/HasSideEffectsTest.cpp 
b/clang/unittests/AST/HasSideEffectsTest.cpp
deleted file mode 100644
index 842afd8d7a9c..
--- a/clang/unittests/AST/HasSideEffectsTest.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-//===- unittest/AST/HasSideEffectsTest.cpp 
===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===--===//
-
-#include "clang/AST/RecursiveASTVisitor.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Attr.h"
-#include "clang/Frontend/FrontendAction.h"
-#include "clang/Tooling/Tooling.h"
-#include "llvm/ADT/FunctionExtras.h"
-#include "llvm/ADT/STLExtras.h"
-#include "gmock/gmock.h"
-#include "gtest/gtest.h"
-#include 
-
-using namespace clang;
-
-namespace {
-class ProcessASTAction : public clang::ASTFrontendAction {
-public:
-  ProcessASTAction(llvm::unique_function Process)
-  : Process(std::move(Process)) {
-assert(this->Process);
-  }
-
-  std::unique_ptr CreateASTConsumer(CompilerInstance ,
- StringRef InFile) {
-class Consumer : public ASTConsumer {
-public:
-  Consumer(llvm::function_ref Process)
-  : Process(Process) {}
-
-  void HandleTranslationUnit(ASTContext ) override { Process(Ctx); }
-
-private:
-  llvm::function_ref Process;
-};
-
-return std::make_unique(Process);
-  }
-
-private:
-  llvm::unique_function Process;
-};
-
-class RunHasSideEffects
-: public RecursiveASTVisitor {
-public:
-  RunHasSideEffects(ASTContext& Ctx)
-  : Ctx(Ctx) {}
-
-  bool VisitLambdaExpr(LambdaExpr *LE) {
-LE->HasSideEffects(Ctx);
-return true;
-  }
-
-  ASTContext& Ctx;
-};
-} // namespace
-
-TEST(HasSideEffectsTest, All) {
-  llvm::StringRef Code = R"cpp(
-void Test() {
-  int msize = 4;
-  float arr[msize];
-  [] {};
-}
-  )cpp";
-
-  ASSERT_NO_FATAL_FAILURE(
-clang::tooling::runToolOnCode(
-  std::make_unique(
-  [&](clang::ASTContext ) {
-  RunHasSideEffects Visitor(Ctx);
-  Visitor.TraverseAST(Ctx);
-  }
-  ),
-  Code)
-  );
-
-}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] fdb6953 - [AST] Fix potential nullptr dereference in Expr::HasSideEffects

2020-07-13 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-07-13T11:08:51-07:00
New Revision: fdb69539bcd250f6e4f49197c9b8149a7542e3ff

URL: 
https://github.com/llvm/llvm-project/commit/fdb69539bcd250f6e4f49197c9b8149a7542e3ff
DIFF: 
https://github.com/llvm/llvm-project/commit/fdb69539bcd250f6e4f49197c9b8149a7542e3ff.diff

LOG: [AST] Fix potential nullptr dereference in Expr::HasSideEffects

Array returned by LambdaExpr::capture_inits() can contain nullptrs.

Differential Revision: https://reviews.llvm.org/D83438

Added: 
clang/unittests/AST/HasSideEffectsTest.cpp

Modified: 
clang/include/clang/AST/ExprCXX.h
clang/lib/AST/Expr.cpp
clang/unittests/AST/CMakeLists.txt

Removed: 




diff  --git a/clang/include/clang/AST/ExprCXX.h 
b/clang/include/clang/AST/ExprCXX.h
index 178f4db77061..6f0b68479b9d 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -1931,6 +1931,7 @@ class LambdaExpr final : public Expr,
 
   /// Const iterator that walks over the capture initialization
   /// arguments.
+  /// FIXME: This interface is prone to being used incorrectly.
   using const_capture_init_iterator = Expr *const *;
 
   /// Retrieve the initialization expressions for this lambda's captures.

diff  --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 343a271c3394..399e7e13c445 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -3629,7 +3629,7 @@ bool Expr::HasSideEffects(const ASTContext ,
   case LambdaExprClass: {
 const LambdaExpr *LE = cast(this);
 for (Expr *E : LE->capture_inits())
-  if (E->HasSideEffects(Ctx, IncludePossibleEffects))
+  if (E && E->HasSideEffects(Ctx, IncludePossibleEffects))
 return true;
 return false;
   }

diff  --git a/clang/unittests/AST/CMakeLists.txt 
b/clang/unittests/AST/CMakeLists.txt
index 2e750ac9ea92..185995d5b5a2 100644
--- a/clang/unittests/AST/CMakeLists.txt
+++ b/clang/unittests/AST/CMakeLists.txt
@@ -26,6 +26,7 @@ add_clang_unittest(ASTTests
   DeclTest.cpp
   EvaluateAsRValueTest.cpp
   ExternalASTSourceTest.cpp
+  HasSideEffectsTest.cpp
   NamedDeclPrinterTest.cpp
   RecursiveASTVisitorTest.cpp
   SizelessTypesTest.cpp

diff  --git a/clang/unittests/AST/HasSideEffectsTest.cpp 
b/clang/unittests/AST/HasSideEffectsTest.cpp
new file mode 100644
index ..842afd8d7a9c
--- /dev/null
+++ b/clang/unittests/AST/HasSideEffectsTest.cpp
@@ -0,0 +1,86 @@
+//===- unittest/AST/HasSideEffectsTest.cpp 
===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/ASTConsumer.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Attr.h"
+#include "clang/Frontend/FrontendAction.h"
+#include "clang/Tooling/Tooling.h"
+#include "llvm/ADT/FunctionExtras.h"
+#include "llvm/ADT/STLExtras.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include 
+
+using namespace clang;
+
+namespace {
+class ProcessASTAction : public clang::ASTFrontendAction {
+public:
+  ProcessASTAction(llvm::unique_function Process)
+  : Process(std::move(Process)) {
+assert(this->Process);
+  }
+
+  std::unique_ptr CreateASTConsumer(CompilerInstance ,
+ StringRef InFile) {
+class Consumer : public ASTConsumer {
+public:
+  Consumer(llvm::function_ref Process)
+  : Process(Process) {}
+
+  void HandleTranslationUnit(ASTContext ) override { Process(Ctx); }
+
+private:
+  llvm::function_ref Process;
+};
+
+return std::make_unique(Process);
+  }
+
+private:
+  llvm::unique_function Process;
+};
+
+class RunHasSideEffects
+: public RecursiveASTVisitor {
+public:
+  RunHasSideEffects(ASTContext& Ctx)
+  : Ctx(Ctx) {}
+
+  bool VisitLambdaExpr(LambdaExpr *LE) {
+LE->HasSideEffects(Ctx);
+return true;
+  }
+
+  ASTContext& Ctx;
+};
+} // namespace
+
+TEST(HasSideEffectsTest, All) {
+  llvm::StringRef Code = R"cpp(
+void Test() {
+  int msize = 4;
+  float arr[msize];
+  [] {};
+}
+  )cpp";
+
+  ASSERT_NO_FATAL_FAILURE(
+clang::tooling::runToolOnCode(
+  std::make_unique(
+  [&](clang::ASTContext ) {
+  RunHasSideEffects Visitor(Ctx);
+  Visitor.TraverseAST(Ctx);
+  }
+  ),
+  Code)
+  );
+
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] e81f9cd - [AST][test] Add regression test forPointerExprEvaluator::VisitCXXNewExpr

2020-07-09 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-07-09T12:11:08-07:00
New Revision: e81f9cd2137f258fd1ec6a169db836387bcca84a

URL: 
https://github.com/llvm/llvm-project/commit/e81f9cd2137f258fd1ec6a169db836387bcca84a
DIFF: 
https://github.com/llvm/llvm-project/commit/e81f9cd2137f258fd1ec6a169db836387bcca84a.diff

LOG: [AST][test] Add regression test forPointerExprEvaluator::VisitCXXNewExpr

This assert was failing:
assert(CAT && "unexpected type for array initializer");

until this patch landed:
9a7eda1bece887ca9af085d79fe6e4fb8826dcda
PR45350: Handle unsized array CXXConstructExprs in constant evaluation

Added: 
clang/test/AST/regression-new-expr-crash.cpp

Modified: 


Removed: 




diff  --git a/clang/test/AST/regression-new-expr-crash.cpp 
b/clang/test/AST/regression-new-expr-crash.cpp
new file mode 100644
index ..81dd193b93e8
--- /dev/null
+++ b/clang/test/AST/regression-new-expr-crash.cpp
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only %s
+
+struct Bar {int a;};
+const Bar arr[2] = {{1}};
+
+struct Foo {};
+
+const int b = 2;
+
+void foo(int a) {
+  Foo *foo_array;
+  foo_array = new Foo[arr[0].a];
+}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 6e089e9 - [libclang] Fix crash when visiting a captured VLA

2020-07-08 Thread Jan Korous via cfe-commits

Author: Christian Kandeler
Date: 2020-07-08T13:10:16-07:00
New Revision: 6e089e98a9d5d7d0dda259f68b8ba7f4556cc5b3

URL: 
https://github.com/llvm/llvm-project/commit/6e089e98a9d5d7d0dda259f68b8ba7f4556cc5b3
DIFF: 
https://github.com/llvm/llvm-project/commit/6e089e98a9d5d7d0dda259f68b8ba7f4556cc5b3.diff

LOG: [libclang] Fix crash when visiting a captured VLA

Array returned by LambdaExpr::capture_inits() can contain nullptrs.

Differential Revision: https://reviews.llvm.org/D82629

Added: 


Modified: 
clang/test/Index/evaluate-cursor.cpp
clang/tools/libclang/CIndex.cpp

Removed: 




diff  --git a/clang/test/Index/evaluate-cursor.cpp 
b/clang/test/Index/evaluate-cursor.cpp
index 2bb687a1eb88..901e988bc99e 100644
--- a/clang/test/Index/evaluate-cursor.cpp
+++ b/clang/test/Index/evaluate-cursor.cpp
@@ -29,6 +29,12 @@ template  class e {
 constexpr static int calc_val() { return 1 + 2; }
 const auto the_value = calc_val() + sizeof(char);
 
+void vlaTest() {
+  int msize = 4;
+  float arr[msize];
+  [] {};
+}
+
 // RUN: c-index-test -evaluate-cursor-at=%s:4:7 \
 // RUN:-evaluate-cursor-at=%s:8:7 \
 // RUN:-evaluate-cursor-at=%s:8:11 -std=c++11 %s | FileCheck %s
@@ -65,3 +71,7 @@ const auto the_value = calc_val() + sizeof(char);
 // CHECK-EXPR: Value: 3
 // CHECK-EXPR: unsigned, Value: 4
 // CHECK-EXPR: unsigned, Value: 1
+
+// RUN: c-index-test -evaluate-cursor-at=%s:35:5 \
+// RUN:-std=c++11 %s | FileCheck -check-prefix=VLA %s
+// VLA: Not Evaluatable

diff  --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 8d33deb468e2..93f9797a965e 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -3272,7 +3272,7 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList 
) {
   }
   // Visit init captures
   for (auto InitExpr : E->capture_inits()) {
-if (Visit(InitExpr))
+if (InitExpr && Visit(InitExpr))
   return true;
   }
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] a93ff18 - [Analyzer][NFC] Remove prefix from WebKitNoUncountedMemberChecker name

2020-06-15 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-06-15T14:13:56-07:00
New Revision: a93ff1826b4bfd1674ea99dd45609b9e07792f6c

URL: 
https://github.com/llvm/llvm-project/commit/a93ff1826b4bfd1674ea99dd45609b9e07792f6c
DIFF: 
https://github.com/llvm/llvm-project/commit/a93ff1826b4bfd1674ea99dd45609b9e07792f6c.diff

LOG: [Analyzer][NFC] Remove prefix from WebKitNoUncountedMemberChecker name

Added: 


Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 7fb5719c7815..d14bd2d68af9 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1404,9 +1404,9 @@ Ref-counted types hold their ref-countable data by a raw 
pointer and allow impli
 
  struct Derived : RefCntblBase { }; // warn
 
-.. _webkit-WebKitNoUncountedMemberChecker:
+.. _webkit-NoUncountedMemberChecker:
 
-webkit.WebKitNoUncountedMemberChecker
+webkit.NoUncountedMemberChecker
 "
 Raw pointers and references to uncounted types can't be used as class members. 
Only ref-counted types are allowed.
 
@@ -2404,7 +2404,7 @@ Here are some examples of situations that we warn about 
as they *might* be poten
   consume(uncounted); // warn
 }
 
-Although we are enforcing member variables to be ref-counted by 
`webkit.WebKitNoUncountedMemberChecker` any method of the same class still has 
unrestricted access to these. Since from a caller's perspective we can't 
guarantee a particular member won't get modified by callee (directly or 
indirectly) we don't consider values obtained from members safe.
+Although we are enforcing member variables to be ref-counted by 
`webkit.NoUncountedMemberChecker` any method of the same class still has 
unrestricted access to these. Since from a caller's perspective we can't 
guarantee a particular member won't get modified by callee (directly or 
indirectly) we don't consider values obtained from members safe.
 
 Note: It's likely this heuristic could be made more precise with fewer false 
positives - for example calls to free functions that don't have any parameter 
other than the pointer should be safe as the callee won't be able to tamper 
with the member unless it's a global variable.
 

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 23bc0e1dbd4d..9de324506bf6 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -1625,7 +1625,7 @@ def RefCntblBaseVirtualDtorChecker : 
Checker<"RefCntblBaseVirtualDtor">,
   HelpText<"Check for any ref-countable base class having virtual 
destructor.">,
   Documentation;
 
-def WebKitNoUncountedMemberChecker : Checker<"WebKitNoUncountedMemberChecker">,
+def NoUncountedMemberChecker : Checker<"NoUncountedMemberChecker">,
   HelpText<"Check for no uncounted member variables.">,
   Documentation;
 

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
index 2deefab96255..3956db933b35 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
@@ -145,11 +145,11 @@ class NoUncountedMemberChecker
 };
 } // namespace
 
-void ento::registerWebKitNoUncountedMemberChecker(CheckerManager ) {
+void ento::registerNoUncountedMemberChecker(CheckerManager ) {
   Mgr.registerChecker();
 }
 
-bool ento::shouldRegisterWebKitNoUncountedMemberChecker(
+bool ento::shouldRegisterNoUncountedMemberChecker(
 const CheckerManager ) {
   return true;
 }

diff  --git 
a/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp 
b/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
index 20e58e7926d8..94ddcaca0817 100644
--- a/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
@@ -1,6 +1,6 @@
 // regression test for https://bugs.llvm.org/show_bug.cgi?id=46142
 
-// RUN: %clang_analyze_cc1 
-analyzer-checker=webkit.WebKitNoUncountedMemberChecker -verify %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=webkit.NoUncountedMemberChecker 
-verify %s
 // expected-no-diagnostics
 
 class ClassWithoutADefinition;

diff  --git a/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp 
b/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp
index e88c0b3b0dd0..a0ea61e0e2a1 100644
--- 

[clang] a7eb369 - [Analyzer][WebKit] UncountedCallArgsChecker

2020-06-15 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-06-15T13:53:36-07:00
New Revision: a7eb3692e762271235f866837f6d15b8330b4a00

URL: 
https://github.com/llvm/llvm-project/commit/a7eb3692e762271235f866837f6d15b8330b4a00
DIFF: 
https://github.com/llvm/llvm-project/commit/a7eb3692e762271235f866837f6d15b8330b4a00.diff

LOG: [Analyzer][WebKit] UncountedCallArgsChecker

Differential Revision: https://reviews.llvm.org/D77179

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp
clang/test/Analysis/Checkers/WebKit/call-args.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 34018047d57f..7fb5719c7815 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1407,7 +1407,7 @@ Ref-counted types hold their ref-countable data by a raw 
pointer and allow impli
 .. _webkit-WebKitNoUncountedMemberChecker:
 
 webkit.WebKitNoUncountedMemberChecker
-
+"
 Raw pointers and references to uncounted types can't be used as class members. 
Only ref-counted types are allowed.
 
 .. code-block:: cpp
@@ -2377,6 +2377,99 @@ Check for non-determinism caused by sorting of pointers.
  }
 
 
+alpha.WebKit
+
+
+.. _alpha-webkit-UncountedCallArgsChecker:
+
+alpha.webkit.UncountedCallArgsChecker
+"
+The goal of this rule is to make sure that lifetime of any dynamically 
allocated ref-countable object passed as a call argument spans past the end of 
the call. This applies to call to any function, method, lambda, function 
pointer or functor. Ref-countable types aren't supposed to be allocated on 
stack so we check arguments for parameters of raw pointers and references to 
uncounted types.
+
+Here are some examples of situations that we warn about as they *might* be 
potentially unsafe. The logic is that either we're able to guarantee that an 
argument is safe or it's considered if not a bug then bug-prone.
+
+  .. code-block:: cpp
+
+RefCountable* provide_uncounted();
+void consume(RefCountable*);
+
+// In these cases we can't make sure callee won't directly or indirectly 
call `deref()` on the argument which could make it unsafe from such point until 
the end of the call.
+
+void foo1() {
+  consume(provide_uncounted()); // warn
+}
+
+void foo2() {
+  RefCountable* uncounted = provide_uncounted();
+  consume(uncounted); // warn
+}
+
+Although we are enforcing member variables to be ref-counted by 
`webkit.WebKitNoUncountedMemberChecker` any method of the same class still has 
unrestricted access to these. Since from a caller's perspective we can't 
guarantee a particular member won't get modified by callee (directly or 
indirectly) we don't consider values obtained from members safe.
+
+Note: It's likely this heuristic could be made more precise with fewer false 
positives - for example calls to free functions that don't have any parameter 
other than the pointer should be safe as the callee won't be able to tamper 
with the member unless it's a global variable.
+
+  .. code-block:: cpp
+
+struct Foo {
+  RefPtr member;
+  void consume(RefCountable*) { /* ... */ }
+  void bugprone() {
+consume(member.get()); // warn
+  }
+};
+
+The implementation of this rule is a heuristic - we define a whitelist of 
kinds of values that are considered safe to be passed as arguments. If we can't 
prove an argument is safe it's considered an error.
+
+Allowed kinds of arguments:
+
+- values obtained from ref-counted objects (including temporaries as those 
survive the call too)
+
+  .. code-block:: cpp
+
+RefCountable* provide_uncounted();
+void consume(RefCountable*);
+
+void foo() {
+  RefPtr rc = makeRef(provide_uncounted());
+  consume(rc.get()); // ok
+  consume(makeRef(provide_uncounted()).get()); // ok
+}
+
+- forwarding uncounted arguments from caller to callee
+
+  .. code-block:: cpp
+
+void foo(RefCountable& a) {
+  bar(a); // ok
+}
+
+  Caller of ``foo()`` is responsible for  ``a``'s lifetime.
+
+- ``this`` pointer
+
+  .. code-block:: cpp
+
+void Foo::foo() {
+  baz(this);  // ok
+}
+
+  Caller of ``foo()`` is responsible for keeping the memory pointed to by 
``this`` pointer safe.
+
+- constants
+
+  .. code-block:: cpp
+
+foo(nullptr, NULL, 0); // ok
+
+We also define a set of safe transformations which if passed a safe value as 
an input provide (usually it's the return value) a safe value (or an object 
that provides safe values). This is also 

[clang] a95c08d - [Analyzer][NoUncountedMembersChecker] Fix crash for C structs

2020-06-04 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-06-04T15:57:19-07:00
New Revision: a95c08db122ef33576cd8f35094afcd1ea668d68

URL: 
https://github.com/llvm/llvm-project/commit/a95c08db122ef33576cd8f35094afcd1ea668d68
DIFF: 
https://github.com/llvm/llvm-project/commit/a95c08db122ef33576cd8f35094afcd1ea668d68.diff

LOG: [Analyzer][NoUncountedMembersChecker] Fix crash for C structs

Fixes https://bugs.llvm.org/show_bug.cgi?id=46177
Fixes second bug reported in https://bugs.llvm.org/show_bug.cgi?id=46142

Added: 


Modified: 
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp

Removed: 




diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
index db53db1587d5..2deefab96255 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
@@ -109,7 +109,11 @@ class NoUncountedMemberChecker
 
 // Ref-counted smartpointers actually have raw-pointer to uncounted type as
 // a member but we trust them to handle it correctly.
-return isRefCounted(llvm::dyn_cast_or_null(RD));
+auto CXXRD = llvm::dyn_cast_or_null(RD);
+if (CXXRD)
+  return isRefCounted(CXXRD);
+
+return false;
   }
 
   void reportBug(const FieldDecl *Member, const Type *MemberType,



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 39fa431 - [Analyzer][NFC] Fix markup in WebKit checkers documentation

2020-06-02 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-06-02T16:04:23-07:00
New Revision: 39fa431c8ccad45de9ec67e8681da923d0cd28c7

URL: 
https://github.com/llvm/llvm-project/commit/39fa431c8ccad45de9ec67e8681da923d0cd28c7
DIFF: 
https://github.com/llvm/llvm-project/commit/39fa431c8ccad45de9ec67e8681da923d0cd28c7.diff

LOG: [Analyzer][NFC] Fix markup in WebKit checkers documentation

Added: 


Modified: 
clang/docs/analyzer/checkers.rst

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index c977dde8c52f..34018047d57f 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1381,10 +1381,11 @@ WebKit is an open-source web browser engine available 
for macOS, iOS and Linux.
 This section describes checkers that can find issues in WebKit codebase.
 
 Most of the checkers focus on memory management for which WebKit uses custom 
implementation of reference counted smartpointers.
-Checker are formulated in terms related to ref-counting:
-* *Ref-counted type* is either ``Ref`` or ``RefPtr``.
-* *Ref-countable type* is any type that implements ``ref()`` and ``deref()`` 
methods as ``RefPtr<>`` is a template (i. e. relies on duck typing).
-* *Uncounted type* is ref-countable but not ref-counted type.
+
+Checkers are formulated in terms related to ref-counting:
+ - *Ref-counted type* is either ``Ref`` or ``RefPtr``.
+ - *Ref-countable type* is any type that implements ``ref()`` and ``deref()`` 
methods as ``RefPtr<>`` is a template (i. e. relies on duck typing).
+ - *Uncounted type* is ref-countable but not ref-counted type.
 
 .. _webkit-RefCntblBaseVirtualDtor:
 
@@ -1410,6 +1411,7 @@ webkit.WebKitNoUncountedMemberChecker
 Raw pointers and references to uncounted types can't be used as class members. 
Only ref-counted types are allowed.
 
 .. code-block:: cpp
+
  struct RefCntbl {
void ref() {}
void deref() {}



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] d61ad66 - [Analyzer][WebKit] Check record definition is available in NoUncountedMembers checker

2020-06-02 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-06-02T13:10:36-07:00
New Revision: d61ad660503d2e0c7ba9981ba6526ae0c2f3b7cc

URL: 
https://github.com/llvm/llvm-project/commit/d61ad660503d2e0c7ba9981ba6526ae0c2f3b7cc
DIFF: 
https://github.com/llvm/llvm-project/commit/d61ad660503d2e0c7ba9981ba6526ae0c2f3b7cc.diff

LOG: [Analyzer][WebKit] Check record definition is available in 
NoUncountedMembers checker

isRefCountable asserts that the record passed as an argument has a definition 
available.

Fixes: https://bugs.llvm.org/show_bug.cgi?id=46142

Differential Revision: https://reviews.llvm.org/D81017

Added: 
clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp

Modified: 
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp

Removed: 




diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
index 89caf602a17e..db53db1587d5 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
@@ -75,7 +75,8 @@ class NoUncountedMemberChecker
 continue;
 
   if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) {
-if (isRefCountable(MemberCXXRD))
+// If we don't see the definition we just don't know.
+if (MemberCXXRD->hasDefinition() && isRefCountable(MemberCXXRD))
   reportBug(Member, MemberType, MemberCXXRD, RD);
   }
 }

diff  --git 
a/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp 
b/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
new file mode 100644
index ..20e58e7926d8
--- /dev/null
+++ b/clang/test/Analysis/Checkers/WebKit/uncounted-members-regression-46142.cpp
@@ -0,0 +1,9 @@
+// regression test for https://bugs.llvm.org/show_bug.cgi?id=46142
+
+// RUN: %clang_analyze_cc1 
-analyzer-checker=webkit.WebKitNoUncountedMemberChecker -verify %s
+// expected-no-diagnostics
+
+class ClassWithoutADefinition;
+class Foo {
+const ClassWithoutADefinition *foo;
+};



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 1a5c97f - [ASTMatchers] Matchers related to C++ inheritance

2020-05-29 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-05-29T12:38:01-07:00
New Revision: 1a5c97f3a4b88438b19ff34a285e559e57b1e9d4

URL: 
https://github.com/llvm/llvm-project/commit/1a5c97f3a4b88438b19ff34a285e559e57b1e9d4
DIFF: 
https://github.com/llvm/llvm-project/commit/1a5c97f3a4b88438b19ff34a285e559e57b1e9d4.diff

LOG: [ASTMatchers] Matchers related to C++ inheritance

Differential Revision: https://reviews.llvm.org/D79063

Added: 


Modified: 

clang-tools-extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
clang/docs/LibASTMatchersReference.html
clang/include/clang/AST/ASTTypeTraits.h
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/include/clang/ASTMatchers/ASTMatchersInternal.h
clang/lib/AST/ASTTypeTraits.cpp
clang/lib/ASTMatchers/ASTMatchersInternal.cpp
clang/lib/ASTMatchers/Dynamic/Registry.cpp
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

Removed: 




diff  --git 
a/clang-tools-extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp 
b/clang-tools-extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
index 12fb7d8a7ae8..5b6988509742 100644
--- 
a/clang-tools-extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
+++ 
b/clang-tools-extra/clang-tidy/misc/NonPrivateMemberVariablesInClassesCheck.cpp
@@ -59,8 +59,9 @@ void 
NonPrivateMemberVariablesInClassesCheck::registerMatchers(
   // If we are ok with public fields, then we only want to complain about
   // protected fields, else we want to complain about all non-private fields.
   // We can ignore public member variables in structs/classes, in unions.
-  auto InterestingField = fieldDecl(
-  IgnorePublicMemberVariables ? isProtected() : unless(isPrivate()));
+  auto InterestingField = IgnorePublicMemberVariables
+  ? fieldDecl(isProtected())
+  : fieldDecl(unless(isPrivate()));
 
   // We only want the records that not only contain the mutable data 
(non-static
   // member variables), but also have some logic (non-static, non-implicit

diff  --git a/clang/docs/LibASTMatchersReference.html 
b/clang/docs/LibASTMatchersReference.html
index 9db6795eb5fa..bb5e4984fcdf 100644
--- a/clang/docs/LibASTMatchersReference.html
+++ b/clang/docs/LibASTMatchersReference.html
@@ -2175,6 +2175,75 @@ Narrowing Matchers
 
 
 
+Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html;>CXXBaseSpecifierisPrivate
+Matches private C++ 
declarations and C++ base specifers that specify private
+inheritance.
+
+Examples:
+  class C {
+  public:int a;
+  protected: int b;
+  private:   int c; // fieldDecl(isPrivate()) matches 'c'
+  };
+
+  struct Base {};
+  struct Derived1 : private Base {}; // matches 'Base'
+  class Derived2 : Base {}; // matches 'Base'
+
+
+
+Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html;>CXXBaseSpecifierisProtected
+Matches protected C++ 
declarations and C++ base specifers that specify
+protected inheritance.
+
+Examples:
+  class C {
+  public:int a;
+  protected: int b; // fieldDecl(isProtected()) matches 'b'
+  private:   int c;
+  };
+
+  class Base {};
+  class Derived : protected Base {}; // matches 'Base'
+
+
+
+Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html;>CXXBaseSpecifierisPublic
+Matches public C++ 
declarations and C++ base specifers that specify public
+inheritance.
+
+Examples:
+  class C {
+  public:int a; // fieldDecl(isPublic()) matches 'a'
+  protected: int b;
+  private:   int c;
+  };
+
+  class Base {};
+  class Derived1 : public Base {}; // matches 'Base'
+  struct Derived2 : Base {}; // matches 'Base'
+
+
+
+Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html;>CXXBaseSpecifierisVirtual
+Matches declarations of 
virtual methods and C++ base specifers that specify
+virtual inheritance.
+
+Example:
+  class A {
+   public:
+virtual void x(); // matches x
+  };
+
+Example:
+  class Base {};
+  class DirectlyDerived : virtual Base {}; // matches Base
+  class IndirectlyDerived : DirectlyDerived, Base {}; // matches Base
+
+Usable as: Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html;>CXXMethodDecl,
 Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBaseSpecifier.html;>CXXBaseSpecifier
+
+
+
 Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html;>CXXBoolLiteralExprequalsbool Value
 
 
@@ -2562,14 +2631,21 @@ Narrowing Matchers
 
 
 Matcherhttps://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html;>CXXMethodDeclisVirtual
-Matches if the given 
method declaration is virtual.
+Matches declarations of 
virtual methods and C++ base specifers that specify
+virtual inheritance.
 
-Given
+Example:
   class A {
public:
-virtual void x();
+virtual void x(); // matches x
   };
-  matches A::x
+
+Example:
+  class Base {};
+  class DirectlyDerived : 

[clang] 660cda5 - [Analyzer][WebKit] NoUncountedMembersChecker

2020-05-27 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-05-27T19:46:32-07:00
New Revision: 660cda572d6e05e55a9d959e61aba51790c0abbd

URL: 
https://github.com/llvm/llvm-project/commit/660cda572d6e05e55a9d959e61aba51790c0abbd
DIFF: 
https://github.com/llvm/llvm-project/commit/660cda572d6e05e55a9d959e61aba51790c0abbd.diff

LOG: [Analyzer][WebKit] NoUncountedMembersChecker

Differential Revision: https://reviews.llvm.org/D77178

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index dcf1f28994de..c977dde8c52f 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1403,6 +1403,24 @@ Ref-counted types hold their ref-countable data by a raw 
pointer and allow impli
 
  struct Derived : RefCntblBase { }; // warn
 
+.. _webkit-WebKitNoUncountedMemberChecker:
+
+webkit.WebKitNoUncountedMemberChecker
+
+Raw pointers and references to uncounted types can't be used as class members. 
Only ref-counted types are allowed.
+
+.. code-block:: cpp
+ struct RefCntbl {
+   void ref() {}
+   void deref() {}
+ };
+
+ struct Foo {
+   RefCntbl * ptr; // warn
+   RefCntbl & ptr; // warn
+   // ...
+ };
+
 .. _alpha-checkers:
 
 Experimental Checkers

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 2ba3881c6135..2d69d8f34420 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -1623,4 +1623,8 @@ let ParentPackage = WebKit in {
 def RefCntblBaseVirtualDtorChecker : Checker<"RefCntblBaseVirtualDtor">,
   HelpText<"Check for any ref-countable base class having virtual 
destructor.">,
   Documentation;
+
+def WebKitNoUncountedMemberChecker : Checker<"WebKitNoUncountedMemberChecker">,
+  HelpText<"Check for no uncounted member variables.">,
+  Documentation;
 } // end webkit

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
index 4f885fadf415..b3dc7a9f6321 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
@@ -121,6 +121,7 @@ add_clang_library(clangStaticAnalyzerCheckers
   VLASizeChecker.cpp
   ValistChecker.cpp
   VirtualCallChecker.cpp
+  WebKit/NoUncountedMembersChecker.cpp
   WebKit/PtrTypesSemantics.cpp
   WebKit/RefCntblBaseVirtualDtorChecker.cpp
 

diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h
index 4979b8ffc2b2..781a8d746001 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h
@@ -23,6 +23,14 @@ void printQuotedQualifiedName(llvm::raw_ostream ,
   Os << "'";
 }
 
+template 
+void printQuotedName(llvm::raw_ostream , const NamedDeclDerivedT ) {
+  Os << "'";
+  D->getNameForDiagnostic(Os, D->getASTContext().getPrintingPolicy(),
+  /*Qualified=*/false);
+  Os << "'";
+}
+
 } // namespace clang
 
 #endif

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
new file mode 100644
index ..89caf602a17e
--- /dev/null
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
@@ -0,0 +1,150 @@
+//===- NoUncountedMembersChecker.cpp -*- C++ 
-*-==//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#include "ASTUtils.h"
+#include "DiagOutputUtils.h"
+#include "PtrTypesSemantics.h"
+#include "clang/AST/CXXInheritance.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclCXX.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
+#include "clang/StaticAnalyzer/Core/Checker.h"
+#include "llvm/ADT/DenseSet.h"
+#include "llvm/Support/Casting.h"
+
+using namespace clang;
+using namespace ento;
+
+namespace {
+
+class NoUncountedMemberChecker
+: public Checker> {
+private:
+  BugType Bug;
+  mutable BugReporter *BR;
+

[clang] 54e91a3 - Reland "[Analyzer][WebKit] RefCntblBaseVirtualDtorChecker"

2020-05-21 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-05-21T16:41:00-07:00
New Revision: 54e91a3c701040d9d2e467bd483c197073b2c5e4

URL: 
https://github.com/llvm/llvm-project/commit/54e91a3c701040d9d2e467bd483c197073b2c5e4
DIFF: 
https://github.com/llvm/llvm-project/commit/54e91a3c701040d9d2e467bd483c197073b2c5e4.diff

LOG: Reland "[Analyzer][WebKit] RefCntblBaseVirtualDtorChecker"

This reverts commit 1108f5c737dbdab0277874a7e5b237491839c43a.

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp
clang/test/Analysis/Checkers/WebKit/mock-types.h

clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor-templates.cpp
clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 0bfb6456dc82..ea3f0e838b6a 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1374,6 +1374,33 @@ double freed, or use after freed. This check attempts to 
find such problems.
zx_handle_close(sb);
  }
 
+WebKit
+^^
+
+WebKit is an open-source web browser engine available for macOS, iOS and Linux.
+This section describes checkers that can find issues in WebKit codebase.
+
+Most of the checkers focus on memory management for which WebKit uses custom 
implementation of reference counted smartpointers.
+Checker are formulated in terms related to ref-counting:
+* *Ref-counted type* is either ``Ref`` or ``RefPtr``.
+* *Ref-countable type* is any type that implements ``ref()`` and ``deref()`` 
methods as ``RefPtr<>`` is a template (i. e. relies on duck typing).
+* *Uncounted type* is ref-countable but not ref-counted type.
+
+.. _webkit-RefCntblBaseVirtualDtor:
+
+webkit.RefCntblBaseVirtualDtor
+
+All uncounted types used as base classes must have a virtual destructor.
+
+Ref-counted types hold their ref-countable data by a raw pointer and allow 
implicit upcasting from ref-counted pointer to derived type to ref-counted 
pointer to base type. This might lead to an object of (dynamic) derived type 
being deleted via pointer to the base class type which C++ standard defines as 
UB in case the base class doesn't have virtual destructor ``[expr.delete]``.
+
+.. code-block:: cpp
+ struct RefCntblBase {
+   void ref() {}
+   void deref() {}
+ };
+
+ struct Derived : RefCntblBase { }; // warn
 
 .. _alpha-checkers:
 

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 93c4d964d772..f0ad8326929e 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -116,6 +116,9 @@ def NonDeterminismAlpha : Package<"nondeterminism">, 
ParentPackage;
 def Fuchsia : Package<"fuchsia">;
 def FuchsiaAlpha : Package<"fuchsia">, ParentPackage;
 
+def WebKit : Package<"webkit">;
+def WebKitAlpha : Package<"webkit">, ParentPackage;
+
 
//===--===//
 // Core Checkers.
 
//===--===//
@@ -1620,3 +1623,13 @@ def FuchsiaLockChecker : Checker<"Lock">,
 
 } // end fuchsia
 
+//===--===//
+// WebKit checkers.
+//===--===//
+
+let ParentPackage = WebKit in {
+
+def RefCntblBaseVirtualDtorChecker : Checker<"RefCntblBaseVirtualDtor">,
+  HelpText<"Check for any ref-countable base class having virtual 
destructor.">,
+  Documentation;
+} // end webkit

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
index bcf2dfdb8326..4f885fadf415 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
@@ -121,6 +121,8 @@ add_clang_library(clangStaticAnalyzerCheckers
   VLASizeChecker.cpp
   ValistChecker.cpp
   VirtualCallChecker.cpp
+  WebKit/PtrTypesSemantics.cpp
+  WebKit/RefCntblBaseVirtualDtorChecker.cpp
 
   LINK_LIBS
   clangAST

diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
new file mode 100644
index ..26d79cfcd9b5
--- /dev/null
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
@@ -0,0 +1,70 @@
+//===- ASTUtis.h 

[clang] f7c7e8a - [Analyzer][WebKit] RefCntblBaseVirtualDtorChecker

2020-05-21 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-05-21T11:54:49-07:00
New Revision: f7c7e8a523f56b0ed1b14c0756ba4e5d1ccb48d2

URL: 
https://github.com/llvm/llvm-project/commit/f7c7e8a523f56b0ed1b14c0756ba4e5d1ccb48d2
DIFF: 
https://github.com/llvm/llvm-project/commit/f7c7e8a523f56b0ed1b14c0756ba4e5d1ccb48d2.diff

LOG: [Analyzer][WebKit] RefCntblBaseVirtualDtorChecker

Differential Revision: https://reviews.llvm.org/D77177

Added: 
clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
clang/lib/StaticAnalyzer/Checkers/WebKit/DiagOutputUtils.h
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp
clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.h
clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp
clang/test/Analysis/Checkers/WebKit/mock-types.h

clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor-templates.cpp
clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp

Modified: 
clang/docs/analyzer/checkers.rst
clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt

Removed: 




diff  --git a/clang/docs/analyzer/checkers.rst 
b/clang/docs/analyzer/checkers.rst
index 0bfb6456dc82..79ba8fb18ba8 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -1374,6 +1374,33 @@ double freed, or use after freed. This check attempts to 
find such problems.
zx_handle_close(sb);
  }
 
+WebKit
+^^
+
+WebKit is an open-source web browser engine available for macOS, iOS and Linux.
+This section describes checkers that can find issues in WebKit codebase.
+
+Most of the checkers focus on memory management for which WebKit uses custom 
implementation of reference counted smartpointers.
+Checker are formulated in terms related to ref-counting:
+* *Ref-counted type* is either ``Ref`` or ``RefPtr``.
+* *Ref-countable type* is any type that implements ``ref()`` and ``deref()`` 
methods as ``RefPtr<>`` is a template (i. e. relies on duck typing).
+* *Uncounted type* is ref-countable but not ref-counted type.
+
+.. _webkit-WebKitRefCntblBaseVirtualDtor:
+
+webkit.WebKitRefCntblBaseVirtualDtor
+
+All uncounted types used as base classes must have a virtual destructor.
+
+Ref-counted types hold their ref-countable data by a raw pointer and allow 
implicit upcasting from ref-counted pointer to derived type to ref-counted 
pointer to base type. This might lead to an object of (dynamic) derived type 
being deleted via pointer to the base class type which C++ standard defines as 
UB in case the base class doesn't have virtual destructor ``[expr.delete]``.
+
+.. code-block:: cpp
+ struct RefCntblBase {
+   void ref() {}
+   void deref() {}
+ };
+
+ struct Derived : RefCntblBase { }; // warn
 
 .. _alpha-checkers:
 

diff  --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td 
b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 93c4d964d772..ec65afb30dd0 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -116,6 +116,9 @@ def NonDeterminismAlpha : Package<"nondeterminism">, 
ParentPackage;
 def Fuchsia : Package<"fuchsia">;
 def FuchsiaAlpha : Package<"fuchsia">, ParentPackage;
 
+def WebKit : Package<"webkit">;
+def WebKitAlpha : Package<"webkit">, ParentPackage;
+
 
//===--===//
 // Core Checkers.
 
//===--===//
@@ -1620,3 +1623,13 @@ def FuchsiaLockChecker : Checker<"Lock">,
 
 } // end fuchsia
 
+//===--===//
+// WebKit checkers.
+//===--===//
+
+let ParentPackage = WebKit in {
+
+def WebKitRefCntblBaseVirtualDtorChecker : 
Checker<"WebKitRefCntblBaseVirtualDtor">,
+  HelpText<"Check for any ref-countable base class having virtual 
destructor.">,
+  Documentation;
+} // end webkit

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt 
b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
index bcf2dfdb8326..4f885fadf415 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
+++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt
@@ -121,6 +121,8 @@ add_clang_library(clangStaticAnalyzerCheckers
   VLASizeChecker.cpp
   ValistChecker.cpp
   VirtualCallChecker.cpp
+  WebKit/PtrTypesSemantics.cpp
+  WebKit/RefCntblBaseVirtualDtorChecker.cpp
 
   LINK_LIBS
   clangAST

diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
new file mode 100644
index ..26d79cfcd9b5
--- /dev/null
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.h
@@ -0,0 +1,70 @@
+//===- ASTUtis.h 

[clang] 05eedf1 - [clang][VerifyDiagnosticConsumer] Support filename wildcards

2020-05-14 Thread Jan Korous via cfe-commits

Author: Alexandre Rames
Date: 2020-05-14T15:15:49-07:00
New Revision: 05eedf1f5b449ae42f5493576164b0f9a001646c

URL: 
https://github.com/llvm/llvm-project/commit/05eedf1f5b449ae42f5493576164b0f9a001646c
DIFF: 
https://github.com/llvm/llvm-project/commit/05eedf1f5b449ae42f5493576164b0f9a001646c.diff

LOG: [clang][VerifyDiagnosticConsumer] Support filename wildcards

Differential Revision: https://reviews.llvm.org/D72100

Added: 
clang/test/Frontend/verify-any-file.c
clang/test/Frontend/verify-any-file.h

Modified: 
clang/include/clang/Frontend/VerifyDiagnosticConsumer.h
clang/lib/Frontend/VerifyDiagnosticConsumer.cpp

Removed: 




diff  --git a/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h 
b/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h
index 7daebe612160..a97cd138d159 100644
--- a/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h
+++ b/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h
@@ -190,11 +190,10 @@ class VerifyDiagnosticConsumer: public DiagnosticConsumer,
   ///
   class Directive {
   public:
-static std::unique_ptr create(bool RegexKind,
- SourceLocation DirectiveLoc,
- SourceLocation DiagnosticLoc,
- bool MatchAnyLine, StringRef Text,
- unsigned Min, unsigned Max);
+static std::unique_ptr
+create(bool RegexKind, SourceLocation DirectiveLoc,
+   SourceLocation DiagnosticLoc, bool MatchAnyFileAndLine,
+   bool MatchAnyLine, StringRef Text, unsigned Min, unsigned Max);
 
   public:
 /// Constant representing n or more matches.
@@ -205,6 +204,7 @@ class VerifyDiagnosticConsumer: public DiagnosticConsumer,
 const std::string Text;
 unsigned Min, Max;
 bool MatchAnyLine;
+bool MatchAnyFileAndLine; // `MatchAnyFileAndLine` implies `MatchAnyLine`.
 
 Directive(const Directive &) = delete;
 Directive =(const Directive &) = delete;
@@ -219,9 +219,11 @@ class VerifyDiagnosticConsumer: public DiagnosticConsumer,
 
   protected:
 Directive(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc,
-  bool MatchAnyLine, StringRef Text, unsigned Min, unsigned Max)
-: DirectiveLoc(DirectiveLoc), DiagnosticLoc(DiagnosticLoc),
-  Text(Text), Min(Min), Max(Max), MatchAnyLine(MatchAnyLine) {
+  bool MatchAnyFileAndLine, bool MatchAnyLine, StringRef Text,
+  unsigned Min, unsigned Max)
+: DirectiveLoc(DirectiveLoc), DiagnosticLoc(DiagnosticLoc), Text(Text),
+  Min(Min), Max(Max), MatchAnyLine(MatchAnyLine || 
MatchAnyFileAndLine),
+  MatchAnyFileAndLine(MatchAnyFileAndLine) {
   assert(!DirectiveLoc.isInvalid() && "DirectiveLoc is invalid!");
   assert((!DiagnosticLoc.isInvalid() || MatchAnyLine) &&
  "DiagnosticLoc is invalid!");

diff  --git a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp 
b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
index 82c2af87706e..56e05242f7c9 100644
--- a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
+++ b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
@@ -89,9 +89,10 @@ namespace {
 class StandardDirective : public Directive {
 public:
   StandardDirective(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc,
-bool MatchAnyLine, StringRef Text, unsigned Min,
-unsigned Max)
-  : Directive(DirectiveLoc, DiagnosticLoc, MatchAnyLine, Text, Min, Max) {}
+bool MatchAnyFileAndLine, bool MatchAnyLine, StringRef 
Text,
+unsigned Min, unsigned Max)
+  : Directive(DirectiveLoc, DiagnosticLoc, MatchAnyFileAndLine,
+  MatchAnyLine, Text, Min, Max) {}
 
   bool isValid(std::string ) override {
 // all strings are considered valid; even empty ones
@@ -107,9 +108,10 @@ class StandardDirective : public Directive {
 class RegexDirective : public Directive {
 public:
   RegexDirective(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc,
- bool MatchAnyLine, StringRef Text, unsigned Min, unsigned Max,
- StringRef RegexStr)
-  : Directive(DirectiveLoc, DiagnosticLoc, MatchAnyLine, Text, Min, Max),
+ bool MatchAnyFileAndLine, bool MatchAnyLine, StringRef Text,
+ unsigned Min, unsigned Max, StringRef RegexStr)
+  : Directive(DirectiveLoc, DiagnosticLoc, MatchAnyFileAndLine,
+  MatchAnyLine, Text, Min, Max),
 Regex(RegexStr) {}
 
   bool isValid(std::string ) override {
@@ -294,11 +296,13 @@ struct UnattachedDirective {
 // Attach the specified directive to the line of code indicated by
 // \p ExpectedLoc.
 void attachDirective(DiagnosticsEngine , const UnattachedDirective ,
- SourceLocation ExpectedLoc, bool 

[clang] 02b3033 - [libclang] Remove duplicate dependency on LLVMSupport

2020-05-05 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-05-05T21:31:07-07:00
New Revision: 02b303321d3f0d3b2c69f68aa25560848dd61f98

URL: 
https://github.com/llvm/llvm-project/commit/02b303321d3f0d3b2c69f68aa25560848dd61f98
DIFF: 
https://github.com/llvm/llvm-project/commit/02b303321d3f0d3b2c69f68aa25560848dd61f98.diff

LOG: [libclang] Remove duplicate dependency on LLVMSupport

Differential Revision: https://reviews.llvm.org/D79451

Added: 


Modified: 
clang/tools/libclang/CMakeLists.txt

Removed: 




diff  --git a/clang/tools/libclang/CMakeLists.txt 
b/clang/tools/libclang/CMakeLists.txt
index f56771b8a594..4f0eec9e6016 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -44,7 +44,6 @@ set(LIBS
   clangSema
   clangSerialization
   clangTooling
-  LLVMSupport
 )
 
 if (CLANG_ENABLE_ARCMT)



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 14d89bf - [ASTMatchers] Fix isDerivedFrom for recursive templates

2020-04-15 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-04-15T12:49:01-07:00
New Revision: 14d89bfbe0b4f633689d829145fc9f0bfdb07b6e

URL: 
https://github.com/llvm/llvm-project/commit/14d89bfbe0b4f633689d829145fc9f0bfdb07b6e
DIFF: 
https://github.com/llvm/llvm-project/commit/14d89bfbe0b4f633689d829145fc9f0bfdb07b6e.diff

LOG: [ASTMatchers] Fix isDerivedFrom for recursive templates

Differential Revision: https://reviews.llvm.org/D77612

Added: 


Modified: 
clang/lib/ASTMatchers/ASTMatchFinder.cpp
clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

Removed: 




diff  --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp 
b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
index f1e1dae2d6b7..1b49067f0f9d 100644
--- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -916,9 +916,8 @@ bool MatchASTVisitor::classIsDerivedFrom(const 
CXXRecordDecl *Declaration,
 if (!ClassDecl)
   continue;
 if (ClassDecl == Declaration) {
-  // This can happen for recursive template definitions; if the
-  // current declaration did not match, we can safely return false.
-  return false;
+  // This can happen for recursive template definitions.
+  continue;
 }
 BoundNodesTreeBuilder Result(*Builder);
 if (Base.matches(*ClassDecl, this, )) {

diff  --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp 
b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
index 428879d0695c..05a77580a7ad 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
@@ -453,6 +453,20 @@ TEST(DeclarationMatcher, ClassIsDerived) {
   EXPECT_TRUE(notMatches("class X;", IsDerivedFromX));
   EXPECT_TRUE(notMatches("class Y;", IsDerivedFromX));
   EXPECT_TRUE(notMatches("", IsDerivedFromX));
+  EXPECT_TRUE(matches("class X {}; template class Y : Y, X {};",
+IsDerivedFromX));
+  EXPECT_TRUE(matches("class X {}; template class Y : X, Y {};",
+IsDerivedFromX));
+
+  DeclarationMatcher IsZDerivedFromX = cxxRecordDecl(hasName("Z"),
+isDerivedFrom("X"));
+  EXPECT_TRUE(
+matches(
+  "class X {};"
+  "template class Y : Y {};"
+  "template<> class Y<0> : X {};"
+  "class Z : Y<1> {};",
+  IsZDerivedFromX));
 
   DeclarationMatcher IsDirectlyDerivedFromX =
   cxxRecordDecl(isDirectlyDerivedFrom("X"));



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 5d67fb3 - [AST][NFCi] Make CXXBasePaths::Origin const

2020-03-19 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-03-19T07:54:05-07:00
New Revision: 5d67fb3eccc7884e52d5252379456b87b14ce58b

URL: 
https://github.com/llvm/llvm-project/commit/5d67fb3eccc7884e52d5252379456b87b14ce58b
DIFF: 
https://github.com/llvm/llvm-project/commit/5d67fb3eccc7884e52d5252379456b87b14ce58b.diff

LOG: [AST][NFCi] Make CXXBasePaths::Origin const

Added: 


Modified: 
clang/include/clang/AST/CXXInheritance.h

Removed: 




diff  --git a/clang/include/clang/AST/CXXInheritance.h 
b/clang/include/clang/AST/CXXInheritance.h
index f223c1f2f4f0..8b1bcb367b3b 100644
--- a/clang/include/clang/AST/CXXInheritance.h
+++ b/clang/include/clang/AST/CXXInheritance.h
@@ -119,7 +119,7 @@ class CXXBasePaths {
   friend class CXXRecordDecl;
 
   /// The type from which this search originated.
-  CXXRecordDecl *Origin = nullptr;
+  const CXXRecordDecl *Origin = nullptr;
 
   /// Paths - The actual set of paths that can be taken from the
   /// derived class to the same base class.
@@ -225,8 +225,8 @@ class CXXBasePaths {
 
   /// Retrieve the type from which this base-paths search
   /// began
-  CXXRecordDecl *getOrigin() const { return Origin; }
-  void setOrigin(CXXRecordDecl *Rec) { Origin = Rec; }
+  const CXXRecordDecl *getOrigin() const { return Origin; }
+  void setOrigin(const CXXRecordDecl *Rec) { Origin = Rec; }
 
   /// Clear the base-paths results.
   void clear();



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] 42b7827 - [clangd] Add json::Object->Value conversion workaround for older compilers

2020-03-13 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-03-13T14:01:33-07:00
New Revision: 42b782747ed78d1fc68a2b47d1057713189c

URL: 
https://github.com/llvm/llvm-project/commit/42b782747ed78d1fc68a2b47d1057713189c
DIFF: 
https://github.com/llvm/llvm-project/commit/42b782747ed78d1fc68a2b47d1057713189c.diff

LOG: [clangd] Add json::Object->Value conversion workaround for older compilers

The build was broken for clang-3.8 which we still support.

Added: 


Modified: 
clang-tools-extra/clangd/Protocol.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Protocol.cpp 
b/clang-tools-extra/clangd/Protocol.cpp
index 1975fc191aa1..56ddbfb446f7 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -407,7 +407,9 @@ llvm::json::Value toJSON(const WorkDoneProgressBegin ) {
 Result["cancellable"] = true;
   if (P.percentage)
 Result["percentage"] = 0;
-  return Result;
+
+  // FIXME: workaround for older gcc/clang
+  return std::move(Result);
 }
 
 llvm::json::Value toJSON(const WorkDoneProgressReport ) {
@@ -418,14 +420,16 @@ llvm::json::Value toJSON(const WorkDoneProgressReport ) 
{
 Result["message"] = *P.message;
   if (P.percentage)
 Result["percentage"] = *P.percentage;
-  return Result;
+  // FIXME: workaround for older gcc/clang
+  return std::move(Result);
 }
 
 llvm::json::Value toJSON(const WorkDoneProgressEnd ) {
   llvm::json::Object Result{{"kind", "end"}};
   if (P.message)
 Result["message"] = *P.message;
-  return Result;
+  // FIXME: workaround for older gcc/clang
+  return std::move(Result);
 }
 
 llvm::json::Value toJSON(const MessageType ) {
@@ -530,6 +534,7 @@ llvm::json::Value toJSON(const Diagnostic ) {
 Diag["source"] = D.source;
   if (D.relatedInformation)
 Diag["relatedInformation"] = *D.relatedInformation;
+  // FIXME: workaround for older gcc/clang
   return std::move(Diag);
 }
 
@@ -648,8 +653,8 @@ llvm::json::Value toJSON(const SymbolDetails ) {
   if (P.ID.hasValue())
 Result["id"] = P.ID.getValue().str();
 
-  // Older clang cannot compile 'return Result', even though it is legal.
-  return llvm::json::Value(std::move(Result));
+  // FIXME: workaround for older gcc/clang
+  return std::move(Result);
 }
 
 llvm::raw_ostream <<(llvm::raw_ostream , const SymbolDetails ) {
@@ -711,8 +716,8 @@ llvm::json::Value toJSON(const DocumentSymbol ) {
 Result["children"] = S.children;
   if (S.deprecated)
 Result["deprecated"] = true;
-  // Older gcc cannot compile 'return Result', even though it is legal.
-  return llvm::json::Value(std::move(Result));
+  // FIXME: workaround for older gcc/clang
+  return std::move(Result);
 }
 
 llvm::json::Value toJSON(const WorkspaceEdit ) {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 2f56789 - [clang][doxygen] Fix false -Wdocumentation warning for tag typedefs

2020-02-20 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-02-20T11:32:30-08:00
New Revision: 2f56789c8fe8edb57bc7a193592ecd35a393fe4a

URL: 
https://github.com/llvm/llvm-project/commit/2f56789c8fe8edb57bc7a193592ecd35a393fe4a
DIFF: 
https://github.com/llvm/llvm-project/commit/2f56789c8fe8edb57bc7a193592ecd35a393fe4a.diff

LOG: [clang][doxygen] Fix false -Wdocumentation warning for tag typedefs

For tag typedefs like this one:

/*!
@class Foo
*/
typedef class { } Foo;

clang -Wdocumentation gives:

warning: '@class' command should not be used in a comment attached to a
non-struct declaration [-Wdocumentation]

... while doxygen seems fine with it.

Differential Revision: https://reviews.llvm.org/D74746

Added: 
clang/test/Sema/warn-documentation-tag-typedef.cpp

Modified: 
clang/include/clang/AST/CommentSema.h
clang/lib/AST/CommentSema.cpp

Removed: 




diff  --git a/clang/include/clang/AST/CommentSema.h 
b/clang/include/clang/AST/CommentSema.h
index 307618fa5363..6dfe0f4920d0 100644
--- a/clang/include/clang/AST/CommentSema.h
+++ b/clang/include/clang/AST/CommentSema.h
@@ -217,6 +217,9 @@ class Sema {
   bool isTemplateOrSpecialization();
   bool isRecordLikeDecl();
   bool isClassOrStructDecl();
+  /// \return \c true if the declaration that this comment is attached to
+  /// declares either struct, class or tag typedef.
+  bool isClassOrStructOrTagTypedefDecl();
   bool isUnionDecl();
   bool isObjCInterfaceDecl();
   bool isObjCProtocolDecl();

diff  --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp
index 53c1832d1dd2..8102f0115cc7 100644
--- a/clang/lib/AST/CommentSema.cpp
+++ b/clang/lib/AST/CommentSema.cpp
@@ -12,6 +12,7 @@
 #include "clang/AST/CommentDiagnostic.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclTemplate.h"
+#include "clang/Basic/LLVM.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Lex/Preprocessor.h"
 #include "llvm/ADT/SmallString.h"
@@ -134,7 +135,9 @@ void Sema::checkContainerDeclVerbatimLine(const 
BlockCommandComment *Comment) {
   unsigned DiagSelect;
   switch (Comment->getCommandID()) {
 case CommandTraits::KCI_class:
-  DiagSelect = (!isClassOrStructDecl() && !isClassTemplateDecl()) ? 1 : 0;
+  DiagSelect =
+  (!isClassOrStructOrTagTypedefDecl() && !isClassTemplateDecl()) ? 1
+ : 0;
   // Allow @class command on @interface declarations.
   // FIXME. Currently, \class and @class are indistinguishable. So,
   // \class is also allowed on an @interface declaration
@@ -148,7 +151,7 @@ void Sema::checkContainerDeclVerbatimLine(const 
BlockCommandComment *Comment) {
   DiagSelect = !isObjCProtocolDecl() ? 3 : 0;
   break;
 case CommandTraits::KCI_struct:
-  DiagSelect = !isClassOrStructDecl() ? 4 : 0;
+  DiagSelect = !isClassOrStructOrTagTypedefDecl() ? 4 : 0;
   break;
 case CommandTraits::KCI_union:
   DiagSelect = !isUnionDecl() ? 5 : 0;
@@ -935,15 +938,50 @@ bool Sema::isUnionDecl() {
 return RD->isUnion();
   return false;
 }
+static bool isClassOrStructDeclImpl(const Decl *D) {
+  if (auto *record = dyn_cast_or_null(D))
+return !record->isUnion();
+
+  return false;
+}
 
 bool Sema::isClassOrStructDecl() {
   if (!ThisDeclInfo)
 return false;
   if (!ThisDeclInfo->IsFilled)
 inspectThisDecl();
-  return ThisDeclInfo->CurrentDecl &&
- isa(ThisDeclInfo->CurrentDecl) &&
- !isUnionDecl();
+
+  if (!ThisDeclInfo->CurrentDecl)
+return false;
+
+  return isClassOrStructDeclImpl(ThisDeclInfo->CurrentDecl);
+}
+
+bool Sema::isClassOrStructOrTagTypedefDecl() {
+  if (!ThisDeclInfo)
+return false;
+  if (!ThisDeclInfo->IsFilled)
+inspectThisDecl();
+
+  if (!ThisDeclInfo->CurrentDecl)
+return false;
+
+  if (isClassOrStructDeclImpl(ThisDeclInfo->CurrentDecl))
+return true;
+
+  if (auto *ThisTypedefDecl = 
dyn_cast(ThisDeclInfo->CurrentDecl)) {
+auto UnderlyingType = ThisTypedefDecl->getUnderlyingType();
+if (auto ThisElaboratedType = dyn_cast(UnderlyingType)) {
+  auto DesugaredType = ThisElaboratedType->desugar();
+  if (auto *DesugaredTypePtr = DesugaredType.getTypePtrOrNull()) {
+if (auto *ThisRecordType = dyn_cast(DesugaredTypePtr)) {
+  return isClassOrStructDeclImpl(ThisRecordType->getAsRecordDecl());
+}
+  }
+}
+  }
+
+  return false;
 }
 
 bool Sema::isClassTemplateDecl() {

diff  --git a/clang/test/Sema/warn-documentation-tag-typedef.cpp 
b/clang/test/Sema/warn-documentation-tag-typedef.cpp
new file mode 100644
index ..0954d6a9f48d
--- /dev/null
+++ b/clang/test/Sema/warn-documentation-tag-typedef.cpp
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -Wdocumentation -fsyntax-only %s 2>&1 | FileCheck 
-allow-empty %s
+
+/*!
+@class Foo
+*/
+typedef class { } Foo;
+// CHECK-NOT: warning:
+
+/*! 
+@struct Bar
+*/
+typedef struct { } Bar;

[clang-tools-extra] efcf643 - Reland "[clangd][test] Disable a particular testcase in FindExplicitReferencesTest when LLVM_ENABLE_EXPENSIVE_CHECKS""

2020-02-10 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-02-10T12:17:02-08:00
New Revision: efcf6430009cc5bcc2024ecec1c4e4bbb328d037

URL: 
https://github.com/llvm/llvm-project/commit/efcf6430009cc5bcc2024ecec1c4e4bbb328d037
DIFF: 
https://github.com/llvm/llvm-project/commit/efcf6430009cc5bcc2024ecec1c4e4bbb328d037.diff

LOG: Reland "[clangd][test] Disable a particular testcase in 
FindExplicitReferencesTest when LLVM_ENABLE_EXPENSIVE_CHECKS""

The test got re-enabled after d54d71b67e60 landed.

However it seems that the order is still not deterministic as it
currently passes with -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF but randomly
fails with expensive checks ON.

Added: 


Modified: 
clang-tools-extra/clangd/unittests/FindTargetTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp 
b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index 1d2ea0f1c0b2..be4b37c8f453 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -823,6 +823,10 @@ TEST_F(FindExplicitReferencesTest, All) {
 "1: targets = {vector}\n"
 "2: targets = {x}\n"},
// Handle UnresolvedLookupExpr.
+   // FIXME
+   // This case fails when expensive checks are enabled.
+   // Seems like the order of ns1::func and ns2::func isn't defined.
+   #ifndef EXPENSIVE_CHECKS
{R"cpp(
 namespace ns1 { void func(char*); }
 namespace ns2 { void func(int*); }
@@ -836,6 +840,7 @@ TEST_F(FindExplicitReferencesTest, All) {
 )cpp",
 "0: targets = {ns1::func, ns2::func}\n"
 "1: targets = {t}\n"},
+#endif
// Handle UnresolvedMemberExpr.
{R"cpp(
 struct X {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] 42b3c38 - [clangd][test] Disable a particular testcase in FindExplicitReferencesTest when LLVM_ENABLE_EXPENSIVE_CHECKS

2020-01-16 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-01-16T15:07:08-08:00
New Revision: 42b3c38903c9c80e129ce678db7f522967e91eeb

URL: 
https://github.com/llvm/llvm-project/commit/42b3c38903c9c80e129ce678db7f522967e91eeb
DIFF: 
https://github.com/llvm/llvm-project/commit/42b3c38903c9c80e129ce678db7f522967e91eeb.diff

LOG: [clangd][test] Disable a particular testcase in FindExplicitReferencesTest 
when LLVM_ENABLE_EXPENSIVE_CHECKS

The test is failing on our CI bots.
Seems like the order of results for one target is undefined.

(post-commit review)
Differential Revision: https://reviews.llvm.org/D72883

Added: 


Modified: 
clang-tools-extra/clangd/unittests/FindTargetTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp 
b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index 408ebe24e773..c96b3a572322 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -770,6 +770,10 @@ TEST_F(FindExplicitReferencesTest, All) {
 "1: targets = {vector}\n"
 "2: targets = {x}\n"},
// Handle UnresolvedLookupExpr.
+   // FIXME
+   // This case fails when expensive checks are enabled.
+   // Seems like the order of ns1::func and ns2::func isn't defined.
+   #ifndef EXPENSIVE_CHECKS
{R"cpp(
 namespace ns1 { void func(char*); }
 namespace ns2 { void func(int*); }
@@ -783,6 +787,7 @@ TEST_F(FindExplicitReferencesTest, All) {
 )cpp",
 "0: targets = {ns1::func, ns2::func}\n"
 "1: targets = {t}\n"},
+#endif
// Handle UnresolvedMemberExpr.
{R"cpp(
 struct X {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 986202f - [clang][test][NFC] Use more widely supported sanitizer for file dependency tests

2020-01-14 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-01-14T12:55:11-08:00
New Revision: 986202fad41529af8288aca54f2ff62d4c501d71

URL: 
https://github.com/llvm/llvm-project/commit/986202fad41529af8288aca54f2ff62d4c501d71
DIFF: 
https://github.com/llvm/llvm-project/commit/986202fad41529af8288aca54f2ff62d4c501d71.diff

LOG: [clang][test][NFC] Use more widely supported sanitizer for file dependency 
tests

The tests aren't concerned at all by the actual sanitizer - only by blacklist 
being reported as a dependency.
We're unfortunately limited by platform support for any particular sanitizer 
but we can at least use one that is widely supported.

Post-commit review:
https://reviews.llvm.org/D72729

Added: 

clang/test/Frontend/Inputs/resource_dir_with_sanitizer_blacklist/share/ubsan_blacklist.txt

Modified: 
clang/test/Frontend/dependency-gen.c

Removed: 

clang/test/Frontend/Inputs/resource_dir_with_cfi_blacklist/share/cfi_blacklist.txt



diff  --git 
a/clang/test/Frontend/Inputs/resource_dir_with_cfi_blacklist/share/cfi_blacklist.txt
 
b/clang/test/Frontend/Inputs/resource_dir_with_sanitizer_blacklist/share/ubsan_blacklist.txt
similarity index 100%
rename from 
clang/test/Frontend/Inputs/resource_dir_with_cfi_blacklist/share/cfi_blacklist.txt
rename to 
clang/test/Frontend/Inputs/resource_dir_with_sanitizer_blacklist/share/ubsan_blacklist.txt

diff  --git a/clang/test/Frontend/dependency-gen.c 
b/clang/test/Frontend/dependency-gen.c
index 1db9b04c1d9f..a42804d9f214 100644
--- a/clang/test/Frontend/dependency-gen.c
+++ b/clang/test/Frontend/dependency-gen.c
@@ -21,7 +21,7 @@
 // RUN: %clang -MD -MF - %s -fsyntax-only -I ./ | FileCheck 
-check-prefix=CHECK-SIX %s
 // CHECK-SIX: {{ }}x.h
 // RUN: echo "fun:foo" > %t.blacklist
-// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-vcall 
-flto -fvisibility=hidden -fsanitize-blacklist=%t.blacklist -I ./ | FileCheck 
-check-prefix=CHECK-SEVEN %s
+// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_sanitizer_blacklist 
-fsanitize=undefined -flto -fvisibility=hidden 
-fsanitize-blacklist=%t.blacklist -I ./ | FileCheck -check-prefix=CHECK-SEVEN %s
 // CHECK-SEVEN: .blacklist
 // CHECK-SEVEN: {{ }}x.h
 #ifndef INCLUDE_FLAG_TEST
@@ -30,17 +30,17 @@
 
 // RUN: echo "fun:foo" > %t.blacklist1
 // RUN: echo "fun:foo" > %t.blacklist2
-// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-vcall 
-flto -fvisibility=hidden -fsanitize-blacklist=%t.blacklist1 
-fsanitize-blacklist=%t.blacklist2 -I ./ | FileCheck 
-check-prefix=TWO-BLACK-LISTS %s
+// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_sanitizer_blacklist 
-fsanitize=undefined -flto -fvisibility=hidden 
-fsanitize-blacklist=%t.blacklist1 -fsanitize-blacklist=%t.blacklist2 -I ./ | 
FileCheck -check-prefix=TWO-BLACK-LISTS %s
 // TWO-BLACK-LISTS: dependency-gen.o:
 // TWO-BLACK-LISTS-DAG: blacklist1
 // TWO-BLACK-LISTS-DAG: blacklist2
 // TWO-BLACK-LISTS-DAG: x.h
 // TWO-BLACK-LISTS-DAG: dependency-gen.c
 
-// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-vcall 
-flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=USER-AND-SYS-DEPS %s
+// RUN: %clang -MD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_sanitizer_blacklist 
-fsanitize=undefined -flto -fvisibility=hidden -I ./ | FileCheck 
-check-prefix=USER-AND-SYS-DEPS %s
 // USER-AND-SYS-DEPS: dependency-gen.o:
-// USER-AND-SYS-DEPS-DAG: cfi_blacklist.txt
+// USER-AND-SYS-DEPS-DAG: ubsan_blacklist.txt
 
-// RUN: %clang -MMD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_cfi_blacklist -fsanitize=cfi-vcall 
-flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=ONLY-USER-DEPS %s
+// RUN: %clang -MMD -MF - %s -fsyntax-only 
-resource-dir=%S/Inputs/resource_dir_with_sanitizer_blacklist 
-fsanitize=undefined -flto -fvisibility=hidden -I ./ | FileCheck 
-check-prefix=ONLY-USER-DEPS %s
 // ONLY-USER-DEPS: dependency-gen.o:
-// NOT-ONLY-USER-DEPS: cfi_blacklist.txt
\ No newline at end of file
+// NOT-ONLY-USER-DEPS: ubsan_blacklist.txt



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] f28972f - [clang] Fix out-of-bounds memory access in ComputeLineNumbers

2020-01-10 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2020-01-10T11:22:41-08:00
New Revision: f28972facc1fce9589feab9803e3e8cfad01891c

URL: 
https://github.com/llvm/llvm-project/commit/f28972facc1fce9589feab9803e3e8cfad01891c
DIFF: 
https://github.com/llvm/llvm-project/commit/f28972facc1fce9589feab9803e3e8cfad01891c.diff

LOG: [clang] Fix out-of-bounds memory access in ComputeLineNumbers

Differential Revision: https://reviews.llvm.org/D72409

Added: 


Modified: 
clang/lib/Basic/SourceManager.cpp
clang/unittests/Basic/SourceManagerTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/SourceManager.cpp 
b/clang/lib/Basic/SourceManager.cpp
index 5f457d6f9e3d..73f2ae96d4a3 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -1250,23 +1250,18 @@ static void ComputeLineNumbers(DiagnosticsEngine , 
ContentCache *FI,
 
   const unsigned char *Buf = (const unsigned char *)Buffer->getBufferStart();
   const unsigned char *End = (const unsigned char *)Buffer->getBufferEnd();
+  const std::size_t BufLen = End - Buf;
   unsigned I = 0;
-  while (true) {
-// Skip over the contents of the line.
-while (Buf[I] != '\n' && Buf[I] != '\r' && Buf[I] != '\0')
-  ++I;
-
-if (Buf[I] == '\n' || Buf[I] == '\r') {
+  while (I < BufLen) {
+if (Buf[I] == '\n') {
+  LineOffsets.push_back(I + 1);
+} else if (Buf[I] == '\r') {
   // If this is \r\n, skip both characters.
-  if (Buf[I] == '\r' && Buf[I+1] == '\n')
+  if (I + 1 < BufLen && Buf[I + 1] == '\n')
 ++I;
-  ++I;
-  LineOffsets.push_back(I);
-} else {
-  // Otherwise, this is a NUL. If end of file, exit.
-  if (Buf+I == End) break;
-  ++I;
+  LineOffsets.push_back(I + 1);
 }
+++I;
   }
 
   // Copy the offsets into the FileInfo structure.

diff  --git a/clang/unittests/Basic/SourceManagerTest.cpp 
b/clang/unittests/Basic/SourceManagerTest.cpp
index 465f7a06f71a..07c72e27f9fe 100644
--- a/clang/unittests/Basic/SourceManagerTest.cpp
+++ b/clang/unittests/Basic/SourceManagerTest.cpp
@@ -20,7 +20,9 @@
 #include "clang/Lex/PreprocessorOptions.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/Config/llvm-config.h"
+#include "llvm/Support/Process.h"
 #include "gtest/gtest.h"
+#include 
 
 using namespace clang;
 
@@ -241,6 +243,28 @@ TEST_F(SourceManagerTest, getInvalidBOM) {
 "UTF-32 (LE)");
 }
 
+// Regression test - there was an out of bound access for buffers not 
terminated by zero.
+TEST_F(SourceManagerTest, getLineNumber) {
+  const unsigned pageSize = llvm::sys::Process::getPageSizeEstimate();
+  std::unique_ptr source(new char[pageSize]);
+  for(unsigned i = 0; i < pageSize; ++i) {
+source[i] = 'a';
+  }
+
+  std::unique_ptr Buf =
+  llvm::MemoryBuffer::getMemBuffer(
+llvm::MemoryBufferRef(
+  llvm::StringRef(source.get(), 3), "whatever"
+),
+false
+  );
+
+  FileID mainFileID = SourceMgr.createFileID(std::move(Buf));
+  SourceMgr.setMainFileID(mainFileID);
+
+  ASSERT_NO_FATAL_FAILURE(SourceMgr.getLineNumber(mainFileID, 1, nullptr));
+}
+
 #if defined(LLVM_ON_UNIX)
 
 TEST_F(SourceManagerTest, getMacroArgExpandedLocation) {



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a dependency in cc1

2019-11-08 Thread Jan Korous via cfe-commits
Yes, sorry, I messed up when relanding the patch. Seems fixed now.

> On Nov 8, 2019, at 2:24 PM, Voss, Matthew  wrote:
> 
> Hi Jan,
> 
> Thanks for looking at this. I'm seeing new errors on the PS4 windows bot.
> 
> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/57835
> 
> Thanks,
> Matthew
> 
>> -Original Message-
>> From: jkor...@apple.com 
>> Sent: Friday, November 8, 2019 2:01 PM
>> To: Voss, Matthew 
>> Cc: Jan Korous ; cfe-commits@lists.llvm.org;
>> jeremy.morse.l...@gmail.com
>> Subject: Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>> dependency in cc1
>> 
>> Hi Matthew,
>> 
>> You were absolutely right - my bad!
>> 
>> I relanded the patches plus a fix.
>> 
>> 555c6be041d [clang] Fix -fsanitize-system-blacklist processing in cc1
>> 
>> Thanks,
>> 
>> Jan
>> 
>>> On Nov 8, 2019, at 11:00 AM, Voss, Matthew 
>> wrote:
>>> 
>>> Hi Jan,
>>> 
>>>> Are you sure it is this commit?
>>> I narrowed it down to your commit on my local machine. Let me know if it
>> doesn't repro on your end, though.
>>> 
>>> Thanks,
>>> Matthew
>>> 
>>> 
>>>> -Original Message-
>>>> From: jkor...@apple.com 
>>>> Sent: Friday, November 8, 2019 10:55 AM
>>>> To: Voss, Matthew 
>>>> Cc: Jan Korous ; cfe-commits@lists.llvm.org;
>>>> jeremy.morse.l...@gmail.com
>>>> Subject: Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as
>>>> a dependency in cc1
>>>> 
>>>> Hi Matthew,
>>>> 
>>>> Are you sure it is this commit? It is definitely possible yet sounds
>>>> a bit unlikely that my patch would cause linker errors.
>>>> 
>>>> Anyway, I am going to reproduce on a linux box.
>>>> 
>>>> Thanks.
>>>> 
>>>> Jan
>>>> 
>>>>> On Nov 7, 2019, at 4:50 PM, Voss, Matthew 
>> wrote:
>>>>> 
>>>>> Hi Jan,
>>>>> 
>>>>> It looks like this commit is causing DFSAN failures on the sanitizer
>>>> bots and our internal CI. Could you take a look?
>>>>> 
>>>>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/2431
>>>>> 2/ steps/64-bit%20check-dfsan/logs/stdio
>>>>> 
>>>>> Thanks,
>>>>> Matthew
>>>>> 
>>>>>> -Original Message-
>>>>>> From: cfe-commits  On Behalf Of
>>>>>> Jan Korous via cfe-commits
>>>>>> Sent: Thursday, November 7, 2019 2:07 PM
>>>>>> To: cfe-commits@lists.llvm.org
>>>>>> Subject: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>>>>>> dependency in cc1
>>>>>> 
>>>>>> 
>>>>>> Author: Jan Korous
>>>>>> Date: 2019-11-07T14:06:43-08:00
>>>>>> New Revision: 03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>>>>>> 
>>>>>> URL: https://github.com/llvm/llvm-
>>>>>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>>>>>> DIFF: https://github.com/llvm/llvm-
>>>>>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4.diff
>>>>>> 
>>>>>> LOG: [clang] Report sanitizer blacklist as a dependency in cc1
>>>>>> 
>>>>>> Previously these were reported from the driver which blocked
>>>>>> clang-scan- deps from getting the full set of dependencies from cc1
>>>> commands.
>>>>>> 
>>>>>> Also the default sanitizer blacklist that is added in driver was
>>>>>> never reported as a dependency. I introduced
>>>>>> -fsanitize-system-blacklist cc1 option to keep track of which
>>>>>> blacklists were user-specified and which were added by driver and
>>>>>> clang -MD now also reports system blacklists as dependencies.
>>>>>> 
>>>>>> Differential Revision: https://reviews.llvm.org/D69290
>>>>>> 
>>>>>> Added:
>>>>>> 
>>>>>> 
>>>>>> Modified:
>>>>>>  clang/include/clang/Driver/Options.td
>>>>>>  clang/include/clang/Driver/SanitizerArgs.h
>>>>>>  clang/lib/Driver/SanitizerArgs.cpp
>&

[clang] d52cff8 - Revert "Reland "[clang] Report sanitizer blacklist as a dependency in cc1""

2019-11-08 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-11-08T14:28:30-08:00
New Revision: d52cff88367df4d6bc57949d5e8a61aec0c301e8

URL: 
https://github.com/llvm/llvm-project/commit/d52cff88367df4d6bc57949d5e8a61aec0c301e8
DIFF: 
https://github.com/llvm/llvm-project/commit/d52cff88367df4d6bc57949d5e8a61aec0c301e8.diff

LOG: Revert "Reland "[clang] Report sanitizer blacklist as a dependency in cc1""

This reverts commit cae4a28864f4e8a55920e2b94e2cd43617902dec.

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/include/clang/Driver/SanitizerArgs.h
clang/lib/Driver/SanitizerArgs.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/Driver/fsanitize-blacklist.c
clang/test/Frontend/dependency-gen.c

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index dcd2976a97f2..c2e30a16b8da 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-sanitize=">, 
Group,
 def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">,
   Group,
   HelpText<"Path to blacklist file for sanitizers">;
+def fsanitize_system_blacklist : Joined<["-"], "fsanitize-system-blacklist=">,
+  HelpText<"Path to system blacklist file for sanitizers">,
+  Flags<[CC1Option]>;
 def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
  Group,
  HelpText<"Don't use blacklist file for 
sanitizers">;

diff  --git a/clang/include/clang/Driver/SanitizerArgs.h 
b/clang/include/clang/Driver/SanitizerArgs.h
index c37499e0f201..0aebf8cb225d 100644
--- a/clang/include/clang/Driver/SanitizerArgs.h
+++ b/clang/include/clang/Driver/SanitizerArgs.h
@@ -25,8 +25,8 @@ class SanitizerArgs {
   SanitizerSet RecoverableSanitizers;
   SanitizerSet TrapSanitizers;
 
-  std::vector BlacklistFiles;
-  std::vector ExtraDeps;
+  std::vector UserBlacklistFiles;
+  std::vector SystemBlacklistFiles;
   int CoverageFeatures = 0;
   int MsanTrackOrigins = 0;
   bool MsanUseAfterDtor = true;

diff  --git a/clang/lib/Driver/SanitizerArgs.cpp 
b/clang/lib/Driver/SanitizerArgs.cpp
index cc6c5e6ef438..8937197c253c 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -557,29 +557,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain ,
 
   // Setup blacklist files.
   // Add default blacklist from resource directory.
-  addDefaultBlacklists(D, Kinds, BlacklistFiles);
+  addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
   // Parse -f(no-)sanitize-blacklist options.
   for (const auto *Arg : Args) {
 if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
   Arg->claim();
   std::string BLPath = Arg->getValue();
   if (llvm::sys::fs::exists(BLPath)) {
-BlacklistFiles.push_back(BLPath);
-ExtraDeps.push_back(BLPath);
+UserBlacklistFiles.push_back(BLPath);
   } else {
 D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
   }
 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) {
   Arg->claim();
-  BlacklistFiles.clear();
-  ExtraDeps.clear();
+  UserBlacklistFiles.clear();
+  SystemBlacklistFiles.clear();
 }
   }
   // Validate blacklists format.
   {
 std::string BLError;
 std::unique_ptr SCL(
-llvm::SpecialCaseList::create(BlacklistFiles, BLError));
+llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
+if (!SCL.get())
+  D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
+  }
+  {
+std::string BLError;
+std::unique_ptr SCL(
+llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
 if (!SCL.get())
   D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
   }
@@ -952,15 +958,15 @@ void SanitizerArgs::addArgs(const ToolChain , const 
llvm::opt::ArgList ,
 CmdArgs.push_back(
 Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
 
-  for (const auto  : BlacklistFiles) {
+  for (const auto  : UserBlacklistFiles) {
 SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
 BlacklistOpt += BLPath;
 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
-  for (const auto  : ExtraDeps) {
-SmallString<64> ExtraDepOpt("-fdepfile-entry=");
-ExtraDepOpt += Dep;
-CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt));
+  for (const auto  : SystemBlacklistFiles) {
+SmallString<64> BlacklistOpt("-fsanitize-system-blacklist=");
+BlacklistOpt += BLPath;
+CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
 
   if (MsanTrackOrigins)

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 9bd7c5651185..26221a898185 100644
--- 

Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a dependency in cc1

2019-11-08 Thread Jan Korous via cfe-commits
Hi Matthew,

You were absolutely right - my bad!

I relanded the patches plus a fix.

555c6be041d [clang] Fix -fsanitize-system-blacklist processing in cc1

Thanks,

Jan

> On Nov 8, 2019, at 11:00 AM, Voss, Matthew  wrote:
> 
> Hi Jan,
> 
>> Are you sure it is this commit?
> I narrowed it down to your commit on my local machine. Let me know if it 
> doesn't repro on your end, though.
> 
> Thanks,
> Matthew
> 
> 
>> -Original Message-
>> From: jkor...@apple.com 
>> Sent: Friday, November 8, 2019 10:55 AM
>> To: Voss, Matthew 
>> Cc: Jan Korous ; cfe-commits@lists.llvm.org;
>> jeremy.morse.l...@gmail.com
>> Subject: Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>> dependency in cc1
>> 
>> Hi Matthew,
>> 
>> Are you sure it is this commit? It is definitely possible yet sounds a bit
>> unlikely that my patch would cause linker errors.
>> 
>> Anyway, I am going to reproduce on a linux box.
>> 
>> Thanks.
>> 
>> Jan
>> 
>>> On Nov 7, 2019, at 4:50 PM, Voss, Matthew  wrote:
>>> 
>>> Hi Jan,
>>> 
>>> It looks like this commit is causing DFSAN failures on the sanitizer
>> bots and our internal CI. Could you take a look?
>>> 
>>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/24312/
>>> steps/64-bit%20check-dfsan/logs/stdio
>>> 
>>> Thanks,
>>> Matthew
>>> 
>>>> -Original Message-
>>>> From: cfe-commits  On Behalf Of
>>>> Jan Korous via cfe-commits
>>>> Sent: Thursday, November 7, 2019 2:07 PM
>>>> To: cfe-commits@lists.llvm.org
>>>> Subject: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>>>> dependency in cc1
>>>> 
>>>> 
>>>> Author: Jan Korous
>>>> Date: 2019-11-07T14:06:43-08:00
>>>> New Revision: 03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>>>> 
>>>> URL: https://github.com/llvm/llvm-
>>>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>>>> DIFF: https://github.com/llvm/llvm-
>>>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4.diff
>>>> 
>>>> LOG: [clang] Report sanitizer blacklist as a dependency in cc1
>>>> 
>>>> Previously these were reported from the driver which blocked
>>>> clang-scan- deps from getting the full set of dependencies from cc1
>> commands.
>>>> 
>>>> Also the default sanitizer blacklist that is added in driver was
>>>> never reported as a dependency. I introduced
>>>> -fsanitize-system-blacklist cc1 option to keep track of which
>>>> blacklists were user-specified and which were added by driver and
>>>> clang -MD now also reports system blacklists as dependencies.
>>>> 
>>>> Differential Revision: https://reviews.llvm.org/D69290
>>>> 
>>>> Added:
>>>> 
>>>> 
>>>> Modified:
>>>>   clang/include/clang/Driver/Options.td
>>>>   clang/include/clang/Driver/SanitizerArgs.h
>>>>   clang/lib/Driver/SanitizerArgs.cpp
>>>>   clang/lib/Frontend/CompilerInvocation.cpp
>>>>   clang/test/Driver/fsanitize-blacklist.c
>>>>   clang/test/Frontend/dependency-gen.c
>>>> 
>>>> Removed:
>>>> 
>>>> 
>>>> 
>>>> #
>>>> #
>>>> ##
>>>> diff  --git a/clang/include/clang/Driver/Options.td
>>>> b/clang/include/clang/Driver/Options.td
>>>> index dcd2976a97f2..c2e30a16b8da 100644
>>>> --- a/clang/include/clang/Driver/Options.td
>>>> +++ b/clang/include/clang/Driver/Options.td
>>>> @@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-
>>>> sanitize=">, Group,  def fsanitize_blacklist :
>>>> Joined<["- "], "fsanitize-blacklist=">,
>>>>  Group,
>>>>  HelpText<"Path to blacklist file for
>>>> sanitizers">;
>>>> +def fsanitize_system_blacklist : Joined<["-"],
>>>> +"fsanitize-system-blacklist=">,
>>>> +  HelpText<"Path to system blacklist file for sanitizers">,
>>>> +  Flags<[CC1Option]>;
>>>> def fno_sanitize_blacklist : Flag<["-"], "fno-sanitiz

[clang] cae4a28 - Reland "[clang] Report sanitizer blacklist as a dependency in cc1"

2019-11-08 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-11-08T13:55:00-08:00
New Revision: cae4a28864f4e8a55920e2b94e2cd43617902dec

URL: 
https://github.com/llvm/llvm-project/commit/cae4a28864f4e8a55920e2b94e2cd43617902dec
DIFF: 
https://github.com/llvm/llvm-project/commit/cae4a28864f4e8a55920e2b94e2cd43617902dec.diff

LOG: Reland "[clang] Report sanitizer blacklist as a dependency in cc1"

This reverts commit 3182027282c59c51d5080d83365917fccd695854.

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/include/clang/Driver/SanitizerArgs.h
clang/lib/Driver/SanitizerArgs.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/Driver/fsanitize-blacklist.c
clang/test/Frontend/dependency-gen.c

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index c2e30a16b8da..dcd2976a97f2 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -979,9 +979,6 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-sanitize=">, 
Group,
 def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">,
   Group,
   HelpText<"Path to blacklist file for sanitizers">;
-def fsanitize_system_blacklist : Joined<["-"], "fsanitize-system-blacklist=">,
-  HelpText<"Path to system blacklist file for sanitizers">,
-  Flags<[CC1Option]>;
 def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
  Group,
  HelpText<"Don't use blacklist file for 
sanitizers">;

diff  --git a/clang/include/clang/Driver/SanitizerArgs.h 
b/clang/include/clang/Driver/SanitizerArgs.h
index 0aebf8cb225d..c37499e0f201 100644
--- a/clang/include/clang/Driver/SanitizerArgs.h
+++ b/clang/include/clang/Driver/SanitizerArgs.h
@@ -25,8 +25,8 @@ class SanitizerArgs {
   SanitizerSet RecoverableSanitizers;
   SanitizerSet TrapSanitizers;
 
-  std::vector UserBlacklistFiles;
-  std::vector SystemBlacklistFiles;
+  std::vector BlacklistFiles;
+  std::vector ExtraDeps;
   int CoverageFeatures = 0;
   int MsanTrackOrigins = 0;
   bool MsanUseAfterDtor = true;

diff  --git a/clang/lib/Driver/SanitizerArgs.cpp 
b/clang/lib/Driver/SanitizerArgs.cpp
index 8937197c253c..cc6c5e6ef438 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -557,35 +557,29 @@ SanitizerArgs::SanitizerArgs(const ToolChain ,
 
   // Setup blacklist files.
   // Add default blacklist from resource directory.
-  addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
+  addDefaultBlacklists(D, Kinds, BlacklistFiles);
   // Parse -f(no-)sanitize-blacklist options.
   for (const auto *Arg : Args) {
 if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
   Arg->claim();
   std::string BLPath = Arg->getValue();
   if (llvm::sys::fs::exists(BLPath)) {
-UserBlacklistFiles.push_back(BLPath);
+BlacklistFiles.push_back(BLPath);
+ExtraDeps.push_back(BLPath);
   } else {
 D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
   }
 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) {
   Arg->claim();
-  UserBlacklistFiles.clear();
-  SystemBlacklistFiles.clear();
+  BlacklistFiles.clear();
+  ExtraDeps.clear();
 }
   }
   // Validate blacklists format.
   {
 std::string BLError;
 std::unique_ptr SCL(
-llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
-if (!SCL.get())
-  D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
-  }
-  {
-std::string BLError;
-std::unique_ptr SCL(
-llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
+llvm::SpecialCaseList::create(BlacklistFiles, BLError));
 if (!SCL.get())
   D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
   }
@@ -958,15 +952,15 @@ void SanitizerArgs::addArgs(const ToolChain , const 
llvm::opt::ArgList ,
 CmdArgs.push_back(
 Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
 
-  for (const auto  : UserBlacklistFiles) {
+  for (const auto  : BlacklistFiles) {
 SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
 BlacklistOpt += BLPath;
 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
-  for (const auto  : SystemBlacklistFiles) {
-SmallString<64> BlacklistOpt("-fsanitize-system-blacklist=");
-BlacklistOpt += BLPath;
-CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
+  for (const auto  : ExtraDeps) {
+SmallString<64> ExtraDepOpt("-fdepfile-entry=");
+ExtraDepOpt += Dep;
+CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt));
   }
 
   if (MsanTrackOrigins)

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 17fd4ce7752b..195a29d71187 100644
--- 

[clang] 6d28588 - Reland "[clang] Report sanitizer blacklist as a dependency in cc1"

2019-11-08 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-11-08T13:54:28-08:00
New Revision: 6d28588cc0f223cc06fc103493b1f16cb7e579f8

URL: 
https://github.com/llvm/llvm-project/commit/6d28588cc0f223cc06fc103493b1f16cb7e579f8
DIFF: 
https://github.com/llvm/llvm-project/commit/6d28588cc0f223cc06fc103493b1f16cb7e579f8.diff

LOG: Reland "[clang] Report sanitizer blacklist as a dependency in cc1"

This reverts commit 9b8413ac6e56e7a6e0ba884773d13bcf9414bd43.

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/include/clang/Driver/SanitizerArgs.h
clang/lib/Driver/SanitizerArgs.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/Driver/fsanitize-blacklist.c
clang/test/Frontend/dependency-gen.c

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index dcd2976a97f2..c2e30a16b8da 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-sanitize=">, 
Group,
 def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">,
   Group,
   HelpText<"Path to blacklist file for sanitizers">;
+def fsanitize_system_blacklist : Joined<["-"], "fsanitize-system-blacklist=">,
+  HelpText<"Path to system blacklist file for sanitizers">,
+  Flags<[CC1Option]>;
 def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
  Group,
  HelpText<"Don't use blacklist file for 
sanitizers">;

diff  --git a/clang/include/clang/Driver/SanitizerArgs.h 
b/clang/include/clang/Driver/SanitizerArgs.h
index c37499e0f201..0aebf8cb225d 100644
--- a/clang/include/clang/Driver/SanitizerArgs.h
+++ b/clang/include/clang/Driver/SanitizerArgs.h
@@ -25,8 +25,8 @@ class SanitizerArgs {
   SanitizerSet RecoverableSanitizers;
   SanitizerSet TrapSanitizers;
 
-  std::vector BlacklistFiles;
-  std::vector ExtraDeps;
+  std::vector UserBlacklistFiles;
+  std::vector SystemBlacklistFiles;
   int CoverageFeatures = 0;
   int MsanTrackOrigins = 0;
   bool MsanUseAfterDtor = true;

diff  --git a/clang/lib/Driver/SanitizerArgs.cpp 
b/clang/lib/Driver/SanitizerArgs.cpp
index cc6c5e6ef438..8937197c253c 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -557,29 +557,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain ,
 
   // Setup blacklist files.
   // Add default blacklist from resource directory.
-  addDefaultBlacklists(D, Kinds, BlacklistFiles);
+  addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
   // Parse -f(no-)sanitize-blacklist options.
   for (const auto *Arg : Args) {
 if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
   Arg->claim();
   std::string BLPath = Arg->getValue();
   if (llvm::sys::fs::exists(BLPath)) {
-BlacklistFiles.push_back(BLPath);
-ExtraDeps.push_back(BLPath);
+UserBlacklistFiles.push_back(BLPath);
   } else {
 D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
   }
 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) {
   Arg->claim();
-  BlacklistFiles.clear();
-  ExtraDeps.clear();
+  UserBlacklistFiles.clear();
+  SystemBlacklistFiles.clear();
 }
   }
   // Validate blacklists format.
   {
 std::string BLError;
 std::unique_ptr SCL(
-llvm::SpecialCaseList::create(BlacklistFiles, BLError));
+llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
+if (!SCL.get())
+  D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
+  }
+  {
+std::string BLError;
+std::unique_ptr SCL(
+llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
 if (!SCL.get())
   D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
   }
@@ -952,15 +958,15 @@ void SanitizerArgs::addArgs(const ToolChain , const 
llvm::opt::ArgList ,
 CmdArgs.push_back(
 Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
 
-  for (const auto  : BlacklistFiles) {
+  for (const auto  : UserBlacklistFiles) {
 SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
 BlacklistOpt += BLPath;
 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
-  for (const auto  : ExtraDeps) {
-SmallString<64> ExtraDepOpt("-fdepfile-entry=");
-ExtraDepOpt += Dep;
-CmdArgs.push_back(Args.MakeArgString(ExtraDepOpt));
+  for (const auto  : SystemBlacklistFiles) {
+SmallString<64> BlacklistOpt("-fsanitize-system-blacklist=");
+BlacklistOpt += BLPath;
+CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
 
   if (MsanTrackOrigins)

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 195a29d71187..17fd4ce7752b 100644
--- 

[clang] 590f279 - [clang] Add VFS support for sanitizers' blacklists

2019-11-08 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-11-08T10:58:50-08:00
New Revision: 590f279c456bbde632eca8ef89a85c478f15a249

URL: 
https://github.com/llvm/llvm-project/commit/590f279c456bbde632eca8ef89a85c478f15a249
DIFF: 
https://github.com/llvm/llvm-project/commit/590f279c456bbde632eca8ef89a85c478f15a249.diff

LOG: [clang] Add VFS support for sanitizers' blacklists

Differential Revision: https://reviews.llvm.org/D69648

Added: 
clang/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
clang/test/CodeGen/ubsan-blacklist-vfs.c

Modified: 
clang/include/clang/Basic/SanitizerSpecialCaseList.h
clang/lib/Basic/SanitizerBlacklist.cpp
clang/lib/Basic/SanitizerSpecialCaseList.cpp
llvm/include/llvm/Support/SpecialCaseList.h
llvm/lib/Support/SpecialCaseList.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/SanitizerSpecialCaseList.h 
b/clang/include/clang/Basic/SanitizerSpecialCaseList.h
index fb0db32c442f..88d31a6cbcce 100644
--- a/clang/include/clang/Basic/SanitizerSpecialCaseList.h
+++ b/clang/include/clang/Basic/SanitizerSpecialCaseList.h
@@ -17,6 +17,7 @@
 #include "clang/Basic/Sanitizers.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/SpecialCaseList.h"
+#include "llvm/Support/VirtualFileSystem.h"
 #include 
 
 namespace clang {
@@ -24,10 +25,12 @@ namespace clang {
 class SanitizerSpecialCaseList : public llvm::SpecialCaseList {
 public:
   static std::unique_ptr
-  create(const std::vector , std::string );
+  create(const std::vector , llvm::vfs::FileSystem ,
+ std::string );
 
   static std::unique_ptr
-  createOrDie(const std::vector );
+  createOrDie(const std::vector ,
+  llvm::vfs::FileSystem );
 
   // Query blacklisted entries if any bit in Mask matches the entry's section.
   bool inSection(SanitizerMask Mask, StringRef Prefix, StringRef Query,

diff  --git a/clang/lib/Basic/SanitizerBlacklist.cpp 
b/clang/lib/Basic/SanitizerBlacklist.cpp
index aec35c7d9864..4f71349350fd 100644
--- a/clang/lib/Basic/SanitizerBlacklist.cpp
+++ b/clang/lib/Basic/SanitizerBlacklist.cpp
@@ -16,7 +16,9 @@ using namespace clang;
 
 SanitizerBlacklist::SanitizerBlacklist(
 const std::vector , SourceManager )
-: SSCL(SanitizerSpecialCaseList::createOrDie(BlacklistPaths)), SM(SM) {}
+: SSCL(SanitizerSpecialCaseList::createOrDie(
+  BlacklistPaths, SM.getFileManager().getVirtualFileSystem())),
+  SM(SM) {}
 
 bool SanitizerBlacklist::isBlacklistedGlobal(SanitizerMask Mask,
  StringRef GlobalName,

diff  --git a/clang/lib/Basic/SanitizerSpecialCaseList.cpp 
b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
index 5fb0f9660b15..7a820d4bef86 100644
--- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp
+++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
@@ -16,10 +16,11 @@ using namespace clang;
 
 std::unique_ptr
 SanitizerSpecialCaseList::create(const std::vector ,
+ llvm::vfs::FileSystem ,
  std::string ) {
   std::unique_ptr SSCL(
   new SanitizerSpecialCaseList());
-  if (SSCL->createInternal(Paths, Error)) {
+  if (SSCL->createInternal(Paths, Error, VFS)) {
 SSCL->createSanitizerSections();
 return SSCL;
   }
@@ -27,9 +28,10 @@ SanitizerSpecialCaseList::create(const 
std::vector ,
 }
 
 std::unique_ptr
-SanitizerSpecialCaseList::createOrDie(const std::vector ) {
+SanitizerSpecialCaseList::createOrDie(const std::vector ,
+  llvm::vfs::FileSystem ) {
   std::string Error;
-  if (auto SSCL = create(Paths, Error))
+  if (auto SSCL = create(Paths, VFS, Error))
 return SSCL;
   llvm::report_fatal_error(Error);
 }

diff  --git a/clang/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml 
b/clang/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
new file mode 100644
index ..df2b22189769
--- /dev/null
+++ b/clang/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
@@ -0,0 +1,15 @@
+{
+  'version': 0,
+  'roots': [
+{ 'name': '@DIR@', 'type': 'directory',
+  'contents': [
+{ 'name': 'only-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@REAL_FILE@'
+},
+{ 'name': 'invalid-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@NONEXISTENT_FILE@'
+}
+  ]
+}
+  ]
+}

diff  --git a/clang/test/CodeGen/ubsan-blacklist-vfs.c 
b/clang/test/CodeGen/ubsan-blacklist-vfs.c
new file mode 100644
index ..0647cbf7a57b
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-blacklist-vfs.c
@@ -0,0 +1,36 @@
+// Verify ubsan doesn't emit checks for blacklisted functions and files
+// RUN: echo "fun:hash" > %t-func.blacklist
+// RUN: echo "src:%s" | sed -e 's/\\//g' > %t-file.blacklist
+
+// RUN: rm -f %t-vfsoverlay.yaml
+// RUN: rm -f %t-nonexistent.blacklist
+// RUN: sed -e "s|@DIR@|%/T|g" 

Re: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a dependency in cc1

2019-11-08 Thread Jan Korous via cfe-commits
Hi Matthew,

Are you sure it is this commit? It is definitely possible yet sounds a bit 
unlikely that my patch would cause linker errors.

Anyway, I am going to reproduce on a linux box.

Thanks.

Jan

> On Nov 7, 2019, at 4:50 PM, Voss, Matthew  wrote:
> 
> Hi Jan,
> 
> It looks like this commit is causing DFSAN failures on the sanitizer bots and 
> our internal CI. Could you take a look?
> 
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/24312/steps/64-bit%20check-dfsan/logs/stdio
> 
> Thanks,
> Matthew
> 
>> -Original Message-----
>> From: cfe-commits  On Behalf Of Jan
>> Korous via cfe-commits
>> Sent: Thursday, November 7, 2019 2:07 PM
>> To: cfe-commits@lists.llvm.org
>> Subject: [clang] 03b84e4 - [clang] Report sanitizer blacklist as a
>> dependency in cc1
>> 
>> 
>> Author: Jan Korous
>> Date: 2019-11-07T14:06:43-08:00
>> New Revision: 03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>> 
>> URL: https://github.com/llvm/llvm-
>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
>> DIFF: https://github.com/llvm/llvm-
>> project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4.diff
>> 
>> LOG: [clang] Report sanitizer blacklist as a dependency in cc1
>> 
>> Previously these were reported from the driver which blocked clang-scan-
>> deps from getting the full set of dependencies from cc1 commands.
>> 
>> Also the default sanitizer blacklist that is added in driver was never
>> reported as a dependency. I introduced -fsanitize-system-blacklist cc1
>> option to keep track of which blacklists were user-specified and which
>> were added by driver and clang -MD now also reports system blacklists as
>> dependencies.
>> 
>> Differential Revision: https://reviews.llvm.org/D69290
>> 
>> Added:
>> 
>> 
>> Modified:
>>clang/include/clang/Driver/Options.td
>>clang/include/clang/Driver/SanitizerArgs.h
>>clang/lib/Driver/SanitizerArgs.cpp
>>clang/lib/Frontend/CompilerInvocation.cpp
>>clang/test/Driver/fsanitize-blacklist.c
>>clang/test/Frontend/dependency-gen.c
>> 
>> Removed:
>> 
>> 
>> 
>> ##
>> ##
>> diff  --git a/clang/include/clang/Driver/Options.td
>> b/clang/include/clang/Driver/Options.td
>> index dcd2976a97f2..c2e30a16b8da 100644
>> --- a/clang/include/clang/Driver/Options.td
>> +++ b/clang/include/clang/Driver/Options.td
>> @@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-
>> sanitize=">, Group,  def fsanitize_blacklist : Joined<["-
>> "], "fsanitize-blacklist=">,
>>   Group,
>>   HelpText<"Path to blacklist file for
>> sanitizers">;
>> +def fsanitize_system_blacklist : Joined<["-"],
>> +"fsanitize-system-blacklist=">,
>> +  HelpText<"Path to system blacklist file for sanitizers">,
>> +  Flags<[CC1Option]>;
>> def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
>>  Group,
>>  HelpText<"Don't use blacklist file for
>> sanitizers">;
>> 
>> diff  --git a/clang/include/clang/Driver/SanitizerArgs.h
>> b/clang/include/clang/Driver/SanitizerArgs.h
>> index c37499e0f201..0aebf8cb225d 100644
>> --- a/clang/include/clang/Driver/SanitizerArgs.h
>> +++ b/clang/include/clang/Driver/SanitizerArgs.h
>> @@ -25,8 +25,8 @@ class SanitizerArgs {
>>   SanitizerSet RecoverableSanitizers;
>>   SanitizerSet TrapSanitizers;
>> 
>> -  std::vector BlacklistFiles;
>> -  std::vector ExtraDeps;
>> +  std::vector UserBlacklistFiles;
>> + std::vector SystemBlacklistFiles;
>>   int CoverageFeatures = 0;
>>   int MsanTrackOrigins = 0;
>>   bool MsanUseAfterDtor = true;
>> 
>> diff  --git a/clang/lib/Driver/SanitizerArgs.cpp
>> b/clang/lib/Driver/SanitizerArgs.cpp
>> index cc6c5e6ef438..8937197c253c 100644
>> --- a/clang/lib/Driver/SanitizerArgs.cpp
>> +++ b/clang/lib/Driver/SanitizerArgs.cpp
>> @@ -557,29 +557,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain ,
>> 
>>   // Setup blacklist files.
>>   // Add default blacklist from resource directory.
>> -  addDefaultBlacklists(D, Kinds, BlacklistFiles);
>> +  addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
>>   // Parse -f(no-)sanitize-blacklist options.
>>

[clang] 03b84e4 - [clang] Report sanitizer blacklist as a dependency in cc1

2019-11-07 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-11-07T14:06:43-08:00
New Revision: 03b84e4f6d0e1c04f22d69cc445f36e1f713beb4

URL: 
https://github.com/llvm/llvm-project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4
DIFF: 
https://github.com/llvm/llvm-project/commit/03b84e4f6d0e1c04f22d69cc445f36e1f713beb4.diff

LOG: [clang] Report sanitizer blacklist as a dependency in cc1

Previously these were reported from the driver which blocked clang-scan-deps 
from getting the full set of dependencies from cc1 commands.

Also the default sanitizer blacklist that is added in driver was never reported 
as a dependency. I introduced -fsanitize-system-blacklist cc1 option to keep 
track of which blacklists were user-specified and which were added by driver 
and clang -MD now also reports system blacklists as dependencies.

Differential Revision: https://reviews.llvm.org/D69290

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/include/clang/Driver/SanitizerArgs.h
clang/lib/Driver/SanitizerArgs.cpp
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/Driver/fsanitize-blacklist.c
clang/test/Frontend/dependency-gen.c

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index dcd2976a97f2..c2e30a16b8da 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -979,6 +979,9 @@ def fno_sanitize_EQ : CommaJoined<["-"], "fno-sanitize=">, 
Group,
 def fsanitize_blacklist : Joined<["-"], "fsanitize-blacklist=">,
   Group,
   HelpText<"Path to blacklist file for sanitizers">;
+def fsanitize_system_blacklist : Joined<["-"], "fsanitize-system-blacklist=">,
+  HelpText<"Path to system blacklist file for sanitizers">,
+  Flags<[CC1Option]>;
 def fno_sanitize_blacklist : Flag<["-"], "fno-sanitize-blacklist">,
  Group,
  HelpText<"Don't use blacklist file for 
sanitizers">;

diff  --git a/clang/include/clang/Driver/SanitizerArgs.h 
b/clang/include/clang/Driver/SanitizerArgs.h
index c37499e0f201..0aebf8cb225d 100644
--- a/clang/include/clang/Driver/SanitizerArgs.h
+++ b/clang/include/clang/Driver/SanitizerArgs.h
@@ -25,8 +25,8 @@ class SanitizerArgs {
   SanitizerSet RecoverableSanitizers;
   SanitizerSet TrapSanitizers;
 
-  std::vector BlacklistFiles;
-  std::vector ExtraDeps;
+  std::vector UserBlacklistFiles;
+  std::vector SystemBlacklistFiles;
   int CoverageFeatures = 0;
   int MsanTrackOrigins = 0;
   bool MsanUseAfterDtor = true;

diff  --git a/clang/lib/Driver/SanitizerArgs.cpp 
b/clang/lib/Driver/SanitizerArgs.cpp
index cc6c5e6ef438..8937197c253c 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -557,29 +557,35 @@ SanitizerArgs::SanitizerArgs(const ToolChain ,
 
   // Setup blacklist files.
   // Add default blacklist from resource directory.
-  addDefaultBlacklists(D, Kinds, BlacklistFiles);
+  addDefaultBlacklists(D, Kinds, SystemBlacklistFiles);
   // Parse -f(no-)sanitize-blacklist options.
   for (const auto *Arg : Args) {
 if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) {
   Arg->claim();
   std::string BLPath = Arg->getValue();
   if (llvm::sys::fs::exists(BLPath)) {
-BlacklistFiles.push_back(BLPath);
-ExtraDeps.push_back(BLPath);
+UserBlacklistFiles.push_back(BLPath);
   } else {
 D.Diag(clang::diag::err_drv_no_such_file) << BLPath;
   }
 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) {
   Arg->claim();
-  BlacklistFiles.clear();
-  ExtraDeps.clear();
+  UserBlacklistFiles.clear();
+  SystemBlacklistFiles.clear();
 }
   }
   // Validate blacklists format.
   {
 std::string BLError;
 std::unique_ptr SCL(
-llvm::SpecialCaseList::create(BlacklistFiles, BLError));
+llvm::SpecialCaseList::create(UserBlacklistFiles, BLError));
+if (!SCL.get())
+  D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
+  }
+  {
+std::string BLError;
+std::unique_ptr SCL(
+llvm::SpecialCaseList::create(SystemBlacklistFiles, BLError));
 if (!SCL.get())
   D.Diag(clang::diag::err_drv_malformed_sanitizer_blacklist) << BLError;
   }
@@ -952,15 +958,15 @@ void SanitizerArgs::addArgs(const ToolChain , const 
llvm::opt::ArgList ,
 CmdArgs.push_back(
 Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
 
-  for (const auto  : BlacklistFiles) {
+  for (const auto  : UserBlacklistFiles) {
 SmallString<64> BlacklistOpt("-fsanitize-blacklist=");
 BlacklistOpt += BLPath;
 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
   }
-  for (const auto  : ExtraDeps) {
-SmallString<64> ExtraDepOpt("-fdepfile-entry=");
-ExtraDepOpt += Dep;
-

[clang] - b26e9e2 - Revert "[static analyzer] Define __clang_analyzer__ macro in driver"

2019-10-16 Thread Jan Korous via cfe-commits

Author: Jan Korous
Date: 2019-09-24T03:21:22Z
New Revision: b26e9e2a8f1865711c4e9b9aa7be712589169b3d

URL: 
https://github.com/llvm/llvm-project/commit/b26e9e2a8f1865711c4e9b9aa7be712589169b3d
DIFF: 
https://github.com/llvm/llvm-project/commit/b26e9e2a8f1865711c4e9b9aa7be712589169b3d.diff

LOG: Revert "[static analyzer] Define __clang_analyzer__ macro in driver"

This reverts commit fbd13570b0d5f92ef2cf6bcfe7cc2f6178500187.

llvm-svn: 372687

Added: 
   

Modified: 
   clang/lib/Driver/ToolChains/Clang.cpp
   clang/lib/Frontend/InitPreprocessor.cpp
   clang/test/Analysis/misc-ps.m

Removed: 
   clang/test/Analysis/misc-driver.c




diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 6453af73b0a5..aa17efbee32b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -3896,10 +3896,8 @@ void Clang::ConstructJob(Compilation , const JobAction 
,
   if (Args.hasArg(options::OPT_municode))
 CmdArgs.push_back("-DUNICODE");
 
-  if (isa(JA)) {
+  if (isa(JA))
 RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
-CmdArgs.push_back("-D__clang_analyzer__");
-  }
 
   // Enable compatilibily mode to avoid analyzer-config related errors.
   // Since we can't access frontend flags through hasArg, let's manually 
iterate

diff  --git a/clang/lib/Frontend/InitPreprocessor.cpp 
b/clang/lib/Frontend/InitPreprocessor.cpp
index 9da37e0a446d..95d9f62c6087 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -990,6 +990,10 @@ static void InitializePredefinedMacros(const TargetInfo 
,
   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
 Builder.defineMacro("__SSP_ALL__", "3");
 
+  // Define a macro that exists only when using the static analyzer.
+  if (FEOpts.ProgramAction == frontend::RunAnalysis)
+Builder.defineMacro("__clang_analyzer__");
+
   if (LangOpts.FastRelaxedMath)
 Builder.defineMacro("__FAST_RELAXED_MATH__");
 

diff  --git a/clang/test/Analysis/misc-driver.c 
b/clang/test/Analysis/misc-driver.c
deleted file mode 100644
index f9e7fe373d3c..
--- a/clang/test/Analysis/misc-driver.c
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: %clang --analyze %s
-
-#ifndef __clang_analyzer__
-#error __clang_analyzer__ not defined
-#endif

diff  --git a/clang/test/Analysis/misc-ps.m b/clang/test/Analysis/misc-ps.m
index 1cfd2eb1caf2..9a75cfd87b62 100644
--- a/clang/test/Analysis/misc-ps.m
+++ b/clang/test/Analysis/misc-ps.m
@@ -2,6 +2,10 @@
 // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 
+#ifndef __clang_analyzer__
+#error __clang_analyzer__ not defined
+#endif
+
 typedef struct objc_ivar *Ivar;
 typedef struct objc_selector *SEL;
 typedef signed char BOOL;



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374929 - Fix Driver/working-directory.c test

2019-10-15 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Oct 15 11:04:18 2019
New Revision: 374929

URL: http://llvm.org/viewvc/llvm-project?rev=374929=rev
Log:
Fix Driver/working-directory.c test

Accidentally committed debug print.

Modified:
cfe/trunk/test/Driver/working-directory.c

Modified: cfe/trunk/test/Driver/working-directory.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/working-directory.c?rev=374929=374928=374929=diff
==
--- cfe/trunk/test/Driver/working-directory.c (original)
+++ cfe/trunk/test/Driver/working-directory.c Tue Oct 15 11:04:18 2019
@@ -1,7 +1,6 @@
 // RUN: %clang -### -coverage -working-directory /no/such/dir/ input 2>&1 | 
FileCheck %s
 // RUN: %clang -### -coverage -working-directory %p/Inputs no_such_file.cpp -c 
2>&1 | FileCheck %s --check-prefix=CHECK_NO_FILE
 // RUN: %clang -### -coverage -working-directory %p/Inputs pchfile.cpp -c 2>&1 
| FileCheck %s --check-prefix=CHECK_WORKS
-// RUN: fail please
 
 // CHECK: unable to set working directory: /no/such/dir/
 


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374926 - Reland [Driver] Fix -working-directory issues

2019-10-15 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Oct 15 10:51:59 2019
New Revision: 374926

URL: http://llvm.org/viewvc/llvm-project?rev=374926=rev
Log:
Reland [Driver] Fix -working-directory issues

Don't change the default VFS in Driver, update tests & reland.

This reverts commit 999f8a7416f8edc54ef92e715fd23c532bcc74d4.

Modified:
cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
cfe/trunk/lib/Driver/Driver.cpp
cfe/trunk/lib/Driver/ToolChains/Clang.cpp
cfe/trunk/test/Driver/gen-cdb-fragment.c
cfe/trunk/test/Driver/working-directory.c

Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=374926=374925=374926=diff
==
--- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue Oct 15 10:51:59 
2019
@@ -91,6 +91,8 @@ def err_no_external_assembler : Error<
   "there is no external assembler that can be used on this platform">;
 def err_drv_unable_to_remove_file : Error<
   "unable to remove file: %0">;
+def err_drv_unable_to_set_working_directory : Error <
+  "unable to set working directory: %0">;
 def err_drv_command_failure : Error<
   "unable to execute command: %0">;
 def err_drv_invalid_darwin_version : Error<

Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=374926=374925=374926=diff
==
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Tue Oct 15 10:51:59 2019
@@ -1012,6 +1012,11 @@ Compilation *Driver::BuildCompilation(Ar
 }
   }
 
+  // Check for working directory option before accessing any files
+  if (Arg *WD = Args.getLastArg(options::OPT_working_directory))
+if (VFS->setCurrentWorkingDirectory(WD->getValue()))
+  Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue();
+
   // FIXME: This stuff needs to go into the Compilation, not the driver.
   bool CCCPrintPhases;
 
@@ -1993,20 +1998,11 @@ bool Driver::DiagnoseInputExistence(cons
   if (Value == "-")
 return true;
 
-  SmallString<64> Path(Value);
-  if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) {
-if (!llvm::sys::path::is_absolute(Path)) {
-  SmallString<64> Directory(WorkDir->getValue());
-  llvm::sys::path::append(Directory, Value);
-  Path.assign(Directory);
-}
-  }
-
-  if (getVFS().exists(Path))
+  if (getVFS().exists(Value))
 return true;
 
   if (IsCLMode()) {
-if (!llvm::sys::path::is_absolute(Twine(Path)) &&
+if (!llvm::sys::path::is_absolute(Twine(Value)) &&
 llvm::sys::Process::FindInEnvPath("LIB", Value))
   return true;
 
@@ -2032,12 +2028,12 @@ bool Driver::DiagnoseInputExistence(cons
 if (getOpts().findNearest(Value, Nearest, IncludedFlagsBitmask,
   ExcludedFlagsBitmask) <= 1) {
   Diag(clang::diag::err_drv_no_such_file_with_suggestion)
-  << Path << Nearest;
+  << Value << Nearest;
   return false;
 }
   }
 
-  Diag(clang::diag::err_drv_no_such_file) << Path;
+  Diag(clang::diag::err_drv_no_such_file) << Value;
   return false;
 }
 

Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=374926=374925=374926=diff
==
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue Oct 15 10:51:59 2019
@@ -519,16 +519,15 @@ getFramePointerKind(const ArgList ,
 }
 
 /// Add a CC1 option to specify the debug compilation directory.
-static void addDebugCompDirArg(const ArgList , ArgStringList ) {
+static void addDebugCompDirArg(const ArgList , ArgStringList ,
+   const llvm::vfs::FileSystem ) {
   if (Arg *A = Args.getLastArg(options::OPT_fdebug_compilation_dir)) {
 CmdArgs.push_back("-fdebug-compilation-dir");
 CmdArgs.push_back(A->getValue());
-  } else {
-SmallString<128> cwd;
-if (!llvm::sys::fs::current_path(cwd)) {
-  CmdArgs.push_back("-fdebug-compilation-dir");
-  CmdArgs.push_back(Args.MakeArgString(cwd));
-}
+  } else if (llvm::ErrorOr CWD =
+ VFS.getCurrentWorkingDirectory()) {
+CmdArgs.push_back("-fdebug-compilation-dir");
+CmdArgs.push_back(Args.MakeArgString(*CWD));
   }
 }
 
@@ -808,13 +807,8 @@ static void addPGOAndCoverageFlags(const
 else
   OutputFilename = llvm::sys::path::filename(Output.getBaseInput());
 SmallString<128> CoverageFilename = OutputFilename;
-if (llvm::sys::path::is_relative(CoverageFilename)) {
-  SmallString<128> Pwd;
-  if (!llvm::sys::fs::current_path(Pwd)) {
-llvm::sys::path::append(Pwd, 

r374821 - [NFC] Fix ClangScanDeps/static-analyzer.c test on Windows

2019-10-14 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct 14 14:06:11 2019
New Revision: 374821

URL: http://llvm.org/viewvc/llvm-project?rev=374821=rev
Log:
[NFC] Fix ClangScanDeps/static-analyzer.c test on Windows

Follow-up to c5d14b5c6fa

Modified:
cfe/trunk/test/ClangScanDeps/static-analyzer.c

Modified: cfe/trunk/test/ClangScanDeps/static-analyzer.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/static-analyzer.c?rev=374821=374820=374821=diff
==
--- cfe/trunk/test/ClangScanDeps/static-analyzer.c (original)
+++ cfe/trunk/test/ClangScanDeps/static-analyzer.c Mon Oct 14 14:06:11 2019
@@ -1,12 +1,12 @@
 // RUN: rm -rf %t.dir
-// RUN: rm -rf %t.dir/cdb.json
+// RUN: rm -rf %t-cdb.json
 // RUN: mkdir -p %t.dir
 // RUN: cp %s %t.dir/static-analyzer.c
 // RUN: mkdir %t.dir/Inputs
 // RUN: cp %S/Inputs/header.h %t.dir/Inputs/analyze_header_input.h
-// RUN: sed -e "s|DIR|%t.dir|g" %S/Inputs/static-analyzer-cdb.json > 
%t.dir/cdb.json
+// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/static-analyzer-cdb.json > 
%t-cdb.json
 //
-// RUN: clang-scan-deps -compilation-database %t.dir/cdb.json -j 1 | FileCheck 
%s
+// RUN: clang-scan-deps -compilation-database %t-cdb.json -j 1 | FileCheck %s
 
 #ifdef __clang_analyzer__
 #include "Inputs/analyze_header_input.h"


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374815 - [clang-scan-deps] Support for clang --analyze in clang-scan-deps

2019-10-14 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct 14 13:15:01 2019
New Revision: 374815

URL: http://llvm.org/viewvc/llvm-project?rev=374815=rev
Log:
[clang-scan-deps] Support for clang --analyze in clang-scan-deps

The goal is to have 100% fidelity in clang-scan-deps behavior when
--analyze is present in compilation command.

At the same time I don't want to break clang-tidy which expects
__static_analyzer__ macro defined as built-in.

I introduce new cc1 options (-setup-static-analyzer) that controls
the macro definition and is conditionally set in driver.

Differential Revision: https://reviews.llvm.org/D68093

Added:
cfe/trunk/test/Analysis/preprocessor-setup.c
cfe/trunk/test/ClangScanDeps/Inputs/static-analyzer-cdb.json
cfe/trunk/test/ClangScanDeps/static-analyzer.c
Modified:
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/Lex/PreprocessorOptions.h
cfe/trunk/lib/Driver/ToolChains/Clang.cpp
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/Frontend/InitPreprocessor.cpp

Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=374815=374814=374815=diff
==
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Oct 14 13:15:01 2019
@@ -846,6 +846,8 @@ def preamble_bytes_EQ : Joined<["-"], "p
"covering the first N bytes of the main file">;
 def detailed_preprocessing_record : Flag<["-"], 
"detailed-preprocessing-record">,
   HelpText<"include a detailed record of preprocessing actions">;
+def setup_static_analyzer : Flag<["-"], "setup-static-analyzer">,
+  HelpText<"Set up preprocessor for static analyzer (done automatically when 
static analyzer is run).">;
 
 
//===--===//
 // OpenCL Options

Modified: cfe/trunk/include/clang/Lex/PreprocessorOptions.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PreprocessorOptions.h?rev=374815=374814=374815=diff
==
--- cfe/trunk/include/clang/Lex/PreprocessorOptions.h (original)
+++ cfe/trunk/include/clang/Lex/PreprocessorOptions.h Mon Oct 14 13:15:01 2019
@@ -181,6 +181,9 @@ public:
   ExcludedPreprocessorDirectiveSkipMapping
   *ExcludedConditionalDirectiveSkipMappings = nullptr;
 
+  /// Set up preprocessor for RunAnalysis action.
+  bool SetUpStaticAnalyzer = false;
+
 public:
   PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {}
 

Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=374815=374814=374815=diff
==
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Mon Oct 14 13:15:01 2019
@@ -3803,6 +3803,10 @@ void Clang::ConstructJob(Compilation ,
   if (isa(JA))
 RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
 
+  if (isa(JA) ||
+  (isa(JA) && Args.hasArg(options::OPT__analyze)))
+CmdArgs.push_back("-setup-static-analyzer");
+
   // Enable compatilibily mode to avoid analyzer-config related errors.
   // Since we can't access frontend flags through hasArg, let's manually 
iterate
   // through them.

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=374815=374814=374815=diff
==
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Oct 14 13:15:01 2019
@@ -3349,6 +3349,8 @@ static void ParsePreprocessorArgs(Prepro
   // "editor placeholder in source file" error in PP only mode.
   if (isStrictlyPreprocessorAction(Action))
 Opts.LexEditorPlaceholders = false;
+
+  Opts.SetUpStaticAnalyzer = Args.hasArg(OPT_setup_static_analyzer);
 }
 
 static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions ,

Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=374815=374814=374815=diff
==
--- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
+++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Oct 14 13:15:01 2019
@@ -560,6 +560,7 @@ static void InitializeCPlusPlusFeatureTe
 static void InitializePredefinedMacros(const TargetInfo ,
const LangOptions ,
const FrontendOptions ,
+   const PreprocessorOptions ,
MacroBuilder ) {
   // 

[clang-tools-extra] r374815 - [clang-scan-deps] Support for clang --analyze in clang-scan-deps

2019-10-14 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct 14 13:15:01 2019
New Revision: 374815

URL: http://llvm.org/viewvc/llvm-project?rev=374815=rev
Log:
[clang-scan-deps] Support for clang --analyze in clang-scan-deps

The goal is to have 100% fidelity in clang-scan-deps behavior when
--analyze is present in compilation command.

At the same time I don't want to break clang-tidy which expects
__static_analyzer__ macro defined as built-in.

I introduce new cc1 options (-setup-static-analyzer) that controls
the macro definition and is conditionally set in driver.

Differential Revision: https://reviews.llvm.org/D68093

Modified:
clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp

Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=374815=374814=374815=diff
==
--- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Mon Oct 14 13:15:01 2019
@@ -33,6 +33,7 @@
 #include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/Preprocessor.h"
+#include "clang/Lex/PreprocessorOptions.h"
 #include "clang/Rewrite/Frontend/FixItRewriter.h"
 #include "clang/Rewrite/Frontend/FrontendActions.h"
 #include "clang/Tooling/Core/Diagnostic.h"
@@ -539,10 +540,8 @@ runClangTidy(clang::tidy::ClangTidyConte
FileManager *Files,
std::shared_ptr PCHContainerOps,
DiagnosticConsumer *DiagConsumer) override {
-  // Explicitly set ProgramAction to RunAnalysis to make the preprocessor
-  // define __clang_analyzer__ macro. The frontend analyzer action will not
-  // be called here.
-  Invocation->getFrontendOpts().ProgramAction = frontend::RunAnalysis;
+  // Explicitly ask to define __clang_analyzer__ macro.
+  Invocation->getPreprocessorOpts().SetUpStaticAnalyzer = true;
   return FrontendActionFactory::runInvocation(
   Invocation, Files, PCHContainerOps, DiagConsumer);
 }


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: r374006 - Reland 'Add VFS support for sanitizers' blacklist'

2019-10-09 Thread Jan Korous via cfe-commits
Ok, no worries. I understand the reason for the revert and will rewrite the 
patch.


> On Oct 9, 2019, at 7:19 AM, Ilya Biryukov  wrote:
> 
> Fair enough, sorry about that.
> 
> Nevertheless, I wanted to re-raise concerns about the approach taken in the 
> patch. It seems to assume invariants about VFS that don't necessarily hold 
> for filesystems outside those tested in upstream LLVM.
> PTAL at the original patch - calling `getRealPath` on the FS and later using 
> real-file-system with the results assumes the passed VFS is an overlay over 
> the physical filesystem.
> A simple unit-test with InMemoryFS would break right away, so the failing 
> case is pretty obvious.
> 
> There's an obvious alternative: just pass VFS to SanitizerBlacklist (in fact, 
> it already gets a source manager, which has a link to the VFS) and use it for 
> file accesses.
> I would suggest doing another round of review on this, happy to take part too.
> 
> On Wed, Oct 9, 2019 at 3:55 PM Nico Weber  <mailto:tha...@chromium.org>> wrote:
> FWIW reverting a patch for it breaking some internal system seems like poor 
> form to me. It's really hard to reland in that case. Please make a reduced 
> repro next time.
> 
> On Wed, Oct 9, 2019 at 5:38 AM Ilya Biryukov via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Reverted in r374151.
> 
> On Wed, Oct 9, 2019 at 11:03 AM Ilya Biryukov  <mailto:ibiryu...@google.com>> wrote:
> Hi Jan,
> 
> This patch seems to assume VFS will only re-map some paths, but still point 
> into the physical filesystem.
> This may not be the case, e.g. in unit tests.
> 
> This also manages to break some of our internal clang-tidy integrations for 
> obscure reasons.
> 
> Can we instead just pass VFS instance to the SanitizerBlacklist and use 
> relative paths?
> 
> We might also need to revert the patch to unbreak our release, sorry about 
> the inconvenience.
> 
> On Tue, Oct 8, 2019 at 3:11 AM Jan Korous via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: jkorous
> Date: Mon Oct  7 18:13:17 2019
> New Revision: 374006
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=374006=rev 
> <http://llvm.org/viewvc/llvm-project?rev=374006=rev>
> Log:
> Reland 'Add VFS support for sanitizers' blacklist'
> 
> The original patch broke the test for Windows.
> Trying to fix as per Reid's suggestions outlined here:
> https://reviews.llvm.org/rC371663 <https://reviews.llvm.org/rC371663>
> 
> Differential Revision: https://reviews.llvm.org/D67742 
> <https://reviews.llvm.org/D67742>
> 
> Added:
> cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
> Modified:
> cfe/trunk/lib/AST/ASTContext.cpp
> cfe/trunk/test/CodeGen/ubsan-blacklist.c
> 
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=374006=374005=374006=diff
>  
> <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=374006=374005=374006=diff>
> ==
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Mon Oct  7 18:13:17 2019
> @@ -72,6 +72,7 @@
>  #include "llvm/ADT/PointerUnion.h"
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/SmallPtrSet.h"
> +#include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/StringRef.h"
> @@ -81,6 +82,7 @@
>  #include "llvm/Support/Compiler.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/Support/MathExtras.h"
> +#include "llvm/Support/VirtualFileSystem.h"
>  #include "llvm/Support/raw_ostream.h"
>  #include 
>  #include 
> @@ -826,6 +828,18 @@ static bool isAddrSpaceMapManglingEnable
>llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
>  }
> 
> +static std::vector
> +getRealPaths(llvm::vfs::FileSystem , llvm::ArrayRef Paths) {
> +  std::vector Result;
> +  llvm::SmallString<128> Buffer;
> +  for (const auto  : Paths) {
> +if (std::error_code EC = VFS.getRealPath(File, Buffer))
> +  llvm::report_fatal_error("can't open file '" + File + "': " + 
> EC.message());
> +Result.push_back(Buffer.str());
> +  }
> +  return Result;
> +}
> +
>  ASTContext::ASTContext(LangOptions , SourceManager ,
> IdentifierTable , SelectorTable ,
> Builtin::Context )
> @@ -

Re: r374098 - [NFC] Attempt to make ubsan-blacklist-vfs test pass on Windows

2019-10-08 Thread Jan Korous via cfe-commits
Thanks for the fix!

> On Oct 8, 2019, at 12:06 PM, Nico Weber  wrote:
> 
> Almost: http://45.33.8.238/win/78/step_6.txt 
> <http://45.33.8.238/win/78/step_6.txt>
> 
> C:\src\llvm-project\clang\test\CodeGen\ubsan-blacklist-vfs.c:11:25: error: 
> INVALID-MAPPED-FILE: expected string not found in input
> // INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
> directory
> ^
> :1:1: note: scanning from here
> fatal error: error in backend: can't open file 
> 'C:/src/llvm-project/out/gn/obj/clang/test/CodeGen/Output/invalid-virtual-file.blacklist':
>  no such file or directory
> 
> 
> Looks like it expects a "No such file" with a capital "No" but gets a "no 
> such file" with a lower-case n. {{[Nn]}}o probably fixes this.
> 
> On Tue, Oct 8, 2019 at 2:10 PM Jan Korous via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: jkorous
> Date: Tue Oct  8 11:13:04 2019
> New Revision: 374098
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=374098=rev 
> <http://llvm.org/viewvc/llvm-project?rev=374098=rev>
> Log:
> [NFC] Attempt to make ubsan-blacklist-vfs test pass on Windows
> 
> Previously disabled in d0c2d5daa3e
> 
> Modified:
> cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c
> 
> Modified: cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c?rev=374098=374097=374098=diff
>  
> <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c?rev=374098=374097=374098=diff>
> ==
> --- cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c (original)
> +++ cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c Tue Oct  8 11:13:04 2019
> @@ -1,5 +1,3 @@
> -// UNSUPPORTED: system-windows
> -
>  // Verify ubsan doesn't emit checks for blacklisted functions and files
>  // RUN: echo "fun:hash" > %t-func.blacklist
>  // RUN: echo "src:%s" | sed -e 's/\\//g' > %t-file.blacklist
> @@ -7,9 +5,9 @@
>  // RUN: rm -f %t-vfsoverlay.yaml
>  // RUN: rm -f %t-nonexistent.blacklist
>  // RUN: sed -e "s|@DIR@|%/T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml 
> | sed -e "s|@REAL_FILE@|%/t-func.blacklist|g" | sed -e 
> "s|@NONEXISTENT_FILE@|%/t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
> -// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
> %t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
> -emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
> +// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
> %t-vfsoverlay.yaml -fsanitize-blacklist=%/T/only-virtual-file.blacklist 
> -emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
> 
> -// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
> %t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
> -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
> +// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
> %t-vfsoverlay.yaml -fsanitize-blacklist=%/T/invalid-virtual-file.blacklist 
> -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
>  // INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
> directory
> 
>  // RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
> %t-vfsoverlay.yaml -fsanitize-blacklist=%t-nonexistent.blacklist -emit-llvm 
> %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID
> 
> 
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
> <https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374098 - [NFC] Attempt to make ubsan-blacklist-vfs test pass on Windows

2019-10-08 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Oct  8 11:13:04 2019
New Revision: 374098

URL: http://llvm.org/viewvc/llvm-project?rev=374098=rev
Log:
[NFC] Attempt to make ubsan-blacklist-vfs test pass on Windows

Previously disabled in d0c2d5daa3e

Modified:
cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c

Modified: cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c?rev=374098=374097=374098=diff
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c (original)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c Tue Oct  8 11:13:04 2019
@@ -1,5 +1,3 @@
-// UNSUPPORTED: system-windows
-
 // Verify ubsan doesn't emit checks for blacklisted functions and files
 // RUN: echo "fun:hash" > %t-func.blacklist
 // RUN: echo "src:%s" | sed -e 's/\\//g' > %t-file.blacklist
@@ -7,9 +5,9 @@
 // RUN: rm -f %t-vfsoverlay.yaml
 // RUN: rm -f %t-nonexistent.blacklist
 // RUN: sed -e "s|@DIR@|%/T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%/t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%/t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
-// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
+// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%/T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
 
-// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
+// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%/T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
 // INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
directory
 
 // RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%t-nonexistent.blacklist -emit-llvm %s 
-o - 2>&1 | FileCheck %s --check-prefix=INVALID


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374011 - [NFC] Fix ubsan-blacklist test

2019-10-07 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct  7 19:26:17 2019
New Revision: 374011

URL: http://llvm.org/viewvc/llvm-project?rev=374011=rev
Log:
[NFC] Fix ubsan-blacklist test

Restored original test and marked tests for VFS as unsupported on Windows.

Added:
cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c
Modified:
cfe/trunk/test/CodeGen/ubsan-blacklist.c

Added: cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c?rev=374011=auto
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c (added)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist-vfs.c Mon Oct  7 19:26:17 2019
@@ -0,0 +1,38 @@
+// UNSUPPORTED: system-windows
+
+// Verify ubsan doesn't emit checks for blacklisted functions and files
+// RUN: echo "fun:hash" > %t-func.blacklist
+// RUN: echo "src:%s" | sed -e 's/\\//g' > %t-file.blacklist
+
+// RUN: rm -f %t-vfsoverlay.yaml
+// RUN: rm -f %t-nonexistent.blacklist
+// RUN: sed -e "s|@DIR@|%/T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%/t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%/t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
+// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
+
+// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
+// INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
directory
+
+// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%t-nonexistent.blacklist -emit-llvm %s 
-o - 2>&1 | FileCheck %s --check-prefix=INVALID
+// INVALID: nonexistent.blacklist': No such file or directory
+
+unsigned i;
+
+// DEFAULT: @hash
+// FUNC: @hash
+// FILE: @hash
+unsigned hash() {
+// DEFAULT: call {{.*}}void @__ubsan
+// FUNC-NOT: call {{.*}}void @__ubsan
+// FILE-NOT: call {{.*}}void @__ubsan
+  return i * 37;
+}
+
+// DEFAULT: @add
+// FUNC: @add
+// FILE: @add
+unsigned add() {
+// DEFAULT: call {{.*}}void @__ubsan
+// FUNC: call {{.*}}void @__ubsan
+// FILE-NOT: call {{.*}}void @__ubsan
+  return i + 1;
+}

Modified: cfe/trunk/test/CodeGen/ubsan-blacklist.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist.c?rev=374011=374010=374011=diff
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist.c (original)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist.c Mon Oct  7 19:26:17 2019
@@ -5,17 +5,6 @@
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-func.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FUNC
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-file.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FILE
 
-// RUN: rm -f %t-vfsoverlay.yaml
-// RUN: rm -f %t-nonexistent.blacklist
-// RUN: sed -e "s|@DIR@|%/T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%/t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%/t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
-// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
-
-// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
-// INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
directory
-
-// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%t-nonexistent.blacklist -emit-llvm %s 
-o - 2>&1 | FileCheck %s --check-prefix=INVALID
-// INVALID: nonexistent.blacklist': No such file or directory
-
 unsigned i;
 
 // DEFAULT: @hash


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r374006 - Reland 'Add VFS support for sanitizers' blacklist'

2019-10-07 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct  7 18:13:17 2019
New Revision: 374006

URL: http://llvm.org/viewvc/llvm-project?rev=374006=rev
Log:
Reland 'Add VFS support for sanitizers' blacklist'

The original patch broke the test for Windows.
Trying to fix as per Reid's suggestions outlined here:
https://reviews.llvm.org/rC371663

Differential Revision: https://reviews.llvm.org/D67742

Added:
cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/CodeGen/ubsan-blacklist.c

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=374006=374005=374006=diff
==
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Mon Oct  7 18:13:17 2019
@@ -72,6 +72,7 @@
 #include "llvm/ADT/PointerUnion.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
@@ -81,6 +82,7 @@
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
+#include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
 #include 
@@ -826,6 +828,18 @@ static bool isAddrSpaceMapManglingEnable
   llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
 }
 
+static std::vector
+getRealPaths(llvm::vfs::FileSystem , llvm::ArrayRef Paths) {
+  std::vector Result;
+  llvm::SmallString<128> Buffer;
+  for (const auto  : Paths) {
+if (std::error_code EC = VFS.getRealPath(File, Buffer))
+  llvm::report_fatal_error("can't open file '" + File + "': " + 
EC.message());
+Result.push_back(Buffer.str());
+  }
+  return Result;
+}
+
 ASTContext::ASTContext(LangOptions , SourceManager ,
IdentifierTable , SelectorTable ,
Builtin::Context )
@@ -833,7 +847,10 @@ ASTContext::ASTContext(LangOptions 
   TemplateSpecializationTypes(this_()),
   DependentTemplateSpecializationTypes(this_()),
   SubstTemplateTemplateParmPacks(this_()), SourceMgr(SM), LangOpts(LOpts),
-  SanitizerBL(new SanitizerBlacklist(LangOpts.SanitizerBlacklistFiles, 
SM)),
+  SanitizerBL(new SanitizerBlacklist(
+  getRealPaths(SM.getFileManager().getVirtualFileSystem(),
+   LangOpts.SanitizerBlacklistFiles),
+  SM)),
   XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles,
 LangOpts.XRayNeverInstrumentFiles,
 LangOpts.XRayAttrListFiles, SM)),

Added: cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml?rev=374006=auto
==
--- cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml (added)
+++ cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml Mon Oct  
7 18:13:17 2019
@@ -0,0 +1,15 @@
+{
+  'version': 0,
+  'roots': [
+{ 'name': '@DIR@', 'type': 'directory',
+  'contents': [
+{ 'name': 'only-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@REAL_FILE@'
+},
+{ 'name': 'invalid-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@NONEXISTENT_FILE@'
+}
+  ]
+}
+  ]
+}

Modified: cfe/trunk/test/CodeGen/ubsan-blacklist.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist.c?rev=374006=374005=374006=diff
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist.c (original)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist.c Mon Oct  7 18:13:17 2019
@@ -5,6 +5,17 @@
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-func.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FUNC
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-file.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FILE
 
+// RUN: rm -f %t-vfsoverlay.yaml
+// RUN: rm -f %t-nonexistent.blacklist
+// RUN: sed -e "s|@DIR@|%/T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%/t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%/t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
+// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
+
+// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | 

r373999 - Revert "Add VFS support for sanitizers' blacklist"

2019-10-07 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct  7 17:36:19 2019
New Revision: 373999

URL: http://llvm.org/viewvc/llvm-project?rev=373999=rev
Log:
Revert "Add VFS support for sanitizers' blacklist"

Fix tests on Windows for now.

This reverts commit 96ac97a4213287003f08636d0c372b3f71e9cfca.

Removed:
cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/CodeGen/ubsan-blacklist.c

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=373999=373998=373999=diff
==
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Mon Oct  7 17:36:19 2019
@@ -72,7 +72,6 @@
 #include "llvm/ADT/PointerUnion.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
@@ -82,7 +81,6 @@
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
-#include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
 #include 
@@ -828,18 +826,6 @@ static bool isAddrSpaceMapManglingEnable
   llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
 }
 
-static std::vector
-getRealPaths(llvm::vfs::FileSystem , llvm::ArrayRef Paths) {
-  std::vector Result;
-  llvm::SmallString<128> Buffer;
-  for (const auto  : Paths) {
-if (std::error_code EC = VFS.getRealPath(File, Buffer))
-  llvm::report_fatal_error("can't open file '" + File + "': " + 
EC.message());
-Result.push_back(Buffer.str());
-  }
-  return Result;
-}
-
 ASTContext::ASTContext(LangOptions , SourceManager ,
IdentifierTable , SelectorTable ,
Builtin::Context )
@@ -847,10 +833,7 @@ ASTContext::ASTContext(LangOptions 
   TemplateSpecializationTypes(this_()),
   DependentTemplateSpecializationTypes(this_()),
   SubstTemplateTemplateParmPacks(this_()), SourceMgr(SM), LangOpts(LOpts),
-  SanitizerBL(new SanitizerBlacklist(
-  getRealPaths(SM.getFileManager().getVirtualFileSystem(),
-   LangOpts.SanitizerBlacklistFiles),
-  SM)),
+  SanitizerBL(new SanitizerBlacklist(LangOpts.SanitizerBlacklistFiles, 
SM)),
   XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles,
 LangOpts.XRayNeverInstrumentFiles,
 LangOpts.XRayAttrListFiles, SM)),

Removed: cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml?rev=373998=auto
==
--- cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml (original)
+++ cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml (removed)
@@ -1,15 +0,0 @@
-{
-  'version': 0,
-  'roots': [
-{ 'name': '@DIR@', 'type': 'directory',
-  'contents': [
-{ 'name': 'only-virtual-file.blacklist', 'type': 'file',
-  'external-contents': '@REAL_FILE@'
-},
-{ 'name': 'invalid-virtual-file.blacklist', 'type': 'file',
-  'external-contents': '@NONEXISTENT_FILE@'
-}
-  ]
-}
-  ]
-}

Modified: cfe/trunk/test/CodeGen/ubsan-blacklist.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist.c?rev=373999=373998=373999=diff
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist.c (original)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist.c Mon Oct  7 17:36:19 2019
@@ -5,17 +5,6 @@
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-func.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FUNC
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-file.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FILE
 
-// RUN: rm -f %t-vfsoverlay.yaml
-// RUN: rm -f %t-nonexistent.blacklist
-// RUN: sed -e "s|@DIR@|%T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
-// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
-
-// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
-// INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such 

r373977 - Add VFS support for sanitizers' blacklist

2019-10-07 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Oct  7 15:36:19 2019
New Revision: 373977

URL: http://llvm.org/viewvc/llvm-project?rev=373977=rev
Log:
Add VFS support for sanitizers' blacklist

Differential Revision: https://reviews.llvm.org/D67742

Added:
cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/test/CodeGen/ubsan-blacklist.c

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=373977=373976=373977=diff
==
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Mon Oct  7 15:36:19 2019
@@ -72,6 +72,7 @@
 #include "llvm/ADT/PointerUnion.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallPtrSet.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
@@ -81,6 +82,7 @@
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/MathExtras.h"
+#include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
 #include 
@@ -826,6 +828,18 @@ static bool isAddrSpaceMapManglingEnable
   llvm_unreachable("getAddressSpaceMapMangling() doesn't cover anything.");
 }
 
+static std::vector
+getRealPaths(llvm::vfs::FileSystem , llvm::ArrayRef Paths) {
+  std::vector Result;
+  llvm::SmallString<128> Buffer;
+  for (const auto  : Paths) {
+if (std::error_code EC = VFS.getRealPath(File, Buffer))
+  llvm::report_fatal_error("can't open file '" + File + "': " + 
EC.message());
+Result.push_back(Buffer.str());
+  }
+  return Result;
+}
+
 ASTContext::ASTContext(LangOptions , SourceManager ,
IdentifierTable , SelectorTable ,
Builtin::Context )
@@ -833,7 +847,10 @@ ASTContext::ASTContext(LangOptions 
   TemplateSpecializationTypes(this_()),
   DependentTemplateSpecializationTypes(this_()),
   SubstTemplateTemplateParmPacks(this_()), SourceMgr(SM), LangOpts(LOpts),
-  SanitizerBL(new SanitizerBlacklist(LangOpts.SanitizerBlacklistFiles, 
SM)),
+  SanitizerBL(new SanitizerBlacklist(
+  getRealPaths(SM.getFileManager().getVirtualFileSystem(),
+   LangOpts.SanitizerBlacklistFiles),
+  SM)),
   XRayFilter(new XRayFunctionFilter(LangOpts.XRayAlwaysInstrumentFiles,
 LangOpts.XRayNeverInstrumentFiles,
 LangOpts.XRayAttrListFiles, SM)),

Added: cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml?rev=373977=auto
==
--- cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml (added)
+++ cfe/trunk/test/CodeGen/Inputs/sanitizer-blacklist-vfsoverlay.yaml Mon Oct  
7 15:36:19 2019
@@ -0,0 +1,15 @@
+{
+  'version': 0,
+  'roots': [
+{ 'name': '@DIR@', 'type': 'directory',
+  'contents': [
+{ 'name': 'only-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@REAL_FILE@'
+},
+{ 'name': 'invalid-virtual-file.blacklist', 'type': 'file',
+  'external-contents': '@NONEXISTENT_FILE@'
+}
+  ]
+}
+  ]
+}

Modified: cfe/trunk/test/CodeGen/ubsan-blacklist.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-blacklist.c?rev=373977=373976=373977=diff
==
--- cfe/trunk/test/CodeGen/ubsan-blacklist.c (original)
+++ cfe/trunk/test/CodeGen/ubsan-blacklist.c Mon Oct  7 15:36:19 2019
@@ -5,6 +5,17 @@
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-func.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FUNC
 // RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow 
-fsanitize-blacklist=%t-file.blacklist -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FILE
 
+// RUN: rm -f %t-vfsoverlay.yaml
+// RUN: rm -f %t-nonexistent.blacklist
+// RUN: sed -e "s|@DIR@|%T|g" %S/Inputs/sanitizer-blacklist-vfsoverlay.yaml | 
sed -e "s|@REAL_FILE@|%t-func.blacklist|g" | sed -e 
"s|@NONEXISTENT_FILE@|%t-nonexistent.blacklist|g" > %t-vfsoverlay.yaml
+// RUN: %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/only-virtual-file.blacklist 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FUNC
+
+// RUN: not %clang_cc1 -fsanitize=unsigned-integer-overflow -ivfsoverlay 
%t-vfsoverlay.yaml -fsanitize-blacklist=%T/invalid-virtual-file.blacklist 
-emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=INVALID-MAPPED-FILE
+// INVALID-MAPPED-FILE: invalid-virtual-file.blacklist': No such file or 
directory
+
+// RUN: not 

r372687 - Revert "[static analyzer] Define __clang_analyzer__ macro in driver"

2019-09-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Sep 23 20:21:22 2019
New Revision: 372687

URL: http://llvm.org/viewvc/llvm-project?rev=372687=rev
Log:
Revert "[static analyzer] Define __clang_analyzer__ macro in driver"

This reverts commit fbd13570b0d5f92ef2cf6bcfe7cc2f6178500187.

Removed:
cfe/trunk/test/Analysis/misc-driver.c
Modified:
cfe/trunk/lib/Driver/ToolChains/Clang.cpp
cfe/trunk/lib/Frontend/InitPreprocessor.cpp
cfe/trunk/test/Analysis/misc-ps.m

Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=372687=372686=372687=diff
==
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Mon Sep 23 20:21:22 2019
@@ -3896,10 +3896,8 @@ void Clang::ConstructJob(Compilation ,
   if (Args.hasArg(options::OPT_municode))
 CmdArgs.push_back("-DUNICODE");
 
-  if (isa(JA)) {
+  if (isa(JA))
 RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
-CmdArgs.push_back("-D__clang_analyzer__");
-  }
 
   // Enable compatilibily mode to avoid analyzer-config related errors.
   // Since we can't access frontend flags through hasArg, let's manually 
iterate

Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=372687=372686=372687=diff
==
--- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
+++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Sep 23 20:21:22 2019
@@ -990,6 +990,10 @@ static void InitializePredefinedMacros(c
   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
 Builder.defineMacro("__SSP_ALL__", "3");
 
+  // Define a macro that exists only when using the static analyzer.
+  if (FEOpts.ProgramAction == frontend::RunAnalysis)
+Builder.defineMacro("__clang_analyzer__");
+
   if (LangOpts.FastRelaxedMath)
 Builder.defineMacro("__FAST_RELAXED_MATH__");
 

Removed: cfe/trunk/test/Analysis/misc-driver.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372686=auto
==
--- cfe/trunk/test/Analysis/misc-driver.c (original)
+++ cfe/trunk/test/Analysis/misc-driver.c (removed)
@@ -1,5 +0,0 @@
-// RUN: %clang --analyze %s
-
-#ifndef __clang_analyzer__
-#error __clang_analyzer__ not defined
-#endif

Modified: cfe/trunk/test/Analysis/misc-ps.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps.m?rev=372687=372686=372687=diff
==
--- cfe/trunk/test/Analysis/misc-ps.m (original)
+++ cfe/trunk/test/Analysis/misc-ps.m Mon Sep 23 20:21:22 2019
@@ -2,6 +2,10 @@
 // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 
+#ifndef __clang_analyzer__
+#error __clang_analyzer__ not defined
+#endif
+
 typedef struct objc_ivar *Ivar;
 typedef struct objc_selector *SEL;
 typedef signed char BOOL;


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r372685 - Revert "[static analyzer][test] Test directly that driver sets D__clang_analyzer__"

2019-09-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Sep 23 20:19:20 2019
New Revision: 372685

URL: http://llvm.org/viewvc/llvm-project?rev=372685=rev
Log:
Revert "[static analyzer][test] Test directly that driver sets 
D__clang_analyzer__"

This reverts commit c7541903d72765a38808e9973572a8d50c9d94fb.

Modified:
cfe/trunk/test/Analysis/misc-driver.c

Modified: cfe/trunk/test/Analysis/misc-driver.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372685=372684=372685=diff
==
--- cfe/trunk/test/Analysis/misc-driver.c (original)
+++ cfe/trunk/test/Analysis/misc-driver.c Mon Sep 23 20:19:20 2019
@@ -1,2 +1,5 @@
-// RUN: %clang -### --analyze %s 2>&1 | FileCheck %s
-// CHECK: -D__clang_analyzer__
+// RUN: %clang --analyze %s
+
+#ifndef __clang_analyzer__
+#error __clang_analyzer__ not defined
+#endif


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: r372679 - [static analyzer] Define __clang_analyzer__ macro in driver

2019-09-23 Thread Jan Korous via cfe-commits
Well, those were not fixups in the sense that I was aware of anything broken...

Anyway, I don't see a quick fix for clang-tidy so I'm going to revert.

> On Sep 23, 2019, at 8:00 PM, Nico Weber  wrote:
> 
> Even after all the fixup attempts, there's still a failing clang-tools-extra 
> test:
> 
> ninja: Entering directory `out/gn'
> [0/2] ACTION 
> //clang-tools-extra/test:check-clang-tools(//llvm/utils/gn/build/toolchain:unix)
> -- Testing: 787 tests, 64 threads --
> Testing: 0 .. 10
> FAIL: Clang Tools :: clang-tidy/clang-tidy-__clang_analyzer__macro.cpp (112 
> of 787)
>  TEST 'Clang Tools :: 
> clang-tidy/clang-tidy-__clang_analyzer__macro.cpp' FAILED 
> Script:
> --
> : 'RUN: at line 1';   clang-tidy 
> /usr/local/google/home/thakis/src/llvm-project/clang-tools-extra/test/clang-tidy/clang-tidy-__clang_analyzer__macro.cpp
>  -checks=-*,modernize-use-nullptr -- | count 0
> --
> Exit Code: 1
> 
> Command Output (stderr):
> --
> 1 error generated.
> Error while processing 
> /usr/local/google/home/thakis/src/llvm-project/clang-tools-extra/test/clang-tidy/clang-tidy-__clang_analyzer__macro.cpp.
> Found compiler error(s).
> Expected 0 lines, got 3.
> 
> --
> 
> 
> Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90.. 
> Testing Time: 4.11s
> 
> Failing Tests (1):
> Clang Tools :: clang-tidy/clang-tidy-__clang_analyzer__macro.cpp
> 
> 
> On Mon, Sep 23, 2019 at 8:31 PM Jan Korous via cfe-commits 
> mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: jkorous
> Date: Mon Sep 23 17:33:47 2019
> New Revision: 372679
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=372679=rev 
> <http://llvm.org/viewvc/llvm-project?rev=372679=rev>
> Log:
> [static analyzer] Define __clang_analyzer__ macro in driver
> 
> Differential Revision: https://reviews.llvm.org/D67938 
> <https://reviews.llvm.org/D67938>
> 
> Added:
> cfe/trunk/test/Analysis/misc-driver.c
> Modified:
> cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> cfe/trunk/lib/Frontend/InitPreprocessor.cpp
> cfe/trunk/test/Analysis/misc-ps.m
> 
> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=372679=372678=372679=diff
>  
> <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=372679=372678=372679=diff>
> ==
> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Mon Sep 23 17:33:47 2019
> @@ -3896,8 +3896,10 @@ void Clang::ConstructJob(Compilation ,
>if (Args.hasArg(options::OPT_municode))
>  CmdArgs.push_back("-DUNICODE");
> 
> -  if (isa(JA))
> +  if (isa(JA)) {
>  RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
> +CmdArgs.push_back("-D__clang_analyzer__");
> +  }
> 
>// Enable compatilibily mode to avoid analyzer-config related errors.
>// Since we can't access frontend flags through hasArg, let's manually 
> iterate
> 
> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=372679=372678=372679=diff
>  
> <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=372679=372678=372679=diff>
> ==
> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Sep 23 17:33:47 2019
> @@ -990,10 +990,6 @@ static void InitializePredefinedMacros(c
>else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
>  Builder.defineMacro("__SSP_ALL__", "3");
> 
> -  // Define a macro that exists only when using the static analyzer.
> -  if (FEOpts.ProgramAction == frontend::RunAnalysis)
> -Builder.defineMacro("__clang_analyzer__");
> -
>if (LangOpts.FastRelaxedMath)
>  Builder.defineMacro("__FAST_RELAXED_MATH__");
> 
> 
> Added: cfe/trunk/test/Analysis/misc-driver.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372679=auto
>  
> <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372679=auto>
> ==
> --- cfe/trunk/test/Analysis/misc-driver.c (added)
> +++ cfe/trunk/test/Analysis/misc-driv

r372683 - [static analyzer][test] Test directly that driver sets D__clang_analyzer__

2019-09-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Sep 23 19:06:59 2019
New Revision: 372683

URL: http://llvm.org/viewvc/llvm-project?rev=372683=rev
Log:
[static analyzer][test] Test directly that driver sets D__clang_analyzer__

Follow-up to fbd13570b0d

Modified:
cfe/trunk/test/Analysis/misc-driver.c

Modified: cfe/trunk/test/Analysis/misc-driver.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372683=372682=372683=diff
==
--- cfe/trunk/test/Analysis/misc-driver.c (original)
+++ cfe/trunk/test/Analysis/misc-driver.c Mon Sep 23 19:06:59 2019
@@ -1,5 +1,2 @@
-// RUN: %clang --analyze %s
-
-#ifndef __clang_analyzer__
-#error __clang_analyzer__ not defined
-#endif
+// RUN: %clang -### --analyze %s 2>&1 | FileCheck %s
+// CHECK: -D__clang_analyzer__


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r372680 - [static analyzer] Remove --analyze-auto

2019-09-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Sep 23 17:37:25 2019
New Revision: 372680

URL: http://llvm.org/viewvc/llvm-project?rev=372680=rev
Log:
[static analyzer] Remove --analyze-auto

Differential Revision: https://reviews.llvm.org/D67934

Modified:
cfe/trunk/docs/ClangCommandLineReference.rst
cfe/trunk/include/clang/Driver/Options.td
cfe/trunk/lib/Driver/Driver.cpp
cfe/trunk/lib/Driver/Types.cpp

Modified: cfe/trunk/docs/ClangCommandLineReference.rst
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangCommandLineReference.rst?rev=372680=372679=372680=diff
==
--- cfe/trunk/docs/ClangCommandLineReference.rst (original)
+++ cfe/trunk/docs/ClangCommandLineReference.rst Mon Sep 23 17:37:25 2019
@@ -86,8 +86,6 @@ Pass  to the target offloading tool
 
 Run the static analyzer
 
-.. option:: --analyze-auto
-
 .. option:: --analyzer-no-default-checks
 
 .. option:: --analyzer-output

Modified: cfe/trunk/include/clang/Driver/Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=372680=372679=372680=diff
==
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Mon Sep 23 17:37:25 2019
@@ -2762,7 +2762,6 @@ def _mhwdiv : Separate<["--"], "mhwdiv">
 def _CLASSPATH_EQ : Joined<["--"], "CLASSPATH=">, Alias;
 def _CLASSPATH : Separate<["--"], "CLASSPATH">, Alias;
 def _all_warnings : Flag<["--"], "all-warnings">, Alias;
-def _analyze_auto : Flag<["--"], "analyze-auto">, Flags<[DriverOption]>;
 def _analyzer_no_default_checks : Flag<["--"], "analyzer-no-default-checks">, 
Flags<[DriverOption]>;
 def _analyzer_output : JoinedOrSeparate<["--"], "analyzer-output">, 
Flags<[DriverOption]>,
   HelpText<"Static analyzer report output format 
(html|plist|plist-multi-file|plist-html|text).">;

Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=372680=372679=372680=diff
==
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Mon Sep 23 17:37:25 2019
@@ -287,8 +287,7 @@ phases::ID Driver::getFinalPhase(const D
  (PhaseArg = DAL.getLastArg(options::OPT_rewrite_legacy_objc)) ||
  (PhaseArg = DAL.getLastArg(options::OPT__migrate)) ||
  (PhaseArg = DAL.getLastArg(options::OPT_emit_iterface_stubs)) ||
- (PhaseArg = DAL.getLastArg(options::OPT__analyze,
-options::OPT__analyze_auto)) ||
+ (PhaseArg = DAL.getLastArg(options::OPT__analyze)) ||
  (PhaseArg = DAL.getLastArg(options::OPT_emit_ast))) {
 FinalPhase = phases::Compile;
 
@@ -3501,7 +3500,7 @@ Action *Driver::ConstructPhaseAction(
 if (Args.hasArg(options::OPT_rewrite_legacy_objc))
   return C.MakeAction(Input,
 types::TY_RewrittenLegacyObjC);
-if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto))
+if (Args.hasArg(options::OPT__analyze))
   return C.MakeAction(Input, types::TY_Plist);
 if (Args.hasArg(options::OPT__migrate))
   return C.MakeAction(Input, types::TY_Remap);

Modified: cfe/trunk/lib/Driver/Types.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Types.cpp?rev=372680=372679=372680=diff
==
--- cfe/trunk/lib/Driver/Types.cpp (original)
+++ cfe/trunk/lib/Driver/Types.cpp Mon Sep 23 17:37:25 2019
@@ -328,7 +328,7 @@ void types::getCompilationPhases(const c
DAL.getLastArg(options::OPT_rewrite_legacy_objc) ||
DAL.getLastArg(options::OPT__migrate) ||
DAL.getLastArg(options::OPT_emit_iterface_stubs) ||
-   DAL.getLastArg(options::OPT__analyze, options::OPT__analyze_auto) ||
+   DAL.getLastArg(options::OPT__analyze) ||
DAL.getLastArg(options::OPT_emit_ast))
 llvm::copy_if(PhaseList, std::back_inserter(P),
   [](phases::ID Phase) { return Phase <= phases::Compile; });


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r372679 - [static analyzer] Define __clang_analyzer__ macro in driver

2019-09-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Sep 23 17:33:47 2019
New Revision: 372679

URL: http://llvm.org/viewvc/llvm-project?rev=372679=rev
Log:
[static analyzer] Define __clang_analyzer__ macro in driver

Differential Revision: https://reviews.llvm.org/D67938

Added:
cfe/trunk/test/Analysis/misc-driver.c
Modified:
cfe/trunk/lib/Driver/ToolChains/Clang.cpp
cfe/trunk/lib/Frontend/InitPreprocessor.cpp
cfe/trunk/test/Analysis/misc-ps.m

Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=372679=372678=372679=diff
==
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Mon Sep 23 17:33:47 2019
@@ -3896,8 +3896,10 @@ void Clang::ConstructJob(Compilation ,
   if (Args.hasArg(options::OPT_municode))
 CmdArgs.push_back("-DUNICODE");
 
-  if (isa(JA))
+  if (isa(JA)) {
 RenderAnalyzerOptions(Args, CmdArgs, Triple, Input);
+CmdArgs.push_back("-D__clang_analyzer__");
+  }
 
   // Enable compatilibily mode to avoid analyzer-config related errors.
   // Since we can't access frontend flags through hasArg, let's manually 
iterate

Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=372679=372678=372679=diff
==
--- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
+++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Sep 23 17:33:47 2019
@@ -990,10 +990,6 @@ static void InitializePredefinedMacros(c
   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
 Builder.defineMacro("__SSP_ALL__", "3");
 
-  // Define a macro that exists only when using the static analyzer.
-  if (FEOpts.ProgramAction == frontend::RunAnalysis)
-Builder.defineMacro("__clang_analyzer__");
-
   if (LangOpts.FastRelaxedMath)
 Builder.defineMacro("__FAST_RELAXED_MATH__");
 

Added: cfe/trunk/test/Analysis/misc-driver.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-driver.c?rev=372679=auto
==
--- cfe/trunk/test/Analysis/misc-driver.c (added)
+++ cfe/trunk/test/Analysis/misc-driver.c Mon Sep 23 17:33:47 2019
@@ -0,0 +1,5 @@
+// RUN: %clang --analyze %s
+
+#ifndef __clang_analyzer__
+#error __clang_analyzer__ not defined
+#endif

Modified: cfe/trunk/test/Analysis/misc-ps.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps.m?rev=372679=372678=372679=diff
==
--- cfe/trunk/test/Analysis/misc-ps.m (original)
+++ cfe/trunk/test/Analysis/misc-ps.m Mon Sep 23 17:33:47 2019
@@ -2,10 +2,6 @@
 // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 
-analyzer-checker=core,alpha.core,osx.cocoa.AtSync -analyzer-store=region 
-verify -fblocks -Wno-unreachable-code -Wno-null-dereference 
-Wno-objc-root-class %s
 
-#ifndef __clang_analyzer__
-#error __clang_analyzer__ not defined
-#endif
-
 typedef struct objc_ivar *Ivar;
 typedef struct objc_selector *SEL;
 typedef signed char BOOL;


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r372174 - [clang-scan-deps] Add verbose mode

2019-09-17 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Sep 17 12:45:24 2019
New Revision: 372174

URL: http://llvm.org/viewvc/llvm-project?rev=372174=rev
Log:
[clang-scan-deps] Add verbose mode

When running in the default mode we don't print anything other than actual 
output to stdout to make automated processing easier.

Differential Revision: https://reviews.llvm.org/D67522

Modified:
cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp

Modified: cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp?rev=372174=372173=372174=diff
==
--- cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp (original)
+++ cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp Tue Sep 17 12:45:24 2019
@@ -177,6 +177,11 @@ llvm::cl::opt SkipExcludedPPRanges
 "until reaching the end directive."),
 llvm::cl::init(true), llvm::cl::cat(DependencyScannerCategory));
 
+llvm::cl::opt Verbose("v", llvm::cl::Optional,
+llvm::cl::desc("Use verbose output."),
+llvm::cl::init(false),
+llvm::cl::cat(DependencyScannerCategory));
+
 } // end anonymous namespace
 
 /// \returns object-file path derived from source-file path.
@@ -284,8 +289,10 @@ int main(int argc, const char **argv) {
   std::mutex Lock;
   size_t Index = 0;
 
-  llvm::outs() << "Running clang-scan-deps on " << Inputs.size()
-   << " files using " << NumWorkers << " workers\n";
+  if (Verbose) {
+llvm::outs() << "Running clang-scan-deps on " << Inputs.size()
+ << " files using " << NumWorkers << " workers\n";
+  }
   for (unsigned I = 0; I < NumWorkers; ++I) {
 auto Worker = [I, , , , , ]() {
   while (true) {


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] r371890 - [Support] Add overload writeFileAtomically(std::function Writer)

2019-09-13 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Sep 13 13:08:27 2019
New Revision: 371890

URL: http://llvm.org/viewvc/llvm-project?rev=371890=rev
Log:
[Support] Add overload writeFileAtomically(std::function Writer)

Differential Revision: https://reviews.llvm.org/D67424

Modified:
clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp

Modified: clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp?rev=371890=371889=371890=diff
==
--- clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp (original)
+++ clang-tools-extra/trunk/clangd/index/BackgroundIndexStorage.cpp Fri Sep 13 
13:08:27 2019
@@ -18,6 +18,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include 
@@ -35,34 +36,6 @@ std::string getShardPathFromFilePath(llv
   return ShardRootSS.str();
 }
 
-llvm::Error
-writeAtomically(llvm::StringRef OutPath,
-llvm::function_ref Writer) {
-  // Write to a temporary file first.
-  llvm::SmallString<128> TempPath;
-  int FD;
-  auto EC =
-  llvm::sys::fs::createUniqueFile(OutPath + ".tmp.", FD, TempPath);
-  if (EC)
-return llvm::errorCodeToError(EC);
-  // Make sure temp file is destroyed on failure.
-  auto RemoveOnFail =
-  llvm::make_scope_exit([TempPath] { llvm::sys::fs::remove(TempPath); });
-  llvm::raw_fd_ostream OS(FD, /*shouldClose=*/true);
-  Writer(OS);
-  OS.close();
-  if (OS.has_error())
-return llvm::errorCodeToError(OS.error());
-  // Then move to real location.
-  EC = llvm::sys::fs::rename(TempPath, OutPath);
-  if (EC)
-return llvm::errorCodeToError(EC);
-  // If everything went well, we already moved the file to another name. So
-  // don't delete the file, as the name might be taken by another file.
-  RemoveOnFail.release();
-  return llvm::ErrorSuccess();
-}
-
 // Uses disk as a storage for index shards. Creates a directory called
 // ".clangd/index/" under the path provided during construction.
 class DiskBackedIndexStorage : public BackgroundIndexStorage {
@@ -100,9 +73,12 @@ public:
 
   llvm::Error storeShard(llvm::StringRef ShardIdentifier,
  IndexFileOut Shard) const override {
-return writeAtomically(
-getShardPathFromFilePath(DiskShardRoot, ShardIdentifier),
-[](llvm::raw_ostream ) { OS << Shard; });
+auto ShardPath = getShardPathFromFilePath(DiskShardRoot, ShardIdentifier);
+return llvm::writeFileAtomically(ShardPath + ".tmp.", ShardPath,
+ [](llvm::raw_ostream ) {
+   OS << Shard;
+   return llvm::Error::success();
+ });
   }
 };
 


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r371890 - [Support] Add overload writeFileAtomically(std::function Writer)

2019-09-13 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Sep 13 13:08:27 2019
New Revision: 371890

URL: http://llvm.org/viewvc/llvm-project?rev=371890=rev
Log:
[Support] Add overload writeFileAtomically(std::function Writer)

Differential Revision: https://reviews.llvm.org/D67424

Modified:
cfe/trunk/lib/Frontend/ASTUnit.cpp
cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp

Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=371890=371889=371890=diff
==
--- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
+++ cfe/trunk/lib/Frontend/ASTUnit.cpp Fri Sep 13 13:08:27 2019
@@ -84,6 +84,7 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/ErrorOr.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Timer.h"
 #include "llvm/Support/VirtualFileSystem.h"
@@ -2301,26 +2302,19 @@ bool ASTUnit::Save(StringRef File) {
   SmallString<128> TempPath;
   TempPath = File;
   TempPath += "-";
-  int fd;
-  if (llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath))
-return true;
-
   // FIXME: Can we somehow regenerate the stat cache here, or do we need to
   // unconditionally create a stat cache when we parse the file?
-  llvm::raw_fd_ostream Out(fd, /*shouldClose=*/true);
-
-  serialize(Out);
-  Out.close();
-  if (Out.has_error()) {
-Out.clear_error();
-return true;
-  }
 
-  if (llvm::sys::fs::rename(TempPath, File)) {
-llvm::sys::fs::remove(TempPath);
+  if (llvm::Error Err = llvm::writeFileAtomically(
+  TempPath, File, [this](llvm::raw_ostream ) {
+return serialize(Out) ? llvm::make_error(
+"ASTUnit serialization failed",
+llvm::inconvertibleErrorCode())
+  : llvm::Error::success();
+  })) {
+consumeError(std::move(Err));
 return true;
   }
-
   return false;
 }
 

Modified: cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=371890=371889=371890=diff
==
--- cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp (original)
+++ cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp Fri Sep 13 13:08:27 2019
@@ -10,7 +10,6 @@
 //
 
//===--===//
 
-
 #include "ASTReaderInternals.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Lex/HeaderSearch.h"
@@ -21,10 +20,12 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
 #include "llvm/Bitstream/BitstreamReader.h"
 #include "llvm/Bitstream/BitstreamWriter.h"
 #include "llvm/Support/DJB.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/LockFileManager.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/OnDiskHashTable.h"
@@ -912,37 +913,9 @@ GlobalModuleIndex::writeIndex(FileManage
  "failed writing index");
   }
 
-  // Write the global index file to a temporary file.
-  llvm::SmallString<128> IndexTmpPath;
-  int TmpFD;
-  if (llvm::sys::fs::createUniqueFile(IndexPath + "-", TmpFD,
-  IndexTmpPath))
-return llvm::createStringError(std::errc::io_error,
-   "failed creating unique file");
-
-  // Open the temporary global index file for output.
-  llvm::raw_fd_ostream Out(TmpFD, true);
-  if (Out.has_error())
-return llvm::createStringError(Out.error(), "failed outputting to stream");
-
-  // Write the index.
-  Out.write(OutputBuffer.data(), OutputBuffer.size());
-  Out.close();
-  if (Out.has_error())
-return llvm::createStringError(Out.error(), "failed writing to stream");
-
-  // Remove the old index file. It isn't relevant any more.
-  llvm::sys::fs::remove(IndexPath);
-
-  // Rename the newly-written index file to the proper name.
-  if (std::error_code Err = llvm::sys::fs::rename(IndexTmpPath, IndexPath)) {
-// Remove the file on failure, don't check whether removal succeeded.
-llvm::sys::fs::remove(IndexTmpPath);
-return llvm::createStringError(Err, "failed renaming file \"%s\" to 
\"%s\"",
-   IndexTmpPath.c_str(), IndexPath.c_str());
-  }
-
-  return llvm::Error::success();
+  return llvm::writeFileAtomically(
+  (IndexPath + "-").str(), IndexPath,
+  llvm::StringRef(OutputBuffer.data(), OutputBuffer.size()));
 }
 
 namespace {


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r371794 - [libclang] Fix UninstallAbortingLLVMFatalErrorHandler test

2019-09-12 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Sep 12 16:51:48 2019
New Revision: 371794

URL: http://llvm.org/viewvc/llvm-project?rev=371794=rev
Log:
[libclang] Fix UninstallAbortingLLVMFatalErrorHandler test

Modified:
cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp

Modified: cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp?rev=371794=371793=371794=diff
==
--- cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp (original)
+++ cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp Thu Sep 12 
16:51:48 2019
@@ -31,6 +31,7 @@ TEST_F(LibclangParseTest, UninstallAbort
   std::string Main = "main.h";
   WriteFile(Main, "#pragma clang __debug llvm_fatal_error");
 
-  EXPECT_NO_FATAL_FAILURE(clang_parseTranslationUnit(
-  Index, Main.c_str(), nullptr, 0, nullptr, 0, TUFlags));
+  EXPECT_EXIT(clang_parseTranslationUnit(
+  Index, Main.c_str(), nullptr, 0, nullptr, 0, TUFlags),
+  ::testing::ExitedWithCode(1), "ERROR");
 }


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r371787 - [libclang] Expose abort()-ing LLVM fatal error handler

2019-09-12 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Sep 12 15:55:55 2019
New Revision: 371787

URL: http://llvm.org/viewvc/llvm-project?rev=371787=rev
Log:
[libclang] Expose abort()-ing LLVM fatal error handler

Differential Revision: https://reviews.llvm.org/D66775

Added:
cfe/trunk/include/clang-c/FatalErrorHandler.h
cfe/trunk/tools/libclang/FatalErrorHandler.cpp
cfe/trunk/unittests/libclang/CrashTests/
cfe/trunk/unittests/libclang/CrashTests/CMakeLists.txt
cfe/trunk/unittests/libclang/CrashTests/LibclangCrashTest.cpp
Modified:
cfe/trunk/tools/libclang/CIndex.cpp
cfe/trunk/tools/libclang/CMakeLists.txt
cfe/trunk/tools/libclang/libclang.exports
cfe/trunk/unittests/libclang/CMakeLists.txt

Added: cfe/trunk/include/clang-c/FatalErrorHandler.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/FatalErrorHandler.h?rev=371787=auto
==
--- cfe/trunk/include/clang-c/FatalErrorHandler.h (added)
+++ cfe/trunk/include/clang-c/FatalErrorHandler.h Thu Sep 12 15:55:55 2019
@@ -0,0 +1,33 @@
+/*===-- clang-c/FatalErrorHandler.h - Fatal Error Handling *- C 
-*-===*\
+|*
*|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM  
*|
+|* Exceptions.
*|
+|* See https://llvm.org/LICENSE.txt for license information.  
*|
+|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*|
+|*
*|
+\*===--===*/
+
+#ifndef LLVM_CLANG_C_FATAL_ERROR_HANDLER_H
+#define LLVM_CLANG_C_FATAL_ERROR_HANDLER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Installs error handler that prints error message to stderr and calls 
abort().
+ * Replaces currently installed error handler (if any).
+ */
+void clang_install_aborting_llvm_fatal_error_handler();
+
+/**
+ * Removes currently installed error handler (if any).
+ * If no error handler is intalled, the default strategy is to print error
+ * message to stderr and call exit(1).
+ */
+void clang_uninstall_llvm_fatal_error_handler();
+
+#ifdef __cplusplus
+}
+#endif
+#endif

Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=371787=371786=371787=diff
==
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Thu Sep 12 15:55:55 2019
@@ -20,6 +20,7 @@
 #include "CXTranslationUnit.h"
 #include "CXType.h"
 #include "CursorVisitor.h"
+#include "clang-c/FatalErrorHandler.h"
 #include "clang/AST/Attr.h"
 #include "clang/AST/Mangle.h"
 #include "clang/AST/StmtVisitor.h"
@@ -3243,18 +3244,10 @@ RefNamePieces buildPieces(unsigned NameF
 // Misc. API hooks.
 
//===--===//
   
 
-static void fatal_error_handler(void *user_data, const std::string& reason,
-bool gen_crash_diag) {
-  // Write the result out to stderr avoiding errs() because raw_ostreams can
-  // call report_fatal_error.
-  fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
-  ::abort();
-}
-
 namespace {
 struct RegisterFatalErrorHandler {
   RegisterFatalErrorHandler() {
-llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
+clang_install_aborting_llvm_fatal_error_handler();
   }
 };
 }

Modified: cfe/trunk/tools/libclang/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CMakeLists.txt?rev=371787=371786=371787=diff
==
--- cfe/trunk/tools/libclang/CMakeLists.txt (original)
+++ cfe/trunk/tools/libclang/CMakeLists.txt Thu Sep 12 15:55:55 2019
@@ -19,6 +19,7 @@ set(SOURCES
   CXString.cpp
   CXType.cpp
   Indexing.cpp
+  FatalErrorHandler.cpp
 
   ADDITIONAL_HEADERS
   CIndexDiagnostic.h
@@ -43,6 +44,7 @@ set(LIBS
   clangSema
   clangSerialization
   clangTooling
+  LLVMSupport
 )
 
 if (CLANG_ENABLE_ARCMT)

Added: cfe/trunk/tools/libclang/FatalErrorHandler.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/FatalErrorHandler.cpp?rev=371787=auto
==
--- cfe/trunk/tools/libclang/FatalErrorHandler.cpp (added)
+++ cfe/trunk/tools/libclang/FatalErrorHandler.cpp Thu Sep 12 15:55:55 2019
@@ -0,0 +1,28 @@
+/*===-- clang-c/FatalErrorHandler.cpp - Fatal Error Handling --*- C 
-*-===*\
+|*
*|
+|* Part of the LLVM Project, under the Apache License v2.0 with LLVM  
*|
+|* Exceptions. 

r371697 - [clang-scan-deps] Add dependency targets

2019-09-11 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Wed Sep 11 17:48:45 2019
New Revision: 371697

URL: http://llvm.org/viewvc/llvm-project?rev=371697=rev
Log:
[clang-scan-deps] Add dependency targets

Differential Revision: https://reviews.llvm.org/D67475

Modified:
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
cfe/trunk/test/ClangScanDeps/header_stat_before_open.m
cfe/trunk/test/ClangScanDeps/regular_cdb.cpp
cfe/trunk/test/ClangScanDeps/subframework_header_dir_symlink.m
cfe/trunk/test/ClangScanDeps/vfsoverlay.cpp
cfe/trunk/tools/clang-scan-deps/ClangScanDeps.cpp

Modified: 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json?rev=371697=371696=371697=diff
==
--- 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json 
(original)
+++ 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json 
Wed Sep 11 17:48:45 2019
@@ -2,11 +2,11 @@
 {
   "directory": "DIR",
   "command": "clang -E DIR/subframework_header_dir_symlink_input.m -D EMPTY 
-iframework Inputs/frameworks",
-  "file": "DIR/subframework_header_dir_symlink.m"
+  "file": "DIR/subframework_header_dir_symlink_input.m"
 },
 {
   "directory": "DIR",
   "command": "clang -E DIR/subframework_header_dir_symlink_input2.m 
-FInputs/frameworks -iframework Inputs/frameworks_symlink",
-  "file": "DIR/subframework_header_dir_symlink2.m"
+  "file": "DIR/subframework_header_dir_symlink_input2.m"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json?rev=371697=371696=371697=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json (original)
+++ cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json Wed Sep 11 17:48:45 
2019
@@ -2,11 +2,11 @@
 {
   "directory": "DIR",
   "command": "clang -E DIR/symlink_input.cpp -IInputs",
-  "file": "DIR/symlink.cpp"
+  "file": "DIR/symlink_input.cpp"
 },
 {
   "directory": "DIR",
   "command": "clang -E DIR/symlink_input2.cpp -IInputs",
-  "file": "DIR/symlink2.cpp"
+  "file": "DIR/symlink_input2.cpp"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json?rev=371697=371696=371697=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json (original)
+++ cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json Wed Sep 11 17:48:45 
2019
@@ -2,6 +2,6 @@
 {
   "directory": "DIR",
   "command": "clang -E DIR/vfsoverlay_input.cpp -IInputs -ivfsoverlay 
DIR/vfsoverlay.yaml",
-  "file": "DIR/vfsoverlay.cpp"
+  "file": "DIR/vfsoverlay_input.cpp"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/header_stat_before_open.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/header_stat_before_open.m?rev=371697=371696=371697=diff
==
--- cfe/trunk/test/ClangScanDeps/header_stat_before_open.m (original)
+++ cfe/trunk/test/ClangScanDeps/header_stat_before_open.m Wed Sep 11 17:48:45 
2019
@@ -12,7 +12,7 @@
 #include "Framework/Framework.h"
 #include "Framework/PrivateHeader.h"
 
-// CHECK: clang-scan-deps dependency
+// CHECK: header_stat_before_open_input.o
 // CHECK-NEXT: header_stat_before_open_input.m
 // CHECK-NEXT: 
Inputs{{/|\\}}frameworks{{/|\\}}Framework.framework{{/|\\}}Headers{{/|\\}}Framework.h
 // CHECK-NEXT: 
Inputs{{/|\\}}frameworks{{/|\\}}Framework.framework{{/|\\}}PrivateHeaders{{/|\\}}PrivateHeader.h

Modified: cfe/trunk/test/ClangScanDeps/regular_cdb.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/regular_cdb.cpp?rev=371697=371696=371697=diff
==
--- cfe/trunk/test/ClangScanDeps/regular_cdb.cpp (original)
+++ cfe/trunk/test/ClangScanDeps/regular_cdb.cpp Wed Sep 11 17:48:45 2019
@@ -36,6 +36,7 @@
 #include "header.h"
 
 // CHECK1: regular_cdb_input2.cpp
+// CHECK1-NEXT: regular_cdb_input2.cpp
 // CHECK1-NEXT: Inputs{{/|\\}}header.h
 // CHECK1-NEXT: Inputs{{/|\\}}header2.h
 

Modified: cfe/trunk/test/ClangScanDeps/subframework_header_dir_symlink.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/subframework_header_dir_symlink.m?rev=371697=371696=371697=diff
==
--- cfe/trunk/test/ClangScanDeps/subframework_header_dir_symlink.m (original)
+++ 

r371578 - [clang-scan-deps][NFC] Fix tests - prevent FileCheck matching test dir path

2019-09-10 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Sep 10 17:30:26 2019
New Revision: 371578

URL: http://llvm.org/viewvc/llvm-project?rev=371578=rev
Log:
[clang-scan-deps][NFC] Fix tests - prevent FileCheck matching test dir path

Differential Revision: https://reviews.llvm.org/D67379

Modified:
cfe/trunk/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/no-werror.json
cfe/trunk/test/ClangScanDeps/Inputs/regular_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json
cfe/trunk/test/ClangScanDeps/Inputs/vfsoverlay_cdb.json
cfe/trunk/test/ClangScanDeps/error.cpp
cfe/trunk/test/ClangScanDeps/header_stat_before_open.m
cfe/trunk/test/ClangScanDeps/no-werror.cpp
cfe/trunk/test/ClangScanDeps/regular_cdb.cpp
cfe/trunk/test/ClangScanDeps/subframework_header_dir_symlink.m
cfe/trunk/test/ClangScanDeps/symlink.cpp
cfe/trunk/test/ClangScanDeps/vfsoverlay.cpp

Modified: cfe/trunk/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json?rev=371578=371577=371578=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json 
(original)
+++ cfe/trunk/test/ClangScanDeps/Inputs/header_stat_before_open_cdb.json Tue 
Sep 10 17:30:26 2019
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/header_stat_before_open.m -iframework 
Inputs/frameworks",
-  "file": "DIR/header_stat_before_open.m"
+  "command": "clang -E DIR/header_stat_before_open_input.m -iframework 
Inputs/frameworks",
+  "file": "DIR/header_stat_before_open_input.m"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/Inputs/no-werror.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/no-werror.json?rev=371578=371577=371578=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/no-werror.json (original)
+++ cfe/trunk/test/ClangScanDeps/Inputs/no-werror.json Tue Sep 10 17:30:26 2019
@@ -1,7 +1,7 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/no-werror.cpp -IInputs -std=c++17 -Weverything 
-Werror",
+  "command": "clang -E DIR/no-werror_input.cpp -IInputs -std=c++17 
-Weverything -Werror",
   "file": "DIR/no-werror.cpp"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/Inputs/regular_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/regular_cdb.json?rev=371578=371577=371578=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/regular_cdb.json (original)
+++ cfe/trunk/test/ClangScanDeps/Inputs/regular_cdb.json Tue Sep 10 17:30:26 
2019
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E -fsyntax-only DIR/regular_cdb2.cpp -IInputs -D 
INCLUDE_HEADER2 -MD -MF DIR/regular_cdb2.d",
-  "file": "DIR/regular_cdb2.cpp"
+  "command": "clang -E -fsyntax-only DIR/regular_cdb_input2.cpp -IInputs -D 
INCLUDE_HEADER2 -MD -MF DIR/regular_cdb2.d",
+  "file": "DIR/regular_cdb_input2.cpp"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/regular_cdb.cpp -IInputs",
-  "file": "DIR/regular_cdb.cpp"
+  "command": "clang -E DIR/regular_cdb_input.cpp -IInputs",
+  "file": "DIR/regular_cdb_input.cpp"
 }
 ]

Modified: 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json?rev=371578=371577=371578=diff
==
--- 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json 
(original)
+++ 
cfe/trunk/test/ClangScanDeps/Inputs/subframework_header_dir_symlink_cdb.json 
Tue Sep 10 17:30:26 2019
@@ -1,12 +1,12 @@
 [
 {
   "directory": "DIR",
-  "command": "clang -E DIR/subframework_header_dir_symlink.m -D EMPTY 
-iframework Inputs/frameworks",
+  "command": "clang -E DIR/subframework_header_dir_symlink_input.m -D EMPTY 
-iframework Inputs/frameworks",
   "file": "DIR/subframework_header_dir_symlink.m"
 },
 {
   "directory": "DIR",
-  "command": "clang -E DIR/subframework_header_dir_symlink2.m 
-FInputs/frameworks -iframework Inputs/frameworks_symlink",
+  "command": "clang -E DIR/subframework_header_dir_symlink_input2.m 
-FInputs/frameworks -iframework Inputs/frameworks_symlink",
   "file": "DIR/subframework_header_dir_symlink2.m"
 }
 ]

Modified: cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json?rev=371578=371577=371578=diff
==
--- cfe/trunk/test/ClangScanDeps/Inputs/symlink_cdb.json 

r371279 - [clang][DependencyFileGenerator] Fix missing -MT option handling

2019-09-06 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Sep  6 17:59:13 2019
New Revision: 371279

URL: http://llvm.org/viewvc/llvm-project?rev=371279=rev
Log:
[clang][DependencyFileGenerator] Fix missing -MT option handling

Targets in DependencyFileGenerator don't necessarily come from -MT option.

Differential Revision: https://reviews.llvm.org/D67308

Modified:
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/Frontend/DependencyFile.cpp

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=371279=371278=371279=diff
==
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Sep  6 17:59:13 2019
@@ -3406,6 +3406,11 @@ bool CompilerInvocation::CreateFromArgs(
   Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags);
   Success &= ParseMigratorArgs(Res.getMigratorOpts(), Args);
   ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), Args);
+  if (!Res.getDependencyOutputOpts().OutputFile.empty() &&
+  Res.getDependencyOutputOpts().Targets.empty()) {
+Diags.Report(diag::err_fe_dependency_file_requires_MT);
+Success = false;
+  }
   Success &=
   ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, ,
   false /*DefaultDiagColor*/, false 
/*DefaultShowOpt*/);

Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=371279=371278=371279=diff
==
--- cfe/trunk/lib/Frontend/DependencyFile.cpp (original)
+++ cfe/trunk/lib/Frontend/DependencyFile.cpp Fri Sep  6 17:59:13 2019
@@ -192,11 +192,6 @@ DependencyFileGenerator::DependencyFileG
 }
 
 void DependencyFileGenerator::attachToPreprocessor(Preprocessor ) {
-  if (Targets.empty()) {
-PP.getDiagnostics().Report(diag::err_fe_dependency_file_requires_MT);
-return;
-  }
-
   // Disable the "file not found" diagnostic if the -MG option was given.
   if (AddMissingHeaderDeps)
 PP.SetSuppressIncludeNotFoundError(true);


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r371250 - [clang][Index][NFC] Put IndexingOptions to a separate header

2019-09-06 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Sep  6 13:08:32 2019
New Revision: 371250

URL: http://llvm.org/viewvc/llvm-project?rev=371250=rev
Log:
[clang][Index][NFC] Put IndexingOptions to a separate header

Added:
cfe/trunk/include/clang/Index/IndexingOptions.h
Modified:
cfe/trunk/include/clang/Index/IndexingAction.h

Modified: cfe/trunk/include/clang/Index/IndexingAction.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexingAction.h?rev=371250=371249=371250=diff
==
--- cfe/trunk/include/clang/Index/IndexingAction.h (original)
+++ cfe/trunk/include/clang/Index/IndexingAction.h Fri Sep  6 13:08:32 2019
@@ -11,6 +11,7 @@
 
 #include "clang/AST/ASTConsumer.h"
 #include "clang/Basic/LLVM.h"
+#include "clang/Index/IndexingOptions.h"
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/Preprocessor.h"
 #include "llvm/ADT/ArrayRef.h"
@@ -31,26 +32,6 @@ namespace serialization {
 namespace index {
   class IndexDataConsumer;
 
-struct IndexingOptions {
-  enum class SystemSymbolFilterKind {
-None,
-DeclarationsOnly,
-All,
-  };
-
-  SystemSymbolFilterKind SystemSymbolFilter
-= SystemSymbolFilterKind::DeclarationsOnly;
-  bool IndexFunctionLocals = false;
-  bool IndexImplicitInstantiation = false;
-  // Whether to index macro definitions in the Preprocesor when preprocessor
-  // callback is not available (e.g. after parsing has finished). Note that
-  // macro references are not available in Proprocessor.
-  bool IndexMacrosInPreprocessor = false;
-  // Has no effect if IndexFunctionLocals are false.
-  bool IndexParametersInDeclarations = false;
-  bool IndexTemplateParameters = false;
-};
-
 /// Creates an ASTConsumer that indexes all symbols (macros and AST decls).
 std::unique_ptr createIndexingASTConsumer(
 std::shared_ptr DataConsumer,

Added: cfe/trunk/include/clang/Index/IndexingOptions.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexingOptions.h?rev=371250=auto
==
--- cfe/trunk/include/clang/Index/IndexingOptions.h (added)
+++ cfe/trunk/include/clang/Index/IndexingOptions.h Fri Sep  6 13:08:32 2019
@@ -0,0 +1,42 @@
+//===--- IndexingOptions.h - Options for indexing ---*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_INDEX_INDEXINGOPTIONS_H
+#define LLVM_CLANG_INDEX_INDEXINGOPTIONS_H
+
+#include "clang/Frontend/FrontendOptions.h"
+#include 
+#include 
+
+namespace clang {
+namespace index {
+
+struct IndexingOptions {
+  enum class SystemSymbolFilterKind {
+None,
+DeclarationsOnly,
+All,
+  };
+
+  SystemSymbolFilterKind SystemSymbolFilter =
+  SystemSymbolFilterKind::DeclarationsOnly;
+  bool IndexFunctionLocals = false;
+  bool IndexImplicitInstantiation = false;
+  // Whether to index macro definitions in the Preprocesor when preprocessor
+  // callback is not available (e.g. after parsing has finished). Note that
+  // macro references are not available in Proprocessor.
+  bool IndexMacrosInPreprocessor = false;
+  // Has no effect if IndexFunctionLocals are false.
+  bool IndexParametersInDeclarations = false;
+  bool IndexTemplateParameters = false;
+};
+
+} // namespace index
+} // namespace clang
+
+#endif // LLVM_CLANG_INDEX_INDEXINGOPTIONS_H


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] r371250 - [clang][Index][NFC] Put IndexingOptions to a separate header

2019-09-06 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Sep  6 13:08:32 2019
New Revision: 371250

URL: http://llvm.org/viewvc/llvm-project?rev=371250=rev
Log:
[clang][Index][NFC] Put IndexingOptions to a separate header

Modified:
clang-tools-extra/trunk/clangd/XRefs.cpp
clang-tools-extra/trunk/clangd/index/FileIndex.cpp
clang-tools-extra/trunk/clangd/index/IndexAction.cpp
clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp

Modified: clang-tools-extra/trunk/clangd/XRefs.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=371250=371249=371250=diff
==
--- clang-tools-extra/trunk/clangd/XRefs.cpp (original)
+++ clang-tools-extra/trunk/clangd/XRefs.cpp Fri Sep  6 13:08:32 2019
@@ -33,6 +33,7 @@
 #include "clang/Index/IndexDataConsumer.h"
 #include "clang/Index/IndexSymbol.h"
 #include "clang/Index/IndexingAction.h"
+#include "clang/Index/IndexingOptions.h"
 #include "clang/Index/USRGeneration.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/None.h"

Modified: clang-tools-extra/trunk/clangd/index/FileIndex.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/FileIndex.cpp?rev=371250=371249=371250=diff
==
--- clang-tools-extra/trunk/clangd/index/FileIndex.cpp (original)
+++ clang-tools-extra/trunk/clangd/index/FileIndex.cpp Fri Sep  6 13:08:32 2019
@@ -17,6 +17,7 @@
 #include "index/SymbolOrigin.h"
 #include "index/dex/Dex.h"
 #include "clang/Index/IndexingAction.h"
+#include "clang/Index/IndexingOptions.h"
 #include "clang/Lex/MacroInfo.h"
 #include "clang/Lex/Preprocessor.h"
 #include "llvm/ADT/DenseMap.h"

Modified: clang-tools-extra/trunk/clangd/index/IndexAction.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/IndexAction.cpp?rev=371250=371249=371250=diff
==
--- clang-tools-extra/trunk/clangd/index/IndexAction.cpp (original)
+++ clang-tools-extra/trunk/clangd/index/IndexAction.cpp Fri Sep  6 13:08:32 
2019
@@ -18,6 +18,7 @@
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/MultiplexConsumer.h"
 #include "clang/Index/IndexingAction.h"
+#include "clang/Index/IndexingOptions.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/ADT/STLExtras.h"
 #include 

Modified: clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp?rev=371250=371249=371250=diff
==
--- clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/SymbolCollectorTests.cpp Fri Sep  
6 13:08:32 2019
@@ -14,6 +14,7 @@
 #include "clang/Basic/FileSystemOptions.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Index/IndexingAction.h"
+#include "clang/Index/IndexingOptions.h"
 #include "clang/Tooling/Tooling.h"
 #include "llvm/ADT/IntrusiveRefCntPtr.h"
 #include "llvm/ADT/STLExtras.h"


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r371117 - [clang][Index] Replace CodegenNameGenerator with ASTNameGenerator

2019-09-05 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Sep  5 13:33:52 2019
New Revision: 371117

URL: http://llvm.org/viewvc/llvm-project?rev=371117=rev
Log:
[clang][Index] Replace CodegenNameGenerator with ASTNameGenerator

Follow-up to: 3ff8c3b73f6, d5d15b4c1fd

Should be NFC since the original patch just moved the code.

Removed:
cfe/trunk/include/clang/Index/CodegenNameGenerator.h
cfe/trunk/lib/Index/CodegenNameGenerator.cpp
Modified:
cfe/trunk/lib/Index/CMakeLists.txt
cfe/trunk/tools/c-index-test/core_main.cpp
cfe/trunk/tools/libclang/CIndex.cpp

Removed: cfe/trunk/include/clang/Index/CodegenNameGenerator.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/CodegenNameGenerator.h?rev=371116=auto
==
--- cfe/trunk/include/clang/Index/CodegenNameGenerator.h (original)
+++ cfe/trunk/include/clang/Index/CodegenNameGenerator.h (removed)
@@ -1,52 +0,0 @@
-//===- CodegenNameGenerator.h - Codegen name generation 
---===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===--===//
-//
-// Determines the name that the symbol will get for code generation.
-//
-//===--===//
-
-#ifndef LLVM_CLANG_INDEX_CODEGENNAMEGENERATOR_H
-#define LLVM_CLANG_INDEX_CODEGENNAMEGENERATOR_H
-
-#include "clang/AST/Mangle.h"
-#include "clang/Basic/LLVM.h"
-#include 
-#include 
-#include 
-
-namespace clang {
-  class ASTContext;
-  class Decl;
-
-namespace index {
-
-class CodegenNameGenerator {
-public:
-  explicit CodegenNameGenerator(ASTContext );
-  ~CodegenNameGenerator();
-
-  /// \returns true on failure to produce a name for the given decl, false on
-  /// success.
-  bool writeName(const Decl *D, raw_ostream );
-
-  /// Version of \c writeName function that returns a string.
-  std::string getName(const Decl *D);
-
-  /// This can return multiple mangled names when applicable, e.g. for C++
-  /// constructors/destructors.
-  std::vector getAllManglings(const Decl *D);
-
-private:
-  struct Implementation;
-  std::unique_ptr Impl;
-};
-
-} // namespace index
-} // namespace clang
-
-#endif // LLVM_CLANG_INDEX_CODEGENNAMEGENERATOR_H

Modified: cfe/trunk/lib/Index/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/CMakeLists.txt?rev=371117=371116=371117=diff
==
--- cfe/trunk/lib/Index/CMakeLists.txt (original)
+++ cfe/trunk/lib/Index/CMakeLists.txt Thu Sep  5 13:33:52 2019
@@ -4,7 +4,6 @@ set(LLVM_LINK_COMPONENTS
   )
 
 add_clang_library(clangIndex
-  CodegenNameGenerator.cpp
   CommentToXML.cpp
   FileIndexRecord.cpp
   IndexBody.cpp

Removed: cfe/trunk/lib/Index/CodegenNameGenerator.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/CodegenNameGenerator.cpp?rev=371116=auto
==
--- cfe/trunk/lib/Index/CodegenNameGenerator.cpp (original)
+++ cfe/trunk/lib/Index/CodegenNameGenerator.cpp (removed)
@@ -1,36 +0,0 @@
-//===- CodegenNameGenerator.cpp - Codegen name generation 
-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===--===//
-//
-// Determines the name that the symbol will get for code generation.
-//
-//===--===//
-
-#include "clang/Index/CodegenNameGenerator.h"
-#include "clang/AST/ASTContext.h"
-
-using namespace clang;
-using namespace clang::index;
-
-CodegenNameGenerator::CodegenNameGenerator(ASTContext )
-  : Impl(new ASTNameGenerator(Ctx)) {
-}
-
-CodegenNameGenerator::~CodegenNameGenerator() {
-}
-
-bool CodegenNameGenerator::writeName(const Decl *D, raw_ostream ) {
-  return Impl->writeName(D, OS);
-}
-
-std::string CodegenNameGenerator::getName(const Decl *D) {
-  return Impl->getName(D);
-}
-
-std::vector CodegenNameGenerator::getAllManglings(const Decl *D) {
-  return Impl->getAllManglings(D);
-}

Modified: cfe/trunk/tools/c-index-test/core_main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=371117=371116=371117=diff
==
--- cfe/trunk/tools/c-index-test/core_main.cpp (original)
+++ cfe/trunk/tools/c-index-test/core_main.cpp Thu Sep  5 13:33:52 2019
@@ -6,6 +6,7 @@
 //
 
//===--===//
 
+#include "clang/AST/Mangle.h"

r371112 - [AST][NFC] Doc comments for ASTNameGenerator

2019-09-05 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Sep  5 13:04:11 2019
New Revision: 371112

URL: http://llvm.org/viewvc/llvm-project?rev=371112=rev
Log:
[AST][NFC] Doc comments for ASTNameGenerator

Modified:
cfe/trunk/include/clang/AST/Mangle.h

Modified: cfe/trunk/include/clang/AST/Mangle.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Mangle.h?rev=371112=37=371112=diff
==
--- cfe/trunk/include/clang/AST/Mangle.h (original)
+++ cfe/trunk/include/clang/AST/Mangle.h Thu Sep  5 13:04:11 2019
@@ -250,8 +250,16 @@ class ASTNameGenerator {
 public:
   explicit ASTNameGenerator(ASTContext );
   ~ASTNameGenerator();
+
+  /// Writes name for \p D to \p OS.
+  /// \returns true on failure, false on success.
   bool writeName(const Decl *D, raw_ostream );
+
+  /// \returns name for \p D
   std::string getName(const Decl *D);
+
+  /// \returns all applicable mangled names.
+  /// For example C++ constructors/destructors can have multiple.
   std::vector getAllManglings(const Decl *D);
 
 private:


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r370825 - [libclang][test][NFC] Split off fixture from tests.

2019-09-03 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Sep  3 15:01:46 2019
New Revision: 370825

URL: http://llvm.org/viewvc/llvm-project?rev=370825=rev
Log:
[libclang][test][NFC] Split off fixture from tests.

Added:
cfe/trunk/unittests/libclang/TestUtils.h
Modified:
cfe/trunk/unittests/libclang/LibclangTest.cpp

Modified: cfe/trunk/unittests/libclang/LibclangTest.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/LibclangTest.cpp?rev=370825=370824=370825=diff
==
--- cfe/trunk/unittests/libclang/LibclangTest.cpp (original)
+++ cfe/trunk/unittests/libclang/LibclangTest.cpp Tue Sep  3 15:01:46 2019
@@ -13,6 +13,7 @@
 #include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
+#include "TestUtils.h"
 #include 
 #include 
 #include 
@@ -352,77 +353,6 @@ TEST(libclang, ModuleMapDescriptor) {
   clang_ModuleMapDescriptor_dispose(MMD);
 }
 
-class LibclangParseTest : public ::testing::Test {
-  std::set Files;
-  typedef std::unique_ptr fixed_addr_string;
-  std::map UnsavedFileContents;
-public:
-  std::string TestDir;
-  CXIndex Index;
-  CXTranslationUnit ClangTU;
-  unsigned TUFlags;
-  std::vector UnsavedFiles;
-
-  void SetUp() override {
-llvm::SmallString<256> Dir;
-ASSERT_FALSE(llvm::sys::fs::createUniqueDirectory("libclang-test", Dir));
-TestDir = Dir.str();
-TUFlags = CXTranslationUnit_DetailedPreprocessingRecord |
-  clang_defaultEditingTranslationUnitOptions();
-Index = clang_createIndex(0, 0);
-ClangTU = nullptr;
-  }
-  void TearDown() override {
-clang_disposeTranslationUnit(ClangTU);
-clang_disposeIndex(Index);
-for (const std::string  : Files)
-  llvm::sys::fs::remove(Path);
-llvm::sys::fs::remove(TestDir);
-  }
-  void WriteFile(std::string , const std::string ) {
-if (!llvm::sys::path::is_absolute(Filename)) {
-  llvm::SmallString<256> Path(TestDir);
-  llvm::sys::path::append(Path, Filename);
-  Filename = Path.str();
-  Files.insert(Filename);
-}
-llvm::sys::fs::create_directories(llvm::sys::path::parent_path(Filename));
-std::ofstream OS(Filename);
-OS << Contents;
-assert(OS.good());
-  }
-  void MapUnsavedFile(std::string Filename, const std::string ) {
-if (!llvm::sys::path::is_absolute(Filename)) {
-  llvm::SmallString<256> Path(TestDir);
-  llvm::sys::path::append(Path, Filename);
-  Filename = Path.str();
-}
-auto it = UnsavedFileContents.insert(std::make_pair(
-fixed_addr_string(new std::string(Filename)),
-fixed_addr_string(new std::string(Contents;
-UnsavedFiles.push_back({
-it.first->first->c_str(),   // filename
-it.first->second->c_str(),  // contents
-it.first->second->size()// length
-});
-  }
-  template
-  void Traverse(const F ) {
-CXCursor TuCursor = clang_getTranslationUnitCursor(ClangTU);
-std::reference_wrapper FunctorRef = std::cref(TraversalFunctor);
-clang_visitChildren(TuCursor,
->,
-);
-  }
-private:
-  template
-  static CXChildVisitResult TraverseStateless(CXCursor cx, CXCursor parent,
-  CXClientData data) {
-TState *State = static_cast(data);
-return State->get()(cx, parent);
-  }
-};
-
 TEST_F(LibclangParseTest, AllSkippedRanges) {
   std::string Header = "header.h", Main = "main.cpp";
   WriteFile(Header,

Added: cfe/trunk/unittests/libclang/TestUtils.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/TestUtils.h?rev=370825=auto
==
--- cfe/trunk/unittests/libclang/TestUtils.h (added)
+++ cfe/trunk/unittests/libclang/TestUtils.h Tue Sep  3 15:01:46 2019
@@ -0,0 +1,94 @@
+//===- unittests/libclang/TestUtils.h 
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TEST_TESTUTILS_H
+#define LLVM_CLANG_TEST_TESTUTILS_H
+
+#include "clang-c/Index.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+
+#include 
+#include 
+#include 
+#include 
+#include "gtest/gtest.h"
+
+class LibclangParseTest : public ::testing::Test {
+  std::set Files;
+  typedef std::unique_ptr fixed_addr_string;
+  std::map UnsavedFileContents;
+public:
+  std::string TestDir;
+  CXIndex Index;
+  CXTranslationUnit ClangTU;
+  unsigned TUFlags;
+  std::vector UnsavedFiles;
+
+  void SetUp() override {
+llvm::SmallString<256> Dir;
+ASSERT_FALSE(llvm::sys::fs::createUniqueDirectory("libclang-test", Dir));
+TestDir = Dir.str();
+TUFlags = CXTranslationUnit_DetailedPreprocessingRecord |
+  

r370116 - [clang][Index][NFC] Move IndexDataConsumer default implementation

2019-08-27 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Aug 27 14:49:39 2019
New Revision: 370116

URL: http://llvm.org/viewvc/llvm-project?rev=370116=rev
Log:
[clang][Index][NFC] Move IndexDataConsumer default implementation

Modified:
cfe/trunk/include/clang/Index/IndexDataConsumer.h
cfe/trunk/lib/Index/IndexingAction.cpp

Modified: cfe/trunk/include/clang/Index/IndexDataConsumer.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexDataConsumer.h?rev=370116=370115=370116=diff
==
--- cfe/trunk/include/clang/Index/IndexDataConsumer.h (original)
+++ cfe/trunk/include/clang/Index/IndexDataConsumer.h Tue Aug 27 14:49:39 2019
@@ -32,7 +32,7 @@ public:
 const DeclContext *ContainerDC;
   };
 
-  virtual ~IndexDataConsumer() {}
+  virtual ~IndexDataConsumer() = default;
 
   virtual void initialize(ASTContext ) {}
 
@@ -41,12 +41,16 @@ public:
   /// \returns true to continue indexing, or false to abort.
   virtual bool handleDeclOccurence(const Decl *D, SymbolRoleSet Roles,
ArrayRef Relations,
-   SourceLocation Loc, ASTNodeInfo ASTNode);
+   SourceLocation Loc, ASTNodeInfo ASTNode) {
+return true;
+  }
 
   /// \returns true to continue indexing, or false to abort.
   virtual bool handleMacroOccurence(const IdentifierInfo *Name,
 const MacroInfo *MI, SymbolRoleSet Roles,
-SourceLocation Loc);
+SourceLocation Loc) {
+return true;
+  }
 
   /// \returns true to continue indexing, or false to abort.
   ///
@@ -54,8 +58,10 @@ public:
   /// For "@import MyMod.SubMod", there will be a call for 'MyMod' with the
   /// 'reference' role, and a call for 'SubMod' with the 'declaration' role.
   virtual bool handleModuleOccurence(const ImportDecl *ImportD,
- const Module *Mod,
- SymbolRoleSet Roles, SourceLocation Loc);
+ const Module *Mod, SymbolRoleSet Roles,
+ SourceLocation Loc) {
+return true;
+  }
 
   virtual void finish() {}
 };

Modified: cfe/trunk/lib/Index/IndexingAction.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexingAction.cpp?rev=370116=370115=370116=diff
==
--- cfe/trunk/lib/Index/IndexingAction.cpp (original)
+++ cfe/trunk/lib/Index/IndexingAction.cpp Tue Aug 27 14:49:39 2019
@@ -21,27 +21,6 @@
 using namespace clang;
 using namespace clang::index;
 
-bool IndexDataConsumer::handleDeclOccurence(const Decl *D, SymbolRoleSet Roles,
-ArrayRef Relations,
-SourceLocation Loc,
-ASTNodeInfo ASTNode) {
-  return true;
-}
-
-bool IndexDataConsumer::handleMacroOccurence(const IdentifierInfo *Name,
- const MacroInfo *MI,
- SymbolRoleSet Roles,
- SourceLocation Loc) {
-  return true;
-}
-
-bool IndexDataConsumer::handleModuleOccurence(const ImportDecl *ImportD,
-  const Module *Mod,
-  SymbolRoleSet Roles,
-  SourceLocation Loc) {
-  return true;
-}
-
 namespace {
 
 class IndexASTConsumer : public ASTConsumer {


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r369931 - [libclang][index][NFCi] Refactor machinery for skipping function bodies

2019-08-26 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Aug 26 10:25:23 2019
New Revision: 369931

URL: http://llvm.org/viewvc/llvm-project?rev=369931=rev
Log:
[libclang][index][NFCi] Refactor machinery for skipping function bodies

Refactor machinery for skipping inline function bodies that have already
been parsed in other frontend actions.

Preparations for moving this code to libIndex.

Differential Revision: https://reviews.llvm.org/D66694

Modified:
cfe/trunk/tools/libclang/Indexing.cpp

Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=369931=369930=369931=diff
==
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Mon Aug 26 10:25:23 2019
@@ -120,43 +120,62 @@ namespace llvm {
 
 namespace {
 
-class SessionSkipBodyData {
+/// Keeps track of function bodies that have already been parsed.
+///
+/// Is thread-safe.
+class SharedParsedRegionsStorage {
   std::mutex Mux;
   PPRegionSetTy ParsedRegions;
 
 public:
-  ~SessionSkipBodyData() = default;
+  ~SharedParsedRegionsStorage() = default;
 
   void copyTo(PPRegionSetTy ) {
 std::lock_guard MG(Mux);
 Set = ParsedRegions;
   }
 
-  void update(ArrayRef Regions) {
+  void merge(ArrayRef Regions) {
 std::lock_guard MG(Mux);
 ParsedRegions.insert(Regions.begin(), Regions.end());
   }
 };
 
-class TUSkipBodyControl {
-  SessionSkipBodyData 
+/// Provides information whether source locations have already been parsed in
+/// another FrontendAction.
+///
+/// Is NOT thread-safe.
+class ParsedSrcLocationsTracker {
+  SharedParsedRegionsStorage 
   PPConditionalDirectiveRecord 
   Preprocessor 
 
+  /// Snapshot of the shared state at the point when this instance was
+  /// constructed.
   PPRegionSetTy ParsedRegions;
+  /// Regions that were queried during this instance lifetime.
   SmallVector NewParsedRegions;
+
+  /// Caching the last queried region.
   PPRegion LastRegion;
   bool LastIsParsed;
 
 public:
-  TUSkipBodyControl(SessionSkipBodyData ,
-PPConditionalDirectiveRecord ,
-Preprocessor )
-: SessionData(sessionData), PPRec(ppRec), PP(pp) {
-SessionData.copyTo(ParsedRegions);
+  /// Creates snapshot of \p ParsedRegionsStorage.
+  ParsedSrcLocationsTracker(SharedParsedRegionsStorage ,
+PPConditionalDirectiveRecord ,
+Preprocessor )
+  : ParsedRegionsStorage(ParsedRegionsStorage), PPRec(ppRec), PP(pp) {
+ParsedRegionsStorage.copyTo(ParsedRegions);
   }
 
-  bool isParsed(SourceLocation Loc, FileID FID, const FileEntry *FE) {
+  /// \returns true iff \p Loc has already been parsed.
+  ///
+  /// Can provide false-negative in case the location was parsed after this
+  /// instance had been constructed.
+  bool hasAlredyBeenParsed(SourceLocation Loc, FileID FID,
+   const FileEntry *FE) {
+assert(FE);
 PPRegion region = getRegion(Loc, FID, FE);
 if (region.isInvalid())
   return false;
@@ -166,40 +185,42 @@ public:
   return LastIsParsed;
 
 LastRegion = region;
+// Source locations can't be revisited during single TU parsing.
+// That means if we hit the same region again, it's a different location in
+// the same region and so the "is parsed" value from the snapshot is still
+// correct.
 LastIsParsed = ParsedRegions.count(region);
 if (!LastIsParsed)
-  NewParsedRegions.push_back(region);
+  NewParsedRegions.emplace_back(std::move(region));
 return LastIsParsed;
   }
 
-  void finished() {
-SessionData.update(NewParsedRegions);
-  }
+  /// Updates ParsedRegionsStorage with newly parsed regions.
+  void syncWithStorage() { ParsedRegionsStorage.merge(NewParsedRegions); }
 
 private:
   PPRegion getRegion(SourceLocation Loc, FileID FID, const FileEntry *FE) {
-SourceLocation RegionLoc = PPRec.findConditionalDirectiveRegionLoc(Loc);
-if (RegionLoc.isInvalid()) {
+assert(FE);
+auto Bail = [this, FE]() {
   if (isParsedOnceInclude(FE)) {
 const llvm::sys::fs::UniqueID  = FE->getUniqueID();
 return PPRegion(ID, 0, FE->getModificationTime());
   }
   return PPRegion();
-}
+};
 
-const SourceManager  = PPRec.getSourceManager();
+SourceLocation RegionLoc = PPRec.findConditionalDirectiveRegionLoc(Loc);
 assert(RegionLoc.isFileID());
+if (RegionLoc.isInvalid())
+  return Bail();
+
 FileID RegionFID;
 unsigned RegionOffset;
-std::tie(RegionFID, RegionOffset) = SM.getDecomposedLoc(RegionLoc);
+std::tie(RegionFID, RegionOffset) =
+PPRec.getSourceManager().getDecomposedLoc(RegionLoc);
 
-if (RegionFID != FID) {
-  if (isParsedOnceInclude(FE)) {
-const llvm::sys::fs::UniqueID  = FE->getUniqueID();
-return PPRegion(ID, 0, FE->getModificationTime());
-  }
-  

r369822 - [libclang][index][NFC] Fix test for skipping already parsed function bodies

2019-08-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Fri Aug 23 15:51:23 2019
New Revision: 369822

URL: http://llvm.org/viewvc/llvm-project?rev=369822=rev
Log:
[libclang][index][NFC] Fix test for skipping already parsed function bodies

Modified:
cfe/trunk/test/Index/skip-parsed-bodies/compile_commands.json

Modified: cfe/trunk/test/Index/skip-parsed-bodies/compile_commands.json
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/skip-parsed-bodies/compile_commands.json?rev=369822=369821=369822=diff
==
--- cfe/trunk/test/Index/skip-parsed-bodies/compile_commands.json (original)
+++ cfe/trunk/test/Index/skip-parsed-bodies/compile_commands.json Fri Aug 23 
15:51:23 2019
@@ -12,7 +12,7 @@
 {
   "directory": ".",
   "command": "/usr/bin/clang++ -fsyntax-only -fno-ms-compatibility 
-fno-delayed-template-parsing t3.cpp -DBLAH",
-  "file": "t2.cpp"
+  "file": "t3.cpp"
 }
 ]
 


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r369714 - [libclang][NFC] Remove debug comment

2019-08-22 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Aug 22 16:29:10 2019
New Revision: 369714

URL: http://llvm.org/viewvc/llvm-project?rev=369714=rev
Log:
[libclang][NFC] Remove debug comment

Modified:
cfe/trunk/tools/libclang/Indexing.cpp

Modified: cfe/trunk/tools/libclang/Indexing.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=369714=369713=369714=diff
==
--- cfe/trunk/tools/libclang/Indexing.cpp (original)
+++ cfe/trunk/tools/libclang/Indexing.cpp Thu Aug 22 16:29:10 2019
@@ -125,9 +125,7 @@ class SessionSkipBodyData {
   PPRegionSetTy ParsedRegions;
 
 public:
-  ~SessionSkipBodyData() {
-//llvm::errs() << "RegionData: " << Skipped.size() << " - " << 
Skipped.getMemorySize() << "\n";
-  }
+  ~SessionSkipBodyData() = default;
 
   void copyTo(PPRegionSetTy ) {
 std::lock_guard MG(Mux);


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r368762 - [clang][DirectoryWatcher] Fix Windows stub after LLVM change

2019-08-13 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Aug 13 15:39:50 2019
New Revision: 368762

URL: http://llvm.org/viewvc/llvm-project?rev=368762=rev
Log:
[clang][DirectoryWatcher] Fix Windows stub after LLVM change

r367979 changed DirectoryWatcher::Create to return an llvm::Expected.
Adjust the Windows stub accordingly.

(upstreamed from github.com/apple/swift-clang)

Modified:
cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp

Modified: cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp?rev=368762=368761=368762=diff
==
--- cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp 
(original)
+++ cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp Tue Aug 
13 15:39:50 2019
@@ -40,9 +40,11 @@ public:
 };
 } // namespace
 
-std::unique_ptr clang::DirectoryWatcher::create(
+llvm::Expected>
+clang::DirectoryWatcher::create(
 StringRef Path,
 std::function, bool)> 
Receiver,
 bool WaitForInitialSync) {
-return nullptr;
+  return llvm::Expected>(
+  llvm::errorCodeToError(std::make_error_code(std::errc::not_supported)));
 }


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r368761 - [clang] DirectoryWatcher for Windows stubs (to fix build break).

2019-08-13 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Aug 13 15:39:26 2019
New Revision: 368761

URL: http://llvm.org/viewvc/llvm-project?rev=368761=rev
Log:
[clang] DirectoryWatcher for Windows stubs (to fix build break).

This is just a code skeleton for DirectoryWatcher-windows.cpp so the
build on Windows stops breaking.

(upstreamed from github.com/apple/swift-clang)

Added:
cfe/trunk/lib/DirectoryWatcher/windows/
cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp
Modified:
cfe/trunk/lib/DirectoryWatcher/CMakeLists.txt

Modified: cfe/trunk/lib/DirectoryWatcher/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/DirectoryWatcher/CMakeLists.txt?rev=368761=368760=368761=diff
==
--- cfe/trunk/lib/DirectoryWatcher/CMakeLists.txt (original)
+++ cfe/trunk/lib/DirectoryWatcher/CMakeLists.txt Tue Aug 13 15:39:26 2019
@@ -17,6 +17,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux"
 list(APPEND DIRECTORY_WATCHER_SOURCES linux/DirectoryWatcher-linux.cpp)
 find_package(Threads REQUIRED)
   endif()
+elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
+  list(APPEND DIRECTORY_WATCHER_SOURCES windows/DirectoryWatcher-windows.cpp)
 else()
   list(APPEND DIRECTORY_WATCHER_SOURCES 
default/DirectoryWatcher-not-implemented.cpp)
 endif()

Added: cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp?rev=368761=auto
==
--- cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp (added)
+++ cfe/trunk/lib/DirectoryWatcher/windows/DirectoryWatcher-windows.cpp Tue Aug 
13 15:39:26 2019
@@ -0,0 +1,48 @@
+//===- DirectoryWatcher-windows.cpp - Windows-platform directory watching 
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+// TODO: This is not yet an implementation, but it will make it so Windows
+//   builds don't fail.
+
+#include "DirectoryScanner.h"
+#include "clang/DirectoryWatcher/DirectoryWatcher.h"
+
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/ScopeExit.h"
+#include "llvm/Support/AlignOf.h"
+#include "llvm/Support/Errno.h"
+#include "llvm/Support/Mutex.h"
+#include "llvm/Support/Path.h"
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+namespace {
+
+using namespace llvm;
+using namespace clang;
+
+class DirectoryWatcherWindows : public clang::DirectoryWatcher {
+public:
+  ~DirectoryWatcherWindows() override { }
+  void InitialScan() { }
+  void EventReceivingLoop() { }
+  void StopWork() { }
+};
+} // namespace
+
+std::unique_ptr clang::DirectoryWatcher::create(
+StringRef Path,
+std::function, bool)> 
Receiver,
+bool WaitForInitialSync) {
+return nullptr;
+}


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r368732 - [clang] Refactor doc comments to Decls attribution

2019-08-13 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Aug 13 11:11:44 2019
New Revision: 368732

URL: http://llvm.org/viewvc/llvm-project?rev=368732=rev
Log:
[clang] Refactor doc comments to Decls attribution

- Create ASTContext::attachCommentsToJustParsedDecls so we don't have to load 
external comments in Sema when trying to attach existing comments to just 
parsed Decls.
- Keep comments ordered and cache their decomposed location - faster 
SourceLoc-based searching.
- Optimize work with redeclarations.
- Keep one comment per redeclaration chain (represented by canonical Decl) 
instead of comment per redeclaration.
- For redeclaration chains with no comment attached keep just the last 
declaration in chain that had no comment instead of every comment-less 
redeclaration.

Differential Revision: https://reviews.llvm.org/D65301

Added:
cfe/trunk/test/Index/comment-redeclarations.cpp
Modified:
cfe/trunk/include/clang/AST/ASTContext.h
cfe/trunk/include/clang/AST/RawCommentList.h
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/lib/AST/RawCommentList.cpp
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Serialization/ASTReader.cpp
cfe/trunk/lib/Serialization/ASTWriter.cpp

Modified: cfe/trunk/include/clang/AST/ASTContext.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=368732=368731=368732=diff
==
--- cfe/trunk/include/clang/AST/ASTContext.h (original)
+++ cfe/trunk/include/clang/AST/ASTContext.h Tue Aug 13 11:11:44 2019
@@ -729,71 +729,49 @@ public:
   /// True if comments are already loaded from ExternalASTSource.
   mutable bool CommentsLoaded = false;
 
-  class RawCommentAndCacheFlags {
-  public:
-enum Kind {
-  /// We searched for a comment attached to the particular declaration, but
-  /// didn't find any.
-  ///
-  /// getRaw() == 0.
-  NoCommentInDecl = 0,
-
-  /// We have found a comment attached to this particular declaration.
-  ///
-  /// getRaw() != 0.
-  FromDecl,
-
-  /// This declaration does not have an attached comment, and we have
-  /// searched the redeclaration chain.
-  ///
-  /// If getRaw() == 0, the whole redeclaration chain does not have any
-  /// comments.
-  ///
-  /// If getRaw() != 0, it is a comment propagated from other
-  /// redeclaration.
-  FromRedecl
-};
-
-Kind getKind() const LLVM_READONLY {
-  return Data.getInt();
-}
-
-void setKind(Kind K) {
-  Data.setInt(K);
-}
-
-const RawComment *getRaw() const LLVM_READONLY {
-  return Data.getPointer();
-}
-
-void setRaw(const RawComment *RC) {
-  Data.setPointer(RC);
-}
-
-const Decl *getOriginalDecl() const LLVM_READONLY {
-  return OriginalDecl;
-}
-
-void setOriginalDecl(const Decl *Orig) {
-  OriginalDecl = Orig;
-}
-
-  private:
-llvm::PointerIntPair Data;
-const Decl *OriginalDecl;
-  };
+  /// Mapping from declaration to directly attached comment.
+  ///
+  /// Raw comments are owned by Comments list.  This mapping is populated
+  /// lazily.
+  mutable llvm::DenseMap DeclRawComments;
 
-  /// Mapping from declarations to comments attached to any
-  /// redeclaration.
+  /// Mapping from canonical declaration to the first redeclaration in chain
+  /// that has a comment attached.
   ///
   /// Raw comments are owned by Comments list.  This mapping is populated
   /// lazily.
-  mutable llvm::DenseMap RedeclComments;
+  mutable llvm::DenseMap RedeclChainComments;
+
+  /// Keeps track of redeclaration chains that don't have any comment attached.
+  /// Mapping from canonical declaration to redeclaration chain that has no
+  /// comments attached to any redeclaration. Specifically it's mapping to
+  /// the last redeclaration we've checked.
+  ///
+  /// Shall not contain declarations that have comments attached to any
+  /// redeclaration in their chain.
+  mutable llvm::DenseMap CommentlessRedeclChains;
 
   /// Mapping from declarations to parsed comments attached to any
   /// redeclaration.
   mutable llvm::DenseMap ParsedComments;
 
+  /// Attaches \p Comment to \p OriginalD and to its redeclaration chain
+  /// and removes the redeclaration chain from the set of commentless chains.
+  ///
+  /// Don't do anything if a comment has already been attached to \p OriginalD
+  /// or its redeclaration chain.
+  void cacheRawCommentForDecl(const Decl ,
+  const RawComment ) const;
+
+  /// \returns searches \p CommentsInFile for doc comment for \p D.
+  ///
+  /// \p RepresentativeLocForDecl is used as a location for searching doc
+  /// comments. \p CommentsInFile is a mapping offset -> comment of files in 
the
+  /// same file where \p RepresentativeLocForDecl is.
+  RawComment *getRawCommentForDeclNoCacheImpl(
+  const Decl *D, const SourceLocation RepresentativeLocForDecl,
+  const std::map ) const;
+
   /// Return 

r367906 - [DirectoryWatcher][linux] Fix build for older kernels

2019-08-05 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Mon Aug  5 11:44:07 2019
New Revision: 367906

URL: http://llvm.org/viewvc/llvm-project?rev=367906=rev
Log:
[DirectoryWatcher][linux] Fix build for older kernels

Apparently kernel support for IN_EXCL_UNLINK in inotify_add_watch() doesn't 
imply it's defined in sys/inotify.h.

https://bugs.llvm.org/show_bug.cgi?id=42824

Modified:
cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp

Modified: cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp?rev=367906=367905=367906=diff
==
--- cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp (original)
+++ cfe/trunk/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp Mon Aug  5 
11:44:07 2019
@@ -24,7 +24,6 @@
 #include 
 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -336,7 +335,7 @@ std::unique_ptr clang:
   InotifyFD, Path.str().c_str(),
   IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MODIFY |
   IN_MOVED_FROM | IN_MOVE_SELF | IN_MOVED_TO | IN_ONLYDIR | IN_IGNORED
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+#ifdef IN_EXCL_UNLINK
   | IN_EXCL_UNLINK
 #endif
   );


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


Re: [PATCH] D58418: [clang][DirectoryWatcher] Upstream DirectoryWatcher

2019-08-01 Thread Jan Korous via cfe-commits
Oh! Interesting! Thanks for investigating this.

I'm happy to review the patch.

> On Aug 1, 2019, at 5:17 PM, Puyan Lotfi  wrote:
> 
> Hi Jan, Thanks for the follow up!
> 
> Me and Compnerd narrowed down the issue to the inotify file count limit being 
> exceeded as the cause. DirectoryWatcherLinux::create() in 
> DirectoryWatcher-linux.cpp also doesn't properly perror, I'll post a patch 
> for this shortly to print perror info if the file count is exceeded.
> 
> The cause of the inotify limit being exceeded was... drumroll... _Dropbox_ 
> 
> PL
> 
> 
> 
> On Thu, Aug 1, 2019 at 11:24 AM Jan Korous via Phabricator via llvm-commits 
> mailto:llvm-comm...@lists.llvm.org>> wrote:
> jkorous added a comment.
> 
> Hi Puyan,
> 
> I failed to reproduce with llvm.org/master  
> (5faa533e47b0e54b04166b0257c5ebb48e6ffcaa 
>  >) on 
> Ubuntu 18.04.1 LTS both in debug and release build.
> 
> Since it sounds like you can reproduce "reliably" - can you please share more 
> info how to reproduce?
> 
> 
> Repository:
>   rL LLVM
> 
> CHANGES SINCE LAST ACTION
>   https://reviews.llvm.org/D58418/new/ 
> 
> https://reviews.llvm.org/D58418 
> 
> 
> 
> ___
> llvm-commits mailing list
> llvm-comm...@lists.llvm.org 
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits 
> 

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r367632 - [DirectoryWatcher] Relax assumption to prevent test flakiness

2019-08-01 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Thu Aug  1 16:24:30 2019
New Revision: 367632

URL: http://llvm.org/viewvc/llvm-project?rev=367632=rev
Log:
[DirectoryWatcher] Relax assumption to prevent test flakiness

Modified:
cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp
cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp

Modified: cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp?rev=367632=367631=367632=diff
==
--- cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp (original)
+++ cfe/trunk/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp Thu Aug  1 
16:24:30 2019
@@ -25,6 +25,24 @@ static void stopFSEventStream(FSEventStr
 
 namespace {
 
+/// This implementation is based on FSEvents API which implementation is
+/// aggressively coallescing events. This can manifest as duplicate events.
+///
+/// For example this scenario has been observed:
+///
+/// create foo/bar
+/// sleep 5 s
+/// create DirectoryWatcherMac for dir foo
+/// receive notification: bar EventKind::Modified
+/// sleep 5 s
+/// modify foo/bar
+/// receive notification: bar EventKind::Modified
+/// receive notification: bar EventKind::Modified
+/// sleep 5 s
+/// delete foo/bar
+/// receive notification: bar EventKind::Modified
+/// receive notification: bar EventKind::Modified
+/// receive notification: bar EventKind::Removed
 class DirectoryWatcherMac : public clang::DirectoryWatcher {
 public:
   DirectoryWatcherMac(

Modified: cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp?rev=367632=367631=367632=diff
==
--- cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp (original)
+++ cfe/trunk/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp Thu Aug  1 
16:24:30 2019
@@ -377,7 +377,7 @@ TEST(DirectoryWatcherTest, DeleteFile) {
   VerifyingConsumer TestConsumer{
   {{EventKind::Modified, "a"}},
   {{EventKind::Removed, "a"}},
-  {{EventKind::Modified, "a"}}};
+  {{EventKind::Modified, "a"}, {EventKind::Removed, "a"}}};
 
   auto DW = DirectoryWatcher::create(
   fixture.TestWatchedDir,


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] r367361 - [clangd][NFC] Fix typo in comment

2019-07-30 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Jul 30 15:18:04 2019
New Revision: 367361

URL: http://llvm.org/viewvc/llvm-project?rev=367361=rev
Log:
[clangd][NFC] Fix typo in comment

Modified:
clang-tools-extra/trunk/clangd/ClangdUnit.cpp

Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=367361=367360=367361=diff
==
--- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Tue Jul 30 15:18:04 2019
@@ -374,7 +374,7 @@ ParsedAST::build(std::unique_ptr FixIncludes;
   auto BuildDir = VFS->getCurrentWorkingDirectory();


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] r367354 - [clangd][NFC] Typo in comment

2019-07-30 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Jul 30 13:39:39 2019
New Revision: 367354

URL: http://llvm.org/viewvc/llvm-project?rev=367354=rev
Log:
[clangd][NFC] Typo in comment

Modified:
clang-tools-extra/trunk/clangd/Headers.h

Modified: clang-tools-extra/trunk/clangd/Headers.h
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Headers.h?rev=367354=367353=367354=diff
==
--- clang-tools-extra/trunk/clangd/Headers.h (original)
+++ clang-tools-extra/trunk/clangd/Headers.h Tue Jul 30 13:39:39 2019
@@ -125,7 +125,7 @@ public:
 private:
   // Identifying files in a way that persists from preamble build to subsequent
   // builds is surprisingly hard. FileID is unavailable in 
InclusionDirective(),
-  // and RealPathName and UniqueID are not preseved in the preamble.
+  // and RealPathName and UniqueID are not preserved in the preamble.
   // We use the FileEntry::Name, which is stable, interned into a "file index".
   // The paths we want to expose are the RealPathName, so store those too.
   std::vector RealPathNames; // In file index order.


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r366823 - [clang][NFCI] Fix random typos

2019-07-23 Thread Jan Korous via cfe-commits
Author: jkorous
Date: Tue Jul 23 09:54:11 2019
New Revision: 366823

URL: http://llvm.org/viewvc/llvm-project?rev=366823=rev
Log:
[clang][NFCI] Fix random typos

Modified:
cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
cfe/trunk/lib/Index/IndexSymbol.cpp
cfe/trunk/lib/Sema/SemaExprCXX.cpp

Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=366823=366822=366823=diff
==
--- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original)
+++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Tue Jul 23 
09:54:11 2019
@@ -1315,7 +1315,7 @@ class ForEachMatcher : public WrapperMat
 ///
 /// Input matchers can have any type (including other polymorphic matcher
 /// types), and the actual Matcher is generated on demand with an implicit
-/// coversion operator.
+/// conversion operator.
 template  class VariadicOperatorMatcher {
 public:
   VariadicOperatorMatcher(DynTypedMatcher::VariadicOperator Op, Ps &&... 
Params)

Modified: cfe/trunk/lib/Index/IndexSymbol.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=366823=366822=366823=diff
==
--- cfe/trunk/lib/Index/IndexSymbol.cpp (original)
+++ cfe/trunk/lib/Index/IndexSymbol.cpp Tue Jul 23 09:54:11 2019
@@ -513,7 +513,7 @@ StringRef index::getSymbolKindString(Sym
   case SymbolKind::StaticProperty: return "static-property";
   case SymbolKind::Constructor: return "constructor";
   case SymbolKind::Destructor: return "destructor";
-  case SymbolKind::ConversionFunction: return "coversion-func";
+  case SymbolKind::ConversionFunction: return "conversion-func";
   case SymbolKind::Parameter: return "param";
   case SymbolKind::Using: return "using";
   }

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=366823=366822=366823=diff
==
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jul 23 09:54:11 2019
@@ -7173,7 +7173,7 @@ ExprResult Sema::BuildCXXMemberCallExpr(
 
   if (Method->getParent()->isLambda() &&
   Method->getConversionType()->isBlockPointerType()) {
-// This is a lambda coversion to block pointer; check if the argument
+// This is a lambda conversion to block pointer; check if the argument
 // was a LambdaExpr.
 Expr *SubE = E;
 CastExpr *CE = dyn_cast(SubE);


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


  1   2   >