[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.

Thanks!
Might be worth a comment like "don't assign directly, Argv aliases CommandLine" 
or so


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172



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


[PATCH] D71049: Remove implicit conversion that promotes half to other larger precision types for fp classification builtins

2019-12-09 Thread Jim Lin via Phabricator via cfe-commits
Jim updated this revision to Diff 232765.
Jim added a comment.

Thank you for review.
Update patch and add tests that test half value will not be promoted to double.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71049

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/CodeGen/builtins.c


Index: clang/test/CodeGen/builtins.c
===
--- clang/test/CodeGen/builtins.c
+++ clang/test/CodeGen/builtins.c
@@ -193,8 +193,12 @@
 }
 
 // CHECK-LABEL: define void @test_float_builtins
-void test_float_builtins(float F, double D, long double LD) {
+void test_float_builtins(__fp16 *H, float F, double D, long double LD) {
   volatile int res;
+  res = __builtin_isinf(*H);
+  // CHECK:  call half @llvm.fabs.f16(half
+  // CHECK:  fcmp oeq half {{.*}}, 0xH7C00
+
   res = __builtin_isinf(F);
   // CHECK:  call float @llvm.fabs.f32(float
   // CHECK:  fcmp oeq float {{.*}}, 0x7FF0
@@ -207,6 +211,14 @@
   // CHECK:  call x86_fp80 @llvm.fabs.f80(x86_fp80
   // CHECK:  fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000
 
+  res = __builtin_isinf_sign(*H);
+  // CHECK:  %[[ABS:.*]] = call half @llvm.fabs.f16(half %[[ARG:.*]])
+  // CHECK:  %[[ISINF:.*]] = fcmp oeq half %[[ABS]], 0xH7C00
+  // CHECK:  %[[BITCAST:.*]] = bitcast half %[[ARG]] to i16
+  // CHECK:  %[[ISNEG:.*]] = icmp slt i16 %[[BITCAST]], 0
+  // CHECK:  %[[SIGN:.*]] = select i1 %[[ISNEG]], i32 -1, i32 1
+  // CHECK:  select i1 %[[ISINF]], i32 %[[SIGN]], i32 0
+
   res = __builtin_isinf_sign(F);
   // CHECK:  %[[ABS:.*]] = call float @llvm.fabs.f32(float %[[ARG:.*]])
   // CHECK:  %[[ISINF:.*]] = fcmp oeq float %[[ABS]], 0x7FF0
@@ -231,6 +243,10 @@
   // CHECK:  %[[SIGN:.*]] = select i1 %[[ISNEG]], i32 -1, i32 1
   // CHECK:  select i1 %[[ISINF]], i32 %[[SIGN]], i32 0
 
+  res = __builtin_isfinite(*H);
+  // CHECK: call half @llvm.fabs.f16(half
+  // CHECK: fcmp one half {{.*}}, 0xH7C00
+
   res = __builtin_isfinite(F);
   // CHECK: call float @llvm.fabs.f32(float
   // CHECK: fcmp one float {{.*}}, 0x7FF0
@@ -239,6 +255,14 @@
   // CHECK: call double @llvm.fabs.f64(double
   // CHECK: fcmp one double {{.*}}, 0x7FF0
 
+  res = __builtin_isnormal(*H);
+  // CHECK: fcmp oeq half
+  // CHECK: call half @llvm.fabs.f16(half
+  // CHECK: fcmp ult half {{.*}}, 0xH7C00
+  // CHECK: fcmp uge half {{.*}}, 0xH0400
+  // CHECK: and i1
+  // CHECK: and i1
+
   res = __builtin_isnormal(F);
   // CHECK: fcmp oeq float
   // CHECK: call float @llvm.fabs.f32(float
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -5808,10 +5808,11 @@
<< OrigArg->getType() << OrigArg->getSourceRange();
 
   // If this is an implicit conversion from float -> float, double, or
-  // long double, remove it.
+  // long double, or half -> half, float, double, or long double, remove it.
   if (ImplicitCastExpr *Cast = dyn_cast(OrigArg)) {
 // Only remove standard FloatCasts, leaving other casts inplace
 if (Cast->getCastKind() == CK_FloatingCast) {
+  bool IgnoreCast = false;
   Expr *CastArg = Cast->getSubExpr();
   if (CastArg->getType()->isSpecificBuiltinType(BuiltinType::Float)) {
 assert(
@@ -5820,6 +5821,19 @@
  Cast->getType()->isSpecificBuiltinType(BuiltinType::LongDouble)) 
&&
 "promotion from float to either float, double, or long double is "
 "the only expected cast here");
+IgnoreCast = true;
+  } else if (CastArg->getType()->isSpecificBuiltinType(BuiltinType::Half)) 
{
+assert(
+(Cast->getType()->isSpecificBuiltinType(BuiltinType::Double) ||
+ Cast->getType()->isSpecificBuiltinType(BuiltinType::Float) ||
+ Cast->getType()->isSpecificBuiltinType(BuiltinType::Half) ||
+ Cast->getType()->isSpecificBuiltinType(BuiltinType::LongDouble)) 
&&
+"promotion from half to either half, float, double, or long double 
"
+"is the only expected cast here");
+IgnoreCast = true;
+  }
+
+  if (IgnoreCast) {
 Cast->setSubExpr(nullptr);
 TheCall->setArg(NumArgs-1, CastArg);
   }


Index: clang/test/CodeGen/builtins.c
===
--- clang/test/CodeGen/builtins.c
+++ clang/test/CodeGen/builtins.c
@@ -193,8 +193,12 @@
 }
 
 // CHECK-LABEL: define void @test_float_builtins
-void test_float_builtins(float F, double D, long double LD) {
+void test_float_builtins(__fp16 *H, float F, double D, long double LD) {
   volatile int res;
+  res = __builtin_isinf(*H);
+  // CHECK:  call half @llvm.fabs.f16(half
+  // CHECK:  fcmp oeq half {{.*}}, 0xH7C00
+
   res = __builtin_isinf(F);
   // CHECK:  call float @llvm.fabs.f32(float
   // CHECK:  fcmp

[PATCH] D71124: [RISCV] support clang driver to select cpu

2019-12-09 Thread Jim Lin via Phabricator via cfe-commits
Jim added inline comments.



Comment at: clang/lib/Basic/Targets/RISCV.h:46
 
+  bool setCPU(const std::string &Name) override {
+CPU = Name;

I think this should test cpu name is valid first. And assign Name to CPU, if it 
is valid.


Repository:
  rC Clang

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

https://reviews.llvm.org/D71124



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


[PATCH] D71185: [DWARF5] Start emitting DW_AT_dwo_name when -gdwarf-5 is specified.

2019-12-09 Thread Sourabh Singh Tomar via Phabricator via cfe-commits
SouraVX created this revision.
SouraVX added reviewers: aprantl, dblaikie.
SouraVX added projects: debug-info, LLVM.
Herald added subscribers: llvm-commits, cfe-commits, dexonsmith, steven_wu, 
hiraditya, mehdi_amini.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71185

Files:
  clang/test/CodeGen/split-debug-output.c
  clang/test/CodeGen/thinlto-split-dwarf.c
  llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
  llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
  llvm/test/DebugInfo/X86/debug_addr.ll
  llvm/test/DebugInfo/X86/string-offsets-table.ll

Index: llvm/test/DebugInfo/X86/string-offsets-table.ll
===
--- llvm/test/DebugInfo/X86/string-offsets-table.ll
+++ llvm/test/DebugInfo/X86/string-offsets-table.ll
@@ -60,7 +60,7 @@
 ; SPLIT-NOT:  {{DW_TAG|contents:}}
 ; SPLIT:  DW_AT_str_offsets_base [DW_FORM_sec_offset] (0x0008)
 ; SPLIT:  DW_AT_comp_dir [DW_FORM_strx1] (indexed () string = "/home/test")
-; SPLIT:  DW_AT_GNU_dwo_name [DW_FORM_strx1] (indexed (0001) string = "foo.dwo")
+; SPLIT:  DW_AT_dwo_name [DW_FORM_strx1] (indexed (0001) string = "foo.dwo")
 
 ; Check for the split CU in .debug_info.dwo.
 ; SPLIT:  .debug_info.dwo contents:
Index: llvm/test/DebugInfo/X86/debug_addr.ll
===
--- llvm/test/DebugInfo/X86/debug_addr.ll
+++ llvm/test/DebugInfo/X86/debug_addr.ll
@@ -30,7 +30,7 @@
 ; DWARF5-NOT: Compile Unit
 ; DWARF5: DW_TAG_skeleton_unit
 ; DWARF5-NOT: DW_TAG_{{.*}}
-; DWARF5: DW_AT_GNU_dwo_name{{.*}}test.dwo
+; DWARF5: DW_AT_dwo_name{{.*}}test.dwo
 ; DWARF5: DW_AT_addr_base{{.*}}0x0008
 ; DWARF5: DW_AT_low_pc [DW_FORM_addrx] (indexed () address = 0x ".text")
 ; DWARF5: .debug_addr contents:
Index: llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
===
--- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -554,7 +554,9 @@
   DWARFDie UnitDie = getUnitDIE();
   if (!UnitDie)
 return false;
-  auto DWOFileName = dwarf::toString(UnitDie.find(DW_AT_GNU_dwo_name));
+  auto DWOFileName = getVersion() >= 5
+ ? dwarf::toString(UnitDie.find(DW_AT_dwo_name))
+ : dwarf::toString(UnitDie.find(DW_AT_GNU_dwo_name));
   if (!DWOFileName)
 return false;
   auto CompilationDir = dwarf::toString(UnitDie.find(DW_AT_comp_dir));
Index: llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===
--- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -861,12 +861,14 @@
 
   if (DIUnit->getDWOId()) {
 // This CU is either a clang module DWO or a skeleton CU.
+dwarf::Attribute attrDWOName = getDwarfVersion() >= 5
+   ? dwarf::DW_AT_dwo_name
+   : dwarf::DW_AT_GNU_dwo_name;
 NewCU.addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8,
   DIUnit->getDWOId());
 if (!DIUnit->getSplitDebugFilename().empty())
   // This is a prefabricated skeleton CU.
-  NewCU.addString(Die, dwarf::DW_AT_GNU_dwo_name,
-  DIUnit->getSplitDebugFilename());
+  NewCU.addString(Die, attrDWOName, DIUnit->getSplitDebugFilename());
   }
 }
 // Create new DwarfCompileUnit for the given metadata node with tag
@@ -1103,15 +1105,18 @@
 // Add CU specific attributes if we need to add any.
 // If we're splitting the dwarf out now that we've got the entire
 // CU then add the dwo id to it.
+dwarf::Attribute attrDWOName = getDwarfVersion() >= 5
+   ? dwarf::DW_AT_dwo_name
+   : dwarf::DW_AT_GNU_dwo_name;
 auto *SkCU = TheCU.getSkeleton();
 
 bool HasSplitUnit = SkCU && !TheCU.getUnitDie().children().empty();
 
 if (HasSplitUnit) {
   finishUnitAttributes(TheCU.getCUNode(), TheCU);
-  TheCU.addString(TheCU.getUnitDie(), dwarf::DW_AT_GNU_dwo_name,
+  TheCU.addString(TheCU.getUnitDie(), attrDWOName,
   Asm->TM.Options.MCOptions.SplitDwarfFile);
-  SkCU->addString(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_name,
+  SkCU->addString(SkCU->getUnitDie(), attrDWOName,
   Asm->TM.Options.MCOptions.SplitDwarfFile);
   // Emit a unique identifier for this CU.
   uint64_t ID =
Index: clang/test/CodeGen/thinlto-split-dwarf.c
===
--- clang/test/CodeGen/thinlto-split-dwarf.c
+++ clang/test/CodeGen/thinlto-split-dwarf.c
@@ -13,11 +13,31 @@
 // RUN:   -o %t.native.o -split-dwarf-file %t.file.dwo \
 // RUN:   -split-dwarf-output %t.output.dwo -x ir %t.o
 
-// RUN: llvm-dwarfdump %t.native.o | FileCheck --check-prefix=O %s
-// RUN: llvm-dwarfdump %t.output.

[PATCH] D71185: [DWARF5] Start emitting DW_AT_dwo_name when -gdwarf-5 is specified.

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60606 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71185



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


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Jon Chesterfield via Phabricator via cfe-commits
JonChesterfield added a comment.

Great to see the fragile math.h stuff disappear.

I'm not sure about the CPU/GPU/other granularity. An openmp program with x86 as 
the host and target offload regions for amdgcn and for nvptx seems like a 
reasonable aspiration. Or for a couple of different generations from the same 
vendor.

More ambitiously, one might want a GPU to be the host, and offload kernels for 
I/O to an aarch64 "target".

We don't need to wire such combinations in up front, and I don't think they're 
excluded by this design. A future 'x86-64' variant would presumably be chosen 
over a 'cpu' variant when compiling for x86-64.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread liu hui via Phabricator via cfe-commits
lh123 added a comment.

@sammccall Could you commit this, I don't have commit access.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172



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


[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread liu hui via Phabricator via cfe-commits
lh123 updated this revision to Diff 232771.

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172

Files:
  clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine.
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine.
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread liu hui via Phabricator via cfe-commits
lh123 updated this revision to Diff 232770.
lh123 added a comment.

Address comments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172

Files:
  clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein created this revision.
hokein added a reviewer: ilya-biryukov.
Herald added subscribers: usaxena95, kadircet, arphaman, jkorous, mgorny.
Herald added a project: clang.

added a unittest which causes "TL.getClassTInfo" is null.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71186

Files:
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/unittests/Tooling/CMakeLists.txt
  clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp

Index: clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
===
--- /dev/null
+++ clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
@@ -0,0 +1,54 @@
+//===- unittest/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.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 "TestVisitor.h"
+
+using namespace clang;
+
+namespace {
+
+class MemberPointerTypeLocVisitor
+: public ExpectedLocationVisitor {
+public:
+  bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
+if (!TL)
+  return true;
+Match(TL.getDecl()->getName(), TL.getNameLoc());
+return true;
+  }
+  bool VisitRecordTypeLoc(RecordTypeLoc RTL) {
+if (!RTL)
+  return true;
+Match(RTL.getDecl()->getName(), RTL.getNameLoc());
+return true;
+  }
+};
+
+TEST(RecursiveASTVisitor, VisitTypeLocInMemberPointerTypeLoc) {
+  MemberPointerTypeLocVisitor Visitor;
+  Visitor.ExpectMatch("Bar", 4, 36);
+  Visitor.ExpectMatch("T", 7, 23);
+  EXPECT_TRUE(Visitor.runOver(R"cpp(
+ class Bar { void func(int); };
+ class Foo {
+   void bind(const char*, void(Bar::*Foo)(int)) {}
+
+   template
+   void test(void(T::*Foo)());
+ };
+  )cpp"));
+}
+
+TEST(RecursiveASTVisitor, NoCrash) {
+  MemberPointerTypeLocVisitor Visitor;
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ class a(b(a::*)) class
+  )cpp"));
+}
+
+} // end anonymous namespace
Index: clang/unittests/Tooling/CMakeLists.txt
===
--- clang/unittests/Tooling/CMakeLists.txt
+++ clang/unittests/Tooling/CMakeLists.txt
@@ -42,6 +42,7 @@
   RecursiveASTVisitorTests/LambdaDefaultCapture.cpp
   RecursiveASTVisitorTests/LambdaExpr.cpp
   RecursiveASTVisitorTests/LambdaTemplateParams.cpp
+  RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
   RecursiveASTVisitorTests/NestedNameSpecifiers.cpp
   RecursiveASTVisitorTests/ParenExpr.cpp
   RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
Index: clang/include/clang/AST/RecursiveASTVisitor.h
===
--- clang/include/clang/AST/RecursiveASTVisitor.h
+++ clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1162,11 +1162,13 @@
 DEF_TRAVERSE_TYPELOC(RValueReferenceType,
  { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
 
-// FIXME: location of base class?
 // We traverse this in the type case as well, but how is it not reached through
 // the pointee type?
 DEF_TRAVERSE_TYPELOC(MemberPointerType, {
-  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
+  if (auto *TSI = TL.getClassTInfo())
+TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
+  else
+TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
   TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
 })
 
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -407,8 +407,8 @@
   }
 )cpp",
   R"cpp(
-  template
+  template
   struct $Class[[G]] {
 void $Method[[foo]](
 $TemplateParameter[[T]] *$Parameter[[O]]) {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet created this revision.
kadircet added a reviewer: hokein.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, 
ilya-biryukov.
Herald added a project: clang.

Only function declarations should have the default arguments.

This patch makes sure we don't propogate those arguments to out-of-line
definitions.

Fixes https://github.com/clangd/clangd/issues/221


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71187

Files:
  clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp


Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1935,6 +1935,12 @@
 template <> void foo() ;)cpp",
   "template <> void foo() { return; }",
   },
+  // Default args
+  {
+"void fo^o(int x, int y = 5, int = 2) {}",
+"void foo(int x, int y = 5, int = 2) ;",
+"void foo(int x, int y, int ) {}",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -10,6 +10,7 @@
 #include "FindTarget.h"
 #include "HeaderSourceSwitch.h"
 #include "Logger.h"
+#include "ParsedAST.h"
 #include "Path.h"
 #include "Selection.h"
 #include "SourceCode.h"
@@ -23,6 +24,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Driver/Types.h"
 #include "clang/Format/Format.h"
+#include "clang/Lex/Lexer.h"
 #include "clang/Tooling/Core/Replacement.h"
 #include "llvm/ADT/None.h"
 #include "llvm/ADT/Optional.h"
@@ -133,12 +135,13 @@
 
 // Creates a modified version of function definition that can be inserted at a
 // different location, qualifies return value and function name to achieve 
that.
-// Contains function signature, body and template parameters if applicable.
-// No need to qualify parameters, as they are looked up in the context
-// containing the function/method.
+// Contains function signature, except defaulted parameter arguments, body and
+// template parameters if applicable. No need to qualify parameters, as they 
are
+// looked up in the context containing the function/method.
 llvm::Expected
 getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace) 
{
-  auto &SM = FD->getASTContext().getSourceManager();
+  auto &AST = FD->getASTContext();
+  auto &SM = AST.getSourceManager();
   auto TargetContext = findContextForNS(TargetNamespace, FD->getDeclContext());
   if (!TargetContext)
 return llvm::createStringError(
@@ -169,14 +172,32 @@
   }
 }
 const NamedDecl *ND = Ref.Targets.front();
-const std::string Qualifier =
-getQualification(FD->getASTContext(), *TargetContext,
- SM.getLocForStartOfFile(SM.getMainFileID()), ND);
+const std::string Qualifier = getQualification(
+AST, *TargetContext, SM.getLocForStartOfFile(SM.getMainFileID()), ND);
 if (auto Err = QualifierInsertions.add(
 tooling::Replacement(SM, Ref.NameLoc, 0, Qualifier)))
   Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
   });
 
+  // Get rid of default arguments, since they should not be specified in
+  // out-of-line definition.
+  for (const auto *PVD : FD->parameters()) {
+if (PVD->hasDefaultArg()) {
+  auto DelRange = 
CharSourceRange::getTokenRange(PVD->getDefaultArgRange());
+  auto StartLoc = PVD->getLocation();
+  // If decl has a name, we want to keep it, so lex till end of token.
+  // Otherwise getLocation will be printing to '=', so we can directly use
+  // it.
+  if (!PVD->getDeclName().isEmpty())
+StartLoc =
+Lexer::getLocForEndOfToken(StartLoc, 0, SM, AST.getLangOpts());
+  DelRange.setBegin(StartLoc);
+  if (auto Err =
+  QualifierInsertions.add(tooling::Replacement(SM, DelRange, "")))
+Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
+}
+  }
+
   if (Errors)
 return std::move(Errors);
   return getFunctionSourceAfterReplacements(FD, QualifierInsertions);


Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1935,6 +1935,12 @@
 template <> void foo() ;)cpp",
   "template <> void foo() { return; }",
   },
+  // Default args
+  {
+"void fo^o(int x, int y = 5, int = 2) {}",
+"void foo(int x, int y = 5, int = 2) ;",
+"void foo(int x, int y, int ) {}",
+  },
   };

[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60606 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172



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


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Alexey Bataev via Phabricator via cfe-commits
ABataev added a comment.

In D71179#1774487 , @jdoerfert wrote:

> In D71179#1774471 , @ABataev wrote:
>
> > They do this because they have several function definitions with the same 
> > name. In our case, we have several different functions with different names 
> > and for us no need to worry about overloading resolution, the compiler will 
> > do everything for us.
>
>
> I think we talk past each other again. This is the implementation of `omp 
> begin/end declare variant` as described in TR8. Bt definition, the new 
> variant mechanism will result in several different function definitions with 
> the same name. See the two tests for examples.


I just don't get it. If begin/end is just a something like #ifdef...endif, why 
you just can't skip everything between begin/end if the context does not match?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60555 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186



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


[PATCH] D71001: [clang-tidy] New check: bugprone-misplaced-pointer-arithmetic-in-alloc

2019-12-09 Thread Whisperity via Phabricator via cfe-commits
whisperity added inline comments.



Comment at: 
clang-tools-extra/clang-tidy/bugprone/MisplacedPointerArithmeticInAllocCheck.cpp:81-82
+  diag(PtrArith->getBeginLoc(),
+   "pointer arithmetic is applied to the result of %0() instead of its "
+   "argument")
+  << Func->getName() << Hint;

baloghadamsoftware wrote:
> whisperity wrote:
> > If I put the `+ b` on `X` as in `malloc(X + b)` instead of `malloc(X) + b`, 
> > then it's not //pointer// arithmetic anymore, but (hopefully unsigned) 
> > arithmetic. Should the warning message really start with "pointer 
> > arithmetic"?
> > 
> > Maybe you could consider the check saying
> > 
> > arithmetic operation applied to pointer result of ...() instead of 
> > size-like argument
> > 
> > optionally, I'd clarify it further by putting at the end:
> > 
> > resulting in ignoring a prefix of the buffer.
> > 
> > considering you specifically match on the std(-like) allocations. (At least 
> > for now.)
> "resulting in ignoring a prefix of the buffer" <- this is only true for 
> addition. What should we write for subtraction?
You are right about subtraction. I think this message is concise as is.


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

https://reviews.llvm.org/D71001



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


[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60606 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172



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


[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60555 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 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




Comment at: 
clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp:50
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ class a(b(a::*)) class
+  )cpp"));

Could you add a comment explaining what this is testing?

Is this the case that does not have `TypeSourceInfo`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186



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


[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clang-tools-extra/clangd/unittests/TweakTests.cpp:1938
   },
+  // Default args
+  {

NIT: missing full period at the end of the comment


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein updated this revision to Diff 232782.
hokein added a comment.

address the review comment.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186

Files:
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/unittests/Tooling/CMakeLists.txt
  clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp

Index: clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
===
--- /dev/null
+++ clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
@@ -0,0 +1,55 @@
+//===- unittest/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.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 "TestVisitor.h"
+
+using namespace clang;
+
+namespace {
+
+class MemberPointerTypeLocVisitor
+: public ExpectedLocationVisitor {
+public:
+  bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
+if (!TL)
+  return true;
+Match(TL.getDecl()->getName(), TL.getNameLoc());
+return true;
+  }
+  bool VisitRecordTypeLoc(RecordTypeLoc RTL) {
+if (!RTL)
+  return true;
+Match(RTL.getDecl()->getName(), RTL.getNameLoc());
+return true;
+  }
+};
+
+TEST(RecursiveASTVisitor, VisitTypeLocInMemberPointerTypeLoc) {
+  MemberPointerTypeLocVisitor Visitor;
+  Visitor.ExpectMatch("Bar", 4, 36);
+  Visitor.ExpectMatch("T", 7, 23);
+  EXPECT_TRUE(Visitor.runOver(R"cpp(
+ class Bar { void func(int); };
+ class Foo {
+   void bind(const char*, void(Bar::*Foo)(int)) {}
+
+   template
+   void test(void(T::*Foo)());
+ };
+  )cpp"));
+}
+
+TEST(RecursiveASTVisitor, NoCrash) {
+  MemberPointerTypeLocVisitor Visitor;
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ // MemberPointerTypeLoc.getClassTInfo() is null.
+ class a(b(a::*)) class
+  )cpp"));
+}
+
+} // end anonymous namespace
Index: clang/unittests/Tooling/CMakeLists.txt
===
--- clang/unittests/Tooling/CMakeLists.txt
+++ clang/unittests/Tooling/CMakeLists.txt
@@ -42,6 +42,7 @@
   RecursiveASTVisitorTests/LambdaDefaultCapture.cpp
   RecursiveASTVisitorTests/LambdaExpr.cpp
   RecursiveASTVisitorTests/LambdaTemplateParams.cpp
+  RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
   RecursiveASTVisitorTests/NestedNameSpecifiers.cpp
   RecursiveASTVisitorTests/ParenExpr.cpp
   RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
Index: clang/include/clang/AST/RecursiveASTVisitor.h
===
--- clang/include/clang/AST/RecursiveASTVisitor.h
+++ clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1162,11 +1162,13 @@
 DEF_TRAVERSE_TYPELOC(RValueReferenceType,
  { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
 
-// FIXME: location of base class?
 // We traverse this in the type case as well, but how is it not reached through
 // the pointee type?
 DEF_TRAVERSE_TYPELOC(MemberPointerType, {
-  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
+  if (auto *TSI = TL.getClassTInfo())
+TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
+  else
+TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
   TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
 })
 
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -407,8 +407,8 @@
   }
 )cpp",
   R"cpp(
-  template
+  template
   struct $Class[[G]] {
 void $Method[[foo]](
 $TemplateParameter[[T]] *$Parameter[[O]]) {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein marked 2 inline comments as done.
hokein added inline comments.



Comment at: 
clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp:50
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ class a(b(a::*)) class
+  )cpp"));

ilya-biryukov wrote:
> Could you add a comment explaining what this is testing?
> 
> Is this the case that does not have `TypeSourceInfo`?
Yes, exactly.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186



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


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Jon Chesterfield via Phabricator via cfe-commits
JonChesterfield added inline comments.



Comment at: clang/test/OpenMP/begin_declare_variant_codegen.cpp:71
+}
+
+// Make sure all ompvariant functions return 1 and all others return 0.

The name mangling should probably append the device kind, .e.g. 
`_Z3foov.ompvariant.gpu`


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[PATCH] D70157: Align branches within 32-Byte boundary

2019-12-09 Thread Fedor Sergeev via Phabricator via cfe-commits
fedor.sergeev added a comment.

In D70157#1774561 , @skan wrote:

> I could not reproduce the phenomenon that N-byte nop becomes (N+M) bytes with 
> your example. So according to my understanding, I slightly modified your 
> case. (If my understand is wrong, I hope you can point it out :-). )
>
>   .text
>   nop
>   .Ltmp0:
>   .p2align 3, 0x90
>   .rept 16
>   nop
>   .endr
>   .Ltmp3:
>   movl  %eax, -4(%rsp)


In our case it was

  andl $1, %eax

but it does not matter that much.

>   .rept 2
>   nop
>   .endr
>   jmp .Ltmp0
> 
>   The instruction `jmp .Ltmp0` starts at byte 0x1e and ends at byte 0x20.

Again, in our particular case start of the sequence was at xxx8, so 8 + 16(our 
sequence) + 3(andl) + 5(jmp) == 32.

> If we align the jump with preifx, two prefixes will be added to the `.rept2 
> 16 nop .endr`. After prefixes are added, the 16-byte nop becomes 18-byte nop, 
> then the label '.Ltmp3' is not 8-byte aligned any more.

Yes, thats what happened.

> I doubt whether the assumption that '.Ltmp3' is 8-byte aligned is right, 
> since the alignment is not explicitly required.

The point is that we have explicit requirement at the start and we have a 
lowering into 16-byte sequence that we need to be preserved exactly as it is.
Essentially what we need is  a "protection" for this sequence from any changes 
by machinery that generates the binary code.
How can we protect a particular byte sequence from being changed by this branch 
aligner?


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

https://reviews.llvm.org/D70157



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


[clang-tools-extra] 6d5c273 - Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread Haojian Wu via cfe-commits

Author: Haojian Wu
Date: 2019-12-09T11:18:12+01:00
New Revision: 6d5c273500ad8352a061126999235aa71e0056ce

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

LOG: Reland "[AST] Traverse the class type loc inside the member type loc.""

Summary: added a unittest which causes "TL.getClassTInfo" is null.

Reviewers: ilya-biryukov

Subscribers: mgorny, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

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

Added: 
clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp

Modified: 
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
clang/include/clang/AST/RecursiveASTVisitor.h
clang/unittests/Tooling/CMakeLists.txt

Removed: 




diff  --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp 
b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index 7b880faa554c..b353c0bdb4ec 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -407,8 +407,8 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
   }
 )cpp",
   R"cpp(
-  template
+  template
   struct $Class[[G]] {
 void $Method[[foo]](
 $TemplateParameter[[T]] *$Parameter[[O]]) {

diff  --git a/clang/include/clang/AST/RecursiveASTVisitor.h 
b/clang/include/clang/AST/RecursiveASTVisitor.h
index 312f8bdf6bc8..768e2cd4bf79 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1162,11 +1162,13 @@ DEF_TRAVERSE_TYPELOC(LValueReferenceType,
 DEF_TRAVERSE_TYPELOC(RValueReferenceType,
  { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
 
-// FIXME: location of base class?
 // We traverse this in the type case as well, but how is it not reached through
 // the pointee type?
 DEF_TRAVERSE_TYPELOC(MemberPointerType, {
-  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
+  if (auto *TSI = TL.getClassTInfo())
+TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
+  else
+TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
   TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
 })
 

diff  --git a/clang/unittests/Tooling/CMakeLists.txt 
b/clang/unittests/Tooling/CMakeLists.txt
index 5cef154926ae..be641845558b 100644
--- a/clang/unittests/Tooling/CMakeLists.txt
+++ b/clang/unittests/Tooling/CMakeLists.txt
@@ -42,6 +42,7 @@ add_clang_unittest(ToolingTests
   RecursiveASTVisitorTests/LambdaDefaultCapture.cpp
   RecursiveASTVisitorTests/LambdaExpr.cpp
   RecursiveASTVisitorTests/LambdaTemplateParams.cpp
+  RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
   RecursiveASTVisitorTests/NestedNameSpecifiers.cpp
   RecursiveASTVisitorTests/ParenExpr.cpp
   RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp

diff  --git 
a/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp 
b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
new file mode 100644
index ..d30a6ad22f07
--- /dev/null
+++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
@@ -0,0 +1,55 @@
+//===- unittest/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.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 "TestVisitor.h"
+
+using namespace clang;
+
+namespace {
+
+class MemberPointerTypeLocVisitor
+: public ExpectedLocationVisitor {
+public:
+  bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
+if (!TL)
+  return true;
+Match(TL.getDecl()->getName(), TL.getNameLoc());
+return true;
+  }
+  bool VisitRecordTypeLoc(RecordTypeLoc RTL) {
+if (!RTL)
+  return true;
+Match(RTL.getDecl()->getName(), RTL.getNameLoc());
+return true;
+  }
+};
+
+TEST(RecursiveASTVisitor, VisitTypeLocInMemberPointerTypeLoc) {
+  MemberPointerTypeLocVisitor Visitor;
+  Visitor.ExpectMatch("Bar", 4, 36);
+  Visitor.ExpectMatch("T", 7, 23);
+  EXPECT_TRUE(Visitor.runOver(R"cpp(
+ class Bar { void func(int); };
+ class Foo {
+   void bind(const char*, void(Bar::*Foo)(int)) {}
+
+   template
+   void test(void(T::*Foo)());
+ };
+  )cpp"));
+}
+
+TEST(RecursiveASTVisitor, NoCrash) {
+  MemberPointerTypeLocVisitor Visitor;
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ // MemberPointerTypeLoc.getClassTInfo() is null.
+ class a(b(a::*)) class
+  )cpp"));
+}
+
+} // end anonymous namespace



___

[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
hokein marked an inline comment as done.
Closed by commit rG6d5c273500ad: Reland "[AST] Traverse the class type loc 
inside the member type loc."" (authored by hokein).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186

Files:
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
  clang/include/clang/AST/RecursiveASTVisitor.h
  clang/unittests/Tooling/CMakeLists.txt
  clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp

Index: clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
===
--- /dev/null
+++ clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
@@ -0,0 +1,55 @@
+//===- unittest/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.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 "TestVisitor.h"
+
+using namespace clang;
+
+namespace {
+
+class MemberPointerTypeLocVisitor
+: public ExpectedLocationVisitor {
+public:
+  bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
+if (!TL)
+  return true;
+Match(TL.getDecl()->getName(), TL.getNameLoc());
+return true;
+  }
+  bool VisitRecordTypeLoc(RecordTypeLoc RTL) {
+if (!RTL)
+  return true;
+Match(RTL.getDecl()->getName(), RTL.getNameLoc());
+return true;
+  }
+};
+
+TEST(RecursiveASTVisitor, VisitTypeLocInMemberPointerTypeLoc) {
+  MemberPointerTypeLocVisitor Visitor;
+  Visitor.ExpectMatch("Bar", 4, 36);
+  Visitor.ExpectMatch("T", 7, 23);
+  EXPECT_TRUE(Visitor.runOver(R"cpp(
+ class Bar { void func(int); };
+ class Foo {
+   void bind(const char*, void(Bar::*Foo)(int)) {}
+
+   template
+   void test(void(T::*Foo)());
+ };
+  )cpp"));
+}
+
+TEST(RecursiveASTVisitor, NoCrash) {
+  MemberPointerTypeLocVisitor Visitor;
+  EXPECT_FALSE(Visitor.runOver(R"cpp(
+ // MemberPointerTypeLoc.getClassTInfo() is null.
+ class a(b(a::*)) class
+  )cpp"));
+}
+
+} // end anonymous namespace
Index: clang/unittests/Tooling/CMakeLists.txt
===
--- clang/unittests/Tooling/CMakeLists.txt
+++ clang/unittests/Tooling/CMakeLists.txt
@@ -42,6 +42,7 @@
   RecursiveASTVisitorTests/LambdaDefaultCapture.cpp
   RecursiveASTVisitorTests/LambdaExpr.cpp
   RecursiveASTVisitorTests/LambdaTemplateParams.cpp
+  RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp
   RecursiveASTVisitorTests/NestedNameSpecifiers.cpp
   RecursiveASTVisitorTests/ParenExpr.cpp
   RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp
Index: clang/include/clang/AST/RecursiveASTVisitor.h
===
--- clang/include/clang/AST/RecursiveASTVisitor.h
+++ clang/include/clang/AST/RecursiveASTVisitor.h
@@ -1162,11 +1162,13 @@
 DEF_TRAVERSE_TYPELOC(RValueReferenceType,
  { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
 
-// FIXME: location of base class?
 // We traverse this in the type case as well, but how is it not reached through
 // the pointee type?
 DEF_TRAVERSE_TYPELOC(MemberPointerType, {
-  TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
+  if (auto *TSI = TL.getClassTInfo())
+TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
+  else
+TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
   TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
 })
 
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -407,8 +407,8 @@
   }
 )cpp",
   R"cpp(
-  template
+  template
   struct $Class[[G]] {
 void $Method[[foo]](
 $TemplateParameter[[T]] *$Parameter[[O]]) {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Jon Chesterfield via Phabricator via cfe-commits
JonChesterfield added inline comments.



Comment at: clang/lib/Headers/__clang_cuda_cmath.h:70
 __DEVICE__ float fmod(float __x, float __y) { return ::fmodf(__x, __y); }
-// TODO: remove when variant is supported
-#ifndef _OPENMP

jdoerfert wrote:
> As far as I can tell, `fpclassify` is not available in CUDA so it is unclear 
> if we want to have it here or not. I removed it due to the TODO above. 
> Consequently I also had to remove other `fpclassify` occurrences. If it turns 
> out the host version is not usable on the device and we need the builtins, we 
> add them back but under the opposite guard, that is `#ifdef _OPENMP`.
We could call __builtin_fpclassify for nvptx, e.g. from 
https://github.com/ROCm-Developer-Tools/aomp-extras/blob/0.7-6/aomp-device-libs/libm/src/libm-nvptx.cpp

```int fpclassify(float __x) {
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, 
FP_ZERO, __x);
}
int fpclassify(double __x) {
  return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, 
FP_ZERO, __x);
}
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[PATCH] D71186: Reland "[AST] Traverse the class type loc inside the member type loc.""

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60555 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71186



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


[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet created this revision.
kadircet added reviewers: hokein, ilya-biryukov.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay.
Herald added a project: clang.

Currently we only delete function body from declaration, in addition to
that we should also drop ctor initializers.

Unfortunately CXXConstructorDecl doesn't store the location of `:` before
initializers, therefore we make use of token buffer to figure out where to start
deletion.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71188

Files:
  clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp

Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1941,6 +1941,24 @@
 "void foo(int x, int y = 5, int = 2) ;",
 "void foo(int x, int y, int ) {}",
   },
+  // Ctor initializers.
+  {
+  R"cpp(
+  class Foo {
+int y = 2;
+F^oo() : bar(2){}
+int bar;
+int z = 2;
+  };)cpp",
+  R"cpp(
+  class Foo {
+int y = 2;
+Foo() ;
+int bar;
+int z = 2;
+  };)cpp",
+  "Foo::Foo() : bar(2){}\n",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -18,16 +18,20 @@
 #include "clang/AST/ASTTypeTraits.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclTemplate.h"
 #include "clang/AST/Stmt.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Basic/TokenKinds.h"
 #include "clang/Driver/Types.h"
 #include "clang/Format/Format.h"
 #include "clang/Lex/Lexer.h"
 #include "clang/Tooling/Core/Replacement.h"
+#include "clang/Tooling/Syntax/Tokens.h"
 #include "llvm/ADT/None.h"
 #include "llvm/ADT/Optional.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Error.h"
@@ -228,6 +232,46 @@
   return InsertionPoint{Region.EnclosingNamespace, *Offset};
 }
 
+// Returns the range that should be deleted from declaration, which always
+// contains function body. In addition to that it might contain constructor
+// initializers.
+SourceRange getDeletionRange(const FunctionDecl *FD,
+ const syntax::TokenBuffer &TokBuf) {
+  auto DeletionRange = FD->getBody()->getSourceRange();
+  if (auto *CD = llvm::dyn_cast(FD)) {
+const auto &SM = TokBuf.sourceManager();
+// AST doesn't contain the location for ":" in ctor initializers. Therefore
+// we find it by finding the first ":" before the first ctor initializer.
+SourceLocation InitStart;
+// Find the first initializer.
+for (const auto *CInit : CD->inits()) {
+  // We don't care about in-class initializers.
+  if (CInit->isInClassMemberInitializer())
+continue;
+  if (InitStart.isInvalid() ||
+  SM.isBeforeInTranslationUnit(CInit->getSourceLocation(), InitStart))
+InitStart = CInit->getSourceLocation();
+}
+if (InitStart.isValid()) {
+  auto Toks = TokBuf.expandedTokens(CD->getSourceRange());
+  // Drop any tokens after the initializer.
+  Toks = Toks.take_while([&TokBuf, &InitStart](const syntax::Token &Tok) {
+return TokBuf.sourceManager().isBeforeInTranslationUnit(Tok.location(),
+InitStart);
+  });
+  // Look for the first colon.
+  for (auto &Tok : llvm::reverse(Toks)) {
+if (Tok.kind() == tok::colon) {
+  InitStart = Tok.location();
+  break;
+}
+  }
+  DeletionRange.setBegin(InitStart);
+}
+  }
+  return DeletionRange;
+}
+
 /// Moves definition of a function/method to an appropriate implementation file.
 ///
 /// Before:
@@ -328,7 +372,8 @@
 const tooling::Replacement DeleteFuncBody(
 Sel.AST.getSourceManager(),
 CharSourceRange::getTokenRange(*toHalfOpenFileRange(
-SM, Sel.AST.getLangOpts(), Source->getBody()->getSourceRange())),
+SM, Sel.AST.getLangOpts(),
+getDeletionRange(Source, Sel.AST.getTokens(,
 ";");
 auto HeaderFE = Effect::fileEdit(SM, SM.getMainFileID(),
  tooling::Replacements(DeleteFuncBody));
___
cfe-commits mailing list
cfe-commits@lists.llvm.org

[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 232790.
kadircet added a comment.

- Add `.` after comment and fix indentation.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187

Files:
  clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp


Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1935,6 +1935,12 @@
 template <> void foo() ;)cpp",
   "template <> void foo() { return; }",
   },
+  // Default args.
+  {
+  "void fo^o(int x, int y = 5, int = 2) {}",
+  "void foo(int x, int y = 5, int = 2) ;",
+  "void foo(int x, int y, int ) {}",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -10,6 +10,7 @@
 #include "FindTarget.h"
 #include "HeaderSourceSwitch.h"
 #include "Logger.h"
+#include "ParsedAST.h"
 #include "Path.h"
 #include "Selection.h"
 #include "SourceCode.h"
@@ -23,6 +24,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Driver/Types.h"
 #include "clang/Format/Format.h"
+#include "clang/Lex/Lexer.h"
 #include "clang/Tooling/Core/Replacement.h"
 #include "llvm/ADT/None.h"
 #include "llvm/ADT/Optional.h"
@@ -133,12 +135,13 @@
 
 // Creates a modified version of function definition that can be inserted at a
 // different location, qualifies return value and function name to achieve 
that.
-// Contains function signature, body and template parameters if applicable.
-// No need to qualify parameters, as they are looked up in the context
-// containing the function/method.
+// Contains function signature, except defaulted parameter arguments, body and
+// template parameters if applicable. No need to qualify parameters, as they 
are
+// looked up in the context containing the function/method.
 llvm::Expected
 getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace) 
{
-  auto &SM = FD->getASTContext().getSourceManager();
+  auto &AST = FD->getASTContext();
+  auto &SM = AST.getSourceManager();
   auto TargetContext = findContextForNS(TargetNamespace, FD->getDeclContext());
   if (!TargetContext)
 return llvm::createStringError(
@@ -169,14 +172,32 @@
   }
 }
 const NamedDecl *ND = Ref.Targets.front();
-const std::string Qualifier =
-getQualification(FD->getASTContext(), *TargetContext,
- SM.getLocForStartOfFile(SM.getMainFileID()), ND);
+const std::string Qualifier = getQualification(
+AST, *TargetContext, SM.getLocForStartOfFile(SM.getMainFileID()), ND);
 if (auto Err = QualifierInsertions.add(
 tooling::Replacement(SM, Ref.NameLoc, 0, Qualifier)))
   Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
   });
 
+  // Get rid of default arguments, since they should not be specified in
+  // out-of-line definition.
+  for (const auto *PVD : FD->parameters()) {
+if (PVD->hasDefaultArg()) {
+  auto DelRange = 
CharSourceRange::getTokenRange(PVD->getDefaultArgRange());
+  auto StartLoc = PVD->getLocation();
+  // If decl has a name, we want to keep it, so lex till end of token.
+  // Otherwise getLocation will be printing to '=', so we can directly use
+  // it.
+  if (!PVD->getDeclName().isEmpty())
+StartLoc =
+Lexer::getLocForEndOfToken(StartLoc, 0, SM, AST.getLangOpts());
+  DelRange.setBegin(StartLoc);
+  if (auto Err =
+  QualifierInsertions.add(tooling::Replacement(SM, DelRange, "")))
+Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
+}
+  }
+
   if (Errors)
 return std::move(Errors);
   return getFunctionSourceAfterReplacements(FD, QualifierInsertions);


Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1935,6 +1935,12 @@
 template <> void foo() ;)cpp",
   "template <> void foo() { return; }",
   },
+  // Default args.
+  {
+  "void fo^o(int x, int y = 5, int = 2) {}",
+  "void foo(int x, int y = 5, int = 2) ;",
+  "void foo(int x, int y, int ) {}",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-

[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60607 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[clang] f3e6a61 - [OpenCL] Handle address space conversions for constexpr (PR44177)

2019-12-09 Thread Sven van Haastregt via cfe-commits

Author: Sven van Haastregt
Date: 2019-12-09T11:09:16Z
New Revision: f3e6a61232640f2ec78b97d44cc0b5ba12676a0d

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

LOG: [OpenCL] Handle address space conversions for constexpr (PR44177)

The AST for the constexpr.cl test contains address space conversion
nodes to cast through the implicit generic address space.  These
caused the evaluator to reject the input as constexpr in C++ for
OpenCL mode, whereas the input was considered constexpr in plain C++
mode as the AST won't have address space cast nodes then.

Fixes PR44177.

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

Added: 
clang/test/CodeGenOpenCLCXX/constexpr.cl

Modified: 
clang/lib/AST/ExprConstant.cpp
clang/test/CodeGenOpenCLCXX/address-space-deduction.cl

Removed: 




diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 5aa151984e51..fbc706b25d15 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -7118,6 +7118,13 @@ class ExprEvaluatorBase
 return false;
   return DerivedSuccess(DestValue, E);
 }
+
+case CK_AddressSpaceConversion: {
+  APValue Value;
+  if (!Evaluate(Value, Info, E->getSubExpr()))
+return false;
+  return DerivedSuccess(Value, E);
+}
 }
 
 return Error(E);

diff  --git a/clang/test/CodeGenOpenCLCXX/address-space-deduction.cl 
b/clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
index a6ae5af01eba..58502e9eecc4 100644
--- a/clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
+++ b/clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
@@ -12,17 +12,15 @@
 //COMMON: @glob = addrspace(1) global i32
 int glob;
 //PTR: @glob_p = addrspace(1) global i32 addrspace(4)* addrspacecast (i32 
addrspace(1)* @glob to i32 addrspace(4)*)
-//REF: @glob_p = addrspace(1) global i32 addrspace(4)* null
+//REF: @glob_p = addrspace(1) constant i32 addrspace(4)* addrspacecast (i32 
addrspace(1)* @glob to i32 addrspace(4)*)
 int PTR glob_p = ADR(glob);
 
 //COMMON: @_ZZ3fooi{{P|R}}U3AS4iE6loc_st = internal addrspace(1) global i32
 //PTR: @_ZZ3fooiPU3AS4iE8loc_st_p = internal addrspace(1) global i32 
addrspace(4)* addrspacecast (i32 addrspace(1)* @_ZZ3fooiPU3AS4iE6loc_st to i32 
addrspace(4)*)
-//REF: @_ZZ3fooiRU3AS4iE8loc_st_p = internal addrspace(1) global i32 
addrspace(4)* null
+//REF: @_ZZ3fooiRU3AS4iE8loc_st_p = internal addrspace(1) constant i32 
addrspace(4)* addrspacecast (i32 addrspace(1)* @_ZZ3fooiRU3AS4iE6loc_st to i32 
addrspace(4)*)
 //COMMON: @loc_ext_p = external addrspace(1) {{global|constant}} i32 
addrspace(4)*
 //COMMON: @loc_ext = external addrspace(1) global i32
 
-//REF: store i32 addrspace(4)* addrspacecast (i32 addrspace(1)* @glob to i32 
addrspace(4)*), i32 addrspace(4)* addrspace(1)* @glob_p
-
 //COMMON: define spir_func i32 @_Z3fooi{{P|R}}U3AS4i(i32 %par, i32 
addrspace(4)*{{.*}} %par_p)
 int foo(int par, int PTR par_p){
   //COMMON: %loc = alloca i32
@@ -37,7 +35,6 @@ int foo(int par, int PTR par_p){
 
   // CHECK directives for the following code are located above.
   static int loc_st;
-  //REF: store i32 addrspace(4)* addrspacecast (i32 addrspace(1)* 
@_ZZ3fooiRU3AS4iE6loc_st to i32 addrspace(4)*), i32 addrspace(4)* addrspace(1)* 
@_ZZ3fooiRU3AS4iE8loc_st_p
   static int PTR loc_st_p = ADR(loc_st);
   extern int loc_ext;
   extern int PTR loc_ext_p;

diff  --git a/clang/test/CodeGenOpenCLCXX/constexpr.cl 
b/clang/test/CodeGenOpenCLCXX/constexpr.cl
new file mode 100644
index ..b7175020b814
--- /dev/null
+++ b/clang/test/CodeGenOpenCLCXX/constexpr.cl
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -O0 
-emit-llvm -o - | FileCheck %s
+
+struct Storage final {
+  constexpr const float& operator[](const int index) const noexcept {
+return InternalStorage[index];
+  }
+
+  const float InternalStorage[1];
+};
+
+constexpr Storage getStorage() {
+  return Storage{{1.0f}};
+}
+
+constexpr float compute() {
+  constexpr auto s = getStorage();
+  return 2.0f / (s[0]);
+}
+
+constexpr float FloatConstant = compute();
+
+// CHECK-LABEL: define spir_kernel void @foo
+// CHECK: store float 2.00e+00
+kernel void foo(global float *x) {
+  *x = FloatConstant;
+}



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet added inline comments.



Comment at: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp:1018
 
+
 } // namespace

nit: empty line



Comment at: clang/lib/Parse/ParseStmtAsm.cpp:591
   std::unique_ptr MAI(
   TheTarget->createMCAsmInfo(*MRI, TT, MCOptions));
   // Get the instruction descriptor.

is it ok for MRI to be dereferenced here?



Comment at: clang/lib/Parse/ParseStmtAsm.cpp:599
+  if (!MRI || !MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";

the original bail out(no target or no tokens) doesn't seem to be emitting 
diags, are we sure we want to emit diags here? (same for the one below)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall updated this revision to Diff 232791.
sammccall added a comment.

revert random meaningless changes


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189

Files:
  clang-tools-extra/clangd/Diagnostics.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
  clang/lib/Parse/ParseStmtAsm.cpp

Index: clang/lib/Parse/ParseStmtAsm.cpp
===
--- clang/lib/Parse/ParseStmtAsm.cpp
+++ clang/lib/Parse/ParseStmtAsm.cpp
@@ -563,16 +563,19 @@
 
   assert(!LBraceLocs.empty() && "Should have at least one location here");
 
+  SmallString<512> AsmString;
+  auto EmptyStmt = [&] {
+return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, AsmString,
+  /*NumOutputs*/ 0, /*NumInputs*/ 0,
+  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+  };
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
   if (!TheTarget || AsmToks.empty()) {
-return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, StringRef(),
-  /*NumOutputs*/ 0, /*NumInputs*/ 0,
-  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+return EmptyStmt();
   }
 
   // Expand the tokens into a string buffer.
-  SmallString<512> AsmString;
   SmallVector TokOffsets;
   if (buildMSAsmString(PP, AsmLoc, AsmToks, TokOffsets, AsmString))
 return StmtError();
@@ -591,6 +594,12 @@
   std::unique_ptr MOFI(new llvm::MCObjectFileInfo());
   std::unique_ptr STI(
   TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr));
+  // Target MCTargetDesc may not be linked in clang-based tools.
+  if (!MRI || !MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
 
   llvm::SourceMgr TempSrcMgr;
   llvm::MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &TempSrcMgr);
@@ -607,6 +616,12 @@
 
   std::unique_ptr TargetParser(
   TheTarget->createMCAsmParser(*STI, *Parser, *MII, MCOptions));
+  // Target AsmParser may not be linked in clang-based tools.
+  if (!TargetParser) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target ASM parser unavailable";
+return EmptyStmt();
+  }
 
   std::unique_ptr IP(
   TheTarget->createMCInstPrinter(llvm::Triple(TT), 1, *MAI, *MII, *MRI));
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
===
--- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -19,6 +19,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/TargetSelect.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -405,6 +406,15 @@
 Not(WithFix(_);
 }
 
+TEST(ClangdTest, MSAsm) {
+  // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link.
+  // We used to crash here. Now clang emits a diagnostic, which we filter out.
+  llvm::InitializeAllTargetInfos(); // As in ClangdMain
+  auto TU = TestTU::withCode("void fn() { __asm { cmp cl,64 } }");
+  TU.ExtraArgs = {"-fms-extensions"};
+  EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
+}
+
 TEST(DiagnosticsTest, ToLSP) {
   URIForFile MainFile =
   URIForFile::canonicalize(testPath("foo/bar/main.cpp"), "");
Index: clang-tools-extra/clangd/unittests/CMakeLists.txt
===
--- clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   support
+  AllTargetsInfos
   )
 
 get_filename_component(CLANGD_SOURCE_DIR
Index: clang-tools-extra/clangd/Diagnostics.cpp
===
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -73,6 +73,13 @@
   return false;
 }
 
+bool isBlacklisted(const Diag &D) {
+  // clang will always fail to MS ASM as we don't link in desc + asm parser.
+  if (D.ID == clang::diag::err_msasm_unable_to_create_target)
+return true;
+  return false;
+}
+
 // Checks whether a location is within a half-open range.
 // Note that clang also uses closed source ranges, which this can't handle!
 bool locationInRange(SourceLocation L, CharSourceRange R,
@@ -642,7 +649,7 @@
 void StoreDiags::flushLastDiag() {
   if (!LastDiag)
 return;
-  if (mentionsMainFile(*LastDiag) &&
+  if (!isBlacklisted(*LastDiag) && mentionsMainFile(*LastDiag) &&
   (!LastDiagWasAdjusted ||
// Only report the first diagnostic coming fro

[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall created this revision.
sammccall added a reviewer: kadircet.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, 
ilya-biryukov, mgorny.
Herald added a project: clang.
sammccall updated this revision to Diff 232791.
sammccall added a comment.

revert random meaningless changes


Instead, emit a diagnostic and return an empty ASM node, as we do if the target
is missing.

Filter this diagnostic out in clangd, where it's not meaningful.

Fixes https://github.com/clangd/clangd/issues/222


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71189

Files:
  clang-tools-extra/clangd/Diagnostics.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
  clang/lib/Parse/ParseStmtAsm.cpp

Index: clang/lib/Parse/ParseStmtAsm.cpp
===
--- clang/lib/Parse/ParseStmtAsm.cpp
+++ clang/lib/Parse/ParseStmtAsm.cpp
@@ -563,16 +563,19 @@
 
   assert(!LBraceLocs.empty() && "Should have at least one location here");
 
+  SmallString<512> AsmString;
+  auto EmptyStmt = [&] {
+return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, AsmString,
+  /*NumOutputs*/ 0, /*NumInputs*/ 0,
+  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+  };
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
   if (!TheTarget || AsmToks.empty()) {
-return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, StringRef(),
-  /*NumOutputs*/ 0, /*NumInputs*/ 0,
-  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+return EmptyStmt();
   }
 
   // Expand the tokens into a string buffer.
-  SmallString<512> AsmString;
   SmallVector TokOffsets;
   if (buildMSAsmString(PP, AsmLoc, AsmToks, TokOffsets, AsmString))
 return StmtError();
@@ -591,6 +594,12 @@
   std::unique_ptr MOFI(new llvm::MCObjectFileInfo());
   std::unique_ptr STI(
   TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr));
+  // Target MCTargetDesc may not be linked in clang-based tools.
+  if (!MRI || !MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
 
   llvm::SourceMgr TempSrcMgr;
   llvm::MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &TempSrcMgr);
@@ -607,6 +616,12 @@
 
   std::unique_ptr TargetParser(
   TheTarget->createMCAsmParser(*STI, *Parser, *MII, MCOptions));
+  // Target AsmParser may not be linked in clang-based tools.
+  if (!TargetParser) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target ASM parser unavailable";
+return EmptyStmt();
+  }
 
   std::unique_ptr IP(
   TheTarget->createMCInstPrinter(llvm::Triple(TT), 1, *MAI, *MII, *MRI));
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
===
--- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -19,6 +19,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/TargetSelect.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -405,6 +406,15 @@
 Not(WithFix(_);
 }
 
+TEST(ClangdTest, MSAsm) {
+  // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link.
+  // We used to crash here. Now clang emits a diagnostic, which we filter out.
+  llvm::InitializeAllTargetInfos(); // As in ClangdMain
+  auto TU = TestTU::withCode("void fn() { __asm { cmp cl,64 } }");
+  TU.ExtraArgs = {"-fms-extensions"};
+  EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
+}
+
 TEST(DiagnosticsTest, ToLSP) {
   URIForFile MainFile =
   URIForFile::canonicalize(testPath("foo/bar/main.cpp"), "");
Index: clang-tools-extra/clangd/unittests/CMakeLists.txt
===
--- clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   support
+  AllTargetsInfos
   )
 
 get_filename_component(CLANGD_SOURCE_DIR
Index: clang-tools-extra/clangd/Diagnostics.cpp
===
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -73,6 +73,13 @@
   return false;
 }
 
+bool isBlacklisted(const Diag &D) {
+  // clang will always fail to MS ASM as we don't link in desc + asm parser.
+  if (D.ID == clang::diag::err_msasm_unable_to_create_target)
+return true;
+  return false;
+}
+
 // Checks whether a location is within a half-open range.
 // Note that clang also uses closed source ranges, which this can't handl

[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: FAILURE - Could not check out parent git hash 
"8d52e0ffa278d9047731523cc72ce605f8f336df". It was not found in the repository. 
Did you configure the "Parent Revision" in Phabricator properly? Trying to 
apply the patch to the master branch instead...

ERROR: arc patch failed with error code 1. Check build log for details.
Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71188



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


[PATCH] D71015: [OpenCL] Handle address space conversions for constexpr (PR44177)

2019-12-09 Thread Sven van Haastregt via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf3e6a6123264: [OpenCL] Handle address space conversions for 
constexpr (PR44177) (authored by svenvh).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71015

Files:
  clang/lib/AST/ExprConstant.cpp
  clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
  clang/test/CodeGenOpenCLCXX/constexpr.cl


Index: clang/test/CodeGenOpenCLCXX/constexpr.cl
===
--- /dev/null
+++ clang/test/CodeGenOpenCLCXX/constexpr.cl
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -O0 
-emit-llvm -o - | FileCheck %s
+
+struct Storage final {
+  constexpr const float& operator[](const int index) const noexcept {
+return InternalStorage[index];
+  }
+
+  const float InternalStorage[1];
+};
+
+constexpr Storage getStorage() {
+  return Storage{{1.0f}};
+}
+
+constexpr float compute() {
+  constexpr auto s = getStorage();
+  return 2.0f / (s[0]);
+}
+
+constexpr float FloatConstant = compute();
+
+// CHECK-LABEL: define spir_kernel void @foo
+// CHECK: store float 2.00e+00
+kernel void foo(global float *x) {
+  *x = FloatConstant;
+}
Index: clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
===
--- clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
+++ clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
@@ -12,17 +12,15 @@
 //COMMON: @glob = addrspace(1) global i32
 int glob;
 //PTR: @glob_p = addrspace(1) global i32 addrspace(4)* addrspacecast (i32 
addrspace(1)* @glob to i32 addrspace(4)*)
-//REF: @glob_p = addrspace(1) global i32 addrspace(4)* null
+//REF: @glob_p = addrspace(1) constant i32 addrspace(4)* addrspacecast (i32 
addrspace(1)* @glob to i32 addrspace(4)*)
 int PTR glob_p = ADR(glob);
 
 //COMMON: @_ZZ3fooi{{P|R}}U3AS4iE6loc_st = internal addrspace(1) global i32
 //PTR: @_ZZ3fooiPU3AS4iE8loc_st_p = internal addrspace(1) global i32 
addrspace(4)* addrspacecast (i32 addrspace(1)* @_ZZ3fooiPU3AS4iE6loc_st to i32 
addrspace(4)*)
-//REF: @_ZZ3fooiRU3AS4iE8loc_st_p = internal addrspace(1) global i32 
addrspace(4)* null
+//REF: @_ZZ3fooiRU3AS4iE8loc_st_p = internal addrspace(1) constant i32 
addrspace(4)* addrspacecast (i32 addrspace(1)* @_ZZ3fooiRU3AS4iE6loc_st to i32 
addrspace(4)*)
 //COMMON: @loc_ext_p = external addrspace(1) {{global|constant}} i32 
addrspace(4)*
 //COMMON: @loc_ext = external addrspace(1) global i32
 
-//REF: store i32 addrspace(4)* addrspacecast (i32 addrspace(1)* @glob to i32 
addrspace(4)*), i32 addrspace(4)* addrspace(1)* @glob_p
-
 //COMMON: define spir_func i32 @_Z3fooi{{P|R}}U3AS4i(i32 %par, i32 
addrspace(4)*{{.*}} %par_p)
 int foo(int par, int PTR par_p){
   //COMMON: %loc = alloca i32
@@ -37,7 +35,6 @@
 
   // CHECK directives for the following code are located above.
   static int loc_st;
-  //REF: store i32 addrspace(4)* addrspacecast (i32 addrspace(1)* 
@_ZZ3fooiRU3AS4iE6loc_st to i32 addrspace(4)*), i32 addrspace(4)* addrspace(1)* 
@_ZZ3fooiRU3AS4iE8loc_st_p
   static int PTR loc_st_p = ADR(loc_st);
   extern int loc_ext;
   extern int PTR loc_ext_p;
Index: clang/lib/AST/ExprConstant.cpp
===
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -7118,6 +7118,13 @@
 return false;
   return DerivedSuccess(DestValue, E);
 }
+
+case CK_AddressSpaceConversion: {
+  APValue Value;
+  if (!Evaluate(Value, Info, E->getSubExpr()))
+return false;
+  return DerivedSuccess(Value, E);
+}
 }
 
 return Error(E);


Index: clang/test/CodeGenOpenCLCXX/constexpr.cl
===
--- /dev/null
+++ clang/test/CodeGenOpenCLCXX/constexpr.cl
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -O0 -emit-llvm -o - | FileCheck %s
+
+struct Storage final {
+  constexpr const float& operator[](const int index) const noexcept {
+return InternalStorage[index];
+  }
+
+  const float InternalStorage[1];
+};
+
+constexpr Storage getStorage() {
+  return Storage{{1.0f}};
+}
+
+constexpr float compute() {
+  constexpr auto s = getStorage();
+  return 2.0f / (s[0]);
+}
+
+constexpr float FloatConstant = compute();
+
+// CHECK-LABEL: define spir_kernel void @foo
+// CHECK: store float 2.00e+00
+kernel void foo(global float *x) {
+  *x = FloatConstant;
+}
Index: clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
===
--- clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
+++ clang/test/CodeGenOpenCLCXX/address-space-deduction.cl
@@ -12,17 +12,15 @@
 //COMMON: @glob = addrspace(1) global i32
 int glob;
 //PTR: @glob_p = addrspace(1) global i32 addrspace(4)* addrspacecast (i32 addrspace(1)

[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60607 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60555 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[PATCH] D71172: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG966fac1941ea: [clang][Tooling] Fix potential UB in 
ExpandResponseFilesCompilationDatabase (authored by sammccall).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71172

Files:
  clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine.
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }


Index: clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
===
--- clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine.
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 966fac1 - [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

2019-12-09 Thread Sam McCall via cfe-commits

Author: Sam McCall
Date: 2019-12-09T12:24:23+01:00
New Revision: 966fac1941ea99e076a7654d229b27e1e6e4ad17

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

LOG: [clang][Tooling] Fix potential UB in ExpandResponseFilesCompilationDatabase

Summary:
`vector::assign` will cause UB at here.

fixes: https://github.com/clangd/clangd/issues/223

Reviewers: kadircet, sammccall, hokein

Reviewed By: sammccall

Subscribers: merge_guards_bot, ilya-biryukov, usaxena95, cfe-commits

Tags: #clang

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

Added: 


Modified: 
clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp

Removed: 




diff  --git a/clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp 
b/clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
index 84936ba05b20..99298316718b 100644
--- a/clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
+++ b/clang/lib/Tooling/ExpandResponseFilesCompilationDatabase.cpp
@@ -61,7 +61,9 @@ class ExpandResponseFilesDatabase : public 
CompilationDatabase {
   llvm::StringSaver Saver(Alloc);
   llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Argv, false, false, *FS,
 llvm::StringRef(Cmd.Directory));
-  Cmd.CommandLine.assign(Argv.begin(), Argv.end());
+  // Don't assign directly, Argv aliases CommandLine.
+  std::vector ExpandedArgv(Argv.begin(), Argv.end());
+  Cmd.CommandLine = std::move(ExpandedArgv);
 }
 return Cmds;
   }



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall marked 4 inline comments as done.
sammccall added inline comments.



Comment at: clang/lib/Parse/ParseStmtAsm.cpp:591
   std::unique_ptr MAI(
   TheTarget->createMCAsmInfo(*MRI, TT, MCOptions));
   // Get the instruction descriptor.

kadircet wrote:
> is it ok for MRI to be dereferenced here?
No :-( Fixed with yet more code
(In practice it didn't cause a problem because all these are null or not-null, 
and the function doesn't do anything if they're null)



Comment at: clang/lib/Parse/ParseStmtAsm.cpp:599
+  if (!MRI || !MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";

kadircet wrote:
> the original bail out(no target or no tokens) doesn't seem to be emitting 
> diags, are we sure we want to emit diags here? (same for the one below)
For no tokens there's no diagnostic required, the empty statement is correct.

Missing target does have a diagnostic: the if statement on line 555 will either 
set Target to non-null or emit a diagnostic.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall updated this revision to Diff 232798.
sammccall marked an inline comment as done.
sammccall added a comment.

address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189

Files:
  clang-tools-extra/clangd/Diagnostics.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
  clang/lib/Parse/ParseStmtAsm.cpp

Index: clang/lib/Parse/ParseStmtAsm.cpp
===
--- clang/lib/Parse/ParseStmtAsm.cpp
+++ clang/lib/Parse/ParseStmtAsm.cpp
@@ -563,16 +563,19 @@
 
   assert(!LBraceLocs.empty() && "Should have at least one location here");
 
+  SmallString<512> AsmString;
+  auto EmptyStmt = [&] {
+return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, AsmString,
+  /*NumOutputs*/ 0, /*NumInputs*/ 0,
+  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+  };
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
   if (!TheTarget || AsmToks.empty()) {
-return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, StringRef(),
-  /*NumOutputs*/ 0, /*NumInputs*/ 0,
-  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+return EmptyStmt();
   }
 
   // Expand the tokens into a string buffer.
-  SmallString<512> AsmString;
   SmallVector TokOffsets;
   if (buildMSAsmString(PP, AsmLoc, AsmToks, TokOffsets, AsmString))
 return StmtError();
@@ -582,6 +585,11 @@
   llvm::join(TO.Features.begin(), TO.Features.end(), ",");
 
   std::unique_ptr MRI(TheTarget->createMCRegInfo(TT));
+  if (!MRI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
   // FIXME: init MCOptions from sanitizer flags here.
   llvm::MCTargetOptions MCOptions;
   std::unique_ptr MAI(
@@ -591,6 +599,12 @@
   std::unique_ptr MOFI(new llvm::MCObjectFileInfo());
   std::unique_ptr STI(
   TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr));
+  // Target MCTargetDesc may not be linked in clang-based tools.
+  if (!MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
 
   llvm::SourceMgr TempSrcMgr;
   llvm::MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &TempSrcMgr);
@@ -607,6 +621,12 @@
 
   std::unique_ptr TargetParser(
   TheTarget->createMCAsmParser(*STI, *Parser, *MII, MCOptions));
+  // Target AsmParser may not be linked in clang-based tools.
+  if (!TargetParser) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target ASM parser unavailable";
+return EmptyStmt();
+  }
 
   std::unique_ptr IP(
   TheTarget->createMCInstPrinter(llvm::Triple(TT), 1, *MAI, *MII, *MRI));
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
===
--- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -19,6 +19,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/TargetSelect.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -405,6 +406,15 @@
 Not(WithFix(_);
 }
 
+TEST(ClangdTest, MSAsm) {
+  // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link.
+  // We used to crash here. Now clang emits a diagnostic, which we filter out.
+  llvm::InitializeAllTargetInfos(); // As in ClangdMain
+  auto TU = TestTU::withCode("void fn() { __asm { cmp cl,64 } }");
+  TU.ExtraArgs = {"-fms-extensions"};
+  EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
+}
+
 TEST(DiagnosticsTest, ToLSP) {
   URIForFile MainFile =
   URIForFile::canonicalize(testPath("foo/bar/main.cpp"), "");
Index: clang-tools-extra/clangd/unittests/CMakeLists.txt
===
--- clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   support
+  AllTargetsInfos
   )
 
 get_filename_component(CLANGD_SOURCE_DIR
Index: clang-tools-extra/clangd/Diagnostics.cpp
===
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -73,6 +73,13 @@
   return false;
 }
 
+bool isBlacklisted(const Diag &D) {
+  // clang will always fail to MS ASM as we don't link in desc + asm parser.
+  if (D.ID == clang::diag::err_msasm_unable_to_create_target)
+return true;
+  return false;
+}
+
 // Checks whether a location is within a half-open ran

[PATCH] D71193: [clang] Turn -fno-builtin flag into an IR Attribute

2019-12-09 Thread Guillaume Chatelet via Phabricator via cfe-commits
gchatelet created this revision.
gchatelet added reviewers: aaron.ballman, courbet.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This is a follow up on https://reviews.llvm.org/D61634#1742154 to turn the 
clang driver -fno-builtin flag into an IR attribute.
I also investigated pushing the attribute earlier on (in Sema) but it looks 
like this patch is simple and will cover all function calls.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71193

Files:
  clang/lib/CodeGen/CGCall.cpp
  clang/test/CodeGen/libcalls-fno-builtin.c
  clang/test/CodeGen/memccpy-libcall.c

Index: clang/test/CodeGen/memccpy-libcall.c
===
--- clang/test/CodeGen/memccpy-libcall.c
+++ clang/test/CodeGen/memccpy-libcall.c
@@ -9,4 +9,4 @@
   memccpy(d, s, c, n);
 }
 
-// CHECK: attributes #2 = { nobuiltin }
+// CHECK: attributes #2 = { nobuiltin "no-builtin-memccpy" }
Index: clang/test/CodeGen/libcalls-fno-builtin.c
===
--- clang/test/CodeGen/libcalls-fno-builtin.c
+++ clang/test/CodeGen/libcalls-fno-builtin.c
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -S -emit-llvm -fno-builtin -o - %s | FileCheck %s
+// RUN: %clang_cc1 -S -emit-llvm -fno-builtin -o - %s | FileCheck --check-prefixes=GLOBAL,CHECK %s
 // RUN: %clang_cc1 -S -emit-llvm -fno-builtin-ceil -fno-builtin-copysign -fno-builtin-cos \
 // RUN:  -fno-builtin-fabs -fno-builtin-floor -fno-builtin-strcat -fno-builtin-strncat \
 // RUN:  -fno-builtin-strchr -fno-builtin-strrchr -fno-builtin-strcmp -fno-builtin-strncmp \
@@ -6,7 +6,7 @@
 // RUN:  -fno-builtin-strpbrk -fno-builtin-strspn -fno-builtin-strtod -fno-builtin-strtof \
 // RUN:  -fno-builtin-strtold -fno-builtin-strtol -fno-builtin-strtoll -fno-builtin-strtoul \
 // RUN:  -fno-builtin-strtoull -fno-builtin-fread -fno-builtin-fwrite -fno-builtin-fopen \
-// RUN:  -o - %s | FileCheck %s
+// RUN:  -o - %s | FileCheck --check-prefixes=INDIVIDUAL,CHECK %s
 // RUN: %clang_cc1 -S -O3 -fno-builtin -o - %s | FileCheck --check-prefix=ASM %s
 // RUN: %clang_cc1 -S -O3 -fno-builtin-ceil -o - %s | FileCheck --check-prefix=ASM-INDIV %s
 
@@ -56,108 +56,109 @@
 
 double t2(double x, double y) { return copysign(x,y); }
 // CHECK-LABEL: t2
-// CHECK: call{{.*}}@copysign{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@copysign{{.*}} #2
 
 double t3(double x) { return cos(x); }
 // CHECK-LABEL: t3
-// CHECK: call{{.*}}@cos{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@cos{{.*}} #2
 
 double t4(double x) { return fabs(x); }
 // CHECK-LABEL: t4
-// CHECK: call{{.*}}@fabs{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@fabs{{.*}} #2
 
 double t5(double x) { return floor(x); }
 // CHECK-LABEL: t5
-// CHECK: call{{.*}}@floor{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@floor{{.*}} #2
 
 char *t6(char *x) { return strcat(x, ""); }
 // CHECK-LABEL: t6
-// CHECK: call{{.*}}@strcat{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strcat{{.*}} #2
 
 char *t7(char *x) { return strncat(x, "", 1); }
 // CHECK-LABEL: t7
-// CHECK: call{{.*}}@strncat{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strncat{{.*}} #2
 
 char *t8(void) { return strchr("hello, world", 'w'); }
 // CHECK-LABEL: t8
-// CHECK: call{{.*}}@strchr{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strchr{{.*}} #2
 
 char *t9(void) { return strrchr("hello, world", 'w'); }
 // CHECK-LABEL: t9
-// CHECK: call{{.*}}@strrchr{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strrchr{{.*}} #2
 
 int t10(void) { return strcmp("foo", "bar"); }
 // CHECK-LABEL: t10
-// CHECK: call{{.*}}@strcmp{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strcmp{{.*}} #2
 
 int t11(void) { return strncmp("foo", "bar", 3); }
 // CHECK-LABEL: t11
-// CHECK: call{{.*}}@strncmp{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strncmp{{.*}} #2
 
 char *t12(char *x) { return strcpy(x, "foo"); }
 // CHECK-LABEL: t12
-// CHECK: call{{.*}}@strcpy{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strcpy{{.*}} #2
 
 char *t13(char *x) { return stpcpy(x, "foo"); }
 // CHECK-LABEL: t13
-// CHECK: call{{.*}}@stpcpy{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@stpcpy{{.*}} #2
 
 char *t14(char *x) { return strncpy(x, "foo", 3); }
 // CHECK-LABEL: t14
-// CHECK: call{{.*}}@strncpy{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strncpy{{.*}} #2
 
 size_t t15(void) { return strlen("foo"); }
 // CHECK-LABEL: t15
-// CHECK: call{{.*}}@strlen{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strlen{{.*}} #2
 
 char *t16(char *x) { return strpbrk(x, ""); }
 // CHECK-LABEL: t16
-// CHECK: call{{.*}}@strpbrk{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strpbrk{{.*}} #2
 
 size_t t17(char *x) { return strspn(x, ""); }
 // CHECK-LABEL: t17
-// CHECK: call{{.*}}@strspn{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strspn{{.*}} #2
 
 double t18(char **x) { return strtod("123.4", x); }
 // CHECK-LABEL: t18
-// CHECK: call{{.*}}@strtod{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strtod{{.*}} #2
 
 float t19(char **x) { return strtof("123.4", x); }
 // CHECK-LABEL: t19
-// CHECK: call{{.*}}@strtof{{.*}} [[ATTR]]
+// CHECK: call{{.*}}@strtof{{.*}} #2
 
 lon

[PATCH] D57747: [Sema] SequenceChecker: Fix handling of operator ||, && and ?:

2019-12-09 Thread Dávid Bolvanský via Phabricator via cfe-commits
xbolva00 added a comment.

Does the whole stack of patch need to be commited at once or maybe you can land 
them individually?


Repository:
  rC Clang

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

https://reviews.llvm.org/D57747



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


[PATCH] D57660: [Sema] SequenceChecker: Handle references, members and structured bindings.

2019-12-09 Thread Dávid Bolvanský via Phabricator via cfe-commits
xbolva00 added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:12631
 
-  void VisitSequencedExpressions(Expr *SequencedBefore, Expr *SequencedAfter) {
+  void VisitSequencedExpressions(const Expr *SequencedBefore,
+ const Expr *SequencedAfter) {

You can land some NFC changes in separate commit.


Repository:
  rC Clang

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

https://reviews.llvm.org/D57660



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


[PATCH] D71190: [ARM][MVE] Add complex vector intrinsics

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60621 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71190



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


[PATCH] D49091: Warn about usage of __has_include/__has_include_next in macro expansions

2019-12-09 Thread Tor Arne Vestbø via Phabricator via cfe-commits
torarnv added a comment.

Qt fix in https://codereview.qt-project.org/c/qt/qtbase/+/284037


Repository:
  rC Clang

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

https://reviews.llvm.org/D49091



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60607 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[PATCH] D71190: [ARM][MVE] Add complex vector intrinsics

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM accepted this revision.
MarkMurrayARM added a comment.
This revision is now accepted and ready to land.

LGTM




Comment at: llvm/include/llvm/IR/IntrinsicsARM.td:932
+  def "":  Intrinsic;
+  def _predicated: Intrinsic;

I like this!!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71190



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


[PATCH] D70696: [DebugInfo] Support to emit debugInfo for extern variables

2019-12-09 Thread Jaydeep Chauhan via Phabricator via cfe-commits
Jac1494 added a comment.

For some real life case like below we need debuginfo for declaration of global 
extern variable .

$cat shlib.c
int var;
int test()
{ return var++; }

$cat test
extern int test();
extern int var;
int main()
{ var++; printf("%d\n",test()); }

If we debug above case with gdb it is not giving types of variable var.
Because of no variable DIE is there in executable.

(gdb) b main
Breakpoint 1 at 0x40063c: file test.c, line 5.
(gdb) pt var
type = 

To add variable debuginfo we need to merge below patch in code.
diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 9a3bb98..df79d46 100644

- a/clang/include/clang/Basic/TargetInfo.h

+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -1371,6 +1371,9 @@ public:

  virtual void setAuxTarget(const TargetInfo *Aux) {}

+  /// Whether target allows debuginfo types for decl only variables.
+  virtual bool allowDebugInfoForExternalVar() const { return true; }
+
protected:

  /// Copy type and layout related info.
  void copyAuxTarget(const TargetInfo *Aux);

diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp 
b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index a61c98e..92245c0 100644

- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -158,7 +158,11 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(

  if (!GV->isDefinition())
addFlag(*VariableDIE, dwarf::DW_AT_declaration);
  else

+  {
+/*Added location */
+addLocationAttribute(VariableDIE, GV, GlobalExprs);

  addGlobalName(GV->getName(), *VariableDIE, DeclContext);

+  }

  if (uint32_t AlignInBytes = GV->getAlignInBytes())
addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata,

@@ -167,9 +171,6 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(

  if (MDTuple *TP = GV->getTemplateParams())
addTemplateParams(*VariableDIE, DINodeArray(TP));

- // Add location.
- addLocationAttribute(VariableDIE, GV, GlobalExprs); - return VariableDIE; }




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70696



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet accepted this revision.
kadircet added a comment.
This revision is now accepted and ready to land.

LGTM, thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189



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


[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein added inline comments.



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:186
+if (PVD->hasDefaultArg()) {
+  auto DelRange = 
CharSourceRange::getTokenRange(PVD->getDefaultArgRange());
+  auto StartLoc = PVD->getLocation();

just curious what's the `getDefaultArgRange` for case like `void foo(int a = 
5)`, is it just `[[5]]`?



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:191
+  // it.
+  if (!PVD->getDeclName().isEmpty())
+StartLoc =

The approach seems fail on the following case,  StartLoc will point to `Foo`.

```
 class Bar { void func(int); };
 void bind(const char*, void(Bar::*Foo)(int) = nullptr)
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[clang] f7e7a5f - [Attr] Add missing header for clang example.

2019-12-09 Thread David Green via cfe-commits

Author: David Green
Date: 2019-12-09T12:50:05Z
New Revision: f7e7a5f1b6dd318d39627445c6a9ca7568d8cd61

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

LOG: [Attr] Add missing header for clang example.

The examples are easy to miss.

Added: 


Modified: 
clang/examples/AnnotateFunctions/AnnotateFunctions.cpp

Removed: 




diff  --git a/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp 
b/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp
index d201bf3df891..1724704fe124 100644
--- a/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp
+++ b/clang/examples/AnnotateFunctions/AnnotateFunctions.cpp
@@ -14,6 +14,7 @@
 #include "clang/Frontend/FrontendPluginRegistry.h"
 #include "clang/AST/AST.h"
 #include "clang/AST/ASTConsumer.h"
+#include "clang/AST/Attr.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Lex/LexDiagnostic.h"
 using namespace clang;



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


[PATCH] D70594: [clangd] Implement range patching heuristics for cross-file rename.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
sammccall accepted this revision.
sammccall added inline comments.
This revision is now accepted and ready to land.



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:452
+  for (int Pos : MatchedIndex)
+Mapped.push_back(Lexed[Pos]);
+  return MatchedCB(std::move(Mapped));

hokein wrote:
> sammccall wrote:
> > if we're actually evaluating all ranges, can we pass the index array (by 
> > reference), use it to evaluate scores, and only copy ranges for the winner?
> we could use the index array to evaluate the scores, but it would make the 
> cost API signature a bit weird, like `size_t 
> renameRangeAdjustmentCost(ArrayRef Indexed, ArrayRef Lexed, 
> ArrayRef MatchedLexedIndex);`
It's not really an API right, just a helper function exposed for testing? I 
don't think this is a a problem.



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:359
 }
-auto RenameEdit =
-buildRenameEdit(FilePath, *AffectedFileCode,
-std::move(FileAndOccurrences.second), NewName);
+auto RenameCandidates =
+adjustRenameRanges(*AffectedFileCode, RenameDecl.getNameAsString(),

nit: these are not candidates, they are `RenameRanges` or similar



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:364
+if (!RenameCandidates) {
+  return llvm::make_error(
+  llvm::formatv("Index results don't match the content of file {0} "

This is worth a comment (because the error message returned describes a 
condition that we usually recover from)



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:569
+//  possible
+llvm::Expected>
+adjustRenameRanges(llvm::StringRef DraftCode, llvm::StringRef Identifier,

why returning Expected rather than Optional here - what do we want to do with 
the message?



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:589
+llvm::inconvertibleErrorCode(),
+llvm::formatv("The number of lexed occurrences is less than indexed "
+  "occurrences"));

This message isn't meaningful outside this TU - it should be a vlog, or easier 
to understand



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:593
+  if (std::includes(Indexed.begin(), Indexed.end(), Lexed.begin(), 
Lexed.end()))
+return std::vector{Indexed.begin(), Indexed.end()};
+

return Indexed.vec()



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:618
+llvm::inconvertibleErrorCode(),
+llvm::formatv("The best near miss is not distinct"));
+  if (Best.empty())

distinct -> unique



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:622
+llvm::inconvertibleErrorCode(),
+llvm::formatv("Didn't found a near miss"));
+  return Best;

found -> find



Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:622
+llvm::inconvertibleErrorCode(),
+llvm::formatv("Didn't found a near miss"));
+  return Best;

sammccall wrote:
> found -> find
(again, these error messages are not useful to the user, as-is)



Comment at: clang-tools-extra/clangd/refactor/Rename.h:82
+/// REQUIRED: Indexed and Mapped are sorted, and have the same size.
+size_t renameRangeAdjustmentCost(ArrayRef Indexed,
+ ArrayRef Mapped);

also exposed for testing only?



Comment at: clang-tools-extra/clangd/unittests/RenameTests.cpp:866
+{
+  // both line and column are changed, not a near miss.
+  R"cpp(

can you make the new line non-empty (add a comment) and change int->double 
instead of adding whitespace? Was hard to see what's going on here


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70594



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


[PATCH] D71197: llvm premerge: clang format test

2019-12-09 Thread Mikhail Goncharov via Phabricator via cfe-commits
goncharov created this revision.
Herald added subscribers: cfe-commits, usaxena95, arphaman.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71197

Files:
  clang/tools/clang-diff/ClangDiff.cpp


Index: clang/tools/clang-diff/ClangDiff.cpp
===
--- clang/tools/clang-diff/ClangDiff.cpp
+++ clang/tools/clang-diff/ClangDiff.cpp
@@ -32,12 +32,10 @@
 cl::desc("Print the internal representation of the AST as JSON."),
 cl::init(false), cl::cat(ClangDiffCategory));
 
-static cl::opt PrintMatches("dump-matches",
-  cl::desc("Print the matched nodes."),
-  cl::init(false), cl::cat(ClangDiffCategory));
+static cl::opt PrintMatches("dump-matches", cl::desc("Print the matched 
nodes."), cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt HtmlDiff("html",
-  cl::desc("Output a side-by-side diff in HTML."),
+ cl::desc("Output a side-by-side diff in HTML."),
   cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt SourcePath(cl::Positional, cl::desc(""),
@@ -77,7 +75,9 @@
   std::make_unique(
   std::move(Compilations));
   AdjustingCompilations->appendArgumentsAdjuster(
-  getInsertArgumentAdjuster(ArgsBefore, ArgumentInsertPosition::BEGIN));
+  getInsertArgumentAdjuster(ArgsBefore,
+
+ArgumentInsertPosition::BEGIN));
   AdjustingCompilations->appendArgumentsAdjuster(
   getInsertArgumentAdjuster(ArgsAfter, ArgumentInsertPosition::END));
   Compilations = std::move(AdjustingCompilations);


Index: clang/tools/clang-diff/ClangDiff.cpp
===
--- clang/tools/clang-diff/ClangDiff.cpp
+++ clang/tools/clang-diff/ClangDiff.cpp
@@ -32,12 +32,10 @@
 cl::desc("Print the internal representation of the AST as JSON."),
 cl::init(false), cl::cat(ClangDiffCategory));
 
-static cl::opt PrintMatches("dump-matches",
-  cl::desc("Print the matched nodes."),
-  cl::init(false), cl::cat(ClangDiffCategory));
+static cl::opt PrintMatches("dump-matches", cl::desc("Print the matched nodes."), cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt HtmlDiff("html",
-  cl::desc("Output a side-by-side diff in HTML."),
+ cl::desc("Output a side-by-side diff in HTML."),
   cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt SourcePath(cl::Positional, cl::desc(""),
@@ -77,7 +75,9 @@
   std::make_unique(
   std::move(Compilations));
   AdjustingCompilations->appendArgumentsAdjuster(
-  getInsertArgumentAdjuster(ArgsBefore, ArgumentInsertPosition::BEGIN));
+  getInsertArgumentAdjuster(ArgsBefore,
+
+ArgumentInsertPosition::BEGIN));
   AdjustingCompilations->appendArgumentsAdjuster(
   getInsertArgumentAdjuster(ArgsAfter, ArgumentInsertPosition::END));
   Compilations = std::move(AdjustingCompilations);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71174: [clang-tidy] new check: bugprone-signed-char-misuse

2019-12-09 Thread Tamás Zolnai via Phabricator via cfe-commits
ztamas updated this revision to Diff 232814.
ztamas added a comment.

Fixes small things mentioned by reviewer commments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71174

Files:
  clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
  clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
  clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp
  clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/bugprone-signed-char-misuse.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  
clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse-with-option.cpp
  clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse.cpp
@@ -0,0 +1,123 @@
+// RUN: %check_clang_tidy %s bugprone-signed-char-misuse %t
+
+///
+/// Test cases correctly caught by the check.
+
+int SimpleVarDeclaration() {
+  signed char CCharacter = -5;
+  int NCharacter = CCharacter;
+  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int SimpleAssignment() {
+  signed char CCharacter = -5;
+  int NCharacter;
+  NCharacter = CCharacter;
+  // CHECK-MESSAGES: [[@LINE-1]]:16: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int CStyleCast() {
+  signed char CCharacter = -5;
+  int NCharacter;
+  NCharacter = (int)CCharacter;
+  // CHECK-MESSAGES: [[@LINE-1]]:21: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int StaticCast() {
+  signed char CCharacter = -5;
+  int NCharacter;
+  NCharacter = static_cast(CCharacter);
+  // CHECK-MESSAGES: [[@LINE-1]]:33: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int FunctionalCast() {
+  signed char CCharacter = -5;
+  int NCharacter;
+  NCharacter = int(CCharacter);
+  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int NegativeConstValue() {
+  const signed char CCharacter = -5;
+  int NCharacter = CCharacter;
+  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+int CharPointer(signed char *CCharacter) {
+  int NCharacter = *CCharacter;
+  // CHECK-MESSAGES: [[@LINE-1]]:20: warning: singed char -> integer ('int') conversion; consider to cast to unsigned char first. [bugprone-signed-char-misuse]
+
+  return NCharacter;
+}
+
+///
+/// Test cases correctly ignored by the check.
+
+int UnsignedCharCast() {
+  unsigned char CCharacter = 'a';
+  int NCharacter = CCharacter;
+
+  return NCharacter;
+}
+
+int PositiveConstValue() {
+  const signed char CCharacter = 5;
+  int NCharacter = CCharacter;
+
+  return NCharacter;
+}
+
+// singed char -> integer cast is not the direct child of declaration expression.
+int DescendantCast() {
+  signed char CCharacter = 'a';
+  int NCharacter = 10 + CCharacter;
+
+  return NCharacter;
+}
+
+// singed char -> integer cast is not the direct child of assignment expression.
+int DescendantCastAssignment() {
+  signed char CCharacter = 'a';
+  int NCharacter;
+  NCharacter = 10 + CCharacter;
+
+  return NCharacter;
+}
+
+// bool is an integer type in clang; make sure to ignore it.
+bool BoolVarDeclaration() {
+  signed char CCharacter = 'a';
+  bool BCharacter = CCharacter == 'b';
+
+  return BCharacter;
+}
+
+// bool is an integer type in clang; make sure to ignore it.
+bool BoolAssignment() {
+  signed char CCharacter = 'a';
+  bool BCharacter;
+  BCharacter = CCharacter == 'b';
+
+  return BCharacter;
+}
+
+// char is an integer type in clang; make sure to ignore it.
+unsigned char CharToCharCast() {
+  signed char SCCharacter = 'a';
+  unsigned char USCharacter;
+  USCharacter = SCCharacter;
+
+  return USCharacter;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse-with-option.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signed-char-misuse-with-o

[PATCH] D71197: llvm premerge: clang format test

2019-12-09 Thread Mikhail Goncharov via Phabricator via cfe-commits
goncharov updated this revision to Diff 232813.
goncharov added a comment.

Trigger the build


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71197

Files:
  clang/tools/clang-diff/ClangDiff.cpp


Index: clang/tools/clang-diff/ClangDiff.cpp
===
--- clang/tools/clang-diff/ClangDiff.cpp
+++ clang/tools/clang-diff/ClangDiff.cpp
@@ -32,12 +32,10 @@
 cl::desc("Print the internal representation of the AST as JSON."),
 cl::init(false), cl::cat(ClangDiffCategory));
 
-static cl::opt PrintMatches("dump-matches",
-  cl::desc("Print the matched nodes."),
-  cl::init(false), cl::cat(ClangDiffCategory));
+static cl::opt PrintMatches("dump-matches", cl::desc("Print the matched 
nodes."), cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt HtmlDiff("html",
-  cl::desc("Output a side-by-side diff in HTML."),
+ cl::desc("Output a side-by-side diff in HTML."),
   cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt SourcePath(cl::Positional, cl::desc(""),
@@ -77,7 +75,9 @@
   std::make_unique(
   std::move(Compilations));
   AdjustingCompilations->appendArgumentsAdjuster(
-  getInsertArgumentAdjuster(ArgsBefore, ArgumentInsertPosition::BEGIN));
+  getInsertArgumentAdjuster(ArgsBefore,
+
+ArgumentInsertPosition::BEGIN));
   AdjustingCompilations->appendArgumentsAdjuster(
   getInsertArgumentAdjuster(ArgsAfter, ArgumentInsertPosition::END));
   Compilations = std::move(AdjustingCompilations);


Index: clang/tools/clang-diff/ClangDiff.cpp
===
--- clang/tools/clang-diff/ClangDiff.cpp
+++ clang/tools/clang-diff/ClangDiff.cpp
@@ -32,12 +32,10 @@
 cl::desc("Print the internal representation of the AST as JSON."),
 cl::init(false), cl::cat(ClangDiffCategory));
 
-static cl::opt PrintMatches("dump-matches",
-  cl::desc("Print the matched nodes."),
-  cl::init(false), cl::cat(ClangDiffCategory));
+static cl::opt PrintMatches("dump-matches", cl::desc("Print the matched nodes."), cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt HtmlDiff("html",
-  cl::desc("Output a side-by-side diff in HTML."),
+ cl::desc("Output a side-by-side diff in HTML."),
   cl::init(false), cl::cat(ClangDiffCategory));
 
 static cl::opt SourcePath(cl::Positional, cl::desc(""),
@@ -77,7 +75,9 @@
   std::make_unique(
   std::move(Compilations));
   AdjustingCompilations->appendArgumentsAdjuster(
-  getInsertArgumentAdjuster(ArgsBefore, ArgumentInsertPosition::BEGIN));
+  getInsertArgumentAdjuster(ArgsBefore,
+
+ArgumentInsertPosition::BEGIN));
   AdjustingCompilations->appendArgumentsAdjuster(
   getInsertArgumentAdjuster(ArgsAfter, ArgumentInsertPosition::END));
   Compilations = std::move(AdjustingCompilations);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein added inline comments.



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:269
+  }
+  DeletionRange.setBegin(InitStart);
+}

There is an alternative here, I think. The end loc of `FunctionProtoTypeLoc` 
should point the location after the `)`, e.g. the `Foo()^ : `,  would it be 
easier to use it as as the `InitStart`?

it can be retrieved by `CD->getTypeSourceInfo()->getTypeLoc().getEndLoc()`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71188



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


[PATCH] D71198: [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM created this revision.
MarkMurrayARM added reviewers: simon_tatham, ostannard, dmgreen, miyuki.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya, kristof.beyls.
Herald added projects: clang, LLVM.

Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics and 
unit tests.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71198

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/test/CodeGen/arm-mve-intrinsics/vhaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vhsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqrdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vrhaddq.c
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqrdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll

Index: llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
===
--- /dev/null
+++ llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
@@ -0,0 +1,92 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_u8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s8 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8> %a, <16 x i8> %b)
+  ret <16 x i8> %0
+}
+
+declare <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_s16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16> %a, <8 x i16> %b)
+  ret <8 x i16> %0
+}
+
+declare <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_u32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s32 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32> %a, <4 x i32> %b)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32>, <4 x i32>) #1
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s8 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
+  %2 = tail call <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i1> %1, <16 x i8> %inactive)
+  ret <16 x i8> %2
+}
+
+declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1
+
+declare <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8>, <16 x i8>, <16 x i1>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_u16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s16 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
+  %2 = tail call <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i1> %1, <8 x i16> %inactive)
+  ret <8 x i16> %2
+}
+
+declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1
+
+declare <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16>, <8 x i16>, <8 x i1>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s32 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
+  %2 = tail call <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i1> %1, <4 x i32> %inactive)
+  ret <4 x i32> %2
+}
+
+declare

[PATCH] D71199: [clang-tidy] New check readability-prefer-initialization-list

2019-12-09 Thread Balogh, Ádám via Phabricator via cfe-commits
baloghadamsoftware created this revision.
baloghadamsoftware added reviewers: alexfh, aaron.ballman.
baloghadamsoftware added a project: clang-tools-extra.
Herald added subscribers: mgehre, Szelethus, rnkovacs, xazax.hun, mgorny.
Herald added a project: clang.

Finds member initializations in the constructor body which can be placed into 
the initialization list instead. This does not only improves the readability of 
the code but also affects positively its performance. Class-member assignments 
inside a control statement or following the first control statement are ignored.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D71199

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.cpp
  clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  
clang-tools-extra/docs/clang-tidy/checks/readability-prefer-initialization-list.rst
  
clang-tools-extra/test/clang-tidy/checkers/readability-prefer-initialization-list.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/readability-prefer-initialization-list.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/readability-prefer-initialization-list.cpp
@@ -0,0 +1,225 @@
+// RUN: %check_clang_tidy %s readability-prefer-initialization-list %t
+
+class Simple1 {
+  int n;
+  double x;
+
+public:
+  Simple1() {
+n = 0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: n can be initialized in the initializer list of the constructor [readability-prefer-initialization-list]
+x = 0.0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: x can be initialized in the initializer list of the constructor [readability-prefer-initialization-list]
+  }
+
+  ~Simple1() = default;
+};
+
+class Simple2 {
+  int n;
+  double x;
+
+public:
+  Simple2() : n (0) {
+x = 0.0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: x can be initialized in the initializer list of the constructor [readability-prefer-initialization-list]
+  }
+
+  ~Simple2() = default;
+};
+
+class Simple3 {
+  int n;
+  double x;
+
+public:
+  Simple3() : x (0.0) {
+n = 0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: n can be initialized in the initializer list of the constructor [readability-prefer-initialization-list]
+  }
+
+  ~Simple3() = default;
+};
+
+static bool dice();
+
+class Complex1 {
+  int n;
+  int m;
+
+public:
+  Complex1() : n(0) {
+if (dice())
+  m = 1;
+// NO-MESSAGES: initialization of m is nested in a conditional expression
+  }
+
+  ~Complex1() = default;
+};
+
+class Complex2 {
+  int n;
+  int m;
+
+public:
+  Complex2() : n(0) {
+if (!dice())
+  return;
+m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  }
+
+  ~Complex2() = default;
+};
+
+class Complex3 {
+  int n;
+  int m;
+
+public:
+  Complex3() : n(0) {
+while (dice())
+  m = 1;
+// NO-MESSAGES: initialization of m is nested in a conditional expression
+  }
+
+  ~Complex3() = default;
+};
+
+class Complex4 {
+  int n;
+  int m;
+
+public:
+  Complex4() : n(0) {
+while (!dice())
+  return;
+m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  }
+
+  ~Complex4() = default;
+};
+
+class Complex5 {
+  int n;
+  int m;
+
+public:
+  Complex5() : n(0) {
+do {
+  m = 1;
+// NO-MESSAGES: initialization of m is nested in a conditional expression
+} while (dice());
+  }
+
+  ~Complex5() = default;
+};
+
+class Complex6 {
+  int n;
+  int m;
+
+public:
+  Complex6() : n(0) {
+do {
+  return;
+} while (!dice());
+m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  }
+
+  ~Complex6() = default;
+};
+
+class Complex7 {
+  int n;
+  int m;
+
+public:
+  Complex7() : n(0) {
+switch (dice()) {
+case 1:
+  m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  break;
+default:
+  break;
+}
+  }
+
+  ~Complex7() = default;
+};
+
+class Complex8 {
+  int n;
+  int m;
+
+public:
+  Complex8() : n(0) {
+switch (dice()) {
+case 1:
+  return;
+  break;
+default:
+  break;
+}
+m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  }
+
+  ~Complex8() = default;
+};
+
+class E {};
+void risky(); // may throw
+
+class Complex9 {
+  int n;
+  int m;
+
+public:
+  Complex9() : n(0) {
+try {
+  risky();
+  m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+} catch (const E& e) {
+  return;
+}
+  }
+
+  ~Complex9() = default;
+};
+
+class Complex10 {
+  int n;
+  int m;
+
+public:
+  Complex10() : n(0) {
+try {
+  risky();
+} catch (const E& e) {
+  return;
+}
+ 

[PATCH] D71190: [ARM][MVE] Add complex vector intrinsics

2019-12-09 Thread Dave Green via Phabricator via cfe-commits
dmgreen added inline comments.



Comment at: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:2537
+/// Convert an SDValue to a boolean value. SDVal must be a compile-time 
constant
+static bool SDValueToConstBool(SDValue SDVal) {
+  ConstantSDNode *SDValConstant = dyn_cast(SDVal);

How come there is so much C++ code here, as opposed to using tablegen like all 
the other intrinsics?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71190



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


[PATCH] D71062: [ARM][MVE] Add vector reduction intrinsics with two vector operands

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM accepted this revision.
MarkMurrayARM added a comment.
This revision is now accepted and ready to land.

This looks scary and fragile, but it seems to work, so OK.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71062



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


[PATCH] D71199: [clang-tidy] New check readability-prefer-initialization-list

2019-12-09 Thread Sylvestre Ledru via Phabricator via cfe-commits
sylvestre.ledru added a comment.

> affects positively its performance.

Interesting! Do you have some numbers you could share? thanks


Repository:
  rCTE Clang Tools Extra

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

https://reviews.llvm.org/D71199



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


[PATCH] D71198: [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM updated this revision to Diff 232820.
MarkMurrayARM added a comment.

Fix long lines.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71198

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/test/CodeGen/arm-mve-intrinsics/vhaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vhsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqrdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vrhaddq.c
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqrdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll

Index: llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
===
--- /dev/null
+++ llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
@@ -0,0 +1,92 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_u8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s8 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8> %a, <16 x i8> %b)
+  ret <16 x i8> %0
+}
+
+declare <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_s16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16> %a, <8 x i16> %b)
+  ret <8 x i16> %0
+}
+
+declare <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_u32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s32 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32> %a, <4 x i32> %b)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32>, <4 x i32>) #1
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s8 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
+  %2 = tail call <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i1> %1, <16 x i8> %inactive)
+  ret <16 x i8> %2
+}
+
+declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1
+
+declare <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8>, <16 x i8>, <16 x i1>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_u16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s16 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
+  %2 = tail call <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i1> %1, <8 x i16> %inactive)
+  ret <8 x i16> %2
+}
+
+declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1
+
+declare <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16>, <8 x i16>, <8 x i1>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s32 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
+  %2 = tail call <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i1> %1, <4 x i32> %inactive)
+  ret <4 x i32> %2
+}
+
+declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) #1
+
+declare <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>) #

[PATCH] D70157: Align branches within 32-Byte boundary

2019-12-09 Thread annita.zhang via Phabricator via cfe-commits
annita.zhang added a comment.

> The point is that we have explicit requirement at the start and we have a 
> lowering into 16-byte sequence that we need to be preserved exactly as it is.
>  Essentially what we need is  a "protection" for this sequence from any 
> changes by machinery that generates the binary code.
>  How can we protect a particular byte sequence from being changed by this 
> branch aligner?

No, we can't. The current solution is based on assembler to insert prefix or 
nop before the cross (or against) boundary branches. It can only ensure the 
explicit alignment specified by directive, but not any implicit alignment. I 
don't think any fixup based on assembler can do it. On the other hand, any code 
sequence after the alignment directive or even just in a function has some kind 
of implicit alignment. It's hard for assembler to tell which implicit alignment 
to preserve. The preferred way is to use explicit alignment directive to 
specify it.


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

https://reviews.llvm.org/D70157



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


[PATCH] D70480: [clangd] Use expansion location when the ref is inside macros.

2019-12-09 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clang-tools-extra/clangd/index/SymbolCollector.cpp:280
   (Roles & static_cast(index::SymbolRole::Reference)) &&
-  SM.getFileID(SpellingLoc) == SM.getMainFileID())
+  SM.getFileID(SM.getSpellingLoc(Loc)) == SM.getMainFileID())
 ReferencedDecls.insert(ND);

ilya-biryukov wrote:
> hokein wrote:
> > ilya-biryukov wrote:
> > > hokein wrote:
> > > > ilya-biryukov wrote:
> > > > > We're using `getSpellingLoc` here and `getFileLoc` later. Why not use 
> > > > > `getFileLoc` everywhere?
> > > > > 
> > > > > Having a variable (similar to the `SpellingLoc` we had before) and 
> > > > > calling `getFileLoc` only once also seems preferable.
> > > > > We're using getSpellingLoc here and getFileLoc later. Why not use 
> > > > > getFileLoc everywhere?
> > > > 
> > > > There are two things in SymbolCollector:
> > > > - symbols & ranking signals, we use spelling location for them, the 
> > > > code is part of this, `ReferencedDecls` is used to calculate the ranking
> > > > - references
> > > > 
> > > > this patch only targets the reference part (changing the loc here would 
> > > > break many assumptions I think, and there was a failure test).
> > > - What are the assumptions that it will break?
> > > - What is rationale for using spelling locations for ranking and file 
> > > location for references?
> > > 
> > > It would be nice to have this spelled out somewhere in the code, too. 
> > > Currently this looks like an accidental inconsistency. Especially given 
> > > that `getFileLoc` and `getSpellingLoc` are often the same.
> > Added comments to clarify the difference between references and other 
> > fields. 
> The comment still does not explain *why* we do this.
> Why not use the same type of locations for everything?
Update after offline discussion:
there does not seem to be any good reason to use spelling locations and not 
file locations here. Some reference counts will be affected, but only those 
that end up being spelled in the macros inside the main file and used outside 
the main file. Which is very rare and shouldn't affect completion ranking much.

We should definitely try switching to file locations everywhere, but that means 
doing more changes. Therefore, it's more appropriate to do it in the follow-up 
change.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70480



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


[PATCH] D71198: [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics.

2019-12-09 Thread Dave Green via Phabricator via cfe-commits
dmgreen added a comment.

Looks nice and clean. I just think we can come up with a better name than 
adding a _ on the end of it!




Comment at: llvm/lib/Target/ARM/ARMInstrMVE.td:1591
 
-class MVE_VQxDMULH size, bit rounding,
+class MVE_VQxDMULH_ size, bit rounding,
   list pattern=[]>

Maybe MVE_VQxDMULH_Base or MVE_VQxDMULHInst or something like it



Comment at: llvm/lib/Target/ARM/ARMInstrMVE.td:1806
 
-class MVE_VRHADD size, list pattern=[]>
+class MVE_VRHADD_ size, list pattern=[]>
   : MVE_int<"vrhadd", suffix, size, pattern> {

Again, better name please.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71198



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


[PATCH] D70480: [clangd] Use expansion location when the ref is inside macros.

2019-12-09 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/D70480/new/

https://reviews.llvm.org/D70480



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


[PATCH] D71197: llvm premerge: clang format test

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60624 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71197



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


[PATCH] D62731: Add support for options -frounding-math, -ftrapping-math, -ffp-model=, and -ffp-exception-behavior=, : Specify floating point behavior

2019-12-09 Thread Melanie Blower via Phabricator via cfe-commits
mibintc added a comment.

In D62731#1773854 , @michele.scandale 
wrote:

> I've noticed you removed the change for `CompilerInvocation.cpp` about the 
> initialization of the codegen option `NoTrappingMath`. Was that an accident?


I checked the old and new version of the patch and it seems like initialization 
of NoTrappingMath is unchanged, the definition of the option has it default to 
0, and CompilerInvocation.cpp sets it like this in ParseLangArgs, was it 
something else you were looking at?
 Opts.NoTrappingMath = Args.hasArg(OPT_fno_trapping_math);


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D62731



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


[PATCH] D71201: [ObjC][DWARF] Emit DW_AT_APPLE_objc_direct for methods marked as __attribute__((objc_direct))

2019-12-09 Thread Raphael Isemann via Phabricator via cfe-commits
teemperor created this revision.
teemperor added a reviewer: aprantl.
Herald added subscribers: llvm-commits, cfe-commits, hiraditya.
Herald added projects: clang, LLVM.

With DWARF5 it is no longer possible to distinguish normal methods and methods 
with `__attribute__((objc_direct))` by just looking at the debug information
as they are both now children of the of the DW_TAG_structure_type that defines 
them (before only the `__attribute__((objc_direct))` methods were children).

This means that in LLDB we are no longer able to create a correct Clang AST of 
a module by just looking at the debug information. Instead we would
need to call the Objective-C runtime to see which of the methods have a 
`__attribute__((objc_direct))` and then add the attribute to our own Clang AST
depending on what the runtime returns. This would mean that we either let the 
module AST be dependent on the Objective-C runtime (which doesn't
seem right) or we retroactively add the missing attribute to the imported AST 
in our expressions.

A third option is to annotate methods with `__attribute__((objc_direct))` as 
`DW_AT_APPLE_objc_direct` which is what this patch implements. This way
LLDB doesn't have to call the runtime for any `__attribute__((objc_direct))` 
method and the AST in our module will already be correct when we create it.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71201

Files:
  clang/lib/CodeGen/CGDebugInfo.cpp
  clang/test/CodeGenObjC/debug-info-direct-method.m
  llvm/include/llvm/BinaryFormat/Dwarf.def
  llvm/include/llvm/IR/DebugInfoFlags.def
  llvm/include/llvm/IR/DebugInfoMetadata.h
  llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
  llvm/test/DebugInfo/X86/objc_direct.ll

Index: llvm/test/DebugInfo/X86/objc_direct.ll
===
--- /dev/null
+++ llvm/test/DebugInfo/X86/objc_direct.ll
@@ -0,0 +1,122 @@
+; RUN: llc < %s -filetype=obj -o %t
+; RUN: llvm-dwarfdump -v %t | FileCheck %s
+
+; Source code to regenerate:
+; __attribute__((objc_root_class))
+; @interface Root
+; - (int)direct_method __attribute__((objc_direct));
+; @end
+;
+; @implementation Root
+; - (int)direct_method __attribute__((objc_direct)) {
+;   return 42;
+; }
+; @end
+;
+; clang -O0 -g -gdwarf-5 direct.m -c
+
+; CHECK: DW_TAG_subprogram [3]
+; CHECK: DW_AT_APPLE_objc_direct
+; CHECK-SAME: DW_FORM_flag_present
+; CHECK: DW_TAG_formal_parameter [4]
+
+; ModuleID = 'direct.bc'
+source_filename = "direct.m"
+target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.15.0"
+
+%0 = type opaque
+%struct._objc_cache = type opaque
+%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* }
+%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
+%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] }
+%struct._objc_method = type { i8*, i8*, i8* }
+%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] }
+%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8**, i8*, %struct._prop_list_t* }
+%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
+%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 }
+%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] }
+%struct._prop_t = type { i8*, i8* }
+
+@_objc_empty_cache = external global %struct._objc_cache
+@"OBJC_CLASS_$_Root" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Root", %struct._class_t* null, %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"_OBJC_CLASS_RO_$_Root" }, section "__DATA, __objc_data", align 8
+@"OBJC_METACLASS_$_Root" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Root", %struct._class_t* @"OBJC_CLASS_$_Root", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"_OBJC_METACLASS_RO_$_Root" }, section "__DATA, __objc_data", align 8
+@OBJC_CLASS_NAME_ = private unnamed_addr constant [5 x i8] c"Root\00", section "__TEXT,__objc_classname,cstring_literals", align 1
+@"_OBJC_METACLASS_RO_$_Root" = internal global %struct._class_ro_t { i32 3, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
+@"_OBJC_CLASS_RO_$_Root" = internal global %struct._class_ro_t { i32 2, i32 0, i32 0, i8* null, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._i

[clang] 94603ec - [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via cfe-commits

Author: Sam McCall
Date: 2019-12-09T14:34:31+01:00
New Revision: 94603ec11b55ca22b5dbebcfca5e83f313b632e3

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

LOG: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked 
in.

Summary:
Instead, emit a diagnostic and return an empty ASM node, as we do if the target
is missing.

Filter this diagnostic out in clangd, where it's not meaningful.

Fixes https://github.com/clangd/clangd/issues/222

Reviewers: kadircet

Subscribers: mgorny, ilya-biryukov, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

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

Added: 


Modified: 
clang-tools-extra/clangd/Diagnostics.cpp
clang-tools-extra/clangd/unittests/CMakeLists.txt
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
clang/lib/Parse/ParseStmtAsm.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/Diagnostics.cpp 
b/clang-tools-extra/clangd/Diagnostics.cpp
index cd95807162bc..f97191196e7b 100644
--- a/clang-tools-extra/clangd/Diagnostics.cpp
+++ b/clang-tools-extra/clangd/Diagnostics.cpp
@@ -73,6 +73,13 @@ bool mentionsMainFile(const Diag &D) {
   return false;
 }
 
+bool isBlacklisted(const Diag &D) {
+  // clang will always fail to MS ASM as we don't link in desc + asm parser.
+  if (D.ID == clang::diag::err_msasm_unable_to_create_target)
+return true;
+  return false;
+}
+
 // Checks whether a location is within a half-open range.
 // Note that clang also uses closed source ranges, which this can't handle!
 bool locationInRange(SourceLocation L, CharSourceRange R,
@@ -642,7 +649,7 @@ void StoreDiags::HandleDiagnostic(DiagnosticsEngine::Level 
DiagLevel,
 void StoreDiags::flushLastDiag() {
   if (!LastDiag)
 return;
-  if (mentionsMainFile(*LastDiag) &&
+  if (!isBlacklisted(*LastDiag) && mentionsMainFile(*LastDiag) &&
   (!LastDiagWasAdjusted ||
// Only report the first diagnostic coming from each particular header.
IncludeLinesWithErrors.insert(LastDiag->Range.start.line).second)) {

diff  --git a/clang-tools-extra/clangd/unittests/CMakeLists.txt 
b/clang-tools-extra/clangd/unittests/CMakeLists.txt
index d2a689056ecd..f8b24c606962 100644
--- a/clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ b/clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   support
+  AllTargetsInfos
   )
 
 get_filename_component(CLANGD_SOURCE_DIR

diff  --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp 
b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index 3c0257849021..0941af25213c 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -19,6 +19,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/TargetSelect.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -405,6 +406,15 @@ TEST(DiagnosticsTest, NoFixItInMacro) {
 Not(WithFix(_);
 }
 
+TEST(ClangdTest, MSAsm) {
+  // Parsing MS assembly tries to use the target MCAsmInfo, which we don't 
link.
+  // We used to crash here. Now clang emits a diagnostic, which we filter out.
+  llvm::InitializeAllTargetInfos(); // As in ClangdMain
+  auto TU = TestTU::withCode("void fn() { __asm { cmp cl,64 } }");
+  TU.ExtraArgs = {"-fms-extensions"};
+  EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
+}
+
 TEST(DiagnosticsTest, ToLSP) {
   URIForFile MainFile =
   URIForFile::canonicalize(testPath("foo/bar/main.cpp"), "");

diff  --git a/clang/lib/Parse/ParseStmtAsm.cpp 
b/clang/lib/Parse/ParseStmtAsm.cpp
index 6b301667d3f2..98133aaf67af 100644
--- a/clang/lib/Parse/ParseStmtAsm.cpp
+++ b/clang/lib/Parse/ParseStmtAsm.cpp
@@ -563,16 +563,19 @@ StmtResult 
Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
 
   assert(!LBraceLocs.empty() && "Should have at least one location here");
 
+  SmallString<512> AsmString;
+  auto EmptyStmt = [&] {
+return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, AsmString,
+  /*NumOutputs*/ 0, /*NumInputs*/ 0,
+  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+  };
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
   if (!TheTarget || AsmToks.empty()) {
-return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, StringRef(),
-  /*NumOutputs*/ 0, /*NumInputs*/ 0,
-  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+return EmptyStmt();
   }
 
   // Expand the tokens into a string buffer.
-  SmallString

[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 232823.
kadircet marked 4 inline comments as done.
kadircet added a comment.

- Make use of token buffer instead of trying to go-over identifier name.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187

Files:
  clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp

Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1935,6 +1935,12 @@
 template <> void foo() ;)cpp",
   "template <> void foo() { return; }",
   },
+  // Default args.
+  {
+  "void fo^o(int x, int y = 5, int = 2, int (*foo)(int) = nullptr) {}",
+  "void foo(int x, int y = 5, int = 2, int (*foo)(int) = nullptr) ;",
+  "void foo(int x, int y , int , int (*foo)(int) ) {}",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -10,6 +10,7 @@
 #include "FindTarget.h"
 #include "HeaderSourceSwitch.h"
 #include "Logger.h"
+#include "ParsedAST.h"
 #include "Path.h"
 #include "Selection.h"
 #include "SourceCode.h"
@@ -21,11 +22,15 @@
 #include "clang/AST/Stmt.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Basic/TokenKinds.h"
 #include "clang/Driver/Types.h"
 #include "clang/Format/Format.h"
+#include "clang/Lex/Lexer.h"
 #include "clang/Tooling/Core/Replacement.h"
+#include "clang/Tooling/Syntax/Tokens.h"
 #include "llvm/ADT/None.h"
 #include "llvm/ADT/Optional.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Error.h"
@@ -133,12 +138,14 @@
 
 // Creates a modified version of function definition that can be inserted at a
 // different location, qualifies return value and function name to achieve that.
-// Contains function signature, body and template parameters if applicable.
-// No need to qualify parameters, as they are looked up in the context
-// containing the function/method.
+// Contains function signature, except defaulted parameter arguments, body and
+// template parameters if applicable. No need to qualify parameters, as they are
+// looked up in the context containing the function/method.
 llvm::Expected
-getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace) {
-  auto &SM = FD->getASTContext().getSourceManager();
+getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace,
+  const syntax::TokenBuffer &TokBuf) {
+  auto &AST = FD->getASTContext();
+  auto &SM = AST.getSourceManager();
   auto TargetContext = findContextForNS(TargetNamespace, FD->getDeclContext());
   if (!TargetContext)
 return llvm::createStringError(
@@ -169,14 +176,38 @@
   }
 }
 const NamedDecl *ND = Ref.Targets.front();
-const std::string Qualifier =
-getQualification(FD->getASTContext(), *TargetContext,
- SM.getLocForStartOfFile(SM.getMainFileID()), ND);
+const std::string Qualifier = getQualification(
+AST, *TargetContext, SM.getLocForStartOfFile(SM.getMainFileID()), ND);
 if (auto Err = QualifierInsertions.add(
 tooling::Replacement(SM, Ref.NameLoc, 0, Qualifier)))
   Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
   });
 
+  // Get rid of default arguments, since they should not be specified in
+  // out-of-line definition.
+  for (const auto *PVD : FD->parameters()) {
+if (PVD->hasDefaultArg()) {
+  // Deletion range initially spans the initializer, excluding the `=`.
+  auto DelRange = CharSourceRange::getTokenRange(PVD->getDefaultArgRange());
+  // Get all tokens before the default argument.
+  auto Tokens = TokBuf.expandedTokens(PVD->getSourceRange())
+.take_while([&SM, &DelRange](const syntax::Token &Tok) {
+  return SM.isBeforeInTranslationUnit(
+  Tok.location(), DelRange.getBegin());
+});
+  // Find the last `=` before the default arg.
+  for (auto &Tok : llvm::reverse(Tokens)) {
+if (Tok.kind() != tok::equal)
+  continue;
+DelRange.setBegin(Tok.location());
+break;
+  }
+  if (auto Err =
+  QualifierInsertions.add(tooling::Replacement(SM, DelRange, "")))
+Errors = llvm::joinErrors(std::move(Errors), std::move(Err));
+}
+  }
+
   if (Errors)
 return std::move(Errors);
  

[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet added inline comments.



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:186
+if (PVD->hasDefaultArg()) {
+  auto DelRange = 
CharSourceRange::getTokenRange(PVD->getDefaultArgRange());
+  auto StartLoc = PVD->getLocation();

hokein wrote:
> just curious what's the `getDefaultArgRange` for case like `void foo(int a = 
> 5)`, is it just `[[5]]`?
yes it is the range of the initializer.



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:191
+  // it.
+  if (!PVD->getDeclName().isEmpty())
+StartLoc =

hokein wrote:
> The approach seems fail on the following case,  StartLoc will point to `Foo`.
> 
> ```
>  class Bar { void func(int); };
>  void bind(const char*, void(Bar::*Foo)(int) = nullptr)
> ```
ah, right. switching to a similar strategy as D71188 to find first `=` before 
initializer.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Hal Finkel via Phabricator via cfe-commits
hfinkel added a comment.

In D71179#1774678 , @ABataev wrote:

> In D71179#1774487 , @jdoerfert wrote:
>
> > In D71179#1774471 , @ABataev wrote:
> >
> > > They do this because they have several function definitions with the same 
> > > name. In our case, we have several different functions with different 
> > > names and for us no need to worry about overloading resolution, the 
> > > compiler will do everything for us.
> >
> >
> > I think we talk past each other again. This is the implementation of `omp 
> > begin/end declare variant` as described in TR8. Bt definition, the new 
> > variant mechanism will result in several different function definitions 
> > with the same name. See the two tests for examples.
>
>
> I just don't get it. If begin/end is just a something like #ifdef...endif, 
> why you just can't skip everything between begin/end if the context does not 
> match?


The patch does this (see in ParseOpenMP.cpp where I asked about the potential 
inf-loop). But when the definitions are not skipped, then we have to worry 
about having multiple decls/defs of the same name and the overload priorities.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[PATCH] D71189: [Parser] Don't crash on MS assembly if target desc/asm parser isn't linked in.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG94603ec11b55: [Parser] Don't crash on MS assembly if 
target desc/asm parser isn't linked in. (authored by sammccall).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71189

Files:
  clang-tools-extra/clangd/Diagnostics.cpp
  clang-tools-extra/clangd/unittests/CMakeLists.txt
  clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
  clang/lib/Parse/ParseStmtAsm.cpp

Index: clang/lib/Parse/ParseStmtAsm.cpp
===
--- clang/lib/Parse/ParseStmtAsm.cpp
+++ clang/lib/Parse/ParseStmtAsm.cpp
@@ -563,16 +563,19 @@
 
   assert(!LBraceLocs.empty() && "Should have at least one location here");
 
+  SmallString<512> AsmString;
+  auto EmptyStmt = [&] {
+return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, AsmString,
+  /*NumOutputs*/ 0, /*NumInputs*/ 0,
+  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+  };
   // If we don't support assembly, or the assembly is empty, we don't
   // need to instantiate the AsmParser, etc.
   if (!TheTarget || AsmToks.empty()) {
-return Actions.ActOnMSAsmStmt(AsmLoc, LBraceLocs[0], AsmToks, StringRef(),
-  /*NumOutputs*/ 0, /*NumInputs*/ 0,
-  ConstraintRefs, ClobberRefs, Exprs, EndLoc);
+return EmptyStmt();
   }
 
   // Expand the tokens into a string buffer.
-  SmallString<512> AsmString;
   SmallVector TokOffsets;
   if (buildMSAsmString(PP, AsmLoc, AsmToks, TokOffsets, AsmString))
 return StmtError();
@@ -582,6 +585,11 @@
   llvm::join(TO.Features.begin(), TO.Features.end(), ",");
 
   std::unique_ptr MRI(TheTarget->createMCRegInfo(TT));
+  if (!MRI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
   // FIXME: init MCOptions from sanitizer flags here.
   llvm::MCTargetOptions MCOptions;
   std::unique_ptr MAI(
@@ -591,6 +599,12 @@
   std::unique_ptr MOFI(new llvm::MCObjectFileInfo());
   std::unique_ptr STI(
   TheTarget->createMCSubtargetInfo(TT, TO.CPU, FeaturesStr));
+  // Target MCTargetDesc may not be linked in clang-based tools.
+  if (!MAI || !MII | !MOFI || !STI) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target MC unavailable";
+return EmptyStmt();
+  }
 
   llvm::SourceMgr TempSrcMgr;
   llvm::MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &TempSrcMgr);
@@ -607,6 +621,12 @@
 
   std::unique_ptr TargetParser(
   TheTarget->createMCAsmParser(*STI, *Parser, *MII, MCOptions));
+  // Target AsmParser may not be linked in clang-based tools.
+  if (!TargetParser) {
+Diag(AsmLoc, diag::err_msasm_unable_to_create_target)
+<< "target ASM parser unavailable";
+return EmptyStmt();
+  }
 
   std::unique_ptr IP(
   TheTarget->createMCInstPrinter(llvm::Triple(TT), 1, *MAI, *MII, *MRI));
Index: clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
===
--- clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -19,6 +19,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticSema.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/TargetSelect.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include 
@@ -405,6 +406,15 @@
 Not(WithFix(_);
 }
 
+TEST(ClangdTest, MSAsm) {
+  // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link.
+  // We used to crash here. Now clang emits a diagnostic, which we filter out.
+  llvm::InitializeAllTargetInfos(); // As in ClangdMain
+  auto TU = TestTU::withCode("void fn() { __asm { cmp cl,64 } }");
+  TU.ExtraArgs = {"-fms-extensions"};
+  EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
+}
+
 TEST(DiagnosticsTest, ToLSP) {
   URIForFile MainFile =
   URIForFile::canonicalize(testPath("foo/bar/main.cpp"), "");
Index: clang-tools-extra/clangd/unittests/CMakeLists.txt
===
--- clang-tools-extra/clangd/unittests/CMakeLists.txt
+++ clang-tools-extra/clangd/unittests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(LLVM_LINK_COMPONENTS
   support
+  AllTargetsInfos
   )
 
 get_filename_component(CLANGD_SOURCE_DIR
Index: clang-tools-extra/clangd/Diagnostics.cpp
===
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -73,6 +73,13 @@
   return false;
 }
 
+bool isBlacklisted(const Diag &D) {
+  // clang will always fail to MS ASM as we don't link in desc + asm parser.
+  if (D.ID == clang::diag::err_msasm_unable_to_create_target)
+return true;
+  

[PATCH] D71187: [clangd] Delete default arguments while moving functions out-of-line

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60555 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71187



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


[PATCH] D71199: [clang-tidy] New check readability-prefer-initialization-list

2019-12-09 Thread Whisperity via Phabricator via cfe-commits
whisperity added a comment.

Can you refresh my memory on whether a rule for "if init expr is constant, 
initialise in class body instead" exists for init list members? If so, this 
will be a funny "two pass needed to fix" kind of check.




Comment at: 
clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.cpp:19
+
+static bool isControlStatement(const Stmt *S) {
+  return isa(S) ||

I'm working on a checker which has the need for similarly knowing occurrences 
of "control flow breaking statements". How about `goto` and calling a 
`[[noreturn]]` function, such as (`std::`)`longjmp`? Or there is no point in 
matching such in your checker?



Comment at: 
clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.cpp:71
+const MatchFinder::MatchResult &Result) {
+  // FIXME: Add callback implementation.
+  const auto *Ctor = Result.Nodes.getNodeAs("ctor");

FIXME remained. Did you upload the right patch set?



Comment at: 
clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.cpp:85
+if (const NamedDecl* Mbr = isAssignmentToMemberOf(Class, S)) {
+  diag(S->getBeginLoc(), "%0 can be initialized in the initializer list"
+   " of the constructor") << Mbr->getName();

can -> should?



Comment at: 
clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.h:18
+
+/// FIXME: Write a short description.
+///

FIXME remained here.



Comment at: 
clang-tools-extra/docs/clang-tidy/checks/readability-prefer-initialization-list.rst:7
+Finds member initializations in the constructor body which can be placed into
+the initialization list instead. This does not only improves the readability of
+the code but also affects positively its performance. Class-member assignments

improves -> improve



Comment at: 
clang-tools-extra/docs/clang-tidy/checks/readability-prefer-initialization-list.rst:8
+the initialization list instead. This does not only improves the readability of
+the code but also affects positively its performance. Class-member assignments
+inside a control statement or following the first control statement are 
ignored.

word order: also positively affects



Comment at: 
clang-tools-extra/docs/clang-tidy/checks/readability-prefer-initialization-list.rst:27
+
+Here ``n`` can be initialized in the construcotr list, but ``m`` not, because
+its initialization follow a control statement (``if``):

typo: construcotr



Comment at: 
clang-tools-extra/docs/clang-tidy/checks/readability-prefer-initialization-list.rst:27-28
+
+Here ``n`` can be initialized in the construcotr list, but ``m`` not, because
+its initialization follow a control statement (``if``):
+

whisperity wrote:
> typo: construcotr
[l]ist, unlike `m`, as `m`'s initialization follow a control statement (`if`)


Repository:
  rCTE Clang Tools Extra

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

https://reviews.llvm.org/D71199



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


[PATCH] D71140: [Wdocumentation] Properly place deprecated attribute

2019-12-09 Thread Dmitri Gribenko via Phabricator via cfe-commits
gribozavr2 accepted this revision.
gribozavr2 added inline comments.
This revision is now accepted and ready to land.



Comment at: clang/test/Sema/warn-documentation-fixits.cpp:83
+
+#if __cplusplus >= 201402L
+  // expected-warning@+2 {{declaration is marked with '\deprecated' command 
but does not have a deprecation attribute}}

Since you depend on c++14 in the test, please add an extra RUN line for c++14.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71140



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


[PATCH] D71199: [clang-tidy] New check readability-prefer-initialization-list

2019-12-09 Thread Whisperity via Phabricator via cfe-commits
whisperity added inline comments.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/readability-prefer-initialization-list.cpp:221
+m = 1;
+// NO-MESSAGES: initialization of m follows a conditional expression
+  }

Comment diverged from what's actually written in the code.


Repository:
  rCTE Clang Tools Extra

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

https://reviews.llvm.org/D71199



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


[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet marked an inline comment as done.
kadircet added inline comments.



Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp:269
+  }
+  DeletionRange.setBegin(InitStart);
+}

hokein wrote:
> There is an alternative here, I think. The end loc of `FunctionProtoTypeLoc` 
> should point the location after the `)`, e.g. the `Foo()^ : `,  would it be 
> easier to use it as as the `InitStart`?
> 
> it can be retrieved by `CD->getTypeSourceInfo()->getTypeLoc().getEndLoc()`.
yes, that would be great if attributes didn't exist. e.g.:

```cpp
class Foo {
  Foo() __attribute__((weak)) : z(2) {}
  int z;
};
```

for the example given above, typeloc.endloc would not include trailing 
attributes, updated test case according to that.(And added a fixme, since we 
should not propagate those attributes into definition)

also the approach proposed in this patch would result in minimal changes, by 
keeping anything before `:` in declaration site.
if we were to make use of endloc we could end up deleting more tokens in 
between, even if it would be rare to have tokens in between.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71188



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


[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 232825.
kadircet added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71188

Files:
  clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp

Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -1941,6 +1941,24 @@
   "void foo(int x, int y = 5, int = 2, int (*foo)(int) = nullptr) ;",
   "void foo(int x, int y , int , int (*foo)(int) ) {}",
   },
+  // Ctor initializers.
+  {
+  R"cpp(
+  class Foo {
+int y = 2;
+F^oo(int z) __attribute__((weak)) : bar(2){}
+int bar;
+int z = 2;
+  };)cpp",
+  R"cpp(
+  class Foo {
+int y = 2;
+Foo(int z) __attribute__((weak)) ;
+int bar;
+int z = 2;
+  };)cpp",
+  "Foo::Foo(int z) __attribute__((weak)) : bar(2){}\n",
+  },
   };
   for (const auto &Case : Cases) {
 SCOPED_TRACE(Case.Test);
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -18,6 +18,7 @@
 #include "clang/AST/ASTTypeTraits.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclBase.h"
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclTemplate.h"
 #include "clang/AST/Stmt.h"
 #include "clang/Basic/SourceLocation.h"
@@ -141,6 +142,7 @@
 // Contains function signature, except defaulted parameter arguments, body and
 // template parameters if applicable. No need to qualify parameters, as they are
 // looked up in the context containing the function/method.
+// FIXME: Drop attributes in function signature.
 llvm::Expected
 getFunctionSourceCode(const FunctionDecl *FD, llvm::StringRef TargetNamespace,
   const syntax::TokenBuffer &TokBuf) {
@@ -238,6 +240,46 @@
   return InsertionPoint{Region.EnclosingNamespace, *Offset};
 }
 
+// Returns the range that should be deleted from declaration, which always
+// contains function body. In addition to that it might contain constructor
+// initializers.
+SourceRange getDeletionRange(const FunctionDecl *FD,
+ const syntax::TokenBuffer &TokBuf) {
+  auto DeletionRange = FD->getBody()->getSourceRange();
+  if (auto *CD = llvm::dyn_cast(FD)) {
+const auto &SM = TokBuf.sourceManager();
+// AST doesn't contain the location for ":" in ctor initializers. Therefore
+// we find it by finding the first ":" before the first ctor initializer.
+SourceLocation InitStart;
+// Find the first initializer.
+for (const auto *CInit : CD->inits()) {
+  // We don't care about in-class initializers.
+  if (CInit->isInClassMemberInitializer())
+continue;
+  if (InitStart.isInvalid() ||
+  SM.isBeforeInTranslationUnit(CInit->getSourceLocation(), InitStart))
+InitStart = CInit->getSourceLocation();
+}
+if (InitStart.isValid()) {
+  auto Toks = TokBuf.expandedTokens(CD->getSourceRange());
+  // Drop any tokens after the initializer.
+  Toks = Toks.take_while([&TokBuf, &InitStart](const syntax::Token &Tok) {
+return TokBuf.sourceManager().isBeforeInTranslationUnit(Tok.location(),
+InitStart);
+  });
+  // Look for the first colon.
+  for (auto &Tok : llvm::reverse(Toks)) {
+if (Tok.kind() == tok::colon) {
+  InitStart = Tok.location();
+  break;
+}
+  }
+  DeletionRange.setBegin(InitStart);
+}
+  }
+  return DeletionRange;
+}
+
 /// Moves definition of a function/method to an appropriate implementation file.
 ///
 /// Before:
@@ -338,7 +380,8 @@
 const tooling::Replacement DeleteFuncBody(
 Sel.AST.getSourceManager(),
 CharSourceRange::getTokenRange(*toHalfOpenFileRange(
-SM, Sel.AST.getLangOpts(), Source->getBody()->getSourceRange())),
+SM, Sel.AST.getLangOpts(),
+getDeletionRange(Source, Sel.AST.getTokens(,
 ";");
 auto HeaderFE = Effect::fileEdit(SM, SM.getMainFileID(),
  tooling::Replacements(DeleteFuncBody));
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D71141: [Wdocumentation] Use C2x/C++14 deprecated attribute

2019-12-09 Thread Dmitri Gribenko via Phabricator via cfe-commits
gribozavr2 accepted this revision.
gribozavr2 added a comment.

LGTM with comments fixed.




Comment at: clang/lib/AST/CommentSema.cpp:698
+  // - In C2x/C++14 we prefer [[deprecated]]
+  // - If not found or an older C/C++ look for __attribute__((deprecated))
+  StringRef MacroName;

I know I'm nit-picking, but I'd appreciate periods at the end of sentences.



Comment at: clang/test/Sema/warn-documentation-fixits.c:27
+
+// CHECK: fix-it:"{{.*}}":{7:1-7:1}:"[[ATTRIBUTE]] "
+// CHECK: fix-it:"{{.*}}":{11:1-11:1}:"[[ATTRIBUTE]] "

"[[ATTRIBUTE]]"?

I expected either "[[deprecated]]" or "ATTRIBUTE".

Oh, these are FileCheck's regex brackets, which make it just a literal 
"ATTRIBUTE"... I think it would be clearer without the brackets :)



Comment at: clang/test/Sema/warn-documentation-fixits.cpp:130
 // CHECK: fix-it:"{{.*}}":{19:13-19:18}:"SomeTy"
-// CHECK: fix-it:"{{.*}}":{26:1-26:1}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{30:1-30:1}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{35:3-35:3}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{39:3-39:3}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{47:3-47:3}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{51:3-51:3}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{76:3-76:3}:"__attribute__((deprecated)) "
-// CHECK: fix-it:"{{.*}}":{81:3-81:3}:"__attribute__((deprecated)) "
-// CHECK14: fix-it:"{{.*}}":{87:3-87:3}:"__attribute__((deprecated)) "
+// CHECK: fix-it:"{{.*}}":{26:1-26:1}:"[[ATTRIBUTE]] "
+// CHECK: fix-it:"{{.*}}":{30:1-30:1}:"[[ATTRIBUTE]] "

s/[[ATTRIBUTE]]/ATTRIBUTE/ here as well.


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

https://reviews.llvm.org/D71141



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


[clang-tools-extra] 771899e - [clangd] Allow extract-to-function on regions that always return.

2019-12-09 Thread Sam McCall via cfe-commits

Author: Sam McCall
Date: 2019-12-09T14:57:49+01:00
New Revision: 771899e94452bbd5696abf8e2da7fee3514bb692

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

LOG: [clangd] Allow extract-to-function on regions that always return.

Summary:
We only do a trivial check whether the region always returns - it has to end
with a return statement.

Reviewers: kadircet

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

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

Added: 


Modified: 
clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
clang-tools-extra/clangd/unittests/TweakTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp 
b/clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
index ce9addb293bf..b99599c7f8f6 100644
--- a/clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
+++ b/clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
@@ -165,6 +165,22 @@ struct ExtractionZone {
   llvm::DenseSet RootStmts;
 };
 
+// Whether the code in the extraction zone is guaranteed to return, assuming
+// no broken control flow (unbound break/continue).
+// This is a very naive check (does it end with a return stmt).
+// Doing some rudimentary control flow analysis would cover more cases.
+bool alwaysReturns(const ExtractionZone &EZ) {
+  const Stmt *Last = EZ.getLastRootStmt()->ASTNode.get();
+  // Unwrap enclosing (unconditional) compound statement.
+  while (const auto *CS = llvm::dyn_cast(Last)) {
+if (CS->body_empty())
+  return false;
+else
+  Last = CS->body_back();
+  }
+  return llvm::isa(Last);
+}
+
 bool ExtractionZone::isRootStmt(const Stmt *S) const {
   return RootStmts.find(S) != RootStmts.end();
 }
@@ -283,11 +299,12 @@ struct NewFunction {
 }
   };
   std::string Name = "extracted";
-  std::string ReturnType;
+  QualType ReturnType;
   std::vector Parameters;
   SourceRange BodyRange;
   SourceLocation InsertionPoint;
   const DeclContext *EnclosingFuncContext;
+  bool CallerReturnsValue = false;
   // Decides whether the extracted function body and the function call need a
   // semicolon after extraction.
   tooling::ExtractionSemicolonPolicy SemicolonPolicy;
@@ -330,13 +347,16 @@ std::string NewFunction::renderParametersForCall() const {
 }
 
 std::string NewFunction::renderCall() const {
-  return Name + "(" + renderParametersForCall() + ")" +
- (SemicolonPolicy.isNeededInOriginalFunction() ? ";" : "");
+  return llvm::formatv(
+  "{0}{1}({2}){3}", CallerReturnsValue ? "return " : "", Name,
+  renderParametersForCall(),
+  (SemicolonPolicy.isNeededInOriginalFunction() ? ";" : ""));
 }
 
 std::string NewFunction::renderDefinition(const SourceManager &SM) const {
-  return ReturnType + " " + Name + "(" + renderParametersForDefinition() + ")" 
+
- " {\n" + getFuncBody(SM) + "\n}\n";
+  return llvm::formatv("{0} {1}({2}) {\n{3}\n}\n",
+   printType(ReturnType, *EnclosingFuncContext), Name,
+   renderParametersForDefinition(), getFuncBody(SM));
 }
 
 std::string NewFunction::getFuncBody(const SourceManager &SM) const {
@@ -370,8 +390,8 @@ struct CapturedZoneInfo {
   };
   // Maps Decls to their DeclInfo
   llvm::DenseMap DeclInfoMap;
-  // True if there is a return statement in zone.
-  bool HasReturnStmt = false;
+  bool HasReturnStmt = false; // Are there any return statements in the zone?
+  bool AlwaysReturns = false; // Does the zone always return?
   // Control flow is broken if we are extracting a break/continue without a
   // corresponding parent loop/switch
   bool BrokenControlFlow = false;
@@ -519,7 +539,9 @@ CapturedZoneInfo captureZoneInfo(const ExtractionZone 
&ExtZone) {
 unsigned CurNumberOfSwitch = 0;
   };
   ExtractionZoneVisitor Visitor(ExtZone);
-  return std::move(Visitor.Info);
+  CapturedZoneInfo Result = std::move(Visitor.Info);
+  Result.AlwaysReturns = alwaysReturns(ExtZone);
+  return Result;
 }
 
 // Adds parameters to ExtractedFunc.
@@ -582,13 +604,26 @@ getSemicolonPolicy(ExtractionZone &ExtZone, const 
SourceManager &SM,
 
 // Generate return type for ExtractedFunc. Return false if unable to do so.
 bool generateReturnProperties(NewFunction &ExtractedFunc,
+  const FunctionDecl &EnclosingFunc,
   const CapturedZoneInfo &CapturedInfo) {
-
-  // FIXME: Use Existing Return statements (if present)
+  // If the selected code always returns, we preserve those return statements.
+  // The return type should be the same as the enclosing function.
+  // (Others are possible if there are conversions, but this seems clearest).
+  if (CapturedInfo.HasReturnStmt) {
+// If the re

[PATCH] D70569: [clangd] Allow extract-to-function on regions that always return.

2019-12-09 Thread Sam McCall via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
sammccall marked 3 inline comments as done.
Closed by commit rG771899e94452: [clangd] Allow extract-to-function on regions 
that always return. (authored by sammccall).

Changed prior to commit:
  https://reviews.llvm.org/D70569?vs=230537&id=232826#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70569

Files:
  clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
  clang-tools-extra/clangd/unittests/TweakTests.cpp

Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -585,8 +585,10 @@
   EXPECT_THAT(apply(" for([[int i = 0;]];);"), HasSubstr("extracted"));
   // Don't extract because needs hoisting.
   EXPECT_THAT(apply(" [[int a = 5;]] a++; "), StartsWith("fail"));
-  // Don't extract return
-  EXPECT_THAT(apply(" if(true) [[return;]] "), StartsWith("fail"));
+  // Extract certain return
+  EXPECT_THAT(apply(" if(true) [[{ return; }]] "), HasSubstr("extracted"));
+  // Don't extract uncertain return
+  EXPECT_THAT(apply(" if(true) [[if (false) return;]] "), StartsWith("fail"));
 }
 
 TEST_F(ExtractFunctionTest, FileTest) {
@@ -696,6 +698,42 @@
   StartsWith("fail"));
 }
 
+TEST_F(ExtractFunctionTest, ExistingReturnStatement) {
+  Context = File;
+  const char* Before = R"cpp(
+bool lucky(int N);
+int getNum(bool Superstitious, int Min, int Max) {
+  if (Superstitious) [[{
+for (int I = Min; I <= Max; ++I)
+  if (lucky(I))
+return I;
+return -1;
+  }]] else {
+return (Min + Max) / 2;
+  }
+}
+  )cpp";
+  // FIXME: min/max should be by value.
+  // FIXME: avoid emitting redundant braces
+  const char* After = R"cpp(
+bool lucky(int N);
+int extracted(int &Min, int &Max) {
+{
+for (int I = Min; I <= Max; ++I)
+  if (lucky(I))
+return I;
+return -1;
+  }
+}
+int getNum(bool Superstitious, int Min, int Max) {
+  if (Superstitious) return extracted(Min, Max); else {
+return (Min + Max) / 2;
+  }
+}
+  )cpp";
+  EXPECT_EQ(apply(Before), After);
+}
+
 TWEAK_TEST(RemoveUsingNamespace);
 TEST_F(RemoveUsingNamespaceTest, All) {
   std::pair Cases[] = {
Index: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
===
--- clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp
@@ -165,6 +165,22 @@
   llvm::DenseSet RootStmts;
 };
 
+// Whether the code in the extraction zone is guaranteed to return, assuming
+// no broken control flow (unbound break/continue).
+// This is a very naive check (does it end with a return stmt).
+// Doing some rudimentary control flow analysis would cover more cases.
+bool alwaysReturns(const ExtractionZone &EZ) {
+  const Stmt *Last = EZ.getLastRootStmt()->ASTNode.get();
+  // Unwrap enclosing (unconditional) compound statement.
+  while (const auto *CS = llvm::dyn_cast(Last)) {
+if (CS->body_empty())
+  return false;
+else
+  Last = CS->body_back();
+  }
+  return llvm::isa(Last);
+}
+
 bool ExtractionZone::isRootStmt(const Stmt *S) const {
   return RootStmts.find(S) != RootStmts.end();
 }
@@ -283,11 +299,12 @@
 }
   };
   std::string Name = "extracted";
-  std::string ReturnType;
+  QualType ReturnType;
   std::vector Parameters;
   SourceRange BodyRange;
   SourceLocation InsertionPoint;
   const DeclContext *EnclosingFuncContext;
+  bool CallerReturnsValue = false;
   // Decides whether the extracted function body and the function call need a
   // semicolon after extraction.
   tooling::ExtractionSemicolonPolicy SemicolonPolicy;
@@ -330,13 +347,16 @@
 }
 
 std::string NewFunction::renderCall() const {
-  return Name + "(" + renderParametersForCall() + ")" +
- (SemicolonPolicy.isNeededInOriginalFunction() ? ";" : "");
+  return llvm::formatv(
+  "{0}{1}({2}){3}", CallerReturnsValue ? "return " : "", Name,
+  renderParametersForCall(),
+  (SemicolonPolicy.isNeededInOriginalFunction() ? ";" : ""));
 }
 
 std::string NewFunction::renderDefinition(const SourceManager &SM) const {
-  return ReturnType + " " + Name + "(" + renderParametersForDefinition() + ")" +
- " {\n" + getFuncBody(SM) + "\n}\n";
+  return llvm::formatv("{0} {1}({2}) {\n{3}\n}\n",
+   printType(ReturnType, *EnclosingFuncContext), Name,
+   renderParametersForDefinition(), getFuncBody(SM));
 }
 
 std::string NewFunction::getFuncBody(const SourceManager &SM) const {
@@ -370,8 +390,8 @@
   };
   // Maps Decls to their DeclInfo
   llvm::DenseMap DeclInfoMap;
-  // True if there is a return statement in zone.

[PATCH] D71198: [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM updated this revision to Diff 232827.
MarkMurrayARM added a comment.

Address review comments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71198

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/test/CodeGen/arm-mve-intrinsics/vhaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vhsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqrdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vrhaddq.c
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqrdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll

Index: llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
===
--- /dev/null
+++ llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
@@ -0,0 +1,92 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_u8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s8 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8> %a, <16 x i8> %b)
+  ret <16 x i8> %0
+}
+
+declare <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_s16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16> %a, <8 x i16> %b)
+  ret <8 x i16> %0
+}
+
+declare <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_u32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s32 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32> %a, <4 x i32> %b)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32>, <4 x i32>) #1
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s8 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
+  %2 = tail call <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i1> %1, <16 x i8> %inactive)
+  ret <16 x i8> %2
+}
+
+declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1
+
+declare <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8>, <16 x i8>, <16 x i1>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_u16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s16 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
+  %2 = tail call <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i1> %1, <8 x i16> %inactive)
+  ret <8 x i16> %2
+}
+
+declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1
+
+declare <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16>, <8 x i16>, <8 x i1>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s32 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
+  %2 = tail call <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i1> %1, <4 x i32> %inactive)
+  ret <4 x i32> %2
+}
+
+declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) #1
+
+declare <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 

[PATCH] D71188: [clangd] Delete ctor initializers while moving functions out-of-line

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: fail - 60625 tests passed, 1 failed and 726 were skipped.

  failed: LLVM.CodeGen/RISCV/mir-target-flags.ll

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71188



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


[PATCH] D71179: [OpenMP][WIP] Initial support for `begin/end declare variant`

2019-12-09 Thread Alexey Bataev via Phabricator via cfe-commits
ABataev added a comment.

In D71179#1775066 , @hfinkel wrote:

> In D71179#1774678 , @ABataev wrote:
>
> > In D71179#1774487 , @jdoerfert 
> > wrote:
> >
> > > In D71179#1774471 , @ABataev 
> > > wrote:
> > >
> > > > They do this because they have several function definitions with the 
> > > > same name. In our case, we have several different functions with 
> > > > different names and for us no need to worry about overloading 
> > > > resolution, the compiler will do everything for us.
> > >
> > >
> > > I think we talk past each other again. This is the implementation of `omp 
> > > begin/end declare variant` as described in TR8. Bt definition, the new 
> > > variant mechanism will result in several different function definitions 
> > > with the same name. See the two tests for examples.
> >
> >
> > I just don't get it. If begin/end is just a something like #ifdef...endif, 
> > why you just can't skip everything between begin/end if the context does 
> > not match?
>
>
> The patch does this (see in ParseOpenMP.cpp where I asked about the potential 
> inf-loop). But when the definitions are not skipped, then we have to worry 
> about having multiple decls/defs of the same name and the overload priorities.


I would recommend to drop all this extra stuff from the patch and focus on the 
initial patch. We'll need something similar to multiversion in case of the 
construct context selectors, but at first we need to solve all the problems 
with the simple versions of the construct rather that try to solve all the 
problems in the world in one patch. It is almost impossible to review.




Comment at: clang/lib/AST/StmtOpenMP.cpp:2243
 }
+
+// TODO: We have various representations for the same data, it might help to

jdoerfert wrote:
> This code was basically only moved, not written for this patch. It needs to 
> life somewhere accessible from Parser to CodeGen, see the TODOs below.
I don't think this is the right place for this code. Will try to move it to 
Basic directory in my patch.



Comment at: clang/lib/Parse/ParseOpenMP.cpp:1489
+++Nesting;
+} while (Nesting);
+

hfinkel wrote:
> Will this just inf-loop if the file ends?
It will.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71179



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


[clang] 32c802e - Fix build bot fails due to the patch here:

2019-12-09 Thread Zahira Ammarguellat via cfe-commits

Author: Zahira Ammarguellat
Date: 2019-12-09T09:24:47-05:00
New Revision: 32c802e0f539511f8535aaa1309cd06be86c2398

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

LOG: Fix build bot fails due to the patch here:
https://reviews.llvm.org/D70691
Fixed the LIT test case. Added the REQUIRES instruction.

Added: 


Modified: 
clang/test/CodeGen/opt-record-1.c

Removed: 




diff  --git a/clang/test/CodeGen/opt-record-1.c 
b/clang/test/CodeGen/opt-record-1.c
index 00a753d93dff..be8364769e32 100644
--- a/clang/test/CodeGen/opt-record-1.c
+++ b/clang/test/CodeGen/opt-record-1.c
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-cpu x86-64  %s -O3 
-opt-record-file=t1.opt -fopenmp -emit-llvm-bc -o %t.bc
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -target-cpu x86-64 -O3 -x 
ir %t.bc -opt-record-file %t.opt -fopenmp -emit-obj
 // RUN: cat %t.opt |  FileCheck -check-prefix=CHECK  %s
+// REQUIRES: x86-registered-target
 
 void foo(int *a, int *b, int *c) {
 #pragma omp parallel for



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


[PATCH] D71066: [ARM][MVE][Intrinsics] Add VMULL[BT]Q_(INT|POLY) intrinsics.

2019-12-09 Thread Simon Tatham via Phabricator via cfe-commits
simon_tatham added inline comments.



Comment at: clang/include/clang/Basic/arm_mve_defs.td:281
+// Scalar.
+def DblVector: VecOf>;
+

This could just be `VecOf>`, after you carefully defined 
`DoubleSize` above.



Comment at: llvm/lib/Target/ARM/ARMInstrMVE.td:3599
 
-class MVE_VMULL bits_21_20,
+class MVE_VMULL size,
 bit T, string cstr, list pattern=[]>

As I remember, the reason I //didn't// call these bits `U` and `size` was 
because that's not what they mean in all situations – as the comment below 
mentions, for polynomial multiplies, the size is encoded in the bit you've now 
called `U`.

I know `bit_28` and `bits_21_20` are cumbersome and annoying names, but I think 
that's still better than being inaccurate :-)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71066



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


[PATCH] D71174: [clang-tidy] new check: bugprone-signed-char-misuse

2019-12-09 Thread Eugene Zelenko via Phabricator via cfe-commits
Eugene.Zelenko added inline comments.



Comment at: clang-tools-extra/clang-tidy/bugprone/SignedCharMisuseCheck.cpp:21
+
+namespace {
+static Matcher hasAnyListedName(const std::string &Names) {

Anonymous namespace is not needed anymore.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71174



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


[PATCH] D71199: [clang-tidy] New check readability-prefer-initialization-list

2019-12-09 Thread Eugene Zelenko via Phabricator via cfe-commits
Eugene.Zelenko added a comment.

Clang-tidy also has //modernize-use-default-member-init//. Will be good idea to 
mention this check in documentation and otherwise as well as draw distinction 
(C++ version, coding guidelines, etc) in use cases.




Comment at: 
clang-tools-extra/clang-tidy/readability/PreferInitializationListCheck.cpp:66
+void PreferInitializationListCheck::registerMatchers(MatchFinder *Finder) {
+  Finder->addMatcher(cxxConstructorDecl().bind("ctor"), this);
+}

Will be good idea to check for C++.



Comment at: clang-tools-extra/docs/ReleaseNotes.rst:173
+
+  Finds member initializations in the constructor body which can be placed into
+  the initialization list instead.

Please synchronize with first statement in documentation.


Repository:
  rCTE Clang Tools Extra

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

https://reviews.llvm.org/D71199



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


[PATCH] D71208: CodeGen: Allow annotations on globals in non-zero address space

2019-12-09 Thread Nicolai Hähnle via Phabricator via cfe-commits
nhaehnle created this revision.
nhaehnle added a reviewer: rjmccall.
Herald added a project: clang.

Attribute annotations are recorded in a special global composite variable
that points to annotation strings and the annotated objects.

As a restriction of the LLVM IR type system, those pointers are all
pointers to address space 0, so let's insert an addrspacecast when the
annotated global is in a non-0 address space.

Since this addrspacecast is only reachable from the global annotations
object, this should allow us to represent annotations on all globals
regardless of which addrspacecasts are usually legal for the target.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D71208

Files:
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/test/CodeGen/annotations-global.c


Index: clang/test/CodeGen/annotations-global.c
===
--- clang/test/CodeGen/annotations-global.c
+++ clang/test/CodeGen/annotations-global.c
@@ -3,6 +3,7 @@
 // RUN: FileCheck --check-prefix=A %s < %t1
 // RUN: FileCheck --check-prefix=BAR %s < %t1
 // RUN: FileCheck --check-prefix=FOOS %s < %t1
+// RUN: FileCheck --check-prefix=ADDRSPACE %s < %t1
 // END.
 
 static __attribute((annotate("sfoo_0"))) __attribute((annotate("sfoo_1"))) 
char sfoo;
@@ -14,17 +15,19 @@
   sfoo = 0;
 }
 
+__attribute((address_space(1))) __attribute__((annotate("addrspace1_ann"))) 
char addrspace1_var;
+
 // FOOS: target triple
 // FOOS: private unnamed_addr constant [7 x i8] c"sfoo_{{.}}\00", section 
"llvm.metadata"
 // FOOS: private unnamed_addr constant [7 x i8] c"sfoo_{{.}}\00", section 
"llvm.metadata"
 // FOOS-NOT: sfoo_
-// FOOS: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, 
i32 }] {{.*}}i8* @sfoo{{.*}}i8* @sfoo{{.*}}, section "llvm.metadata"
+// FOOS: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, 
i32 }] {{.*}}i8* @sfoo{{.*}}i8* @sfoo{{.*}}, section "llvm.metadata"
 
 // FOO: target triple
 // FOO: private unnamed_addr constant [6 x i8] c"foo_{{.}}\00", section 
"llvm.metadata"
 // FOO: private unnamed_addr constant [6 x i8] c"foo_{{.}}\00", section 
"llvm.metadata"
 // FOO-NOT: foo_
-// FOO: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* @foo{{.*}}i8* @foo{{.*}}, section "llvm.metadata"
+// FOO: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* @foo{{.*}}i8* @foo{{.*}}, section "llvm.metadata"
 
 // A: target triple
 // A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section 
"llvm.metadata"
@@ -32,10 +35,13 @@
 // A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section 
"llvm.metadata"
 // A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section 
"llvm.metadata"
 // A-NOT: ann_a_
-// A: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a 
to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* 
@a to i8*){{.*}}, section "llvm.metadata"
+// A: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a 
to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* 
@a to i8*){{.*}}, section "llvm.metadata"
 
 // BAR: target triple
 // BAR: private unnamed_addr constant [6 x i8] c"bar_{{.}}\00", section 
"llvm.metadata"
 // BAR: private unnamed_addr constant [6 x i8] c"bar_{{.}}\00", section 
"llvm.metadata"
 // BAR-NOT: bar_
-// BAR: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* @a.bar{{.*}}i8* @a.bar{{.*}}, section "llvm.metadata"
+// BAR: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 
}] {{.*}}i8* @a.bar{{.*}}i8* @a.bar{{.*}}, section "llvm.metadata"
+
+// ADDRSPACE: target triple
+// ADDRSPACE: @llvm.global.annotations = appending global {{.*}} addrspacecast 
(i8 addrspace(1)* @addrspace1_var to i8*), {{.*}}
Index: clang/lib/CodeGen/CodeGenModule.cpp
===
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -2212,9 +2212,15 @@
  *UnitGV = EmitAnnotationUnit(L),
  *LineNoCst = EmitAnnotationLineNo(L);
 
+  llvm::Constant *ASZeroGV = GV;
+  if (GV->getAddressSpace() != 0) {
+ASZeroGV = llvm::ConstantExpr::getAddrSpaceCast(
+   GV, GV->getValueType()->getPointerTo(0));
+  }
+
   // Create the ConstantStruct for the global annotation.
   llvm::Constant *Fields[4] = {
-llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
+llvm::ConstantExpr::getBitCast(ASZeroGV, Int8PtrTy),
 llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
 llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
 LineNoCst


Index: clang/test/CodeGen/annotations-global.c
==

[PATCH] D70856: [Syntax] Build nodes for simple cases of top level declarations

2019-12-09 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov updated this revision to Diff 232840.
ilya-biryukov marked 5 inline comments as done.
ilya-biryukov added a comment.

- Remove the duplicate test
- Add 'message' to the node for static_assert
- Handle nested namespace definitions, add them to the tests


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70856

Files:
  clang/include/clang/Tooling/Syntax/Nodes.h
  clang/lib/Tooling/Syntax/BuildTree.cpp
  clang/lib/Tooling/Syntax/Nodes.cpp
  clang/unittests/Tooling/Syntax/TreeTest.cpp

Index: clang/unittests/Tooling/Syntax/TreeTest.cpp
===
--- clang/unittests/Tooling/Syntax/TreeTest.cpp
+++ clang/unittests/Tooling/Syntax/TreeTest.cpp
@@ -512,7 +512,190 @@
 | | `-tb
 | `-;
 `-}
-  )txt"}};
+  )txt"},
+  {R"cpp(
+namespace a { namespace b {} }
+namespace a::b {}
+namespace {}
+
+namespace foo = a;
+)cpp",
+   R"txt(
+*: TranslationUnit
+|-NamespaceDefinition
+| |-namespace
+| |-a
+| |-{
+| |-NamespaceDefinition
+| | |-namespace
+| | |-b
+| | |-{
+| | `-}
+| `-}
+|-NamespaceDefinition
+| |-namespace
+| |-a
+| |-::
+| |-b
+| |-{
+| `-}
+|-NamespaceDefinition
+| |-namespace
+| |-{
+| `-}
+`-NamespaceAliasDefinition
+  |-namespace
+  |-foo
+  |-=
+  |-a
+  `-;
+)txt"},
+  {R"cpp(
+namespace ns {}
+using namespace ::ns;
+)cpp",
+   R"txt(
+*: TranslationUnit
+|-NamespaceDefinition
+| |-namespace
+| |-ns
+| |-{
+| `-}
+`-UsingNamespaceDirective
+  |-using
+  |-namespace
+  |-::
+  |-ns
+  `-;
+   )txt"},
+  {R"cpp(
+namespace ns { int a; }
+using ns::a;
+)cpp",
+   R"txt(
+*: TranslationUnit
+|-NamespaceDefinition
+| |-namespace
+| |-ns
+| |-{
+| |-SimpleDeclaration
+| | |-int
+| | |-a
+| | `-;
+| `-}
+`-UsingDeclaration
+  |-using
+  |-ns
+  |-::
+  |-a
+  `-;
+   )txt"},
+  {R"cpp(
+template  struct X {
+  using T::foo;
+  using typename T::bar;
+};
+)cpp",
+   R"txt(
+*: TranslationUnit
+`-UnknownDeclaration
+  |-template
+  |-<
+  |-UnknownDeclaration
+  | |-class
+  | `-T
+  |->
+  |-struct
+  |-X
+  |-{
+  |-UsingDeclaration
+  | |-using
+  | |-T
+  | |-::
+  | |-foo
+  | `-;
+  |-UsingDeclaration
+  | |-using
+  | |-typename
+  | |-T
+  | |-::
+  | |-bar
+  | `-;
+  |-}
+  `-;
+   )txt"},
+  {R"cpp(
+using type = int;
+)cpp",
+   R"txt(
+*: TranslationUnit
+`-TypeAliasDeclaration
+  |-using
+  |-type
+  |-=
+  |-int
+  `-;
+   )txt"},
+  {R"cpp(
+;
+)cpp",
+   R"txt(
+*: TranslationUnit
+`-EmptyDeclaration
+  `-;
+   )txt"},
+  {R"cpp(
+static_assert(true, "message");
+static_assert(true);
+)cpp",
+   R"txt(
+*: TranslationUnit
+|-StaticAssertDeclaration
+| |-static_assert
+| |-(
+| |-UnknownExpression
+| | `-true
+| |-,
+| |-UnknownExpression
+| | `-"message"
+| |-)
+| `-;
+`-StaticAssertDeclaration
+  |-static_assert
+  |-(
+  |-UnknownExpression
+  | `-true
+  |-)
+  `-;
+   )txt"},
+  {R"cpp(
+extern "C" int a;
+extern "C" { int b; int c; }
+)cpp",
+   R"txt(
+*: TranslationUnit
+|-LinkageSpecificationDeclaration
+| |-extern
+| |-"C"
+| `-SimpleDeclaration
+|   |-int
+|   |-a
+|   `-;
+`-LinkageSpecificationDeclaration
+  |-extern
+  |-"C"
+  |-{
+  |-SimpleDeclaration
+  | |-int
+  | |-b
+  | `-;
+  |-SimpleDeclaration
+  | |-int
+  | |-c
+  | `-;
+  `-}
+   )txt"},
+  };
 
   for (const auto &T : Cases) {
 SCOPED_TRACE(T.first);
Index: clang/lib/Tooling/Syntax/Nodes.cpp
===
--- clang/lib/Tooling/Syntax/Nodes.cpp
+++ clang/lib/Tooling/Syntax/Nodes.cpp
@@ -50,8 +50,24 @@
 return OS << "CompoundStatement";
   case NodeKind::UnknownDeclaration:
 return OS << "UnknownDeclaration";
+  case NodeKind::EmptyDeclaration:
+return OS << "EmptyDeclaration";
+  case NodeKind::StaticAssertDeclaration:
+return OS << "StaticAssertDeclaration";
+  case NodeKind::LinkageSpecificationDeclaration:
+return OS << "LinkageSpecificationDeclaration";
   case NodeKind::SimpleDeclaration:
 return OS << "SimpleDeclaration";
+  case NodeKind::NamespaceDefinition:
+return OS << "NamespaceDefinition";
+  case NodeKind::NamespaceAliasDefinition:
+return OS << "NamespaceAliasDefinition";
+  case NodeKind::UsingNamespaceDirective:
+return OS << "UsingNamespaceDirective";
+  case NodeKind::UsingDeclaration:
+return OS << "UsingDeclaration";
+  case NodeKind::TypeAliasDeclaration:
+return OS << "TypeAliasDeclaration";
   }
   llvm_unreachable("unknown node kind");
 }
@@ -84,6 +100,10 @@
 return OS << "ExpressionStatement_expression";
   case syntax::NodeRole::CompoundStatement_statement:
 return OS << "CompoundStatement_statement";
+  case syntax::NodeRole::StaticAssertDeclaration_condition:
+return OS << "StaticAssertDeclaration_condition";
+  case syntax::NodeRole::StaticAssertDeclaration_message:
+return OS << "StaticAsse

[PATCH] D70856: [Syntax] Build nodes for simple cases of top level declarations

2019-12-09 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added inline comments.



Comment at: clang/include/clang/Tooling/Syntax/Nodes.h:346
+/// static_assert(, )
+/// static_assert()
+class StaticAssertDeclaration final : public Declaration {

gribozavr2 wrote:
> Why no semicolon, here and in other newly-added comments below? Seems like 
> these syntax nodes cover the semicolon as implemented.
I was torn on this...
In the statement position, this semicolon is not consumed by declarations 
(instead, it's consumed by `DeclarationStatement`). However, it **is** consumed 
at the namespace and TU level.

I've decided to punt on this until we add accessors for the semicolon and add a 
comment to the corresponding accessors, explaining the percularities of its 
placement.

Decided to keep it out from the comment, since it's not present **sometimes**.

Don't have a strong opinion here, can add it back



Comment at: clang/include/clang/Tooling/Syntax/Nodes.h:378
+
+/// namespace  {  }
+class NamespaceDefinition final : public Declaration {

gribozavr2 wrote:
> Isn't it a "nested name specifier" since C++17?
nested-name-specifier is a qualifier
it's actually something like `? `. Which is 
quite verbose, so decided decided to go with `` to keep it small for now.

May have to change to something more suitable when we actually start building 
syntax trees for names.

Does keeping `` make sense for now? Do you think we should be more 
precise from the start?

Happy to go in either direction, actually.



Comment at: clang/lib/Tooling/Syntax/BuildTree.cpp:515
+Builder.markExprChild(S->getAssertExpr(),
+  syntax::NodeRole::StaticAssertDeclaration_condition);
+Builder.foldNode(Builder.getRange(S),

gribozavr2 wrote:
> Why not also mark the message?
Good point. Done.

We don't have a node for `StringLiteral`, but we're returning it as 
`` for now.



Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:517
+  {R"cpp(
+namespace a { namespace b {} }
+namespace {}

gribozavr2 wrote:
> Also add `namespace a::b {}` ?
Done. This was also broken, now fixed. Thanks for bringing this up.



Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:692
+static_assert(true, "message");
+static_assert(true);
+)cpp",

gribozavr2 wrote:
> Duplicate test? (There's one above that's exactly like this.)
Thanks! Totally accidental, did not notice this.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70856



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


[PATCH] D71066: [ARM][MVE][Intrinsics] Add VMULL[BT]Q_(INT|POLY) intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM updated this revision to Diff 232841.
MarkMurrayARM added a comment.

Rebase.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71066

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/include/clang/Basic/arm_mve_defs.td
  clang/test/CodeGen/arm-mve-intrinsics/vmullbq.c
  clang/test/CodeGen/arm-mve-intrinsics/vmulltq.c
  clang/utils/TableGen/MveEmitter.cpp
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vmullbq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vmulltq.ll

Index: llvm/test/CodeGen/Thumb2/mve-intrinsics/vmulltq.ll
===
--- /dev/null
+++ llvm/test/CodeGen/Thumb2/mve-intrinsics/vmulltq.ll
@@ -0,0 +1,121 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
+
+define arm_aapcs_vfpcc <8 x i16> @test_vmulltq_int_u8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_u8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmullt.s8 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <8 x i16> @llvm.arm.mve.vmull.v8i16.v16i8(<16 x i8> %a, <16 x i8> %b, i32 1)
+  ret <8 x i16> %0
+}
+
+declare <8 x i16> @llvm.arm.mve.vmull.v8i16.v16i8(<16 x i8>, <16 x i8>, i32) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vmulltq_int_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_s16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmullt.s16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vmull.v4i32.v8i16(<8 x i16> %a, <8 x i16> %b, i32 1)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vmull.v4i32.v8i16(<8 x i16>, <8 x i16>, i32) #1
+
+define arm_aapcs_vfpcc <2 x i64> @test_vmulltq_int_u32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_u32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmullt.s32 q2, q0, q1
+; CHECK-NEXT:vmov q0, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <2 x i64> @llvm.arm.mve.vmull.v2i64.v4i32(<4 x i32> %a, <4 x i32> %b, i32 1)
+  ret <2 x i64> %0
+}
+
+declare <2 x i64> @llvm.arm.mve.vmull.v2i64.v4i32(<4 x i32>, <4 x i32>, i32) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vmulltq_poly_p16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_poly_p16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmullt.p16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vmull.poly.v4i32.v8i16(<8 x i16> %a, <8 x i16> %b, i32 1)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vmull.poly.v4i32.v8i16(<8 x i16>, <8 x i16>, i32) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vmulltq_int_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_m_s8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vmulltt.s8 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
+  %2 = tail call <8 x i16> @llvm.arm.mve.mull.int.predicated.v8i16.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, i32 1, <16 x i1> %1, <16 x i8> %inactive)
+  ret <8 x i16> %2
+}
+
+declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1
+
+declare <8 x i16> @llvm.arm.mve.mull.int.predicated.v8i16.v16i8.v16i1(<16 x i8>, <16 x i8>, i32, <16 x i1>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vmulltq_int_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_m_u16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vmulltt.s16 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
+  %2 = tail call <4 x i32> @llvm.arm.mve.mull.int.predicated.v4i32.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, i32 1, <8 x i1> %1, <8 x i16> %inactive)
+  ret <4 x i32> %2
+}
+
+declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1
+
+declare <4 x i32> @llvm.arm.mve.mull.int.predicated.v4i32.v8i16.v8i1(<8 x i16>, <8 x i16>, i32, <8 x i1>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <2 x i64> @test_vmulltq_int_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vmulltq_int_m_s32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vmulltt.s32 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
+  %2 = tail call <2 x i64> @llvm.ar

[PATCH] D71198: [ARM][MVE][Intrinsics] Add VQADDQ, VHADDQ, VRHADDQ, VQSUBQ, VHSUBQ, VQDMULHQ, VQRDMULHQ intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM updated this revision to Diff 232842.
MarkMurrayARM added a comment.

Rebase.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71198

Files:
  clang/include/clang/Basic/arm_mve.td
  clang/test/CodeGen/arm-mve-intrinsics/vhaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vhsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqaddq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqrdmulhq.c
  clang/test/CodeGen/arm-mve-intrinsics/vqsubq.c
  clang/test/CodeGen/arm-mve-intrinsics/vrhaddq.c
  llvm/include/llvm/IR/IntrinsicsARM.td
  llvm/lib/Target/ARM/ARMInstrMVE.td
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vhsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqaddq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqrdmulhq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vqsubq.ll
  llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll

Index: llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
===
--- /dev/null
+++ llvm/test/CodeGen/Thumb2/mve-intrinsics/vrhaddq.ll
@@ -0,0 +1,92 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main -mattr=+mve.fp -verify-machineinstrs -o - %s | FileCheck %s
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_u8(<16 x i8> %a, <16 x i8> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s8 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8> %a, <16 x i8> %b)
+  ret <16 x i8> %0
+}
+
+declare <16 x i8> @llvm.arm.mve.vrhadd.v16i8(<16 x i8>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_s16(<8 x i16> %a, <8 x i16> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_s16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s16 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16> %a, <8 x i16> %b)
+  ret <8 x i16> %0
+}
+
+declare <8 x i16> @llvm.arm.mve.vrhadd.v8i16(<8 x i16>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_u32(<4 x i32> %a, <4 x i32> %b) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_u32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vrhadd.s32 q0, q0, q1
+; CHECK-NEXT:bx lr
+entry:
+  %0 = tail call <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32> %a, <4 x i32> %b)
+  ret <4 x i32> %0
+}
+
+declare <4 x i32> @llvm.arm.mve.vrhadd.v4i32(<4 x i32>, <4 x i32>) #1
+
+define arm_aapcs_vfpcc <16 x i8> @test_vrhaddq_m_s8(<16 x i8> %inactive, <16 x i8> %a, <16 x i8> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s8:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s8 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32 %0)
+  %2 = tail call <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8> %a, <16 x i8> %b, <16 x i1> %1, <16 x i8> %inactive)
+  ret <16 x i8> %2
+}
+
+declare <16 x i1> @llvm.arm.mve.pred.i2v.v16i1(i32) #1
+
+declare <16 x i8> @llvm.arm.mve.rhadd.predicated.v16i8.v16i1(<16 x i8>, <16 x i8>, <16 x i1>, <16 x i8>) #1
+
+define arm_aapcs_vfpcc <8 x i16> @test_vrhaddq_m_u16(<8 x i16> %inactive, <8 x i16> %a, <8 x i16> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_u16:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s16 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32 %0)
+  %2 = tail call <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16> %a, <8 x i16> %b, <8 x i1> %1, <8 x i16> %inactive)
+  ret <8 x i16> %2
+}
+
+declare <8 x i1> @llvm.arm.mve.pred.i2v.v8i1(i32) #1
+
+declare <8 x i16> @llvm.arm.mve.rhadd.predicated.v8i16.v8i1(<8 x i16>, <8 x i16>, <8 x i1>, <8 x i16>) #1
+
+define arm_aapcs_vfpcc <4 x i32> @test_vrhaddq_m_s32(<4 x i32> %inactive, <4 x i32> %a, <4 x i32> %b, i16 zeroext %p) local_unnamed_addr #0 {
+; CHECK-LABEL: test_vrhaddq_m_s32:
+; CHECK:   @ %bb.0: @ %entry
+; CHECK-NEXT:vmsr p0, r0
+; CHECK-NEXT:vpst
+; CHECK-NEXT:vrhaddt.s32 q0, q1, q2
+; CHECK-NEXT:bx lr
+entry:
+  %0 = zext i16 %p to i32
+  %1 = tail call <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32 %0)
+  %2 = tail call <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32> %a, <4 x i32> %b, <4 x i1> %1, <4 x i32> %inactive)
+  ret <4 x i32> %2
+}
+
+declare <4 x i1> @llvm.arm.mve.pred.i2v.v4i1(i32) #1
+
+declare <4 x i32> @llvm.arm.mve.rhadd.predicated.v4i32.v4i1(<4 x i32>, <4 x i32>, <4 x i1>, <4 x i32>) #1
Index:

[PATCH] D71066: [ARM][MVE][Intrinsics] Add VMULL[BT]Q_(INT|POLY) intrinsics.

2019-12-09 Thread Mark Murray via Phabricator via cfe-commits
MarkMurrayARM marked 2 inline comments as done.
MarkMurrayARM added a comment.

Address review comments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71066



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


[PATCH] D71208: CodeGen: Allow annotations on globals in non-zero address space

2019-12-09 Thread pre-merge checks [bot] via Phabricator via cfe-commits
merge_guards_bot added a comment.

Build result: pass - 60628 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt 
,
 CMakeCache.txt 



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71208



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


[PATCH] D70594: [clangd] Implement range patching heuristics for cross-file rename.

2019-12-09 Thread Haojian Wu via Phabricator via cfe-commits
hokein updated this revision to Diff 232844.
hokein marked 12 inline comments as done.
hokein added a comment.

address comments:

- don't emit the internal messages to users, llvm::Expected => llvm::Optional
- use the index of lexed array to calculate the adjustment cost.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D70594

Files:
  clang-tools-extra/clangd/refactor/Rename.cpp
  clang-tools-extra/clangd/refactor/Rename.h
  clang-tools-extra/clangd/unittests/RenameTests.cpp

Index: clang-tools-extra/clangd/unittests/RenameTests.cpp
===
--- clang-tools-extra/clangd/unittests/RenameTests.cpp
+++ clang-tools-extra/clangd/unittests/RenameTests.cpp
@@ -14,9 +14,11 @@
 #include "index/Ref.h"
 #include "refactor/Rename.h"
 #include "clang/Tooling/Core/Replacement.h"
+#include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
+#include 
 
 namespace clang {
 namespace clangd {
@@ -24,7 +26,9 @@
 
 using testing::Eq;
 using testing::Pair;
+using testing::IsEmpty;
 using testing::UnorderedElementsAre;
+using testing::UnorderedElementsAreArray;
 
 // Build a RefSlab from all marked ranges in the annotation. The ranges are
 // assumed to associate with the given SymbolName.
@@ -853,6 +857,300 @@
 expectedResult(Code, expectedResult(T, "abc")));
 }
 
+TEST(CrossFileRenameTests, adjustRenameRanges) {
+  // Ranges in IndexedCode indicate the indexed occurrences;
+  // ranges in DraftCode indicate the expected mapped result, empty indicates
+  // we expect no matched result found.
+  struct {
+llvm::StringRef IndexedCode;
+llvm::StringRef DraftCode;
+  } Tests[] = {
+{
+  // both line and column are changed, not a near miss.
+  R"cpp(
+int [[x]] = 0;
+  )cpp",
+  R"cpp(
+// insert a line.
+double x = 0;
+  )cpp",
+},
+{
+  // subset.
+  R"cpp(
+int [[x]] = 0;
+  )cpp",
+  R"cpp(
+int [[x]] = 0;
+{int x = 0; }
+  )cpp",
+},
+{
+  // shift columns.
+  R"cpp(int [[x]] = 0; void foo(int x);)cpp",
+  R"cpp(double [[x]] = 0; void foo(double x);)cpp",
+},
+{
+  // shift lines.
+  R"cpp(
+int [[x]] = 0;
+void foo(int x);
+  )cpp",
+  R"cpp(
+// insert a line.
+int [[x]] = 0;
+void foo(int x);
+  )cpp",
+},
+  };
+  LangOptions LangOpts;
+  LangOpts.CPlusPlus = true;
+  for (const auto &T : Tests) {
+Annotations Draft(T.DraftCode);
+auto ActualRanges = adjustRenameRanges(
+Draft.code(), "x", Annotations(T.IndexedCode).ranges(), LangOpts);
+if (!ActualRanges)
+   EXPECT_THAT(Draft.ranges(), testing::IsEmpty());
+else
+  EXPECT_THAT(Draft.ranges(),
+  testing::UnorderedElementsAreArray(*ActualRanges))
+  << T.DraftCode;
+  }
+}
+
+TEST(RangePatchingHeuristic, GetMappedRanges) {
+  // ^ in LexedCode marks the ranges we expect to be mapped; no ^ indicates
+  // there are no mapped ranges.
+  struct {
+llvm::StringRef IndexedCode;
+llvm::StringRef LexedCode;
+  } Tests[] = {
+{
+  // no lexed ranges.
+  "[[]]",
+  "",
+},
+{
+  // both line and column are changed, not a near miss.
+  R"([[]])",
+  R"(
+[[]]
+  )",
+},
+{
+  // subset.
+  "[[]]",
+  "^[[]]  [[]]"
+},
+{
+  // shift columns.
+  "[[]]   [[]]",
+  "  ^[[]]   ^[[]]  [[]]"
+},
+{
+  R"(
+[[]]
+
+[[]] [[]]
+  )",
+  R"(
+// insert a line
+^[[]]
+
+^[[]] ^[[]]
+  )",
+},
+{
+  R"(
+[[]]
+
+[[]] [[]]
+  )",
+  R"(
+// insert a line
+^[[]]
+  ^[[]]  ^[[]] // column is shifted.
+  )",
+},
+{
+  R"(
+[[]]
+
+[[]] [[]]
+  )",
+  R"(
+// insert a line
+[[]]
+
+  [[]]  [[]] // not mapped (both line and column are changed).
+  )",
+},
+{
+  R"(
+[[]]
+[[]]
+
+   [[]]
+  [[]]
+
+}
+  )",
+  R"(
+// insert a new line
+^[[]]
+^[[]]
+ [[]] // additional range
+   ^[[]]
+  ^[[]]
+[[]] // additional range
+  )",
+},
+{
+  // non-distinct result (two best results), not a near miss
+  R"(
+[[]]
+[[]]
+[[]]
+  )",
+  R"(
+[[]]
+[[]]
+[[]]
+[[]]
+  )",
+}
+  };
+  for (const auto &T : Tests) {
+auto Lexed = Annotations(T.LexedCode);
+auto LexedRanges = Lexed.ranges();
+std::vector ExpectedMatches;
+for (auto P : Lexed.points()) {
+  auto Match

  1   2   3   4   >