[PATCH] D59402: Fix-it hints for -Wmissing-{prototypes,variable-declarations}

2019-05-23 Thread Ed Schouten via Phabricator via cfe-commits
ed accepted this revision.
ed added a comment.
This revision is now accepted and ready to land.

The patch looks pretty good as far as I can see. That said, I've been out of 
the loop for quite a while, so do take my approval with a grain of salt.

Thanks for working on this! \o/


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59402/new/

https://reviews.llvm.org/D59402



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


[PATCH] D24892: [clang-tidy] Add option "LiteralInitializers" to cppcoreguidelines-pro-type-member-init

2019-05-23 Thread Matthias Gehre via Phabricator via cfe-commits
This revision was not accepted when it landed; it landed in state "Needs 
Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361601: [clang-tidy] Add option 
LiteralInitializers to cppcoreguidelines-pro-type… (authored by 
mgehre, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D24892?vs=199330=201127#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D24892/new/

https://reviews.llvm.org/D24892

Files:
  
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
  clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
  clang-tools-extra/trunk/docs/ReleaseNotes.rst
  
clang-tools-extra/trunk/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst
  
clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines-pro-type-member-init-use-assignment.cpp

Index: clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
===
--- clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
+++ clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
@@ -250,7 +250,8 @@
 ProTypeMemberInitCheck::ProTypeMemberInitCheck(StringRef Name,
ClangTidyContext *Context)
 : ClangTidyCheck(Name, Context),
-  IgnoreArrays(Options.get("IgnoreArrays", false)) {}
+  IgnoreArrays(Options.get("IgnoreArrays", false)),
+  UseAssignment(Options.getLocalOrGlobal("UseAssignment", false)) {}
 
 void ProTypeMemberInitCheck::registerMatchers(MatchFinder *Finder) {
   if (!getLangOpts().CPlusPlus)
@@ -314,6 +315,7 @@
 
 void ProTypeMemberInitCheck::storeOptions(ClangTidyOptions::OptionMap ) {
   Options.store(Opts, "IgnoreArrays", IgnoreArrays);
+  Options.store(Opts, "UseAssignment", UseAssignment);
 }
 
 // FIXME: Copied from clang/lib/Sema/SemaDeclCXX.cpp.
@@ -338,6 +340,56 @@
   return isIncompleteOrZeroLengthArrayType(Context, Type);
 }
 
+static const char *getInitializer(QualType QT, bool UseAssignment) {
+  const char *DefaultInitializer = "{}";
+  if (!UseAssignment)
+return DefaultInitializer;
+
+  if (QT->isPointerType())
+return " = nullptr";
+
+  const BuiltinType *BT =
+  dyn_cast(QT.getCanonicalType().getTypePtr());
+  if (!BT)
+return DefaultInitializer;
+
+  switch (BT->getKind()) {
+  case BuiltinType::Bool:
+return " = false";
+  case BuiltinType::Float:
+return " = 0.0F";
+  case BuiltinType::Double:
+return " = 0.0";
+  case BuiltinType::LongDouble:
+return " = 0.0L";
+  case BuiltinType::SChar:
+  case BuiltinType::Char_S:
+  case BuiltinType::WChar_S:
+  case BuiltinType::Char16:
+  case BuiltinType::Char32:
+  case BuiltinType::Short:
+  case BuiltinType::Int:
+return " = 0";
+  case BuiltinType::UChar:
+  case BuiltinType::Char_U:
+  case BuiltinType::WChar_U:
+  case BuiltinType::UShort:
+  case BuiltinType::UInt:
+return " = 0U";
+  case BuiltinType::Long:
+return " = 0L";
+  case BuiltinType::ULong:
+return " = 0UL";
+  case BuiltinType::LongLong:
+return " = 0LL";
+  case BuiltinType::ULongLong:
+return " = 0ULL";
+
+  default:
+return DefaultInitializer;
+  }
+}
+
 void ProTypeMemberInitCheck::checkMissingMemberInitializer(
 ASTContext , const CXXRecordDecl ,
 const CXXConstructorDecl *Ctor) {
@@ -420,7 +472,7 @@
 for (const FieldDecl *Field : FieldsToFix) {
   Diag << FixItHint::CreateInsertion(
   getLocationForEndOfToken(Context, Field->getSourceRange().getEnd()),
-  "{}");
+  getInitializer(Field->getType(), UseAssignment));
 }
   } else if (Ctor) {
 // Otherwise, rewrite the constructor's initializer list.
Index: clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
===
--- clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
+++ clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
@@ -64,6 +64,11 @@
 
   // Whether arrays need to be initialized or not. Default is false.
   bool IgnoreArrays;
+
+  // Whether fix-its for initialization of fundamental type use assignment
+  // instead of brace initalization. Only effective in C++11 mode. Default is
+  // false.
+  bool UseAssignment;
 };
 
 } // namespace cppcoreguidelines
Index: clang-tools-extra/trunk/docs/ReleaseNotes.rst
===
--- clang-tools-extra/trunk/docs/ReleaseNotes.rst
+++ clang-tools-extra/trunk/docs/ReleaseNotes.rst
@@ -186,6 +186,11 @@
   `WarnOnLargeObject` and `MaxSize` options to warn on any large trivial
   object caught by value.
 
+- Added `UseAssignment` option to :doc:`cppcoreguidelines-pro-type-member-init`
+
+  If set to 

[clang-tools-extra] r361601 - [clang-tidy] Add option "LiteralInitializers" to cppcoreguidelines-pro-type-member-init

2019-05-23 Thread Matthias Gehre via cfe-commits
Author: mgehre
Date: Thu May 23 22:46:57 2019
New Revision: 361601

URL: http://llvm.org/viewvc/llvm-project?rev=361601=rev
Log:
[clang-tidy] Add option "LiteralInitializers" to 
cppcoreguidelines-pro-type-member-init

Differential Revision: D24892

Added:

clang-tools-extra/trunk/test/clang-tidy/cppcoreguidelines-pro-type-member-init-use-assignment.cpp
Modified:

clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp

clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
clang-tools-extra/trunk/docs/ReleaseNotes.rst

clang-tools-extra/trunk/docs/clang-tidy/checks/cppcoreguidelines-pro-type-member-init.rst

Modified: 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp?rev=361601=361600=361601=diff
==
--- 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp 
(original)
+++ 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp 
Thu May 23 22:46:57 2019
@@ -250,7 +250,8 @@ void fixInitializerList(const ASTContext
 ProTypeMemberInitCheck::ProTypeMemberInitCheck(StringRef Name,
ClangTidyContext *Context)
 : ClangTidyCheck(Name, Context),
-  IgnoreArrays(Options.get("IgnoreArrays", false)) {}
+  IgnoreArrays(Options.get("IgnoreArrays", false)),
+  UseAssignment(Options.getLocalOrGlobal("UseAssignment", false)) {}
 
 void ProTypeMemberInitCheck::registerMatchers(MatchFinder *Finder) {
   if (!getLangOpts().CPlusPlus)
@@ -314,6 +315,7 @@ void ProTypeMemberInitCheck::check(const
 
 void ProTypeMemberInitCheck::storeOptions(ClangTidyOptions::OptionMap ) {
   Options.store(Opts, "IgnoreArrays", IgnoreArrays);
+  Options.store(Opts, "UseAssignment", UseAssignment);
 }
 
 // FIXME: Copied from clang/lib/Sema/SemaDeclCXX.cpp.
@@ -338,6 +340,56 @@ static bool isEmpty(ASTContext ,
   return isIncompleteOrZeroLengthArrayType(Context, Type);
 }
 
+static const char *getInitializer(QualType QT, bool UseAssignment) {
+  const char *DefaultInitializer = "{}";
+  if (!UseAssignment)
+return DefaultInitializer;
+
+  if (QT->isPointerType())
+return " = nullptr";
+
+  const BuiltinType *BT =
+  dyn_cast(QT.getCanonicalType().getTypePtr());
+  if (!BT)
+return DefaultInitializer;
+
+  switch (BT->getKind()) {
+  case BuiltinType::Bool:
+return " = false";
+  case BuiltinType::Float:
+return " = 0.0F";
+  case BuiltinType::Double:
+return " = 0.0";
+  case BuiltinType::LongDouble:
+return " = 0.0L";
+  case BuiltinType::SChar:
+  case BuiltinType::Char_S:
+  case BuiltinType::WChar_S:
+  case BuiltinType::Char16:
+  case BuiltinType::Char32:
+  case BuiltinType::Short:
+  case BuiltinType::Int:
+return " = 0";
+  case BuiltinType::UChar:
+  case BuiltinType::Char_U:
+  case BuiltinType::WChar_U:
+  case BuiltinType::UShort:
+  case BuiltinType::UInt:
+return " = 0U";
+  case BuiltinType::Long:
+return " = 0L";
+  case BuiltinType::ULong:
+return " = 0UL";
+  case BuiltinType::LongLong:
+return " = 0LL";
+  case BuiltinType::ULongLong:
+return " = 0ULL";
+
+  default:
+return DefaultInitializer;
+  }
+}
+
 void ProTypeMemberInitCheck::checkMissingMemberInitializer(
 ASTContext , const CXXRecordDecl ,
 const CXXConstructorDecl *Ctor) {
@@ -420,7 +472,7 @@ void ProTypeMemberInitCheck::checkMissin
 for (const FieldDecl *Field : FieldsToFix) {
   Diag << FixItHint::CreateInsertion(
   getLocationForEndOfToken(Context, Field->getSourceRange().getEnd()),
-  "{}");
+  getInitializer(Field->getType(), UseAssignment));
 }
   } else if (Ctor) {
 // Otherwise, rewrite the constructor's initializer list.

Modified: 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h?rev=361601=361600=361601=diff
==
--- 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h 
(original)
+++ 
clang-tools-extra/trunk/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h 
Thu May 23 22:46:57 2019
@@ -64,6 +64,11 @@ private:
 
   // Whether arrays need to be initialized or not. Default is false.
   bool IgnoreArrays;
+
+  // Whether fix-its for initialization of fundamental type use assignment
+  // instead of brace initalization. Only effective in C++11 mode. Default is
+  // false.
+  bool UseAssignment;
 };
 
 } // namespace cppcoreguidelines

Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst
URL: 

[PATCH] D60162: [ThinLTO] Add module flags for TargetLibraryInfoImpl and use in LTO backends

2019-05-23 Thread Teresa Johnson via Phabricator via cfe-commits
tejohnson abandoned this revision.
tejohnson added a comment.

As per D61634 , we are going to use function 
attributes instead.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60162/new/

https://reviews.llvm.org/D60162



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


[PATCH] D61634: [clang/llvm] Allow efficient implementation of libc's memory functions in C/C++

2019-05-23 Thread Teresa Johnson via Phabricator via cfe-commits
tejohnson added a comment.

In D61634#1512020 , @gchatelet wrote:

> AFAIU here is a coarse plan of what needs to happen
>
> 1. Add a `no-builtin` clang function attribute that has the same semantic as 
> the `no-builtin` cmd line argument 
> 
> 2. Propagate it to the IR.
>   - In the light of recent discussions and as @theraven suggested it seems 
> more appropriate to encode them as individual IR attributes (e.g. 
> `"no-builtin-memcpy"`, `"no-builtin-sqrt"`, etc..)
> 3. Propagate/merge the `no-builtin` IR attribute for LTO by "updating 
> `AttributeFuncs::areInlineCompatible` and/or 
> `AttributeFuncs::mergeAttributesForInlining` and adding a new MergeRule in 
> `include/llvm/IR/Attributes.td` and writing a function like 
> `adjustCallerStackProbeSize`."


This one isn't about LTO, but rather the inliner. You could have different 
functions in the same module even without LTO that have incompatible no-builtin 
attributes. There isn't any propagation required for LTO.

> 4. Get inspiration from `TargetTransformInfo` to get `TargetLibraryInfo` on a 
> per function basis for all passes and respect the IR attribute.
> 
>   I'm not familiar with 3 and 4 but I can definitely have a look. I'll update 
> this patch to do 1 and 2 in the meantime. @tejohnson let me know how you want 
> to proceed for your related patch . I'm 
> happy to help if I can.

I will mark that one obsolete. I can work on 4, it may just take some time to 
get it all plumbed.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61634/new/

https://reviews.llvm.org/D61634



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


[PATCH] D59415: Do not resolve directory junctions for `-fdiagnostics-absolute-paths` on Windows.

2019-05-23 Thread Igor Kudrin via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC361598: Do not resolve directory junctions for 
`-fdiagnostics-absolute-paths` on… (authored by ikudrin, committed by ).

Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59415/new/

https://reviews.llvm.org/D59415

Files:
  lib/Frontend/TextDiagnostic.cpp
  test/Frontend/absolute-paths-windows.test
  test/Frontend/lit.local.cfg


Index: test/Frontend/absolute-paths-windows.test
===
--- test/Frontend/absolute-paths-windows.test
+++ test/Frontend/absolute-paths-windows.test
@@ -0,0 +1,9 @@
+// REQUIRES: system-windows
+// RUN: rm -rf %t.dir
+// RUN: mkdir -p %t.dir\real
+// RUN: cmd /c mklink /j %t.dir\junc %t.dir\real
+// RUN: echo "wrong code" > %t.dir\real\foo.cpp
+// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-absolute-paths 
%t.dir\junc\foo.cpp 2>&1 | FileCheck %s
+
+// CHECK-NOT: .dir\real\foo.cpp
+// CHECK: .dir\junc\foo.cpp
Index: test/Frontend/lit.local.cfg
===
--- test/Frontend/lit.local.cfg
+++ test/Frontend/lit.local.cfg
@@ -1 +1 @@
-config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl']
+config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl', '.test']
Index: lib/Frontend/TextDiagnostic.cpp
===
--- lib/Frontend/TextDiagnostic.cpp
+++ lib/Frontend/TextDiagnostic.cpp
@@ -765,7 +765,28 @@
 const DirectoryEntry *Dir = SM.getFileManager().getDirectory(
 llvm::sys::path::parent_path(Filename));
 if (Dir) {
+  // We want to print a simplified absolute path, i. e. without "dots".
+  //
+  // The hardest part here are the paths like "//../".
+  // On Unix-like systems, we cannot just collapse "/..", because
+  // paths are resolved sequentially, and, thereby, the path
+  // "/" may point to a different location. That is why
+  // we use FileManager::getCanonicalName(), which expands all indirections
+  // with llvm::sys::fs::real_path() and caches the result.
+  //
+  // On the other hand, it would be better to preserve as much of the
+  // original path as possible, because that helps a user to recognize it.
+  // real_path() expands all links, which sometimes too much. Luckily,
+  // on Windows we can just use llvm::sys::path::remove_dots(), because,
+  // on that system, both aforementioned paths point to the same place.
+#ifdef _WIN32
+  SmallString<4096> DirName = Dir->getName();
+  llvm::sys::fs::make_absolute(DirName);
+  llvm::sys::path::native(DirName);
+  llvm::sys::path::remove_dots(DirName, /* remove_dot_dot */ true);
+#else
   StringRef DirName = SM.getFileManager().getCanonicalName(Dir);
+#endif
   llvm::sys::path::append(AbsoluteFilename, DirName,
   llvm::sys::path::filename(Filename));
   Filename = StringRef(AbsoluteFilename.data(), AbsoluteFilename.size());


Index: test/Frontend/absolute-paths-windows.test
===
--- test/Frontend/absolute-paths-windows.test
+++ test/Frontend/absolute-paths-windows.test
@@ -0,0 +1,9 @@
+// REQUIRES: system-windows
+// RUN: rm -rf %t.dir
+// RUN: mkdir -p %t.dir\real
+// RUN: cmd /c mklink /j %t.dir\junc %t.dir\real
+// RUN: echo "wrong code" > %t.dir\real\foo.cpp
+// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-absolute-paths %t.dir\junc\foo.cpp 2>&1 | FileCheck %s
+
+// CHECK-NOT: .dir\real\foo.cpp
+// CHECK: .dir\junc\foo.cpp
Index: test/Frontend/lit.local.cfg
===
--- test/Frontend/lit.local.cfg
+++ test/Frontend/lit.local.cfg
@@ -1 +1 @@
-config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl']
+config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl', '.test']
Index: lib/Frontend/TextDiagnostic.cpp
===
--- lib/Frontend/TextDiagnostic.cpp
+++ lib/Frontend/TextDiagnostic.cpp
@@ -765,7 +765,28 @@
 const DirectoryEntry *Dir = SM.getFileManager().getDirectory(
 llvm::sys::path::parent_path(Filename));
 if (Dir) {
+  // We want to print a simplified absolute path, i. e. without "dots".
+  //
+  // The hardest part here are the paths like "//../".
+  // On Unix-like systems, we cannot just collapse "/..", because
+  // paths are resolved sequentially, and, thereby, the path
+  // "/" may point to a different location. That is why
+  // we use FileManager::getCanonicalName(), which expands all indirections
+  // with llvm::sys::fs::real_path() and caches the result.
+  //
+  // On the other hand, it would be better to preserve as much of the
+  // original path as possible, because that helps a user to recognize it.
+  // real_path() expands all links, 

r361598 - Do not resolve directory junctions for `-fdiagnostics-absolute-paths` on Windows.

2019-05-23 Thread Igor Kudrin via cfe-commits
Author: ikudrin
Date: Thu May 23 21:46:22 2019
New Revision: 361598

URL: http://llvm.org/viewvc/llvm-project?rev=361598=rev
Log:
Do not resolve directory junctions for `-fdiagnostics-absolute-paths` on 
Windows.

If the source file path contains directory junctions, and we resolve them when
printing diagnostic messages, these paths look independent for an IDE.
For example, both Visual Studio and Visual Studio Code open separate editors
for such paths, which is not only inconvenient but might even result in losing
changes made in one of them.

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

Added:
cfe/trunk/test/Frontend/absolute-paths-windows.test
Modified:
cfe/trunk/lib/Frontend/TextDiagnostic.cpp
cfe/trunk/test/Frontend/lit.local.cfg

Modified: cfe/trunk/lib/Frontend/TextDiagnostic.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/TextDiagnostic.cpp?rev=361598=361597=361598=diff
==
--- cfe/trunk/lib/Frontend/TextDiagnostic.cpp (original)
+++ cfe/trunk/lib/Frontend/TextDiagnostic.cpp Thu May 23 21:46:22 2019
@@ -765,7 +765,28 @@ void TextDiagnostic::emitFilename(String
 const DirectoryEntry *Dir = SM.getFileManager().getDirectory(
 llvm::sys::path::parent_path(Filename));
 if (Dir) {
+  // We want to print a simplified absolute path, i. e. without "dots".
+  //
+  // The hardest part here are the paths like "//../".
+  // On Unix-like systems, we cannot just collapse "/..", because
+  // paths are resolved sequentially, and, thereby, the path
+  // "/" may point to a different location. That is why
+  // we use FileManager::getCanonicalName(), which expands all indirections
+  // with llvm::sys::fs::real_path() and caches the result.
+  //
+  // On the other hand, it would be better to preserve as much of the
+  // original path as possible, because that helps a user to recognize it.
+  // real_path() expands all links, which sometimes too much. Luckily,
+  // on Windows we can just use llvm::sys::path::remove_dots(), because,
+  // on that system, both aforementioned paths point to the same place.
+#ifdef _WIN32
+  SmallString<4096> DirName = Dir->getName();
+  llvm::sys::fs::make_absolute(DirName);
+  llvm::sys::path::native(DirName);
+  llvm::sys::path::remove_dots(DirName, /* remove_dot_dot */ true);
+#else
   StringRef DirName = SM.getFileManager().getCanonicalName(Dir);
+#endif
   llvm::sys::path::append(AbsoluteFilename, DirName,
   llvm::sys::path::filename(Filename));
   Filename = StringRef(AbsoluteFilename.data(), AbsoluteFilename.size());

Added: cfe/trunk/test/Frontend/absolute-paths-windows.test
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/absolute-paths-windows.test?rev=361598=auto
==
--- cfe/trunk/test/Frontend/absolute-paths-windows.test (added)
+++ cfe/trunk/test/Frontend/absolute-paths-windows.test Thu May 23 21:46:22 2019
@@ -0,0 +1,9 @@
+// REQUIRES: system-windows
+// RUN: rm -rf %t.dir
+// RUN: mkdir -p %t.dir\real
+// RUN: cmd /c mklink /j %t.dir\junc %t.dir\real
+// RUN: echo "wrong code" > %t.dir\real\foo.cpp
+// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-absolute-paths 
%t.dir\junc\foo.cpp 2>&1 | FileCheck %s
+
+// CHECK-NOT: .dir\real\foo.cpp
+// CHECK: .dir\junc\foo.cpp

Modified: cfe/trunk/test/Frontend/lit.local.cfg
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/lit.local.cfg?rev=361598=361597=361598=diff
==
--- cfe/trunk/test/Frontend/lit.local.cfg (original)
+++ cfe/trunk/test/Frontend/lit.local.cfg Thu May 23 21:46:22 2019
@@ -1 +1 @@
-config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl']
+config.suffixes = ['.c', '.cpp', '.m', '.mm', '.ll', '.cl', '.test']


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


r361592 - [analyzer] NFC: Prevent multi-file plist test from spamming up the build folder.

2019-05-23 Thread Artem Dergachev via cfe-commits
Author: dergachev
Date: Thu May 23 19:29:18 2019
New Revision: 361592

URL: http://llvm.org/viewvc/llvm-project?rev=361592=rev
Log:
[analyzer] NFC: Prevent multi-file plist test from spamming up the build folder.

It was producing an HTML report with a random name on every tests run
and never cleaned those up.

Modified:

cfe/trunk/test/Analysis/diagnostics/Inputs/expected-plists/plist-multi-file.c.plist
cfe/trunk/test/Analysis/diagnostics/plist-multi-file.c

Modified: 
cfe/trunk/test/Analysis/diagnostics/Inputs/expected-plists/plist-multi-file.c.plist
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/Inputs/expected-plists/plist-multi-file.c.plist?rev=361592=361591=361592=diff
==
--- 
cfe/trunk/test/Analysis/diagnostics/Inputs/expected-plists/plist-multi-file.c.plist
 (original)
+++ 
cfe/trunk/test/Analysis/diagnostics/Inputs/expected-plists/plist-multi-file.c.plist
 Thu May 23 19:29:18 2019
@@ -184,10 +184,6 @@
col8
file1
   
-  HTMLDiagnostics_files
-  
-   report-288847.html
-  
   ExecutedLines
   
0

Modified: cfe/trunk/test/Analysis/diagnostics/plist-multi-file.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/plist-multi-file.c?rev=361592=361591=361592=diff
==
--- cfe/trunk/test/Analysis/diagnostics/plist-multi-file.c (original)
+++ cfe/trunk/test/Analysis/diagnostics/plist-multi-file.c Thu May 23 19:29:18 
2019
@@ -1,5 +1,5 @@
-// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-html 
-o %t.plist -verify %s
-// RUN: tail -n +11 %t.plist | %diff_plist --ignore-matching-lines=report 
%S/Inputs/expected-plists/plist-multi-file.c.plist -
+// RUN: %clang_analyze_cc1 -analyzer-checker=core 
-analyzer-output=plist-multi-file -o %t.plist -verify %s
+// RUN: tail -n +11 %t.plist | %diff_plist 
%S/Inputs/expected-plists/plist-multi-file.c.plist -
 
 #include "plist-multi-file.h"
 


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


[PATCH] D58418: [clang][DirectoryWatcher] Upstream DirectoryWatcher

2019-05-23 Thread Jan Korous via Phabricator via cfe-commits
jkorous marked 6 inline comments as done.
jkorous added inline comments.



Comment at: clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp:131
+  // the async event handling picks them up. Can make this test flaky.
+  std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 0.1s
+}

jkorous wrote:
> gribozavr wrote:
> > I'm certain this sleep will be flaky on heavily-loaded CI machines.  If you 
> > are going to leave it as a sleep, please make it 1s.  But is there really 
> > no better way?
> That was exactly my thinking! Honestly, I don't know - I wasn't able to come 
> up with any reasonably simple, deterministic approach even on a single 
> platform :(
> I eventually picked 0.1s as a tradeoff between slowing the test for everyone 
> and getting less false positives.
> 
> The problem as I understand it is that we're making changes and monitoring 
> them asynchronously with no guarantee from the kernel API (true for FSEvents, 
> not 100% about inotify) about when (if) we receive notifications.
> 
> If you have any idea for robust testing approach I'd be totally happy to use 
> it.
I found a way how to use more generous timeout without slowing down the test 
for every run - inspired by Argyrios' idea about using different thread + 
semaphore.

I am using 3 seconds for now. If that's not enough, just let me know.



Comment at: clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp:357
+
+  EXPECT_TRUE(eventConsumer.AreExpectedPresentInNonInitial(
+  {{DirectoryWatcher::Event::EventKind::WatcherGotInvalidated, ""}}));

gribozavr wrote:
> I would strongly prefer if you used the gmock matchers (like Contains); as 
> written, when the test fails, the only error we would get would be like 
> "expected: true, actual: false".
Since the tests are using are based on something like "eventual correctness" 
instead of one-time check I didn't use gmock matchers but implemented some 
custom diagnostics.

Example of the failed test:
```
/Users/jankorous/src/llvm-monorepo/llvm-project/clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp:185:
 Failure
Value of: *TestConsumer.Result()
  Actual: false
Expected: true
Expected but not seen non-initial events:
Removed a
Unexpected non-initial events seen:
Added a
```


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58418/new/

https://reviews.llvm.org/D58418



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


[PATCH] D58418: [clang][DirectoryWatcher] Upstream DirectoryWatcher

2019-05-23 Thread Jan Korous via Phabricator via cfe-commits
jkorous updated this revision to Diff 201114.
jkorous added a comment.

Reimplemented tests with std::futures which allowed to use more generous 
timeout while not slowing down the happy paths.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58418/new/

https://reviews.llvm.org/D58418

Files:
  clang/cmake/modules/AddClang.cmake
  clang/include/clang/DirectoryWatcher/DirectoryWatcher.h
  clang/lib/CMakeLists.txt
  clang/lib/DirectoryWatcher/CMakeLists.txt
  clang/lib/DirectoryWatcher/DirectoryScanner.cpp
  clang/lib/DirectoryWatcher/DirectoryScanner.h
  clang/lib/DirectoryWatcher/linux/DirectoryWatcher-linux.cpp
  clang/lib/DirectoryWatcher/mac/DirectoryWatcher-mac.cpp
  clang/unittests/CMakeLists.txt
  clang/unittests/DirectoryWatcher/CMakeLists.txt
  clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp

Index: clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp
===
--- /dev/null
+++ clang/unittests/DirectoryWatcher/DirectoryWatcherTest.cpp
@@ -0,0 +1,362 @@
+//===- unittests/DirectoryWatcher/DirectoryWatcherTest.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/DirectoryWatcher/DirectoryWatcher.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Mutex.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/raw_ostream.h"
+#include "gtest/gtest.h"
+#include 
+#include 
+#include 
+#include 
+
+using namespace llvm;
+using namespace llvm::sys;
+using namespace llvm::sys::fs;
+using namespace clang;
+
+namespace clang {
+static bool operator==(const DirectoryWatcher::Event ,
+   const DirectoryWatcher::Event ) {
+  return lhs.Filename == rhs.Filename &&
+ static_cast(lhs.Kind) == static_cast(rhs.Kind);
+}
+} // namespace clang
+
+namespace {
+
+struct DirectoryWatcherTestFixture {
+  std::string TestRootDir;
+  std::string TestWatchedDir;
+
+  DirectoryWatcherTestFixture() {
+SmallString<128> pathBuf;
+assert(!createUniqueDirectory("dirwatcher", pathBuf));
+TestRootDir = pathBuf.str();
+path::append(pathBuf, "watch");
+TestWatchedDir = pathBuf.str();
+assert(!create_directory(TestWatchedDir, false));
+  }
+
+  ~DirectoryWatcherTestFixture() { remove_directories(TestRootDir); }
+
+  SmallString<128> getPathInWatched(const std::string ) {
+SmallString<128> pathBuf;
+pathBuf = TestWatchedDir;
+path::append(pathBuf, testFile);
+return pathBuf;
+  }
+
+  void addFile(const std::string ) {
+Expected ft = openNativeFileForWrite(getPathInWatched(testFile),
+ CD_CreateNew, OF_None);
+if (ft) {
+  closeFile(*ft);
+} else {
+  llvm::errs() << llvm::toString(ft.takeError()) << "\n";
+  llvm::errs() << getPathInWatched(testFile) << "\n";
+  llvm_unreachable("Couldn't create test file.");
+}
+  }
+
+  void deleteFile(const std::string ) {
+std::error_code EC =
+remove(getPathInWatched(testFile), /*IgnoreNonExisting=*/false);
+ASSERT_FALSE(EC);
+  }
+};
+
+std::string EventKindToString(const DirectoryWatcher::Event::EventKind K) {
+  switch (K) {
+  case DirectoryWatcher::Event::EventKind::Added:
+return "Added";
+  case DirectoryWatcher::Event::EventKind::Removed:
+return "Removed";
+  case DirectoryWatcher::Event::EventKind::Modified:
+return "Modified";
+  case DirectoryWatcher::Event::EventKind::WatchedDirRemoved:
+return "WatchedDirRemoved";
+  case DirectoryWatcher::Event::EventKind::WatcherGotInvalidated:
+return "WatcherGotInvalidated";
+  }
+  llvm_unreachable("unknown event kind");
+}
+
+struct VerifyingConsumer {
+  std::vector ExpectedInitial;
+  std::vector ExpectedNonInitial;
+  std::vector UnexpectedInitial;
+  std::vector UnexpectedNonInitial;
+  std::mutex Mtx;
+  std::condition_variable ResultIsReady;
+
+  VerifyingConsumer(
+  const std::vector ,
+  const std::vector )
+  : ExpectedInitial(ExpectedInitial),
+ExpectedNonInitial(ExpectedNonInitial) {}
+
+  // This method is used by DirectoryWatcher
+  void consume(DirectoryWatcher::Event E, bool IsInitial) {
+std::unique_lock L(Mtx);
+std::vector  =
+IsInitial ? ExpectedInitial : ExpectedNonInitial;
+std::vector  =
+IsInitial ? UnexpectedInitial : UnexpectedNonInitial;
+auto It =
+std::find(WhichExpectedVector.begin(), WhichExpectedVector.end(), E);
+if (It == WhichExpectedVector.end()) {
+  WhichUnexpectedVector.push_back(E);
+} else {
+  WhichExpectedVector.erase(It);
+}
+if (Result())
+  ResultIsReady.notify_one();
+  }
+
+  // This method is used by DirectoryWatcher
+  void consume(llvm::ArrayRef Es, 

[PATCH] D61815: [CFG] NFC: Modernize test/Analysis/initializers-cfg-output.cpp.

2019-05-23 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC361587: [CFG] NFC: Modernize a test file for constructor 
initializer CFGs. (authored by dergachev, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D61815?vs=199118=201113#toc

Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61815/new/

https://reviews.llvm.org/D61815

Files:
  test/Analysis/initializers-cfg-output.cpp

Index: test/Analysis/initializers-cfg-output.cpp
===
--- test/Analysis/initializers-cfg-output.cpp
+++ test/Analysis/initializers-cfg-output.cpp
@@ -12,22 +12,84 @@
 
 class A {
 public:
+  // CHECK:   A()
+  // CHECK:[B1 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   A() {}
+
+  // CHECK:   A(int i)
+  // CHECK:[B1 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   A(int i) {}
 };
 
 class B : public virtual A {
 public:
+  // CHECK:   B()
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+  // CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   B() {}
+
+  // CHECK:   B(int i)
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // CHECK-NEXT: 1: i
+  // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
+  // WARNINGS-NEXT: 3: [B1.2] (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 3: [B1.2] (CXXConstructExpr, A([B1.2]) (Base initializer), class A)
+  // CHECK-NEXT: 4: A([B1.3]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   B(int i) : A(i) {}
 };
 
 class C : public virtual A {
 public:
+  // CHECK:   C()
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+  // CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   C() {}
+
+  // CHECK:   C(int i)
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // CHECK-NEXT: 1: i
+  // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
+  // WARNINGS-NEXT: 3: [B1.2] (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 3: [B1.2] (CXXConstructExpr, A([B1.2]) (Base initializer), class A)
+  // CHECK-NEXT: 4: A([B1.3]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   C(int i) : A(i) {}
 };
 
+
 class TestOrder : public C, public B, public A {
   int i;
   int& r;
@@ -35,6 +97,34 @@
   TestOrder();
 };
 
+// CHECK:   TestOrder::TestOrder()
+// CHECK:[B2 (ENTRY)]
+// CHECK-NEXT: Succs (1): B1
+// CHECK:[B1]
+// WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+// CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+// WARNINGS-NEXT: 3:  (CXXConstructExpr, class C)
+// ANALYZER-NEXT: 3:  (CXXConstructExpr, C() (Base initializer), class C)
+// CHECK-NEXT: 4: C([B1.3]) (Base initializer)
+// WARNINGS-NEXT: 5:  (CXXConstructExpr, class B)
+// ANALYZER-NEXT: 5:  (CXXConstructExpr, B() (Base initializer), class B)
+// CHECK-NEXT: 6: B([B1.5]) (Base initializer)
+// WARNINGS-NEXT: 7:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT: 7:  (CXXConstructExpr, A() (Base initializer), class A)
+// CHECK-NEXT: 8: A([B1.7]) (Base initializer)
+// CHECK-NEXT: 9: /*implicit*/(int)0
+// CHECK-NEXT:10: i([B1.9]) (Member initializer)
+// CHECK-NEXT:11: this
+// CHECK-NEXT:12: [B1.11]->i
+// CHECK-NEXT:13: r([B1.12]) (Member initializer)
+// WARNINGS-NEXT:14:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT:14:  (CXXConstructExpr, [B1.15], class A)
+// CHECK-NEXT:15: A a;
+// CHECK-NEXT: Preds (1): B2
+// CHECK-NEXT: Succs (1): B0
+// CHECK:[B0 (EXIT)]
+// CHECK-NEXT: Preds (1): B1
 TestOrder::TestOrder()
   : r(i), B(), i(), C() {
   A a;
@@ -46,6 +136,37 @@
   TestControlFlow(bool b);
 };
 
+// CHECK:   TestControlFlow::TestControlFlow(bool b)
+// CHECK:[B5 (ENTRY)]
+// CHECK-NEXT: Succs (1): B4
+// CHECK:  

[PATCH] D61814: [CFG] NFC: Remove implicit conversion from CFGTerminator to Stmt *, make it a variant class instead.

2019-05-23 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361586: [CFG] NFC: Remove implicit conversion from 
CFGTerminator to Stmt *. (authored by dergachev, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D61814?vs=199531=201112#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61814/new/

https://reviews.llvm.org/D61814

Files:
  cfe/trunk/include/clang/Analysis/CFG.h
  cfe/trunk/include/clang/Analysis/ProgramPoint.h
  cfe/trunk/lib/Analysis/CFG.cpp
  cfe/trunk/lib/Analysis/CFGStmtMap.cpp
  cfe/trunk/lib/Analysis/Consumed.cpp
  cfe/trunk/lib/Analysis/LiveVariables.cpp
  cfe/trunk/lib/Analysis/ProgramPoint.cpp
  cfe/trunk/lib/Analysis/ReachableCode.cpp
  cfe/trunk/lib/Analysis/ThreadSafety.cpp
  cfe/trunk/lib/Analysis/UninitializedValues.cpp
  cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
  cfe/trunk/lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/LoopUnrolling.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp

Index: cfe/trunk/lib/Analysis/ProgramPoint.cpp
===
--- cfe/trunk/lib/Analysis/ProgramPoint.cpp
+++ cfe/trunk/lib/Analysis/ProgramPoint.cpp
@@ -144,7 +144,7 @@
 Out << "Edge: (B" << E.getSrc()->getBlockID() << ", B"
 << E.getDst()->getBlockID() << ')';
 
-if (const Stmt *T = E.getSrc()->getTerminator()) {
+if (const Stmt *T = E.getSrc()->getTerminatorStmt()) {
   SourceLocation SLoc = T->getBeginLoc();
 
   Out << "\\|Terminator: ";
Index: cfe/trunk/lib/Analysis/Consumed.cpp
===
--- cfe/trunk/lib/Analysis/Consumed.cpp
+++ cfe/trunk/lib/Analysis/Consumed.cpp
@@ -76,7 +76,7 @@
 static SourceLocation getLastStmtLoc(const CFGBlock *Block) {
   // Find the source location of the last statement in the block, if the block
   // is not empty.
-  if (const Stmt *StmtNode = Block->getTerminator()) {
+  if (const Stmt *StmtNode = Block->getTerminatorStmt()) {
 return StmtNode->getBeginLoc();
   } else {
 for (CFGBlock::const_reverse_iterator BI = Block->rbegin(),
Index: cfe/trunk/lib/Analysis/CFGStmtMap.cpp
===
--- cfe/trunk/lib/Analysis/CFGStmtMap.cpp
+++ cfe/trunk/lib/Analysis/CFGStmtMap.cpp
@@ -70,7 +70,7 @@
   // Finally, look at the terminator.  If the terminator was already added
   // because it is a block-level expression in another block, overwrite
   // that mapping.
-  if (Stmt *Term = B->getTerminator())
+  if (Stmt *Term = B->getTerminatorStmt())
 SM[Term] = B;
 }
 
Index: cfe/trunk/lib/Analysis/ReachableCode.cpp
===
--- cfe/trunk/lib/Analysis/ReachableCode.cpp
+++ cfe/trunk/lib/Analysis/ReachableCode.cpp
@@ -48,7 +48,7 @@
 static bool isTrivialDoWhile(const CFGBlock *B, const Stmt *S) {
   // Check if the block ends with a do...while() and see if 'S' is the
   // condition.
-  if (const Stmt *Term = B->getTerminator()) {
+  if (const Stmt *Term = B->getTerminatorStmt()) {
 if (const DoStmt *DS = dyn_cast(Term)) {
   const Expr *Cond = DS->getCond()->IgnoreParenCasts();
   return Cond == S && isTrivialExpression(Cond);
@@ -116,7 +116,7 @@
   // the call to the destructor.
   assert(Current->succ_size() == 2);
   Current = *(Current->succ_begin() + 1);
-} else if (!Current->getTerminator() && Current->succ_size() == 1) {
+} else if (!Current->getTerminatorStmt() && Current->succ_size() == 1) {
   // If there is only one successor, we're not dealing with outgoing control
   // flow. Thus, look into the next block.
   Current = *Current->succ_begin();
@@ -292,7 +292,7 @@
 /// Returns true if we should always explore all successors of a block.
 static bool shouldTreatSuccessorsAsReachable(const CFGBlock *B,
  Preprocessor ) {
-  if (const Stmt *Term = B->getTerminator()) {
+  if (const Stmt *Term = B->getTerminatorStmt()) {
 if (isa(Term))
   return true;
 // Specially handle '||' and '&&'.
@@ -461,12 +461,11 @@
 return S;
 }
 
-  if (CFGTerminator T = Block->getTerminator()) {
-if (!T.isTemporaryDtorsBranch()) {
-  const Stmt *S = T.getStmt();
-  if (isValidDeadStmt(S))
-return S;
-}
+  CFGTerminator T = Block->getTerminator();
+  if (T.isStmtBranch()) {
+const Stmt *S = T.getStmt();
+if (S && isValidDeadStmt(S))
+  return S;
   }
 
   return nullptr;
Index: cfe/trunk/lib/Analysis/CFG.cpp

r361587 - [CFG] NFC: Modernize a test file for constructor initializer CFGs.

2019-05-23 Thread Artem Dergachev via cfe-commits
Author: dergachev
Date: Thu May 23 18:34:26 2019
New Revision: 361587

URL: http://llvm.org/viewvc/llvm-project?rev=361587=rev
Log:
[CFG] NFC: Modernize a test file for constructor initializer CFGs.

Move FileCheck directives around so that it was easy to understand
what tests what and what effect do changes have.

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

Modified:
cfe/trunk/test/Analysis/initializers-cfg-output.cpp

Modified: cfe/trunk/test/Analysis/initializers-cfg-output.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/initializers-cfg-output.cpp?rev=361587=361586=361587=diff
==
--- cfe/trunk/test/Analysis/initializers-cfg-output.cpp (original)
+++ cfe/trunk/test/Analysis/initializers-cfg-output.cpp Thu May 23 18:34:26 2019
@@ -12,22 +12,84 @@
 
 class A {
 public:
+  // CHECK:   A()
+  // CHECK:[B1 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   A() {}
+
+  // CHECK:   A(int i)
+  // CHECK:[B1 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   A(int i) {}
 };
 
 class B : public virtual A {
 public:
+  // CHECK:   B()
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+  // CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   B() {}
+
+  // CHECK:   B(int i)
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // CHECK-NEXT: 1: i
+  // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
+  // WARNINGS-NEXT: 3: [B1.2] (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 3: [B1.2] (CXXConstructExpr, A([B1.2]) (Base 
initializer), class A)
+  // CHECK-NEXT: 4: A([B1.3]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   B(int i) : A(i) {}
 };
 
 class C : public virtual A {
 public:
+  // CHECK:   C()
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+  // CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   C() {}
+
+  // CHECK:   C(int i)
+  // CHECK:[B2 (ENTRY)]
+  // CHECK-NEXT: Succs (1): B1
+  // CHECK:[B1]
+  // CHECK-NEXT: 1: i
+  // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
+  // WARNINGS-NEXT: 3: [B1.2] (CXXConstructExpr, class A)
+  // ANALYZER-NEXT: 3: [B1.2] (CXXConstructExpr, A([B1.2]) (Base 
initializer), class A)
+  // CHECK-NEXT: 4: A([B1.3]) (Base initializer)
+  // CHECK-NEXT: Preds (1): B2
+  // CHECK-NEXT: Succs (1): B0
+  // CHECK:[B0 (EXIT)]
+  // CHECK-NEXT: Preds (1): B1
   C(int i) : A(i) {}
 };
 
+
 class TestOrder : public C, public B, public A {
   int i;
   int& r;
@@ -35,6 +97,34 @@ public:
   TestOrder();
 };
 
+// CHECK:   TestOrder::TestOrder()
+// CHECK:[B2 (ENTRY)]
+// CHECK-NEXT: Succs (1): B1
+// CHECK:[B1]
+// WARNINGS-NEXT: 1:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT: 1:  (CXXConstructExpr, A() (Base initializer), class A)
+// CHECK-NEXT: 2: A([B1.1]) (Base initializer)
+// WARNINGS-NEXT: 3:  (CXXConstructExpr, class C)
+// ANALYZER-NEXT: 3:  (CXXConstructExpr, C() (Base initializer), class C)
+// CHECK-NEXT: 4: C([B1.3]) (Base initializer)
+// WARNINGS-NEXT: 5:  (CXXConstructExpr, class B)
+// ANALYZER-NEXT: 5:  (CXXConstructExpr, B() (Base initializer), class B)
+// CHECK-NEXT: 6: B([B1.5]) (Base initializer)
+// WARNINGS-NEXT: 7:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT: 7:  (CXXConstructExpr, A() (Base initializer), class A)
+// CHECK-NEXT: 8: A([B1.7]) (Base initializer)
+// CHECK-NEXT: 9: /*implicit*/(int)0
+// CHECK-NEXT:10: i([B1.9]) (Member initializer)
+// CHECK-NEXT:11: this
+// CHECK-NEXT:12: [B1.11]->i
+// CHECK-NEXT:13: r([B1.12]) (Member initializer)
+// WARNINGS-NEXT:14:  (CXXConstructExpr, class A)
+// ANALYZER-NEXT:14:  (CXXConstructExpr, [B1.15], class A)
+// CHECK-NEXT:15: A a;
+// CHECK-NEXT: Preds (1): B2
+// CHECK-NEXT: Succs (1): B0
+// CHECK:[B0 (EXIT)]
+// CHECK-NEXT: Preds (1): B1
 TestOrder::TestOrder()
   : r(i), B(), i(), C() {
   A a;

r361588 - Factor out repeated code to build 'this' expressions and mark them

2019-05-23 Thread Richard Smith via cfe-commits
Author: rsmith
Date: Thu May 23 18:35:07 2019
New Revision: 361588

URL: http://llvm.org/viewvc/llvm-project?rev=361588=rev
Log:
Factor out repeated code to build 'this' expressions and mark them
referenced.

Modified:
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/Sema/SemaExprCXX.cpp
cfe/trunk/lib/Sema/SemaExprMember.cpp
cfe/trunk/lib/Sema/SemaOverload.cpp
cfe/trunk/lib/Sema/TreeTransform.h

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=361588=361587=361588=diff
==
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Thu May 23 18:35:07 2019
@@ -5223,6 +5223,10 @@ public:
    ActOnCXXThis -  Parse 'this' pointer.
   ExprResult ActOnCXXThis(SourceLocation loc);
 
+  /// Build a CXXThisExpr and mark it referenced in the current context.
+  Expr *BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit);
+  void MarkThisReferenced(CXXThisExpr *This);
+
   /// Try to retrieve the type of the 'this' pointer.
   ///
   /// \returns The type of 'this', if possible. Otherwise, returns a NULL type.

Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=361588=361587=361588=diff
==
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu May 23 18:35:07 2019
@@ -1298,10 +1298,20 @@ ExprResult Sema::ActOnCXXThis(SourceLoca
   /// which the function is called.
 
   QualType ThisTy = getCurrentThisType();
-  if (ThisTy.isNull()) return Diag(Loc, diag::err_invalid_this_use);
+  if (ThisTy.isNull())
+return Diag(Loc, diag::err_invalid_this_use);
+  return BuildCXXThisExpr(Loc, ThisTy, /*isImplicit=*/false);
+}
+
+Expr *Sema::BuildCXXThisExpr(SourceLocation Loc, QualType Type,
+ bool IsImplicit) {
+  auto *This = new (Context) CXXThisExpr(Loc, Type, IsImplicit);
+  MarkThisReferenced(This);
+  return This;
+}
 
-  CheckCXXThisCapture(Loc);
-  return new (Context) CXXThisExpr(Loc, ThisTy, /*isImplicit=*/false);
+void Sema::MarkThisReferenced(CXXThisExpr *This) {
+  CheckCXXThisCapture(This->getExprLoc());
 }
 
 bool Sema::isThisOutsideMemberFunctionBody(QualType BaseType) {

Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=361588=361587=361588=diff
==
--- cfe/trunk/lib/Sema/SemaExprMember.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprMember.cpp Thu May 23 18:35:07 2019
@@ -1092,8 +1092,7 @@ Sema::BuildMemberReferenceExpr(Expr *Bas
 SourceLocation Loc = R.getNameLoc();
 if (SS.getRange().isValid())
   Loc = SS.getRange().getBegin();
-CheckCXXThisCapture(Loc);
-BaseExpr = new (Context) CXXThisExpr(Loc, 
BaseExprType,/*isImplicit=*/true);
+BaseExpr = BuildCXXThisExpr(Loc, BaseExprType, /*isImplicit=*/true);
   }
 
   // Check the use of this member.
@@ -1836,8 +1835,7 @@ Sema::BuildImplicitMemberExpr(const CXXS
 SourceLocation Loc = R.getNameLoc();
 if (SS.getRange().isValid())
   Loc = SS.getRange().getBegin();
-CheckCXXThisCapture(Loc);
-baseExpr = new (Context) CXXThisExpr(loc, ThisTy, /*isImplicit=*/true);
+baseExpr = BuildCXXThisExpr(loc, ThisTy, /*isImplicit=*/true);
   }
 
   return BuildMemberReferenceExpr(baseExpr, ThisTy,

Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=361588=361587=361588=diff
==
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu May 23 18:35:07 2019
@@ -13910,10 +13910,8 @@ Expr *Sema::FixOverloadedFunctionReferen
 SourceLocation Loc = MemExpr->getMemberLoc();
 if (MemExpr->getQualifier())
   Loc = MemExpr->getQualifierLoc().getBeginLoc();
-CheckCXXThisCapture(Loc);
-Base = new (Context) CXXThisExpr(Loc,
- MemExpr->getBaseType(),
- /*isImplicit=*/true);
+Base =
+BuildCXXThisExpr(Loc, MemExpr->getBaseType(), /*isImplicit=*/true);
   }
 } else
   Base = MemExpr->getBase();

Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=361588=361587=361588=diff
==
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Thu May 23 18:35:07 2019
@@ -2697,8 +2697,7 @@ public:
   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
 

r361586 - [CFG] NFC: Remove implicit conversion from CFGTerminator to Stmt *.

2019-05-23 Thread Artem Dergachev via cfe-commits
Author: dergachev
Date: Thu May 23 18:34:22 2019
New Revision: 361586

URL: http://llvm.org/viewvc/llvm-project?rev=361586=rev
Log:
[CFG] NFC: Remove implicit conversion from CFGTerminator to Stmt *.

Turn it into a variant class instead. This conversion does indeed save some code
but there's a plan to add support for more kinds of terminators that aren't
necessarily based on statements, and with those in mind it becomes more and more
confusing to have CFGTerminators implicitly convertible to a Stmt *.

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

Modified:
cfe/trunk/include/clang/Analysis/CFG.h
cfe/trunk/include/clang/Analysis/ProgramPoint.h
cfe/trunk/lib/Analysis/CFG.cpp
cfe/trunk/lib/Analysis/CFGStmtMap.cpp
cfe/trunk/lib/Analysis/Consumed.cpp
cfe/trunk/lib/Analysis/LiveVariables.cpp
cfe/trunk/lib/Analysis/ProgramPoint.cpp
cfe/trunk/lib/Analysis/ReachableCode.cpp
cfe/trunk/lib/Analysis/ThreadSafety.cpp
cfe/trunk/lib/Analysis/UninitializedValues.cpp
cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
cfe/trunk/lib/StaticAnalyzer/Checkers/UnreachableCodeChecker.cpp
cfe/trunk/lib/StaticAnalyzer/Core/BugReporter.cpp
cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
cfe/trunk/lib/StaticAnalyzer/Core/CoreEngine.cpp
cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
cfe/trunk/lib/StaticAnalyzer/Core/LoopUnrolling.cpp
cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp

Modified: cfe/trunk/include/clang/Analysis/CFG.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/CFG.h?rev=361586=361585=361586=diff
==
--- cfe/trunk/include/clang/Analysis/CFG.h (original)
+++ cfe/trunk/include/clang/Analysis/CFG.h Thu May 23 18:34:22 2019
@@ -494,33 +494,44 @@ private:
 
 /// Represents CFGBlock terminator statement.
 ///
-/// TemporaryDtorsBranch bit is set to true if the terminator marks a branch
-/// in control flow of destructors of temporaries. In this case terminator
-/// statement is the same statement that branches control flow in evaluation
-/// of matching full expression.
 class CFGTerminator {
-  llvm::PointerIntPair Data;
+public:
+  enum Kind {
+/// A branch that corresponds to a statement in the code,
+/// such as an if-statement.
+StmtBranch,
+/// A branch in control flow of destructors of temporaries. In this case
+/// terminator statement is the same statement that branches control flow
+/// in evaluation of matching full expression.
+TemporaryDtorsBranch,
+
+/// Number of different kinds, for sanity checks. We subtract 1 so that
+/// to keep receiving compiler warnings when we don't cover all enum values
+/// in a switch.
+NumKindsMinusOne = TemporaryDtorsBranch
+  };
+
+private:
+  static constexpr int KindBits = 1;
+  static_assert((1 << KindBits) > NumKindsMinusOne,
+"Not enough room for kind!");
+  llvm::PointerIntPair Data;
 
 public:
-  CFGTerminator() = default;
-  CFGTerminator(Stmt *S, bool TemporaryDtorsBranch = false)
-  : Data(S, TemporaryDtorsBranch) {}
+  CFGTerminator() { assert(!isValid()); }
+  CFGTerminator(Stmt *S, Kind K = StmtBranch) : Data(S, K) {}
 
+  bool isValid() const { return Data.getOpaqueValue() != nullptr; }
   Stmt *getStmt() { return Data.getPointer(); }
   const Stmt *getStmt() const { return Data.getPointer(); }
+  Kind getKind() const { return static_cast(Data.getInt()); }
 
-  bool isTemporaryDtorsBranch() const { return Data.getInt(); }
-
-  operator Stmt *() { return getStmt(); }
-  operator const Stmt *() const { return getStmt(); }
-
-  Stmt *operator->() { return getStmt(); }
-  const Stmt *operator->() const { return getStmt(); }
-
-  Stmt *() { return *getStmt(); }
-  const Stmt *() const { return *getStmt(); }
-
-  explicit operator bool() const { return getStmt(); }
+  bool isStmtBranch() const {
+return getKind() == StmtBranch;
+  }
+  bool isTemporaryDtorsBranch() const {
+return getKind() == TemporaryDtorsBranch;
+  }
 };
 
 /// Represents a single basic block in a source-level CFG.
@@ -836,8 +847,10 @@ public:
   void setLoopTarget(const Stmt *loopTarget) { LoopTarget = loopTarget; }
   void setHasNoReturnElement() { HasNoReturnElement = true; }
 
-  CFGTerminator getTerminator() { return Terminator; }
-  const CFGTerminator getTerminator() const { return Terminator; }
+  CFGTerminator getTerminator() const { return Terminator; }
+
+  Stmt *getTerminatorStmt() { return Terminator.getStmt(); }
+  const Stmt *getTerminatorStmt() const { return Terminator.getStmt(); }
 
   Stmt *getTerminatorCondition(bool StripParens = true);
 

Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=361586=361585=361586=diff
==
--- 

[PATCH] D62363: Enable intrinsics that convert float and bf16 data to each other

2019-05-23 Thread Kan Shengchen via Phabricator via cfe-commits
skan created this revision.
skan added reviewers: xiangzhangllvm, LuoYuanke, craig.topper.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Scalar version : 
 `_mm_cvtsbh_ss`  , `_mm_cvtness_sbh`

Vector version:
`_mm512_cvtpbh_ps` , `_mm256_cvtpbh_ps`
`_mm512_maskz_cvtpbh_ps` , `_mm256_maskz_cvtpbh_ps`
`_mm512_mask_cvtpbh_ps` , `_mm256_mask_cvtpbh_ps`


Repository:
  rC Clang

https://reviews.llvm.org/D62363

Files:
  include/clang/Basic/BuiltinsX86.def
  lib/CodeGen/CGBuiltin.cpp
  lib/Headers/avx512bf16intrin.h
  test/CodeGen/avx512bf16-builtins.c

Index: test/CodeGen/avx512bf16-builtins.c
===
--- test/CodeGen/avx512bf16-builtins.c
+++ test/CodeGen/avx512bf16-builtins.c
@@ -4,46 +4,64 @@
 
 #include 
 
-__m512bh test_mm512_cvtne2ps2bf16(__m512 A, __m512 B) {
-  // CHECK-LABEL: @test_mm512_cvtne2ps2bf16
+float test_mm_cvtsbh_ss(__bfloat16 A) {
+  // CHECK-LABEL: @test_mm_cvtsbh_ss
+  // CHECK: zext i16 %{{.*}} to i32
+  // CHECK: shl i32 %{{.*}}, 16
+  // CHECK: bitcast i32 %{{.*}} to float
+  // CHECK: ret float %{{.*}}
+  return _mm_cvtsbh_ss(A);
+}
+
+__bfloat16 test_mm_cvtness_sbh(float A) {
+  // CHECK-LABEL: @test_mm_cvtness_sbh
+  // CHECK: bitcast float %{{.*}} to i32
+  // CHECK: lshr i32 %{{.*}}, 16
+  // CHECK: trunc i32 %{{.*}} to i16
+  // CHECK: ret i16 %{{.*}}
+  return _mm_cvtness_sbh(A);
+}
+
+__m512bh test_mm512_cvtne2ps_pbh(__m512 A, __m512 B) {
+  // CHECK-LABEL: @test_mm512_cvtne2ps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
   // CHECK: ret <32 x i16> %{{.*}}
   return _mm512_cvtne2ps_pbh(A, B);
 }
 
-__m512bh test_mm512_maskz_cvtne2ps2bf16(__m512 A, __m512 B, __mmask32 U) {
-  // CHECK-LABEL: @test_mm512_maskz_cvtne2ps2bf16
+__m512bh test_mm512_maskz_cvtne2ps_pbh(__m512 A, __m512 B, __mmask32 U) {
+  // CHECK-LABEL: @test_mm512_maskz_cvtne2ps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
   // CHECK: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
   // CHECK: ret <32 x i16> %{{.*}}
   return _mm512_maskz_cvtne2ps_pbh(U, A, B);
 }
 
-__m512bh test_mm512_mask_cvtne2ps2bf16(__m512bh C, __mmask32 U, __m512 A, __m512 B) {
-  // CHECK-LABEL: @test_mm512_mask_cvtne2ps2bf16
+__m512bh test_mm512_mask_cvtne2ps_pbh(__m512bh C, __mmask32 U, __m512 A, __m512 B) {
+  // CHECK-LABEL: @test_mm512_mask_cvtne2ps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtne2ps2bf16.512
   // CHECK: select <32 x i1> %{{.*}}, <32 x i16> %{{.*}}, <32 x i16> %{{.*}}
   // CHECK: ret <32 x i16> %{{.*}}
   return _mm512_mask_cvtne2ps_pbh(C, U, A, B);
 }
 
-__m256bh test_mm512_cvtneps2bf16(__m512 A) {
-  // CHECK-LABEL: @test_mm512_cvtneps2bf16
+__m256bh test_mm512_cvtneps_pbh(__m512 A) {
+  // CHECK-LABEL: @test_mm512_cvtneps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
   // CHECK: ret <16 x i16> %{{.*}}
   return _mm512_cvtneps_pbh(A);
 }
 
-__m256bh test_mm512_mask_cvtneps2bf16(__m256bh C, __mmask16 U, __m512 A) {
-  // CHECK-LABEL: @test_mm512_mask_cvtneps2bf16
+__m256bh test_mm512_mask_cvtneps_pbh(__m256bh C, __mmask16 U, __m512 A) {
+  // CHECK-LABEL: @test_mm512_mask_cvtneps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
   // CHECK: select <16 x i1> %{{.*}}, <16 x i16> %{{.*}}, <16 x i16> %{{.*}}
   // CHECK: ret <16 x i16> %{{.*}}
   return _mm512_mask_cvtneps_pbh(C, U, A);
 }
 
-__m256bh test_mm512_maskz_cvtneps2bf16(__m512 A, __mmask16 U) {
-  // CHECK-LABEL: @test_mm512_maskz_cvtneps2bf16
+__m256bh test_mm512_maskz_cvtneps_pbh(__m512 A, __mmask16 U) {
+  // CHECK-LABEL: @test_mm512_maskz_cvtneps_pbh
   // CHECK: @llvm.x86.avx512bf16.cvtneps2bf16.512
   // CHECK: select <16 x i1> %{{.*}}, <16 x i16> %{{.*}}, <16 x i16> %{{.*}}
   // CHECK: ret <16 x i16> %{{.*}}
@@ -72,3 +90,61 @@
   // CHECK: ret <16 x float> %{{.*}}
   return _mm512_mask_dpbf16_ps(D, U, A, B);
 }
+
+__m512 test_mm512_cvtpbh_ps(__m256bh A) {
+  // CHECK-LABEL: @test_mm512_cvtpbh_ps
+  // CHECK: sext <16 x i16> %{{.*}} to <16 x i32>
+  // CHECK: @llvm.x86.avx512.pslli.d.512
+  // CHECK: bitcast <8 x i64> %{{.*}} to <16 x float>
+  // CHECK: ret <16 x float> %{{.*}}
+  return _mm512_cvtpbh_ps(A);
+}
+
+__m256 test_mm256_cvtpbh_ps(__m128bh A) {
+  // CHECK-LABEL: @test_mm256_cvtpbh_ps
+  // CHECK: sext <8 x i16> %{{.*}} to <8 x i32>
+  // CHECK: @llvm.x86.avx2.pslli.d
+  // CHECK: bitcast <4 x i64> %{{.*}} to <8 x float>
+  // CHECK: ret <8 x float> %{{.*}}
+  return _mm256_cvtpbh_ps(A);
+}
+
+__m512 test_mm512_maskz_cvtpbh_ps(__mmask16 M, __m256bh A) {
+  // CHECK-LABEL: @test_mm512_maskz_cvtpbh_ps
+  // CHECK: sext <16 x i16> %{{.*}} to <16 x i32>
+  // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
+  // CHECK: @llvm.x86.avx512.pslli.d.512
+  // CHECK: bitcast <8 x i64> %{{.*}} to <16 x float>
+  // CHECK: ret <16 x float> %{{.*}}
+  return _mm512_maskz_cvtpbh_ps(M, A);
+}
+
+__m256 test_mm256_maskz_cvtpbh_ps(__mmask8 M, __m128bh A) {
+  // CHECK-LABEL: 

[PATCH] D61809: [BPF] Preserve debuginfo array/union/struct type/access index

2019-05-23 Thread Alexei Starovoitov via Phabricator via cfe-commits
ast accepted this revision.
ast added a comment.
This revision is now accepted and ready to land.

from kernel, libbpf, tooling and user experience points of view this approach 
looks the best to me.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61809/new/

https://reviews.llvm.org/D61809



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


[PATCH] D61809: [BPF] Preserve debuginfo array/union/struct type/access index

2019-05-23 Thread Yonghong Song via Phabricator via cfe-commits
yonghong-song marked an inline comment as done.
yonghong-song added inline comments.



Comment at: test/CodeGen/bpf-offsetreloc.c:2-4
+// RUN: grep "llvm.preserve.struct.access.index" %t1
+// RUN: grep "llvm.preserve.array.access.index" %t1
+// RUN: grep "llvm.preserve.union.access.index" %t1

lebedev.ri wrote:
> This looks like a bad test.
> Can't you use FileCheck?
> I'd think there is more to test than a single tiny test..
Thanks. I will add more tests with FileCheck once we get an agreement for the 
general approach.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61809/new/

https://reviews.llvm.org/D61809



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


[PATCH] D60974: Clang IFSO driver action.

2019-05-23 Thread Puyan Lotfi via Phabricator via cfe-commits
plotfi updated this revision to Diff 201104.
plotfi added a comment.

Improving visibility extraction for class template specializations.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60974/new/

https://reviews.llvm.org/D60974

Files:
  clang/include/clang/Driver/Options.td
  clang/include/clang/Driver/Types.def
  clang/include/clang/Frontend/FrontendActions.h
  clang/include/clang/Frontend/FrontendOptions.h
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Frontend/CMakeLists.txt
  clang/lib/Frontend/CompilerInvocation.cpp
  clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp
  clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
  clang/test/InterfaceStubs/bad-format.cpp
  clang/test/InterfaceStubs/class-template-specialization.cpp
  clang/test/InterfaceStubs/externstatic.c
  clang/test/InterfaceStubs/function-template-specialization.cpp
  clang/test/InterfaceStubs/inline.c
  clang/test/InterfaceStubs/inline.h
  clang/test/InterfaceStubs/object.cpp
  clang/test/InterfaceStubs/template-namespace-function.cpp
  clang/test/InterfaceStubs/visibility.cpp
  clang/test/InterfaceStubs/weak.cpp

Index: clang/test/InterfaceStubs/weak.cpp
===
--- /dev/null
+++ clang/test/InterfaceStubs/weak.cpp
@@ -0,0 +1,22 @@
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | \
+// RUN: FileCheck %s
+
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-yaml-elf-v1 %s | \
+// RUN: FileCheck --check-prefix=CHECK-YAML %s
+
+// CHECK: Symbols:
+// CHECK-NEXT:  _Z8weakFuncv: { Type: Func, Weak: true }
+// CHECK-NEXT:  _Z10strongFuncv: { Type: Func }
+
+// CHECK-YAML: Symbols:
+// CHECK-YAML-NEXT:   - Name:_Z8weakFuncv
+// CHECK-YAML-NEXT: Type:STT_FUNC
+// CHECK-YAML-NEXT: Binding: STB_WEAK
+// CHECK-YAML-NEXT:   - Name:_Z10strongFuncv
+// CHECK-YAML-NEXT: Type:STT_FUNC
+// CHECK-YAML-NEXT: Binding: STB_GLOBAL
+
+__attribute__((weak)) void weakFunc() {}
+int strongFunc() {}
Index: clang/test/InterfaceStubs/visibility.cpp
===
--- /dev/null
+++ clang/test/InterfaceStubs/visibility.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-tapi-elf-v1 -fvisibility=hidden \
+// RUN: %s | FileCheck --check-prefix=CHECK-CMD-HIDDEN %s
+
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-yaml-elf-v1 -fvisibility=hidden \
+// RUN: %s | FileCheck --check-prefix=CHECK-CMD-HIDDEN %s
+
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | FileCheck %s
+
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-yaml-elf-v1 %s | FileCheck %s
+
+// Always Be Hidden:
+// CHECK-CMD-HIDDEN-NOT: _Z6hiddenv
+// CHECK-NOT: _Z6hiddenv
+__attribute__((visibility("hidden"))) void hidden() {}
+
+// Always Be Visible:
+// CHECK-CMD-HIDDEN: _Z9nothiddenv
+// CHECK: _Z9nothiddenv
+__attribute__((visibility("default"))) void nothidden() {}
+
+// Do Whatever -fvisibility says:
+// CHECK-CMD-HIDDEN-NOT: _Z10cmdVisiblev
+// CHECK: _Z10cmdVisiblev
+void cmdVisible() {}
Index: clang/test/InterfaceStubs/template-namespace-function.cpp
===
--- /dev/null
+++ clang/test/InterfaceStubs/template-namespace-function.cpp
@@ -0,0 +1,22 @@
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | \
+// RUN: FileCheck %s
+
+// CHECK: Symbols:
+// CHECK-NEXT:  _ZN3qux3barEii: { Type: Func }
+// CHECK-NEXT:  _ZN3baz3addIiEET_S1_S1_: { Type: Func }
+// CHECK-NEXT:  _Z4fbarff: { Type: Func }
+// CHECK-NEXT:  _ZN3baz3addIfEET_S1_S1_: { Type: Func }
+
+namespace baz {
+template 
+T add(T a, T b) {
+  return a + b;
+}
+} // namespace baz
+
+namespace qux {
+int bar(int a, int b) { return baz::add(a, b); }
+} // namespace qux
+
+float fbar(float a, float b) { return baz::add(a, b); }
Index: clang/test/InterfaceStubs/object.cpp
===
--- /dev/null
+++ clang/test/InterfaceStubs/object.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang -target x86_64-linux-gnu -o - -emit-interface-stubs \
+// RUN: -interface-stub-version=experimental-tapi-elf-v1 %s | \
+// RUN: FileCheck %s
+
+// CHECK: data: { Type: Object, Size: 4 }
+int data = 1844;
Index: clang/test/InterfaceStubs/inline.h
===
--- /dev/null
+++ clang/test/InterfaceStubs/inline.h
@@ -0,0 

Re: r361340 - [Analysis] Link library dependencies to Analysis plugins

2019-05-23 Thread Akira Hatanaka via cfe-commits
Hi Petr,

This seems to have caused Analysis/checker-plugins.c to fail. Can you 
investigate it or revert your commit?

http://green.lab.llvm.org/green/job/clang-stage2-cmake-RgSan/6381/consoleFull#-5275661368254eaf0-7326-4999-85b0-388101f2d404

> On May 21, 2019, at 5:47 PM, Petr Hosek via cfe-commits 
>  wrote:
> 
> Author: phosek
> Date: Tue May 21 17:47:37 2019
> New Revision: 361340
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=361340=rev
> Log:
> [Analysis] Link library dependencies to Analysis plugins
> 
> These are needed to avoid undefined symbols which aren't satisfied
> by Clang itself.
> 
> Differential Revision: https://reviews.llvm.org/D62174
> 
> Modified:
>cfe/trunk/test/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt
>cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt
>cfe/trunk/test/Analysis/plugins/SampleAnalyzer/CMakeLists.txt
> 
> Modified: 
> cfe/trunk/test/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt?rev=361340=361339=361340=diff
> ==
> --- cfe/trunk/test/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt 
> (original)
> +++ cfe/trunk/test/Analysis/plugins/CheckerDependencyHandling/CMakeLists.txt 
> Tue May 21 17:47:37 2019
> @@ -1,11 +1,12 @@
> set(LLVM_EXPORTED_SYMBOL_FILE 
> ${CMAKE_CURRENT_SOURCE_DIR}/CheckerDependencyHandlingAnalyzerPlugin.exports)
> add_llvm_library(CheckerDependencyHandlingAnalyzerPlugin MODULE 
> CheckerDependencyHandling.cpp PLUGIN_TOOL clang)
> 
> -if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
> +if(LLVM_ENABLE_PLUGINS)
>   target_link_libraries(CheckerDependencyHandlingAnalyzerPlugin PRIVATE
> clangAnalysis
> clangAST
> clangStaticAnalyzerCore
> +clangStaticAnalyzerFrontend
> LLVMSupport
> )
> endif()
> 
> Modified: cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt?rev=361340=361339=361340=diff
> ==
> --- cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt 
> (original)
> +++ cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CMakeLists.txt Tue 
> May 21 17:47:37 2019
> @@ -1,11 +1,12 @@
> set(LLVM_EXPORTED_SYMBOL_FILE 
> ${CMAKE_CURRENT_SOURCE_DIR}/CheckerOptionHandlingAnalyzerPlugin.exports)
> add_llvm_library(CheckerOptionHandlingAnalyzerPlugin MODULE 
> CheckerOptionHandling.cpp PLUGIN_TOOL clang)
> 
> -if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
> +if(LLVM_ENABLE_PLUGINS)
>   target_link_libraries(CheckerOptionHandlingAnalyzerPlugin PRIVATE
> clangAnalysis
> clangAST
> clangStaticAnalyzerCore
> +clangStaticAnalyzerFrontend
> LLVMSupport
> )
> endif()
> 
> Modified: cfe/trunk/test/Analysis/plugins/SampleAnalyzer/CMakeLists.txt
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/plugins/SampleAnalyzer/CMakeLists.txt?rev=361340=361339=361340=diff
> ==
> --- cfe/trunk/test/Analysis/plugins/SampleAnalyzer/CMakeLists.txt (original)
> +++ cfe/trunk/test/Analysis/plugins/SampleAnalyzer/CMakeLists.txt Tue May 21 
> 17:47:37 2019
> @@ -1,11 +1,12 @@
> set(LLVM_EXPORTED_SYMBOL_FILE 
> ${CMAKE_CURRENT_SOURCE_DIR}/SampleAnalyzerPlugin.exports)
> add_llvm_library(SampleAnalyzerPlugin MODULE MainCallChecker.cpp PLUGIN_TOOL 
> clang)
> 
> -if(LLVM_ENABLE_PLUGINS AND (WIN32 OR CYGWIN))
> +if(LLVM_ENABLE_PLUGINS)
>   target_link_libraries(SampleAnalyzerPlugin PRIVATE
> clangAnalysis
> clangAST
> clangStaticAnalyzerCore
> +clangStaticAnalyzerFrontend
> LLVMSupport
> )
> endif()
> 
> 
> ___
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> 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


[PATCH] D38479: Make -mgeneral-regs-only more like GCC's

2019-05-23 Thread Eli Friedman via Phabricator via cfe-commits
efriedma added inline comments.



Comment at: clang/lib/Sema/SemaExprCXX.cpp:8003
+!isRValueOfIllegalType(E) &&
+E->isConstantInitializer(S.getASTContext(), /*ForRef=*/false)) {
+  resetDiagnosticState(InitialState);

george.burgess.iv wrote:
> efriedma wrote:
> > Just because we can constant-fold an expression, doesn't mean we will, 
> > especially at -O0.
> Are there any guarantees that we offer along these lines? The code in 
> particular that this cares about boils down to a bunch of integer literals 
> doing mixed math with FP literals, all of which gets casted to an `int`. 
> Conceptually, it seems silly to me to emit an addition for something as 
> straightforward as `int i = 1 + 2.0;`, even at -O0, though I totally agree 
> that you're right, and codegen like this is reasonable at -O0: 
> https://godbolt.org/z/NS0L17
> 
> (This also brings up a good point: this visitor probably shouldn't be run on 
> `IsConstexpr` expressions; fixed that later on)
On trunk, we now have the notion of a ConstantExpr; this represents an 
expression which the language guarantees must be constant-evaluated.  For 
example, initializers for static variables in C are always constant-evaluated.

(On a related note, now that we have ConstantExpr, the IsConstexpr operand to 
ActOnFinishFullExpr probably isn't necessary.)

Beyond that, no, we don't really have any guarantees.  We may or may not try to 
constant-evaluate an expression, depending on whether we think it'll save 
compile-time.  For example, we try to fold branch conditions to avoid emitting 
the guarded block of code, but we don't try to fold the initialization of an 
arbitrary variable.

I don't think we want to introduce any additional guarantees here, if we can 
avoid it.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D38479/new/

https://reviews.llvm.org/D38479



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


[PATCH] D62094: [analyzer] List checker/plugin options in 3 categories: released, alpha, developer

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
Szelethus added a comment.

Alright, builbots don't seem to complain just yet. Thank you so much for all 
the help!!! This patch concludes the analyzer configuration project for good :)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62094/new/

https://reviews.llvm.org/D62094



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


r361571 - Fix hang during constant evaluation of union assignment.

2019-05-23 Thread Eric Fiselier via cfe-commits
Author: ericwf
Date: Thu May 23 16:34:43 2019
New Revision: 361571

URL: http://llvm.org/viewvc/llvm-project?rev=361571=rev
Log:
Fix hang during constant evaluation of union assignment.

HandleUnionActiveMemberChange forgot to walk over a nop implicit
conversion node and got stuck in the process.

As a cleanup I changed the declaration of `E` so it can't
be accidentally accessed after the loop.

Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=361571=361570=361571=diff
==
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu May 23 16:34:43 2019
@@ -4994,9 +4994,8 @@ static bool HandleUnionActiveMemberChang
   llvm::SmallVector, 4> UnionPathLengths;
   // C++ [class.union]p5:
   //   define the set S(E) of subexpressions of E as follows:
-  const Expr *E = LHSExpr;
   unsigned PathLength = LHS.Designator.Entries.size();
-  while (E) {
+  for (const Expr *E = LHSExpr; E != nullptr;) {
 //   -- If E is of the form A.B, S(E) contains the elements of S(A)...
 if (auto *ME = dyn_cast(E)) {
   auto *FD = dyn_cast(ME->getMemberDecl());
@@ -5026,6 +5025,7 @@ static bool HandleUnionActiveMemberChang
 
 } else if (auto *ICE = dyn_cast(E)) {
   // Step over a derived-to-base conversion.
+  E = ICE->getSubExpr();
   if (ICE->getCastKind() == CK_NoOp)
 continue;
   if (ICE->getCastKind() != CK_DerivedToBase &&
@@ -5038,7 +5038,6 @@ static bool HandleUnionActiveMemberChang
   LHS.Designator.Entries[PathLength]
   .getAsBaseOrMember().getPointer()));
   }
-  E = ICE->getSubExpr();
 
 //   -- Otherwise, S(E) is empty.
 } else {

Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp?rev=361571=361570=361571=diff
==
--- cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp Thu May 23 16:34:43 
2019
@@ -513,4 +513,12 @@ namespace Union {
   static_assert(return_init_all().a.p == 7); // expected-error {{}} 
expected-note {{read of member 'p' of union with no active member}}
   static_assert(return_init_all().a.q == 8); // expected-error {{}} 
expected-note {{read of member 'q' of union with no active member}}
   constexpr B init_all = return_init_all();
+
+  constexpr bool test_no_member_change =  []{
+union U { char dummy = {}; };
+U u1;
+U u2;
+u1 = u2;
+return true;
+  }();
 }


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


[PATCH] D62225: [clang][NewPM] Fixing -O0 tests that are broken under new PM

2019-05-23 Thread Leonard Chan via Phabricator via cfe-commits
leonardchan updated this revision to Diff 201089.
leonardchan edited the summary of this revision.
Herald added a subscriber: aprantl.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62225/new/

https://reviews.llvm.org/D62225

Files:
  clang/lib/CodeGen/BackendUtil.cpp
  clang/test/CodeGen/aarch64-neon-across.c
  clang/test/CodeGen/aarch64-neon-fcvt-intrinsics.c
  clang/test/CodeGen/aarch64-neon-fma.c
  clang/test/CodeGen/aarch64-neon-perm.c
  clang/test/CodeGen/aarch64-neon-tbl.c
  clang/test/CodeGen/aarch64-poly128.c
  clang/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c
  clang/test/CodeGen/aggregate-assign-call.c
  clang/test/CodeGen/arm-neon-fma.c
  clang/test/CodeGen/arm-neon-numeric-maxmin.c
  clang/test/CodeGen/arm-neon-vcvtX.c
  clang/test/CodeGen/arm_acle.c
  clang/test/CodeGen/available-externally-suppress.c
  clang/test/CodeGen/avx-builtins.c
  clang/test/CodeGen/builtin-movdir.c
  clang/test/CodeGen/builtins-ppc-p9vector.c
  clang/test/CodeGen/builtins-ppc-vsx.c
  clang/test/CodeGen/flatten.c
  clang/test/CodeGen/lto-newpm-pipeline.c
  clang/test/CodeGen/pgo-instrumentation.c
  clang/test/CodeGen/pgo-sample.c
  clang/test/CodeGen/split-debug-single-file.c
  clang/test/CodeGen/sse-builtins.c
  clang/test/CodeGen/sse2-builtins.c
  clang/test/CodeGen/x86_64-instrument-functions.c
  clang/test/CodeGenCXX/conditional-temporaries.cpp
  clang/test/CodeGenCXX/flatten.cpp
  clang/test/CodeGenCXX/member-function-pointer-calls.cpp
  clang/test/CodeGenObjC/os_log.m
  clang/test/CodeGenOpenCL/convergent.cl
  clang/test/CoverageMapping/unused_names.c
  llvm/lib/Transforms/IPO/AlwaysInliner.cpp

Index: llvm/lib/Transforms/IPO/AlwaysInliner.cpp
===
--- llvm/lib/Transforms/IPO/AlwaysInliner.cpp
+++ llvm/lib/Transforms/IPO/AlwaysInliner.cpp
@@ -31,8 +31,17 @@
 
 #define DEBUG_TYPE "inline"
 
-PreservedAnalyses AlwaysInlinerPass::run(Module , ModuleAnalysisManager &) {
-  InlineFunctionInfo IFI;
+PreservedAnalyses AlwaysInlinerPass::run(Module , ModuleAnalysisManager ) {
+  // Attach an inline assumption cache such that AddAlignmentAssumptions() is
+  // called to match the codegen for the legacy PM.
+  FunctionAnalysisManager  =
+  AM.getResult(M).getManager();
+  std::function GetAssumptionCache =
+  [&](Function ) -> AssumptionCache & {
+return FAM.getResult(F);
+  };
+  InlineFunctionInfo IFI(/*cg=*/nullptr, );
+
   SmallSetVector Calls;
   bool Changed = false;
   SmallVector InlinedFunctions;
Index: clang/test/CoverageMapping/unused_names.c
===
--- clang/test/CoverageMapping/unused_names.c
+++ clang/test/CoverageMapping/unused_names.c
@@ -1,5 +1,3 @@
-// UNSUPPORTED: experimental-new-pass-manager
-
 // RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -main-file-name unused_names.c -o - %s > %t
 // RUN: FileCheck -input-file %t %s
 // RUN: FileCheck -check-prefix=SYSHEADER -input-file %t %s
Index: clang/test/CodeGenOpenCL/convergent.cl
===
--- clang/test/CodeGenOpenCL/convergent.cl
+++ clang/test/CodeGenOpenCL/convergent.cl
@@ -1,6 +1,5 @@
-// UNSUPPORTED: experimental-new-pass-manager
-
-// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm %s -o - | opt -instnamer -S | FileCheck -enable-var-scope %s
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm %s -o - -fno-experimental-new-pass-manager | opt -instnamer -S | FileCheck -enable-var-scope %s --check-prefixes=CHECK,CHECK-LEGACY
+// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm %s -o - -fexperimental-new-pass-manager | opt -instnamer -S | FileCheck -enable-var-scope %s --check-prefixes=CHECK,CHECK-NEWPM
 
 // This is initially assumed convergent, but can be deduced to not require it.
 
@@ -119,7 +118,12 @@
 // CHECK: [[for_body]]:
 // CHECK:  tail call spir_func void @nodupfun() #[[attr5:[0-9]+]]
 // CHECK-NOT: call spir_func void @nodupfun()
-// CHECK:  br i1 %{{.+}}, label %[[for_body]], label %[[for_cond_cleanup]]
+
+// The new PM produces a slightly different IR for the loop from the legacy PM,
+// but the test still checks that the loop is not unrolled.
+// CHECK-LEGACY:  br i1 %{{.+}}, label %[[for_body]], label %[[for_cond_cleanup]]
+// CHECK-NEW: br i1 %{{.+}}, label %[[for_body_crit_edge:.+]], label %[[for_cond_cleanup]]
+// CHECK-NEW: [[for_body_crit_edge]]:
 
 void test_not_unroll() {
   for (int i = 0; i < 10; i++)
Index: clang/test/CodeGenObjC/os_log.m
===
--- clang/test/CodeGenObjC/os_log.m
+++ clang/test/CodeGenObjC/os_log.m
@@ -1,6 +1,4 @@
-// UNSUPPORTED: experimental-new-pass-manager
-
-// RUN: %clang_cc1 %s -emit-llvm -o - -triple x86_64-darwin-apple -fobjc-arc -O2 | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -o - -triple x86_64-darwin-apple -fobjc-arc -O2 

[PATCH] D62094: [analyzer] List checker/plugin options in 3 categories: released, alpha, developer

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
Szelethus added a comment.

Ops, committed in rC361566  with the 
wrong revision name.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62094/new/

https://reviews.llvm.org/D62094



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


[PATCH] D62093: [analyzer] List checkers in 3 categories: released, alpha, developer

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
Szelethus added a comment.

rC361566  is incorrectly marked for this 
revision instead of D62094 .


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62093/new/

https://reviews.llvm.org/D62093



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


r361566 - [analyzer] List checker/plugin options in 3 categories: released, alpha, developer

2019-05-23 Thread Kristof Umann via cfe-commits
Author: szelethus
Date: Thu May 23 15:52:09 2019
New Revision: 361566

URL: http://llvm.org/viewvc/llvm-project?rev=361566=rev
Log:
[analyzer] List checker/plugin options in 3 categories: released, alpha, 
developer

Same patch as D62093, but for checker/plugin options, the only
difference being that options for alpha checkers are implicitly marked
as alpha.

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

Modified:
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
cfe/trunk/test/Analysis/analyzer-checker-option-help.c

cfe/trunk/test/Analysis/plugins/CheckerOptionHandling/CheckerOptionHandling.cpp
cfe/trunk/utils/TableGen/ClangSACheckersEmitter.cpp

Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=361566=361565=361566=diff
==
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Thu May 23 15:52:09 2019
@@ -151,6 +151,11 @@ def analyzer_config : Separate<["-"], "a
 def analyzer_checker_option_help : Flag<["-"], "analyzer-checker-option-help">,
   HelpText<"Display the list of checker and package options">;
 
+def analyzer_checker_option_help_alpha : Flag<["-"], 
"analyzer-checker-option-help-alpha">,
+  HelpText<"Display the list of in development checker and package options. "
+   "These are NOT considered safe, they are unstable and will emit "
+   "incorrect reports. Enable ONLY FOR DEVELOPMENT purposes">;
+
 def analyzer_checker_option_help_developer : Flag<["-"], 
"analyzer-checker-option-help-developer">,
   HelpText<"Display the list of checker and package options meant for "
"development purposes only">;

Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td?rev=361566=361565=361566=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td Thu May 23 
15:52:09 2019
@@ -21,10 +21,21 @@ def Integer : CmdLineOptionTypeEnum<0>;
 def String : CmdLineOptionTypeEnum<1>;
 def Boolean : CmdLineOptionTypeEnum<2>;
 
-class Type {
-  bits<2> Type = val.Type;
+/// Describes the state of the entry. We wouldn't like to display, for example,
+/// developer only entries for a list meant for end users.
+class DevelopmentStageEnum val> {
+  bits<1> Val = val;
 }
 
+/// Alpha entries are under development, might be incomplet, inkorrekt and
+/// unstable.
+def InAlpha : DevelopmentStageEnum<0>;
+
+/// Released entries are stable, produce minimal, if any false positives,
+/// and emits reports that explain the occurance of the bug understandably and
+/// thoroughly.
+def Released : DevelopmentStageEnum<1>;
+
 /// Marks the entry hidden. Hidden entries won't be displayed in
 /// -analyzer-checker-option-help.
 class HiddenEnum {
@@ -35,11 +46,13 @@ def Hide : HiddenEnum<1>;
 
 /// Describes an option for a checker or a package.
 class CmdLineOption {
+string defaultVal, DevelopmentStageEnum stage,
+HiddenEnum isHidden = DontHide> {
   bits<2> Type = type.Type;
   string  CmdFlag = cmdFlag;
   string  Desc = desc;
   string  DefaultVal = defaultVal;
+  bits<1> DevelopmentStage = stage.Val;
   bit Hidden = isHidden.Val;
 }
 

Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=361566=361565=361566=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td Thu May 23 
15:52:09 2019
@@ -51,7 +51,8 @@ def Nullability : Package<"nullability">
   "concerned with your custom nullability annotations more "
   "than with following nullability specifications of system "
   "header functions.",
-  "false">
+  "false",
+  Released>
   ]>;
 
 def Cplusplus : Package<"cplusplus">;
@@ -391,7 +392,8 @@ def DynamicMemoryModeling: Checker<"Dyna
   "If set to true, the checker assumes that all the "
  

r361564 - [OPENMP]Do not crash for const firstprivates.

2019-05-23 Thread Alexey Bataev via cfe-commits
Author: abataev
Date: Thu May 23 15:30:43 2019
New Revision: 361564

URL: http://llvm.org/viewvc/llvm-project?rev=361564=rev
Log:
[OPENMP]Do not crash for const firstprivates.

If the variable is a firstprivate variable and it was not emitted beause
this a constant variable with the constant initializer, we can use the
initial value instead of the variable itself. It also fixes the problem
with the compiler crash in this case.

Modified:
cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
cfe/trunk/test/OpenMP/parallel_firstprivate_codegen.cpp

Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=361564=361563=361564=diff
==
--- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Thu May 23 15:30:43 2019
@@ -758,7 +758,25 @@ bool CodeGenFunction::EmitOMPFirstprivat
 DeclRefExpr DRE(getContext(), const_cast(OrigVD),
 /*RefersToEnclosingVariableOrCapture=*/FD != nullptr,
 (*IRef)->getType(), VK_LValue, (*IRef)->getExprLoc());
-LValue OriginalLVal = EmitLValue();
+LValue OriginalLVal;
+if (!FD) {
+  // Check if the firstprivate variable is just a constant value.
+  ConstantEmission CE = tryEmitAsConstant();
+  if (CE && !CE.isReference()) {
+// Constant value, no need to create a copy.
+++IRef;
+++InitsRef;
+continue;
+  }
+  if (CE && CE.isReference()) {
+OriginalLVal = CE.getReferenceLValue(*this, );
+  } else {
+assert(!CE && "Expected non-constant firstprivate.");
+OriginalLVal = EmitLValue();
+  }
+} else {
+  OriginalLVal = EmitLValue();
+}
 QualType Type = VD->getType();
 if (Type->isArrayType()) {
   // Emit VarDecl with copy init for arrays.

Modified: cfe/trunk/test/OpenMP/parallel_firstprivate_codegen.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_firstprivate_codegen.cpp?rev=361564=361563=361564=diff
==
--- cfe/trunk/test/OpenMP/parallel_firstprivate_codegen.cpp (original)
+++ cfe/trunk/test/OpenMP/parallel_firstprivate_codegen.cpp Thu May 23 15:30:43 
2019
@@ -335,8 +335,9 @@ int main() {
 s_arr[0] = var;
 sivar = 2;
   }
-#pragma omp parallel allocate(omp_default_mem_alloc: t_var) firstprivate(t_var)
-  {}
+  const int a = 0;
+#pragma omp parallel allocate(omp_default_mem_alloc: t_var) 
firstprivate(t_var, a)
+  { t_var = a; }
   return tmain();
 #endif
 }
@@ -346,6 +347,7 @@ int main() {
 // CHECK: [[T_VAR:%.+]] = alloca i32,
 // CHECK: [[T_VARCAST:%.+]] = alloca [[iz:i64|i32]],
 // CHECK: [[SIVARCAST:%.+]] = alloca [[iz]],
+// CHECK: [[A:%.+]] = alloca i32,
 // CHECK: [[T_VARCAST1:%.+]] = alloca [[iz:i64|i32]],
 // CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
 // CHECK: [[T_VARVAL:%.+]] = load i32, i32* [[T_VAR]],
@@ -420,6 +422,7 @@ int main() {
 // CHECK-32: [[T_VAR_VAL:%.+]] = load i32, i32* [[T_VAR_ADDR]],
 // CHECK-64: [[T_VAR_VAL:%.+]] = load i32, i32* [[BC]],
 // CHECK:store i32 [[T_VAR_VAL]], i32* [[T_VAR_PRIV]],
+// CHECK:store i32 0, i32* [[T_VAR_PRIV]],
 // CHECK:call void @__kmpc_free(i32 [[GTID]], i8* [[T_VAR_VOID_PTR]], i8* 
inttoptr ([[iz]] 1 to i8*))
 // CHECK:ret void
 


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


[PATCH] D61839: [analyzer] Hide developer-only checker/package options by default

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC361561: [analyzer] Hide developer-only checker/package 
options by default (authored by Szelethus, committed by ).

Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61839/new/

https://reviews.llvm.org/D61839

Files:
  include/clang/Driver/CC1Options.td
  include/clang/StaticAnalyzer/Checkers/CheckerBase.td
  include/clang/StaticAnalyzer/Checkers/Checkers.td
  include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
  include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
  lib/Frontend/CompilerInvocation.cpp
  lib/FrontendTool/ExecuteCompilerInvocation.cpp
  lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
  test/Analysis/analyzer-checker-option-help.c
  utils/TableGen/ClangSACheckersEmitter.cpp

Index: test/Analysis/analyzer-checker-option-help.c
===
--- test/Analysis/analyzer-checker-option-help.c
+++ test/Analysis/analyzer-checker-option-help.c
@@ -1,5 +1,8 @@
 // RUN: %clang_cc1 -analyzer-checker-option-help 2>&1 | FileCheck %s
 
+// RUN: %clang_cc1 -analyzer-checker-option-help-developer \
+// RUN:   2>&1 | FileCheck %s -check-prefix=CHECK-HIDDEN
+
 // CHECK: OVERVIEW: Clang Static Analyzer Checker and Package Option List
 //
 // CHECK: USAGE: -analyzer-config 
@@ -17,3 +20,6 @@
 // CHECK:the first statement in the group is representative
 // CHECK:for all other statements in the group in
 // CHECK:terms of complexity. (default: 50)
+
+// CHECK-NOT: optin.cplusplus.UninitializedObject:NotesAsWarnings
+// CHECK-HIDDEN:  optin.cplusplus.UninitializedObject:NotesAsWarnings
Index: lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
===
--- lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
+++ lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
@@ -180,12 +180,12 @@
   addDependency(FULLNAME, DEPENDENCY);
 
 #define GET_CHECKER_OPTIONS
-#define CHECKER_OPTION(TYPE, FULLNAME, CMDFLAG, DESC, DEFAULT_VAL) \
-  addCheckerOption(TYPE, FULLNAME, CMDFLAG, DEFAULT_VAL, DESC);
+#define CHECKER_OPTION(TYPE, FULLNAME, CMDFLAG, DESC, DEFAULT_VAL, IS_HIDDEN)  \
+  addCheckerOption(TYPE, FULLNAME, CMDFLAG, DEFAULT_VAL, DESC, IS_HIDDEN);
 
 #define GET_PACKAGE_OPTIONS
-#define PACKAGE_OPTION(TYPE, FULLNAME, CMDFLAG, DESC, DEFAULT_VAL) \
-  addPackageOption(TYPE, FULLNAME, CMDFLAG, DEFAULT_VAL, DESC);
+#define PACKAGE_OPTION(TYPE, FULLNAME, CMDFLAG, DESC, DEFAULT_VAL, IS_HIDDEN)  \
+  addPackageOption(TYPE, FULLNAME, CMDFLAG, DEFAULT_VAL, DESC, IS_HIDDEN);
 
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #undef CHECKER_DEPENDENCY
@@ -396,10 +396,10 @@
StringRef PackageFullName,
StringRef OptionName,
StringRef DefaultValStr,
-   StringRef Description) {
+   StringRef Description, bool IsHidden) {
   PackageOptions.emplace_back(
-  PackageFullName,
-  CmdLineOption{OptionType, OptionName, DefaultValStr, Description});
+  PackageFullName, CmdLineOption{OptionType, OptionName, DefaultValStr,
+ Description, IsHidden});
 }
 
 void CheckerRegistry::addChecker(InitializationFunction Rfn,
@@ -421,10 +421,10 @@
StringRef CheckerFullName,
StringRef OptionName,
StringRef DefaultValStr,
-   StringRef Description) {
+   StringRef Description, bool IsHidden) {
   CheckerOptions.emplace_back(
-  CheckerFullName,
-  CmdLineOption{OptionType, OptionName, DefaultValStr, Description});
+  CheckerFullName, CmdLineOption{OptionType, OptionName, DefaultValStr,
+ Description, IsHidden});
 }
 
 void CheckerRegistry::initializeManager(CheckerManager ) const {
@@ -577,6 +577,9 @@
   }
 
   for (const std::pair  : OptionMap) {
+if (!AnOpts.ShowCheckerOptionDeveloperList && Entry.second.IsHidden)
+  continue;
+
 const CmdLineOption  = Entry.second;
 std::string FullOption = (Entry.first + ":" + Option.OptionName).str();
 
Index: lib/Frontend/CompilerInvocation.cpp
===
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -289,6 +289,8 @@
   Opts.ShowCheckerHelpDeveloper =
   Args.hasArg(OPT_analyzer_checker_help_developer);
   Opts.ShowCheckerOptionList = Args.hasArg(OPT_analyzer_checker_option_help);
+  Opts.ShowCheckerOptionDeveloperList =
+  Args.hasArg(OPT_analyzer_checker_option_help_developer);
   Opts.ShowConfigOptionsList = Args.hasArg(OPT_analyzer_config_help);
   

r361562 - Use clang_cc1 instead of clang in CodeGen test.

2019-05-23 Thread Alina Sbirlea via cfe-commits
Author: asbirlea
Date: Thu May 23 15:07:37 2019
New Revision: 361562

URL: http://llvm.org/viewvc/llvm-project?rev=361562=rev
Log:
Use clang_cc1 instead of clang in CodeGen test.

Modified:
cfe/trunk/test/CodeGen/loop-vectorize.c

Modified: cfe/trunk/test/CodeGen/loop-vectorize.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/loop-vectorize.c?rev=361562=361561=361562=diff
==
--- cfe/trunk/test/CodeGen/loop-vectorize.c (original)
+++ cfe/trunk/test/CodeGen/loop-vectorize.c Thu May 23 15:07:37 2019
@@ -1,7 +1,7 @@
-// RUN: %clang -target x86_64 -S -c -O1 -fvectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-ENABLE-VECT
-// RUN: %clang -target x86_64 -S -c -O1 -fno-vectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-DISABLE-VECT
-// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fvectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
-// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fno-vectorize -emit-llvm -o - %s | FileCheck %s 
-check-prefix=CHECK-DISABLE-VECT
+// RUN: %clang_cc1 -triple x86_64 -target-cpu x86-64 -S -O1 -vectorize-loops 
-emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang_cc1 -triple x86_64 -target-cpu x86-64 -S -O1 -emit-llvm -o - %s 
| FileCheck %s -check-prefix=CHECK-DISABLE-VECT
+// RUN: %clang_cc1 -triple x86_64 -target-cpu x86-64 
-fexperimental-new-pass-manager -S -O1 -vectorize-loops -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang_cc1 -triple x86_64 -target-cpu x86-64 
-fexperimental-new-pass-manager -S -O1 -emit-llvm -o - %s | FileCheck %s 
-check-prefix=CHECK-DISABLE-VECT
 
 // CHECK-ENABLE-VECT-LABEL: @for_test()
 // CHECK-ENABLE-VECT: fmul <{{[0-9]+}} x double>


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


r361561 - [analyzer] Hide developer-only checker/package options by default

2019-05-23 Thread Kristof Umann via cfe-commits
Author: szelethus
Date: Thu May 23 15:07:16 2019
New Revision: 361561

URL: http://llvm.org/viewvc/llvm-project?rev=361561=rev
Log:
[analyzer] Hide developer-only checker/package options by default

These options are now only visible under
-analyzer-checker-option-help-developer.

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

Modified:
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
cfe/trunk/test/Analysis/analyzer-checker-option-help.c
cfe/trunk/utils/TableGen/ClangSACheckersEmitter.cpp

Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=361561=361560=361561=diff
==
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Thu May 23 15:07:16 2019
@@ -151,6 +151,10 @@ def analyzer_config : Separate<["-"], "a
 def analyzer_checker_option_help : Flag<["-"], "analyzer-checker-option-help">,
   HelpText<"Display the list of checker and package options">;
 
+def analyzer_checker_option_help_developer : Flag<["-"], 
"analyzer-checker-option-help-developer">,
+  HelpText<"Display the list of checker and package options meant for "
+   "development purposes only">;
+
 def analyzer_config_compatibility_mode : Separate<["-"], 
"analyzer-config-compatibility-mode">,
   HelpText<"Don't emit errors on invalid analyzer-config inputs">;
 

Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td?rev=361561=361560=361561=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td Thu May 23 
15:07:16 2019
@@ -25,13 +25,22 @@ class Type {
   bits<2> Type = val.Type;
 }
 
+/// Marks the entry hidden. Hidden entries won't be displayed in
+/// -analyzer-checker-option-help.
+class HiddenEnum {
+  bit Val = val;
+}
+def DontHide : HiddenEnum<0>;
+def Hide : HiddenEnum<1>;
+
 /// Describes an option for a checker or a package.
 class CmdLineOption {
+string defaultVal, HiddenEnum isHidden = DontHide> {
   bits<2> Type = type.Type;
-  string CmdFlag = cmdFlag;
-  string Desc = desc;
-  string DefaultVal = defaultVal;
+  string  CmdFlag = cmdFlag;
+  string  Desc = desc;
+  string  DefaultVal = defaultVal;
+  bit Hidden = isHidden.Val;
 }
 
 /// Describes a list of package options.

Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=361561=361560=361561=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td Thu May 23 
15:07:16 2019
@@ -519,7 +519,8 @@ def UninitializedObjectChecker: Checker<
   "for each uninitalized field, as opposed to emitting one "
   "warning per constructor call, and listing the uninitialized 
"
   "fields that belongs to it in notes.",
-  "false">,
+  "false",
+  Hide>,
 CmdLineOption,
+  "true",
+  Hide>,
 CmdLineOption
+  "false",
+  Hide>
   ]>,
   Documentation;
 
@@ -1110,67 +1113,83 @@ def AnalysisOrderChecker : Checker<"Anal
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  "false",
+  Hide>,
 CmdLineOption,
+  

[PATCH] D62320: Fix LLVM_LINK_LLVM_DYLIB build after rC361285

2019-05-23 Thread Sam Clegg via Phabricator via cfe-commits
sbc100 abandoned this revision.
sbc100 added a comment.

This was fixed in https://reviews.llvm.org/D62333


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62320/new/

https://reviews.llvm.org/D62320



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


Re: [PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Chris Bieneman via cfe-commits


> On May 23, 2019, at 2:40 PM, Wink Saville via Phabricator 
>  wrote:
> 
> winksaville added a comment.
> 
> In D62279#1514596 , @beanz wrote:
> 
>> @winksaville I've figured out how to resolve the `gtest` issue, but 
>> unfortunately that isn't good enough to get the `check-runtimes` target 
>> working. A change went in back in February (rL353601 
>> ), which breaks running compiler-rt's 
>> tests when building a distribution in non-trivial ways, which will 
>> unfortunately be difficult to resolve.
>> 
>> I will land the `gtest` fix sometime today, and I'm going to start working 
>> toward getting the larger issue resolved, although that is going to take 
>> some time.
> 
> 
> @beanz, glad we're making progress!
> 
> One other thing, my next goal, after we can successfully build and test the 
> `DistributionExample`,
> is to make `DistributionExample_shared`.  I envision this creating `clang` 
> that is dynamically linked
> to `libclang_shared.so` and `libLLVM.so` and also provide the corresponding 
> static libraries. Doing
> this should provide Evangelos Foutras, whose is the maintainer of the llvm 
> packages at Arch Linux,
> an "easier" path to creating llvm Arch Linux packages that don't use 
> BUILD_SHARED_LIBS.
> 
> Is this a reasonable goal and could `DistrubutionExample_shared` be added 
> along side `DistributionExample`?

The difference between the two is going to be very small, really only 3 
options. It is actually probably easier to make it an option that the 
DistributionExample cache file interprets.

It occurred to me that there is a problem with the way libclang_shared works 
right now that needs to be resolved before an option to link against it can be 
added. The issue stems from the fact that some of the larger clang-based tools 
(like clang-fuzzer) use `add_clang_library` for building their components.

The way I generated the list of components to include in libclang_shared was by 
making `add_clang_library` construct a global property list that 
libclang_shared can read the components from. This unfortunately ends up with 
the list being longer than it should be.

I can probably carve out some time to start working on all of that over the 
weekend.

-Chris

> 
> 
> Repository:
>  rG LLVM Github Monorepo
> 
> CHANGES SINCE LAST ACTION
>  https://reviews.llvm.org/D62279/new/
> 
> https://reviews.llvm.org/D62279
> 
> 
> 

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


r361558 - [analyzer] List checkers in 3 categories: released, alpha, developer

2019-05-23 Thread Kristof Umann via cfe-commits
Author: szelethus
Date: Thu May 23 14:46:51 2019
New Revision: 361558

URL: http://llvm.org/viewvc/llvm-project?rev=361558=rev
Log:
[analyzer] List checkers in 3 categories: released, alpha, developer

Previously, the only way to display the list of available checkers was
to invoke the analyzer with -analyzer-checker-help frontend flag. This
however wasn't really great from a maintainer standpoint: users came
across checkers meant strictly for development purposes that weren't to
be tinkered with, or those that were still in development. This patch
creates a clearer division in between these categories.

From now on, we'll have 3 flags to display the list checkers. These
lists are mutually exclusive and can be used in any combination (for
example to display both stable and alpha checkers).

-analyzer-checker-help: Displays the list for stable, production ready
checkers.

-analyzer-checker-help-alpha: Displays the list for in development
  checkers. Enabling is discouraged
  for non-development purposes.

-analyzer-checker-help-developer: Modeling and debug checkers. Modeling
  checkers shouldn't be enabled/disabled
  by hand, and debug checkers shouldn't
  be touched by users.

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

Modified:
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
cfe/trunk/test/Analysis/show-checker-list.c

Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=361558=361557=361558=diff
==
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Thu May 23 14:46:51 2019
@@ -130,9 +130,14 @@ def analyzer_disable_all_checks : Flag<[
 def analyzer_checker_help : Flag<["-"], "analyzer-checker-help">,
   HelpText<"Display the list of analyzer checkers that are available">;
 
-def analyzer_checker_help_hidden : Flag<["-"], "analyzer-checker-help-hidden">,
-  HelpText<"Display the list of analyzer checkers that are available, "
-   "including modeling checkers">;
+def analyzer_checker_help_alpha : Flag<["-"], "analyzer-checker-help-alpha">,
+  HelpText<"Display the list of in development analyzer checkers. These "
+   "are NOT considered safe, they are unstable and will emit incorrect 
"
+   "reports. Enable ONLY FOR DEVELOPMENT purposes">;
+
+def analyzer_checker_help_developer : Flag<["-"], 
"analyzer-checker-help-developer">,
+  HelpText<"Display the list of developer-only checkers such as modeling "
+   "and debug checkers">;
 
 def analyzer_config_help : Flag<["-"], "analyzer-config-help">,
   HelpText<"Display the list of -analyzer-config options">;

Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td?rev=361558=361557=361558=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td Thu May 23 
14:46:51 2019
@@ -111,6 +111,6 @@ class Dependencies Deps =
   list Dependencies = Deps;
 }
 
-/// Marks a checker or a package hidden. Hidden entries won't be displayed in
-/// -analyzer-checker-help, which is desirable for alpha or modeling checkers.
+/// Marks a checker or a package hidden. Hidden entries are meant for 
developers
+/// only, and aren't exposed to end users.
 class Hidden { bit Hidden = 1; }

Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h?rev=361558=361557=361558=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h Thu May 23 
14:46:51 2019
@@ -220,7 +220,8 @@ public:
   unsigned DisableAllChecks : 1;
 
   unsigned ShowCheckerHelp : 1;
-  unsigned ShowCheckerHelpHidden : 1;
+  unsigned ShowCheckerHelpAlpha : 1;
+  unsigned ShowCheckerHelpDeveloper : 1;
   unsigned ShowEnabledCheckerList : 1;
   unsigned ShowCheckerOptionList : 1;
   unsigned ShowConfigOptionsList : 1;
@@ -285,12 +286,13 @@ public:
 
   AnalyzerOptions()
   : DisableAllChecks(false), 

[PATCH] D62093: [analyzer] List checkers in 3 categories: released, alpha, developer

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361558: [analyzer] List checkers in 3 categories: released, 
alpha, developer (authored by Szelethus, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D62093?vs=200855=201074#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62093/new/

https://reviews.llvm.org/D62093

Files:
  cfe/trunk/include/clang/Driver/CC1Options.td
  cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
  cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
  cfe/trunk/lib/Frontend/CompilerInvocation.cpp
  cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
  cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
  cfe/trunk/test/Analysis/show-checker-list.c

Index: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
===
--- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
@@ -220,7 +220,8 @@
   unsigned DisableAllChecks : 1;
 
   unsigned ShowCheckerHelp : 1;
-  unsigned ShowCheckerHelpHidden : 1;
+  unsigned ShowCheckerHelpAlpha : 1;
+  unsigned ShowCheckerHelpDeveloper : 1;
   unsigned ShowEnabledCheckerList : 1;
   unsigned ShowCheckerOptionList : 1;
   unsigned ShowConfigOptionsList : 1;
@@ -285,12 +286,13 @@
 
   AnalyzerOptions()
   : DisableAllChecks(false), ShowCheckerHelp(false),
-ShowCheckerHelpHidden(false), ShowEnabledCheckerList(false),
-ShowCheckerOptionList(false), ShowConfigOptionsList(false),
-AnalyzeAll(false), AnalyzerDisplayProgress(false),
-AnalyzeNestedBlocks(false), eagerlyAssumeBinOpBifurcation(false),
-TrimGraph(false), visualizeExplodedGraphWithGraphViz(false),
-UnoptimizedCFG(false), PrintStats(false), NoRetryExhausted(false) {
+ShowCheckerHelpAlpha(false), ShowCheckerHelpDeveloper(false),
+ShowEnabledCheckerList(false), ShowCheckerOptionList(false),
+ShowConfigOptionsList(false), AnalyzeAll(false),
+AnalyzerDisplayProgress(false), AnalyzeNestedBlocks(false),
+eagerlyAssumeBinOpBifurcation(false), TrimGraph(false),
+visualizeExplodedGraphWithGraphViz(false), UnoptimizedCFG(false),
+PrintStats(false), NoRetryExhausted(false) {
 llvm::sort(AnalyzerConfigCmdFlags);
   }
 
Index: cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
===
--- cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
+++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/CheckerBase.td
@@ -111,6 +111,6 @@
   list Dependencies = Deps;
 }
 
-/// Marks a checker or a package hidden. Hidden entries won't be displayed in
-/// -analyzer-checker-help, which is desirable for alpha or modeling checkers.
+/// Marks a checker or a package hidden. Hidden entries are meant for developers
+/// only, and aren't exposed to end users.
 class Hidden { bit Hidden = 1; }
Index: cfe/trunk/include/clang/Driver/CC1Options.td
===
--- cfe/trunk/include/clang/Driver/CC1Options.td
+++ cfe/trunk/include/clang/Driver/CC1Options.td
@@ -130,9 +130,14 @@
 def analyzer_checker_help : Flag<["-"], "analyzer-checker-help">,
   HelpText<"Display the list of analyzer checkers that are available">;
 
-def analyzer_checker_help_hidden : Flag<["-"], "analyzer-checker-help-hidden">,
-  HelpText<"Display the list of analyzer checkers that are available, "
-   "including modeling checkers">;
+def analyzer_checker_help_alpha : Flag<["-"], "analyzer-checker-help-alpha">,
+  HelpText<"Display the list of in development analyzer checkers. These "
+   "are NOT considered safe, they are unstable and will emit incorrect "
+   "reports. Enable ONLY FOR DEVELOPMENT purposes">;
+
+def analyzer_checker_help_developer : Flag<["-"], "analyzer-checker-help-developer">,
+  HelpText<"Display the list of developer-only checkers such as modeling "
+   "and debug checkers">;
 
 def analyzer_config_help : Flag<["-"], "analyzer-config-help">,
   HelpText<"Display the list of -analyzer-config options">;
Index: cfe/trunk/test/Analysis/show-checker-list.c
===
--- cfe/trunk/test/Analysis/show-checker-list.c
+++ cfe/trunk/test/Analysis/show-checker-list.c
@@ -1,11 +1,60 @@
 // RUN: %clang_cc1 -analyzer-checker-help \
-// RUN:   2>&1 | FileCheck %s -check-prefix=CHECK
+// RUN:   2>&1 | FileCheck %s -check-prefix=CHECK-STABLE
 
-// RUN: %clang_cc1 -analyzer-checker-help-hidden \
-// RUN:   2>&1 | FileCheck %s -check-prefix=CHECK-HIDDEN
+// RUN: %clang_cc1 -analyzer-checker-help-alpha \
+// RUN:   2>&1 | FileCheck %s -check-prefix=CHECK-ALPHA
 
-// CHECK: core.DivideZero

[PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Wink Saville via Phabricator via cfe-commits
winksaville added a comment.

In D62279#1514596 , @beanz wrote:

> @winksaville I've figured out how to resolve the `gtest` issue, but 
> unfortunately that isn't good enough to get the `check-runtimes` target 
> working. A change went in back in February (rL353601 
> ), which breaks running compiler-rt's 
> tests when building a distribution in non-trivial ways, which will 
> unfortunately be difficult to resolve.
>
> I will land the `gtest` fix sometime today, and I'm going to start working 
> toward getting the larger issue resolved, although that is going to take some 
> time.


@beanz, glad we're making progress!

One other thing, my next goal, after we can successfully build and test the 
`DistributionExample`,
is to make `DistributionExample_shared`.  I envision this creating `clang` that 
is dynamically linked
to `libclang_shared.so` and `libLLVM.so` and also provide the corresponding 
static libraries. Doing
this should provide Evangelos Foutras, whose is the maintainer of the llvm 
packages at Arch Linux,
an "easier" path to creating llvm Arch Linux packages that don't use 
BUILD_SHARED_LIBS.

Is this a reasonable goal and could `DistrubutionExample_shared` be added along 
side `DistributionExample`?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62279/new/

https://reviews.llvm.org/D62279



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


r361557 - [X86] Split multi-line chained assignments into single lines to avoid making clang-format create triangle shaped indentation. Simplify one if statement to remove a bunch of string matches. N

2019-05-23 Thread Craig Topper via cfe-commits
Author: ctopper
Date: Thu May 23 14:34:36 2019
New Revision: 361557

URL: http://llvm.org/viewvc/llvm-project?rev=361557=rev
Log:
[X86] Split multi-line chained assignments into single lines to avoid making 
clang-format create triangle shaped indentation. Simplify one if statement to 
remove a bunch of string matches. NFCI

We had an if statement that checked over every avx512* feature to see if it 
should enabled avx512f. Since they are all prefixed with avx512 just check for 
that instead.

Modified:
cfe/trunk/lib/Basic/Targets/X86.cpp

Modified: cfe/trunk/lib/Basic/Targets/X86.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/X86.cpp?rev=361557=361556=361557=diff
==
--- cfe/trunk/lib/Basic/Targets/X86.cpp (original)
+++ cfe/trunk/lib/Basic/Targets/X86.cpp Thu May 23 14:34:36 2019
@@ -451,7 +451,9 @@ void X86TargetInfo::setSSELevel(llvm::St
   if (Enabled) {
 switch (Level) {
 case AVX512F:
-  Features["avx512f"] = Features["fma"] = Features["f16c"] = true;
+  Features["avx512f"] = true;
+  Features["fma"] = true;
+  Features["f16c"] = true;
   LLVM_FALLTHROUGH;
 case AVX2:
   Features["avx2"] = true;
@@ -490,8 +492,8 @@ void X86TargetInfo::setSSELevel(llvm::St
 Features["sse"] = false;
 LLVM_FALLTHROUGH;
   case SSE2:
-Features["sse2"] = Features["pclmul"] = Features["aes"] = Features["sha"] =
-Features["gfni"] = false;
+Features["sse2"] = Features["pclmul"] = Features["aes"] = false;
+Features["sha"] = Features["gfni"] = false;
 LLVM_FALLTHROUGH;
   case SSE3:
 Features["sse3"] = false;
@@ -507,21 +509,21 @@ void X86TargetInfo::setSSELevel(llvm::St
 Features["sse4.2"] = false;
 LLVM_FALLTHROUGH;
   case AVX:
-Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
-Features["xsaveopt"] = Features["vaes"] = Features["vpclmulqdq"] = 
false;
+Features["fma"] = Features["avx"] = Features["f16c"] = false;
+Features["xsave"] = Features["xsaveopt"] = Features["vaes"] = false;
+Features["vpclmulqdq"] = false;
 setXOPLevel(Features, FMA4, false);
 LLVM_FALLTHROUGH;
   case AVX2:
 Features["avx2"] = false;
 LLVM_FALLTHROUGH;
   case AVX512F:
-Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
-Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
-Features["avx512vl"] = Features["avx512vbmi"] =
-Features["avx512ifma"] = Features["avx512vpopcntdq"] =
-Features["avx512bitalg"] = Features["avx512vnni"] =
-Features["avx512vbmi2"] = false;
-Features["avx512bf16"] = false;
+Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = false;
+Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] = false;
+Features["avx512vl"] = Features["avx512vbmi"] = false;
+Features["avx512ifma"] = Features["avx512vpopcntdq"] = false;
+Features["avx512bitalg"] = Features["avx512vnni"] = false;
+Features["avx512vbmi2"] = Features["avx512bf16"] = false;
 break;
   }
 }
@@ -649,24 +651,20 @@ void X86TargetInfo::setFeatureEnabledImp
 setSSELevel(Features, AVX2, Enabled);
   } else if (Name == "avx512f") {
 setSSELevel(Features, AVX512F, Enabled);
-  } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
- Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
- Name == "avx512vbmi" || Name == "avx512ifma" ||
- Name == "avx512vpopcntdq" || Name == "avx512bitalg" ||
- Name == "avx512bf16" ||
- Name == "avx512vnni" || Name == "avx512vbmi2") {
+  } else if (Name.startswith("avx512")) {
 if (Enabled)
   setSSELevel(Features, AVX512F, Enabled);
-// Enable BWI instruction if VBMI/VBMI2/BITALG is being enabled.
-if ((Name.startswith("avx512vbmi") || Name == "avx512bitalg") && Enabled)
+// Enable BWI instruction if certain features are being enabled.
+if ((Name == "avx512vbmi" || Name == "avx512vbmi2" ||
+ Name == "avx512bitalg" || Name == "avx512bf16") && Enabled)
   Features["avx512bw"] = true;
-if (Name == "avx512bf16" && Enabled)
-  Features["avx512bw"] = true;
-// Also disable VBMI/VBMI2/BITALG if BWI is being disabled.
-if (Name == "avx512bw" && !Enabled)
-  Features["avx512vbmi"] = Features["avx512vbmi2"] =
-  Features["avx512bf16"] =
+// Also disable some features if BWI is being disabled.
+if (Name == "avx512bw" && !Enabled) {
+  Features["avx512vbmi"] = false;
+  Features["avx512vbmi2"] = false;
   Features["avx512bitalg"] = false;
+  Features["avx512bf16"] = false;
+}
   } else if (Name == "fma") {
 if (Enabled)
   setSSELevel(Features, AVX, Enabled);


___
cfe-commits 

[PATCH] D62343: [cmake] Remove old unused version of FindZ3.cmake from clang [NFC]

2019-05-23 Thread Don Hinton via Phabricator via cfe-commits
hintonda created this revision.
hintonda added reviewers: mikhail.ramalho, beanz.
Herald added a subscriber: mgorny.
Herald added a project: clang.

This file was moved to llvm in D54978 , 
r356929, but the old
file was never removed.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D62343

Files:
  clang/cmake/modules/FindZ3.cmake




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


[PATCH] D57858: [analyzer] Add a new frontend flag to display all checker options

2019-05-23 Thread Kristóf Umann via Phabricator via cfe-commits
This revision was not accepted when it landed; it landed in state "Needs 
Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361552: [analyzer] Add a new frontend flag to display all 
checker options (authored by Szelethus, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D57858?vs=199188=201056#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57858/new/

https://reviews.llvm.org/D57858

Files:
  cfe/trunk/include/clang/Driver/CC1Options.td
  cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
  cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
  cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h
  cfe/trunk/lib/Frontend/CompilerInvocation.cpp
  cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
  cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
  cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
  cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
  cfe/trunk/test/Analysis/analyzer-checker-option-help.c
  cfe/trunk/test/Analysis/analyzer-list-configs.c
  cfe/trunk/test/Analysis/checker-plugins.c

Index: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
===
--- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
@@ -166,6 +166,29 @@
   static std::vector
   getRegisteredCheckers(bool IncludeExperimental = false);
 
+  /// Convenience function for printing options or checkers and their
+  /// description in a formatted manner. If \p MinLineWidth is set to 0, no line
+  /// breaks are introduced for the description.
+  ///
+  /// Format, depending whether the option name's length is less then
+  /// \p OptionWidth:
+  ///
+  ///   EntryNameDescription
+  ///   <-padding->Description
+  ///   <-padding->Description
+  ///
+  ///   VeryVeryLongOptionName
+  ///   <-padding->Description
+  ///   <-padding->Description
+  ///   ^~~~ InitialPad
+  ///   ^~ EntryWidth
+  ///   ^~MinLineWidth
+  static void printFormattedEntry(
+  llvm::raw_ostream ,
+  std::pair EntryDescPair,
+  size_t EntryWidth, size_t InitialPad, size_t MinLineWidth = 0);
+
+
   /// Pair of checker name and enable/disable.
   std::vector> CheckersControlList;
 
@@ -199,6 +222,7 @@
   unsigned ShowCheckerHelp : 1;
   unsigned ShowCheckerHelpHidden : 1;
   unsigned ShowEnabledCheckerList : 1;
+  unsigned ShowCheckerOptionList : 1;
   unsigned ShowConfigOptionsList : 1;
   unsigned ShouldEmitErrorsOnInvalidConfigValue : 1;
   unsigned AnalyzeAll : 1;
@@ -262,11 +286,11 @@
   AnalyzerOptions()
   : DisableAllChecks(false), ShowCheckerHelp(false),
 ShowCheckerHelpHidden(false), ShowEnabledCheckerList(false),
-ShowConfigOptionsList(false), AnalyzeAll(false),
-AnalyzerDisplayProgress(false), AnalyzeNestedBlocks(false),
-eagerlyAssumeBinOpBifurcation(false), TrimGraph(false),
-visualizeExplodedGraphWithGraphViz(false), UnoptimizedCFG(false),
-PrintStats(false), NoRetryExhausted(false) {
+ShowCheckerOptionList(false), ShowConfigOptionsList(false),
+AnalyzeAll(false), AnalyzerDisplayProgress(false),
+AnalyzeNestedBlocks(false), eagerlyAssumeBinOpBifurcation(false),
+TrimGraph(false), visualizeExplodedGraphWithGraphViz(false),
+UnoptimizedCFG(false), PrintStats(false), NoRetryExhausted(false) {
 llvm::sort(AnalyzerConfigCmdFlags);
   }
 
Index: cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h
===
--- cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h
+++ cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h
@@ -61,6 +61,10 @@
  DiagnosticsEngine ,
  const LangOptions );
 void printAnalyzerConfigList(raw_ostream );
+void printCheckerConfigList(raw_ostream , ArrayRef plugins,
+AnalyzerOptions ,
+DiagnosticsEngine ,
+const LangOptions );
 
 } // end GR namespace
 
Index: cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
===
--- cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
+++ cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
@@ -272,6 +272,7 @@
   void printCheckerWithDescList(raw_ostream ,
 size_t MaxNameChars = 30) const;
   void printEnabledCheckerList(raw_ostream ) const;
+  void printCheckerOptionList(raw_ostream ) const;
 
 private:
   /// 

[PATCH] D59555: [analyzer] Add yaml parser to GenericTaintChecker

2019-05-23 Thread Borsik Gábor via Phabricator via cfe-commits
boga95 marked 3 inline comments as done.
boga95 added a comment.

I already thought about it. It would make the code much cleaner, but it would 
have a little performance impact (Does it matter?).
It's straightforward to read the supported functions from another yaml file. 
Besides that, it can support multiple config files too.




Comment at: lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp:73-75
   static const unsigned InvalidArgIndex = UINT_MAX;
   /// Denotes the return vale.
   static const unsigned ReturnValueIndex = UINT_MAX - 1;

boga95 wrote:
> Szelethus wrote:
> > boga95 wrote:
> > > Szelethus wrote:
> > > > We should definitely change these, not only is the large integer number 
> > > > impossible to remember, but this value could differ on different 
> > > > platforms.
> > > I tried to use int, but I got a lot of warnings because of the 
> > > `getNumArgs()` returns an unsigned value.
> > What warnings? I thought we have `-Wsign-conversion` disabled.
> I got `-Wsign-compare` warnings, but it compiles. I will change it in the 
> next [[ https://reviews.llvm.org/D59637 | review ]] because that's contains 
> the yaml file and the related tests.
Now, this is just for internal representation. The -1 value is mapped to this.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59555/new/

https://reviews.llvm.org/D59555



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


r361552 - [analyzer] Add a new frontend flag to display all checker options

2019-05-23 Thread Kristof Umann via cfe-commits
Author: szelethus
Date: Thu May 23 13:47:28 2019
New Revision: 361552

URL: http://llvm.org/viewvc/llvm-project?rev=361552=rev
Log:
[analyzer] Add a new frontend flag to display all checker options

Add the new frontend flag -analyzer-checker-option-help to display all
checker/package options.

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

Added:
cfe/trunk/test/Analysis/analyzer-checker-option-help.c
Modified:
cfe/trunk/include/clang/Driver/CC1Options.td
cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
cfe/trunk/include/clang/StaticAnalyzer/Frontend/FrontendActions.h
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp
cfe/trunk/test/Analysis/analyzer-list-configs.c
cfe/trunk/test/Analysis/checker-plugins.c

Modified: cfe/trunk/include/clang/Driver/CC1Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=361552=361551=361552=diff
==
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)
+++ cfe/trunk/include/clang/Driver/CC1Options.td Thu May 23 13:47:28 2019
@@ -143,6 +143,9 @@ def analyzer_list_enabled_checkers : Fla
 def analyzer_config : Separate<["-"], "analyzer-config">,
   HelpText<"Choose analyzer options to enable">;
 
+def analyzer_checker_option_help : Flag<["-"], "analyzer-checker-option-help">,
+  HelpText<"Display the list of checker and package options">;
+
 def analyzer_config_compatibility_mode : Separate<["-"], 
"analyzer-config-compatibility-mode">,
   HelpText<"Don't emit errors on invalid analyzer-config inputs">;
 

Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h?rev=361552=361551=361552=diff
==
--- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h Thu May 23 
13:47:28 2019
@@ -166,6 +166,29 @@ public:
   static std::vector
   getRegisteredCheckers(bool IncludeExperimental = false);
 
+  /// Convenience function for printing options or checkers and their
+  /// description in a formatted manner. If \p MinLineWidth is set to 0, no 
line
+  /// breaks are introduced for the description.
+  ///
+  /// Format, depending whether the option name's length is less then
+  /// \p OptionWidth:
+  ///
+  ///   EntryNameDescription
+  ///   <-padding->Description
+  ///   <-padding->Description
+  ///
+  ///   VeryVeryLongOptionName
+  ///   <-padding->Description
+  ///   <-padding->Description
+  ///   ^~~~ InitialPad
+  ///   ^~ EntryWidth
+  ///   ^~MinLineWidth
+  static void printFormattedEntry(
+  llvm::raw_ostream ,
+  std::pair EntryDescPair,
+  size_t EntryWidth, size_t InitialPad, size_t MinLineWidth = 0);
+
+
   /// Pair of checker name and enable/disable.
   std::vector> CheckersControlList;
 
@@ -199,6 +222,7 @@ public:
   unsigned ShowCheckerHelp : 1;
   unsigned ShowCheckerHelpHidden : 1;
   unsigned ShowEnabledCheckerList : 1;
+  unsigned ShowCheckerOptionList : 1;
   unsigned ShowConfigOptionsList : 1;
   unsigned ShouldEmitErrorsOnInvalidConfigValue : 1;
   unsigned AnalyzeAll : 1;
@@ -262,11 +286,11 @@ public:
   AnalyzerOptions()
   : DisableAllChecks(false), ShowCheckerHelp(false),
 ShowCheckerHelpHidden(false), ShowEnabledCheckerList(false),
-ShowConfigOptionsList(false), AnalyzeAll(false),
-AnalyzerDisplayProgress(false), AnalyzeNestedBlocks(false),
-eagerlyAssumeBinOpBifurcation(false), TrimGraph(false),
-visualizeExplodedGraphWithGraphViz(false), UnoptimizedCFG(false),
-PrintStats(false), NoRetryExhausted(false) {
+ShowCheckerOptionList(false), ShowConfigOptionsList(false),
+AnalyzeAll(false), AnalyzerDisplayProgress(false),
+AnalyzeNestedBlocks(false), eagerlyAssumeBinOpBifurcation(false),
+TrimGraph(false), visualizeExplodedGraphWithGraphViz(false),
+UnoptimizedCFG(false), PrintStats(false), NoRetryExhausted(false) {
 llvm::sort(AnalyzerConfigCmdFlags);
   }
 

Modified: cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h?rev=361552=361551=361552=diff
==
--- 

[PATCH] D62192: [clang-tidy]: Add cert-oop54-cpp alias for bugprone-unhandled-self-assignment

2019-05-23 Thread Tamás Zolnai via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rCTE361550: [clang-tidy]: Add cert-oop54-cpp alias for 
bugprone-unhandled-self-assignment (authored by ztamas, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D62192?vs=200775=201051#toc

Repository:
  rCTE Clang Tools Extra

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62192/new/

https://reviews.llvm.org/D62192

Files:
  clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
  clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h
  clang-tidy/cert/CERTTidyModule.cpp
  clang-tidy/cert/CMakeLists.txt
  docs/ReleaseNotes.rst
  docs/clang-tidy/checks/bugprone-unhandled-self-assignment.rst
  docs/clang-tidy/checks/cert-oop54-cpp.rst
  docs/clang-tidy/checks/list.rst
  
test/clang-tidy/bugprone-unhandled-self-assignment-warn-only-if-this-has-suspicious-field.cpp
  test/clang-tidy/cert-oop54-cpp.cpp

Index: clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
===
--- clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
+++ clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
@@ -16,6 +16,18 @@
 namespace tidy {
 namespace bugprone {
 
+UnhandledSelfAssignmentCheck::UnhandledSelfAssignmentCheck(
+StringRef Name, ClangTidyContext *Context)
+: ClangTidyCheck(Name, Context),
+  WarnOnlyIfThisHasSuspiciousField(
+  Options.get("WarnOnlyIfThisHasSuspiciousField", true)) {}
+
+void UnhandledSelfAssignmentCheck::storeOptions(
+ClangTidyOptions::OptionMap ) {
+  Options.store(Opts, "WarnOnlyIfThisHasSuspiciousField",
+WarnOnlyIfThisHasSuspiciousField);
+}
+
 void UnhandledSelfAssignmentCheck::registerMatchers(MatchFinder *Finder) {
   if (!getLangOpts().CPlusPlus)
 return;
@@ -61,29 +73,32 @@
   cxxMethodDecl(unless(hasDescendant(cxxMemberCallExpr(callee(cxxMethodDecl(
   hasName("operator="), ofClass(equalsBoundNode("class";
 
-  // Matcher for standard smart pointers.
-  const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType(
-  recordType(hasDeclaration(classTemplateSpecializationDecl(
-  hasAnyName("::std::shared_ptr", "::std::unique_ptr",
- "::std::weak_ptr", "::std::auto_ptr"),
-  templateArgumentCountIs(1));
-
-  // We will warn only if the class has a pointer or a C array field which
-  // probably causes a problem during self-assignment (e.g. first resetting the
-  // pointer member, then trying to access the object pointed by the pointer, or
-  // memcpy overlapping arrays).
-  const auto ThisHasSuspiciousField = cxxMethodDecl(ofClass(cxxRecordDecl(
-  has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType),
-  hasType(arrayType(;
-
-  Finder->addMatcher(
-  cxxMethodDecl(ofClass(cxxRecordDecl().bind("class")),
-isCopyAssignmentOperator(), IsUserDefined,
-HasReferenceParam, HasNoSelfCheck,
-unless(HasNonTemplateSelfCopy), unless(HasTemplateSelfCopy),
-HasNoNestedSelfAssign, ThisHasSuspiciousField)
-  .bind("copyAssignmentOperator"),
-  this);
+  DeclarationMatcher AdditionalMatcher = cxxMethodDecl();
+  if (WarnOnlyIfThisHasSuspiciousField) {
+// Matcher for standard smart pointers.
+const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType(
+recordType(hasDeclaration(classTemplateSpecializationDecl(
+hasAnyName("::std::shared_ptr", "::std::unique_ptr",
+   "::std::weak_ptr", "::std::auto_ptr"),
+templateArgumentCountIs(1));
+
+// We will warn only if the class has a pointer or a C array field which
+// probably causes a problem during self-assignment (e.g. first resetting
+// the pointer member, then trying to access the object pointed by the
+// pointer, or memcpy overlapping arrays).
+AdditionalMatcher = cxxMethodDecl(ofClass(cxxRecordDecl(
+has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType),
+hasType(arrayType(;
+  }
+
+  Finder->addMatcher(cxxMethodDecl(ofClass(cxxRecordDecl().bind("class")),
+   isCopyAssignmentOperator(), IsUserDefined,
+   HasReferenceParam, HasNoSelfCheck,
+   unless(HasNonTemplateSelfCopy),
+   unless(HasTemplateSelfCopy),
+   HasNoNestedSelfAssign, AdditionalMatcher)
+ .bind("copyAssignmentOperator"),
+ this);
 }
 
 void UnhandledSelfAssignmentCheck::check(
Index: clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h
===
--- clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h
+++ clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h

[PATCH] D61617: [NewPassManager] Add tuning option: SLPVectorization [clang-change]

2019-05-23 Thread Reid Kleckner via Phabricator via cfe-commits
rnk added inline comments.



Comment at: test/CodeGen/loop-vectorize.c:1
+// RUN: %clang -target x86_64 -S -c -O1 -fvectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -S -c -O1 -fno-vectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-DISABLE-VECT

Please do not use %clang for codegen tests, please only use %clang_cc1. 


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61617/new/

https://reviews.llvm.org/D61617



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


[PATCH] D59555: [analyzer] Add yaml parser to GenericTaintChecker

2019-05-23 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ added a comment.

Ok! This looks like there isn't that much code, so it should be fine to 
duplicate. Do you have plans to eliminate the existing switch and instead use 
yaml for *all* supported functions while shipping a default .yaml file with the 
analyzer?

I'm still in doubts on how to connect your work with the `CallDescription` 
effort. I'll think more about that.




Comment at: lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp:210-218
+  /// Defines a map between the propagation function's name and
+  /// TaintPropagationRule.
+  static NameRuleMap CustomPropagations;
+
+  /// Defines a map between the filter function's name and filtering args.
+  static NameArgMap CustomFilters;
+

I think you don't need to make them static. By the time you need them, you 
already have access to the instance of the checker. Static variables of 
non-trivial types are frowned upon 
(https://llvm.org/docs/CodingStandards.html#do-not-use-static-constructors).



Comment at: lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp:294
 
+void GenericTaintChecker::getConfiguration(StringRef ConfigFile) {
+  if (ConfigFile.trim().empty())

Let's re-use at least this function. I.e., abstract it out from 
`GenericTaintChecker` and put it into a header accessible by all checkers 
(dunno, `lib/StaticAnalyzer/Checkers/Yaml.h`).



Comment at: lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp:316
+
+  parseConfiguration(std::move(Config));
+}

Do we ever need to copy the config? Maybe make it a move-only type?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59555/new/

https://reviews.llvm.org/D59555



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


[clang-tools-extra] r361550 - [clang-tidy]: Add cert-oop54-cpp alias for bugprone-unhandled-self-assignment

2019-05-23 Thread Tamas Zolnai via cfe-commits
Author: ztamas
Date: Thu May 23 13:29:04 2019
New Revision: 361550

URL: http://llvm.org/viewvc/llvm-project?rev=361550=rev
Log:
[clang-tidy]: Add cert-oop54-cpp alias for bugprone-unhandled-self-assignment

Summary:
Added WarnOnlyIfThisHasSuspiciousField option to allow
to catch any copy assignment operator independently from
the container class's fields.
Added the cert alias using this option.

Reviewers: aaron.ballman

Reviewed By: aaron.ballman

Subscribers: mgorny, Eugene.Zelenko, xazax.hun, cfe-commits

Tags: #clang

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

Added:
clang-tools-extra/trunk/docs/clang-tidy/checks/cert-oop54-cpp.rst

clang-tools-extra/trunk/test/clang-tidy/bugprone-unhandled-self-assignment-warn-only-if-this-has-suspicious-field.cpp
clang-tools-extra/trunk/test/clang-tidy/cert-oop54-cpp.cpp
Modified:
clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h
clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp
clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt
clang-tools-extra/trunk/docs/ReleaseNotes.rst

clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-unhandled-self-assignment.rst
clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst

Modified: 
clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp?rev=361550=361549=361550=diff
==
--- 
clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp 
(original)
+++ 
clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp 
Thu May 23 13:29:04 2019
@@ -16,6 +16,18 @@ namespace clang {
 namespace tidy {
 namespace bugprone {
 
+UnhandledSelfAssignmentCheck::UnhandledSelfAssignmentCheck(
+StringRef Name, ClangTidyContext *Context)
+: ClangTidyCheck(Name, Context),
+  WarnOnlyIfThisHasSuspiciousField(
+  Options.get("WarnOnlyIfThisHasSuspiciousField", true)) {}
+
+void UnhandledSelfAssignmentCheck::storeOptions(
+ClangTidyOptions::OptionMap ) {
+  Options.store(Opts, "WarnOnlyIfThisHasSuspiciousField",
+WarnOnlyIfThisHasSuspiciousField);
+}
+
 void UnhandledSelfAssignmentCheck::registerMatchers(MatchFinder *Finder) {
   if (!getLangOpts().CPlusPlus)
 return;
@@ -61,29 +73,32 @@ void UnhandledSelfAssignmentCheck::regis
   
cxxMethodDecl(unless(hasDescendant(cxxMemberCallExpr(callee(cxxMethodDecl(
   hasName("operator="), ofClass(equalsBoundNode("class";
 
-  // Matcher for standard smart pointers.
-  const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType(
-  recordType(hasDeclaration(classTemplateSpecializationDecl(
-  hasAnyName("::std::shared_ptr", "::std::unique_ptr",
- "::std::weak_ptr", "::std::auto_ptr"),
-  templateArgumentCountIs(1));
-
-  // We will warn only if the class has a pointer or a C array field which
-  // probably causes a problem during self-assignment (e.g. first resetting the
-  // pointer member, then trying to access the object pointed by the pointer, 
or
-  // memcpy overlapping arrays).
-  const auto ThisHasSuspiciousField = cxxMethodDecl(ofClass(cxxRecordDecl(
-  has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType),
-  hasType(arrayType(;
-
-  Finder->addMatcher(
-  cxxMethodDecl(ofClass(cxxRecordDecl().bind("class")),
-isCopyAssignmentOperator(), IsUserDefined,
-HasReferenceParam, HasNoSelfCheck,
-unless(HasNonTemplateSelfCopy), 
unless(HasTemplateSelfCopy),
-HasNoNestedSelfAssign, ThisHasSuspiciousField)
-  .bind("copyAssignmentOperator"),
-  this);
+  DeclarationMatcher AdditionalMatcher = cxxMethodDecl();
+  if (WarnOnlyIfThisHasSuspiciousField) {
+// Matcher for standard smart pointers.
+const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType(
+recordType(hasDeclaration(classTemplateSpecializationDecl(
+hasAnyName("::std::shared_ptr", "::std::unique_ptr",
+   "::std::weak_ptr", "::std::auto_ptr"),
+templateArgumentCountIs(1));
+
+// We will warn only if the class has a pointer or a C array field which
+// probably causes a problem during self-assignment (e.g. first resetting
+// the pointer member, then trying to access the object pointed by the
+// pointer, or memcpy overlapping arrays).
+AdditionalMatcher = cxxMethodDecl(ofClass(cxxRecordDecl(
+has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType),
+hasType(arrayType(;
+  }
+
+  

[PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Chris Bieneman via Phabricator via cfe-commits
beanz added a comment.

@winksaville I've figured out how to resolve the `gtest` issue, but 
unfortunately that isn't good enough to get the `check-runtimes` target 
working. A change went in back in February (rL353601 
), which breaks running compiler-rt's tests 
when building a distribution in non-trivial ways, which will unfortunately be 
difficult to resolve.

I will land the `gtest` fix sometime today, and I'm going to start working 
toward getting the larger issue resolved, although that is going to take some 
time.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62279/new/

https://reviews.llvm.org/D62279



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


[PATCH] D38479: Make -mgeneral-regs-only more like GCC's

2019-05-23 Thread George Burgess IV via Phabricator via cfe-commits
george.burgess.iv added a comment.

Thanks for the feedback!

> With this patch, do we pass the general-regs-only attribute to the backend? 
> If so, would that be the attribute we'd want to check to emit errors from the 
> backend from any "accidental" floating-point operations?

Yeah, the current design is for us to pass +general-regs-only as a target 
'feature' per function. Given that there's no code to actually handle that at 
the moment, I've put a FIXME in its place. Please let me know if there's a 
better way to go about this.




Comment at: clang/include/clang/Basic/LangOptions.def:143
 LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of template 
template arguments")
+LANGOPT(GeneralOpsOnly, 1, 0, "Whether to diagnose the use of 
floating-point or vector operations")
 

void wrote:
> Everywhere else you use "general regs only" instead of "ops". Should that be 
> done here?
Yeah, I'm not sure why I named it `Ops`. Fixed



Comment at: clang/lib/Sema/SemaExprCXX.cpp:7840
+
+  const auto *StructTy = Ty.getCanonicalType()->getAsStructureType();
+  if (!StructTy)

efriedma wrote:
> Do you really want to enforce isStruct() here?  That's types declared with 
> the keyword "struct".
Good catch -- generalized this.



Comment at: clang/lib/Sema/SemaExprCXX.cpp:7857
+
+  return llvm::any_of(StructTy->getDecl()->fields(), [](const FieldDecl *FD) {
+return typeHasFloatingOrVectorComponent(FD->getType());

efriedma wrote:
> Do we have to be concerned about base classes here?
Yup. Added tests for this, too



Comment at: clang/lib/Sema/SemaExprCXX.cpp:7951
+  // they don't have to write out memcpy() for simple cases. For that reason,
+  // it's very limited in what it will detect.
+  //

efriedma wrote:
> We don't always lower struct copies to memcpy(); I'm not sure this is safe.
I see; removed. If this check ends up being important (it doesn't seem to be in 
local builds), we can revisit. :)



Comment at: clang/lib/Sema/SemaExprCXX.cpp:8003
+!isRValueOfIllegalType(E) &&
+E->isConstantInitializer(S.getASTContext(), /*ForRef=*/false)) {
+  resetDiagnosticState(InitialState);

efriedma wrote:
> Just because we can constant-fold an expression, doesn't mean we will, 
> especially at -O0.
Are there any guarantees that we offer along these lines? The code in 
particular that this cares about boils down to a bunch of integer literals 
doing mixed math with FP literals, all of which gets casted to an `int`. 
Conceptually, it seems silly to me to emit an addition for something as 
straightforward as `int i = 1 + 2.0;`, even at -O0, though I totally agree that 
you're right, and codegen like this is reasonable at -O0: 
https://godbolt.org/z/NS0L17

(This also brings up a good point: this visitor probably shouldn't be run on 
`IsConstexpr` expressions; fixed that later on)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D38479/new/

https://reviews.llvm.org/D38479



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


[PATCH] D38479: Make -mgeneral-regs-only more like GCC's

2019-05-23 Thread George Burgess IV via Phabricator via cfe-commits
george.burgess.iv updated this revision to Diff 201047.
george.burgess.iv marked 10 inline comments as done.
george.burgess.iv added a comment.

Addressed feedback, modulo the constant foldable comment thread.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D38479/new/

https://reviews.llvm.org/D38479

Files:
  clang/docs/UsersManual.rst
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/include/clang/Basic/LangOptions.def
  clang/include/clang/Driver/CC1Options.td
  clang/include/clang/Sema/Sema.h
  clang/lib/Driver/ToolChains/Arch/AArch64.cpp
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Frontend/CompilerInvocation.cpp
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaExprCXX.cpp
  clang/test/CodeGen/aarch64-mgeneral_regs_only.c
  clang/test/Sema/aarch64-mgeneral_regs_only.c
  clang/test/SemaCXX/aarch64-mgeneral_regs_only.cpp

Index: clang/test/SemaCXX/aarch64-mgeneral_regs_only.cpp
===
--- /dev/null
+++ clang/test/SemaCXX/aarch64-mgeneral_regs_only.cpp
@@ -0,0 +1,186 @@
+// RUN: %clang_cc1 -triple aarch64-linux-eabi -std=c++11 -general-regs-only %s -verify -DBANNED=float -Wno-unused-value
+// RUN: %clang_cc1 -triple aarch64-linux-eabi -std=c++11 -general-regs-only %s -verify -DBANNED=int '-DVECATTR=__attribute__((ext_vector_type(2)))' -Wno-unused-value
+// RUN: %clang_cc1 -triple aarch64-linux-eabi -std=c++11 -general-regs-only %s -verify -DBANNED=FloatTypedef -Wno-unused-value
+
+using FloatTypedef = float;
+
+#ifndef VECATTR
+#define VECATTR
+#define BannedToInt(x) (x)
+#else
+#define BannedToInt(x) ((x)[0])
+#endif
+
+typedef BANNED BannedTy VECATTR;
+
+namespace default_args {
+int foo(BannedTy = 0); // expected-error 2{{use of floating-point or vector values is disabled}}
+int bar(int = 1.0);
+
+void baz(int a = foo()); // expected-note{{from use of default argument here}}
+void bazz(int a = bar());
+
+void test() {
+  foo(); // expected-note{{from use of default argument here}}
+  bar();
+  baz(); // expected-note{{from use of default argument here}}
+  baz(4);
+  bazz();
+}
+} // namespace default_args
+
+namespace conversions {
+struct ConvertToFloat {
+  explicit operator BannedTy();
+};
+struct ConvertToFloatImplicit { /* implicit */
+  operator BannedTy();
+};
+struct ConvertFromFloat {
+  ConvertFromFloat(BannedTy);
+};
+
+void takeFloat(BannedTy);
+void takeConvertFromFloat(ConvertFromFloat);
+void takeConvertFromFloatRef(const ConvertFromFloat &);
+
+void test() {
+  BannedTy(ConvertToFloat());
+
+  takeFloat(ConvertToFloatImplicit{}); // expected-error{{use of floating-point or vector values is disabled}}
+
+  ConvertFromFloat(0);// expected-error{{use of floating-point or vector values is disabled}}
+  ConvertFromFloat(ConvertToFloatImplicit{}); // expected-error{{use of floating-point or vector values is disabled}}
+
+  ConvertFromFloat{0};// expected-error{{use of floating-point or vector values is disabled}}
+  ConvertFromFloat{ConvertToFloatImplicit{}}; // expected-error{{use of floating-point or vector values is disabled}}
+
+  takeConvertFromFloat(0);// expected-error{{use of floating-point or vector values is disabled}}
+  takeConvertFromFloatRef(0); // expected-error{{use of floating-point or vector values is disabled}}
+
+  takeConvertFromFloat(ConvertFromFloat(0));// expected-error{{use of floating-point or vector values is disabled}}
+  takeConvertFromFloatRef(ConvertFromFloat(0)); // expected-error{{use of floating-point or vector values is disabled}}
+}
+
+void takeImplicitFloat(BannedTy = ConvertToFloatImplicit()); // expected-error{{use of floating-point or vector values is disabled}}
+void test2() {
+  takeImplicitFloat(); // expected-note{{from use of default argument here}}
+}
+} // namespace conversions
+
+namespace refs {
+struct BannedRef {
+  const BannedTy 
+  BannedRef(const BannedTy ) : f(f) {}
+};
+
+BannedTy ();
+BannedTy getBannedVal();
+
+void foo() {
+  BannedTy  = getBanned();
+  BannedTy b = getBanned(); // expected-error{{use of floating-point or vector values is disabled}}
+  const BannedTy  = getBanned();
+  const BannedTy  = getBannedVal(); // expected-error{{use of floating-point or vector values is disabled}}
+
+  const int  = 1.0;
+  const int  = BannedToInt(getBannedVal()); // expected-error{{use of floating-point or vector values is disabled}}
+
+  BannedRef{getBanned()};
+  BannedRef{getBannedVal()}; // expected-error{{use of floating-point or vector values is disabled}}
+}
+} // namespace refs
+
+namespace class_init {
+struct Foo {
+  float f = 1.0; // expected-error{{use of floating-point or vector values is disabled}}
+  int i = 1.0;
+  float j;
+
+  Foo() : j(1) // expected-error{{use of floating-point or vector values is disabled}}
+  {}
+};
+} // namespace class_init
+
+namespace copy_move_assign {
+struct Foo { // expected-error 2{{use of floating-point or vector values is disabled}}
+  float f;

[clang-tools-extra] r361545 - Fix sphinx unknown document error

2019-05-23 Thread Simon Pilgrim via cfe-commits
Author: rksimon
Date: Thu May 23 13:07:27 2019
New Revision: 361545

URL: http://llvm.org/viewvc/llvm-project?rev=361545=rev
Log:
Fix sphinx unknown document error

Modified:
clang-tools-extra/trunk/docs/ReleaseNotes.rst

Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=361545=361544=361545=diff
==
--- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original)
+++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Thu May 23 13:07:27 2019
@@ -177,7 +177,7 @@ Improvements to clang-tidy
   Rewrites function signatures to use a trailing return type.
 
 - The :doc:`misc-throw-by-value-catch-by-reference
-  ` now supports
+  ` now supports
   `WarnOnLargeObject` and `MaxSize` options to warn on any large trivial
   object caught by value.
 


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


[PATCH] D61839: [analyzer] Hide developer-only checker/package options by default

2019-05-23 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ accepted this revision.
NoQ added a comment.
This revision is now accepted and ready to land.

Next!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61839/new/

https://reviews.llvm.org/D61839



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


[PATCH] D62094: [analyzer] List checker/plugin options in 3 categories: released, alpha, developer

2019-05-23 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ accepted this revision.
NoQ added a comment.
This revision is now accepted and ready to land.

Thank you. This formalization work made things a lot easier and safer to deal 
with.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62094/new/

https://reviews.llvm.org/D62094



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


r361542 - Update breaking test.

2019-05-23 Thread Alina Sbirlea via cfe-commits
Author: asbirlea
Date: Thu May 23 12:51:16 2019
New Revision: 361542

URL: http://llvm.org/viewvc/llvm-project?rev=361542=rev
Log:
Update breaking test.

Modified:
cfe/trunk/test/CodeGen/loop-vectorize.c

Modified: cfe/trunk/test/CodeGen/loop-vectorize.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/loop-vectorize.c?rev=361542=361541=361542=diff
==
--- cfe/trunk/test/CodeGen/loop-vectorize.c (original)
+++ cfe/trunk/test/CodeGen/loop-vectorize.c Thu May 23 12:51:16 2019
@@ -10,7 +10,7 @@
 // CHECK-DISABLE-VECT: fmul double
 // CHECK-DISABLE-VECT-NOT: fmul <{{[0-9]+}} x double>
 
-#include 
+int printf(const char * restrict format, ...);
 
 void for_test() {
   double A[1000], B[1000];


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


[PATCH] D62340: [clang-tidy] In TransformerClangTidyCheck, require Explanation field.

2019-05-23 Thread Yitzhak Mandelbaum via Phabricator via cfe-commits
ymandel created this revision.
ymandel added a reviewer: ilya-biryukov.
Herald added a subscriber: xazax.hun.
Herald added a project: clang.

In general, the `Explanation` field is optional in `RewriteRule` cases. But,
because the primary purpose of clang-tidy checks is to provide users with
diagnostics, we assume that a missing explanation is a bug.  This change adds an
assertion that checks all cases for an explanation, and updates the code to rely
on that assertion correspondingly.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D62340

Files:
  clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
  clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
  clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp


Index: clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
@@ -29,12 +29,14 @@
   using tooling::stencil::cat;
 
   StringRef C = "C", T = "T", E = "E";
-  return tooling::makeRule(ifStmt(hasCondition(expr().bind(C)),
+  RewriteRule Rule = tooling::makeRule(ifStmt(hasCondition(expr().bind(C)),
   hasThen(stmt().bind(T)),
   hasElse(stmt().bind(E))),
change(statement(RewriteRule::RootID),
   cat("if(!(", node(C), ")) ", statement(E),
   " else ", statement(T;
+  Rule.Cases[0].Explanation = tooling::text("no explanation");
+  return Rule;
 }
 
 class IfInverterCheck : public TransformerClangTidyCheck {
Index: clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
===
--- clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
+++ clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
@@ -29,12 +29,17 @@
 //   MyCheck(StringRef Name, ClangTidyContext *Context)
 //   : TransformerClangTidyCheck(MyCheckAsRewriteRule, Name, Context) {}
 // };
+//
 class TransformerClangTidyCheck : public ClangTidyCheck {
 public:
+  // All cases in \p R must have a non-null \c Explanation, even though \c
+  // Explanation is optional for RewriteRule in general. Because the primary
+  // purpose of clang-tidy checks is to provide users with diagnostics, we
+  // assume that a missing explanation is a bug.  If no explanation is desired,
+  // indicate that explicitly (for example, `MyRule.Case[0].Explanation =
+  // text("no explanation")`).
   TransformerClangTidyCheck(tooling::RewriteRule R, StringRef Name,
-ClangTidyContext *Context)
-  : ClangTidyCheck(Name, Context), Rule(std::move(R)) {}
-
+ClangTidyContext *Context);
   void registerMatchers(ast_matchers::MatchFinder *Finder) final;
   void check(const ast_matchers::MatchFinder::MatchResult ) final;
 
Index: clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
===
--- clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
+++ clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
@@ -13,6 +13,17 @@
 namespace utils {
 using tooling::RewriteRule;
 
+TransformerClangTidyCheck::TransformerClangTidyCheck(tooling::RewriteRule R,
+ StringRef Name,
+ ClangTidyContext *Context)
+: ClangTidyCheck(Name, Context), Rule(std::move(R)) {
+  for (const auto  : Rule.Cases) {
+assert(Case.Explanation != nullptr &&
+   "clang-tidy checks must have an explanation by default;"
+   " explicitly provide an empty explanation if none is desired");
+  }
+}
+
 void TransformerClangTidyCheck::registerMatchers(
 ast_matchers::MatchFinder *Finder) {
   Finder->addDynamicMatcher(tooling::detail::buildMatcher(Rule), this);
@@ -44,15 +55,13 @@
   if (Transformations->empty())
 return;
 
-  StringRef Message = "no explanation";
-  if (Case.Explanation) {
-if (Expected E = Case.Explanation(Result))
-  Message = *E;
-else
-  llvm::errs() << "Error in explanation: " << llvm::toString(E.takeError())
-   << "\n";
+  Expected Explanation = Case.Explanation(Result);
+  if (!Explanation) {
+llvm::errs() << "Error in explanation: "
+ << llvm::toString(Explanation.takeError()) << "\n";
+return;
   }
-  DiagnosticBuilder Diag = diag(RootLoc, Message);
+  DiagnosticBuilder Diag = diag(RootLoc, *Explanation);
   for (const auto  : *Transformations) {
 Diag << FixItHint::CreateReplacement(T.Range, T.Replacement);
   }


Index: clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp

[PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Chris Bieneman via Phabricator via cfe-commits
beanz added a comment.

In D62279#1514467 , @winksaville wrote:

> Even with both gtest patches it still isn't working, `ninja check-all` is 
> failing as before :(


I wouldn't expect your gtest patch to resolve the issue. The 
`CLANG_BOOTSTRAP_TARGETS` variable is just a list of targets in the stage 2 
build to generate wrapper targets in the stage 1 build for. It allows you to 
run `ninja stage2-${target}` instead of having to go into the `stage2-bins` 
directory and run `ninja ${target}`.

> Is there a way to "force" gtest/gtest_main to get included just so I can see 
> if there is any other `check-all` failures?

It isn't really about including the target. The issue is that there is a 
missing dependency. We need to make sure the `gtest` and `gtest_main` targets 
are built before the `check-runtimes` target (which is part of `check-all`.

> Other suggestions?

My Linux test build is chugging along. It is going to take a while since it is 
in a VM, but once it completes I can look and see if I can work out why 
rL361436  didn't work to add the dependency.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62279/new/

https://reviews.llvm.org/D62279



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


[PATCH] D62093: [analyzer] List checkers in 3 categories: released, alpha, developer

2019-05-23 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ added a comment.

Thx!~




Comment at: lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp:527-530
+// developer checkers even in the alpha output. For example,
+// alpha.cplusplus.IteratorModeling is a modeling checker, hence it's 
hidden
+// by default, and users (even when the user is a developer of an alpha
+// checker) shouldn't normally tinker with whether they should be enabled.

Szelethus wrote:
> Szelethus wrote:
> > NoQ wrote:
> > > Hmm, just thought about this: by this logic, should we hide all `core` 
> > > checkers? Because we don't really support users tinkering with whether 
> > > they should be enabled :)
> > Thats actually a very cool idea. We should totally do that!
> Well umm. In a sense, sure, but wouldn't we want to display the checker 
> descriptions at least? Let's not rush this for now.
Yup. I guess we just separate models from checkers eventually.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62093/new/

https://reviews.llvm.org/D62093



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


[PATCH] D62333: Fix unresolved symbols when linking tools/clang/unittests/Tooling/ToolingTests

2019-05-23 Thread Thomas Lively via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361536: Fix unresolved symbols when linking 
tools/clang/unittests/Tooling/ToolingTests (authored by tlively, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D62333?vs=201022=201036#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62333/new/

https://reviews.llvm.org/D62333

Files:
  cfe/trunk/unittests/Tooling/CMakeLists.txt


Index: cfe/trunk/unittests/Tooling/CMakeLists.txt
===
--- cfe/trunk/unittests/Tooling/CMakeLists.txt
+++ cfe/trunk/unittests/Tooling/CMakeLists.txt
@@ -71,6 +71,7 @@
   clangToolingCore
   clangToolingInclusions
   clangToolingRefactor
+  LLVMTestingSupport
   )
 
 


Index: cfe/trunk/unittests/Tooling/CMakeLists.txt
===
--- cfe/trunk/unittests/Tooling/CMakeLists.txt
+++ cfe/trunk/unittests/Tooling/CMakeLists.txt
@@ -71,6 +71,7 @@
   clangToolingCore
   clangToolingInclusions
   clangToolingRefactor
+  LLVMTestingSupport
   )
 
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Wink Saville via Phabricator via cfe-commits
winksaville added a comment.

> Are you still having that issue after rL361436 
> ? That should have resolved that problem. 
> The issue isn't that gtest is missing from the bootstrap, but rather that it 
> was missing from the dependencies for the runtime libraries.

Yes, that patch was/is in my master when it failed above 
:

  $ git log -1 -p ed0036796164b3a2a93be8e2707984f57ba94e24
  commit ed0036796164b3a2a93be8e2707984f57ba94e24
  Author: Chris Bieneman 
  Date:   Wed May 22 21:42:06 2019 +
  
  [Runtimes] If LLVM_INCLUDE_TESTS=On depend on gtest
  
  Summary: If we are building the tests for the runtimes we should make 
them depend on gtest so that gtest is built and ready before we run any of the 
check-* targets.
  
  Reviewers: phosek, compnerd
  
  Reviewed By: compnerd
  
  Subscribers: mgorny, winksaville, llvm-commits
  
  Tags: #llvm
  
  Differential Revision: https://reviews.llvm.org/D62269
  
  llvm-svn: 361436
  
  diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt
  index 7bbf0cf26a5..285e1fcae1d 100644
  --- a/llvm/runtimes/CMakeLists.txt
  +++ b/llvm/runtimes/CMakeLists.txt
  @@ -553,6 +553,8 @@ else() # if this is included from LLVM's CMake
 obj2yaml
 sancov
 sanstats
  +  gtest_main
  +  gtest
   )
 foreach(target ${test_targets} ${SUB_CHECK_TARGETS})
   add_dependencies(${target} ${RUNTIMES_TEST_DEPENDS})

My master is at 74eb76f6 
:

  wink@wink-desktop:~/prgs/llvm/llvm-project 
(Use-LTO-capable-linker-and-add-libcxxabi)
  $ git log -1 master
  commit 74eb76f6c31e13551269f711cfccceca92b45783 (upstream/master, 
origin/master, origin/HEAD, master)
  Author: Alex Langford 
  Date:   Wed May 22 23:01:18 2019 +
  
  [Target] Protect Processes' language runtimes map with a mutex
  
  Summary:
  From what I understand, it's possible for multiple threads to request
  a specific language runtime (e.g. CPPLanguageRuntime). This leads to a 
data
  race.
  
  Reviewers: jingham, JDevlieghere, compnerd, clayborg
  
  Differential Revision: https://reviews.llvm.org/D62169
  
  llvm-svn: 361442

On top of master I have two commits to add lld, libcxxabi, gtest_main and gtest:

  $ git log -2 -p
  commit b6b78d5b1d55b7643634ded9412c42dd52782e37 (HEAD -> 
Use-LTO-capable-linker-and-add-libcxxabi)
  Author: Wink Saville 
  Date:   Thu May 23 08:14:44 2019 -0700
  
  Add gtest_main and gtest
  
  See if this fixes check all
  
  diff --git a/clang/cmake/caches/DistributionExample.cmake 
b/clang/cmake/caches/DistributionExample.cmake
  index 50fcc09cf07..fd525b8f4ce 100644
  --- a/clang/cmake/caches/DistributionExample.cmake
  +++ b/clang/cmake/caches/DistributionExample.cmake
  @@ -24,6 +24,8 @@ endif()
   
   # Expose stage2 targets through the stage1 build configuration.
   set(CLANG_BOOTSTRAP_TARGETS
  +  gtest_main
  +  gtest
 check-all
 check-llvm
 check-clang
  
  commit b99e88f595fd3e27e68c18d95f88552cb25aea43 
(origin/Use-LTO-capable-linker-and-add-libcxxabi, origin/Use-LTO-capable-linker)
  Author: Wink Saville 
  Date:   Wed May 22 16:23:47 2019 -0700
  
  Use LTO capable linker and add libcxxabi
  
  In DistributionExample.cmake be sure we use a LTO
  capable linker, the easiest to choose is lld.
  
  Reviewers: beanz
  
  Subscribers: mgorny, mehdi_amini, inglorion, dexonsmith, cfe-commits
  
  Tags: #clang
  
  Differential Revision: https://reviews.llvm.org/D62279
  
  diff --git a/clang/cmake/caches/DistributionExample-stage2.cmake 
b/clang/cmake/caches/DistributionExample-stage2.cmake
  index f4d5d92d1d1..99d5dc0fd2f 100644
  --- a/clang/cmake/caches/DistributionExample-stage2.cmake
  +++ b/clang/cmake/caches/DistributionExample-stage2.cmake
  @@ -2,7 +2,7 @@
   # bootstrap build.
   
   set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
  -set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx" CACHE STRING "")
  +set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi" CACHE STRING "")
   
   set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64 CACHE STRING "")
   
  diff --git a/clang/cmake/caches/DistributionExample.cmake 
b/clang/cmake/caches/DistributionExample.cmake
  index 35493edd17f..50fcc09cf07 100644
  --- a/clang/cmake/caches/DistributionExample.cmake
  +++ b/clang/cmake/caches/DistributionExample.cmake
  @@ -2,7 +2,7 @@
   
   #Enable LLVM projects and runtimes
   set(LLVM_ENABLE_PROJECTS "clang;clang-tools-extra;lld" CACHE STRING "")
  -set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx" CACHE STRING "")
  +set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi" CACHE STRING "")
   
   # Only build the native target in stage1 since it is a throwaway 

r361536 - Fix unresolved symbols when linking tools/clang/unittests/Tooling/ToolingTests

2019-05-23 Thread Thomas Lively via cfe-commits
Author: tlively
Date: Thu May 23 11:55:00 2019
New Revision: 361536

URL: http://llvm.org/viewvc/llvm-project?rev=361536=rev
Log:
Fix unresolved symbols when linking tools/clang/unittests/Tooling/ToolingTests

Summary: Add correct cmake dependencies so that `ToolingTests` link
successfully.

Patch by Guanzhong Chen

Reviewers: tlively, aheejin

Reviewed By: tlively

Subscribers: mgorny, cfe-commits

Tags: #clang

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

Modified:
cfe/trunk/unittests/Tooling/CMakeLists.txt

Modified: cfe/trunk/unittests/Tooling/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/CMakeLists.txt?rev=361536=361535=361536=diff
==
--- cfe/trunk/unittests/Tooling/CMakeLists.txt (original)
+++ cfe/trunk/unittests/Tooling/CMakeLists.txt Thu May 23 11:55:00 2019
@@ -71,6 +71,7 @@ target_link_libraries(ToolingTests
   clangToolingCore
   clangToolingInclusions
   clangToolingRefactor
+  LLVMTestingSupport
   )
 
 


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


[PATCH] D61617: [NewPassManager] Add tuning option: SLPVectorization [clang-change]

2019-05-23 Thread Alina Sbirlea via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC361534: [NewPassManager] Add tuning option: SLPVectorization 
[clang-change] (authored by asbirlea, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D61617?vs=198587=201033#toc

Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61617/new/

https://reviews.llvm.org/D61617

Files:
  lib/CodeGen/BackendUtil.cpp
  test/CodeGen/loop-vectorize.c


Index: lib/CodeGen/BackendUtil.cpp
===
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -1050,7 +1050,14 @@
   CodeGenOpts.DebugInfoForProfiling);
   }
 
-  PassBuilder PB(TM.get(), PipelineTuningOptions(), PGOOpt);
+  PipelineTuningOptions PTO;
+  // For historical reasons, loop interleaving is set to mirror setting for 
loop
+  // unrolling.
+  PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
+  PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
+  PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
+
+  PassBuilder PB(TM.get(), PTO, PGOOpt);
 
   // Attempt to load pass plugins and register their callbacks with PB.
   for (auto  : CodeGenOpts.PassPlugins) {
Index: test/CodeGen/loop-vectorize.c
===
--- test/CodeGen/loop-vectorize.c
+++ test/CodeGen/loop-vectorize.c
@@ -0,0 +1,25 @@
+// RUN: %clang -target x86_64 -S -c -O1 -fvectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -S -c -O1 -fno-vectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-DISABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fvectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fno-vectorize -emit-llvm -o - %s | FileCheck %s 
-check-prefix=CHECK-DISABLE-VECT
+
+// CHECK-ENABLE-VECT-LABEL: @for_test()
+// CHECK-ENABLE-VECT: fmul <{{[0-9]+}} x double>
+
+// CHECK-DISABLE-VECT-LABEL: @for_test()
+// CHECK-DISABLE-VECT: fmul double
+// CHECK-DISABLE-VECT-NOT: fmul <{{[0-9]+}} x double>
+
+#include 
+
+void for_test() {
+  double A[1000], B[1000];
+  int L = 500;
+  for (int i = 0; i < L; i++) {
+A[i] = i;
+  }
+  for (int i = 0; i < L; i++) {
+B[i] = A[i]*5;
+  }
+  printf("%lf %lf\n", A[0], B[0]);
+}


Index: lib/CodeGen/BackendUtil.cpp
===
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -1050,7 +1050,14 @@
   CodeGenOpts.DebugInfoForProfiling);
   }
 
-  PassBuilder PB(TM.get(), PipelineTuningOptions(), PGOOpt);
+  PipelineTuningOptions PTO;
+  // For historical reasons, loop interleaving is set to mirror setting for loop
+  // unrolling.
+  PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
+  PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
+  PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
+
+  PassBuilder PB(TM.get(), PTO, PGOOpt);
 
   // Attempt to load pass plugins and register their callbacks with PB.
   for (auto  : CodeGenOpts.PassPlugins) {
Index: test/CodeGen/loop-vectorize.c
===
--- test/CodeGen/loop-vectorize.c
+++ test/CodeGen/loop-vectorize.c
@@ -0,0 +1,25 @@
+// RUN: %clang -target x86_64 -S -c -O1 -fvectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -S -c -O1 -fno-vectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-DISABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 -fvectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 -fno-vectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-DISABLE-VECT
+
+// CHECK-ENABLE-VECT-LABEL: @for_test()
+// CHECK-ENABLE-VECT: fmul <{{[0-9]+}} x double>
+
+// CHECK-DISABLE-VECT-LABEL: @for_test()
+// CHECK-DISABLE-VECT: fmul double
+// CHECK-DISABLE-VECT-NOT: fmul <{{[0-9]+}} x double>
+
+#include 
+
+void for_test() {
+  double A[1000], B[1000];
+  int L = 500;
+  for (int i = 0; i < L; i++) {
+A[i] = i;
+  }
+  for (int i = 0; i < L; i++) {
+B[i] = A[i]*5;
+  }
+  printf("%lf %lf\n", A[0], B[0]);
+}
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r361534 - [NewPassManager] Add tuning option: SLPVectorization [clang-change]

2019-05-23 Thread Alina Sbirlea via cfe-commits
Author: asbirlea
Date: Thu May 23 11:51:02 2019
New Revision: 361534

URL: http://llvm.org/viewvc/llvm-project?rev=361534=rev
Log:
[NewPassManager] Add tuning option: SLPVectorization [clang-change]

Summary:
NewPassManager is not using CodeGenOpts values before this patch.
[to be coupled with D61616]

Reviewers: chandlerc

Subscribers: jlebar, cfe-commits, llvm-commits

Tags: #clang

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

Added:
cfe/trunk/test/CodeGen/loop-vectorize.c
Modified:
cfe/trunk/lib/CodeGen/BackendUtil.cpp

Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=361534=361533=361534=diff
==
--- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original)
+++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Thu May 23 11:51:02 2019
@@ -1050,7 +1050,14 @@ void EmitAssemblyHelper::EmitAssemblyWit
   CodeGenOpts.DebugInfoForProfiling);
   }
 
-  PassBuilder PB(TM.get(), PipelineTuningOptions(), PGOOpt);
+  PipelineTuningOptions PTO;
+  // For historical reasons, loop interleaving is set to mirror setting for 
loop
+  // unrolling.
+  PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
+  PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
+  PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
+
+  PassBuilder PB(TM.get(), PTO, PGOOpt);
 
   // Attempt to load pass plugins and register their callbacks with PB.
   for (auto  : CodeGenOpts.PassPlugins) {

Added: cfe/trunk/test/CodeGen/loop-vectorize.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/loop-vectorize.c?rev=361534=auto
==
--- cfe/trunk/test/CodeGen/loop-vectorize.c (added)
+++ cfe/trunk/test/CodeGen/loop-vectorize.c Thu May 23 11:51:02 2019
@@ -0,0 +1,25 @@
+// RUN: %clang -target x86_64 -S -c -O1 -fvectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -S -c -O1 -fno-vectorize -emit-llvm -o - %s | 
FileCheck %s -check-prefix=CHECK-DISABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fvectorize -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-ENABLE-VECT
+// RUN: %clang -target x86_64 -fexperimental-new-pass-manager -S -c -O1 
-fno-vectorize -emit-llvm -o - %s | FileCheck %s 
-check-prefix=CHECK-DISABLE-VECT
+
+// CHECK-ENABLE-VECT-LABEL: @for_test()
+// CHECK-ENABLE-VECT: fmul <{{[0-9]+}} x double>
+
+// CHECK-DISABLE-VECT-LABEL: @for_test()
+// CHECK-DISABLE-VECT: fmul double
+// CHECK-DISABLE-VECT-NOT: fmul <{{[0-9]+}} x double>
+
+#include 
+
+void for_test() {
+  double A[1000], B[1000];
+  int L = 500;
+  for (int i = 0; i < L; i++) {
+A[i] = i;
+  }
+  for (int i = 0; i < L; i++) {
+B[i] = A[i]*5;
+  }
+  printf("%lf %lf\n", A[0], B[0]);
+}


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


[PATCH] D62156: [Sema][PR41730] Diagnose addr space mismatch while constructing objects

2019-05-23 Thread John McCall via Phabricator via cfe-commits
rjmccall added inline comments.



Comment at: include/clang/Sema/Overload.h:977
+
+void setDestAS(LangAS AS) { DestAS = AS; }
   };

Can this assert that `Kind == CSK_InitByConstructor || Kind == 
CSK_InitByUserDefinedConversion`?



Comment at: lib/Sema/SemaDeclCXX.cpp:8229
+  if (FTI.hasMethodTypeCVRUQualifiers()) {
+FTI.MethodQualifiers->forEachCVRUQualifier(
 [&](DeclSpec::TQ TypeQual, StringRef QualName, SourceLocation SL) {

rjmccall wrote:
> We want to catch `_Atomic`, too, so please just change this loop to ignore 
> address-space qualifiers, using a flag to decide whether to call 
> `setInvalidType`.
If there aren't any qualifiers we're skipping, the flag isn't necessary.



Comment at: lib/Sema/SemaOverload.cpp:6038
+  Constructor->getMethodQualifiers().getAddressSpace(),
+  CandidateSet.getDestAS(
 return;

I think you should add the candidate but mark it as non-viable.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62156/new/

https://reviews.llvm.org/D62156



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


[PATCH] D62335: [OpenCL][PR41963] Add overloads of old atomics with generic pointer type in C++ mode

2019-05-23 Thread Anastasia Stulova via Phabricator via cfe-commits
Anastasia created this revision.
Anastasia added a reviewer: svenvh.
Herald added subscribers: ebevhan, jfb, yaxunl.

The direction is to allow it as an extension to the kernel language 2.0 and 
above.

https://github.com/KhronosGroup/OpenCL-Docs/issues/66

For the published OpenCL C spec there might be extra work still needed but I am 
enabling this at least in C++ mode for now.


https://reviews.llvm.org/D62335

Files:
  lib/Headers/opencl-c.h
  test/Headers/opencl-c-header.cl

Index: test/Headers/opencl-c-header.cl
===
--- test/Headers/opencl-c-header.cl
+++ test/Headers/opencl-c-header.cl
@@ -73,6 +73,14 @@
 }
 #endif //__OPENCL_C_VERSION__
 
+#if defined(__OPENCL_CPP_VERSION__)
+void test_atomics(__generic volatile unsigned int* a)
+{
+atomic_add(a, 1);
+}
+#endif
+
+
 // Verify that non-builtin cl_intel_planar_yuv extension is defined from
 // OpenCL 1.2 onwards.
 #if defined(__OPENCL_CPP_VERSION__) || (__OPENCL_C_VERSION__ >= CL_VERSION_1_2)
Index: lib/Headers/opencl-c.h
===
--- lib/Headers/opencl-c.h
+++ lib/Headers/opencl-c.h
@@ -13340,6 +13340,10 @@
 unsigned int __ovld atomic_add(volatile __global unsigned int *p, unsigned int val);
 int __ovld atomic_add(volatile __local int *p, int val);
 unsigned int __ovld atomic_add(volatile __local unsigned int *p, unsigned int val);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_add(volatile int *p, int val);
+unsigned int __ovld atomic_add(volatile unsigned int *p, unsigned int val);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_add(volatile __global int *p, int val);
@@ -13366,6 +13370,10 @@
 unsigned int __ovld atomic_sub(volatile __global unsigned int *p, unsigned int val);
 int __ovld atomic_sub(volatile __local int *p, int val);
 unsigned int __ovld atomic_sub(volatile __local unsigned int *p, unsigned int val);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_sub(volatile int *p, int val);
+unsigned int __ovld atomic_sub(volatile unsigned int *p, unsigned int val);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_sub(volatile __global int *p, int val);
@@ -13394,6 +13402,11 @@
 unsigned int __ovld atomic_xchg(volatile __local unsigned int *p, unsigned int val);
 float __ovld atomic_xchg(volatile __global float *p, float val);
 float __ovld atomic_xchg(volatile __local float *p, float val);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_xchg(volatile int *p, int val);
+unsigned int __ovld atomic_xchg(volatile unsigned int *p, unsigned int val);
+float __ovld atomic_xchg(volatile float *p, float val);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_xchg(volatile __global int *p, int val);
@@ -13421,6 +13434,10 @@
 unsigned int __ovld atomic_inc(volatile __global unsigned int *p);
 int __ovld atomic_inc(volatile __local int *p);
 unsigned int __ovld atomic_inc(volatile __local unsigned int *p);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_inc(volatile int *p);
+unsigned int __ovld atomic_inc(volatile unsigned int *p);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_inc(volatile __global int *p);
@@ -13448,6 +13465,10 @@
 unsigned int __ovld atomic_dec(volatile __global unsigned int *p);
 int __ovld atomic_dec(volatile __local int *p);
 unsigned int __ovld atomic_dec(volatile __local unsigned int *p);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_dec(volatile int *p);
+unsigned int __ovld atomic_dec(volatile unsigned int *p);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_dec(volatile __global int *p);
@@ -13476,6 +13497,10 @@
 unsigned int __ovld atomic_cmpxchg(volatile __global unsigned int *p, unsigned int cmp, unsigned int val);
 int __ovld atomic_cmpxchg(volatile __local int *p, int cmp, int val);
 unsigned int __ovld atomic_cmpxchg(volatile __local unsigned int *p, unsigned int cmp, unsigned int val);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_cmpxchg(volatile int *p, int cmp, int val);
+unsigned int __ovld atomic_cmpxchg(volatile unsigned int *p, unsigned int cmp, unsigned int val);
+#endif
 
 #if defined(cl_khr_global_int32_base_atomics)
 int __ovld atom_cmpxchg(volatile __global int *p, int cmp, int val);
@@ -13504,6 +13529,10 @@
 unsigned int __ovld atomic_min(volatile __global unsigned int *p, unsigned int val);
 int __ovld atomic_min(volatile __local int *p, int val);
 unsigned int __ovld atomic_min(volatile __local unsigned int *p, unsigned int val);
+#ifdef __OPENCL_CPP_VERSION__
+int __ovld atomic_min(volatile __local int *p, int val);
+unsigned int __ovld atomic_min(volatile __local unsigned int *p, unsigned int val);
+#endif
 
 #if defined(cl_khr_global_int32_extended_atomics)
 int __ovld atom_min(volatile __global int *p, int val);
@@ -13559,6 +13588,10 @@
 unsigned int __ovld atomic_and(volatile __global unsigned int *p, unsigned int val);
 int __ovld 

[PATCH] D62270: [Driver] Move the "-o OUT -x TYPE SRC.c" flags to the end of -cc1

2019-05-23 Thread Reid Kleckner via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rC361530: [Driver] Move the -o OUT -x TYPE SRC.c 
flags to the end of -cc1 (authored by rnk, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D62270?vs=200827=201026#toc

Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62270/new/

https://reviews.llvm.org/D62270

Files:
  lib/Driver/ToolChains/Clang.cpp
  test/Driver/cuda-options.cu
  test/Driver/hip-toolchain-no-rdc.hip
  test/Driver/openmp-offload.c

Index: test/Driver/cuda-options.cu
===
--- test/Driver/cuda-options.cu
+++ test/Driver/cuda-options.cu
@@ -253,14 +253,14 @@
 // HOST: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
 // HOST-SAME: "-aux-triple" "nvptx64-nvidia-cuda"
 // HOST-NOT: "-fcuda-is-device"
-// HOST-SAME: "-o" "[[HOSTOUTPUT:[^"]*]]"
-// HOST-NOSAVE-SAME: "-x" "cuda"
-// HOST-SAVE-SAME: "-x" "cuda-cpp-output"
 // There is only one GPU binary after combining it with fatbinary!
 // INCLUDES-DEVICE2-NOT: "-fcuda-include-gpubinary"
 // INCLUDES-DEVICE-SAME: "-fcuda-include-gpubinary" "[[FATBINARY]]"
 // There is only one GPU binary after combining it with fatbinary.
 // INCLUDES-DEVICE2-NOT: "-fcuda-include-gpubinary"
+// HOST-SAME: "-o" "[[HOSTOUTPUT:[^"]*]]"
+// HOST-NOSAVE-SAME: "-x" "cuda"
+// HOST-SAVE-SAME: "-x" "cuda-cpp-output"
 
 // Match external assembler that uses compilation output.
 // HOST-AS: "-o" "{{.*}}.o" "[[HOSTOUTPUT]]"
Index: test/Driver/openmp-offload.c
===
--- test/Driver/openmp-offload.c
+++ test/Driver/openmp-offload.c
@@ -294,26 +294,29 @@
 //
 // Generate host BC file.
 //
-// CHK-COMMANDS: clang{{.*}}" "-cc1" "-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc" {{.*}}"-o" "
+// CHK-COMMANDS: clang{{.*}}" "-cc1" "-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc"
+// CHK-COMMANDS-SAME: "-fopenmp-targets=powerpc64le-ibm-linux-gnu,x86_64-pc-linux-gnu"
+// CHK-COMMANDS-SAME: "-o" "
 // CHK-COMMANDS-SAME: [[HOSTBC:[^\\/]+\.bc]]" "-x" "c" "
-// CHK-COMMANDS-SAME: [[INPUT:[^\\/]+\.c]]" "-fopenmp-targets=powerpc64le-ibm-linux-gnu,x86_64-pc-linux-gnu"
+// CHK-COMMANDS-SAME: [[INPUT:[^\\/]+\.c]]"
 // CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-unknown-linux" {{.*}}"-E" {{.*}}"-fopenmp" {{.*}}"-o" "
 // CHK-COMMANDS-ST-SAME: [[HOSTPP:[^\\/]+\.i]]" "-x" "c" "
 // CHK-COMMANDS-ST-SAME: [[INPUT:[^\\/]+\.c]]"
-// CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc" {{.*}}"-fopenmp" {{.*}}"-o" "
-// CHK-COMMANDS-ST-SAME: [[HOSTBC:[^\\/]+\.bc]]" "-x" "cpp-output" "{{.*}}[[HOSTPP]]" "-fopenmp-targets=powerpc64le-ibm-linux-gnu,x86_64-pc-linux-gnu"
+// CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc" {{.*}}"-fopenmp" {{.*}}"-fopenmp-targets=powerpc64le-ibm-linux-gnu,x86_64-pc-linux-gnu" {{.*}}"-o" "
+// CHK-COMMANDS-ST-SAME: [[HOSTBC:[^\\/]+\.bc]]" "-x" "cpp-output" "{{.*}}[[HOSTPP]]"
 
 //
 // Compile for the powerpc device.
 //
-// CHK-COMMANDS: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-obj" {{.*}}"-pic-level" "2" {{.*}}"-fopenmp" {{.*}}"-o" "
-// CHK-COMMANDS-SAME: [[T1OBJ:[^\\/]+\.o]]" "-x" "c" "{{.*}}[[INPUT]]" "-fopenmp-is-device" "-fopenmp-host-ir-file-path" "{{.*}}[[HOSTBC]]"
+// CHK-COMMANDS: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-obj" {{.*}}"-pic-level" "2" {{.*}}"-fopenmp"
+// CHK-COMMANDS-SAME: "-fopenmp-is-device" "-fopenmp-host-ir-file-path" "{{.*}}[[HOSTBC]]" {{.*}}"-o" "
+// CHK-COMMANDS-SAME: [[T1OBJ:[^\\/]+\.o]]" "-x" "c" "{{.*}}[[INPUT]]"
 // CHK-COMMANDS: ld{{(\.exe)?}}" {{.*}}"-o" "
 // CHK-COMMANDS-SAME: [[T1BIN:[^\\/]+\.out]]" {{.*}}"{{.*}}[[T1OBJ]]"
 // CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-E" {{.*}}"-fopenmp" {{.*}}"-o" "
 // CHK-COMMANDS-ST-SAME: [[T1PP:[^\\/]+\.i]]" "-x" "c" "{{.*}}[[INPUT]]"
-// CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc" {{.*}}"-pic-level" "2" {{.*}}"-fopenmp" {{.*}}"-o" "
-// CHK-COMMANDS-ST-SAME: [[T1BC:[^\\/]+\.bc]]" "-x" "cpp-output" "{{.*}}[[T1PP]]" "-fopenmp-is-device" "-fopenmp-host-ir-file-path" "{{.*}}[[HOSTBC]]"
+// CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-emit-llvm-bc" {{.*}}"-pic-level" "2" {{.*}}"-fopenmp" {{.*}}"-fopenmp-is-device" "-fopenmp-host-ir-file-path" "{{.*}}[[HOSTBC]]" {{.*}}"-o" "
+// CHK-COMMANDS-ST-SAME: [[T1BC:[^\\/]+\.bc]]" "-x" "cpp-output" "{{.*}}[[T1PP]]"
 // CHK-COMMANDS-ST: clang{{.*}}" "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" "-aux-triple" 

r361530 - [Driver] Move the "-o OUT -x TYPE SRC.c" flags to the end of -cc1

2019-05-23 Thread Reid Kleckner via cfe-commits
Author: rnk
Date: Thu May 23 11:35:43 2019
New Revision: 361530

URL: http://llvm.org/viewvc/llvm-project?rev=361530=rev
Log:
[Driver] Move the "-o OUT -x TYPE SRC.c" flags to the end of -cc1

New -cc1 arguments, such as -faddrsig, have started appearing after the
input name. I personally find it convenient for the input to be the last
argument to the compile command line, since I often need to edit it when
running crash reproduction scripts.

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

Modified:
cfe/trunk/lib/Driver/ToolChains/Clang.cpp
cfe/trunk/test/Driver/cuda-options.cu
cfe/trunk/test/Driver/hip-toolchain-no-rdc.hip
cfe/trunk/test/Driver/openmp-offload.c

Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=361530=361529=361530=diff
==
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Thu May 23 11:35:43 2019
@@ -5215,30 +5215,6 @@ void Clang::ConstructJob(Compilation ,
   isa(JA))
 CmdArgs.push_back("-disable-llvm-passes");
 
-  if (Output.getType() == types::TY_Dependencies) {
-// Handled with other dependency code.
-  } else if (Output.isFilename()) {
-CmdArgs.push_back("-o");
-CmdArgs.push_back(Output.getFilename());
-  } else {
-assert(Output.isNothing() && "Invalid output.");
-  }
-
-  addDashXForInput(Args, Input, CmdArgs);
-
-  ArrayRef FrontendInputs = Input;
-  if (IsHeaderModulePrecompile)
-FrontendInputs = ModuleHeaderInputs;
-  else if (Input.isNothing())
-FrontendInputs = {};
-
-  for (const InputInfo  : FrontendInputs) {
-if (Input.isFilename())
-  CmdArgs.push_back(Input.getFilename());
-else
-  Input.getInputArg().renderAsInput(Args, CmdArgs);
-  }
-
   Args.AddAllArgs(CmdArgs, options::OPT_undef);
 
   const char *Exec = D.getClangProgramPath();
@@ -5436,6 +5412,32 @@ void Clang::ConstructJob(Compilation ,
TC.useIntegratedAs()))
 CmdArgs.push_back("-faddrsig");
 
+  // Add the "-o out -x type src.c" flags last. This is done primarily to make
+  // the -cc1 command easier to edit when reproducing compiler crashes.
+  if (Output.getType() == types::TY_Dependencies) {
+// Handled with other dependency code.
+  } else if (Output.isFilename()) {
+CmdArgs.push_back("-o");
+CmdArgs.push_back(Output.getFilename());
+  } else {
+assert(Output.isNothing() && "Invalid output.");
+  }
+
+  addDashXForInput(Args, Input, CmdArgs);
+
+  ArrayRef FrontendInputs = Input;
+  if (IsHeaderModulePrecompile)
+FrontendInputs = ModuleHeaderInputs;
+  else if (Input.isNothing())
+FrontendInputs = {};
+
+  for (const InputInfo  : FrontendInputs) {
+if (Input.isFilename())
+  CmdArgs.push_back(Input.getFilename());
+else
+  Input.getInputArg().renderAsInput(Args, CmdArgs);
+  }
+
   // Finally add the compile command to the compilation.
   if (Args.hasArg(options::OPT__SLASH_fallback) &&
   Output.getType() == types::TY_Object &&

Modified: cfe/trunk/test/Driver/cuda-options.cu
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cuda-options.cu?rev=361530=361529=361530=diff
==
--- cfe/trunk/test/Driver/cuda-options.cu (original)
+++ cfe/trunk/test/Driver/cuda-options.cu Thu May 23 11:35:43 2019
@@ -253,14 +253,14 @@
 // HOST: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
 // HOST-SAME: "-aux-triple" "nvptx64-nvidia-cuda"
 // HOST-NOT: "-fcuda-is-device"
-// HOST-SAME: "-o" "[[HOSTOUTPUT:[^"]*]]"
-// HOST-NOSAVE-SAME: "-x" "cuda"
-// HOST-SAVE-SAME: "-x" "cuda-cpp-output"
 // There is only one GPU binary after combining it with fatbinary!
 // INCLUDES-DEVICE2-NOT: "-fcuda-include-gpubinary"
 // INCLUDES-DEVICE-SAME: "-fcuda-include-gpubinary" "[[FATBINARY]]"
 // There is only one GPU binary after combining it with fatbinary.
 // INCLUDES-DEVICE2-NOT: "-fcuda-include-gpubinary"
+// HOST-SAME: "-o" "[[HOSTOUTPUT:[^"]*]]"
+// HOST-NOSAVE-SAME: "-x" "cuda"
+// HOST-SAVE-SAME: "-x" "cuda-cpp-output"
 
 // Match external assembler that uses compilation output.
 // HOST-AS: "-o" "{{.*}}.o" "[[HOSTOUTPUT]]"

Modified: cfe/trunk/test/Driver/hip-toolchain-no-rdc.hip
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/hip-toolchain-no-rdc.hip?rev=361530=361529=361530=diff
==
--- cfe/trunk/test/Driver/hip-toolchain-no-rdc.hip (original)
+++ cfe/trunk/test/Driver/hip-toolchain-no-rdc.hip Thu May 23 11:35:43 2019
@@ -80,9 +80,9 @@
 // CHECK-SAME: "-aux-triple" "amdgcn-amd-amdhsa"
 // CHECK-SAME: "-emit-obj"
 // CHECK-SAME: {{.*}} "-main-file-name" "a.cu"
+// CHECK-SAME: {{.*}} "-fcuda-include-gpubinary" "[[BUNDLE_A]]"
 // CHECK-SAME: {{.*}} "-o" [[A_OBJ_HOST:".*o"]] "-x" "hip"
 // CHECK-SAME: 

[PATCH] D62333: Fix unresolved symbols when linking tools/clang/unittests/Tooling/ToolingTests

2019-05-23 Thread Guanzhong Chen via Phabricator via cfe-commits
quantum created this revision.
quantum added reviewers: tlively, aheejin.
Herald added subscribers: cfe-commits, mgorny.
Herald added a project: clang.

Add correct cmake dependencies so that `ToolingTests` link successfully.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D62333

Files:
  clang/unittests/Tooling/CMakeLists.txt


Index: clang/unittests/Tooling/CMakeLists.txt
===
--- clang/unittests/Tooling/CMakeLists.txt
+++ clang/unittests/Tooling/CMakeLists.txt
@@ -2,6 +2,7 @@
   ${LLVM_TARGETS_TO_BUILD}
   Support
   TestingSupport
+  LLVMTestingSupport
   )
 
 # By default MSVC has a 2^16 limit on the number of sections in an object file,
@@ -71,6 +72,7 @@
   clangToolingCore
   clangToolingInclusions
   clangToolingRefactor
+  LLVMTestingSupport
   )
 
 


Index: clang/unittests/Tooling/CMakeLists.txt
===
--- clang/unittests/Tooling/CMakeLists.txt
+++ clang/unittests/Tooling/CMakeLists.txt
@@ -2,6 +2,7 @@
   ${LLVM_TARGETS_TO_BUILD}
   Support
   TestingSupport
+  LLVMTestingSupport
   )
 
 # By default MSVC has a 2^16 limit on the number of sections in an object file,
@@ -71,6 +72,7 @@
   clangToolingCore
   clangToolingInclusions
   clangToolingRefactor
+  LLVMTestingSupport
   )
 
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D61716: [libclang] Expose AtomicType

2019-05-23 Thread Henry Jen via Phabricator via cfe-commits
slowhog edited projects, added clang-c; removed clang.
slowhog removed reviewers: yvvan, jbcoe.
slowhog added a comment.
Herald added a project: clang.

Hi,

We use libclang in OpenJDK project Panama for a tool, jextract, to read C 
header files and generate Java bindings. It's critical for us to be able get 
the "real" underlying type.

Currently type like _Atomic(int) are not exposed, and libclang will give us a 
type kind of CXType_Unexposed, and we need a way to get the value type of 
CXType_Int .

Is there an existing way to do that? I have tried to call 
clang_getCanonicalType on the unexposed type, but that return the same 
unexposed type.

Please let me know if the proposed patch is on the right track or not, I would 
appreciate guidance to get this issue solved.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61716/new/

https://reviews.llvm.org/D61716



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


[PATCH] D62049: [clang-tidy] Add a close-on-exec check on pipe2() in Android module.

2019-05-23 Thread Stephen Hines via Phabricator via cfe-commits
srhines added inline comments.



Comment at: clang-tools-extra/test/clang-tidy/android-cloexec-pipe2.cpp:52
+
+void e() {
+  int pipefd[2];

jcai19 wrote:
> srhines wrote:
> > I'm not all that familiar with writing clang-tidy-specific tests, but 
> > should these tests here denote that a diagnostic should NOT be issued? That 
> > is usually the convention in regular Clang tests, so I assume the test 
> > runner here should be equally supportive of ensuring that the contents 
> > passed through without any other diagnostics related to pipe2 and/or 
> > O_CLOEXEC.
> That makes sense, and I have seem tests for similar checks with (e.g. 
> android-cloexec-open)  and without (e.g. android-cloexec-accep4 and 
> android-cloexec-socket) additional CHECK-MESSAGES-NOT check. But based on the 
> Testing Checks section of 
> https://clang.llvm.org/extra/clang-tidy/Contributing.html, it seems typically 
> CHECK-MASSAGES and CHECK-FIXES are sufficient for clang-tidy checks. Please 
> let me know what you think.
If you look in test/clang-tidy/android-cloexec-creat.cpp, you will see that 
there are "CHECK-MESSAGES-NOT" checks that ensure the diagnostic is not issued 
in correct cases. You can put the checks on lines 39, 58, and 67, which will 
ensure that there are no additional diagnostics being generated.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62049/new/

https://reviews.llvm.org/D62049



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


[PATCH] D62276: lld-link, clang: Treat non-existent input files as possible spellos for option flags

2019-05-23 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rLLD361518: lld-link, clang: Treat non-existent input files as 
possible spellos for option… (authored by nico, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D62276?vs=200845=201017#toc

Repository:
  rLLD LLVM Linker

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62276/new/

https://reviews.llvm.org/D62276

Files:
  COFF/Driver.cpp
  COFF/DriverUtils.cpp
  test/COFF/color-diagnostics.test
  test/COFF/could-not-open.test
  test/COFF/driver.test
  test/COFF/error-limit.test
  test/COFF/nodefaultlib.test
  test/COFF/responsefile.test

Index: test/COFF/error-limit.test
===
--- test/COFF/error-limit.test
+++ test/COFF/error-limit.test
@@ -1,26 +1,26 @@
 RUN: not lld-link 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 \
 RUN:   21 22 2>&1 | FileCheck -check-prefix=DEFAULT %s
 
-DEFAULT:  could not open 01
-DEFAULT:  could not open 20
+DEFAULT:  could not open '01'
+DEFAULT:  could not open '20'
 DEFAULT-NEXT: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)
-DEFAULT-NOT:  could not open 21
+DEFAULT-NOT:  could not open '21'
 
 RUN: not lld-link /errorlimit:5 01 02 03 04 05 06 07 08 09 10 2>&1 \
 RUN:   | FileCheck -check-prefix=LIMIT5 %s
 
-LIMIT5:  could not open 01
-LIMIT5:  could not open 05
+LIMIT5:  could not open '01'
+LIMIT5:  could not open '05'
 LIMIT5-NEXT: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)
-LIMIT5-NOT:  could not open 06
+LIMIT5-NOT:  could not open '06'
 
 RUN: not lld-link /errorlimit:0 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 \
 RUN:   16 17 18 19 20 21 22 2>&1 | FileCheck -check-prefix=UNLIMITED %s
 
-UNLIMITED: could not open 01
-UNLIMITED: could not open 20
-UNLIMITED: could not open 21
-UNLIMITED: could not open 22
+UNLIMITED: could not open '01'
+UNLIMITED: could not open '20'
+UNLIMITED: could not open '21'
+UNLIMITED: could not open '22'
 UNLIMITED-NOT: too many errors emitted, stopping now (use /errorlimit:0 to see all errors)
 
 RUN: not lld-link /errorlimit:XYZ 01 02 03 04 05 06 07 08 09 10 11 12 13 14 \
Index: test/COFF/nodefaultlib.test
===
--- test/COFF/nodefaultlib.test
+++ test/COFF/nodefaultlib.test
@@ -19,8 +19,8 @@
 # RUN:   /nodefaultlib:std64.lib >& %t.log || true
 # RUN: FileCheck -check-prefix=CHECK3 %s < %t.log
 
-CHECK1: error: could not open hello64.obj: {{[Nn]}}o such file or directory
-CHECK2: error: could not open hello64: {{[Nn]}}o such file or directory
+CHECK1: error: could not open 'hello64.obj': {{[Nn]}}o such file or directory
+CHECK2: error: could not open 'hello64': {{[Nn]}}o such file or directory
 CHECK3: error: undefined symbol: MessageBoxA
 CHECK3-NEXT: >>> referenced by {{.*}}hello64.obj:(main)
 
Index: test/COFF/responsefile.test
===
--- test/COFF/responsefile.test
+++ test/COFF/responsefile.test
@@ -12,14 +12,14 @@
 # RUN: echo "blah\foo" > %t.rsp
 # RUN: not lld-link @%t.rsp 2>&1 | \
 # RUN: FileCheck --check-prefix=DEFRSP %s
-DEFRSP: error: could not open blah\foo
+DEFRSP: error: could not open 'blah\foo'
 
 # RUN: echo "blah\foo" > %t.rsp
 # RUN: not lld-link --rsp-quoting=windows @%t.rsp 2>&1 | \
 # RUN: FileCheck --check-prefix=WINRSP %s
-WINRSP: error: could not open blah\foo
+WINRSP: error: could not open 'blah\foo'
 
 # RUN: echo "blah\foo" > %t.rsp
 # RUN: not lld-link --rsp-quoting=posix @%t.rsp 2>&1 | \
 # RUN: FileCheck --check-prefix=POSRSP %s
-POSRSP: error: could not open blahfoo
+POSRSP: error: could not open 'blahfoo'
Index: test/COFF/color-diagnostics.test
===
--- test/COFF/color-diagnostics.test
+++ test/COFF/color-diagnostics.test
@@ -7,7 +7,7 @@
 # RUN:   | FileCheck -check-prefix=COLOR %s
 
 # COLOR: {{lld-link: .\[0;1;35mwarning: .\[0mignoring unknown argument '-xyz'}}
-# COLOR: {{lld-link: .\[0;1;31merror: .\[0mcould not open /nosuchfile}}
+# COLOR: {{lld-link: .\[0;1;31merror: .\[0mcould not open '/nosuchfile'}}
 
 # RUN: not lld-link /nosuchfile 2>&1 | FileCheck -check-prefix=NOCOLOR %s
 # RUN: not lld-link -color-diagnostics=never /nosuchfile 2>&1 \
@@ -15,4 +15,4 @@
 # RUN: not lld-link -color-diagnostics=always -no-color-diagnostics \
 # RUN:   /nosuchfile 2>&1 | FileCheck -check-prefix=NOCOLOR %s
 
-# NOCOLOR: lld-link: error: could not open /nosuchfile
+# NOCOLOR: lld-link: error: could not open '/nosuchfile'
Index: test/COFF/could-not-open.test
===
--- test/COFF/could-not-open.test
+++ test/COFF/could-not-open.test
@@ -1,5 +1,5 @@
 RUN: not lld-link 01 2>&1 | FileCheck %s
 
-CHECK: could not open 01
+CHECK: could not open 

r361518 - lld-link, clang: Treat non-existent input files as possible spellos for option flags

2019-05-23 Thread Nico Weber via cfe-commits
Author: nico
Date: Thu May 23 10:58:33 2019
New Revision: 361518

URL: http://llvm.org/viewvc/llvm-project?rev=361518=rev
Log:
lld-link, clang: Treat non-existent input files as possible spellos for option 
flags

OptTable treats arguments starting with / that aren't a known option
as filenames. This means lld-link's and clang-cl's typo correction for
unknown flags didn't do spell checking for misspelled options that start
with /.

I first tried changing OptTable, but that got pretty messy, see PR41787
comments 2 and 3.

Instead, let lld-link's and clang's (including clang-cl's) "file not
found" diagnostic check if a non-existent file looks like it could be a
mis-spelled option, and if so add a "did you mean" suggestion to the
"file not found" diagnostic.

While here, make formatting of a few diagnostics a bit more
self-consistent.

Fixes PR41787.

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

Modified:
cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
cfe/trunk/include/clang/Driver/Driver.h
cfe/trunk/lib/Driver/Driver.cpp
cfe/trunk/test/Driver/unknown-arg.c
cfe/trunk/test/Driver/unsupported-option.c
cfe/trunk/test/Frontend/unknown-arg.c

Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=361518=361517=361518=diff
==
--- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Thu May 23 10:58:33 
2019
@@ -9,9 +9,11 @@
 let Component = "Driver" in {
 
 def err_drv_no_such_file : Error<"no such file or directory: '%0'">;
+def err_drv_no_such_file_with_suggestion : Error<
+  "no such file or directory: '%0'; did you mean '%1'?">;
 def err_drv_unsupported_opt : Error<"unsupported option '%0'">;
-def err_drv_unsupported_opt_with_suggestion
-  : Error<"unsupported option '%0', did you mean '%1'?">;
+def err_drv_unsupported_opt_with_suggestion : Error<
+  "unsupported option '%0'; did you mean '%1'?">;
 def err_drv_unsupported_opt_for_target : Error<
   "unsupported option '%0' for target '%1'">;
 def err_drv_unsupported_option_argument : Error<
@@ -166,13 +168,13 @@ def err_arch_unsupported_isa
 def err_drv_I_dash_not_supported : Error<
   "'%0' not supported, please use -iquote instead">;
 def err_drv_unknown_argument : Error<"unknown argument: '%0'">;
-def err_drv_unknown_argument_with_suggestion
-  : Error<"unknown argument '%0', did you mean '%1'?">;
+def err_drv_unknown_argument_with_suggestion : Error<
+  "unknown argument '%0'; did you mean '%1'?">;
 def warn_drv_unknown_argument_clang_cl : Warning<
   "unknown argument ignored in clang-cl: '%0'">,
   InGroup;
 def warn_drv_unknown_argument_clang_cl_with_suggestion : Warning<
-  "unknown argument ignored in clang-cl '%0' (did you mean '%1'?)">,
+  "unknown argument ignored in clang-cl '%0'; did you mean '%1'?">,
   InGroup;
 
 def warn_drv_ycyu_different_arg_clang_cl : Warning<

Modified: cfe/trunk/include/clang/Driver/Driver.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=361518=361517=361518=diff
==
--- cfe/trunk/include/clang/Driver/Driver.h (original)
+++ cfe/trunk/include/clang/Driver/Driver.h Thu May 23 10:58:33 2019
@@ -394,6 +394,14 @@ public:
   void BuildUniversalActions(Compilation , const ToolChain ,
  const InputList ) const;
 
+  /// Check that the file referenced by Value exists. If it doesn't,
+  /// issue a diagnostic and return false.
+  /// If TypoCorrect is true and the file does not exist, see if it looks
+  /// like a likely typo for a flag and if so print a "did you mean" blurb.
+  bool DiagnoseInputExistence(const llvm::opt::DerivedArgList ,
+  StringRef Value, types::ID Ty,
+  bool TypoCorrect) const;
+
   /// BuildJobs - Bind actions to concrete tools and translate
   /// arguments to form the list of jobs to run.
   ///

Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=361518=361517=361518=diff
==
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Thu May 23 10:58:33 2019
@@ -1975,11 +1975,9 @@ void Driver::BuildUniversalActions(Compi
   }
 }
 
-/// Check that the file referenced by Value exists. If it doesn't,
-/// issue a diagnostic and return false.
-static bool DiagnoseInputExistence(const Driver , const DerivedArgList ,
-   StringRef Value, types::ID Ty) {
-  if (!D.getCheckInputsExist())
+bool Driver::DiagnoseInputExistence(const DerivedArgList , StringRef 
Value,
+types::ID Ty, bool 

[PATCH] D62276: lld-link, clang: Treat non-existent input files as possible spellos for option flags

2019-05-23 Thread Reid Kleckner via Phabricator via cfe-commits
rnk accepted this revision.
rnk added a comment.

Thanks, this has been a longstanding issue!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62276/new/

https://reviews.llvm.org/D62276



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


[PATCH] D62276: lld-link, clang: Treat non-existent input files as possible spellos for option flags

2019-05-23 Thread Nico Weber via Phabricator via cfe-commits
thakis marked 5 inline comments as done.
thakis added a comment.

Thanks! Landing with comments addressed.




Comment at: clang/include/clang/Basic/DiagnosticDriverKinds.td:177
 def warn_drv_unknown_argument_clang_cl_with_suggestion : Warning<
-  "unknown argument ignored in clang-cl '%0' (did you mean '%1'?)">,
+  "unknown argument ignored in clang-cl '%0', did you mean '%1'?">,
   InGroup;

hans wrote:
> (grammar nit: I think this is a comma splice 
> (https://en.wikipedia.org/wiki/Comma_splice)  so I believe a semicolon would 
> be better. On the other hand, we seem to do this a lot already and I'm not a 
> native speaker so maybe it's fine.)
Looking through `rg 'did you mean' clang/include/clang/Basic/` we're actually 
pretty consistent about using a semicolon everywhere except for this file, so 
changed to ;. Thanks!



Comment at: clang/include/clang/Driver/Driver.h:398
+  /// Check that the file referenced by Value exists. If it doesn't,
+  /// issue a diagnostic and return false.
+  bool DiagnoseInputExistence(const llvm::opt::DerivedArgList ,

hans wrote:
> Should the comment say what TypoCorrect does?
Sure, added.



Comment at: lld/COFF/Driver.cpp:218
+  else
+error(Error + "; did you mean '" + Nearest + "'");
+} else

hans wrote:
> I like the semicolon better, but it seems we use comma in other places?
This is a semicolon because lld-link includes the strerror output 
(`.second.message()`), so this looks like `could not open 'foo': No such file; 
did you mean '/foo'`. Without the semicolon it looks like the "did you mean" is 
part of the error message.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62276/new/

https://reviews.llvm.org/D62276



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


[PATCH] D61774: [LibTooling] Add RangeSelector library for defining source ranges based on bound AST nodes.

2019-05-23 Thread Petr Penzin via Phabricator via cfe-commits
penzn marked an inline comment as done.
penzn added inline comments.



Comment at: cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp:229
+RangeSelector tooling::statements(StringRef ID) {
+  return RelativeSelector(ID);
+}

penzn wrote:
> Sorry for posting here, haven't gotten my bugzilla access yet (requested 
> though).
> 
> This breaks with Visual Studio 2017 (15.7.6):
> 
> RangeSelector.cpp(229): error C2971: 
> '`anonymous-namespace'::RelativeSelector': template parameter 'Func': 
> 'getStatementsRange': a variable with non-static storage duration cannot be 
> used as a non-type argument
Fixed in https://reviews.llvm.org/D62202


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61774/new/

https://reviews.llvm.org/D61774



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


[PATCH] D62156: [Sema] Diagnose addr space mismatch while constructing objects

2019-05-23 Thread Anastasia Stulova via Phabricator via cfe-commits
Anastasia updated this revision to Diff 201011.
Anastasia added a comment.

- Switched back to loop over all method qualifiers
- Moved addr space check into `AddOverloadCandidate`


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62156/new/

https://reviews.llvm.org/D62156

Files:
  include/clang/Sema/Overload.h
  lib/Sema/SemaDeclCXX.cpp
  lib/Sema/SemaInit.cpp
  lib/Sema/SemaOverload.cpp
  test/CodeGenCXX/address-space-of-this.cpp
  test/CodeGenOpenCLCXX/addrspace-ctor.cl
  test/SemaCXX/address-space-ctor.cpp

Index: test/SemaCXX/address-space-ctor.cpp
===
--- /dev/null
+++ test/SemaCXX/address-space-ctor.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 %s -std=c++14 -triple=spir -verify -fsyntax-only
+// RUN: %clang_cc1 %s -std=c++17 -triple=spir -verify -fsyntax-only
+
+struct MyType {
+  MyType(int i) : i(i) {}
+  int i;
+};
+
+// FIXME: We can't implicitly convert between address spaces yet.
+MyType __attribute__((address_space(10))) m1 = 123; //expected-error{{no viable conversion from 'int' to '__attribute__((address_space(10))) MyType'}}
+MyType __attribute__((address_space(10))) m2(123);  //expected-error{{no matching constructor for initialization of '__attribute__((address_space(10))) MyType'}}
Index: test/CodeGenOpenCLCXX/addrspace-ctor.cl
===
--- /dev/null
+++ test/CodeGenOpenCLCXX/addrspace-ctor.cl
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=c++ -emit-llvm -O0 -o - | FileCheck %s
+
+struct MyType {
+  MyType(int i) : i(i) {}
+  MyType(int i) __constant : i(i) {}
+  int i;
+  void bar();
+};
+
+//CHECK: call void @_ZNU3AS26MyTypeC1Ei(%struct.MyType addrspace(2)* @const1, i32 1)
+__constant MyType const1 = 1;
+//CHECK: call void @_ZNU3AS26MyTypeC1Ei(%struct.MyType addrspace(2)* @const2, i32 2)
+__constant MyType const2(2);
+//CHECK: call void @_ZNU3AS46MyTypeC1Ei(%struct.MyType addrspace(4)* addrspacecast (%struct.MyType addrspace(1)* @glob to %struct.MyType addrspace(4)*), i32 1)
+MyType glob(1);
Index: test/CodeGenCXX/address-space-of-this.cpp
===
--- test/CodeGenCXX/address-space-of-this.cpp
+++ test/CodeGenCXX/address-space-of-this.cpp
@@ -1,8 +1,11 @@
 // RUN: %clang_cc1 %s -std=c++14 -triple=spir -emit-llvm -o - | FileCheck %s
 // RUN: %clang_cc1 %s -std=c++17 -triple=spir -emit-llvm -o - | FileCheck %s
+// XFAIL: *
 
+// FIXME: We can't compile address space method qualifiers yet.
+// Therefore there is no way to check correctness of this code.
 struct MyType {
-  MyType(int i) : i(i) {}
+  MyType(int i) __attribute__((address_space(10))) : i(i) {}
   int i;
 };
 //CHECK: call void @_ZN6MyTypeC1Ei(%struct.MyType* addrspacecast (%struct.MyType addrspace(10)* @m to %struct.MyType*), i32 123)
Index: lib/Sema/SemaOverload.cpp
===
--- lib/Sema/SemaOverload.cpp
+++ lib/Sema/SemaOverload.cpp
@@ -6029,8 +6029,13 @@
   //   A defaulted move constructor that is defined as deleted is ignored by
   //   overload resolution.
   CXXConstructorDecl *Constructor = dyn_cast(Function);
-  if (Constructor && Constructor->isDefaulted() && Constructor->isDeleted() &&
-  Constructor->isMoveConstructor())
+  if (Constructor && ((Constructor->isDefaulted() && Constructor->isDeleted() &&
+   Constructor->isMoveConstructor()) ||
+  // Check that addr space of an object being constructed is
+  // convertible to the one ctor qualified with.
+  !Qualifiers::isAddressSpaceSupersetOf(
+  Constructor->getMethodQualifiers().getAddressSpace(),
+  CandidateSet.getDestAS(
 return;
 
   // Overload resolution is always an unevaluated context.
Index: lib/Sema/SemaInit.cpp
===
--- lib/Sema/SemaInit.cpp
+++ lib/Sema/SemaInit.cpp
@@ -3897,6 +3897,7 @@
   // Build the candidate set directly in the initialization sequence
   // structure, so that it will persist if we fail.
   OverloadCandidateSet  = Sequence.getFailedCandidateSet();
+  CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
 
   // Determine whether we are allowed to call explicit constructors or
   // explicit conversion operators.
@@ -4989,6 +4990,7 @@
   // structure, so that it will persist if we fail.
   OverloadCandidateSet  = Sequence.getFailedCandidateSet();
   CandidateSet.clear(OverloadCandidateSet::CSK_InitByUserDefinedConversion);
+  CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
 
   // Determine whether we are allowed to call explicit constructors or
   // explicit conversion operators.
Index: lib/Sema/SemaDeclCXX.cpp
===
--- lib/Sema/SemaDeclCXX.cpp
+++ 

[PATCH] D59253: [AIX][libcxx] AIX system headers need stdint.h and inttypes.h to be re-enterable when macro _STD_TYPES_T is defined

2019-05-23 Thread Hubert Tong via Phabricator via cfe-commits
hubert.reinterpretcast added inline comments.



Comment at: libcxx/include/stdint.h:16
+#endif // _STD_TYPES_T
 
 /*

mclow.lists wrote:
> I don't think that this will do what you want it to.
> Is this a supported use case?
> 
> ```
> #include 
> #define _STD_TYPES_T
> #include 
> ```
> 
> 
The comment is perhaps not clear. We need `` to be re-enterable only 
as long as all previous inclusions have occurred while `_STD_TYPES_T` is 
defined. The effect of including `` without defining `_STD_TYPES_T` 
is a strict superset of the effects of including `` in other 
circumstances. Should we adjust the comment?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59253/new/

https://reviews.llvm.org/D59253



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


[PATCH] D62279: Use LTO capable linker

2019-05-23 Thread Chris Bieneman via Phabricator via cfe-commits
beanz added a comment.

In D62279#1514046 , @winksaville wrote:

> I've add gtest_main and gtest to  CLANG_BOOTSTRAP_TARGETS as a guess, because 
> that's where check-all is defined:
>  ...
>  My guess is likely wrong, what do you advise?


Are you still having that issue after rL361436 
? That should have resolved that problem. 
The issue isn't that gtest is missing from the bootstrap, but rather that it 
was missing from the dependencies for the runtime libraries.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62279/new/

https://reviews.llvm.org/D62279



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


[PATCH] D61809: [BPF] Preserve debuginfo array/union/struct type/access index

2019-05-23 Thread Roman Lebedev via Phabricator via cfe-commits
lebedev.ri resigned from this revision.
lebedev.ri added a comment.

Don't think i will be of any help here.




Comment at: test/CodeGen/bpf-offsetreloc.c:2-4
+// RUN: grep "llvm.preserve.struct.access.index" %t1
+// RUN: grep "llvm.preserve.array.access.index" %t1
+// RUN: grep "llvm.preserve.union.access.index" %t1

This looks like a bad test.
Can't you use FileCheck?
I'd think there is more to test than a single tiny test..


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61809/new/

https://reviews.llvm.org/D61809



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


[PATCH] D62047: [WebAssembly] Add multivalue and tail-call target features

2019-05-23 Thread Thomas Lively via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361516: [WebAssembly] Add multivalue and tail-call target 
features (authored by tlively, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D62047?vs=199941=201010#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62047/new/

https://reviews.llvm.org/D62047

Files:
  cfe/trunk/include/clang/Driver/Options.td
  cfe/trunk/lib/Basic/Targets/WebAssembly.cpp
  cfe/trunk/lib/Basic/Targets/WebAssembly.h
  cfe/trunk/test/Preprocessor/wasm-target-features.c
  llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
  llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
  llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
  llvm/trunk/test/CodeGen/WebAssembly/multivalue.ll
  llvm/trunk/test/CodeGen/WebAssembly/tailcall.ll

Index: llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
===
--- llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
+++ llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
@@ -33,6 +33,7 @@
 
 def FeatureAtomics : SubtargetFeature<"atomics", "HasAtomics", "true",
   "Enable Atomics">;
+
 def FeatureNontrappingFPToInt :
   SubtargetFeature<"nontrapping-fptoint",
"HasNontrappingFPToInt", "true",
@@ -43,6 +44,11 @@
"HasSignExt", "true",
"Enable sign extension operators">;
 
+def FeatureTailCall :
+  SubtargetFeature<"tail-call",
+   "HasTailCall", "true",
+   "Enable tail call instructions">;
+
 def FeatureExceptionHandling :
   SubtargetFeature<"exception-handling", "HasExceptionHandling", "true",
"Enable Wasm exception handling">;
@@ -51,6 +57,11 @@
   SubtargetFeature<"bulk-memory", "HasBulkMemory", "true",
"Enable bulk memory operations">;
 
+def FeatureMultivalue :
+  SubtargetFeature<"multivalue",
+   "HasMultivalue", "true",
+   "Enable multivalue blocks, instructions, and functions">;
+
 def FeatureMutableGlobals :
   SubtargetFeature<"mutable-globals", "HasMutableGlobals", "true",
"Enable mutable globals">;
Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
===
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
@@ -34,6 +34,10 @@
 Predicate<"Subtarget->hasAtomics()">,
 AssemblerPredicate<"FeatureAtomics", "atomics">;
 
+def HasMultivalue :
+Predicate<"Subtarget->hasMultivalue()">,
+AssemblerPredicate<"FeatureMultivalue", "multivalue">;
+
 def HasNontrappingFPToInt :
 Predicate<"Subtarget->hasNontrappingFPToInt()">,
 AssemblerPredicate<"FeatureNontrappingFPToInt", "nontrapping-fptoint">;
@@ -46,18 +50,14 @@
 Predicate<"Subtarget->hasSignExt()">,
 AssemblerPredicate<"FeatureSignExt", "sign-ext">;
 
-def NotHasSignExt :
-Predicate<"!Subtarget->hasSignExt()">,
-AssemblerPredicate<"!FeatureSignExt", "sign-ext">;
+def HasTailCall :
+Predicate<"Subtarget->hasTailCall()">,
+AssemblerPredicate<"FeatureTailCall", "tail-call">;
 
 def HasExceptionHandling :
 Predicate<"Subtarget->hasExceptionHandling()">,
 AssemblerPredicate<"FeatureExceptionHandling", "exception-handling">;
 
-def NotHasExceptionHandling :
-Predicate<"!Subtarget->hasExceptionHandling()">,
-AssemblerPredicate<"!FeatureExceptionHandling", "exception-handling">;
-
 def HasBulkMemory :
 Predicate<"Subtarget->hasBulkMemory()">,
 AssemblerPredicate<"FeatureBulkMemory", "bulk-memory">;
Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
===
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
@@ -44,7 +44,9 @@
   bool HasSignExt = false;
   bool HasExceptionHandling = false;
   bool HasBulkMemory = false;
+  bool HasMultivalue = false;
   bool HasMutableGlobals = false;
+  bool HasTailCall = false;
 
   /// String name of used CPU.
   std::string CPUString;
@@ -98,7 +100,9 @@
   bool hasSignExt() const { return HasSignExt; }
   bool hasExceptionHandling() const { return HasExceptionHandling; }
   bool hasBulkMemory() const { return HasBulkMemory; }
+  bool hasMultivalue() const { return HasMultivalue; }
   bool hasMutableGlobals() const { return HasMutableGlobals; }
+  bool hasTailCall() const { return HasTailCall; }
 
   /// Parses features string setting specified subtarget options. Definition of
   /// function is auto generated by tblgen.
Index: llvm/trunk/test/CodeGen/WebAssembly/tailcall.ll
===
--- 

r361516 - [WebAssembly] Add multivalue and tail-call target features

2019-05-23 Thread Thomas Lively via cfe-commits
Author: tlively
Date: Thu May 23 10:26:47 2019
New Revision: 361516

URL: http://llvm.org/viewvc/llvm-project?rev=361516=rev
Log:
[WebAssembly] Add multivalue and tail-call target features

Summary:
These features will both be implemented soon, so I thought I would
save time by adding the boilerplate for both of them at the same time.

Reviewers: aheejin

Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, 
cfe-commits, llvm-commits

Tags: #clang, #llvm

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

Modified:
cfe/trunk/include/clang/Driver/Options.td
cfe/trunk/lib/Basic/Targets/WebAssembly.cpp
cfe/trunk/lib/Basic/Targets/WebAssembly.h
cfe/trunk/test/Preprocessor/wasm-target-features.c

Modified: cfe/trunk/include/clang/Driver/Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=361516=361515=361516=diff
==
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Thu May 23 10:26:47 2019
@@ -2185,6 +2185,10 @@ def mbulk_memory : Flag<["-"], "mbulk-me
 def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, 
Group;
 def mmutable_globals : Flag<["-"], "mmutable-globals">, 
Group;
 def mno_mutable_globals : Flag<["-"], "mno-mutable-globals">, 
Group;
+def mmultivalue : Flag<["-"], "mmultivalue">, Group;
+def mno_multivalue : Flag<["-"], "mno-multivalue">, 
Group;
+def mtail_call : Flag<["-"], "mtail-call">, Group;
+def mno_tail_call : Flag<["-"], "mno-tail-call">, Group;
 
 def mamdgpu_debugger_abi : Joined<["-"], "mamdgpu-debugger-abi=">,
   Flags<[HelpHidden]>,

Modified: cfe/trunk/lib/Basic/Targets/WebAssembly.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/WebAssembly.cpp?rev=361516=361515=361516=diff
==
--- cfe/trunk/lib/Basic/Targets/WebAssembly.cpp (original)
+++ cfe/trunk/lib/Basic/Targets/WebAssembly.cpp Thu May 23 10:26:47 2019
@@ -43,6 +43,8 @@ bool WebAssemblyTargetInfo::hasFeature(S
   .Case("bulk-memory", HasBulkMemory)
   .Case("atomics", HasAtomics)
   .Case("mutable-globals", HasMutableGlobals)
+  .Case("multivalue", HasMultivalue)
+  .Case("tail-call", HasTailCall)
   .Default(false);
 }
 
@@ -74,6 +76,10 @@ void WebAssemblyTargetInfo::getTargetDef
 Builder.defineMacro("__wasm_atomics__");
   if (HasMutableGlobals)
 Builder.defineMacro("__wasm_mutable_globals__");
+  if (HasMultivalue)
+Builder.defineMacro("__wasm_multivalue__");
+  if (HasTailCall)
+Builder.defineMacro("__wasm_tail_call__");
 }
 
 void WebAssemblyTargetInfo::setSIMDLevel(llvm::StringMap ,
@@ -116,6 +122,10 @@ bool WebAssemblyTargetInfo::initFeatureM
 Features["atomics"] = true;
   if (HasMutableGlobals)
 Features["mutable-globals"] = true;
+  if (HasMultivalue)
+Features["multivalue"] = true;
+  if (HasTailCall)
+Features["tail-call"] = true;
 
   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
 }
@@ -187,6 +197,22 @@ bool WebAssemblyTargetInfo::handleTarget
   HasMutableGlobals = false;
   continue;
 }
+if (Feature == "+multivalue") {
+  HasMultivalue = true;
+  continue;
+}
+if (Feature == "-multivalue") {
+  HasMultivalue = false;
+  continue;
+}
+if (Feature == "+tail-call") {
+  HasTailCall = true;
+  continue;
+}
+if (Feature == "-tail-call") {
+  HasTailCall = false;
+  continue;
+}
 
 Diags.Report(diag::err_opt_not_valid_with_opt)
 << Feature << "-target-feature";

Modified: cfe/trunk/lib/Basic/Targets/WebAssembly.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/WebAssembly.h?rev=361516=361515=361516=diff
==
--- cfe/trunk/lib/Basic/Targets/WebAssembly.h (original)
+++ cfe/trunk/lib/Basic/Targets/WebAssembly.h Thu May 23 10:26:47 2019
@@ -36,6 +36,8 @@ class LLVM_LIBRARY_VISIBILITY WebAssembl
   bool HasBulkMemory = false;
   bool HasAtomics = false;
   bool HasMutableGlobals = false;
+  bool HasMultivalue = false;
+  bool HasTailCall = false;
 
 public:
   explicit WebAssemblyTargetInfo(const llvm::Triple , const TargetOptions &)

Modified: cfe/trunk/test/Preprocessor/wasm-target-features.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/wasm-target-features.c?rev=361516=361515=361516=diff
==
--- cfe/trunk/test/Preprocessor/wasm-target-features.c (original)
+++ cfe/trunk/test/Preprocessor/wasm-target-features.c Thu May 23 10:26:47 2019
@@ -80,6 +80,24 @@
 // MUTABLE-GLOBALS:#define __wasm_mutable_globals__ 1{{$}}
 
 // RUN: %clang -E -dM %s -o - 2>&1 \
+// RUN: -target wasm32-unknown-unknown -mmultivalue \
+// RUN:   | FileCheck %s 

[PATCH] D62312: [ASTImporter] Added visibility context check for CXXRecordDecl.

2019-05-23 Thread Shafik Yaghmour via Phabricator via cfe-commits
shafik accepted this revision.
shafik added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62312/new/

https://reviews.llvm.org/D62312



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


[PATCH] D62328: [LibTooling] Fix dangling references in RangeSelector.

2019-05-23 Thread Yitzhak Mandelbaum via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361514: [LibTooling] Fix dangling references in 
RangeSelector. (authored by ymandel, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D62328?vs=200994=201008#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62328/new/

https://reviews.llvm.org/D62328

Files:
  cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
  cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp

Index: cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
===
--- cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
+++ cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
@@ -17,9 +17,9 @@
 
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Error.h"
 #include 
+#include 
 
 namespace clang {
 namespace tooling {
@@ -35,19 +35,19 @@
 RangeSelector range(RangeSelector Begin, RangeSelector End);
 
 /// Convenience version of \c range where end-points are bound nodes.
-RangeSelector range(StringRef BeginID, StringRef EndID);
+RangeSelector range(std::string BeginID, std::string EndID);
 
 /// Selects a node, including trailing semicolon (for non-expression
 /// statements). \p ID is the node's binding in the match result.
-RangeSelector node(StringRef ID);
+RangeSelector node(std::string ID);
 
 /// Selects a node, including trailing semicolon (always). Useful for selecting
 /// expression statements. \p ID is the node's binding in the match result.
-RangeSelector statement(StringRef ID);
+RangeSelector statement(std::string ID);
 
 /// Given a \c MemberExpr, selects the member token. \p ID is the node's
 /// binding in the match result.
-RangeSelector member(StringRef ID);
+RangeSelector member(std::string ID);
 
 /// Given a node with a "name", (like \c NamedDecl, \c DeclRefExpr or \c
 /// CxxCtorInitializer) selects the name's token.  Only selects the final
@@ -56,19 +56,19 @@
 /// it selects only `baz`.
 ///
 /// \param ID is the node's binding in the match result.
-RangeSelector name(StringRef ID);
+RangeSelector name(std::string ID);
 
 // Given a \c CallExpr (bound to \p ID), selects the arguments' source text (all
 // source between the call's parentheses).
-RangeSelector callArgs(StringRef ID);
+RangeSelector callArgs(std::string ID);
 
 // Given a \c CompoundStmt (bound to \p ID), selects the source of the
 // statements (all source between the braces).
-RangeSelector statements(StringRef ID);
+RangeSelector statements(std::string ID);
 
 // Given a \c InitListExpr (bound to \p ID), selects the range of the elements
 // (all source between the braces).
-RangeSelector initListElements(StringRef ID);
+RangeSelector initListElements(std::string ID);
 
 /// Selects the range from which `S` was expanded (possibly along with other
 /// source), if `S` is an expansion, and `S` itself, otherwise.  Corresponds to
Index: cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp
===
--- cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp
+++ cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp
@@ -104,7 +104,7 @@
   return findPreviousTokenKind(EndLoc, SM, LangOpts, tok::TokenKind::l_paren);
 }
 
-RangeSelector tooling::node(StringRef ID) {
+RangeSelector tooling::node(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -115,7 +115,7 @@
   };
 }
 
-RangeSelector tooling::statement(StringRef ID) {
+RangeSelector tooling::statement(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -143,11 +143,11 @@
   };
 }
 
-RangeSelector tooling::range(StringRef BeginID, StringRef EndID) {
-  return tooling::range(node(BeginID), node(EndID));
+RangeSelector tooling::range(std::string BeginID, std::string EndID) {
+  return tooling::range(node(std::move(BeginID)), node(std::move(EndID)));
 }
 
-RangeSelector tooling::member(StringRef ID) {
+RangeSelector tooling::member(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -159,7 +159,7 @@
   };
 }
 
-RangeSelector tooling::name(StringRef ID) {
+RangeSelector tooling::name(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected N = getNode(Result.Nodes, ID);
 if (!N)
@@ -205,7 +205,7 @@
   std::string ID;
 
 public:
-  RelativeSelector(StringRef ID) : ID(ID) {}
+  RelativeSelector(std::string ID) : ID(std::move(ID)) {}
 
   Expected operator()(const MatchResult ) {
 Expected N = getNode(Result.Nodes, ID);
@@ -231,8 +231,8 @@
 }
 } // namespace
 
-RangeSelector 

[PATCH] D62167: CodeView - add static data members to global variable debug info.

2019-05-23 Thread Amy Huang via Phabricator via cfe-commits
akhuang marked an inline comment as done.
akhuang added inline comments.



Comment at: clang/lib/CodeGen/CGDebugInfo.cpp:4385
+// Use the global scope for static members.
+DContext = getContextDescriptor(
+   cast(CGM.getContext().getTranslationUnitDecl()), TheCU);

dblaikie wrote:
> akhuang wrote:
> > @dblaikie I'm using the global scope here because if the class type is used 
> > as the scope it runs into the [[ 
> > https://github.com/llvm/llvm-project/blob/a2ee80b084e5c0b20364ed4379384706f5e059b1/llvm/lib/IR/DIBuilder.cpp#L630
> >  | assert message ]] `Context of a global variable should not be a type 
> > with identifier`. Is there a reason for the assert? 
> I think it's generally how LLVM handles definitions for the most part - 
> putting them at the global scope.
> 
> Though I'm confused by this patch - it has a source change in clang, but a 
> test in LLVM. Generally there should be testing to cover where the source 
> change is, I think?
yep, there should be a test for this - added now. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62167/new/

https://reviews.llvm.org/D62167



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


r361514 - [LibTooling] Fix dangling references in RangeSelector.

2019-05-23 Thread Yitzhak Mandelbaum via cfe-commits
Author: ymandel
Date: Thu May 23 10:11:33 2019
New Revision: 361514

URL: http://llvm.org/viewvc/llvm-project?rev=361514=rev
Log:
[LibTooling] Fix dangling references in RangeSelector.

Summary:
RangeSelector had a number of cases of capturing a StringRef in a lambda, which
lead to dangling references. This change converts all uses in the API of
`StringRef` to `std::string` to avoid this problem. `std::string` in the API is
a reasonable choice, because the combinators are always storing the string
beyond the life of the combinator construction.

Reviewers: ilya-biryukov, gribozavr

Subscribers: cfe-commits

Tags: #clang

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

Modified:
cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp

Modified: cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h?rev=361514=361513=361514=diff
==
--- cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h (original)
+++ cfe/trunk/include/clang/Tooling/Refactoring/RangeSelector.h Thu May 23 
10:11:33 2019
@@ -17,9 +17,9 @@
 
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Error.h"
 #include 
+#include 
 
 namespace clang {
 namespace tooling {
@@ -35,19 +35,19 @@ inline RangeSelector charRange(CharSourc
 RangeSelector range(RangeSelector Begin, RangeSelector End);
 
 /// Convenience version of \c range where end-points are bound nodes.
-RangeSelector range(StringRef BeginID, StringRef EndID);
+RangeSelector range(std::string BeginID, std::string EndID);
 
 /// Selects a node, including trailing semicolon (for non-expression
 /// statements). \p ID is the node's binding in the match result.
-RangeSelector node(StringRef ID);
+RangeSelector node(std::string ID);
 
 /// Selects a node, including trailing semicolon (always). Useful for selecting
 /// expression statements. \p ID is the node's binding in the match result.
-RangeSelector statement(StringRef ID);
+RangeSelector statement(std::string ID);
 
 /// Given a \c MemberExpr, selects the member token. \p ID is the node's
 /// binding in the match result.
-RangeSelector member(StringRef ID);
+RangeSelector member(std::string ID);
 
 /// Given a node with a "name", (like \c NamedDecl, \c DeclRefExpr or \c
 /// CxxCtorInitializer) selects the name's token.  Only selects the final
@@ -56,19 +56,19 @@ RangeSelector member(StringRef ID);
 /// it selects only `baz`.
 ///
 /// \param ID is the node's binding in the match result.
-RangeSelector name(StringRef ID);
+RangeSelector name(std::string ID);
 
 // Given a \c CallExpr (bound to \p ID), selects the arguments' source text 
(all
 // source between the call's parentheses).
-RangeSelector callArgs(StringRef ID);
+RangeSelector callArgs(std::string ID);
 
 // Given a \c CompoundStmt (bound to \p ID), selects the source of the
 // statements (all source between the braces).
-RangeSelector statements(StringRef ID);
+RangeSelector statements(std::string ID);
 
 // Given a \c InitListExpr (bound to \p ID), selects the range of the elements
 // (all source between the braces).
-RangeSelector initListElements(StringRef ID);
+RangeSelector initListElements(std::string ID);
 
 /// Selects the range from which `S` was expanded (possibly along with other
 /// source), if `S` is an expansion, and `S` itself, otherwise.  Corresponds to

Modified: cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp?rev=361514=361513=361514=diff
==
--- cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp (original)
+++ cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp Thu May 23 10:11:33 2019
@@ -104,7 +104,7 @@ static SourceLocation findOpenParen(cons
   return findPreviousTokenKind(EndLoc, SM, LangOpts, tok::TokenKind::l_paren);
 }
 
-RangeSelector tooling::node(StringRef ID) {
+RangeSelector tooling::node(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -115,7 +115,7 @@ RangeSelector tooling::node(StringRef ID
   };
 }
 
-RangeSelector tooling::statement(StringRef ID) {
+RangeSelector tooling::statement(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -143,11 +143,11 @@ RangeSelector tooling::range(RangeSelect
   };
 }
 
-RangeSelector tooling::range(StringRef BeginID, StringRef EndID) {
-  return tooling::range(node(BeginID), node(EndID));
+RangeSelector tooling::range(std::string BeginID, std::string EndID) {
+  return tooling::range(node(std::move(BeginID)), 

[PATCH] D62167: CodeView - add static data members to global variable debug info.

2019-05-23 Thread Amy Huang via Phabricator via cfe-commits
akhuang updated this revision to Diff 201004.
akhuang added a comment.

Add llvm IR test.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62167/new/

https://reviews.llvm.org/D62167

Files:
  clang/lib/CodeGen/CGDebugInfo.cpp
  clang/test/CodeGenCXX/debug-info-static-member.cpp
  llvm/test/DebugInfo/COFF/global-constants.ll

Index: llvm/test/DebugInfo/COFF/global-constants.ll
===
--- llvm/test/DebugInfo/COFF/global-constants.ll
+++ llvm/test/DebugInfo/COFF/global-constants.ll
@@ -3,18 +3,25 @@
 
 ; C++ source to regenerate:
 ; const int Test1 = 1;
+; struct Foo { static const int Test2 = 2; };
 ; int main() {
-;   return Test1;
+;   return Test1 + Foo::Test2;
 ; }
 ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
 
-; ASM-LABEL:  .long 241  # Symbol subsection for globals
+; ASM-LABEL:  .long 241 # Symbol subsection for globals
 
-; ASM:.short {{.*-.*}}   # Record length
-; ASM:.short 4359# Record kind: S_CONSTANT
-; ASM-NEXT:   .long 4099 # Type
-; ASM-NEXT:   .byte 0x01, 0x00   # Value
-; ASM-NEXT:   .asciz "Test1" # Name
+; ASM:.short {{.*-.*}}  # Record length
+; ASM:.short 4359   # Record kind: S_CONSTANT
+; ASM-NEXT:   .long 4099# Type
+; ASM-NEXT:   .byte 0x01, 0x00  # Value
+; ASM-NEXT:   .asciz "Test1"# Name
+
+; ASM:.short {{.*-.*}}  # Record length
+; ASM:.short 4359   # Record kind: S_CONSTANT
+; ASM:.long 4099# Type
+; ASM:.byte 0x02, 0x00  # Value
+; ASM:.asciz "Test2"# Name
 
 ; OBJ:CodeViewDebugInfo [
 ; OBJ:  Section: .debug$S
@@ -27,6 +34,12 @@
 ; OBJ-NEXT: Value: 1
 ; OBJ-NEXT: Name: Test1
 ; OBJ-NEXT:   }
+; OBJ:ConstantSym {
+; OBJ-NEXT: Kind: S_CONSTANT (0x1107)
+; OBJ-NEXT: Type: const int (0x1003)
+; OBJ-NEXT: Value: 2
+; OBJ-NEXT: Name: Test2
+; OBJ-NEXT:   }
 
 ; ModuleID = 't.cpp'
 source_filename = "t.cpp"
@@ -34,31 +47,39 @@
 target triple = "x86_64-pc-windows-msvc"
 
 ; Function Attrs: noinline norecurse nounwind optnone
-define dso_local i32 @main() #0 !dbg !13 {
+define dso_local i32 @main() #0 !dbg !19 {
 entry:
   %retval = alloca i32, align 4
   store i32 0, i32* %retval, align 4
-  ret i32 1, !dbg !16
+  ret i32 3, !dbg !22
 }
 
+attributes #0 = { noinline norecurse nounwind optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
 !llvm.dbg.cu = !{!0}
-!llvm.module.flags = !{!9, !10, !11}
-!llvm.ident = !{!12}
+!llvm.module.flags = !{!15, !16, !17}
+!llvm.ident = !{!18}
 
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 9.0.0 (https://github.com/llvm/llvm-project.git 4a1902b6739e3087a03c0ac7ab85b640764e9335)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, nameTableKind: None)
-!1 = !DIFile(filename: "", directory: "C:\5Csrc\5Ctest", checksumkind: CSK_MD5, checksum: "0d5ef00bdd80bdb409a3deac9938f20d")
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 9.0.0 (https://github.com/llvm/llvm-project.git 2b66a49044196d8b90d95d7d3b5246ccbe3abc05)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, globals: !10, nameTableKind: None)
+!1 = !DIFile(filename: "", directory: "C:\5Csrc\5Ctest", checksumkind: CSK_MD5, checksum: "77cff5e1c7b260440ed03b23c18809c3")
 !2 = !{}
 !3 = !{!4}
-!4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression(DW_OP_constu, 1, DW_OP_stack_value))
-!5 = distinct !DIGlobalVariable(name: "Test1", scope: !0, file: !6, line: 1, type: !7, isLocal: true, isDefinition: true)
-!6 = !DIFile(filename: "t.cpp", directory: "C:\5Csrc\5Ctest", checksumkind: CSK_MD5, checksum: "0d5ef00bdd80bdb409a3deac9938f20d")
-!7 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !8)
-!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-!9 = !{i32 2, !"CodeView", i32 1}
-!10 = !{i32 2, !"Debug Info Version", i32 3}
-!11 = !{i32 1, !"wchar_size", i32 2}
-!12 = !{!"clang version 9.0.0 (https://github.com/llvm/llvm-project.git 4a1902b6739e3087a03c0ac7ab85b640764e9335)"}
-!13 = distinct !DISubprogram(name: "main", scope: !6, file: !6, line: 3, type: !14, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
-!14 = !DISubroutineType(types: !15)
-!15 = !{!8}
-!16 = 

[PATCH] D62215: Fixes to distribution example for X86_64 Arch Linux

2019-05-23 Thread Chris Bieneman via Phabricator via cfe-commits
beanz added a comment.

In D62215#1512849 , @winksaville wrote:

> IIRC, on linux if LTO is ON I had to use `ld.gold` for both stage 1 and 2, 
> although that maybe
>  just the way it ended up and it wasn't necessary. But I'll test whatever you 
> come up with.


I will try and spin up a VM today to try and test this on Linux using GNU ld 
for the stage 1. I don't usually do much work on Linux, but when I do I always 
setup `lld` as my system linker because it is way more efficient both in speed 
and memory usage. I don't think I've ever managed to get GNU ld to link a 
non-debug build of LLVM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62215/new/

https://reviews.llvm.org/D62215



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


[PATCH] D59253: [AIX][libcxx] AIX system headers need stdint.h and inttypes.h to be re-enterable when macro _STD_TYPES_T is defined

2019-05-23 Thread Marshall Clow via Phabricator via cfe-commits
mclow.lists added inline comments.



Comment at: libcxx/include/stdint.h:16
+#endif // _STD_TYPES_T
 
 /*

I don't think that this will do what you want it to.
Is this a supported use case?

```
#include 
#define _STD_TYPES_T
#include 
```




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59253/new/

https://reviews.llvm.org/D59253



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


Re: [PATCH] D61774: [LibTooling] Add RangeSelector library for defining source ranges based on bound AST nodes.

2019-05-23 Thread Ilya Biryukov via cfe-commits
Either way looks good.
If we go with function_ref, we should definitely store a comment why
storing function_ref is fine there. Or use a function pointer to make it
even clearer that nothing cheesy is going on there.

On Thu, May 23, 2019 at 5:28 PM Yitzhak Mandelbaum 
wrote:

> Actually, someone already committed a fix: https://reviews.llvm.org/D62202
>
> I can still make this change if it seems worthwhile, but its not strictly
> necessary at this point.
>
> On Thu, May 23, 2019 at 11:14 AM Yitzhak Mandelbaum 
> wrote:
>
>> Given that we'll need to store the function reference, is
>> llvm::function_ref still the way to go? The comments seem to warn away from
>> storing function_refs.
>>
>> On Thu, May 23, 2019 at 11:06 AM Yitzhak Mandelbaum 
>> wrote:
>>
>>> Sounds good. I'll send a fix shortly. Found another bug too (captured a
>>> StringRef in a lambda) -- shall i bundle the fixes?
>>>
>>> On Thu, May 23, 2019 at 9:01 AM Ilya Biryukov 
>>> wrote:
>>>
 Maybe go with a runtime parameter (of type llvm::function_ref) instead
 of the template parameter?
 In any non-trivial example, the runtime costs of another function
 pointer should be negligible given that we need to parse the ASTs, run the
 matchers, etc.

 On Wed, May 22, 2019 at 10:48 PM Penzin, Petr 
 wrote:

> It does not like some part of that instantiation, I am not sure which
> one yet. Let’s see what I can do about it.
>
>
>
> -Petr
>
>
>
> *From:* Yitzhak Mandelbaum [mailto:yitzh...@google.com]
> *Sent:* Wednesday, May 22, 2019 1:37 PM
> *To:* reviews+d61774+public+f458bb6144ae8...@reviews.llvm.org
> *Cc:* Ilya Biryukov ; Penzin, Petr <
> petr.pen...@intel.com>; llvm-comm...@lists.llvm.org; Michał Górny <
> mgo...@gentoo.org>; cfe-commits ; Theko
> Lekena ; Nicolas Lesser ;
> Han Shen 
> *Subject:* Re: [PATCH] D61774: [LibTooling] Add RangeSelector library
> for defining source ranges based on bound AST nodes.
>
>
>
> I'm confused by the error given that getStatementsRange is a function
> name.  I don't have Visual Studio -- can you find a fix and send a patch? 
> I
> wonder if taking the address explicitly is enough?  Or, if you know how to
> trigger this error in clang or gcc, I can fix it myself.
>
>
>
> On Wed, May 22, 2019 at 4:31 PM Petr Penzin via Phabricator <
> revi...@reviews.llvm.org> wrote:
>
> penzn added inline comments.
>
>
> 
> Comment at: cfe/trunk/lib/Tooling/Refactoring/RangeSelector.cpp:229
> +RangeSelector tooling::statements(StringRef ID) {
> +  return RelativeSelector(ID);
> +}
> 
> Sorry for posting here, haven't gotten my bugzilla access yet
> (requested though).
>
> This breaks with Visual Studio 2017 (15.7.6):
>
> RangeSelector.cpp(229): error C2971:
> '`anonymous-namespace'::RelativeSelector': template parameter 'Func':
> 'getStatementsRange': a variable with non-static storage duration cannot 
> be
> used as a non-type argument
>
>
> Repository:
>   rL LLVM
>
> CHANGES SINCE LAST ACTION
>   https://reviews.llvm.org/D61774/new/
>
> https://reviews.llvm.org/D61774
>
>
>

 --
 Regards,
 Ilya Biryukov

>>>

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


[PATCH] D62303: [Index] Fix reported references in presence of template type aliases

2019-05-23 Thread Phabricator via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rL361511: [Index] Fix reported references in presence of 
template type aliases (authored by ibiryukov, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Changed prior to commit:
  https://reviews.llvm.org/D62303?vs=201002=201003#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62303/new/

https://reviews.llvm.org/D62303

Files:
  cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
  clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp


Index: cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
===
--- cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
+++ cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
@@ -133,29 +133,41 @@
 return true;
   }
 
-  template
-  bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
-if (const auto *T = TL.getTypePtr()) {
-  if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
-if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
-  IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
-   ParentDC, SymbolRoleSet(), Relations);
-  return true;
-}
-  }
-  if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
-IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+  void HandleTemplateSpecializationTypeLoc(TemplateName TemplName,
+   SourceLocation TemplNameLoc,
+   CXXRecordDecl *ResolvedClass,
+   bool IsTypeAlias) {
+// In presence of type aliases, the resolved class was never written in
+// the code so don't report it.
+if (!IsTypeAlias && ResolvedClass &&
+(!ResolvedClass->isImplicit() ||
+ IndexCtx.shouldIndexImplicitInstantiation())) {
+  IndexCtx.handleReference(ResolvedClass, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
+} else if (const TemplateDecl *D = TemplName.getAsTemplateDecl()) {
+  IndexCtx.handleReference(D, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
 }
-return true;
   }
 
   bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+T->isTypeAlias());
+return true;
   }
 
   bool 
VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc 
TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+/*IsTypeAlias=*/false);
+return true;
   }
 
   bool VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
Index: clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
===
--- clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
@@ -497,6 +497,17 @@
   ElementsAre(Sym("Foo"), Sym("Foo")));
 }
 
+TEST(LocateSymbol, TemplateTypedefs) {
+  auto T = Annotations(R"cpp(
+template  struct function {};
+template  using callback = function;
+
+c^allback foo;
+  )cpp");
+  auto AST = TestTU::withCode(T.code()).build();
+  EXPECT_THAT(locateSymbolAt(AST, T.point()), ElementsAre(Sym("callback")));
+}
+
 TEST(LocateSymbol, RelPathsInCompileCommand) {
   // The source is in "/clangd-test/src".
   // We build in "/clangd-test/build".


Index: cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
===
--- cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
+++ cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
@@ -133,29 +133,41 @@
 return true;
   }
 
-  template
-  bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
-if (const auto *T = TL.getTypePtr()) {
-  if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
-if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
-  IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
-   ParentDC, SymbolRoleSet(), Relations);
-  return true;
-}
-  }
-  if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
-IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+  void 

r361511 - [Index] Fix reported references in presence of template type aliases

2019-05-23 Thread Ilya Biryukov via cfe-commits
Author: ibiryukov
Date: Thu May 23 09:48:47 2019
New Revision: 361511

URL: http://llvm.org/viewvc/llvm-project?rev=361511=rev
Log:
[Index] Fix reported references in presence of template type aliases

Summary: See the added test for an example.

Reviewers: kadircet

Reviewed By: kadircet

Subscribers: jkorous, arphaman, cfe-commits

Tags: #clang

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

Modified:
cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp

Modified: cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp?rev=361511=361510=361511=diff
==
--- cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp (original)
+++ cfe/trunk/lib/Index/IndexTypeSourceInfo.cpp Thu May 23 09:48:47 2019
@@ -133,29 +133,41 @@ public:
 return true;
   }
 
-  template
-  bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
-if (const auto *T = TL.getTypePtr()) {
-  if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
-if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
-  IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
-   ParentDC, SymbolRoleSet(), Relations);
-  return true;
-}
-  }
-  if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
-IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+  void HandleTemplateSpecializationTypeLoc(TemplateName TemplName,
+   SourceLocation TemplNameLoc,
+   CXXRecordDecl *ResolvedClass,
+   bool IsTypeAlias) {
+// In presence of type aliases, the resolved class was never written in
+// the code so don't report it.
+if (!IsTypeAlias && ResolvedClass &&
+(!ResolvedClass->isImplicit() ||
+ IndexCtx.shouldIndexImplicitInstantiation())) {
+  IndexCtx.handleReference(ResolvedClass, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
+} else if (const TemplateDecl *D = TemplName.getAsTemplateDecl()) {
+  IndexCtx.handleReference(D, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
 }
-return true;
   }
 
   bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+T->isTypeAlias());
+return true;
   }
 
   bool 
VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc 
TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+/*IsTypeAlias=*/false);
+return true;
   }
 
   bool VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {


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


[clang-tools-extra] r361511 - [Index] Fix reported references in presence of template type aliases

2019-05-23 Thread Ilya Biryukov via cfe-commits
Author: ibiryukov
Date: Thu May 23 09:48:47 2019
New Revision: 361511

URL: http://llvm.org/viewvc/llvm-project?rev=361511=rev
Log:
[Index] Fix reported references in presence of template type aliases

Summary: See the added test for an example.

Reviewers: kadircet

Reviewed By: kadircet

Subscribers: jkorous, arphaman, cfe-commits

Tags: #clang

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

Modified:
clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp

Modified: clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp
URL: 
http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp?rev=361511=361510=361511=diff
==
--- clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/XRefsTests.cpp Thu May 23 09:48:47 
2019
@@ -497,6 +497,17 @@ TEST(LocateSymbol, Ambiguous) {
   ElementsAre(Sym("Foo"), Sym("Foo")));
 }
 
+TEST(LocateSymbol, TemplateTypedefs) {
+  auto T = Annotations(R"cpp(
+template  struct function {};
+template  using callback = function;
+
+c^allback foo;
+  )cpp");
+  auto AST = TestTU::withCode(T.code()).build();
+  EXPECT_THAT(locateSymbolAt(AST, T.point()), ElementsAre(Sym("callback")));
+}
+
 TEST(LocateSymbol, RelPathsInCompileCommand) {
   // The source is in "/clangd-test/src".
   // We build in "/clangd-test/build".


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


[PATCH] D62303: [Index] Fix reported references in presence of template type aliases

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clang/lib/Index/IndexTypeSourceInfo.cpp:140
+   bool IsTypeAlias) {
+if (ResolvedClass) {
+  // In presence of type aliases, the resolved class was never written in

kadircet wrote:
> why not merge with next condition?
Thanks!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62303/new/

https://reviews.llvm.org/D62303



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


[PATCH] D62303: [Index] Fix reported references in presence of template type aliases

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov updated this revision to Diff 201002.
ilya-biryukov marked 2 inline comments as done.
ilya-biryukov added a comment.

- Address a comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62303/new/

https://reviews.llvm.org/D62303

Files:
  clang-tools-extra/clangd/unittests/XRefsTests.cpp
  clang/lib/Index/IndexTypeSourceInfo.cpp


Index: clang/lib/Index/IndexTypeSourceInfo.cpp
===
--- clang/lib/Index/IndexTypeSourceInfo.cpp
+++ clang/lib/Index/IndexTypeSourceInfo.cpp
@@ -133,29 +133,41 @@
 return true;
   }
 
-  template
-  bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
-if (const auto *T = TL.getTypePtr()) {
-  if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
-if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
-  IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
-   ParentDC, SymbolRoleSet(), Relations);
-  return true;
-}
-  }
-  if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
-IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+  void HandleTemplateSpecializationTypeLoc(TemplateName TemplName,
+   SourceLocation TemplNameLoc,
+   CXXRecordDecl *ResolvedClass,
+   bool IsTypeAlias) {
+// In presence of type aliases, the resolved class was never written in
+// the code so don't report it.
+if (!IsTypeAlias && ResolvedClass &&
+(!ResolvedClass->isImplicit() ||
+ IndexCtx.shouldIndexImplicitInstantiation())) {
+  IndexCtx.handleReference(ResolvedClass, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
+} else if (const TemplateDecl *D = TemplName.getAsTemplateDecl()) {
+  IndexCtx.handleReference(D, TemplNameLoc, Parent, ParentDC,
+   SymbolRoleSet(), Relations);
 }
-return true;
   }
 
   bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+T->isTypeAlias());
+return true;
   }
 
   bool 
VisitDeducedTemplateSpecializationTypeLoc(DeducedTemplateSpecializationTypeLoc 
TL) {
-return HandleTemplateSpecializationTypeLoc(TL);
+auto *T = TL.getTypePtr();
+if (!T)
+  return true;
+HandleTemplateSpecializationTypeLoc(
+T->getTemplateName(), TL.getTemplateNameLoc(), T->getAsCXXRecordDecl(),
+/*IsTypeAlias=*/false);
+return true;
   }
 
   bool VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -497,6 +497,17 @@
   ElementsAre(Sym("Foo"), Sym("Foo")));
 }
 
+TEST(LocateSymbol, TemplateTypedefs) {
+  auto T = Annotations(R"cpp(
+template  struct function {};
+template  using callback = function;
+
+c^allback foo;
+  )cpp");
+  auto AST = TestTU::withCode(T.code()).build();
+  EXPECT_THAT(locateSymbolAt(AST, T.point()), ElementsAre(Sym("callback")));
+}
+
 TEST(LocateSymbol, RelPathsInCompileCommand) {
   // The source is in "/clangd-test/src".
   // We build in "/clangd-test/build".


Index: clang/lib/Index/IndexTypeSourceInfo.cpp
===
--- clang/lib/Index/IndexTypeSourceInfo.cpp
+++ clang/lib/Index/IndexTypeSourceInfo.cpp
@@ -133,29 +133,41 @@
 return true;
   }
 
-  template
-  bool HandleTemplateSpecializationTypeLoc(TypeLocType TL) {
-if (const auto *T = TL.getTypePtr()) {
-  if (CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
-if (!RD->isImplicit() || IndexCtx.shouldIndexImplicitInstantiation()) {
-  IndexCtx.handleReference(RD, TL.getTemplateNameLoc(), Parent,
-   ParentDC, SymbolRoleSet(), Relations);
-  return true;
-}
-  }
-  if (const TemplateDecl *D = T->getTemplateName().getAsTemplateDecl())
-IndexCtx.handleReference(D, TL.getTemplateNameLoc(), Parent, ParentDC,
- SymbolRoleSet(), Relations);
+  void HandleTemplateSpecializationTypeLoc(TemplateName TemplName,
+   SourceLocation TemplNameLoc,
+   CXXRecordDecl *ResolvedClass,
+   bool 

[PATCH] D62328: [LibTooling] Fix dangling references in RangeSelector.

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov accepted this revision.
ilya-biryukov added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62328/new/

https://reviews.llvm.org/D62328



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


[PATCH] D62312: [ASTImporter] Added visibility context check for CXXRecordDecl.

2019-05-23 Thread Shafik Yaghmour via Phabricator via cfe-commits
shafik added a comment.

Minor comments, I am going to run `check-lldb` now.




Comment at: unittests/AST/ASTImporterVisibilityTest.cpp:34
 };
+struct GetClassPattern {
+  using DeclTy = CXXRecordDecl;

`GetCXXRecordPattern` feels more consistent.



Comment at: unittests/AST/ASTImporterVisibilityTest.cpp:49
+// CXXRecordDecl:
+auto *ExternC = "class X;";
+auto *AnonC = "namespace { class X; }";

`const`? It is not consistent w/ the previous declarations. 



Comment at: unittests/AST/ASTImporterVisibilityTest.cpp:50
+auto *ExternC = "class X;";
+auto *AnonC = "namespace { class X; }";
 

`const`? It is not consistent w/ the previous declarations. 


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62312/new/

https://reviews.llvm.org/D62312



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


r361510 - [CodeComplete] Only show lambda completions if patterns are requested

2019-05-23 Thread Ilya Biryukov via cfe-commits
Author: ibiryukov
Date: Thu May 23 09:39:26 2019
New Revision: 361510

URL: http://llvm.org/viewvc/llvm-project?rev=361510=rev
Log:
[CodeComplete] Only show lambda completions if patterns are requested

This is a trivial follow-up to r361461, so sending without review.

Modified:
cfe/trunk/lib/Sema/SemaCodeComplete.cpp
cfe/trunk/test/CodeCompletion/lambdas.cpp

Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=361510=361509=361510=diff
==
--- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Thu May 23 09:39:26 2019
@@ -4134,6 +4134,8 @@ static const FunctionProtoType *TryDecon
 static void AddLambdaCompletion(ResultBuilder ,
 llvm::ArrayRef Parameters,
 const LangOptions ) {
+  if (!Results.includeCodePatterns())
+return;
   CodeCompletionBuilder Completion(Results.getAllocator(),
Results.getCodeCompletionTUInfo());
   // []() {}

Modified: cfe/trunk/test/CodeCompletion/lambdas.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeCompletion/lambdas.cpp?rev=361510=361509=361510=diff
==
--- cfe/trunk/test/CodeCompletion/lambdas.cpp (original)
+++ cfe/trunk/test/CodeCompletion/lambdas.cpp Thu May 23 09:39:26 2019
@@ -51,3 +51,12 @@ void test4() {
   // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns 
-code-completion-at=%s:50:35 %s -o - | FileCheck -check-prefix=CHECK-6 %s
   // CHECK-6-NOT: COMPLETION: Pattern : [<#=
 }
+
+void test5() {
+  // Completions are only added when -code-completion-patterns are enabled.
+  function b = {};
+  // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns 
-code-completion-at=%s:57:24 %s -o - | FileCheck -check-prefix=CHECK-7 %s
+  // CHECK-7: COMPLETION: Pattern : [<#=
+  // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:57:24 %s -o - | 
FileCheck -check-prefix=CHECK-8 %s
+  // CHECK-8-NOT: COMPLETION: Pattern : [<#=
+}


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


[PATCH] D62298: [CodeComplete] Filter override completions by function name

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added a comment.

After landing this, will try to add new presentation options for completion 
items here.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62298/new/

https://reviews.llvm.org/D62298



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


[PATCH] D62298: [CodeComplete] Filter override completions by function name

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov marked an inline comment as done.
ilya-biryukov added a comment.

I think that's a good step forward, although not yet ideal. The typed chunk now 
contains everything starting function name and ending with `override`, so one 
gets both nice prefix match scores when typing a function and possibility to 
say `override` to get all completion items that do overrides.




Comment at: clang/test/CodeCompletion/overrides.cpp:29
-//
-// Runs completion at void ^.
-// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:14:8 %s -o - | 
FileCheck -check-prefix=CHECK-CC3 %s

I've removed this to avoid dealing with the error return code (`vfo` is 
unresolved, so clang produces error there).
Happy to bring it back if you feel it's important


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62298/new/

https://reviews.llvm.org/D62298



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


[PATCH] D62298: [CodeComplete] Filter override completions by function name

2019-05-23 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov updated this revision to Diff 201000.
ilya-biryukov added a comment.
Herald added subscribers: arphaman, jkorous.

- Make first letter of the helper function lowercase
- New model: everything before name is a text chunk, everything after it is 
typed chunk
- Test the filter text produced by clangd


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62298/new/

https://reviews.llvm.org/D62298

Files:
  clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
  clang/lib/Sema/SemaCodeComplete.cpp
  clang/test/CodeCompletion/overrides.cpp

Index: clang/test/CodeCompletion/overrides.cpp
===
--- clang/test/CodeCompletion/overrides.cpp
+++ clang/test/CodeCompletion/overrides.cpp
@@ -11,23 +11,17 @@
 class C : public B {
  public:
   void vfunc(bool param) override;
-  void
+  vfo
 };
 
-// Runs completion at ^void.
+// Runs completion at ^vfo
 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:14:3 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
 // CHECK-CC1: COMPLETION: Pattern : int ttt(bool param, int x = 3) const override{{$}}
 // CHECK-CC1: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}
 // CHECK-CC1-NOT: COMPLETION: Pattern : void vfunc(bool param) override{{$}}
 //
-// Runs completion at vo^id.
+// Runs completion at vf^o
 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:14:5 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
-// CHECK-CC2: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}
 // CHECK-CC2-NOT: COMPLETION: Pattern : int ttt(bool param, int x = 3) const override{{$}}
+// CHECK-CC2: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}
 // CHECK-CC2-NOT: COMPLETION: Pattern : void vfunc(bool param) override{{$}}
-//
-// Runs completion at void ^.
-// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:14:8 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
-// CHECK-CC3-NOT: COMPLETION: Pattern : int ttt(bool param, int x = 3) const override{{$}}
-// CHECK-CC3-NOT: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}
-// CHECK-CC3-NOT: COMPLETION: Pattern : void vfunc(bool param) override{{$}}
Index: clang/lib/Sema/SemaCodeComplete.cpp
===
--- clang/lib/Sema/SemaCodeComplete.cpp
+++ clang/lib/Sema/SemaCodeComplete.cpp
@@ -37,6 +37,7 @@
 #include "llvm/Support/Path.h"
 #include 
 #include 
+#include 
 #include 
 
 using namespace clang;
@@ -1828,19 +1829,6 @@
   Results.AddResult(CodeCompletionResult(Builder.TakeString()));
 }
 
-static void printOverrideString(llvm::raw_ostream ,
-CodeCompletionString *CCS) {
-  for (const auto  : *CCS) {
-if (C.Kind == CodeCompletionString::CK_Optional)
-  printOverrideString(OS, C.Optional);
-else
-  OS << C.Text;
-// Add a space after return type.
-if (C.Kind == CodeCompletionString::CK_ResultType)
-  OS << ' ';
-  }
-}
-
 static void AddOverrideResults(ResultBuilder ,
const CodeCompletionContext ,
CodeCompletionBuilder ) {
@@ -3162,19 +3150,49 @@
   PP, Ctx, Result, IncludeBriefComments, CCContext, Policy);
 }
 
+static void printOverrideString(const CodeCompletionString ,
+   std::string ,
+   std::string ) {
+  bool SeenTypedChunk = false;
+  for (auto  : CCS) {
+if (Chunk.Kind == CodeCompletionString::CK_Optional) {
+  assert(SeenTypedChunk && "optional parameter before name");
+  // Note that we put all chunks inside into NameAndSignature.
+  printOverrideString(*Chunk.Optional, NameAndSignature,
+ NameAndSignature);
+  continue;
+}
+if (!SeenTypedChunk && Chunk.Kind == CodeCompletionString::CK_TypedText)
+  SeenTypedChunk = true;
+if (SeenTypedChunk)
+  NameAndSignature += Chunk.Text;
+else
+  BeforeName += Chunk.Text;
+// Add a space after return type.
+if (Chunk.Kind == CodeCompletionString::CK_ResultType) {
+  assert(!SeenTypedChunk);
+  BeforeName += " ";
+}
+  }
+}
+
 CodeCompletionString *
 CodeCompletionResult::createCodeCompletionStringForOverride(
 Preprocessor , ASTContext , CodeCompletionBuilder ,
 bool IncludeBriefComments, const CodeCompletionContext ,
 PrintingPolicy ) {
-  std::string OverrideSignature;
-  llvm::raw_string_ostream OS(OverrideSignature);
   auto *CCS = createCodeCompletionStringForDecl(PP, Ctx, Result,
 /*IncludeBriefComments=*/false,
 CCContext, Policy);
-  printOverrideString(OS, CCS);
-  OS << " override";
-  Result.AddTypedTextChunk(Result.getAllocator().CopyString(OS.str()));
+  std::string BeforeName;
+  std::string NameAndSignature;
+  // For overrides all chunks go into the 

[PATCH] D61634: [clang/llvm] Allow efficient implementation of libc's memory functions in C/C++

2019-05-23 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet updated this revision to Diff 200998.
gchatelet added a comment.

- Use no-builtin instead of no-runtime-for.
- Use one attribute per runtime function to make merging easier.

The patch is still WIP and needs more work.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D61634/new/

https://reviews.llvm.org/D61634

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/AttrDocs.td
  clang/lib/CodeGen/CGCall.cpp
  clang/lib/Sema/SemaDeclAttr.cpp
  llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
  llvm/test/CodeGen/X86/memcpy.ll

Index: llvm/test/CodeGen/X86/memcpy.ll
===
--- llvm/test/CodeGen/X86/memcpy.ll
+++ llvm/test/CodeGen/X86/memcpy.ll
@@ -7,7 +7,7 @@
 
 
 ; Variable memcpy's should lower to calls.
-define i8* @test1(i8* %a, i8* %b, i64 %n) nounwind {
+define void @test1(i8* %a, i8* %b, i64 %n) nounwind {
 ; LINUX-LABEL: test1:
 ; LINUX:   # %bb.0: # %entry
 ; LINUX-NEXT:jmp memcpy # TAILCALL
@@ -17,11 +17,11 @@
 ; DARWIN-NEXT:jmp _memcpy ## TAILCALL
 entry:
 	tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 %n, i1 0 )
-	ret i8* %a
+  ret void
 }
 
 ; Variable memcpy's should lower to calls.
-define i8* @test2(i64* %a, i64* %b, i64 %n) nounwind {
+define void @test2(i64* %a, i64* %b, i64 %n) nounwind {
 ; LINUX-LABEL: test2:
 ; LINUX:   # %bb.0: # %entry
 ; LINUX-NEXT:jmp memcpy # TAILCALL
@@ -33,7 +33,25 @@
 	%tmp14 = bitcast i64* %a to i8*
 	%tmp25 = bitcast i64* %b to i8*
 	tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %tmp14, i8* align 8 %tmp25, i64 %n, i1 0 )
-	ret i8* %tmp14
+  ret void
+}
+
+; Variable length memcpy's with disabled runtime should lower to repmovsb.
+define void @memcpy_no_runtime(i8* %a, i8* %b, i64 %n) nounwind {
+; LINUX-LABEL: memcpy_no_runtime:
+; LINUX:   # %bb.0: # %entry
+; LINUX-NEXT:movq %rdx, %rcx
+; LINUX-NEXT:rep;movsb (%rsi), %es:(%rdi)
+; LINUX-NEXT:retq
+;
+; DARWIN-LABEL: memcpy_no_runtime:
+; DARWIN:   ## %bb.0: ## %entry
+; DARWIN-NEXT:movq %rdx, %rcx
+; DARWIN-NEXT:rep;movsb (%rsi), %es:(%rdi)
+; DARWIN-NEXT:retq
+entry:
+	tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 %n, i1 0 ) "no-builtin-memcpy"
+  ret void
 }
 
 ; Large constant memcpy's should lower to a call when optimizing for size.
Index: llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
===
--- llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
+++ llvm/lib/Target/X86/X86SelectionDAGInfo.cpp
@@ -314,5 +314,9 @@
   Size.getValueType(), Align, isVolatile,
   AlwaysInline, DstPtrInfo, SrcPtrInfo);
 
+  /// Handle runtime sizes through repmovsb when we AlwaysInline.
+  if (AlwaysInline)
+return emitRepmovs(Subtarget, DAG, dl, Chain, Dst, Src, Size, MVT::i8);
+
   return SDValue();
 }
Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -96,6 +96,14 @@
   return II;
 }
 
+static void ForwardAttribute(const Function *F, StringRef Attribute,
+ CallInst *CI) {
+  if (F->hasFnAttribute(Attribute)) {
+CI->addAttribute(AttributeList::FunctionIndex,
+ F->getFnAttribute(Attribute));
+  }
+}
+
 CallInst *IRBuilderBase::
 CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
  bool isVolatile, MDNode *TBAATag, MDNode *ScopeTag,
@@ -103,7 +111,8 @@
   Ptr = getCastedInt8PtrValue(Ptr);
   Value *Ops[] = {Ptr, Val, Size, getInt1(isVolatile)};
   Type *Tys[] = { Ptr->getType(), Size->getType() };
-  Module *M = BB->getParent()->getParent();
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
   Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys);
 
   CallInst *CI = createCallHelper(TheFn, Ops, this);
@@ -121,6 +130,8 @@
   if (NoAliasTag)
 CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
 
+  ForwardAttribute(F, "no-builtin-memset", CI);
+
   return CI;
 }
 
@@ -165,7 +176,8 @@
 
   Value *Ops[] = {Dst, Src, Size, getInt1(isVolatile)};
   Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
-  Module *M = BB->getParent()->getParent();
+  Function *F = BB->getParent();
+  Module *M = F->getParent();
   Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
 
   CallInst *CI = createCallHelper(TheFn, Ops, this);
@@ -190,6 +202,8 @@
   if (NoAliasTag)
 CI->setMetadata(LLVMContext::MD_noalias, NoAliasTag);
 
+  ForwardAttribute(F, "no-builtin-memcpy", CI);
+
   return CI;
 }
 
@@ -245,7 +259,8 @@
 
   Value *Ops[] = {Dst, Src, Size, getInt1(isVolatile)};
   Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
-  Module *M = 

[PATCH] D62329: [ASTImporter] Structural eq: handle DependentScopeDeclRefExpr

2019-05-23 Thread Gabor Marton via Phabricator via cfe-commits
martong created this revision.
martong added a reviewer: a_sidorin.
Herald added subscribers: cfe-commits, gamesh411, Szelethus, dkrupp, rnkovacs.
Herald added a reviewer: a.sidorin.
Herald added a project: clang.

Structural equivalence did not handle dependent template args properly
when the arg contained a DependentScopeDeclRefExpr.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D62329

Files:
  clang/lib/AST/ASTStructuralEquivalence.cpp
  clang/unittests/AST/StructuralEquivalenceTest.cpp

Index: clang/unittests/AST/StructuralEquivalenceTest.cpp
===
--- clang/unittests/AST/StructuralEquivalenceTest.cpp
+++ clang/unittests/AST/StructuralEquivalenceTest.cpp
@@ -892,5 +892,143 @@
   EXPECT_FALSE(testStructuralMatch(First, Second));
 }
 
+struct StructuralEquivalenceDependentTemplateArgsTest
+: StructuralEquivalenceTemplateTest {};
+
+TEST_F(StructuralEquivalenceDependentTemplateArgsTest,
+   SameStructsInDependentArgs) {
+  std::string Code =
+  R"(
+  template 
+  struct S1;
+
+  template 
+  struct enable_if;
+
+  struct S
+  {
+template >::type>
+void f();
+  };
+  )";
+  auto t = makeDecls(Code, Code, Lang_CXX11,
+   functionTemplateDecl(hasName("f")));
+  EXPECT_TRUE(testStructuralMatch(t));
+}
+
+TEST_F(StructuralEquivalenceDependentTemplateArgsTest,
+   DifferentStructsInDependentArgs) {
+  std::string Code =
+  R"(
+  template 
+  struct S1;
+
+  template 
+  struct S2;
+
+  template 
+  struct enable_if;
+  )";
+  auto t = makeDecls(Code + R"(
+  struct S
+  {
+template >::type>
+void f();
+  };
+  )",
+   Code + R"(
+  struct S
+  {
+template >::type>
+void f();
+  };
+  )",
+   Lang_CXX11,
+   functionTemplateDecl(hasName("f")));
+  EXPECT_FALSE(testStructuralMatch(t));
+}
+
+TEST_F(StructuralEquivalenceDependentTemplateArgsTest,
+   SameStructsInDependentScopeDeclRefExpr) {
+  std::string Code =
+  R"(
+  template 
+  struct S1;
+
+  template 
+  struct enable_if;
+
+  struct S
+  {
+template ::value>::type>
+void f();   // DependentScopeDeclRefExpr:
+  };
+  )";
+  auto t = makeDecls(Code, Code, Lang_CXX11,
+   functionTemplateDecl(hasName("f")));
+  EXPECT_TRUE(testStructuralMatch(t));
+}
+
+TEST_F(StructuralEquivalenceDependentTemplateArgsTest,
+   DifferentStructsInDependentScopeDeclRefExpr) {
+  std::string Code =
+  R"(
+  template 
+  struct S1;
+
+  template 
+  struct S2;
+
+  template 
+  struct enable_if;
+  )";
+  auto t = makeDecls(Code + R"(
+  struct S
+  {
+template ::value>::type>
+void f();   // DependentScopeDeclRefExpr:
+  };
+  )",
+   Code + R"(
+  struct S
+  {
+template ::value>::type>
+void f();
+  };
+  )",
+   Lang_CXX,
+   functionTemplateDecl(hasName("f")));
+  EXPECT_FALSE(testStructuralMatch(t));
+}
+
+TEST_F(StructuralEquivalenceDependentTemplateArgsTest,
+   DifferentValueInDependentScopeDeclRefExpr) {
+  std::string Code =
+  R"(
+  template 
+  struct S1;
+
+  template 
+  struct enable_if;
+  )";
+  auto t = makeDecls(Code + R"(
+  struct S
+  {
+template ::value1>::type>
+void f();   // DependentScopeDeclRefExpr:
+  };
+  )",
+   Code + R"(
+  struct S
+  {
+template ::value2>::type>
+void f();
+  };
+  )",
+   Lang_CXX,
+   functionTemplateDecl(hasName("f")));
+  EXPECT_FALSE(testStructuralMatch(t));
+}
+
 } // end namespace ast_matchers
 } // end namespace clang
Index: clang/lib/AST/ASTStructuralEquivalence.cpp
===
--- clang/lib/AST/ASTStructuralEquivalence.cpp
+++ clang/lib/AST/ASTStructuralEquivalence.cpp
@@ -73,6 +73,7 @@
 #include "clang/AST/DeclFriend.h"
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
+#include "clang/AST/ExprCXX.h"
 #include "clang/AST/NestedNameSpecifier.h"
 #include "clang/AST/TemplateBase.h"
 #include "clang/AST/TemplateName.h"
@@ -100,6 +101,51 @@
 static bool IsStructurallyEquivalent(StructuralEquivalenceContext ,
  const TemplateArgument ,
  const TemplateArgument );
+static bool 

[PATCH] D62328: [LibTooling] Fix dangling references in RangeSelector.

2019-05-23 Thread Yitzhak Mandelbaum via Phabricator via cfe-commits
ymandel created this revision.
ymandel added reviewers: ilya-biryukov, gribozavr.
Herald added a project: clang.

RangeSelector had a number of cases of capturing a StringRef in a lambda, which
lead to dangling references. This change converts all uses in the API of
`StringRef` to `std::string` to avoid this problem. `std::string` in the API is
a reasonable choice, because the combinators are always storing the string
beyond the life of the combinator construction.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D62328

Files:
  clang/include/clang/Tooling/Refactoring/RangeSelector.h
  clang/lib/Tooling/Refactoring/RangeSelector.cpp

Index: clang/lib/Tooling/Refactoring/RangeSelector.cpp
===
--- clang/lib/Tooling/Refactoring/RangeSelector.cpp
+++ clang/lib/Tooling/Refactoring/RangeSelector.cpp
@@ -104,7 +104,7 @@
   return findPreviousTokenKind(EndLoc, SM, LangOpts, tok::TokenKind::l_paren);
 }
 
-RangeSelector tooling::node(StringRef ID) {
+RangeSelector tooling::node(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -115,7 +115,7 @@
   };
 }
 
-RangeSelector tooling::statement(StringRef ID) {
+RangeSelector tooling::statement(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -143,11 +143,11 @@
   };
 }
 
-RangeSelector tooling::range(StringRef BeginID, StringRef EndID) {
-  return tooling::range(node(BeginID), node(EndID));
+RangeSelector tooling::range(std::string BeginID, std::string EndID) {
+  return tooling::range(node(std::move(BeginID)), node(std::move(EndID)));
 }
 
-RangeSelector tooling::member(StringRef ID) {
+RangeSelector tooling::member(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected Node = getNode(Result.Nodes, ID);
 if (!Node)
@@ -159,7 +159,7 @@
   };
 }
 
-RangeSelector tooling::name(StringRef ID) {
+RangeSelector tooling::name(std::string ID) {
   return [ID](const MatchResult ) -> Expected {
 Expected N = getNode(Result.Nodes, ID);
 if (!N)
@@ -205,7 +205,7 @@
   std::string ID;
 
 public:
-  RelativeSelector(StringRef ID) : ID(ID) {}
+  RelativeSelector(std::string ID) : ID(std::move(ID)) {}
 
   Expected operator()(const MatchResult ) {
 Expected N = getNode(Result.Nodes, ID);
@@ -231,8 +231,8 @@
 }
 } // namespace
 
-RangeSelector tooling::statements(StringRef ID) {
-  return RelativeSelector(ID);
+RangeSelector tooling::statements(std::string ID) {
+  return RelativeSelector(std::move(ID));
 }
 
 namespace {
@@ -246,8 +246,8 @@
 }
 } // namespace
 
-RangeSelector tooling::callArgs(StringRef ID) {
-  return RelativeSelector(ID);
+RangeSelector tooling::callArgs(std::string ID) {
+  return RelativeSelector(std::move(ID));
 }
 
 namespace {
@@ -260,8 +260,8 @@
 }
 } // namespace
 
-RangeSelector tooling::initListElements(StringRef ID) {
-  return RelativeSelector(ID);
+RangeSelector tooling::initListElements(std::string ID) {
+  return RelativeSelector(std::move(ID));
 }
 
 RangeSelector tooling::expansion(RangeSelector S) {
Index: clang/include/clang/Tooling/Refactoring/RangeSelector.h
===
--- clang/include/clang/Tooling/Refactoring/RangeSelector.h
+++ clang/include/clang/Tooling/Refactoring/RangeSelector.h
@@ -17,9 +17,9 @@
 
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/SourceLocation.h"
-#include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Error.h"
 #include 
+#include 
 
 namespace clang {
 namespace tooling {
@@ -35,19 +35,19 @@
 RangeSelector range(RangeSelector Begin, RangeSelector End);
 
 /// Convenience version of \c range where end-points are bound nodes.
-RangeSelector range(StringRef BeginID, StringRef EndID);
+RangeSelector range(std::string BeginID, std::string EndID);
 
 /// Selects a node, including trailing semicolon (for non-expression
 /// statements). \p ID is the node's binding in the match result.
-RangeSelector node(StringRef ID);
+RangeSelector node(std::string ID);
 
 /// Selects a node, including trailing semicolon (always). Useful for selecting
 /// expression statements. \p ID is the node's binding in the match result.
-RangeSelector statement(StringRef ID);
+RangeSelector statement(std::string ID);
 
 /// Given a \c MemberExpr, selects the member token. \p ID is the node's
 /// binding in the match result.
-RangeSelector member(StringRef ID);
+RangeSelector member(std::string ID);
 
 /// Given a node with a "name", (like \c NamedDecl, \c DeclRefExpr or \c
 /// CxxCtorInitializer) selects the name's token.  Only selects the final
@@ -56,19 +56,19 @@
 /// it selects only `baz`.
 ///
 /// \param ID is the node's binding in the match result.
-RangeSelector name(StringRef ID);
+RangeSelector name(std::string ID);
 
 // Given a \c CallExpr (bound to \p ID), selects the 

  1   2   >