[PATCH] D104616: [analyzer] Model comparision methods of std::unique_ptr

2021-07-04 Thread Deep Majumder via Phabricator via cfe-commits
RedDocMD marked 4 inline comments as done.
RedDocMD added inline comments.



Comment at: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp:316
+
+class OperatorKind {
+  union {

NoQ wrote:
> One good place to put this may be `CheckerHelpers.h`. This is where we dump 
> all the stuff that's probably useful in multiple checkers but not in other 
> places.
> 
> I also wonder if you plan to support unary operators. The interesting part 
> about them is that they are sometimes ambiguous to binary operators in their 
> string representation, eg. `-`.
I guess passing a parameter to chose operator arity should work.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104616

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


[PATCH] D104616: [analyzer] Model comparision methods of std::unique_ptr

2021-07-04 Thread Deep Majumder via Phabricator via cfe-commits
RedDocMD updated this revision to Diff 356371.
RedDocMD added a comment.

Little refactors


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104616

Files:
  clang/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerHelpers.h
  clang/lib/StaticAnalyzer/Checkers/SmartPtr.h
  clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
  clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
  clang/test/Analysis/Inputs/system-header-simulator-cxx.h
  clang/test/Analysis/smart-ptr.cpp

Index: clang/test/Analysis/smart-ptr.cpp
===
--- clang/test/Analysis/smart-ptr.cpp
+++ clang/test/Analysis/smart-ptr.cpp
@@ -457,3 +457,52 @@
 P->foo(); // expected-warning {{Dereference of null smart pointer 'P' [alpha.cplusplus.SmartPtr]}}
   }
 }
+
+// The following is a silly function,
+// but serves to test if we are picking out
+// standard comparision functions from custom ones.
+template 
+bool operator<(std::unique_ptr &x, double d);
+
+void uniquePtrComparision(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));
+  auto nullPtr = std::unique_ptr();
+  auto otherPtr = std::unique_ptr(new int(29));
+
+  clang_analyzer_eval(ptr == ptr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(ptr > ptr);  // expected-warning{{FALSE}}
+  clang_analyzer_eval(ptr <= ptr); // expected-warning{{TRUE}}
+
+  clang_analyzer_eval(nullPtr <= unknownPtr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(unknownPtr >= nullPtr); // expected-warning{{TRUE}}
+
+  clang_analyzer_eval(ptr != otherPtr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(ptr > nullPtr);   // expected-warning{{TRUE}}
+
+  clang_analyzer_eval(ptr != nullptr);// expected-warning{{TRUE}}
+  clang_analyzer_eval(nullPtr != nullptr);// expected-warning{{FALSE}}
+  clang_analyzer_eval(nullptr <= unknownPtr); // expected-warning{{TRUE}}
+}
+
+void uniquePtrComparisionStateSplitting(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));
+
+  clang_analyzer_eval(ptr > unknownPtr); // expected-warning{{TRUE}}
+  // expected-warning@-1{{FALSE}}
+}
+
+void uniquePtrComparisionDifferingTypes(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));
+  auto nullPtr = std::unique_ptr();
+  auto otherPtr = std::unique_ptr(new double(3.14));
+
+  clang_analyzer_eval(nullPtr <= unknownPtr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(unknownPtr >= nullPtr); // expected-warning{{TRUE}}
+
+  clang_analyzer_eval(ptr != otherPtr); // expected-warning{{TRUE}}
+  clang_analyzer_eval(ptr > nullPtr);   // expected-warning{{TRUE}}
+
+  clang_analyzer_eval(ptr != nullptr);// expected-warning{{TRUE}}
+  clang_analyzer_eval(nullPtr != nullptr);// expected-warning{{FALSE}}
+  clang_analyzer_eval(nullptr <= unknownPtr); // expected-warning{{TRUE}}
+}
Index: clang/test/Analysis/Inputs/system-header-simulator-cxx.h
===
--- clang/test/Analysis/Inputs/system-header-simulator-cxx.h
+++ clang/test/Analysis/Inputs/system-header-simulator-cxx.h
@@ -978,6 +978,61 @@
 void swap(unique_ptr &x, unique_ptr &y) noexcept {
   x.swap(y);
 }
+
+template 
+bool operator==(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator!=(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator<(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator>(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator<=(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator>=(const unique_ptr &x, const unique_ptr &y);
+
+template 
+bool operator==(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator!=(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator<(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator>(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator<=(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator>=(const unique_ptr &x, nullptr_t y);
+
+template 
+bool operator==(nullptr_t x, const unique_ptr &y);
+
+template 
+bool operator!=(nullptr_t x, const unique_ptr &y);
+
+template 
+bool operator>(nullptr_t x, const unique_ptr &y);
+
+template 
+bool operator<(nullptr_t x, const unique_ptr &y);
+
+template 
+bool operator>=(nullptr_t x, const unique_ptr &y);
+
+template 
+bool operator<=(nullptr_t x, const unique_ptr &y);
+
 } // namespace std
 #endif
 
Index: clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
===
--- clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
+++ clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
@@ -148,5 +148,39 @@
   return IntValue.getSExtValue();
 }
 
+OperatorKind operationKindFromOverloadedOperator(OverloadedOperatorKind OOK,
+ bool IsBinary) {
+  llvm::StringMap BinOps{
+#de

[clang] fabc171 - [IRBuilder] Add type argument to CreateMaskedLoad/Gather

2021-07-04 Thread Nikita Popov via cfe-commits

Author: Nikita Popov
Date: 2021-07-04T12:17:59+02:00
New Revision: fabc17192ec1c43cb5f6e34eda3e1a55cd9c78f3

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

LOG: [IRBuilder] Add type argument to CreateMaskedLoad/Gather

Same as other CreateLoad-style APIs, these need an explicit type
argument to support opaque pointers.

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

Added: 


Modified: 
clang/lib/CodeGen/CGBuiltin.cpp
llvm/include/llvm/IR/IRBuilder.h
llvm/lib/IR/AutoUpgrade.cpp
llvm/lib/IR/IRBuilder.cpp
llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Removed: 




diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 9061abceab3a0..494f998e31149 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -11746,14 +11746,14 @@ static Value *EmitX86MaskedStore(CodeGenFunction 
&CGF, ArrayRef Ops,
 static Value *EmitX86MaskedLoad(CodeGenFunction &CGF, ArrayRef Ops,
 Align Alignment) {
   // Cast the pointer to right type.
-  Value *Ptr = CGF.Builder.CreateBitCast(Ops[0],
-   
llvm::PointerType::getUnqual(Ops[1]->getType()));
+  llvm::Type *Ty = Ops[1]->getType();
+  Value *Ptr =
+  CGF.Builder.CreateBitCast(Ops[0], llvm::PointerType::getUnqual(Ty));
 
   Value *MaskVec = getMaskVecValue(
-  CGF, Ops[2],
-  cast(Ops[1]->getType())->getNumElements());
+  CGF, Ops[2], cast(Ty)->getNumElements());
 
-  return CGF.Builder.CreateMaskedLoad(Ptr, Alignment, MaskVec, Ops[1]);
+  return CGF.Builder.CreateMaskedLoad(Ty, Ptr, Alignment, MaskVec, Ops[1]);
 }
 
 static Value *EmitX86ExpandLoad(CodeGenFunction &CGF,

diff  --git a/llvm/include/llvm/IR/IRBuilder.h 
b/llvm/include/llvm/IR/IRBuilder.h
index 9dae6adaebe41..9bd5ae1908cf5 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -752,7 +752,7 @@ class IRBuilderBase {
   CallInst *CreateInvariantStart(Value *Ptr, ConstantInt *Size = nullptr);
 
   /// Create a call to Masked Load intrinsic
-  CallInst *CreateMaskedLoad(Value *Ptr, Align Alignment, Value *Mask,
+  CallInst *CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment, Value 
*Mask,
  Value *PassThru = nullptr, const Twine &Name = 
"");
 
   /// Create a call to Masked Store intrinsic
@@ -760,7 +760,7 @@ class IRBuilderBase {
   Value *Mask);
 
   /// Create a call to Masked Gather intrinsic
-  CallInst *CreateMaskedGather(Value *Ptrs, Align Alignment,
+  CallInst *CreateMaskedGather(Type *Ty, Value *Ptrs, Align Alignment,
Value *Mask = nullptr, Value *PassThru = 
nullptr,
const Twine &Name = "");
 

diff  --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 851e8e45f47d3..6271385183eb9 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -1421,10 +1421,9 @@ static Value *UpgradeMaskedLoad(IRBuilder<> &Builder,
   return Builder.CreateAlignedLoad(ValTy, Ptr, Alignment);
 
   // Convert the mask from an integer type to a vector of i1.
-  unsigned NumElts =
-  cast(Passthru->getType())->getNumElements();
+  unsigned NumElts = cast(ValTy)->getNumElements();
   Mask = getX86MaskVec(Builder, Mask, NumElts);
-  return Builder.CreateMaskedLoad(Ptr, Alignment, Mask, Passthru);
+  return Builder.CreateMaskedLoad(ValTy, Ptr, Alignment, Mask, Passthru);
 }
 
 static Value *upgradeAbs(IRBuilder<> &Builder, CallInst &CI) {

diff  --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
index 47b154c3cdc28..5ea9867a246c2 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -493,6 +493,7 @@ Instruction 
*IRBuilderBase::CreateNoAliasScopeDeclaration(Value *Scope) {
 }
 
 /// Create a call to a Masked Load intrinsic.
+/// \p Ty- vector type to load
 /// \p Ptr   - base pointer for the load
 /// \p Alignment - alignment of the source location
 /// \p Mask  - vector of booleans which indicates what vector lanes should
@@ -500,16 +501,16 @@ Instruction 
*IRBuilderBase::CreateNoAliasScopeDeclaration(Value *Scope) {
 /// \p PassThru  - pass-through value that is used to fill the masked-off lanes
 ///of the result
 /// \p Name  - name of the result variable
-CallInst *IRBuilderBase::CreateMaskedLoad(Value *Ptr, Align Alignment,
+CallInst *IRBuilderBase::CreateMaskedLoad(Type *Ty, Value *Ptr, Align 
Alignment,
  

[PATCH] D105395: [IRBuilder] Add type argument to CreateMaskedLoad/Gather

2021-07-04 Thread Nikita Popov via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfabc17192ec1: [IRBuilder] Add type argument to 
CreateMaskedLoad/Gather (authored by nikic).

Changed prior to commit:
  https://reviews.llvm.org/D105395?vs=356340&id=356372#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105395

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/AutoUpgrade.cpp
  llvm/lib/IR/IRBuilder.cpp
  llvm/lib/Target/Hexagon/HexagonVectorCombine.cpp
  llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
  llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
  mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Index: mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
===
--- mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -1516,10 +1516,11 @@
   let results = (outs LLVM_Type:$res);
   let builders = [LLVM_OneResultOpBuilder];
   string llvmBuilder = [{
+llvm::Type *Ty = $data->getType()->getPointerElementType();
 $res = $pass_thru.empty() ? builder.CreateMaskedLoad(
-  $data, llvm::Align($alignment), $mask) :
+  Ty, $data, llvm::Align($alignment), $mask) :
   builder.CreateMaskedLoad(
-$data, llvm::Align($alignment), $mask, $pass_thru[0]);
+Ty, $data, llvm::Align($alignment), $mask, $pass_thru[0]);
   }];
   let assemblyFormat =
 "operands attr-dict `:` functional-type(operands, results)";
@@ -1545,10 +1546,14 @@
   let results = (outs LLVM_Type:$res);
   let builders = [LLVM_OneResultOpBuilder];
   string llvmBuilder = [{
+llvm::VectorType *PtrVecTy = cast($ptrs->getType());
+llvm::Type *Ty = llvm::VectorType::get(
+  PtrVecTy->getElementType()->getPointerElementType(),
+  PtrVecTy->getElementCount());
 $res = $pass_thru.empty() ? builder.CreateMaskedGather(
-  $ptrs, llvm::Align($alignment), $mask) :
+  Ty, $ptrs, llvm::Align($alignment), $mask) :
   builder.CreateMaskedGather(
-$ptrs, llvm::Align($alignment), $mask, $pass_thru[0]);
+Ty, $ptrs, llvm::Align($alignment), $mask, $pass_thru[0]);
   }];
   let assemblyFormat =
 "operands attr-dict `:` functional-type(operands, results)";
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -5403,7 +5403,7 @@
 for (Value *V : E->Scalars)
   CommonAlignment =
   commonAlignment(CommonAlignment, cast(V)->getAlign());
-NewLI = Builder.CreateMaskedGather(VecPtr, CommonAlignment);
+NewLI = Builder.CreateMaskedGather(VecTy, VecPtr, CommonAlignment);
   }
   Value *V = propagateMetadata(NewLI, E->Scalars);
 
Index: llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
===
--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -2778,7 +2778,7 @@
   : ShuffledMask;
 }
 NewLoad =
-Builder.CreateMaskedLoad(AddrParts[Part], Group->getAlign(),
+Builder.CreateMaskedLoad(VecTy, AddrParts[Part], Group->getAlign(),
  GroupMask, PoisonVec, "wide.masked.vec");
   }
   else
@@ -2990,15 +2990,15 @@
 if (CreateGatherScatter) {
   Value *MaskPart = isMaskRequired ? BlockInMaskParts[Part] : nullptr;
   Value *VectorGep = State.get(Addr, Part);
-  NewLI = Builder.CreateMaskedGather(VectorGep, Alignment, MaskPart,
+  NewLI = Builder.CreateMaskedGather(DataTy, VectorGep, Alignment, MaskPart,
  nullptr, "wide.masked.gather");
   addMetadata(NewLI, LI);
 } else {
   auto *VecPtr = CreateVecPtr(Part, State.get(Addr, VPIteration(0, 0)));
   if (isMaskRequired)
 NewLI = Builder.CreateMaskedLoad(
-VecPtr, Alignment, BlockInMaskParts[Part], PoisonValue::get(DataTy),
-"wide.masked.load");
+DataTy, VecPtr, Alignment, BlockInMaskParts[Part],
+PoisonValue::get(DataTy), "wide.masked.load");
   else
 NewLI =
 Builder.CreateAlignedLoad(DataTy, VecPtr, Alignment, "wide.load");
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -3117,7 +3117,7 @@
 if (PropagateShadow) {
   std::tie(ShadowPtr, OriginPtr) =
   getShadowOr

[PATCH] D105263: [X86] AVX512FP16 instructions enabling 1/6

2021-07-04 Thread Pengfei Wang via Phabricator via cfe-commits
pengfei added inline comments.



Comment at: clang/lib/Headers/avx512fp16intrin.h:38
+
+static __inline__ _Float16 __DEFAULT_FN_ATTRS512 _mm512_cvtsh_h(__m512h __a) {
+  return __a[0];

RKSimon wrote:
> pengfei wrote:
> > RKSimon wrote:
> > > I realize its a lot of work, but is there any chance that we could get 
> > > doxygen comments to document these intrinsics?
> > I'm hesitating not only for the work but also the effect. We have about 1K 
> > new intrinsics and more than 5K LOC in total in the two header files. 
> > Adding the doxygen comments will make the readability worse and increase 
> > the difficulty in review. It's also a burden in maintaining the correctness.
> > Do you think it's feasible to only add a link to intrinsic guide? We have 
> > decided to only using link that points intrinsic guide in our product 
> > compiler. Using one source is friendly to maintainess. And I think 
> > intrinsic guide is also easy to use that doxygen.
> I completely understand where you're coming from. What we do lose is the 
> ability for code editors to display the doxygen when using the intrinsic (or 
> mouseover the code). Are there any particular intrinsics that we could do 
> with having comments closer at hand - ones that take rounding modes that its 
> tricky to remember the enum/defines for or implicit load/store alignments 
> come to mind?
> 
> I'm not sure about the idea of linking to external docs for specs - do we 
> have a style guide policy on this?
> Are there any particular intrinsics that we could do with having comments 
> closer at hand
I only found 3 ones from avx512fintrin.h, anyway, I copied here.

> ones that take rounding modes that its tricky to remember the enum/defines 
> for or implicit load/store alignments come to mind
Unfortunately, we didn't add doc for them when enabling avx512 intrinsics.

> I'm not sure about the idea of linking to external docs for specs - do we 
> have a style guide policy on this?
I was thinking some thing like "See https://llvm.org/LICENSE.txt for license 
information." in most source files. But I agree doxygen helps for code editors. 
I didn't think of them simply because I never used them :)
I had some thought about writing a tool to help transporting intrinsic guide 
info to doxygen, but haven't yet found time to do it.

Anyway, I guess this is not the block issue for this series patches, right?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105263

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


[PATCH] D105408: [clang-format] Pass a TextDiagnosticPrinter when we can not create tempory file.

2021-07-04 Thread BRAMI Élie via Phabricator via cfe-commits
Et7f3 created this revision.
Herald added a subscriber: mgorny.
Et7f3 requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Co-authored-by: "tartine8" 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D105408

Files:
  clang/tools/clang-format/CMakeLists.txt
  clang/tools/clang-format/ClangFormat.cpp


Index: clang/tools/clang-format/ClangFormat.cpp
===
--- clang/tools/clang-format/ClangFormat.cpp
+++ clang/tools/clang-format/ClangFormat.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -443,9 +444,12 @@
 IntrusiveRefCntPtr InMemoryFileSystem(
 new llvm::vfs::InMemoryFileSystem);
 FileManager Files(FileSystemOptions(), InMemoryFileSystem);
+IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions;
+TextDiagnosticPrinter *DiagClient =
+new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
 DiagnosticsEngine Diagnostics(
 IntrusiveRefCntPtr(new DiagnosticIDs),
-new DiagnosticOptions);
+&*DiagOpts, DiagClient);
 SourceManager Sources(Diagnostics, Files);
 FileID ID = createInMemoryFile(AssumedFileName, *Code, Sources, Files,
InMemoryFileSystem.get());
Index: clang/tools/clang-format/CMakeLists.txt
===
--- clang/tools/clang-format/CMakeLists.txt
+++ clang/tools/clang-format/CMakeLists.txt
@@ -7,6 +7,7 @@
 set(CLANG_FORMAT_LIB_DEPS
   clangBasic
   clangFormat
+  clangFrontend
   clangRewrite
   clangToolingCore
   )


Index: clang/tools/clang-format/ClangFormat.cpp
===
--- clang/tools/clang-format/ClangFormat.cpp
+++ clang/tools/clang-format/ClangFormat.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -443,9 +444,12 @@
 IntrusiveRefCntPtr InMemoryFileSystem(
 new llvm::vfs::InMemoryFileSystem);
 FileManager Files(FileSystemOptions(), InMemoryFileSystem);
+IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions;
+TextDiagnosticPrinter *DiagClient =
+new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
 DiagnosticsEngine Diagnostics(
 IntrusiveRefCntPtr(new DiagnosticIDs),
-new DiagnosticOptions);
+&*DiagOpts, DiagClient);
 SourceManager Sources(Diagnostics, Files);
 FileID ID = createInMemoryFile(AssumedFileName, *Code, Sources, Files,
InMemoryFileSystem.get());
Index: clang/tools/clang-format/CMakeLists.txt
===
--- clang/tools/clang-format/CMakeLists.txt
+++ clang/tools/clang-format/CMakeLists.txt
@@ -7,6 +7,7 @@
 set(CLANG_FORMAT_LIB_DEPS
   clangBasic
   clangFormat
+  clangFrontend
   clangRewrite
   clangToolingCore
   )
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D105408: [clang-format] Pass a TextDiagnosticPrinter when we can not create tempory file.

2021-07-04 Thread BRAMI Élie via Phabricator via cfe-commits
Et7f3 updated this revision to Diff 356391.
Et7f3 edited the summary of this revision.
Et7f3 added a comment.

Add a reproduction case in commit message.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105408

Files:
  clang/tools/clang-format/CMakeLists.txt
  clang/tools/clang-format/ClangFormat.cpp


Index: clang/tools/clang-format/ClangFormat.cpp
===
--- clang/tools/clang-format/ClangFormat.cpp
+++ clang/tools/clang-format/ClangFormat.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -443,9 +444,12 @@
 IntrusiveRefCntPtr InMemoryFileSystem(
 new llvm::vfs::InMemoryFileSystem);
 FileManager Files(FileSystemOptions(), InMemoryFileSystem);
+IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions;
+TextDiagnosticPrinter *DiagClient =
+new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
 DiagnosticsEngine Diagnostics(
 IntrusiveRefCntPtr(new DiagnosticIDs),
-new DiagnosticOptions);
+&*DiagOpts, DiagClient);
 SourceManager Sources(Diagnostics, Files);
 FileID ID = createInMemoryFile(AssumedFileName, *Code, Sources, Files,
InMemoryFileSystem.get());
Index: clang/tools/clang-format/CMakeLists.txt
===
--- clang/tools/clang-format/CMakeLists.txt
+++ clang/tools/clang-format/CMakeLists.txt
@@ -7,6 +7,7 @@
 set(CLANG_FORMAT_LIB_DEPS
   clangBasic
   clangFormat
+  clangFrontend
   clangRewrite
   clangToolingCore
   )


Index: clang/tools/clang-format/ClangFormat.cpp
===
--- clang/tools/clang-format/ClangFormat.cpp
+++ clang/tools/clang-format/ClangFormat.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -443,9 +444,12 @@
 IntrusiveRefCntPtr InMemoryFileSystem(
 new llvm::vfs::InMemoryFileSystem);
 FileManager Files(FileSystemOptions(), InMemoryFileSystem);
+IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions;
+TextDiagnosticPrinter *DiagClient =
+new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
 DiagnosticsEngine Diagnostics(
 IntrusiveRefCntPtr(new DiagnosticIDs),
-new DiagnosticOptions);
+&*DiagOpts, DiagClient);
 SourceManager Sources(Diagnostics, Files);
 FileID ID = createInMemoryFile(AssumedFileName, *Code, Sources, Files,
InMemoryFileSystem.get());
Index: clang/tools/clang-format/CMakeLists.txt
===
--- clang/tools/clang-format/CMakeLists.txt
+++ clang/tools/clang-format/CMakeLists.txt
@@ -7,6 +7,7 @@
 set(CLANG_FORMAT_LIB_DEPS
   clangBasic
   clangFormat
+  clangFrontend
   clangRewrite
   clangToolingCore
   )
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D105380: DRAFT: [clang] fixes named return of variables with dependent alignment

2021-07-04 Thread Matheus Izvekov via Phabricator via cfe-commits
mizvekov updated this revision to Diff 356401.
mizvekov added a comment.

- Add tests.
- Refactor common users of this new utility.
- Use std::any_of.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105380

Files:
  clang/include/clang/Sema/Sema.h
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaStmt.cpp
  clang/test/CodeGen/nrvo-tracking.cpp

Index: clang/test/CodeGen/nrvo-tracking.cpp
===
--- clang/test/CodeGen/nrvo-tracking.cpp
+++ clang/test/CodeGen/nrvo-tracking.cpp
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -std=c++20 -fblocks -Wno-return-stack-address -triple x86_64-unknown-unknown-gnu -emit-llvm -O1 -fexperimental-new-pass-manager -o - %s | FileCheck %s
 
-struct X {
+struct alignas(4) X {
 X();
 X(const X&);
 X(X&&);
@@ -210,3 +210,75 @@
 };
   }()();
 }
+
+namespace test_alignas {
+
+template X t1() {
+  X a [[gnu::aligned(A)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t1<8>();
+
+template X t2() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(A)]] [[gnu::aligned(2)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t2<8>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t3Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+X t3() {
+  X a [[gnu::aligned(1)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t4Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t4() {
+  X a [[gnu::aligned(8)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t5Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t5() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(8)]];
+  return a;
+}
+
+} // namespace test_alignas
Index: clang/lib/Sema/SemaStmt.cpp
===
--- clang/lib/Sema/SemaStmt.cpp
+++ clang/lib/Sema/SemaStmt.cpp
@@ -3395,7 +3395,7 @@
 
   // Variables with higher required alignment than their type's ABI
   // alignment cannot use NRVO.
-  if (!VDType->isDependentType() && VD->hasAttr() &&
+  if (!hasDependentAlignment(VD) &&
   Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType))
 Info.S = NamedReturnInfo::MoveEligible;
 
Index: clang/lib/Sema/SemaDecl.cpp
===
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -13310,14 +13310,12 @@
 CheckCompleteDecompositionDeclaration(DD);
 }
 
-/// Determines if a variable's alignment is dependent.
-static bool hasDependentAlignment(VarDecl *VD) {
-  if (VD->getType()->isDependentType())
-return true;
-  for (auto *I : VD->specific_attrs())
-if (I->isAlignmentDependent())
-  return true;
-  return false;
+bool Sema::hasDependentAlignment(const VarDecl *VD) {
+  const auto &range = VD->specific_attrs();
+  return VD->getType()->isDependentType() ||
+ std::any_of(range.begin(), range.end(), [](const AlignedAttr *I) {
+   return I->isAlignmentDependent();
+ });
 }
 
 /// Check if VD needs to be dllexport/dllimport due to being in a
Index: clang/include/clang/Sema/Sema.h
===
--- clang/include/clang/Sema/Sema.h
+++ clang/include/clang/Sema/Sema.h
@@ -2666,6 +2666,9 @@
   /// it looks like the user is trying to modify the shadowing declaration.
   llvm::DenseMap ShadowingDecls;
 
+  /// Determines if a variable's alignment is dependent.
+  static bool hasDependentAlignment(const VarDecl *VD);
+
 public:
   void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
   void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailm

[PATCH] D105380: [clang] fixes named return of variables with dependent alignment

2021-07-04 Thread Arthur O'Dwyer via Phabricator via cfe-commits
Quuxplusone added inline comments.



Comment at: clang/lib/Sema/SemaDecl.cpp:13317
+ std::any_of(range.begin(), range.end(), [](const AlignedAttr *I) {
+   return I->isAlignmentDependent();
+ });

Tangent: It would be nice to rename `isAlignmentDependent` into 
`hasDependentAlignment` or simply `isDependent`. IIUC, the intended meaning is 
"Is this alignment attribute 'dependent'?" and not (as the name would naturally 
parse) "is this alignment attribute 'alignment-dependent'?"

Arguably, it could also work to say `I->isDependentAlignment()` in the same way 
that we say `getType()->isDependentType()`.

Speaking of which, maybe `I` should be renamed to `AA` or something? Is `I` 
really the right abbreviation for an `AlignedAttr`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105380

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


[libunwind] 7cdd768 - [libunwind] reflow some debug logs for better greppability

2021-07-04 Thread Nico Weber via cfe-commits

Author: Nico Weber
Date: 2021-07-04T17:52:23-04:00
New Revision: 7cdd768ac93c6daae709d7a9b9f309716392211e

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

LOG: [libunwind] reflow some debug logs for better greppability

"bad second level page" and "second level compressed unwind table"
can now be grepped for.

(Also remove one of the two spaces between "second" and "level"
in the second message.)

Added: 


Modified: 
libunwind/src/UnwindCursor.hpp

Removed: 




diff  --git a/libunwind/src/UnwindCursor.hpp b/libunwind/src/UnwindCursor.hpp
index e537ed84dd932..757d9808a978d 100644
--- a/libunwind/src/UnwindCursor.hpp
+++ b/libunwind/src/UnwindCursor.hpp
@@ -1737,14 +1737,16 @@ bool UnwindCursor::getInfoFromCompactEncodingSection(pint_t pc,
 else
   funcEnd = firstLevelNextPageFunctionOffset + sects.dso_base;
 if (pc < funcStart) {
-  _LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX not in second  "
-   "level compressed unwind table. funcStart=0x%llX",
+  _LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX "
+   "not in second level compressed unwind table. "
+   "funcStart=0x%llX",
 (uint64_t) pc, (uint64_t) funcStart);
   return false;
 }
 if (pc > funcEnd) {
-  _LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX not in second  "
-  "level compressed unwind table. funcEnd=0x%llX",
+  _LIBUNWIND_DEBUG_LOG("malformed __unwind_info, pc=0x%llX "
+   "not in second level compressed unwind table. "
+   "funcEnd=0x%llX",
(uint64_t) pc, (uint64_t) funcEnd);
   return false;
 }
@@ -1764,9 +1766,9 @@ bool UnwindCursor::getInfoFromCompactEncodingSection(pint_t pc,
  pageEncodingIndex * sizeof(uint32_t));
 }
   } else {
-_LIBUNWIND_DEBUG_LOG("malformed __unwind_info at 0x%0llX bad second "
- "level page",
-  (uint64_t) sects.compact_unwind_section);
+_LIBUNWIND_DEBUG_LOG(
+"malformed __unwind_info at 0x%0llX bad second level page",
+(uint64_t)sects.compact_unwind_section);
 return false;
   }
 



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


[PATCH] D105380: [clang] fixes named return of variables with dependent alignment

2021-07-04 Thread Matheus Izvekov via Phabricator via cfe-commits
mizvekov updated this revision to Diff 356403.
mizvekov added a comment.

- Rename predicate variable from `I` to `AA`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105380

Files:
  clang/include/clang/Sema/Sema.h
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaStmt.cpp
  clang/test/CodeGen/nrvo-tracking.cpp

Index: clang/test/CodeGen/nrvo-tracking.cpp
===
--- clang/test/CodeGen/nrvo-tracking.cpp
+++ clang/test/CodeGen/nrvo-tracking.cpp
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -std=c++20 -fblocks -Wno-return-stack-address -triple x86_64-unknown-unknown-gnu -emit-llvm -O1 -fexperimental-new-pass-manager -o - %s | FileCheck %s
 
-struct X {
+struct alignas(4) X {
 X();
 X(const X&);
 X(X&&);
@@ -210,3 +210,75 @@
 };
   }()();
 }
+
+namespace test_alignas {
+
+template X t1() {
+  X a [[gnu::aligned(A)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t1<8>();
+
+template X t2() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(A)]] [[gnu::aligned(2)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t2<8>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t3Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+X t3() {
+  X a [[gnu::aligned(1)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t4Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t4() {
+  X a [[gnu::aligned(8)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t5Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t5() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(8)]];
+  return a;
+}
+
+} // namespace test_alignas
Index: clang/lib/Sema/SemaStmt.cpp
===
--- clang/lib/Sema/SemaStmt.cpp
+++ clang/lib/Sema/SemaStmt.cpp
@@ -3395,7 +3395,7 @@
 
   // Variables with higher required alignment than their type's ABI
   // alignment cannot use NRVO.
-  if (!VDType->isDependentType() && VD->hasAttr() &&
+  if (!hasDependentAlignment(VD) &&
   Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType))
 Info.S = NamedReturnInfo::MoveEligible;
 
Index: clang/lib/Sema/SemaDecl.cpp
===
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -13310,14 +13310,12 @@
 CheckCompleteDecompositionDeclaration(DD);
 }
 
-/// Determines if a variable's alignment is dependent.
-static bool hasDependentAlignment(VarDecl *VD) {
-  if (VD->getType()->isDependentType())
-return true;
-  for (auto *I : VD->specific_attrs())
-if (I->isAlignmentDependent())
-  return true;
-  return false;
+bool Sema::hasDependentAlignment(const VarDecl *VD) {
+  const auto &range = VD->specific_attrs();
+  return VD->getType()->isDependentType() ||
+ std::any_of(range.begin(), range.end(), [](const AlignedAttr *AA) {
+   return AA->isAlignmentDependent();
+ });
 }
 
 /// Check if VD needs to be dllexport/dllimport due to being in a
Index: clang/include/clang/Sema/Sema.h
===
--- clang/include/clang/Sema/Sema.h
+++ clang/include/clang/Sema/Sema.h
@@ -2666,6 +2666,9 @@
   /// it looks like the user is trying to modify the shadowing declaration.
   llvm::DenseMap ShadowingDecls;
 
+  /// Determines if a variable's alignment is dependent.
+  static bool hasDependentAlignment(const VarDecl *VD);
+
 public:
   void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
   void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D105380: [clang] fixes named return of variables with dependent alignment

2021-07-04 Thread Matheus Izvekov via Phabricator via cfe-commits
mizvekov marked 2 inline comments as done.
mizvekov added inline comments.



Comment at: clang/lib/Sema/SemaDecl.cpp:13317
+ std::any_of(range.begin(), range.end(), [](const AlignedAttr *I) {
+   return I->isAlignmentDependent();
+ });

Quuxplusone wrote:
> Tangent: It would be nice to rename `isAlignmentDependent` into 
> `hasDependentAlignment` or simply `isDependent`. IIUC, the intended meaning 
> is "Is this alignment attribute 'dependent'?" and not (as the name would 
> naturally parse) "is this alignment attribute 'alignment-dependent'?"
> 
> Arguably, it could also work to say `I->isDependentAlignment()` in the same 
> way that we say `getType()->isDependentType()`.
> 
> Speaking of which, maybe `I` should be renamed to `AA` or something? Is `I` 
> really the right abbreviation for an `AlignedAttr`?
I agree, but it is not so simple. This attribute class is autogenerated from 
`clang/include/clang/Basic/Attr.td` and it's not obvious to me where that 
method name comes from. Probably the tablegen backend. But that is another area 
that I am not familiar with yet.
And there are a few users, and also a method named `isAlignmentErrorDependent` 
which would benefit from the same kind of rename.
This DR is supposed to be a quick fix for a regression, I better leave that 
tangent for another time :)

The second rename, well it is very common to name a predicate variable as `I`, 
but I renamed to `AA` as that is also good.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105380

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


[PATCH] D105414: Add x86 and x86_64 to the BareMetal toolchain

2021-07-04 Thread Alejandro G. Vallejo via Phabricator via cfe-commits
agvallejo created this revision.
Herald added subscribers: pengfei, s.egerton, abidh, simoncook.
agvallejo requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

x86_64-unknown-elf should provide an freestanding environment usable
in kernel development. Currently it defaults to Generic_ELF, which
inherits from Generic_GCC, which is tied to the host platform. The
Baremetal toolchain seems like a better choice to add support for
x86 kernel cross-compilation without adding a lot of overrides on
the command line


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D105414

Files:
  clang/lib/Driver/ToolChains/BareMetal.cpp


Index: clang/lib/Driver/ToolChains/BareMetal.cpp
===
--- clang/lib/Driver/ToolChains/BareMetal.cpp
+++ clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -139,6 +139,20 @@
   return Triple.getEnvironmentName() == "elf";
 }
 
+static bool isX86BareMetal(const llvm::Triple &Triple) {
+  if (Triple.getArch() != llvm::Triple::x86 &&
+  Triple.getArch() != llvm::Triple::x86_64)
+return false;
+
+  if (Triple.getVendor() != llvm::Triple::UnknownVendor)
+return false;
+
+  if (Triple.getOS() != llvm::Triple::UnknownOS)
+return false;
+
+  return Triple.getEnvironmentName() == "elf";
+}
+
 void BareMetal::findMultilibs(const Driver &D, const llvm::Triple &Triple,
   const ArgList &Args) {
   DetectedMultilibs Result;
@@ -151,7 +165,9 @@
 }
 
 bool BareMetal::handlesTarget(const llvm::Triple &Triple) {
-  return isARMBareMetal(Triple) || isRISCVBareMetal(Triple);
+  return isARMBareMetal(Triple)   ||
+ isRISCVBareMetal(Triple) ||
+ isX86BareMetal(Triple);
 }
 
 Tool *BareMetal::buildLinker() const {


Index: clang/lib/Driver/ToolChains/BareMetal.cpp
===
--- clang/lib/Driver/ToolChains/BareMetal.cpp
+++ clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -139,6 +139,20 @@
   return Triple.getEnvironmentName() == "elf";
 }
 
+static bool isX86BareMetal(const llvm::Triple &Triple) {
+  if (Triple.getArch() != llvm::Triple::x86 &&
+  Triple.getArch() != llvm::Triple::x86_64)
+return false;
+
+  if (Triple.getVendor() != llvm::Triple::UnknownVendor)
+return false;
+
+  if (Triple.getOS() != llvm::Triple::UnknownOS)
+return false;
+
+  return Triple.getEnvironmentName() == "elf";
+}
+
 void BareMetal::findMultilibs(const Driver &D, const llvm::Triple &Triple,
   const ArgList &Args) {
   DetectedMultilibs Result;
@@ -151,7 +165,9 @@
 }
 
 bool BareMetal::handlesTarget(const llvm::Triple &Triple) {
-  return isARMBareMetal(Triple) || isRISCVBareMetal(Triple);
+  return isARMBareMetal(Triple)   ||
+ isRISCVBareMetal(Triple) ||
+ isX86BareMetal(Triple);
 }
 
 Tool *BareMetal::buildLinker() const {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D105380: [clang] fixes named return of variables with dependent alignment

2021-07-04 Thread Matheus Izvekov via Phabricator via cfe-commits
mizvekov updated this revision to Diff 356409.
mizvekov marked an inline comment as done.
mizvekov added a comment.

format.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105380

Files:
  clang/include/clang/Sema/Sema.h
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaStmt.cpp
  clang/test/CodeGen/nrvo-tracking.cpp

Index: clang/test/CodeGen/nrvo-tracking.cpp
===
--- clang/test/CodeGen/nrvo-tracking.cpp
+++ clang/test/CodeGen/nrvo-tracking.cpp
@@ -1,9 +1,9 @@
 // RUN: %clang_cc1 -std=c++20 -fblocks -Wno-return-stack-address -triple x86_64-unknown-unknown-gnu -emit-llvm -O1 -fexperimental-new-pass-manager -o - %s | FileCheck %s
 
-struct X {
-X();
-X(const X&);
-X(X&&);
+struct alignas(4) X {
+  X();
+  X(const X &);
+  X(X &&);
 };
 
 #define L(A, B, C) void l##A() {\
@@ -210,3 +210,75 @@
 };
   }()();
 }
+
+namespace test_alignas {
+
+template  X t1() {
+  X a [[gnu::aligned(A)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t1<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t1<8>();
+
+template  X t2() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(A)]] [[gnu::aligned(2)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi1EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<1>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi4EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+template X t2<4>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi8EEE1Xv
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+template X t2<8>();
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t3Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  ret void
+X t3() {
+  X a [[gnu::aligned(1)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t4Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t4() {
+  X a [[gnu::aligned(8)]];
+  return a;
+}
+
+// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t5Ev
+// CHECK:   call {{.*}} @_ZN1XC1Ev
+// CHECK-NEXT:  call {{.*}} @_ZN1XC1EOS_
+// CHECK-NEXT:  call void @llvm.lifetime.end
+X t5() {
+  X a [[gnu::aligned(1)]] [[gnu::aligned(8)]];
+  return a;
+}
+
+} // namespace test_alignas
Index: clang/lib/Sema/SemaStmt.cpp
===
--- clang/lib/Sema/SemaStmt.cpp
+++ clang/lib/Sema/SemaStmt.cpp
@@ -3395,7 +3395,7 @@
 
   // Variables with higher required alignment than their type's ABI
   // alignment cannot use NRVO.
-  if (!VDType->isDependentType() && VD->hasAttr() &&
+  if (!hasDependentAlignment(VD) &&
   Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType))
 Info.S = NamedReturnInfo::MoveEligible;
 
Index: clang/lib/Sema/SemaDecl.cpp
===
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -13310,14 +13310,12 @@
 CheckCompleteDecompositionDeclaration(DD);
 }
 
-/// Determines if a variable's alignment is dependent.
-static bool hasDependentAlignment(VarDecl *VD) {
-  if (VD->getType()->isDependentType())
-return true;
-  for (auto *I : VD->specific_attrs())
-if (I->isAlignmentDependent())
-  return true;
-  return false;
+bool Sema::hasDependentAlignment(const VarDecl *VD) {
+  const auto &range = VD->specific_attrs();
+  return VD->getType()->isDependentType() ||
+ std::any_of(range.begin(), range.end(), [](const AlignedAttr *AA) {
+   return AA->isAlignmentDependent();
+ });
 }
 
 /// Check if VD needs to be dllexport/dllimport due to being in a
Index: clang/include/clang/Sema/Sema.h
===
--- clang/include/clang/Sema/Sema.h
+++ clang/include/clang/Sema/Sema.h
@@ -2666,6 +2666,9 @@
   /// it looks like the user is trying to modify the shadowing declaration.
   llvm::DenseMap ShadowingDecls;
 
+  /// Determines if a variable's alignment is dependent.
+  static bool hasDependentAlignment(const VarDecl *VD);
+
 public:
   void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange);
   void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
___
cfe-commits mailing list
cfe

[PATCH] D105414: Add x86 and x86_64 to the BareMetal toolchain

2021-07-04 Thread Alejandro G. Vallejo via Phabricator via cfe-commits
agvallejo added a comment.

I'm still testing this patch, but so far it seems to do the trick. I'm able to 
compile with clang, link with lld and the resulting ELF file appears to be 
correctly free from host dependencies. The command lines (seen with clang -v) 
don't throw the host include paths, host libraries or a dynamic linker into the 
mix, so that's also good. I'm new to the LLVM codebase, so please bear with me 
if this has unintended side-effects


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105414

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


[PATCH] D88398: [X86] Support Intel Key Locker

2021-07-04 Thread Xiang Zhang via Phabricator via cfe-commits
xiangzhangllvm updated this revision to Diff 356413.
xiangzhangllvm added a comment.

Refine Clang format


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

https://reviews.llvm.org/D88398

Files:
  clang/lib/CodeGen/CGBuiltin.cpp

Index: clang/lib/CodeGen/CGBuiltin.cpp
===
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -14758,40 +14758,34 @@
   case X86::BI__builtin_ia32_aesenc256kl_u8:
   case X86::BI__builtin_ia32_aesdec256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
-default: llvm_unreachable("Unexpected builtin");
+default:
+  llvm_unreachable("Unexpected builtin");
 case X86::BI__builtin_ia32_aesenc128kl_u8:
   IID = Intrinsic::x86_aesenc128kl;
-  StrNoErr = "aesenc128kl_no_error";
-  StrErr = "aesenc128kl_error";
-  StrEnd = "aesenc128kl_end";
+  BlockName = "aesenc128kl";
   break;
 case X86::BI__builtin_ia32_aesdec128kl_u8:
   IID = Intrinsic::x86_aesdec128kl;
-  StrNoErr = "aesdec128kl_no_error";
-  StrErr = "aesdec128kl_error";
-  StrEnd = "aesdec128kl_end";
+  BlockName = "aesdec128kl";
   break;
 case X86::BI__builtin_ia32_aesenc256kl_u8:
   IID = Intrinsic::x86_aesenc256kl;
-  StrNoErr = "aesenc256kl_no_error";
-  StrErr = "aesenc256kl_error";
-  StrEnd = "aesenc256kl_end";
+  BlockName = "aesenc256kl";
   break;
 case X86::BI__builtin_ia32_aesdec256kl_u8:
   IID = Intrinsic::x86_aesdec256kl;
-  StrNoErr = "aesdec256kl_no_error";
-  StrErr = "aesdec256kl_error";
-  StrEnd = "aesdec256kl_end";
+  BlockName = "aesdec256kl";
   break;
 }
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), {Ops[1], Ops[2]});
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
@@ -14815,31 +14809,23 @@
   case X86::BI__builtin_ia32_aesencwide256kl_u8:
   case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
 case X86::BI__builtin_ia32_aesencwide128kl_u8:
   IID = Intrinsic::x86_aesencwide128kl;
-  StrNoErr = "aesencwide128kl_no_error";
-  StrErr = "aesencwide128kl_error";
-  StrEnd = "aesencwide128kl_end";
+  BlockName = "aesencwide128kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
   IID = Intrinsic::x86_aesdecwide128kl;
-  StrNoErr = "aesdecwide128kl_no_error";
-  StrErr = "aesdecwide128kl_error";
-  StrEnd = "aesdecwide128kl_end";
+  BlockName = "aesdecwide128kl";
   break;
 case X86::BI__builtin_ia32_aesencwide256kl_u8:
   IID = Intrinsic::x86_aesencwide256kl;
-  StrNoErr = "aesencwide256kl_no_error";
-  StrErr = "aesencwide256kl_error";
-  StrEnd = "aesencwide256kl_end";
+  BlockName = "aesencwide256kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
   IID = Intrinsic::x86_aesdecwide256kl;
-  StrNoErr = "aesdecwide256kl_no_error";
-  StrErr = "aesdecwide256kl_error";
-  StrEnd = "aesdecwide256kl_end";
+  BlockName = "aesdecwide256kl";
   break;
 }
 
@@ -14853,9 +14839,10 @@
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), InOps);
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D88398: [X86] Support Intel Key Locker

2021-07-04 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added a comment.

In D88398#2857370 , @xiangzhangllvm 
wrote:

> Refine Clang format

Did you mean to upload to this old review?


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

https://reviews.llvm.org/D88398

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


[PATCH] D88398: [X86] Support Intel Key Locker

2021-07-04 Thread Xiang Zhang via Phabricator via cfe-commits
xiangzhangllvm added a comment.

Oh, sorry, It is a mistake, I planned to update to 
https://reviews.llvm.org/D105336
How can I revert this update ?


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

https://reviews.llvm.org/D88398

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


[PATCH] D88398: [X86] Support Intel Key Locker

2021-07-04 Thread Xiang Zhang via Phabricator via cfe-commits
xiangzhangllvm added a comment.

I'll use the old patch to recover it, thanks!


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

https://reviews.llvm.org/D88398

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


[clang] a39bb96 - [X86] Refine code of generating BB labels in Keylocker

2021-07-04 Thread Xiang1 Zhang via cfe-commits

Author: Xiang1 Zhang
Date: 2021-07-05T09:29:51+08:00
New Revision: a39bb960fc1e097ac573f3a13e831de3f8826ca2

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

LOG: [X86] Refine code of generating BB labels in Keylocker

Reviewed By: craig.topper

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

Added: 


Modified: 
clang/lib/CodeGen/CGBuiltin.cpp

Removed: 




diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 494f998e3114..0a1a3f319dc1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -14758,40 +14758,34 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned 
BuiltinID,
   case X86::BI__builtin_ia32_aesenc256kl_u8:
   case X86::BI__builtin_ia32_aesdec256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
-default: llvm_unreachable("Unexpected builtin");
+default:
+  llvm_unreachable("Unexpected builtin");
 case X86::BI__builtin_ia32_aesenc128kl_u8:
   IID = Intrinsic::x86_aesenc128kl;
-  StrNoErr = "aesenc128kl_no_error";
-  StrErr = "aesenc128kl_error";
-  StrEnd = "aesenc128kl_end";
+  BlockName = "aesenc128kl";
   break;
 case X86::BI__builtin_ia32_aesdec128kl_u8:
   IID = Intrinsic::x86_aesdec128kl;
-  StrNoErr = "aesdec128kl_no_error";
-  StrErr = "aesdec128kl_error";
-  StrEnd = "aesdec128kl_end";
+  BlockName = "aesdec128kl";
   break;
 case X86::BI__builtin_ia32_aesenc256kl_u8:
   IID = Intrinsic::x86_aesenc256kl;
-  StrNoErr = "aesenc256kl_no_error";
-  StrErr = "aesenc256kl_error";
-  StrEnd = "aesenc256kl_end";
+  BlockName = "aesenc256kl";
   break;
 case X86::BI__builtin_ia32_aesdec256kl_u8:
   IID = Intrinsic::x86_aesdec256kl;
-  StrNoErr = "aesdec256kl_no_error";
-  StrErr = "aesdec256kl_error";
-  StrEnd = "aesdec256kl_end";
+  BlockName = "aesdec256kl";
   break;
 }
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), {Ops[1], Ops[2]});
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
@@ -14815,31 +14809,23 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned 
BuiltinID,
   case X86::BI__builtin_ia32_aesencwide256kl_u8:
   case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
 case X86::BI__builtin_ia32_aesencwide128kl_u8:
   IID = Intrinsic::x86_aesencwide128kl;
-  StrNoErr = "aesencwide128kl_no_error";
-  StrErr = "aesencwide128kl_error";
-  StrEnd = "aesencwide128kl_end";
+  BlockName = "aesencwide128kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
   IID = Intrinsic::x86_aesdecwide128kl;
-  StrNoErr = "aesdecwide128kl_no_error";
-  StrErr = "aesdecwide128kl_error";
-  StrEnd = "aesdecwide128kl_end";
+  BlockName = "aesdecwide128kl";
   break;
 case X86::BI__builtin_ia32_aesencwide256kl_u8:
   IID = Intrinsic::x86_aesencwide256kl;
-  StrNoErr = "aesencwide256kl_no_error";
-  StrErr = "aesencwide256kl_error";
-  StrEnd = "aesencwide256kl_end";
+  BlockName = "aesencwide256kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
   IID = Intrinsic::x86_aesdecwide256kl;
-  StrNoErr = "aesdecwide256kl_no_error";
-  StrErr = "aesdecwide256kl_error";
-  StrEnd = "aesdecwide256kl_end";
+  BlockName = "aesdecwide256kl";
   break;
 }
 
@@ -14853,9 +14839,10 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned 
BuiltinID,
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), InOps);
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.

[PATCH] D105336: [X86] Refine code of generating BB labels in Keylocker

2021-07-04 Thread Xiang Zhang via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa39bb960fc1e: [X86] Refine code of generating BB labels in 
Keylocker (authored by xiangzhangllvm).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105336

Files:
  clang/lib/CodeGen/CGBuiltin.cpp

Index: clang/lib/CodeGen/CGBuiltin.cpp
===
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -14758,40 +14758,34 @@
   case X86::BI__builtin_ia32_aesenc256kl_u8:
   case X86::BI__builtin_ia32_aesdec256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
-default: llvm_unreachable("Unexpected builtin");
+default:
+  llvm_unreachable("Unexpected builtin");
 case X86::BI__builtin_ia32_aesenc128kl_u8:
   IID = Intrinsic::x86_aesenc128kl;
-  StrNoErr = "aesenc128kl_no_error";
-  StrErr = "aesenc128kl_error";
-  StrEnd = "aesenc128kl_end";
+  BlockName = "aesenc128kl";
   break;
 case X86::BI__builtin_ia32_aesdec128kl_u8:
   IID = Intrinsic::x86_aesdec128kl;
-  StrNoErr = "aesdec128kl_no_error";
-  StrErr = "aesdec128kl_error";
-  StrEnd = "aesdec128kl_end";
+  BlockName = "aesdec128kl";
   break;
 case X86::BI__builtin_ia32_aesenc256kl_u8:
   IID = Intrinsic::x86_aesenc256kl;
-  StrNoErr = "aesenc256kl_no_error";
-  StrErr = "aesenc256kl_error";
-  StrEnd = "aesenc256kl_end";
+  BlockName = "aesenc256kl";
   break;
 case X86::BI__builtin_ia32_aesdec256kl_u8:
   IID = Intrinsic::x86_aesdec256kl;
-  StrNoErr = "aesdec256kl_no_error";
-  StrErr = "aesdec256kl_error";
-  StrEnd = "aesdec256kl_end";
+  BlockName = "aesdec256kl";
   break;
 }
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), {Ops[1], Ops[2]});
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
@@ -14815,31 +14809,23 @@
   case X86::BI__builtin_ia32_aesencwide256kl_u8:
   case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
 Intrinsic::ID IID;
-StringRef StrNoErr, StrErr, StrEnd;
+StringRef BlockName;
 switch (BuiltinID) {
 case X86::BI__builtin_ia32_aesencwide128kl_u8:
   IID = Intrinsic::x86_aesencwide128kl;
-  StrNoErr = "aesencwide128kl_no_error";
-  StrErr = "aesencwide128kl_error";
-  StrEnd = "aesencwide128kl_end";
+  BlockName = "aesencwide128kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
   IID = Intrinsic::x86_aesdecwide128kl;
-  StrNoErr = "aesdecwide128kl_no_error";
-  StrErr = "aesdecwide128kl_error";
-  StrEnd = "aesdecwide128kl_end";
+  BlockName = "aesdecwide128kl";
   break;
 case X86::BI__builtin_ia32_aesencwide256kl_u8:
   IID = Intrinsic::x86_aesencwide256kl;
-  StrNoErr = "aesencwide256kl_no_error";
-  StrErr = "aesencwide256kl_error";
-  StrEnd = "aesencwide256kl_end";
+  BlockName = "aesencwide256kl";
   break;
 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
   IID = Intrinsic::x86_aesdecwide256kl;
-  StrNoErr = "aesdecwide256kl_no_error";
-  StrErr = "aesdecwide256kl_error";
-  StrEnd = "aesdecwide256kl_end";
+  BlockName = "aesdecwide256kl";
   break;
 }
 
@@ -14853,9 +14839,10 @@
 
 Value *Call = Builder.CreateCall(CGM.getIntrinsic(IID), InOps);
 
-BasicBlock *NoError = createBasicBlock(StrNoErr, this->CurFn);
-BasicBlock *Error = createBasicBlock(StrErr, this->CurFn);
-BasicBlock *End = createBasicBlock(StrEnd, this->CurFn);
+BasicBlock *NoError =
+createBasicBlock(BlockName + "_no_error", this->CurFn);
+BasicBlock *Error = createBasicBlock(BlockName + "_error", this->CurFn);
+BasicBlock *End = createBasicBlock(BlockName + "_end", this->CurFn);
 
 Value *Ret = Builder.CreateExtractValue(Call, 0);
 Value *Succ = Builder.CreateTrunc(Ret, Builder.getInt1Ty());
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D104617: [clangd] Type hints for structured bindings

2021-07-04 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 356418.
nridge marked 2 inline comments as done.
nridge added a comment.

Address review comments


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104617

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -461,19 +461,70 @@
   ExpectedHint{": int", "init"});
 }
 
-TEST(TypeHints, StructuredBindings) {
-  // FIXME: Not handled yet.
-  // To handle it, we could print:
-  //  - the aggregate type next to the 'auto', or
-  //  - the individual types inside the brackets
-  // The latter is probably more useful.
+// Structured bindings tests.
+// Note, we hint the individual bindings, not the aggregate.
+
+TEST(TypeHints, StructuredBindings_PublicStruct) {
   assertTypeHints(R"cpp(
+// Struct with public fields.
 struct Point {
   int x;
   int y;
 };
 Point foo();
-auto [x, y] = foo();
+auto [$x[[x]], $y[[y]]] = foo();
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_Array) {
+  assertTypeHints(R"cpp(
+int arr[2];
+auto [$x[[x]], $y[[y]]] = arr;
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_TupleLike) {
+  assertTypeHints(R"cpp(
+// Tuple-like type.
+struct IntPair {
+  int a;
+  int b;
+};
+namespace std {
+  template 
+  struct tuple_size {};
+  template <>
+  struct tuple_size {
+constexpr static unsigned value = 2;
+  };
+  template 
+  struct tuple_element {};
+  template 
+  struct tuple_element {
+using type = int;
+  };
+}
+template 
+int get(const IntPair& p) {
+  if constexpr (I == 0) {
+return p.a;
+  } else if constexpr (I == 1) {
+return p.b;
+  }
+}
+IntPair bar();
+auto [$x[[x]], $y[[y]]] = bar();
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_NoInitializer) {
+  assertTypeHints(R"cpp(
+// No initializer (ill-formed).
+// Do not show useless "NULL TYPE" hint.
+auto [x, y];  /*error-ok*/
   )cpp");
 }
 
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -32,6 +32,14 @@
 TypeHintPolicy.SuppressScope = true; // keep type names short
 TypeHintPolicy.AnonymousTagLocations =
 false; // do not print lambda locations
+// Print canonical types. Otherwise, SuppressScope would result in
+// things like "metafunction::type" being shorted to just "type",
+// which is useless. This is particularly important for structured
+// bindings that use the tuple_element protocol, where the non-canonical
+// types would be "tuple_element::type".
+// Note, for "auto", we would often prefer sugared types, but the AST
+// doesn't currently retain them in DeducedType anyways.
+TypeHintPolicy.PrintCanonicalTypes = true;
   }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
@@ -76,9 +84,8 @@
 if (auto *AT = D->getReturnType()->getContainedAutoType()) {
   QualType Deduced = AT->getDeducedType();
   if (!Deduced.isNull()) {
-addInlayHint(D->getFunctionTypeLoc().getRParenLoc(),
- InlayHintKind::TypeHint,
- "-> " + D->getReturnType().getAsString(TypeHintPolicy));
+addTypeHint(D->getFunctionTypeLoc().getRParenLoc(), D->getReturnType(),
+"-> ");
   }
 }
 
@@ -86,10 +93,14 @@
   }
 
   bool VisitVarDecl(VarDecl *D) {
-// Do not show hints for the aggregate in a structured binding.
-// In the future, we may show hints for the individual bindings.
-if (isa(D))
+// Do not show hints for the aggregate in a structured binding,
+// but show hints for the individual bindings.
+if (auto *DD = dyn_cast(D)) {
+  for (auto *Binding : DD->bindings()) {
+addTypeHint(Binding->getLocation(), Binding->getType(), ": ");
+  }
   return true;
+}
 
 if (auto *AT = D->getType()->getContainedAutoType()) {
   if (!D->getType()->isDependentType()) {
@@ -98,8 +109,7 @@
 // (e.g. for `const auto& x = 42`, print `const int&`).
 // Alternatively, we could place the hint on the `auto`
 // (and then just print the type deduced for the `auto`).
-addInlayHint(D->getLocation(), InlayHintKind::TypeHint,
- ":

[clang-tools-extra] a15adbc - [clangd] Type hints for structured bindings

2021-07-04 Thread Nathan Ridge via cfe-commits

Author: Nathan Ridge
Date: 2021-07-04T21:53:36-04:00
New Revision: a15adbcddd078e2ca6b860ec9e4b8c2e5afdb76f

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

LOG: [clangd] Type hints for structured bindings

Hints are shown for the individual bindings, not the aggregate.

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

Added: 


Modified: 
clang-tools-extra/clangd/InlayHints.cpp
clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/InlayHints.cpp 
b/clang-tools-extra/clangd/InlayHints.cpp
index c1a8357201e9c..1283aa4dd62cc 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -32,6 +32,14 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 TypeHintPolicy.SuppressScope = true; // keep type names short
 TypeHintPolicy.AnonymousTagLocations =
 false; // do not print lambda locations
+// Print canonical types. Otherwise, SuppressScope would result in
+// things like "metafunction::type" being shorted to just "type",
+// which is useless. This is particularly important for structured
+// bindings that use the tuple_element protocol, where the non-canonical
+// types would be "tuple_element::type".
+// Note, for "auto", we would often prefer sugared types, but the AST
+// doesn't currently retain them in DeducedType anyways.
+TypeHintPolicy.PrintCanonicalTypes = true;
   }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
@@ -76,9 +84,8 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 if (auto *AT = D->getReturnType()->getContainedAutoType()) {
   QualType Deduced = AT->getDeducedType();
   if (!Deduced.isNull()) {
-addInlayHint(D->getFunctionTypeLoc().getRParenLoc(),
- InlayHintKind::TypeHint,
- "-> " + D->getReturnType().getAsString(TypeHintPolicy));
+addTypeHint(D->getFunctionTypeLoc().getRParenLoc(), D->getReturnType(),
+"-> ");
   }
 }
 
@@ -86,10 +93,14 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
   }
 
   bool VisitVarDecl(VarDecl *D) {
-// Do not show hints for the aggregate in a structured binding.
-// In the future, we may show hints for the individual bindings.
-if (isa(D))
+// Do not show hints for the aggregate in a structured binding,
+// but show hints for the individual bindings.
+if (auto *DD = dyn_cast(D)) {
+  for (auto *Binding : DD->bindings()) {
+addTypeHint(Binding->getLocation(), Binding->getType(), ": ");
+  }
   return true;
+}
 
 if (D->getType()->getContainedAutoType()) {
   if (!D->getType()->isDependentType()) {
@@ -98,8 +109,7 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 // (e.g. for `const auto& x = 42`, print `const int&`).
 // Alternatively, we could place the hint on the `auto`
 // (and then just print the type deduced for the `auto`).
-addInlayHint(D->getLocation(), InlayHintKind::TypeHint,
- ": " + D->getType().getAsString(TypeHintPolicy));
+addTypeHint(D->getLocation(), D->getType(), ": ");
   }
 }
 return true;
@@ -311,6 +321,15 @@ class InlayHintVisitor : public 
RecursiveASTVisitor {
 Kind, Label.str()});
   }
 
+  void addTypeHint(SourceRange R, QualType T, llvm::StringRef Prefix) {
+// Do not print useless "NULL TYPE" hint.
+if (!T.getTypePtrOrNull())
+  return;
+
+addInlayHint(R, InlayHintKind::TypeHint,
+ std::string(Prefix) + T.getAsString(TypeHintPolicy));
+  }
+
   std::vector &Results;
   ASTContext &AST;
   FileID MainFileID;

diff  --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp 
b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index 2c5597e17e2f0..1410ed115b6bf 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -461,19 +461,70 @@ TEST(TypeHints, Lambda) {
   ExpectedHint{": int", "init"});
 }
 
-TEST(TypeHints, StructuredBindings) {
-  // FIXME: Not handled yet.
-  // To handle it, we could print:
-  //  - the aggregate type next to the 'auto', or
-  //  - the individual types inside the brackets
-  // The latter is probably more useful.
+// Structured bindings tests.
+// Note, we hint the individual bindings, not the aggregate.
+
+TEST(TypeHints, StructuredBindings_PublicStruct) {
   assertTypeHints(R"cpp(
+// Struct with public fields.
 struct Point {
   int x;
   int y;
 };
 Point foo();
-auto [x, y] = foo();
+auto [$x[[x]], $y[[y]]] = foo();
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": in

[PATCH] D104617: [clangd] Type hints for structured bindings

2021-07-04 Thread Nathan Ridge via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa15adbcddd07: [clangd] Type hints for structured bindings 
(authored by nridge).

Changed prior to commit:
  https://reviews.llvm.org/D104617?vs=356418&id=356419#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104617

Files:
  clang-tools-extra/clangd/InlayHints.cpp
  clang-tools-extra/clangd/unittests/InlayHintTests.cpp

Index: clang-tools-extra/clangd/unittests/InlayHintTests.cpp
===
--- clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -461,19 +461,70 @@
   ExpectedHint{": int", "init"});
 }
 
-TEST(TypeHints, StructuredBindings) {
-  // FIXME: Not handled yet.
-  // To handle it, we could print:
-  //  - the aggregate type next to the 'auto', or
-  //  - the individual types inside the brackets
-  // The latter is probably more useful.
+// Structured bindings tests.
+// Note, we hint the individual bindings, not the aggregate.
+
+TEST(TypeHints, StructuredBindings_PublicStruct) {
   assertTypeHints(R"cpp(
+// Struct with public fields.
 struct Point {
   int x;
   int y;
 };
 Point foo();
-auto [x, y] = foo();
+auto [$x[[x]], $y[[y]]] = foo();
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_Array) {
+  assertTypeHints(R"cpp(
+int arr[2];
+auto [$x[[x]], $y[[y]]] = arr;
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_TupleLike) {
+  assertTypeHints(R"cpp(
+// Tuple-like type.
+struct IntPair {
+  int a;
+  int b;
+};
+namespace std {
+  template 
+  struct tuple_size {};
+  template <>
+  struct tuple_size {
+constexpr static unsigned value = 2;
+  };
+  template 
+  struct tuple_element {};
+  template 
+  struct tuple_element {
+using type = int;
+  };
+}
+template 
+int get(const IntPair& p) {
+  if constexpr (I == 0) {
+return p.a;
+  } else if constexpr (I == 1) {
+return p.b;
+  }
+}
+IntPair bar();
+auto [$x[[x]], $y[[y]]] = bar();
+  )cpp",
+  ExpectedHint{": int", "x"}, ExpectedHint{": int", "y"});
+}
+
+TEST(TypeHints, StructuredBindings_NoInitializer) {
+  assertTypeHints(R"cpp(
+// No initializer (ill-formed).
+// Do not show useless "NULL TYPE" hint.
+auto [x, y];  /*error-ok*/
   )cpp");
 }
 
Index: clang-tools-extra/clangd/InlayHints.cpp
===
--- clang-tools-extra/clangd/InlayHints.cpp
+++ clang-tools-extra/clangd/InlayHints.cpp
@@ -32,6 +32,14 @@
 TypeHintPolicy.SuppressScope = true; // keep type names short
 TypeHintPolicy.AnonymousTagLocations =
 false; // do not print lambda locations
+// Print canonical types. Otherwise, SuppressScope would result in
+// things like "metafunction::type" being shorted to just "type",
+// which is useless. This is particularly important for structured
+// bindings that use the tuple_element protocol, where the non-canonical
+// types would be "tuple_element::type".
+// Note, for "auto", we would often prefer sugared types, but the AST
+// doesn't currently retain them in DeducedType anyways.
+TypeHintPolicy.PrintCanonicalTypes = true;
   }
 
   bool VisitCXXConstructExpr(CXXConstructExpr *E) {
@@ -76,9 +84,8 @@
 if (auto *AT = D->getReturnType()->getContainedAutoType()) {
   QualType Deduced = AT->getDeducedType();
   if (!Deduced.isNull()) {
-addInlayHint(D->getFunctionTypeLoc().getRParenLoc(),
- InlayHintKind::TypeHint,
- "-> " + D->getReturnType().getAsString(TypeHintPolicy));
+addTypeHint(D->getFunctionTypeLoc().getRParenLoc(), D->getReturnType(),
+"-> ");
   }
 }
 
@@ -86,10 +93,14 @@
   }
 
   bool VisitVarDecl(VarDecl *D) {
-// Do not show hints for the aggregate in a structured binding.
-// In the future, we may show hints for the individual bindings.
-if (isa(D))
+// Do not show hints for the aggregate in a structured binding,
+// but show hints for the individual bindings.
+if (auto *DD = dyn_cast(D)) {
+  for (auto *Binding : DD->bindings()) {
+addTypeHint(Binding->getLocation(), Binding->getType(), ": ");
+  }
   return true;
+}
 
 if (D->getType()->getContainedAutoType()) {
   if (!D->getType()->isDependentType()) {
@@ -98,8 +109,7 @@
 // (e.g. for `const auto& x = 42`, print `const int&`).
 // Alternatively, we could place the hint on

[PATCH] D95588: [RISCV] Implement the MC layer support of P extension

2021-07-04 Thread Jim Lin via Phabricator via cfe-commits
Jim added a comment.

Ping? Thanks.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D95588

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


[PATCH] D102582: [RISCV] Report an error when ABI mismatch with target-abi module flag.

2021-07-04 Thread Zakk Chen via Phabricator via cfe-commits
khchen added a comment.

ping


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102582

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


[PATCH] D102582: [RISCV] Report an error when ABI mismatch with target-abi module flag.

2021-07-04 Thread Jessica Clarke via Phabricator via cfe-commits
jrtc27 added inline comments.



Comment at: llvm/test/CodeGen/RISCV/module-target-abi-tests.ll:5
+; RUN: cat %s > %t.emptyabi
+; RUN: echo '!0 = !{i32 1, !"target-abi", !""}' >> %t.emptyabi
+; RUN: llc -mtriple=riscv32 < %t.emptyabi -o /dev/null

khchen wrote:
> khchen wrote:
> > luismarques wrote:
> > > Is this something that we are handling in general, having such flag 
> > > without a value?
> > Good cached, in general the target-abi is not empty, I updated the current 
> > implementation, thanks!
> @luismarques 
> 
> Sorry, I forget that the empty target-abi are coming from some clang cc1 
> tests. 
> They are missing -target-abi option in clang cc1 so target-abi module flag is 
> empty.
>  
> ```
> CodeGen/RISCV/riscv-atomics.c
> CodeGen/RISCV/riscv-inline-asm-rvv.c
> CodeGen/RISCV/riscv-inline-asm-xsfvfhbfmin.c
> CodeGen/RISCV/riscv-inline-asm.c
> ```
> 
> Maybe we need to calculate the default target-abi if it's empty? or handle 
> empty target-abi in the backend?
> 
I do think we should be filling in the default ABI here, otherwise it's very 
fragile.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D102582

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


[PATCH] D71387: pass -mabi to LTO linker only in RISC-V targets, enable RISC-V LTO

2021-07-04 Thread Zakk Chen via Phabricator via cfe-commits
khchen updated this revision to Diff 356425.
khchen added a comment.

Update test cases.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71387

Files:
  clang/lib/Driver/ToolChains/Arch/RISCV.cpp
  clang/lib/Driver/ToolChains/Arch/RISCV.h
  clang/lib/Driver/ToolChains/BareMetal.cpp
  clang/lib/Driver/ToolChains/BareMetal.h
  clang/lib/Driver/ToolChains/CommonArgs.cpp
  clang/lib/Driver/ToolChains/RISCVToolchain.cpp
  clang/lib/Driver/ToolChains/RISCVToolchain.h
  clang/test/Driver/lto.c

Index: clang/test/Driver/lto.c
===
--- clang/test/Driver/lto.c
+++ clang/test/Driver/lto.c
@@ -85,3 +85,53 @@
 // FLTO-AUTO: -flto=full
 // FLTO-JOBSERVER: -flto=full
 //
+
+// RUN: %clang -target x86_64-unknown-linux-gnu %s -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-TARGET-ABI
+// CHECK-NO-TARGET-ABI-NOT: "-plugin-opt=-target-abi
+
+// Need to pass -target-abi option in RISC-V target.
+// RUN: %clang -target riscv32 %s -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV32-DEFAULT
+// RUN: %clang -target riscv64 %s -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV64-DEFAULT
+// RV32-DEFAULT: "-plugin-opt=-target-abi=ilp32"
+// RV64-DEFAULT: "-plugin-opt=-target-abi=lp64"
+//
+// RUN: %clang -target riscv32-unknown-elf %s -fuse-ld=gold -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV32-DEFAULT-ELF
+// RUN: %clang -target riscv32-unknown-elf %s -fuse-ld=lld -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV32-DEFAULT-ELF
+// RUN: %clang -target riscv32-unknown-linux-gnu %s -fuse-ld=gold -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV32-DEFAULT-LINUX
+// RUN: %clang -target riscv32-unknown-linux-gnu %s -fuse-ld=lld -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV32-DEFAULT-LINUX
+//
+// RV32-DEFAULT-ELF: "-plugin-opt=-target-abi=ilp32"
+// RV32-DEFAULT-LINUX: "-plugin-opt=-target-abi=ilp32d"
+
+// RUN: %clang -target riscv64-unknown-elf %s -fuse-ld=gold -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV64-DEFAULT-ELF
+// RUN: %clang -target riscv64-unknown-elf %s -fuse-ld=lld -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV64-DEFAULT-ELF
+// RUN: %clang -target riscv64-unknown-linux-gnu %s -fuse-ld=gold -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV64-DEFAULT-LINUX
+// RUN: %clang -target riscv64-unknown-linux-gnu %s -fuse-ld=lld -flto \
+// RUN:   -### 2>&1 | FileCheck %s --check-prefix=RV64-DEFAULT-LINUX
+//
+// RV64-DEFAULT-ELF: "-plugin-opt=-target-abi=lp64"
+// RV64-DEFAULT-LINUX: "-plugin-opt=-target-abi=lp64d"
+
+// RUN: %clang -target riscv32-unknown-linux-gnu %s -fuse-ld=gold -flto \
+// RUN:   -mabi=ilp32f -### 2>&1 | FileCheck %s --check-prefix=RISCV-SPEC-ABI-1
+// RUN: %clang -target riscv32-unknown-linux-gnu %s -fuse-ld=gold -flto \
+// RUN:   -mabi=ilp32d -### 2>&1 | FileCheck %s --check-prefix=RISCV-SPEC-ABI-2
+// RUN: %clang -target riscv64-unknown-linux-gnu %s -fuse-ld=lld -flto \
+// RUN:   -mabi=lp64 -### 2>&1 | FileCheck %s --check-prefix=RISCV-SPEC-ABI-3
+// RUN: %clang -target riscv64-unknown-linux-gnu %s -fuse-ld=lld -flto \
+// RUN:   -mabi=lp64f -### 2>&1 | FileCheck %s --check-prefix=RISCV-SPEC-ABI-4
+//
+// RISCV-SPEC-ABI-1: "-plugin-opt=-target-abi=ilp32f"
+// RISCV-SPEC-ABI-2: "-plugin-opt=-target-abi=ilp32d"
+// RISCV-SPEC-ABI-3: "-plugin-opt=-target-abi=lp64"
+// RISCV-SPEC-ABI-4: "-plugin-opt=-target-abi=lp64f"
Index: clang/lib/Driver/ToolChains/RISCVToolchain.h
===
--- clang/lib/Driver/ToolChains/RISCVToolchain.h
+++ clang/lib/Driver/ToolChains/RISCVToolchain.h
@@ -29,6 +29,7 @@
   RuntimeLibType GetDefaultRuntimeLibType() const override;
   UnwindLibType
   GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
+  bool HasNativeLLVMSupport() const override { return true; }
   void
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
 llvm::opt::ArgStringList &CC1Args) const override;
Index: clang/lib/Driver/ToolChains/RISCVToolchain.cpp
===
--- clang/lib/Driver/ToolChains/RISCVToolchain.cpp
+++ clang/lib/Driver/ToolChains/RISCVToolchain.cpp
@@ -7,6 +7,7 @@
 //===--===//
 
 #include "RISCVToolchain.h"
+#include "Arch/RISCV.h"
 #include "CommonArgs.h"
 #include "InputInfo.h"
 #include "clang/Driver/Compilation.h"
@@ -158,6 +159,12 @@
 CmdArgs.push_back("elf32lriscv");
   }
 
+  if (D.isUsingLTO()) {
+assert(!Inputs.empty() && "Must have at least one input.");
+addLTOOptions(ToolChain, Args, CmdArgs, Output, Inputs[0],
+  D.getLTOMode() == LTOK_Thin);
+  }
+
   std::string Linker = getToolChain().GetLinkerPath();
 
   bool WantCRTs =
Index: cla

[PATCH] D105408: [clang-format] Pass a TextDiagnosticPrinter when we can not create tempory file.

2021-07-04 Thread Shivam Gupta via Phabricator via cfe-commits
xgupta added subscribers: MyDeveloperDay, xgupta.
xgupta added a reviewer: MyDeveloperDay.
xgupta added a comment.

Thanks for the patch @Et7f3! I tested it locally and can reproduce it with cat 
folder/file.c
int main()
{
return 0;
}
And indeed the patch also solved the crash issue and emit a correct error 
message but I am not sure about its implementation, I think @MyDeveloperDay can 
best review this patch.

There is a nit in the patch summary, `clang-format -i root/file.c` should be 
`clang-format -i folder/file.c`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105408

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


[PATCH] D105083: [clangd] Ensure Ref::Container refers to an indexed symbol

2021-07-04 Thread Nathan Ridge via Phabricator via cfe-commits
nridge added inline comments.



Comment at: clang-tools-extra/clangd/index/SymbolCollector.cpp:489
 DeclRefs[ND].push_back(
-SymbolRef{SM.getFileLoc(Loc), Roles, ASTNode.Parent});
+SymbolRef{SM.getFileLoc(Loc), Roles, getRefContainer(ASTNode.Parent)});
   // Don't continue indexing if this is a mere reference.

kadircet wrote:
> as mentioned above I think we should start the traversal from 
> `ASTNode.ParentDC`. any downsides to doing that ? I don't see a case where 
> this container we return is **not** a `DeclContext`.
I assume you mean `ASTNode.ContainerDC`.

I tried this suggestion, but it looks like `ContainerDC` does not contain what 
we want in many cases.

For all of the following cases in `SymbolCollectorTest.RefContainers`:

 * ref2 (variable initializer)
 * ref3 (function parameter default value)
 * ref5 (template parameter default value)
 * ref6 (type of variable)
 * ref7a (return type of function)
 * ref7b (parameter type of function)

`ASTNode.ContainerDC` is the `TranslationUnitDecl` (i.e. the `DeclContext` in 
which the function or variable is declared) rather than the function or 
variable itself.

In addition, for ref4 (member initializer), `ContainerDC` is the `RecordDecl` 
rather than the `FieldDecl`.

So, I don't think this suggestion will work without making the `Ref::Container` 
field significantly less specific (and thereby the call hierarchy feature less 
useful in some cases).



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105083

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


[PATCH] D105083: [clangd] Ensure Ref::Container refers to an indexed symbol

2021-07-04 Thread Nathan Ridge via Phabricator via cfe-commits
nridge updated this revision to Diff 356428.
nridge marked an inline comment as done.
nridge added a comment.

Addressed review comments, except for the one about using ContainerDC, for the 
reason explained


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105083

Files:
  clang-tools-extra/clangd/index/SymbolCollector.cpp
  clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
  clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp

Index: clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
===
--- clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
+++ clang-tools-extra/clangd/unittests/SymbolCollectorTests.cpp
@@ -810,8 +810,7 @@
   };
   EXPECT_EQ(Container("ref1a"),
 findSymbol(Symbols, "f2").ID); // function body (call)
-  // FIXME: This is wrongly contained by fptr and not f2.
-  EXPECT_NE(Container("ref1b"),
+  EXPECT_EQ(Container("ref1b"),
 findSymbol(Symbols, "f2").ID); // function body (address-of)
   EXPECT_EQ(Container("ref2"),
 findSymbol(Symbols, "v1").ID); // variable initializer
Index: clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
===
--- clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
+++ clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
@@ -26,6 +26,22 @@
 
 namespace clang {
 namespace clangd {
+
+llvm::raw_ostream &operator<<(llvm::raw_ostream &Stream,
+  const CallHierarchyItem &Item) {
+  return Stream << Item.name << "@" << Item.selectionRange;
+}
+
+llvm::raw_ostream &operator<<(llvm::raw_ostream &Stream,
+  const CallHierarchyIncomingCall &Call) {
+  Stream << "{ from: " << Call.from << ", ranges: [";
+  for (const auto &R : Call.fromRanges) {
+Stream << R;
+Stream << ", ";
+  }
+  return Stream << "] }";
+}
+
 namespace {
 
 using ::testing::AllOf;
@@ -252,6 +268,40 @@
   CheckCallHierarchy(*AST, CalleeC.point(), testPath("callee.cc"));
 }
 
+TEST(CallHierarchy, CallInLocalVarDecl) {
+  // Tests that local variable declarations are not treated as callers
+  // (they're not indexed, so they can't be represented as call hierarchy
+  // items); instead, the caller should be the containing function.
+  // However, namespace-scope variable declarations should be treated as
+  // callers because those are indexed and there is no enclosing entity
+  // that would be a useful caller.
+  Annotations Source(R"cpp(
+int call^ee();
+void caller1() {
+  $call1[[callee]]();
+}
+void caller2() {
+  int localVar = $call2[[callee]]();
+}
+int caller3 = $call3[[callee]]();
+  )cpp");
+  TestTU TU = TestTU::withCode(Source.code());
+  auto AST = TU.build();
+  auto Index = TU.index();
+
+  std::vector Items =
+  prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename));
+  ASSERT_THAT(Items, ElementsAre(WithName("callee")));
+
+  auto Incoming = incomingCalls(Items[0], Index.get());
+  ASSERT_THAT(
+  Incoming,
+  ElementsAre(
+  AllOf(From(WithName("caller1")), FromRanges(Source.range("call1"))),
+  AllOf(From(WithName("caller2")), FromRanges(Source.range("call2"))),
+  AllOf(From(WithName("caller3")), FromRanges(Source.range("call3");
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
Index: clang-tools-extra/clangd/index/SymbolCollector.cpp
===
--- clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -152,6 +152,24 @@
   return None;
 }
 
+// Given a ref contained in enclosing decl `Enclosing`, return
+// the decl that should be used as that ref's Ref::Container. This is
+// usually `Enclosing` itself, but in cases where `Enclosing` is not
+// indexed, we walk further up because Ref::Container should always be
+// an indexed symbol.
+const Decl *getRefContainer(const Decl *Enclosing,
+const SymbolCollector::Options &Opts) {
+  while (Enclosing) {
+const NamedDecl *ND = dyn_cast_or_null(Enclosing);
+if (ND && SymbolCollector::shouldCollectSymbol(*ND, ND->getASTContext(),
+   Opts, true)) {
+  return ND;
+}
+Enclosing = dyn_cast_or_null(Enclosing->getDeclContext());
+  }
+  return nullptr;
+}
+
 } // namespace
 
 // Encapsulates decisions about how to record header paths in the index,
@@ -477,8 +495,8 @@
   !isa(ND) &&
   (Opts.RefsInHeaders ||
SM.getFileID(SM.getFileLoc(Loc)) == SM.getMainFileID()))
-DeclRefs[ND].push_back(
-SymbolRef{SM.getFileLoc(Loc), Roles, ASTNode.Parent});
+DeclRefs[ND].push_back(SymbolRef{SM.getFileLoc(Loc), Roles,
+ getRefContainer(ASTNode

[PATCH] D92004: [OpenCL] add CL 3.0 optional feature support to opencl-c.h

2021-07-04 Thread Dave Airlie via Phabricator via cfe-commits
airlied added a comment.

I'll have to rebase/rebuild my build env, I'll try and have something rebasing 
this cleaner soon.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D92004

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


[PATCH] D104616: [analyzer] Model comparision methods of std::unique_ptr

2021-07-04 Thread Artem Dergachev via Phabricator via cfe-commits
NoQ added a comment.

If everybody's happy let's commit :)




Comment at: clang/test/Analysis/smart-ptr.cpp:467
+
+void uniquePtrComparision(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));





Comment at: clang/test/Analysis/smart-ptr.cpp:487
+
+void uniquePtrComparisionStateSplitting(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));





Comment at: clang/test/Analysis/smart-ptr.cpp:494
+
+void uniquePtrComparisionDifferingTypes(std::unique_ptr unknownPtr) {
+  auto ptr = std::unique_ptr(new int(13));




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104616

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