[PATCH] D85016: [clang-format] Add space between method modifier and a tuple return type in C#

2020-08-03 Thread Krasimir Georgiev via Phabricator via cfe-commits
krasimir accepted this revision.
krasimir added a comment.

Thank you!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85016

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


[PATCH] D63640: [clang] Improve Serialization/Imporing of APValues

2020-08-03 Thread Tyker via Phabricator via cfe-commits
Tyker added inline comments.



Comment at: clang/lib/Sema/SemaDecl.cpp:11883-11885
   ExprResult Result =
   ActOnFinishFullExpr(Init, VDecl->getLocation(),
   /*DiscardedValue*/ false, VDecl->isConstexpr());

rsmith wrote:
> This may create additional AST nodes outside the `ConstantExpr`, which 
> `VarDecl::evaluateValue` is not expecting to see (in particular, if we have 
> cleanups for the initializer). Should the `ConstantExpr` go outside those 
> nodes rather than inside?
i removed the changes to the storage of constexpr values since it was only used 
for testing purposes and we can now use consteval for that purpose.



Comment at: clang/lib/Serialization/ASTReader.cpp:9635
+if (IsExpr) {
+  Base = APValue::LValueBase(ReadExpr(F), CallIndex, Version);
+  ElemTy = Base.get()->getType();

rsmith wrote:
> Tyker wrote:
> > Tyker wrote:
> > > rsmith wrote:
> > > > This is problematic.
> > > > 
> > > > `ReadExpr` will read a new copy of the expression, creating a distinct 
> > > > object. But in the case where we reach this when deserializing (for a 
> > > > `MaterializeTemporaryExpr`), we need to refer to the existing 
> > > > `MaterializeTemporaryExpr` in the initializer of its lifetime-extending 
> > > > declaration. We will also need to serialize the `ASTContext`'s 
> > > > `MaterializedTemporaryValues` collection so that the temporaries 
> > > > lifetime-extended in a constant initializer get properly handled.
> > > > 
> > > > That all sounds very messy, so I think we should reconsider the model 
> > > > that we use for lifetime-extended materialized temporaries. As a 
> > > > half-baked idea:
> > > > 
> > > >  * When we lifetime-extend a temporary, create a 
> > > > `MaterializedTemporaryDecl` to hold its value, and modify 
> > > > `MaterializeTemporaryExpr` to refer to the `MaterializedTemporaryDecl` 
> > > > rather than to just hold the subexpression for the temporary.
> > > >  * Change the `LValueBase` representation to denote the declaration 
> > > > rather than the expression.
> > > >  * Store the constant evaluated value for a materialized temporary on 
> > > > the `MaterializedTemporaryDecl` rather than on a side-table in the 
> > > > `ASTContext`.
> > > > 
> > > > With that done, we should verify that all remaining `Expr*`s used as 
> > > > `LValueBase`s are either only transiently used during evaluation or 
> > > > don't have these kinds of identity problems.
> > > Would it be possible to adapt serialization/deserialization so that they 
> > > make sure that `MaterializeTemporaryExpr` are unique.
> > > by:
> > > 
> > >   - When serializing `MaterializeTemporaryExpr` serialize a key obtained 
> > > from the pointer to the expression as it is unique.
> > >   - When deserializing `MaterializeTemporaryExpr` deserializing the key, 
> > > and than have a cache for previously deserialized expression that need to 
> > > be unique.
> > > 
> > > This would make easier adding new `Expr` that require uniqueness and seem 
> > > less complicated.
> > > What do you think ?
> > i added a review that does the refactoring https://reviews.llvm.org/D69360.
> What are the cases for which we still encounter expressions as lvalue bases 
> during serialization? I think all the other ones should be OK, but maybe 
> there's another interesting one we've overlooked.
the 2 example that come to mind are string literals and type_info there are 
probably more.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D63640

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


[PATCH] D84979: [analyzer][NFC] Refine CStringLength modeling API

2020-08-03 Thread Balázs Kéri via Phabricator via cfe-commits
balazske added a comment.

Really I am still not totally familiar how the checkers work and if it is good 
to have these function names. I was thinking about any checker that needs a 
string length information. It could get the data from CStringChecker using a 
"get" function or test if there is data at all. In this case it may happen that 
this get function modifies state or computes the length at that point? And how 
do the //set// operation work, it only stores a value computed by the calling 
code? And the //create// operation then does the computation and //set// 
together? The functions look not symmetrical, the set and create takes a 
`MemRegion` but the get takes a `SVal`. The create function sets the length for 
the passed memory region but makes no tests on it like the set function (can we 
call the set function from the create?).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84979

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


[PATCH] D77150: [Analyzer] New Option for ContainerModeling: AggressiveEraseModeling

2020-08-03 Thread Balogh , Ádám via Phabricator via cfe-commits
baloghadamsoftware updated this revision to Diff 282642.
baloghadamsoftware added a comment.

Option made hidden. However, I think we should create a category "advanced" for 
options which affect the internal modeling. Our users are programmers and the 
advanced among them should see this option (and others similar to this one).


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

https://reviews.llvm.org/D77150

Files:
  clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
  clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
  clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
  clang/test/Analysis/Inputs/system-header-simulator-cxx.h
  clang/test/Analysis/analyzer-config.c
  clang/test/Analysis/diagnostics/explicit-suppression.cpp
  clang/test/Analysis/iterator-modeling.cpp
  clang/test/Analysis/iterator-range-aggressive-erase-modeling.cpp

Index: clang/test/Analysis/iterator-range-aggressive-erase-modeling.cpp
===
--- /dev/null
+++ clang/test/Analysis/iterator-range-aggressive-erase-modeling.cpp
@@ -0,0 +1,38 @@
+// RUN: %clang_analyze_cc1 -std=c++11 \
+// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange \
+// RUN: -analyzer-config aggressive-binary-operation-simplification=true \
+// RUN: -analyzer-config c++-container-inlining=false %s \
+// RUN: -analyzer-config alpha.cplusplus.ContainerModeling:AggressiveEraseModeling=true \
+// RUN: -verify
+
+// RUN: %clang_analyze_cc1 -std=c++11 \
+// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange \
+// RUN: -analyzer-config aggressive-binary-operation-simplification=true \
+// RUN: -analyzer-config c++-container-inlining=true -DINLINE=1 %s \
+// RUN: -analyzer-config alpha.cplusplus.ContainerModeling:AggressiveEraseModeling=true \
+// RUN: -verify
+
+#include "Inputs/system-header-simulator-cxx.h"
+
+extern void __assert_fail (__const char *__assertion, __const char *__file,
+unsigned int __line, __const char *__function)
+ __attribute__ ((__noreturn__));
+#define assert(expr) \
+  ((expr)  ? (void)(0)  : __assert_fail (#expr, __FILE__, __LINE__, __func__))
+
+void bad_erase_loop(std::list L) {
+  for (auto i = L.cbegin(); i != L.end(); ++i) { // expected-warning{{Iterator incremented behind the past-the-end iterator}}
+i = L.erase(i);
+  }
+}
+
+void bad_erase_loop(std::vector V) {
+  for (auto i = V.cbegin(); i != V.end(); ++i) { // expected-warning{{Iterator incremented behind the past-the-end iterator}}
+i = V.erase(i);
+  }
+}
+void bad_erase_loop(std::deque D) {
+  for (auto i = D.cbegin(); i != D.end(); ++i) { // expected-warning{{Iterator incremented behind the past-the-end iterator}}
+i = D.erase(i);
+  }
+}
Index: clang/test/Analysis/iterator-modeling.cpp
===
--- clang/test/Analysis/iterator-modeling.cpp
+++ clang/test/Analysis/iterator-modeling.cpp
@@ -873,9 +873,9 @@
   clang_analyzer_eval(clang_analyzer_iterator_validity(i0)); //expected-warning{{TRUE}}
   clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}}
 
-  clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$
-  // clang_analyzer_express(clang_analyzer_iterator_position(i2)); FIXME: expect warning $L.begin() - 1
-  clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.end(){{$
+  clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning{{$L.begin()}}
+  clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning{{$L.end()}}
+  clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning{{$L.begin()}}
 }
 
 void list_insert_behind_begin(std::list , int n) {
@@ -890,10 +890,10 @@
   clang_analyzer_eval(clang_analyzer_iterator_validity(i1)); //expected-warning{{TRUE}}
   clang_analyzer_eval(clang_analyzer_iterator_validity(i2)); //expected-warning{{TRUE}}
 
-  clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning-re {{$L.begin(){{$ FIXME: Should be $L.begin() - 1
-  clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning-re {{$L.begin() + 1{{$
-  // clang_analyzer_express(clang_analyzer_iterator_position(i3)); FIXME: expect warning $L.begin()
-  clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning-re {{$L.end(){{$
+  clang_analyzer_express(clang_analyzer_iterator_position(i0)); // expected-warning{{$L.begin()}}
+  clang_analyzer_express(clang_analyzer_iterator_position(i1)); // expected-warning{{$L.begin() + 1}}
+  clang_analyzer_express(clang_analyzer_iterator_position(i2)); // expected-warning{{$L.end()}}
+  clang_analyzer_express(clang_analyzer_iterator_position(i3)); // expected-warning{{$L.begin()}}
 }
 
 template  Iter return_any_iterator(const Iter );
@@ -911,10 +911,10 @@
   

[PATCH] D85128: [Prototype][SVE] Support arm_sve_vector_bits attribute

2020-08-03 Thread Thorsten via Phabricator via cfe-commits
tschuett added a comment.

Stupid questions.

- Is it for convenience? You get arrays, global variables, structs, ... . 
Vectorization becomes easier ...
- Are there any potential performance benefits over scalable vectors?
- Is it compatible with GCC?




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85128

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


[PATCH] D77229: [Analyzer] Avoid handling of LazyCompundVals in IteratorModeling

2020-08-03 Thread Balogh , Ádám via Phabricator via cfe-commits
baloghadamsoftware updated this revision to Diff 282626.
baloghadamsoftware added a comment.

Crash Fix: do not retrieve first iterator argument in advance. (It may happen 
that although argument count is more than zero, there is no argument at all.)


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

https://reviews.llvm.org/D77229

Files:
  clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
  clang/lib/StaticAnalyzer/Checkers/InvalidatedIteratorChecker.cpp
  clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
  clang/lib/StaticAnalyzer/Checkers/Iterator.h
  clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp
  clang/lib/StaticAnalyzer/Checkers/IteratorRangeChecker.cpp
  clang/lib/StaticAnalyzer/Checkers/MismatchedIteratorChecker.cpp
  clang/lib/StaticAnalyzer/Checkers/STLAlgorithmModeling.cpp

Index: clang/lib/StaticAnalyzer/Checkers/STLAlgorithmModeling.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/STLAlgorithmModeling.cpp
+++ clang/lib/StaticAnalyzer/Checkers/STLAlgorithmModeling.cpp
@@ -24,12 +24,12 @@
 namespace {
 
 class STLAlgorithmModeling : public Checker {
-  bool evalFind(CheckerContext , const CallExpr *CE) const;
+  void evalFind(CheckerContext , const CallExpr *CE, SVal Begin,
+SVal End) const;
 
-  void Find(CheckerContext , const CallExpr *CE, unsigned paramNum) const;
-
-  using FnCheck = bool (STLAlgorithmModeling::*)(CheckerContext &,
-const CallExpr *) const;
+  using FnCheck = void (STLAlgorithmModeling::*)(CheckerContext &,
+ const CallExpr *, SVal Begin,
+ SVal End) const;
 
   const CallDescriptionMap Callbacks = {
 {{{"std", "find"}, 3}, ::evalFind},
@@ -67,51 +67,53 @@
 
 bool STLAlgorithmModeling::evalCall(const CallEvent ,
 CheckerContext ) const {
-  const auto *CE = dyn_cast_or_null(Call.getOriginExpr());
-  if (!CE)
-return false;
-
-  const FnCheck *Handler = Callbacks.lookup(Call);
-  if (!Handler)
-return false;
-
-  return (this->**Handler)(C, CE);
-}
-
-bool STLAlgorithmModeling::evalFind(CheckerContext ,
-const CallExpr *CE) const {
   // std::find()-like functions either take their primary range in the first
   // two parameters, or if the first parameter is "execution policy" then in
   // the second and third. This means that the second parameter must always be
   // an iterator.
-  if (!isIteratorType(CE->getArg(1)->getType()))
+  if (Call.getNumArgs() < 2 || !isIteratorType(Call.getArgExpr(1)->getType()))
 return false;
 
+  unsigned ArgNum = 999;
+
   // If no "execution policy" parameter is used then the first argument is the
   // beginning of the range.
-  if (isIteratorType(CE->getArg(0)->getType())) {
-Find(C, CE, 0);
-return true;
+  if (isIteratorType(Call.getArgExpr(0)->getType())) {
+ArgNum = 0;
   }
 
   // If "execution policy" parameter is used then the second argument is the
   // beginning of the range.
-  if (isIteratorType(CE->getArg(2)->getType())) {
-Find(C, CE, 1);
-return true;
+  if (ArgNum > 0 &&
+  Call.getNumArgs() > 2 && isIteratorType(Call.getArgExpr(2)->getType())) {
+ArgNum = 1;
   }
 
-  return false;
+  if (ArgNum == 999)
+return false;
+
+  SVal ArgB = getIteratorArg(Call, ArgNum, C.blockCount());
+  SVal ArgE = getIteratorArg(Call, ArgNum + 1, C.blockCount());
+
+  const auto *CE = dyn_cast_or_null(Call.getOriginExpr());
+  if (!CE)
+return false;
+
+  const FnCheck *Handler = Callbacks.lookup(Call);
+  if (!Handler)
+return false;
+
+  (this->**Handler)(C, CE, ArgB, ArgE);
+  return true;
 }
 
-void STLAlgorithmModeling::Find(CheckerContext , const CallExpr *CE,
-unsigned paramNum) const {
+void STLAlgorithmModeling::evalFind(CheckerContext , const CallExpr *CE,
+SVal Begin, SVal End) const {
   auto State = C.getState();
   auto  = C.getSValBuilder();
   const auto *LCtx = C.getLocationContext();
 
   SVal RetVal = SVB.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount());
-  SVal Param = State->getSVal(CE->getArg(paramNum), LCtx);
 
   auto StateFound = State->BindExpr(CE, LCtx, RetVal);
 
@@ -119,7 +121,7 @@
   // assume that in case of successful search the position of the found element
   // is not ahead of it.
   // FIXME: Reverse iterators
-  const auto *Pos = getIteratorPosition(State, Param);
+  const auto *Pos = getIteratorPosition(State, Begin);
   if (Pos) {
 StateFound = createIteratorPosition(StateFound, RetVal, Pos->getContainer(),
 CE, LCtx, C.blockCount());
@@ -135,13 +137,11 @@
 StateFound = StateFound->assume(GreaterOrEqual.castAs(), true);
   }
 
-  Param = State->getSVal(CE->getArg(paramNum + 1), LCtx);
-
   // If we have an 

[PATCH] D85102: [clang] improve diagnostics for misaligned and large atomics

2020-08-03 Thread Thorsten via Phabricator via cfe-commits
tschuett added a comment.

I wanted to save space. I know that the alignment is missing there, but the 
line is already too long.

I have no rights to commit.


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

https://reviews.llvm.org/D85102

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


[PATCH] D84246: [clang][LTO] Pass-through remarks options and set auto hotness threshold

2020-08-03 Thread Wei Wang via Phabricator via cfe-commits
weiwang added a comment.

still waiting for inputs. Thanks.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84246

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


[PATCH] D81242: [StackSafety] Run ThinLTO

2020-08-03 Thread Teresa Johnson via Phabricator via cfe-commits
tejohnson added a comment.

In D81242#2190041 , @vitalybuka wrote:

> In D81242#2188467 , @tejohnson wrote:
>
>> In D81242#2188441 , @vitalybuka 
>> wrote:
>>
>>> In D81242#2183383 , @tejohnson 
>>> wrote:
>>>
 Is the stack safety analysis meant to be always on with ThinLTO?
>>>
>>> During compilation most of the time it should be off.
>>> However during linking I assume that most build FS->paramAccesses() is 
>>> empty, so no hash lookup is expected. So I assume empty looks should be 
>>> cheap:
>>>
>>>   for (auto  : Index) {
>>>   for (auto  : GVS.second.SummaryList) {
>>>   }}
>>>
>>> As it paramAccesses suppose to be non-empty for MTE builds for now, so if 
>>> it's not empty on internal build, then the bug it likely around why it's 
>>> not empty there.
>>> Can you send me email with internal build details?
>>
>> Will do
>
> Thanks, I was able to reproduce.
> As expected hash table lookup was not reached. However code inserts empty 
> FunctionInfo into std::map Functions. Which does not affect 
> correctness, but totally unnecessary and noticeable on profile.
> https://reviews.llvm.org/rG08cf49658c1d resolves the issue.
>
> I'll still check if we can replace guids with ValueInfo to optimize case when 
> StackSafety is active.

Thanks for the fix! I'm surprised simply inserting an entry for every function 
into a map would be so expensive. This was more expensive than the function 
importing algorithm, which also does a lot of map insertions (although per GUID 
not per function summary).

Looking at the code, could you improve that by not inserting a map entry in the 
case where the summary is not live and or not dso local? I.e. the case where 
the code isn't even looking at the paramAccesses(). Also, note that if any copy 
in the summary list for a VI is not live, all copies must be dead (the way 
computeDeadSymbols works guarantees this). So you could skip the SummaryList 
iteration completely if the first one is not live. I'm also exploiting this 
fact in my recent fix D84985 .


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D81242

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


[PATCH] D84540: [CodeGen][ObjC] Mark calls to objc_unsafeClaimAutoreleasedReturnValue as notail on x86-64

2020-08-03 Thread John McCall via Phabricator via cfe-commits
rjmccall accepted this revision.
rjmccall added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84540

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


[PATCH] D44536: Avoid segfault when destructor is not yet known

2020-08-03 Thread John McCall via Phabricator via cfe-commits
rjmccall added a comment.

Would you like to pick it back up?  We laid out an implementation path: we need 
to track the fact that a delete was of an incomplete class type in the AST and 
then unconditionally treat such operations as trivial to destroy in IRGen.


Repository:
  rC Clang

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

https://reviews.llvm.org/D44536

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


[PATCH] D85144: [clang] Improve Dumping of APValues

2020-08-03 Thread Tyker via Phabricator via cfe-commits
Tyker created this revision.
Tyker added reviewers: rsmith, riccibruno.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Tyker requested review of this revision.

this is required for proper testing of D63640 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85144

Files:
  clang/include/clang/AST/APValue.h
  clang/include/clang/AST/PrettyPrinter.h
  clang/lib/AST/APValue.cpp
  clang/lib/AST/TextNodeDumper.cpp
  clang/test/AST/ast-dump-APValue-LValue.cpp
  clang/test/AST/ast-dump-APValue-MemPtr.cpp
  clang/test/AST/ast-dump-APValue-todo.cpp

Index: clang/test/AST/ast-dump-APValue-todo.cpp
===
--- clang/test/AST/ast-dump-APValue-todo.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Test without serialization:
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
-// RUN:-ast-dump %s -ast-dump-filter Test \
-// RUN: | FileCheck --strict-whitespace --match-full-lines %s
-//
-// Test with serialization:
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 -emit-pch -o %t %s
-// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
-// RUN:   -include-pch %t -ast-dump-all -ast-dump-filter Test /dev/null \
-// RUN: | sed -e "s/ //" -e "s/ imported//" \
-// RUN: | FileCheck --strict-whitespace --match-full-lines %s
-
-int i;
-struct S {
-  int i;
-};
-
-void Test() {
-  constexpr int *pi = 
-  // CHECK:  | `-VarDecl {{.*}}  col:{{.*}} pi 'int *const' constexpr cinit
-  // CHECK-NEXT:  |   |-value: LValue 
-
-  constexpr int(S::*pmi) = ::i;
-  // CHECK:`-VarDecl {{.*}}  col:{{.*}} pmi 'int (S::*const)' constexpr cinit
-  // CHECK-NEXT:  |-value: MemberPointer 
-}
Index: clang/test/AST/ast-dump-APValue-MemPtr.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-APValue-MemPtr.cpp
@@ -0,0 +1,15 @@
+// Test without serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN:-ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace %s
+
+int i;
+struct S {
+  int i;
+};
+
+void Test() {
+  constexpr int(S::*pmi) = ::i;
+  // CHECK:VarDecl {{.*}}  col:{{.*}} pmi 'int (S::*const)' constexpr cinit
+  // CHECK-NEXT:  value: MemberPointer ::i
+}
Index: clang/test/AST/ast-dump-APValue-LValue.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-APValue-LValue.cpp
@@ -0,0 +1,12 @@
+// Test without serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN:-ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace %s
+
+int i;
+
+void Test() {
+  constexpr int *pi = 
+  // CHECK:  VarDecl {{.*}}  col:{{.*}} pi 'int *const' constexpr cinit
+  // CHECK-NEXT:  |-value: LValue 
+}
Index: clang/lib/AST/TextNodeDumper.cpp
===
--- clang/lib/AST/TextNodeDumper.cpp
+++ clang/lib/AST/TextNodeDumper.cpp
@@ -493,7 +493,8 @@
 return;
   case APValue::LValue:
 (void)Context;
-OS << "LValue ";
+OS << "LValue ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   case APValue::Array: {
 unsigned ArraySize = Value.getArraySize();
@@ -558,10 +559,12 @@
 return;
   }
   case APValue::MemberPointer:
-OS << "MemberPointer ";
+OS << "MemberPointer ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   case APValue::AddrLabelDiff:
-OS << "AddrLabelDiff ";
+OS << "AddrLabelDiff ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   }
   llvm_unreachable("Unknown APValue kind!");
Index: clang/lib/AST/APValue.cpp
===
--- clang/lib/AST/APValue.cpp
+++ clang/lib/AST/APValue.cpp
@@ -386,9 +386,10 @@
   return V.convertToDouble();
 }
 
-void APValue::printPretty(raw_ostream , const ASTContext ,
-  QualType Ty) const {
-  switch (getKind()) {
+static void InternalPrinter(raw_ostream , const APValue , QualType Ty,
+const ASTContext *Ctx,
+const clang::PrintingPolicy ) {
+  switch (Value.getKind()) {
   case APValue::None:
 Out << "";
 return;
@@ -397,33 +398,33 @@
 return;
   case APValue::Int:
 if (Ty->isBooleanType())
-  Out << (getInt().getBoolValue() ? "true" : "false");
+  Out << (Value.getInt().getBoolValue() ? "true" : "false");
 else
-  Out << getInt();
+  Out << Value.getInt();
 return;
   case APValue::Float:
-Out << GetApproxValue(getFloat());
+Out << GetApproxValue(Value.getFloat());
 return;
   case APValue::FixedPoint:
-Out << getFixedPoint();
+Out << Value.getFixedPoint();
 return;
   case 

[PATCH] D85076: [clang][Tooling] Fix addTargetAndModeForProgramName to use correct flag names

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG87de54dbb6ef: [clang][Tooling] Fix 
addTargetAndModeForProgramName to use correct flag names (authored by kadircet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85076

Files:
  clang/lib/Tooling/Tooling.cpp
  clang/unittests/Tooling/ToolingTest.cpp

Index: clang/unittests/Tooling/ToolingTest.cpp
===
--- clang/unittests/Tooling/ToolingTest.cpp
+++ clang/unittests/Tooling/ToolingTest.cpp
@@ -621,7 +621,7 @@
   addTargetAndModeForProgramName(Args, "");
   EXPECT_EQ((std::vector{"clang", "-foo"}), Args);
   addTargetAndModeForProgramName(Args, Target + "-g++");
-  EXPECT_EQ((std::vector{"clang", "-target", Target,
+  EXPECT_EQ((std::vector{"clang", "--target=" + Target,
   "--driver-mode=g++", "-foo"}),
 Args);
 }
@@ -635,7 +635,7 @@
 
   std::vector Args = {"clang", "-foo"};
   addTargetAndModeForProgramName(Args, ToolPath);
-  EXPECT_EQ((std::vector{"clang", "-target", Target,
+  EXPECT_EQ((std::vector{"clang", "--target=" + Target,
   "--driver-mode=g++", "-foo"}),
 Args);
 }
@@ -650,10 +650,10 @@
   "-target", "something"}),
 Args);
 
-  std::vector ArgsAlt = {"clang", "-foo", "-target=something"};
+  std::vector ArgsAlt = {"clang", "-foo", "--target=something"};
   addTargetAndModeForProgramName(ArgsAlt, Target + "-g++");
   EXPECT_EQ((std::vector{"clang", "--driver-mode=g++", "-foo",
-  "-target=something"}),
+  "--target=something"}),
 ArgsAlt);
 }
 
@@ -663,15 +663,9 @@
 
   std::vector Args = {"clang", "-foo", "--driver-mode=abc"};
   addTargetAndModeForProgramName(Args, Target + "-g++");
-  EXPECT_EQ((std::vector{"clang", "-target", Target, "-foo",
+  EXPECT_EQ((std::vector{"clang", "--target=" + Target, "-foo",
   "--driver-mode=abc"}),
 Args);
-
-  std::vector ArgsAlt = {"clang", "-foo", "--driver-mode", "abc"};
-  addTargetAndModeForProgramName(ArgsAlt, Target + "-g++");
-  EXPECT_EQ((std::vector{"clang", "-target", Target, "-foo",
-  "--driver-mode", "abc"}),
-ArgsAlt);
 }
 
 #ifndef _WIN32
Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -245,27 +245,37 @@
 
 void addTargetAndModeForProgramName(std::vector ,
 StringRef InvokedAs) {
-  if (!CommandLine.empty() && !InvokedAs.empty()) {
-bool AlreadyHasTarget = false;
-bool AlreadyHasMode = false;
-// Skip CommandLine[0].
-for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
- ++Token) {
-  StringRef TokenRef(*Token);
-  AlreadyHasTarget |=
-  (TokenRef == "-target" || TokenRef.startswith("-target="));
-  AlreadyHasMode |= (TokenRef == "--driver-mode" ||
- TokenRef.startswith("--driver-mode="));
-}
-auto TargetMode =
-driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-if (!AlreadyHasMode && TargetMode.DriverMode) {
-  CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
-}
-if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
-  CommandLine.insert(++CommandLine.begin(), {"-target",
- TargetMode.TargetPrefix});
-}
+  if (CommandLine.empty() || InvokedAs.empty())
+return;
+  const auto  = driver::getDriverOptTable();
+  // --target=X
+  const std::string TargetOPT =
+  Table.getOption(driver::options::OPT_target).getPrefixedName();
+  // -target X
+  const std::string TargetOPTLegacy =
+  Table.getOption(driver::options::OPT_target_legacy_spelling)
+  .getPrefixedName();
+  // --driver-mode=X
+  const std::string DriverModeOPT =
+  Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
+  bool AlreadyHasTarget = false;
+  bool AlreadyHasMode = false;
+  // Skip CommandLine[0].
+  for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
+   ++Token) {
+StringRef TokenRef(*Token);
+AlreadyHasTarget |=
+TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
+AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+  }
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  if (!AlreadyHasMode && TargetMode.DriverMode) {
+CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
+  }
+  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+CommandLine.insert(++CommandLine.begin(),
+   

[clang] 87de54d - [clang][Tooling] Fix addTargetAndModeForProgramName to use correct flag names

2020-08-03 Thread Kadir Cetinkaya via cfe-commits

Author: Kadir Cetinkaya
Date: 2020-08-03T11:46:58+02:00
New Revision: 87de54dbb6efa0fc5e304f94b350a39066bc2759

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

LOG: [clang][Tooling] Fix addTargetAndModeForProgramName to use correct flag 
names

The logic was using incorrect flag versions. For example:
- `-target=` can't be a prefix, it must be `--target=`.
- `--driver-mode` can't appear on its own, value must be attached to it.

While fixing those, also changes the append logic to make use of new
`--target=X` format instead of the legacy `-target X` version.

In addition to that makes use of the OPTTable instead of hardcoded strings to
make sure helper also gets updated if clang's options are modified.

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

Added: 


Modified: 
clang/lib/Tooling/Tooling.cpp
clang/unittests/Tooling/ToolingTest.cpp

Removed: 




diff  --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp
index 40b6cff0d627..0593f0cc1d19 100644
--- a/clang/lib/Tooling/Tooling.cpp
+++ b/clang/lib/Tooling/Tooling.cpp
@@ -245,27 +245,37 @@ std::string getAbsolutePath(StringRef File) {
 
 void addTargetAndModeForProgramName(std::vector ,
 StringRef InvokedAs) {
-  if (!CommandLine.empty() && !InvokedAs.empty()) {
-bool AlreadyHasTarget = false;
-bool AlreadyHasMode = false;
-// Skip CommandLine[0].
-for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
- ++Token) {
-  StringRef TokenRef(*Token);
-  AlreadyHasTarget |=
-  (TokenRef == "-target" || TokenRef.startswith("-target="));
-  AlreadyHasMode |= (TokenRef == "--driver-mode" ||
- TokenRef.startswith("--driver-mode="));
-}
-auto TargetMode =
-driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-if (!AlreadyHasMode && TargetMode.DriverMode) {
-  CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
-}
-if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
-  CommandLine.insert(++CommandLine.begin(), {"-target",
- TargetMode.TargetPrefix});
-}
+  if (CommandLine.empty() || InvokedAs.empty())
+return;
+  const auto  = driver::getDriverOptTable();
+  // --target=X
+  const std::string TargetOPT =
+  Table.getOption(driver::options::OPT_target).getPrefixedName();
+  // -target X
+  const std::string TargetOPTLegacy =
+  Table.getOption(driver::options::OPT_target_legacy_spelling)
+  .getPrefixedName();
+  // --driver-mode=X
+  const std::string DriverModeOPT =
+  Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
+  bool AlreadyHasTarget = false;
+  bool AlreadyHasMode = false;
+  // Skip CommandLine[0].
+  for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
+   ++Token) {
+StringRef TokenRef(*Token);
+AlreadyHasTarget |=
+TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
+AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+  }
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  if (!AlreadyHasMode && TargetMode.DriverMode) {
+CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
+  }
+  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+CommandLine.insert(++CommandLine.begin(),
+   TargetOPT + TargetMode.TargetPrefix);
   }
 }
 

diff  --git a/clang/unittests/Tooling/ToolingTest.cpp 
b/clang/unittests/Tooling/ToolingTest.cpp
index 5bd2864b5ba1..cc6f453284d7 100644
--- a/clang/unittests/Tooling/ToolingTest.cpp
+++ b/clang/unittests/Tooling/ToolingTest.cpp
@@ -621,7 +621,7 @@ TEST(addTargetAndModeForProgramName, AddsTargetAndMode) {
   addTargetAndModeForProgramName(Args, "");
   EXPECT_EQ((std::vector{"clang", "-foo"}), Args);
   addTargetAndModeForProgramName(Args, Target + "-g++");
-  EXPECT_EQ((std::vector{"clang", "-target", Target,
+  EXPECT_EQ((std::vector{"clang", "--target=" + Target,
   "--driver-mode=g++", "-foo"}),
 Args);
 }
@@ -635,7 +635,7 @@ TEST(addTargetAndModeForProgramName, PathIgnored) {
 
   std::vector Args = {"clang", "-foo"};
   addTargetAndModeForProgramName(Args, ToolPath);
-  EXPECT_EQ((std::vector{"clang", "-target", Target,
+  EXPECT_EQ((std::vector{"clang", "--target=" + Target,
   "--driver-mode=g++", "-foo"}),
 Args);
 }
@@ -650,10 +650,10 @@ TEST(addTargetAndModeForProgramName, 
IgnoresExistingTarget) {
   "-target", "something"}),
 Args);
 
-  std::vector ArgsAlt = {"clang", "-foo", "-target=something"};
+  

[PATCH] D85077: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Haojian Wu via Phabricator via cfe-commits
hokein added inline comments.



Comment at: clang/lib/Tooling/Tooling.cpp:264
+  // No need to search for target args if we don't have a mode to insert.
+  bool AlreadyHasTarget = !TargetMode.TargetIsValid;
   bool AlreadyHasMode = false;

kadircet wrote:
> hokein wrote:
> > While this is an optimization, I find the code is a bit harder to follow, 
> > with this patch `AlreadyHasTarget` has two semantic meanings: 1) for has 
> > target and 2) for target mode is valid.
> > 
> > I guess we could do it like
> > 
> > ```
> > if (TargetMode.TargetIsValid) {
> >   // set the TargetOPT, TargetOPTLegacy variables
> >   // search the command line of the target opt.
> >   // insert to CommandLine.
> > }
> > ```
> > 
> > maybe we could do the same thing for the DriverMode
> > 
> > ```
> > if (TargetMode.DriverMode) {
> >   ...
> > }
> > ```
> i would rather not duplicate the loop, what about renaming 
> `AlreadyHastTarget` to `ShouldAddTarget` (likewise for `AlyreadyHasMode`) ?
I'd not worry too much about the loop, but rename also seems ok to me.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85077

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


[PATCH] D74436: Change clang option -ffp-model=precise to select ffp-contract=on

2020-08-03 Thread Roman Lebedev via Phabricator via cfe-commits
lebedev.ri requested changes to this revision.
lebedev.ri added a comment.
This revision now requires changes to proceed.

In D74436#2190422 , @fhahn wrote:

> IIUC the patch is currently reverted (in 
> 78654e8511cf16d49f6680d782f3771a767ba942 
> ), due 
> to ~20 llvm-test-suite failures.
>
> The failures on X86 are listed below. Unfortunately most tests just compare 
> the hash of the output, so it is not obvious in what way the results are 
> changed.

Presumably it means that whatever optimization options those test specify, are 
now either more strict or less strict.
I think this is really missing some codegen tests that show how codegen 
actually changes by this.

> Any ideas on how to move forward on this? I'll update the diff with a rebased 
> version on current trunk, which I used to reproduce the failures.
>
>   Failed Tests (22):
> test-suite :: MultiSource/Applications/oggenc/oggenc.test
> test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/CLAMR/CLAMR.test
> test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/HPCCG/HPCCG.test
> test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/miniFE/miniFE.test
> test-suite :: MultiSource/Benchmarks/Rodinia/srad/srad.test
> test-suite :: SingleSource/Benchmarks/Linpack/linpack-pc.test
> test-suite :: SingleSource/Benchmarks/Misc-C++/Large/sphereflake.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/datamining/correlation/correlation.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/datamining/covariance/covariance.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/2mm/2mm.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/3mm/3mm.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/atax/atax.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/bicg/bicg.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/gemver/gemver.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/gesummv/gesummv.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/symm/symm.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/trisolv/trisolv.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/kernels/trmm/trmm.test
> test-suite :: 
> SingleSource/Benchmarks/Polybench/linear-algebra/solvers/gramschmidt/gramschmidt.test
> test-suite :: SingleSource/Benchmarks/Polybench/stencils/adi/adi.test
> test-suite :: SingleSource/UnitTests/Vector/SSE/Vector-sse.expandfft.test
> test-suite :: SingleSource/UnitTests/Vector/SSE/Vector-sse.stepfft.test




Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74436

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


[clang] ed0e4c7 - [clang][ARM] Add name-mangling test for direct __fp16 arguments.

2020-08-03 Thread Simon Tatham via cfe-commits

Author: Simon Tatham
Date: 2020-08-03T13:30:50+01:00
New Revision: ed0e4c70c99d3afd87fb202ab03bda40512677e7

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

LOG: [clang][ARM] Add name-mangling test for direct __fp16 arguments.

`clang/test/CodeGenCXX/fp16-mangle.cpp` tests pointers to __fp16, but
if you give the `-fallow-half-arguments-and-returns` option, then
clang can also leave an __fp16 unmodified as a function argument or
return type. This regression test checks the name-mangling of that.

Reviewed By: miyuki

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

Added: 
clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp

Modified: 


Removed: 




diff  --git a/clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp 
b/clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
new file mode 100644
index ..15214e13ad8a
--- /dev/null
+++ b/clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -emit-llvm -o - -triple arm-arm-none-eabi 
-fallow-half-arguments-and-returns %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-arm-none-eabi 
-fallow-half-arguments-and-returns %s | FileCheck %s
+
+// Test name-mangling of __fp16 passed directly as a function argument
+// (when that is permitted).
+
+// CHECK: define {{.*}}void @_Z13fp16_argumentDh(half %{{.*}})
+void fp16_argument(__fp16 arg) {}
+
+// Test name-mangling of __fp16 as a return type. The return type of
+// fp16_return itself isn't mentioned in the mangled name, so to test
+// this, we have to pass it a function pointer and make __fp16 the
+// return type of that.
+
+// CHECK: define {{.*}}void @_Z11fp16_returnPFDhvE(half ()* %{{.*}})
+void fp16_return(__fp16 (*func)(void)) {}



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


[PATCH] D85010: [clang][ARM] Add name-mangling test for direct __fp16 arguments.

2020-08-03 Thread Simon Tatham via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGed0e4c70c99d: [clang][ARM] Add name-mangling test for direct 
__fp16 arguments. (authored by simon_tatham).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85010

Files:
  clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp


Index: clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -emit-llvm -o - -triple arm-arm-none-eabi 
-fallow-half-arguments-and-returns %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-arm-none-eabi 
-fallow-half-arguments-and-returns %s | FileCheck %s
+
+// Test name-mangling of __fp16 passed directly as a function argument
+// (when that is permitted).
+
+// CHECK: define {{.*}}void @_Z13fp16_argumentDh(half %{{.*}})
+void fp16_argument(__fp16 arg) {}
+
+// Test name-mangling of __fp16 as a return type. The return type of
+// fp16_return itself isn't mentioned in the mangled name, so to test
+// this, we have to pass it a function pointer and make __fp16 the
+// return type of that.
+
+// CHECK: define {{.*}}void @_Z11fp16_returnPFDhvE(half ()* %{{.*}})
+void fp16_return(__fp16 (*func)(void)) {}


Index: clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/fp16-mangle-arg-return.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -emit-llvm -o - -triple arm-arm-none-eabi -fallow-half-arguments-and-returns %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -o - -triple aarch64-arm-none-eabi -fallow-half-arguments-and-returns %s | FileCheck %s
+
+// Test name-mangling of __fp16 passed directly as a function argument
+// (when that is permitted).
+
+// CHECK: define {{.*}}void @_Z13fp16_argumentDh(half %{{.*}})
+void fp16_argument(__fp16 arg) {}
+
+// Test name-mangling of __fp16 as a return type. The return type of
+// fp16_return itself isn't mentioned in the mangled name, so to test
+// this, we have to pass it a function pointer and make __fp16 the
+// return type of that.
+
+// CHECK: define {{.*}}void @_Z11fp16_returnPFDhvE(half ()* %{{.*}})
+void fp16_return(__fp16 (*func)(void)) {}
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D83190: [analyzer] Model iterator random incrementation symmetrically

2020-08-03 Thread Balogh , Ádám via Phabricator via cfe-commits
baloghadamsoftware added a comment.

In D83190#2164361 , @gamesh411 wrote:

> I experienced 2 crashes with and without this patch using commit 
> `1af9fc82132da7c876e8f70c4e986cc9c59010ee` on master:
> I have used the clang built on that revision to analyse itself, and also used 
> the patched version (with this current revision applied) to do the same.

This crash is unrelated. It also happens if you execute the analyzer without 
enabling any of the iterator checkers.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83190

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


[PATCH] D85102: [clang] improve diagnostics for misaligned and large atomics

2020-08-03 Thread Thorsten via Phabricator via cfe-commits
tschuett updated this revision to Diff 282637.
tschuett added a comment.

added missing "alignment"


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

https://reviews.llvm.org/D85102

Files:
  clang/include/clang/Basic/DiagnosticFrontendKinds.td
  clang/include/clang/Basic/DiagnosticGroups.td
  clang/lib/CodeGen/CGAtomic.cpp
  clang/test/CodeGen/atomics-sema-alignment.c

Index: clang/test/CodeGen/atomics-sema-alignment.c
===
--- clang/test/CodeGen/atomics-sema-alignment.c
+++ clang/test/CodeGen/atomics-sema-alignment.c
@@ -12,10 +12,10 @@
 
 void func(IntPair *p) {
   IntPair res;
-  __atomic_load(p, , 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
-  __atomic_store(p, , 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
-  __atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
-  __atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
+  __atomic_load(p, , 0);// expected-warning {{misaligned atomic operation may incur significant performance penalty; the expected alignment (8 bytes) exceeds the actual alignment (4 bytes)}}
+  __atomic_store(p, , 0);   // expected-warning {{misaligned atomic operation may incur significant performance penalty; the expected alignment (8 bytes) exceeds the actual alignment (4 bytes)}}
+  __atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned atomic operation may incur significant performance penalty; the expected alignment (4 bytes) exceeds the actual alignment (1 bytes)}}
+  __atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned atomic operation may incur significant performance penalty; the expected alignment (4 bytes) exceeds the actual alignment (1 bytes)}}
 }
 
 void func1(LongStruct *p) {
@@ -25,3 +25,24 @@
   __atomic_fetch_add((int *)p, 1, 2);
   __atomic_fetch_sub((int *)p, 1, 3);
 }
+
+typedef struct {
+  void *a;
+  void *b;
+} Foo;
+
+typedef struct {
+  void *a;
+  void *b;
+  void *c;
+  void *d;
+} __attribute__((aligned(32))) ThirtyTwo;
+
+void braz(Foo *foo, ThirtyTwo *braz) {
+  Foo bar;
+  __atomic_load(foo, , __ATOMIC_RELAXED); // expected-warning {{misaligned atomic operation may incur significant performance penalty; the expected alignment (16 bytes) exceeds the actual alignment (8 bytes)}}
+
+  ThirtyTwo thirtyTwo1;
+  ThirtyTwo thirtyTwo2;
+  __atomic_load(, , __ATOMIC_RELAXED); // expected-warning {{large atomic operation may incur significant performance penalty; the access size (32 bytes) exceeds the max lock-free size (16  bytes)}}
+}
Index: clang/lib/CodeGen/CGAtomic.cpp
===
--- clang/lib/CodeGen/CGAtomic.cpp
+++ clang/lib/CodeGen/CGAtomic.cpp
@@ -807,10 +807,20 @@
   bool Oversized = getContext().toBits(sizeChars) > MaxInlineWidthInBits;
   bool Misaligned = (Ptr.getAlignment() % sizeChars) != 0;
   bool UseLibcall = Misaligned | Oversized;
+  CharUnits MaxInlineWidth =
+  getContext().toCharUnitsFromBits(MaxInlineWidthInBits);
 
-  if (UseLibcall) {
-CGM.getDiags().Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned)
-<< !Oversized;
+  DiagnosticsEngine  = CGM.getDiags();
+
+  if (Misaligned) {
+Diags.Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned)
+<< (int)sizeChars.getQuantity()
+<< (int)Ptr.getAlignment().getQuantity();
+  }
+
+  if (Oversized) {
+Diags.Report(E->getBeginLoc(), diag::warn_atomic_op_oversized)
+<< (int)sizeChars.getQuantity() << (int)MaxInlineWidth.getQuantity();
   }
 
   llvm::Value *Order = EmitScalarExpr(E->getOrder());
Index: clang/include/clang/Basic/DiagnosticGroups.td
===
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -699,6 +699,7 @@
 def Reorder : DiagGroup<"reorder", [ReorderCtor, ReorderInitList]>;
 def UndeclaredSelector : DiagGroup<"undeclared-selector">;
 def ImplicitAtomic : DiagGroup<"implicit-atomic-properties">;
+def AtomicAlignment : DiagGroup<"atomic-alignment">;
 def CustomAtomic : DiagGroup<"custom-atomic-properties">;
 def AtomicProperties : DiagGroup<"atomic-properties",
  [ImplicitAtomic, CustomAtomic]>;
Index: clang/include/clang/Basic/DiagnosticFrontendKinds.td
===
--- clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -270,8 +270,16 @@
   "ifunc resolver function must return a pointer">;
 
 def warn_atomic_op_misaligned : Warning<
-  "%select{large|misaligned}0 atomic 

[PATCH] D84782: [PGO] Include the mem ops into the function hash.

2020-08-03 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added a subscriber: hans.
MaskRay added a comment.

@yamauchi Do we need cd890944ad344b1b8cac58332ab11c9eec6b61e9 
 and 
3d6f53018f845e893ad34f64ff2851a2e5c3ba1d 
 in 
https://github.com/llvm/llvm-project/tree/release/11.x ?

+@hans


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84782

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


[PATCH] D63640: [clang] Improve Serialization/Imporing/Dumping of APValues

2020-08-03 Thread Tyker via Phabricator via cfe-commits
Tyker updated this revision to Diff 282682.
Tyker edited the summary of this revision.
Tyker added a comment.

Sorry for the delay

In D63640#2151016 , @rsmith wrote:

> Are we at a point where we can test this now?

Yes we can use consteval to test it. so i removed changes to constexpr AST 
modling.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D63640

Files:
  clang/include/clang/AST/ASTContext.h
  clang/include/clang/AST/ASTImporter.h
  clang/lib/AST/APValue.cpp
  clang/lib/AST/ASTContext.cpp
  clang/lib/AST/ASTImporter.cpp
  clang/lib/AST/Expr.cpp
  clang/lib/Serialization/ASTReader.cpp
  clang/lib/Serialization/ASTWriter.cpp
  clang/test/ASTMerge/APValue/APValue.cpp

Index: clang/test/ASTMerge/APValue/APValue.cpp
===
--- /dev/null
+++ clang/test/ASTMerge/APValue/APValue.cpp
@@ -0,0 +1,460 @@
+// RUN: %clang_cc1 -std=gnu++2a -emit-pch %s -o %t.pch
+// RUN: %clang_cc1 -std=gnu++2a %s -DEMIT -ast-merge %t.pch -ast-dump-all | FileCheck %s
+
+#ifndef EMIT
+#define EMIT
+
+namespace Integer {
+
+consteval int fint() {
+  return 6789;
+}
+
+int Unique_Int = fint();
+//CHECK:  VarDecl {{.*}} Unique_Int
+//CHECK-NEXT: ConstantExpr {{.*}} 'int'
+//CHECK-NEXT: value: Int 6789
+
+consteval __uint128_t fint128() {
+  return ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
+}
+
+constexpr __uint128_t Unique_Int128 = fint128();
+//CHECK:  VarDecl {{.*}} Unique_Int128
+//CHECK-NEXT: value: Int 156773562844924187900898496343692168785
+//CHECK-NEXT: ConstantExpr
+//CHECK-NEXT: value: Int 156773562844924187900898496343692168785
+
+} // namespace Integer
+
+namespace FloatingPoint {
+
+consteval double fdouble() {
+  return double(567890.67890);
+}
+
+double Unique_Double = fdouble();
+//CHECK:  VarDecl {{.*}} Unique_Double
+//CHECK-NEXT: ConstantExpr {{.*}}
+//CHECK-NEXT: value: Float 5.678907e+05
+
+} // namespace FloatingPoint
+
+// FIXME: Add test for FixedPoint, ComplexInt, ComplexFloat, AddrLabelDiff.
+
+namespace Struct {
+
+struct B {
+  int i;
+  double d;
+};
+
+consteval B fB() {
+  return B{1, 0.7};
+}
+
+constexpr B Basic_Struct = fB();
+//CHECK:  VarDecl {{.*}} Basic_Struct
+//CHECK-NEXT: value: Struct
+//CHECK-NEXT: fields: Int 1, Float 7.00e-01
+//CHECK-NEXT: ImplicitCastExpr
+//CHECK-NEXT: ConstantExpr
+//CHECK-NEXT: value: Struct
+//CHECK-NEXT: fields: Int 1, Float 7.00e-01
+
+struct C {
+  int i = 9;
+};
+
+struct A : B {
+  constexpr A(B b, int I, double D, C _c) : B(b), i(I), d(D), c(_c) {}
+  int i;
+  double d;
+  C c;
+};
+
+consteval A fA() {
+  return A(Basic_Struct, 1, 79.789, {});
+}
+
+A Advanced_Struct = fA();
+//CHECK:  VarDecl {{.*}} Advanced_Struct
+//CHECK-NEXT: ConstantExpr {{.*}}
+//CHECK-NEXT: value: Struct
+//CHECK-NEXT: base: Struct
+//CHECK-NEXT: fields: Int 1, Float 7.00e-01
+//CHECK-NEXT: fields: Int 1, Float 7.978900e+01
+//CHECK-NEXT: field: Struct
+//CHECK-NEXT: field: Int 9
+
+} // namespace Struct
+
+namespace Vector {
+
+using v4si = int __attribute__((__vector_size__(16)));
+
+consteval v4si fv4si() {
+  return (v4si){8, 2, 3};
+}
+
+v4si Vector_Int = fv4si();
+//CHECK:  VarDecl {{.*}} Vector_Int
+//CHECK-NEXT: ConstantExpr
+//CHECK-NEXT: value: Vector length=4
+//CHECK-NEXT: elements: Int 8, Int 2, Int 3, Int 0
+
+} // namespace Vector
+
+namespace Array {
+
+struct B {
+  int arr[6];
+};
+
+consteval B fint() {
+  return B{1, 2, 3, 4, 5, 6};
+}
+
+B Array_Int = fint();
+//CHECK:  VarDecl {{.*}} Array_Int
+//CHECK-NEXT: ConstantExpr
+//CHECK-NEXT: value: Struct
+//CHECK-NEXT: field: Array size=6
+//CHECK-NEXT: elements: Int 1, Int 2, Int 3, Int 4
+//CHECK-NEXT: elements: Int 5, Int 6
+
+struct A {
+  int i = 789;
+  double d = 67890.09876;
+};
+
+struct C {
+  A arr[3];
+};
+
+consteval C fA() {
+  return {{A{}, A{-45678, 9.8}, A{9}}};
+}
+
+C Array2_Struct = fA();
+//CHECK:  VarDecl {{.*}} Array2_Struct
+//CHECK-NEXT: ConstantExpr {{.*}}
+
+using v4si = int __attribute__((__vector_size__(16)));
+
+struct D {
+  v4si arr[2];
+};
+
+consteval D fv4si() {
+  return {{{1, 2, 3, 4}, {4, 5, 6, 7}}};
+}
+
+D Array_Vector = fv4si();
+//CHECK:  VarDecl {{.*}} Array_Vector
+//CHECK-NEXT: ConstantExpr {{.*}}
+//CHECK-NEXT: value: Struct
+//CHECK-NEXT: field: Array size=2
+//CHECK-NEXT: element: Vector length=4
+//CHECK-NEXT: elements: Int 1, Int 2, Int 3, Int 4
+//CHECK-NEXT: element: Vector length=4
+//CHECK-NEXT: elements: Int 4, Int 5, Int 6, Int 7
+
+} // namespace Array
+
+namespace Union {
+
+struct A {
+  int i = 6789;
+  float f = 987.9876;
+};
+
+union U {
+  int i;
+  A a{567890, 9876.5678f};
+};
+
+consteval U fU1() {
+  return U{0};
+}
+
+U Unique_Union1 = fU1();
+//CHECK:  VarDecl {{.*}} Unique_Union
+//CHECK-NEXT: ConstantExpr
+//CHECK-NEXT: value: Union .i Int 0
+
+consteval U fU() {
+  return U{};
+}
+
+U 

[PATCH] D84820: [WebAssembly] Implement prototype v128.load{32,64}_zero instructions

2020-08-03 Thread Thomas Lively via Phabricator via cfe-commits
tlively updated this revision to Diff 282680.
tlively added a comment.

- Renumber i32x4.dot_i16x8_s to match V8 as well


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84820

Files:
  clang/include/clang/Basic/BuiltinsWebAssembly.def
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/builtins-wasm.c
  llvm/include/llvm/IR/IntrinsicsWebAssembly.td
  llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
  llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
  llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
  llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td
  llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
  llvm/test/MC/WebAssembly/simd-encodings.s

Index: llvm/test/MC/WebAssembly/simd-encodings.s
===
--- llvm/test/MC/WebAssembly/simd-encodings.s
+++ llvm/test/MC/WebAssembly/simd-encodings.s
@@ -463,9 +463,6 @@
 # CHECK: i32x4.sub # encoding: [0xfd,0xb1,0x01]
 i32x4.sub
 
-# CHECK: i32x4.dot_i16x8_s # encoding: [0xfd,0xb4,0x01]
-i32x4.dot_i16x8_s
-
 # CHECK: i32x4.mul # encoding: [0xfd,0xb5,0x01]
 i32x4.mul
 
@@ -481,6 +478,9 @@
 # CHECK: i32x4.max_u # encoding: [0xfd,0xb9,0x01]
 i32x4.max_u
 
+# CHECK: i32x4.dot_i16x8_s # encoding: [0xfd,0xba,0x01]
+i32x4.dot_i16x8_s
+
 # CHECK: i64x2.neg # encoding: [0xfd,0xc1,0x01]
 i64x2.neg
 
@@ -610,10 +610,16 @@
 # CHECK: f32x4.convert_i32x4_u # encoding: [0xfd,0xfb,0x01]
 f32x4.convert_i32x4_u
 
-# CHECK: f32x4.qfma # encoding: [0xfd,0xfc,0x01]
+# CHECK: v128.load32_zero 32 # encoding: [0xfd,0xfc,0x01,0x02,0x20]
+v128.load32_zero 32
+
+# CHECK: v128.load64_zero 32 # encoding: [0xfd,0xfd,0x01,0x03,0x20]
+v128.load64_zero 32
+
+# CHECK: f32x4.qfma # encoding: [0xfd,0xb4,0x01]
 f32x4.qfma
 
-# CHECK: f32x4.qfms # encoding: [0xfd,0xfd,0x01]
+# CHECK: f32x4.qfms # encoding: [0xfd,0xd4,0x01]
 f32x4.qfms
 
 # CHECK: f64x2.qfma # encoding: [0xfd,0xfe,0x01]
Index: llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
===
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
@@ -0,0 +1,228 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
+
+; Test SIMD v128.load{32,64}_zero instructions
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+declare <4 x i32> @llvm.wasm.load32.zero(i32*)
+declare <2 x i64> @llvm.wasm.load64.zero(i64*)
+
+;===
+; v128.load32_zero
+;===
+
+define <4 x i32> @load_zero_i32_no_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_no_offset:
+; CHECK: .functype load_zero_i32_no_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 0
+; CHECK-NEXT:# fallthrough-return
+  %v = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %p)
+  ret <4 x i32> %v
+}
+
+define <4 x i32> @load_zero_i32_with_folded_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_folded_offset:
+; CHECK: .functype load_zero_i32_with_folded_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 24
+; CHECK-NEXT:# fallthrough-return
+  %q = ptrtoint i32* %p to i32
+  %r = add nuw i32 %q, 24
+  %s = inttoptr i32 %r to i32*
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> @load_zero_i32_with_folded_gep_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_folded_gep_offset:
+; CHECK: .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 24
+; CHECK-NEXT:# fallthrough-return
+  %s = getelementptr inbounds i32, i32* %p, i32 6
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset:
+; CHECK: .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:i32.const -24
+; CHECK-NEXT:i32.add
+; CHECK-NEXT:v128.load32_zero 0
+; CHECK-NEXT:# fallthrough-return
+  %s = getelementptr inbounds i32, i32* %p, i32 -6
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> @load_zero_i32_with_unfolded_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_unfolded_offset:
+; CHECK: .functype load_zero_i32_with_unfolded_offset 

[PATCH] D79744: clang: Use byref for aggregate kernel arguments

2020-08-03 Thread John McCall via Phabricator via cfe-commits
rjmccall added inline comments.



Comment at: clang/lib/CodeGen/TargetInfo.cpp:1997
   case ABIArgInfo::Ignore:
+  case ABIArgInfo::IndirectAliased:
 return false;

arsenm wrote:
> rjmccall wrote:
> > In principle, this can be `inreg` just as much as Indirect can.
> The IR verifier currently will reject byref + inreg
Why?  `inreg` is essentially orthogonal.


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

https://reviews.llvm.org/D79744

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


[PATCH] D76604: [Analyzer] Model `size()` member function of containers

2020-08-03 Thread Balogh , Ádám via Phabricator via cfe-commits
baloghadamsoftware updated this revision to Diff 282675.
baloghadamsoftware added a comment.

Rebased.


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

https://reviews.llvm.org/D76604

Files:
  clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
  clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
  clang/lib/StaticAnalyzer/Checkers/Iterator.h
  clang/test/Analysis/container-modeling.cpp

Index: clang/test/Analysis/container-modeling.cpp
===
--- clang/test/Analysis/container-modeling.cpp
+++ clang/test/Analysis/container-modeling.cpp
@@ -96,6 +96,38 @@
   // expected-note@-3   {{FALSE}}
 }
 
+void size0(const std::vector& V) {
+  assert(V.size() == 0); // expected-note{{'?' condition is true}}
+ // expected-note@-1{{Assuming the condition is true}}
+
+  clang_analyzer_eval(clang_analyzer_container_end(V) ==
+  clang_analyzer_container_begin(V));
+  // expected-warning@-2{{TRUE}}
+  // expected-note@-3   {{TRUE}}
+}
+
+void size1(const std::vector& V) {
+  assert(V.size() == 1); // expected-note{{'?' condition is true}}
+ // expected-note@-1{{Assuming the condition is true}}
+
+  clang_analyzer_eval(clang_analyzer_container_end(V) ==
+  clang_analyzer_container_begin(V) + 1);
+  // expected-warning@-2{{TRUE}}
+  // expected-note@-3   {{TRUE}}
+}
+
+void size12(std::vector& V) {
+  assert(V.size() == 1); // expected-note{{'?' condition is true}}
+ // expected-note@-1{{Assuming the condition is true}}
+
+  V.push_back(1);
+
+  clang_analyzer_eval(clang_analyzer_container_end(V) ==
+  clang_analyzer_container_begin(V) + 2);
+  // expected-warning@-2{{TRUE}}
+  // expected-note@-3   {{TRUE}}
+}
+
 
 ///
 /// C O N T A I N E R   M O D I F I E R S
Index: clang/lib/StaticAnalyzer/Checkers/Iterator.h
===
--- clang/lib/StaticAnalyzer/Checkers/Iterator.h
+++ clang/lib/StaticAnalyzer/Checkers/Iterator.h
@@ -182,6 +182,8 @@
 std::pair
 assumeComparison(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2,
  DefinedSVal RetVal, OverloadedOperatorKind Op);
+ProgramStateRef relateSymbols(ProgramStateRef State, SymbolRef Sym1,
+  SymbolRef Sym2, bool Equal);
 bool compare(ProgramStateRef State, SymbolRef Sym1, SymbolRef Sym2,
  BinaryOperator::Opcode Opc);
 bool compare(ProgramStateRef State, NonLoc NL1, NonLoc NL2,
Index: clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
+++ clang/lib/StaticAnalyzer/Checkers/Iterator.cpp
@@ -18,9 +18,6 @@
 namespace ento {
 namespace iterator {
 
-ProgramStateRef relateSymbols(ProgramStateRef State, SymbolRef Sym1,
-  SymbolRef Sym2, bool Equal);
-
 bool isIteratorType(const QualType ) {
   if (Type->isPointerType())
 return true;
Index: clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
+++ clang/lib/StaticAnalyzer/Checkers/ContainerModeling.cpp
@@ -47,6 +47,8 @@
  SVal Cont, SVal RetVal) const;
   void handleEmpty(CheckerContext , const Expr *CE, const Expr *ContE,
SVal Cont, SVal RetVal) const;
+  void handleSize(CheckerContext , const Expr *CE, const Expr *ContE,
+  SVal Cont, SVal RetVal) const;
   void handleAssign(CheckerContext , const Expr *CE, const Expr *ContE,
 SVal Cont, SVal RetVal) const;
   void handleClear(CheckerContext , const Expr *CE, const Expr *ContE,
@@ -102,6 +104,7 @@
 
 // Capacity
 {{0, "empty", 0}, ::handleEmpty},
+{{0, "size", 0}, ::handleSize},
 
 // Modifiers
 {{0, "clear", 0}, ::handleClear},
@@ -170,6 +173,8 @@
 SymbolRef rebaseSymbol(ProgramStateRef State, SValBuilder , SymbolRef Expr,
 SymbolRef OldSym, SymbolRef NewSym);
 bool hasLiveIterators(ProgramStateRef State, const MemRegion *Cont);
+const llvm::APSInt* calculateSize(ProgramStateRef State, SymbolRef Begin,
+  SymbolRef End);
 
 } // namespace
 
@@ -448,6 +453,72 @@
   }
 }
 
+void ContainerModeling::handleSize(CheckerContext , const Expr *CE,
+   const Expr *, SVal Cont, SVal RetVal) const {
+  const auto *ContReg = Cont.getAsRegion();
+  if (!ContReg)
+return;
+
+  ContReg = ContReg->getMostDerivedObjectRegion();
+
+  auto State = C.getState();
+
+  State = createContainerBegin(State, ContReg, CE, C.getASTContext().LongTy,
+   C.getLocationContext(), C.blockCount());
+  auto BeginSym = 

Re: [PATCH] D84703: [clang codegen][AArch64] Use llvm.aarch64.neon.fcvtzs/u where it's necessary

2020-08-03 Thread Azhar Mohammed via cfe-commits
Hey Eli,

Looks like this is causing the test-suite build to fail. Can you please take a 
look.

Refer to 
http://green.lab.llvm.org/green/job/test-suite-verify-machineinstrs-aarch64-O3/8035/consoleFull
 
.

FAILED: 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
 
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/test-suite-build/tools/timeit
 --summary 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o.time
 
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/compiler/bin/clang
 -DNDEBUG -B 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 -Wno-unused-command-line-argument -mllvm -verify-machineinstrs -O3 -arch arm64 
-isysroot 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.5.sdk
 -w -Werror=date-time -std=c99 -MD -MT 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
 -MF 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o.d
 -o 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
 -c 
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/test-suite/SingleSource/UnitTests/Vector/AArch64/aarch64_neon_intrinsics.c
fatal error: error in backend: Cannot select: intrinsic 
%llvm.aarch64.neon.fcvtzs

Thanks
Azhar

> On Jul 30, 2020, at 3:42 PM, Eli Friedman via Phabricator via llvm-commits 
>  wrote:
> 
> This revision was landed with ongoing or failed builds.
> This revision was automatically updated to reflect the committed changes.
> Closed by commit rG8dfb5d767e70: [clang codegen][AArch64] Use 
> llvm.aarch64.neon.fcvtzs/u where its necessary (authored by efriedma).
> 
> Changed prior to commit:
>  https://reviews.llvm.org/D84703?vs=281052=282069#toc
> 
> Repository:
>  rG LLVM Github Monorepo
> 
> CHANGES SINCE LAST ACTION
>  https://reviews.llvm.org/D84703/new/
> 
> https://reviews.llvm.org/D84703
> 
> Files:
>  clang/lib/CodeGen/CGBuiltin.cpp
>  clang/test/CodeGen/aarch64-neon-fcvt-intrinsics.c
>  clang/test/CodeGen/aarch64-neon-intrinsics.c
>  clang/test/CodeGen/aarch64-neon-misc.c
>  clang/test/CodeGen/aarch64-v8.2a-fp16-intrinsics.c
>  clang/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c
> 
> ___
> llvm-commits mailing list
> llvm-comm...@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

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


[PATCH] D85118: [clang][AArch64] Correct return type of Neon vqmovun intrinsics

2020-08-03 Thread Eli Friedman via Phabricator via cfe-commits
efriedma added a comment.

Would it be worth looking into improving our general test coverage here?  The 
fact that we don't have any test that verifies the actual signatures of the 
NEON intrinsics (which could be used to compare against other compilers) seems 
bad.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85118

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


[PATCH] D77697: libc++: adjust modulemap for non-modular C

2020-08-03 Thread Saleem Abdulrasool via Phabricator via cfe-commits
compnerd abandoned this revision.
compnerd added a comment.

Given that the original motivation here was to help with NetBSD, and the 
submodule visibility flag handling unblocks NetBSD, I think that I will hold 
off on this unless some other motivation arises.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D77697

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


[PATCH] D84844: [OpenMP] Ensure testing for versions 4.5, 5.0, and default - Part 1

2020-08-03 Thread Saiyedul Islam via Phabricator via cfe-commits
saiislam updated this revision to Diff 282678.
saiislam added a comment.

Removed redundant testing for version 5.0 with its version string.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84844

Files:
  clang/test/OpenMP/cancel_ast_print.cpp
  clang/test/OpenMP/cancel_codegen.cpp
  clang/test/OpenMP/cancel_codegen_cleanup.cpp
  clang/test/OpenMP/cancel_if_messages.cpp
  clang/test/OpenMP/capturing_in_templates.cpp
  clang/test/OpenMP/distribute_parallel_for_if_codegen.cpp
  clang/test/OpenMP/distribute_parallel_for_if_messages.cpp
  clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp
  clang/test/OpenMP/distribute_parallel_for_reduction_codegen.cpp
  clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp
  clang/test/OpenMP/nvptx_target_requires_unified_shared_memory.cpp
  clang/test/OpenMP/parallel_default_messages.cpp
  clang/test/OpenMP/parallel_for_if_messages.cpp
  clang/test/OpenMP/parallel_if_codegen.cpp
  clang/test/OpenMP/parallel_if_messages.cpp
  clang/test/OpenMP/parallel_master_if_messages.cpp
  clang/test/OpenMP/parallel_sections_if_messages.cpp
  clang/test/OpenMP/report_default_DSA.cpp
  clang/test/OpenMP/target_ast_print.cpp
  clang/test/OpenMP/target_enter_data_ast_print.cpp
  clang/test/OpenMP/target_enter_data_if_messages.cpp
  clang/test/OpenMP/target_exit_data_ast_print.cpp
  clang/test/OpenMP/target_exit_data_if_messages.cpp
  clang/test/OpenMP/target_if_messages.cpp
  clang/test/OpenMP/target_parallel_codegen.cpp
  clang/test/OpenMP/target_parallel_for_codegen.cpp
  clang/test/OpenMP/target_parallel_if_messages.cpp
  clang/test/OpenMP/target_parallel_num_threads_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_if_messages.cpp
  clang/test/OpenMP/target_teams_distribute_parallel_for_if_codegen.cpp
  clang/test/OpenMP/target_teams_distribute_parallel_for_if_messages.cpp
  clang/test/OpenMP/target_teams_if_messages.cpp
  clang/test/OpenMP/target_teams_num_teams_codegen.cpp
  clang/test/OpenMP/target_teams_thread_limit_codegen.cpp
  clang/test/OpenMP/target_update_if_messages.cpp
  clang/test/OpenMP/task_if_codegen.cpp
  clang/test/OpenMP/task_if_messages.cpp
  clang/test/OpenMP/teams_distribute_parallel_for_if_codegen.cpp
  clang/test/OpenMP/teams_distribute_parallel_for_if_messages.cpp
  clang/test/OpenMP/teams_distribute_parallel_for_num_threads_codegen.cpp
  clang/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_codegen.cpp

Index: clang/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_codegen.cpp
===
--- clang/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_codegen.cpp
+++ clang/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_codegen.cpp
@@ -6,6 +6,16 @@
 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -emit-pch -o %t %s
 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-ibm-linux-gnu -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
+// RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
+
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-ibm-linux-gnu -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// RUN: %clang_cc1 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -emit-pch -o %t %s
+// RUN: %clang_cc1 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-ibm-linux-gnu -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
+// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+
 // expected-no-diagnostics
 #ifndef HEADER
 #define HEADER
Index: clang/test/OpenMP/teams_distribute_parallel_for_num_threads_codegen.cpp
===
--- clang/test/OpenMP/teams_distribute_parallel_for_num_threads_codegen.cpp
+++ 

[clang] 10851f9 - [analyzer][tests] Fix SATest update functionality

2020-08-03 Thread Valeriy Savchenko via cfe-commits

Author: Valeriy Savchenko
Date: 2020-08-03T18:21:15+03:00
New Revision: 10851f9db5f7d163135374b8dfc945e1b4a9c7d6

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

LOG: [analyzer][tests] Fix SATest update functionality

Summary:
Not all projects in the project map file might have newer results
for updating, we should handle this situation gracefully.

Additionally, not every user of the test system would want storing
reference results in git.  For this reason, git functionality is now
optional.

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

Added: 


Modified: 
clang/utils/analyzer/SATest.py
clang/utils/analyzer/SATestUpdateDiffs.py

Removed: 




diff  --git a/clang/utils/analyzer/SATest.py b/clang/utils/analyzer/SATest.py
index 46e636ad2895..86571902502f 100755
--- a/clang/utils/analyzer/SATest.py
+++ b/clang/utils/analyzer/SATest.py
@@ -78,7 +78,7 @@ def update(parser, args):
 
 project_map = ProjectMap()
 for project in project_map.projects:
-SATestUpdateDiffs.update_reference_results(project)
+SATestUpdateDiffs.update_reference_results(project, args.git)
 
 
 def benchmark(parser, args):
@@ -277,7 +277,8 @@ def main():
 "update",
 help="Update static analyzer reference results based on the previous "
 "run of SATest build. Assumes that SATest build was just run.")
-# TODO: add option to decide whether we should use git
+upd_parser.add_argument("--git", action="store_true",
+help="Stage updated results using git.")
 upd_parser.set_defaults(func=update)
 
 # docker subcommand

diff  --git a/clang/utils/analyzer/SATestUpdateDiffs.py 
b/clang/utils/analyzer/SATestUpdateDiffs.py
index 920fa15e4c6f..69b3383beaf1 100644
--- a/clang/utils/analyzer/SATestUpdateDiffs.py
+++ b/clang/utils/analyzer/SATestUpdateDiffs.py
@@ -15,7 +15,7 @@
 Verbose = 0
 
 
-def update_reference_results(project: ProjectInfo):
+def update_reference_results(project: ProjectInfo, git: bool = False):
 test_info = SATestBuild.TestInfo(project)
 tester = SATestBuild.ProjectTester(test_info)
 project_dir = tester.get_project_dir()
@@ -27,9 +27,10 @@ def update_reference_results(project: ProjectInfo):
 created_results_path = tester.get_output_dir()
 
 if not os.path.exists(created_results_path):
-print("New results not found, was SATestBuild.py previously run?",
+print(f"Skipping project '{project.name}', "
+  f"it doesn't have newer results.",
   file=sys.stderr)
-sys.exit(1)
+return
 
 build_log_path = SATestBuild.get_build_log_path(ref_results_path)
 build_log_dir = os.path.dirname(os.path.abspath(build_log_path))
@@ -45,7 +46,8 @@ def run_cmd(command: str):
 # Remove reference results: in git, and then again for a good measure
 # with rm, as git might not remove things fully if there are empty
 # directories involved.
-run_cmd(f"git rm -r -q '{ref_results_path}'")
+if git:
+run_cmd(f"git rm -r -q '{ref_results_path}'")
 shutil.rmtree(ref_results_path)
 
 # Replace reference results with a freshly computed once.
@@ -60,22 +62,11 @@ def run_cmd(command: str):
 # Clean up the generated 
diff erence results.
 SATestBuild.cleanup_reference_results(ref_results_path)
 
-run_cmd(f"git add '{ref_results_path}'")
+if git:
+run_cmd(f"git add '{ref_results_path}'")
 
 
-# TODO: use argparse
-def main(argv):
-if len(argv) == 2 and argv[1] in ("-h", "--help"):
-print("Update static analyzer reference results based "
-  "\non the previous run of SATestBuild.py.\n"
-  "\nN.B.: Assumes that SATestBuild.py was just run",
-  file=sys.stderr)
-sys.exit(1)
-
-project_map = ProjectMap()
-for project in project_map.projects:
-update_reference_results(project)
-
-
-if __name__ == '__main__':
-main(sys.argv)
+if __name__ == "__main__":
+print("SATestUpdateDiffs.py should not be used on its own.")
+print("Please use 'SATest.py update' instead")
+sys.exit(1)



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


[PATCH] D84303: [analyzer][tests] Fix SATest update functionality

2020-08-03 Thread Valeriy Savchenko via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG10851f9db5f7: [analyzer][tests] Fix SATest update 
functionality (authored by vsavchenko).
Herald added a subscriber: steakhal.

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84303

Files:
  clang/utils/analyzer/SATest.py
  clang/utils/analyzer/SATestUpdateDiffs.py


Index: clang/utils/analyzer/SATestUpdateDiffs.py
===
--- clang/utils/analyzer/SATestUpdateDiffs.py
+++ clang/utils/analyzer/SATestUpdateDiffs.py
@@ -15,7 +15,7 @@
 Verbose = 0
 
 
-def update_reference_results(project: ProjectInfo):
+def update_reference_results(project: ProjectInfo, git: bool = False):
 test_info = SATestBuild.TestInfo(project)
 tester = SATestBuild.ProjectTester(test_info)
 project_dir = tester.get_project_dir()
@@ -27,9 +27,10 @@
 created_results_path = tester.get_output_dir()
 
 if not os.path.exists(created_results_path):
-print("New results not found, was SATestBuild.py previously run?",
+print(f"Skipping project '{project.name}', "
+  f"it doesn't have newer results.",
   file=sys.stderr)
-sys.exit(1)
+return
 
 build_log_path = SATestBuild.get_build_log_path(ref_results_path)
 build_log_dir = os.path.dirname(os.path.abspath(build_log_path))
@@ -45,7 +46,8 @@
 # Remove reference results: in git, and then again for a good measure
 # with rm, as git might not remove things fully if there are empty
 # directories involved.
-run_cmd(f"git rm -r -q '{ref_results_path}'")
+if git:
+run_cmd(f"git rm -r -q '{ref_results_path}'")
 shutil.rmtree(ref_results_path)
 
 # Replace reference results with a freshly computed once.
@@ -60,22 +62,11 @@
 # Clean up the generated difference results.
 SATestBuild.cleanup_reference_results(ref_results_path)
 
-run_cmd(f"git add '{ref_results_path}'")
+if git:
+run_cmd(f"git add '{ref_results_path}'")
 
 
-# TODO: use argparse
-def main(argv):
-if len(argv) == 2 and argv[1] in ("-h", "--help"):
-print("Update static analyzer reference results based "
-  "\non the previous run of SATestBuild.py.\n"
-  "\nN.B.: Assumes that SATestBuild.py was just run",
-  file=sys.stderr)
-sys.exit(1)
-
-project_map = ProjectMap()
-for project in project_map.projects:
-update_reference_results(project)
-
-
-if __name__ == '__main__':
-main(sys.argv)
+if __name__ == "__main__":
+print("SATestUpdateDiffs.py should not be used on its own.")
+print("Please use 'SATest.py update' instead")
+sys.exit(1)
Index: clang/utils/analyzer/SATest.py
===
--- clang/utils/analyzer/SATest.py
+++ clang/utils/analyzer/SATest.py
@@ -78,7 +78,7 @@
 
 project_map = ProjectMap()
 for project in project_map.projects:
-SATestUpdateDiffs.update_reference_results(project)
+SATestUpdateDiffs.update_reference_results(project, args.git)
 
 
 def benchmark(parser, args):
@@ -277,7 +277,8 @@
 "update",
 help="Update static analyzer reference results based on the previous "
 "run of SATest build. Assumes that SATest build was just run.")
-# TODO: add option to decide whether we should use git
+upd_parser.add_argument("--git", action="store_true",
+help="Stage updated results using git.")
 upd_parser.set_defaults(func=update)
 
 # docker subcommand


Index: clang/utils/analyzer/SATestUpdateDiffs.py
===
--- clang/utils/analyzer/SATestUpdateDiffs.py
+++ clang/utils/analyzer/SATestUpdateDiffs.py
@@ -15,7 +15,7 @@
 Verbose = 0
 
 
-def update_reference_results(project: ProjectInfo):
+def update_reference_results(project: ProjectInfo, git: bool = False):
 test_info = SATestBuild.TestInfo(project)
 tester = SATestBuild.ProjectTester(test_info)
 project_dir = tester.get_project_dir()
@@ -27,9 +27,10 @@
 created_results_path = tester.get_output_dir()
 
 if not os.path.exists(created_results_path):
-print("New results not found, was SATestBuild.py previously run?",
+print(f"Skipping project '{project.name}', "
+  f"it doesn't have newer results.",
   file=sys.stderr)
-sys.exit(1)
+return
 
 build_log_path = SATestBuild.get_build_log_path(ref_results_path)
 build_log_dir = os.path.dirname(os.path.abspath(build_log_path))
@@ -45,7 +46,8 @@
 # Remove reference results: in git, and then again for a good measure
 # with rm, as git might not remove things fully if there are empty
 # directories involved.
-

[PATCH] D85102: [clang] improve diagnostics for misaligned and large atomics

2020-08-03 Thread JF Bastien via Phabricator via cfe-commits
jfb accepted this revision.
jfb added inline comments.
This revision is now accepted and ready to land.



Comment at: clang/test/CodeGen/atomics-sema-alignment.c:43
+  Foo bar;
+  __atomic_load(foo, , __ATOMIC_RELAXED); // expected-warning {{misaligned 
atomic operation may incur significant performance penalty; the expected (16 
bytes) exceeds the actual alignment (8 bytes)}}
+

"the expected (16 bytes)" should be "the expected alignment (16 bytes)"


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

https://reviews.llvm.org/D85102

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


[PATCH] D81865: [clang] Use string tables for static diagnostic descriptions

2020-08-03 Thread Nathan Froyd via Phabricator via cfe-commits
froydnj added a comment.

Ping for an opinion on the recent discussion of how to move forward with this 
patch.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D81865

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


[PATCH] D83261: [OPENMP]Redesign of OMPExecutableDirective representation.

2020-08-03 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added inline comments.



Comment at: clang/lib/Sema/SemaExpr.cpp:345
 Diag(Loc, diag::err_omp_declare_mapper_wrong_var)
-<< DMD->getVarName().getAsString();
+<< getOpenMPDeclareMapperVarName();
 Diag(D->getLocation(), diag::note_entity_declared_at) << D;

I'd like to point out that in general there is no need to pass a string to a 
diagnostic instead of a `NamedDecl *`. Doing so will bypass the customisation 
points `NamedDecl::getNameForDiagnostic` and `NamedDecl::printName`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83261

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


[PATCH] D85144: [clang] Improve Dumping of APValues

2020-08-03 Thread Tyker via Phabricator via cfe-commits
Tyker updated this revision to Diff 282687.
Tyker added a comment.

remove unintended code.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85144

Files:
  clang/include/clang/AST/APValue.h
  clang/include/clang/AST/PrettyPrinter.h
  clang/lib/AST/APValue.cpp
  clang/lib/AST/TextNodeDumper.cpp
  clang/test/AST/ast-dump-APValue-LValue.cpp
  clang/test/AST/ast-dump-APValue-MemPtr.cpp
  clang/test/AST/ast-dump-APValue-todo.cpp

Index: clang/test/AST/ast-dump-APValue-todo.cpp
===
--- clang/test/AST/ast-dump-APValue-todo.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Test without serialization:
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
-// RUN:-ast-dump %s -ast-dump-filter Test \
-// RUN: | FileCheck --strict-whitespace --match-full-lines %s
-//
-// Test with serialization:
-// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 -emit-pch -o %t %s
-// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
-// RUN:   -include-pch %t -ast-dump-all -ast-dump-filter Test /dev/null \
-// RUN: | sed -e "s/ //" -e "s/ imported//" \
-// RUN: | FileCheck --strict-whitespace --match-full-lines %s
-
-int i;
-struct S {
-  int i;
-};
-
-void Test() {
-  constexpr int *pi = 
-  // CHECK:  | `-VarDecl {{.*}}  col:{{.*}} pi 'int *const' constexpr cinit
-  // CHECK-NEXT:  |   |-value: LValue 
-
-  constexpr int(S::*pmi) = ::i;
-  // CHECK:`-VarDecl {{.*}}  col:{{.*}} pmi 'int (S::*const)' constexpr cinit
-  // CHECK-NEXT:  |-value: MemberPointer 
-}
Index: clang/test/AST/ast-dump-APValue-MemPtr.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-APValue-MemPtr.cpp
@@ -0,0 +1,15 @@
+// Test without serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN:-ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace %s
+
+int i;
+struct S {
+  int i;
+};
+
+void Test() {
+  constexpr int(S::*pmi) = ::i;
+  // CHECK:VarDecl {{.*}}  col:{{.*}} pmi 'int (S::*const)' constexpr cinit
+  // CHECK-NEXT:  value: MemberPointer ::i
+}
Index: clang/test/AST/ast-dump-APValue-LValue.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-APValue-LValue.cpp
@@ -0,0 +1,12 @@
+// Test without serialization:
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu++17 \
+// RUN:-ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace %s
+
+int i;
+
+void Test() {
+  constexpr int *pi = 
+  // CHECK:  VarDecl {{.*}}  col:{{.*}} pi 'int *const' constexpr cinit
+  // CHECK-NEXT:  |-value: LValue 
+}
Index: clang/lib/AST/TextNodeDumper.cpp
===
--- clang/lib/AST/TextNodeDumper.cpp
+++ clang/lib/AST/TextNodeDumper.cpp
@@ -493,7 +493,8 @@
 return;
   case APValue::LValue:
 (void)Context;
-OS << "LValue ";
+OS << "LValue ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   case APValue::Array: {
 unsigned ArraySize = Value.getArraySize();
@@ -558,10 +559,12 @@
 return;
   }
   case APValue::MemberPointer:
-OS << "MemberPointer ";
+OS << "MemberPointer ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   case APValue::AddrLabelDiff:
-OS << "AddrLabelDiff ";
+OS << "AddrLabelDiff ";
+Value.dumpPretty(OS, Ty, PrintPolicy);
 return;
   }
   llvm_unreachable("Unknown APValue kind!");
Index: clang/lib/AST/APValue.cpp
===
--- clang/lib/AST/APValue.cpp
+++ clang/lib/AST/APValue.cpp
@@ -386,9 +386,10 @@
   return V.convertToDouble();
 }
 
-void APValue::printPretty(raw_ostream , const ASTContext ,
-  QualType Ty) const {
-  switch (getKind()) {
+static void InternalPrinter(raw_ostream , const APValue , QualType Ty,
+const ASTContext *Ctx,
+const clang::PrintingPolicy ) {
+  switch (Value.getKind()) {
   case APValue::None:
 Out << "";
 return;
@@ -397,33 +398,33 @@
 return;
   case APValue::Int:
 if (Ty->isBooleanType())
-  Out << (getInt().getBoolValue() ? "true" : "false");
+  Out << (Value.getInt().getBoolValue() ? "true" : "false");
 else
-  Out << getInt();
+  Out << Value.getInt();
 return;
   case APValue::Float:
-Out << GetApproxValue(getFloat());
+Out << GetApproxValue(Value.getFloat());
 return;
   case APValue::FixedPoint:
-Out << getFixedPoint();
+Out << Value.getFixedPoint();
 return;
   case APValue::Vector: {
 Out << '{';
 QualType ElemTy = Ty->castAs()->getElementType();
-

[PATCH] D85113: [ABI][NFC] Fix the confusion of ByVal and ByRef argument names

2020-08-03 Thread Anatoly Trosinenko via Phabricator via cfe-commits
atrosinenko created this revision.
atrosinenko added reviewers: majnemer, rjmccall, jpienaar.
Herald added a project: clang.
atrosinenko requested review of this revision.

The second argument of getNaturalAlignIndirect() was `bool ByRef`, but
the implementation was just delegating to getIndirect() with `ByRef`
passed unchanged to `bool ByVal` parameter of getIndirect().

Fix the comment in getNaturalAlignIndirectInReg() as well.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85113

Files:
  clang/lib/CodeGen/ABIInfo.h
  clang/lib/CodeGen/TargetInfo.cpp


Index: clang/lib/CodeGen/TargetInfo.cpp
===
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -80,17 +80,17 @@
  T->isMemberFunctionPointerType();
 }
 
-ABIArgInfo
-ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByRef, bool Realign,
- llvm::Type *Padding) const {
-  return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty),
- ByRef, Realign, Padding);
+ABIArgInfo ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByVal,
+bool Realign,
+llvm::Type *Padding) const {
+  return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty), ByVal,
+ Realign, Padding);
 }
 
 ABIArgInfo
 ABIInfo::getNaturalAlignIndirectInReg(QualType Ty, bool Realign) const {
   return ABIArgInfo::getIndirectInReg(getContext().getTypeAlignInChars(Ty),
-  /*ByRef*/ false, Realign);
+  /*ByVal*/ false, Realign);
 }
 
 Address ABIInfo::EmitMSVAArg(CodeGenFunction , Address VAListAddr,
@@ -8557,7 +8557,7 @@
 if (RAA == CGCXXABI::RAA_Indirect) {
   return getIndirectResult(Ty, /*ByVal=*/false, State);
 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
-  return getNaturalAlignIndirect(Ty, /*ByRef=*/true);
+  return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
 }
   }
 
Index: clang/lib/CodeGen/ABIInfo.h
===
--- clang/lib/CodeGen/ABIInfo.h
+++ clang/lib/CodeGen/ABIInfo.h
@@ -111,7 +111,7 @@
 /// A convenience method to return an indirect ABIArgInfo with an
 /// expected alignment equal to the ABI alignment of the given type.
 CodeGen::ABIArgInfo
-getNaturalAlignIndirect(QualType Ty, bool ByRef = true,
+getNaturalAlignIndirect(QualType Ty, bool ByVal = true,
 bool Realign = false,
 llvm::Type *Padding = nullptr) const;
 


Index: clang/lib/CodeGen/TargetInfo.cpp
===
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -80,17 +80,17 @@
  T->isMemberFunctionPointerType();
 }
 
-ABIArgInfo
-ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByRef, bool Realign,
- llvm::Type *Padding) const {
-  return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty),
- ByRef, Realign, Padding);
+ABIArgInfo ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByVal,
+bool Realign,
+llvm::Type *Padding) const {
+  return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty), ByVal,
+ Realign, Padding);
 }
 
 ABIArgInfo
 ABIInfo::getNaturalAlignIndirectInReg(QualType Ty, bool Realign) const {
   return ABIArgInfo::getIndirectInReg(getContext().getTypeAlignInChars(Ty),
-  /*ByRef*/ false, Realign);
+  /*ByVal*/ false, Realign);
 }
 
 Address ABIInfo::EmitMSVAArg(CodeGenFunction , Address VAListAddr,
@@ -8557,7 +8557,7 @@
 if (RAA == CGCXXABI::RAA_Indirect) {
   return getIndirectResult(Ty, /*ByVal=*/false, State);
 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
-  return getNaturalAlignIndirect(Ty, /*ByRef=*/true);
+  return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
 }
   }
 
Index: clang/lib/CodeGen/ABIInfo.h
===
--- clang/lib/CodeGen/ABIInfo.h
+++ clang/lib/CodeGen/ABIInfo.h
@@ -111,7 +111,7 @@
 /// A convenience method to return an indirect ABIArgInfo with an
 /// expected alignment equal to the ABI alignment of the given type.
 CodeGen::ABIArgInfo
-getNaturalAlignIndirect(QualType Ty, bool ByRef = true,
+getNaturalAlignIndirect(QualType Ty, bool ByVal = true,
 bool Realign = false,
 llvm::Type *Padding = nullptr) const;
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org

[PATCH] D75229: [clang-tidy] Add signal-in-multithreaded-program check

2020-08-03 Thread Whisperity via Phabricator via cfe-commits
whisperity added a comment.

In D75229#2189666 , @abelkocsis wrote:

> I have managed to improve the checker, but could not set up the test files to 
> work only in POSIX platforms. Could you help me or show me an example?

It's more so that, if I understand correctly, you **don't** want the 
diagnostics to be emitted when dealing with POSIX multithreading.

Also, have you checked in the test if `__unix__` is defined? I'm not seeing any 
indication of targets in the test configuration, nor checking for this macro. 
Maybe a Windows-specific test file should be added? 
`clang/test/Preprocessor/init.c` lists a bunch of macros that are supposedly 
pre-defined based on the target.

Or maybe the `OSType` in the triple would be more useful than the vendor?




Comment at: 
clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.cpp:68
+const SourceManager , Preprocessor *pp, Preprocessor *ModuleExpanderPP) 
{
+  PP = pp;
+}

Global state is always a potential problem. Are you sure this is the right way 
to do things? Most other tidy checks that actively use this function define 
their own `PPCallback` subclass and use the existing preprocessor here to 
ensure the preprocessor executes the callback.



Comment at: clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp:50-85
 "cert-con54-cpp");


Please upload the diff with full context.



Comment at: clang-tools-extra/docs/clang-tidy/checks/list.rst:102
`bugprone-virtual-near-miss `_, "Yes"
+   `cert-con37-c `_,
`cert-dcl21-cpp `_,

There is a table in this file towards the end where alias checks are explicitly 
listed in a "which check is alias of which other check" format.


Repository:
  rCTE Clang Tools Extra

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

https://reviews.llvm.org/D75229

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


[PATCH] D74436: Change clang option -ffp-model=precise to select ffp-contract=on

2020-08-03 Thread Roman Lebedev via Phabricator via cfe-commits
lebedev.ri added a comment.

In D74436#2190492 , @lebedev.ri wrote:

> <...>

And by codegen changes i mostly mean newly-set/now-unset fp fast-math 
instruction flags.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74436

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


[PATCH] D85034: [analyzer] Simplify functions SVal::getAsSymbolicExpression and similar ones

2020-08-03 Thread Valeriy Savchenko via Phabricator via cfe-commits
vsavchenko added a comment.

> Ready! Sorry, I remember, you've already told me.

Nothing to be sorry about!  It's really not that big of a deal.  Thanks again!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85034

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


[PATCH] D85077: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet added inline comments.



Comment at: clang/lib/Tooling/Tooling.cpp:264
+  // No need to search for target args if we don't have a mode to insert.
+  bool AlreadyHasTarget = !TargetMode.TargetIsValid;
   bool AlreadyHasMode = false;

hokein wrote:
> While this is an optimization, I find the code is a bit harder to follow, 
> with this patch `AlreadyHasTarget` has two semantic meanings: 1) for has 
> target and 2) for target mode is valid.
> 
> I guess we could do it like
> 
> ```
> if (TargetMode.TargetIsValid) {
>   // set the TargetOPT, TargetOPTLegacy variables
>   // search the command line of the target opt.
>   // insert to CommandLine.
> }
> ```
> 
> maybe we could do the same thing for the DriverMode
> 
> ```
> if (TargetMode.DriverMode) {
>   ...
> }
> ```
i would rather not duplicate the loop, what about renaming `AlreadyHastTarget` 
to `ShouldAddTarget` (likewise for `AlyreadyHasMode`) ?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85077

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


[PATCH] D84136: [clang] Fix visitation of ConceptSpecializationExpr in constrained-parameter

2020-08-03 Thread Haojian Wu via Phabricator via cfe-commits
hokein added a subscriber: rsmith.
hokein added inline comments.



Comment at: clang/include/clang/AST/RecursiveASTVisitor.h:1843
+  if (const auto *TC = D->getTypeConstraint()) {
+TRY_TO(TraverseStmt(TC->getImmediatelyDeclaredConstraint()));
 TRY_TO(TraverseConceptReference(*TC));

nridge wrote:
> hokein wrote:
> > Looks like we may visit some nodes in `ConceptReference` twice:
> > -  getImmediatelyDeclaredConstraint returns a `ConceptSpecializationExpr` 
> > (most cases?) which is a subclass of `ConceptReference`;
> > - `TraverseStmt(ConceptSpecializationExpr*)` will dispatch to 
> > `TraverseConceptSpecializationExpr` which invokes 
> > `TraverseConceptReference` (see Line 2719);
> > 
> > 
> > It is sad that we don't have enough test coverage, could you write some 
> > tests in `clang/unittests/Tooling/RecursiveASTVisitorTests/`?
> It is true that there will be two calls to `TraverseConceptReference()`. 
> However, they are called on two different `ConceptReference` objects:
> 
>   * the call in `TraverseConceptSpecializationExpr` will visit the base 
> subobject of the `ConceptSpecializationExpr` (which inherits from 
> `ConceptReference`)
>   * the call in `TraverseTemplateTypeParmDecl` will visit the base subobject 
> of the `TypeConstraint` (which also inherits from `ConceptReference`).
> 
> So, I think this is fine -- there are two distinct `ConceptReference` objects 
> in the AST, and with this patch we visit both of them.
I understand that they are two different `ConceptReference` objects, but they 
have members (`FoundDecl`, `ArgsAsWritten`) that may refer to the same AST 
nodes.

```
template 
concept binary_concept = true;
struct Foo {};

template T> // the template argument Foo will be visited 
twice.
void k2();
```

I'm not sure what's is the right approach here, I can see two options:

- traverse TC + immediately-declared-constraint expr, this seem to cause some 
ast nodes visited twice (maybe not a big deal?)
- just traverse immediately-declared-constraint expr, this seems not breaking 
any tests, but the immediately-declared-constraint expr could be nullptr (e.g. 
broken code, missing required template arguments); or the 
immediately-declared-constraint expr could be a `CXXFoldExpr`, which will make 
some members in `ConceptReference` not be visited;

@rsmith, do you have any idea about this?



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84136

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


[PATCH] D85034: [analyzer] Simplify functions SVal::getAsSymbolicExpression and similar ones

2020-08-03 Thread Denys Petrov 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 rG86e1b73507f3: [analyzer] Simplify function 
SVal::getAsSymbolicExpression and similar ones (authored by ASDenysPetrov).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85034

Files:
  clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
  clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
  clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
  
clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
  clang/lib/StaticAnalyzer/Checkers/Taint.cpp
  clang/lib/StaticAnalyzer/Core/ProgramState.cpp
  clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
  clang/lib/StaticAnalyzer/Core/SVals.cpp
  clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
  clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp

Index: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
@@ -86,7 +86,7 @@
 return makeLocAsInteger(LI->getLoc(), castSize);
   }
 
-  if (const SymExpr *se = val.getAsSymbolicExpression()) {
+  if (SymbolRef se = val.getAsSymbol()) {
 QualType T = Context.getCanonicalType(se->getType());
 // If types are the same or both are integers, ignore the cast.
 // FIXME: Remove this hack when we support symbolic truncation/extension.
Index: clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
===
--- clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
+++ clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
@@ -57,7 +57,7 @@
   // SymIntExprs.
   if (!canReasonAbout(Cond)) {
 // Just add the constraint to the expression without trying to simplify.
-SymbolRef Sym = Cond.getAsSymExpr();
+SymbolRef Sym = Cond.getAsSymbol();
 assert(Sym);
 return assumeSymUnsupported(State, Sym, Assumption);
   }
@@ -101,7 +101,7 @@
 
   if (!canReasonAbout(Value)) {
 // Just add the constraint to the expression without trying to simplify.
-SymbolRef Sym = Value.getAsSymExpr();
+SymbolRef Sym = Value.getAsSymbol();
 assert(Sym);
 return assumeSymInclusiveRange(State, Sym, From, To, InRange);
   }
Index: clang/lib/StaticAnalyzer/Core/SVals.cpp
===
--- clang/lib/StaticAnalyzer/Core/SVals.cpp
+++ clang/lib/StaticAnalyzer/Core/SVals.cpp
@@ -116,8 +116,6 @@
   return nullptr;
 }
 
-// TODO: The next 3 functions have to be simplified.
-
 /// If this SVal wraps a symbol return that SymbolRef.
 /// Otherwise, return 0.
 ///
@@ -132,22 +130,6 @@
   return getAsLocSymbol(IncludeBaseRegions);
 }
 
-/// getAsSymbolicExpression - If this Sval wraps a symbolic expression then
-///  return that expression.  Otherwise return NULL.
-const SymExpr *SVal::getAsSymbolicExpression() const {
-  if (Optional X = getAs())
-return X->getSymbol();
-
-  return getAsSymbol();
-}
-
-const SymExpr* SVal::getAsSymExpr() const {
-  const SymExpr* Sym = getAsSymbol();
-  if (!Sym)
-Sym = getAsSymbolicExpression();
-  return Sym;
-}
-
 const MemRegion *SVal::getAsRegion() const {
   if (Optional X = getAs())
 return X->getRegion();
Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
===
--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
+++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
@@ -377,8 +377,8 @@
 SVal SValBuilder::makeSymExprValNN(BinaryOperator::Opcode Op,
NonLoc LHS, NonLoc RHS,
QualType ResultTy) {
-  const SymExpr *symLHS = LHS.getAsSymExpr();
-  const SymExpr *symRHS = RHS.getAsSymExpr();
+  SymbolRef symLHS = LHS.getAsSymbol();
+  SymbolRef symRHS = RHS.getAsSymbol();
 
   // TODO: When the Max Complexity is reached, we should conjure a symbol
   // instead of generating an Unknown value and propagate the taint info to it.
@@ -492,7 +492,7 @@
   if (getContext().getTypeSize(castTy) >= getContext().getTypeSize(originalTy))
 return evalCast(val, castTy, originalTy);
 
-  const SymExpr *se = val.getAsSymbolicExpression();
+  SymbolRef se = val.getAsSymbol();
   if (!se) // Let evalCast handle non symbolic expressions.
 return evalCast(val, castTy, originalTy);
 
Index: clang/lib/StaticAnalyzer/Core/ProgramState.cpp
===
--- clang/lib/StaticAnalyzer/Core/ProgramState.cpp
+++ clang/lib/StaticAnalyzer/Core/ProgramState.cpp
@@ -582,9 +582,6 @@
   if (SymbolRef Sym = val.getAsSymbol())
 return scan(Sym);
 
-  if (const SymExpr *Sym = val.getAsSymbolicExpression())
-return scan(Sym);
-
   if 

[clang] 86e1b73 - [analyzer] Simplify function SVal::getAsSymbolicExpression and similar ones

2020-08-03 Thread Denys Petrov via cfe-commits

Author: Denys Petrov
Date: 2020-08-03T15:03:35+03:00
New Revision: 86e1b73507f3738f10eefb580d7c5e9adf17c6c0

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

LOG: [analyzer] Simplify function SVal::getAsSymbolicExpression and similar ones

Summary: Simplify functions SVal::getAsSymbolicExpression SVal::getAsSymExpr 
and SVal::getAsSymbol. After revision I concluded that 
`getAsSymbolicExpression` and `getAsSymExpr` repeat functionality of 
`getAsSymbol`, thus them can be removed.

Fix: Remove functions SVal::getAsSymbolicExpression and SVal::getAsSymExpr.

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

Added: 


Modified: 
clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp

clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
clang/lib/StaticAnalyzer/Checkers/Taint.cpp
clang/lib/StaticAnalyzer/Core/ProgramState.cpp
clang/lib/StaticAnalyzer/Core/SValBuilder.cpp
clang/lib/StaticAnalyzer/Core/SVals.cpp
clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp

Removed: 




diff  --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h 
b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
index 1abe29782088..a640d815a5ce 100644
--- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
@@ -182,12 +182,6 @@ class SVal {
   /// should continue to the base regions if the region is not symbolic.
   SymbolRef getAsSymbol(bool IncludeBaseRegions = false) const;
 
-  /// getAsSymbolicExpression - If this Sval wraps a symbolic expression then
-  ///  return that expression.  Otherwise return NULL.
-  const SymExpr *getAsSymbolicExpression() const;
-
-  const SymExpr *getAsSymExpr() const;
-
   const MemRegion *getAsRegion() const;
 
   /// printJson - Pretty-prints in JSON format.

diff  --git a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp 
b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
index 13836f08a61e..78b3c209ad6b 100644
--- a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
@@ -406,7 +406,7 @@ ProgramStateRef 
ObjCDeallocChecker::evalAssume(ProgramStateRef State, SVal Cond,
   if (State->get().isEmpty())
 return State;
 
-  auto *CondBSE = dyn_cast_or_null(Cond.getAsSymExpr());
+  auto *CondBSE = dyn_cast_or_null(Cond.getAsSymbol());
   if (!CondBSE)
 return State;
 

diff  --git a/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
index 87477e96d2d1..a157ee2da5df 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
@@ -509,7 +509,7 @@ ProgramStateRef 
MacOSKeychainAPIChecker::evalAssume(ProgramStateRef State,
   if (AMap.isEmpty())
 return State;
 
-  auto *CondBSE = dyn_cast_or_null(Cond.getAsSymExpr());
+  auto *CondBSE = dyn_cast_or_null(Cond.getAsSymbol());
   if (!CondBSE)
 return State;
   BinaryOperator::Opcode OpCode = CondBSE->getOpcode();

diff  --git 
a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
 
b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
index 1d8ed90f7590..854646a8779d 100644
--- 
a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
+++ 
b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp
@@ -177,7 +177,7 @@ static Optional 
findArgIdxOfSymbol(ProgramStateRef CurrSt,
   for (unsigned Idx = 0; Idx < (*CE)->getNumArgs(); Idx++)
 if (const MemRegion *MR = (*CE)->getArgSVal(Idx).getAsRegion())
   if (const auto *TR = dyn_cast(MR))
-if (CurrSt->getSVal(MR, TR->getValueType()).getAsSymExpr() == Sym)
+if (CurrSt->getSVal(MR, TR->getValueType()).getAsSymbol() == Sym)
   return Idx;
 
   return None;

diff  --git a/clang/lib/StaticAnalyzer/Checkers/Taint.cpp 
b/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
index 5b46ffb656cf..71b2ab834a07 100644
--- a/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/Taint.cpp
@@ -148,7 +148,7 @@ bool taint::isTainted(ProgramStateRef State, const Stmt *S,
 }
 
 bool taint::isTainted(ProgramStateRef State, SVal V, TaintTagType Kind) {
-  if (const SymExpr *Sym = V.getAsSymExpr())
+  if (SymbolRef Sym = V.getAsSymbol())
 return isTainted(State, Sym, Kind);
   if (const MemRegion *Reg = V.getAsRegion())
 return isTainted(State, Reg, 

[PATCH] D83717: [clang-tidy] Add check fo SEI CERT item ENV32-C

2020-08-03 Thread Whisperity via Phabricator via cfe-commits
whisperity added inline comments.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:33
+bool isExitFunction(StringRef FnName) {
+  return FnName == "_Exit" || FnName == "exit" || FnName == "quick_exit";
+}

aaron.ballman wrote:
> Because this rule applies in C++ as well as C, you should protect these names 
> so that calling something like this doesn't trigger the check:
> ```
> namespace menu_items {
> void exit(int);
> }
> ```
> I think we want `::_Exit` and `::std::_Exit` to check the fully qualified 
> names (I believe this will still work in C, but should be tested). The same 
> goes for the other names (including `atexit` and `at_quick_exit` above).
> I think we want `::_Exit` and `::std::_Exit` to check the fully qualified 
> names (I believe this will still work in C, but should be tested).

Tested with Clang-Query:

```
clang-query> m functionDecl(hasName("::atexit"))

Match #1:

/home/whisperity/LLVM/Build/foo.c:1:1: note: "root" binds here
int atexit(int) {}
^~
1 match.
```



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:64
+/// argument.
+void ExitHandlerCheck::registerMatchers(MatchFinder *Finder) {
+  const auto IsRegisterFunction =

aaron.ballman wrote:
> whisperity wrote:
> > What happens if this test is run on C++ code calling the same functions? I 
> > see the rule is only applicable to C, for some reason... Should it be 
> > disabled from registering if by accident the check is enabled on a C++ 
> > source file?
> The CERT C++ rules inherit many of the C rules, including this one. It's 
> listed towards the bottom of the set of inherited rules here: 
> https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046336
Right, thanks for the heads-up. This should be somewhat more indicative on the 
Wiki on the page for the rule (especially because people won't immediately 
understand why a `-c` check reports on their cpp code, assuming they understand 
`-c` means C.)



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:124-125
+  diag(RegisterCall->getSourceRange().getBegin(),
+   "exit-handler potentially calls a jump function. Handlers should "
+   "terminate by returning");
+  diag(HandlerDecl->getBeginLoc(), "handler function declared here",

aaron.ballman wrote:
> whisperity wrote:
> > This semi-sentence structure of starting with lowercase but also 
> > terminating the sentence and leaving in another but unterminated sentences 
> > looks really odd.
> > 
> > Suggestion: "exit handler potentially jumps instead of terminating normally 
> > with a return"
> Slight tweak here as well. I don't think we'll ever see a jump function other 
> than longjmp for this rule, so what about writing `potentially calls 
> 'longjmp'` instead of `potentially jumps`?
 Agree. And if we see, we will have to update the code anyways. One could in 
theory whip up some inline assembly black magic, but that's a whole other can 
of worms.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83717

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


[PATCH] D85077: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 282557.
kadircet added a comment.

- Rename `AlreadyHas` to `ShouldAdd` (and revert the logic)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85077

Files:
  clang/lib/Tooling/Tooling.cpp


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to 
insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget &=
+!TokenRef.startswith(TargetOPT) && !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode &= !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget &=
+!TokenRef.startswith(TargetOPT) && !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode &= !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D82317: [Clang/Test]: Update tests where `noundef` attribute is necessary

2020-08-03 Thread Johannes Doerfert via Phabricator via cfe-commits
jdoerfert resigned from this revision.
jdoerfert edited reviewers, added: rsmith, rjmccall; removed: jdoerfert, 
sscalpone.
jdoerfert added subscribers: rjmccall, rsmith.
jdoerfert added a comment.
Herald added a reviewer: jdoerfert.
Herald added a reviewer: jdoerfert.

In D82317#2185134 , @guiand wrote:

> @jdoerfert what would the procedure be for reviewing these test changes / 
> getting this landed with the noundef patch?

Hmmm. I guess @rsmith @rjmccall and others need to decide how this proceeds.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82317

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


[PATCH] D85118: [clang][AArch64] Correct return type of Neon vqmovun intrinsics

2020-08-03 Thread David Spickett via Phabricator via cfe-commits
DavidSpickett created this revision.
Herald added subscribers: cfe-commits, danielkiss, kristof.beyls.
Herald added a project: clang.
DavidSpickett requested review of this revision.

Neon intrinsics vqmovunh_s16, vqmovuns_s32, vqmovund_s64
should have unsigned return types.

See 
https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics?search=vqmovun

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


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85118

Files:
  clang/include/clang/Basic/arm_neon.td
  clang/test/CodeGen/aarch64-neon-intrinsics.c


Index: clang/test/CodeGen/aarch64-neon-intrinsics.c
===
--- clang/test/CodeGen/aarch64-neon-intrinsics.c
+++ clang/test/CodeGen/aarch64-neon-intrinsics.c
@@ -14094,8 +14094,8 @@
 // CHECK:   [[VQMOVUNH_S16_I:%.*]] = call <8 x i8> 
@llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> [[TMP0]])
 // CHECK:   [[TMP1:%.*]] = extractelement <8 x i8> [[VQMOVUNH_S16_I]], i64 0
 // CHECK:   ret i8 [[TMP1]]
-int8_t test_vqmovunh_s16(int16_t a) {
-  return (int8_t)vqmovunh_s16(a);
+uint8_t test_vqmovunh_s16(int16_t a) {
+  return (uint8_t)vqmovunh_s16(a);
 }
 
 // CHECK-LABEL: @test_vqmovuns_s32(
@@ -14103,15 +14103,15 @@
 // CHECK:   [[VQMOVUNS_S32_I:%.*]] = call <4 x i16> 
@llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> [[TMP0]])
 // CHECK:   [[TMP1:%.*]] = extractelement <4 x i16> [[VQMOVUNS_S32_I]], i64 0
 // CHECK:   ret i16 [[TMP1]]
-int16_t test_vqmovuns_s32(int32_t a) {
-  return (int16_t)vqmovuns_s32(a);
+uint16_t test_vqmovuns_s32(int32_t a) {
+  return (uint16_t)vqmovuns_s32(a);
 }
 
 // CHECK-LABEL: @test_vqmovund_s64(
 // CHECK:   [[VQMOVUND_S64_I:%.*]] = call i32 
@llvm.aarch64.neon.scalar.sqxtun.i32.i64(i64 %a)
 // CHECK:   ret i32 [[VQMOVUND_S64_I]]
-int32_t test_vqmovund_s64(int64_t a) {
-  return (int32_t)vqmovund_s64(a);
+uint32_t test_vqmovund_s64(int64_t a) {
+  return (uint32_t)vqmovund_s64(a);
 }
 
 // CHECK-LABEL: @test_vqmovnh_s16(
Index: clang/include/clang/Basic/arm_neon.td
===
--- clang/include/clang/Basic/arm_neon.td
+++ clang/include/clang/Basic/arm_neon.td
@@ -1498,7 +1498,7 @@
 
 

 // Scalar Signed Saturating Extract Unsigned Narrow
-def SCALAR_SQXTUN : SInst<"vqmovun", "(1<)1", "SsSiSl">;
+def SCALAR_SQXTUN : SInst<"vqmovun", "(U1<)1", "SsSiSl">;
 
 

 // Scalar Signed Saturating Extract Narrow


Index: clang/test/CodeGen/aarch64-neon-intrinsics.c
===
--- clang/test/CodeGen/aarch64-neon-intrinsics.c
+++ clang/test/CodeGen/aarch64-neon-intrinsics.c
@@ -14094,8 +14094,8 @@
 // CHECK:   [[VQMOVUNH_S16_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtun.v8i8(<8 x i16> [[TMP0]])
 // CHECK:   [[TMP1:%.*]] = extractelement <8 x i8> [[VQMOVUNH_S16_I]], i64 0
 // CHECK:   ret i8 [[TMP1]]
-int8_t test_vqmovunh_s16(int16_t a) {
-  return (int8_t)vqmovunh_s16(a);
+uint8_t test_vqmovunh_s16(int16_t a) {
+  return (uint8_t)vqmovunh_s16(a);
 }
 
 // CHECK-LABEL: @test_vqmovuns_s32(
@@ -14103,15 +14103,15 @@
 // CHECK:   [[VQMOVUNS_S32_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtun.v4i16(<4 x i32> [[TMP0]])
 // CHECK:   [[TMP1:%.*]] = extractelement <4 x i16> [[VQMOVUNS_S32_I]], i64 0
 // CHECK:   ret i16 [[TMP1]]
-int16_t test_vqmovuns_s32(int32_t a) {
-  return (int16_t)vqmovuns_s32(a);
+uint16_t test_vqmovuns_s32(int32_t a) {
+  return (uint16_t)vqmovuns_s32(a);
 }
 
 // CHECK-LABEL: @test_vqmovund_s64(
 // CHECK:   [[VQMOVUND_S64_I:%.*]] = call i32 @llvm.aarch64.neon.scalar.sqxtun.i32.i64(i64 %a)
 // CHECK:   ret i32 [[VQMOVUND_S64_I]]
-int32_t test_vqmovund_s64(int64_t a) {
-  return (int32_t)vqmovund_s64(a);
+uint32_t test_vqmovund_s64(int64_t a) {
+  return (uint32_t)vqmovund_s64(a);
 }
 
 // CHECK-LABEL: @test_vqmovnh_s16(
Index: clang/include/clang/Basic/arm_neon.td
===
--- clang/include/clang/Basic/arm_neon.td
+++ clang/include/clang/Basic/arm_neon.td
@@ -1498,7 +1498,7 @@
 
 
 // Scalar Signed Saturating Extract Unsigned Narrow
-def SCALAR_SQXTUN : SInst<"vqmovun", "(1<)1", "SsSiSl">;
+def SCALAR_SQXTUN : SInst<"vqmovun", "(U1<)1", "SsSiSl">;
 
 
 // Scalar Signed Saturating Extract Narrow
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D85124: [Concepts] Include the found concept decl when dumping the ConceptSpecializationExpr

2020-08-03 Thread Haojian Wu via Phabricator via cfe-commits
hokein created this revision.
hokein added a reviewer: nridge.
Herald added a project: clang.
hokein requested review of this revision.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85124

Files:
  clang/include/clang/AST/TextNodeDumper.h
  clang/lib/AST/TextNodeDumper.cpp
  clang/test/AST/ast-dump-concepts.cpp


Index: clang/test/AST/ast-dump-concepts.cpp
===
--- clang/test/AST/ast-dump-concepts.cpp
+++ clang/test/AST/ast-dump-concepts.cpp
@@ -15,7 +15,7 @@
 template 
 struct Foo {
   // CHECK:  TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 
'binary_concept'
-  // CHECK-NEXT: |-ConceptSpecializationExpr {{.*}}  'bool'
+  // CHECK-NEXT: |-ConceptSpecializationExpr {{.*}}  'bool' 
Concept {{.*}}
   // CHECK-NEXT: `-TemplateArgument {{.*}} type 'int'
   template  R>
   Foo(R);
Index: clang/lib/AST/TextNodeDumper.cpp
===
--- clang/lib/AST/TextNodeDumper.cpp
+++ clang/lib/AST/TextNodeDumper.cpp
@@ -1340,6 +1340,12 @@
   }
 }
 
+void TextNodeDumper::VisitConceptSpecializationExpr(
+const ConceptSpecializationExpr *Node) {
+  OS << " ";
+  dumpBareDeclRef(Node->getFoundDecl());
+}
+
 void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) {
   if (T->isSpelledAsLValue())
 OS << " written as lvalue reference";
Index: clang/include/clang/AST/TextNodeDumper.h
===
--- clang/include/clang/AST/TextNodeDumper.h
+++ clang/include/clang/AST/TextNodeDumper.h
@@ -295,6 +295,7 @@
   void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
   void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
   void VisitOMPIteratorExpr(const OMPIteratorExpr *Node);
+  void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *Node);
 
   void VisitRValueReferenceType(const ReferenceType *T);
   void VisitArrayType(const ArrayType *T);


Index: clang/test/AST/ast-dump-concepts.cpp
===
--- clang/test/AST/ast-dump-concepts.cpp
+++ clang/test/AST/ast-dump-concepts.cpp
@@ -15,7 +15,7 @@
 template 
 struct Foo {
   // CHECK:  TemplateTypeParmDecl {{.*}} referenced Concept {{.*}} 'binary_concept'
-  // CHECK-NEXT: |-ConceptSpecializationExpr {{.*}}  'bool'
+  // CHECK-NEXT: |-ConceptSpecializationExpr {{.*}}  'bool' Concept {{.*}}
   // CHECK-NEXT: `-TemplateArgument {{.*}} type 'int'
   template  R>
   Foo(R);
Index: clang/lib/AST/TextNodeDumper.cpp
===
--- clang/lib/AST/TextNodeDumper.cpp
+++ clang/lib/AST/TextNodeDumper.cpp
@@ -1340,6 +1340,12 @@
   }
 }
 
+void TextNodeDumper::VisitConceptSpecializationExpr(
+const ConceptSpecializationExpr *Node) {
+  OS << " ";
+  dumpBareDeclRef(Node->getFoundDecl());
+}
+
 void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) {
   if (T->isSpelledAsLValue())
 OS << " written as lvalue reference";
Index: clang/include/clang/AST/TextNodeDumper.h
===
--- clang/include/clang/AST/TextNodeDumper.h
+++ clang/include/clang/AST/TextNodeDumper.h
@@ -295,6 +295,7 @@
   void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
   void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
   void VisitOMPIteratorExpr(const OMPIteratorExpr *Node);
+  void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *Node);
 
   void VisitRValueReferenceType(const ReferenceType *T);
   void VisitArrayType(const ArrayType *T);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D85077: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Kadir Cetinkaya 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 rG76c3ec814dec: [clang][Tooling] Optimize addTargetAndMode in 
case of invalid modes (authored by kadircet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85077

Files:
  clang/lib/Tooling/Tooling.cpp


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to 
insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget = ShouldAddTarget && !TokenRef.startswith(TargetOPT) &&
+  !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode = ShouldAddMode && !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget = ShouldAddTarget && !TokenRef.startswith(TargetOPT) &&
+  !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode = ShouldAddMode && !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 76c3ec8 - [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Kadir Cetinkaya via cfe-commits

Author: Kadir Cetinkaya
Date: 2020-08-03T13:58:27+02:00
New Revision: 76c3ec814dec8eef020490b5d3a640d873b5918b

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

LOG: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

This skips searching for `target` related flags in the existing args if
we don't have a valid target to insert.

Depends on D85076

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

Added: 


Modified: 
clang/lib/Tooling/Tooling.cpp

Removed: 




diff  --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp
index 0593f0cc1d19..1ee8ce28c2ef 100644
--- a/clang/lib/Tooling/Tooling.cpp
+++ b/clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@ void 
addTargetAndModeForProgramName(std::vector ,
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to 
insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget = ShouldAddTarget && !TokenRef.startswith(TargetOPT) &&
+  !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode = ShouldAddMode && !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }



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


[PATCH] D85028: [clangd] Support new/deleta operator in TargetFinder.

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet accepted this revision.
kadircet added a comment.
This revision is now accepted and ready to land.

thanks, lgtm!




Comment at: clang-tools-extra/clangd/XRefs.cpp:241
   auto AddResultDecl = [&](const NamedDecl *D) {
+// FIXME: C++ global operator new/delete are implicitly declared in every
+// TU, these functions have invalid source location. In case where users

i think we can make this more generic with something like.

```
Canonical declarations of some symbols might be provided as a built-in with 
possibly invalid source locations (e.g. global new operator).
In such cases we should pick a redecl with valid source location, instead of 
failing.
```

and possibly put it just above the `if(!Loc)` statement.



Comment at: clang-tools-extra/clangd/unittests/FindTargetTests.cpp:563
+
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
+  Code = R"cpp(

i think it is better to put it to the top (or move the following tests to a new 
fixture) so that all of the tests in here are covered by the same Flags (just a 
precaution for future).



Comment at: clang-tools-extra/clangd/unittests/FindTargetTests.cpp:564
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long s);

hokein wrote:
> kadircet wrote:
> > nit: you can simplify to (same for delete)
> > 
> > ```cpp
> > void *operator new(unsigned long);
> > void foo() { new int; }
> > ```
> I think global and class-specific new/delete operators are not the same 
> thing, I would like to keep both of them. Added the global one.
i think from the perspective of FindTarget.cpp they are all the same, as it 
only cares about `CXXNewExpr` and both of these are of that class.

but sure, extra testing wouldn't hurt.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85028

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


[PATCH] D83717: [clang-tidy] Add check fo SEI CERT item ENV32-C

2020-08-03 Thread Whisperity via Phabricator via cfe-commits
whisperity added inline comments.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:64
+/// argument.
+void ExitHandlerCheck::registerMatchers(MatchFinder *Finder) {
+  const auto IsRegisterFunction =

What happens if this test is run on C++ code calling the same functions? I see 
the rule is only applicable to C, for some reason... Should it be disabled from 
registering if by accident the check is enabled on a C++ source file?



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:68-71
+  0, declRefExpr(hasDeclaration(functionDecl().bind("handler_decl")))
+ .bind("handler_expr"));
+  Finder->addMatcher(
+  callExpr(IsRegisterFunction, HasHandlerAsFirstArg).bind("register_call"),

It is customary in most Tidy checks that use multiple binds to have the bind 
names defined as a symbol, instead of using just two string literals as if the 
bind has to be renamed, it's easy to mess it up.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:112-113
+  diag(RegisterCall->getBeginLoc(),
+   "exit-handler potentially calls an exit function. Handlers should "
+   "terminate by returning");
+  diag(HandlerDecl->getBeginLoc(), "handler function declared here",

Same as below, suggestion: "exit hander potentially calls exit function instead 
of terminating normally with a return".

("exit handler" and "exit function" without - is more in line with the SEI CERT 
rule's phrasing too, they don't say "exit-handler".)



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:124-125
+  diag(RegisterCall->getSourceRange().getBegin(),
+   "exit-handler potentially calls a jump function. Handlers should "
+   "terminate by returning");
+  diag(HandlerDecl->getBeginLoc(), "handler function declared here",

This semi-sentence structure of starting with lowercase but also terminating 
the sentence and leaving in another but unterminated sentences looks really odd.

Suggestion: "exit handler potentially jumps instead of terminating normally 
with a return"



Comment at: clang-tools-extra/test/clang-tidy/checkers/cert-env32-c.c:31
+// --
+// C99 requires jmp_buf to be an array type.
+typedef int jmp_buf[1];

Which is the standard version this test file is set to analyse with? I don't 
see any `-std=` flag in the `RUN:` line.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83717

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


[PATCH] D74436: Change clang option -ffp-model=precise to select ffp-contract=on

2020-08-03 Thread Florian Hahn via Phabricator via cfe-commits
fhahn updated this revision to Diff 282577.
fhahn added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74436

Files:
  clang/docs/UsersManual.rst
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/CodeGen/ppc-emmintrin.c
  clang/test/CodeGen/ppc-xmmintrin.c
  clang/test/Driver/fp-model.c

Index: clang/test/Driver/fp-model.c
===
--- clang/test/Driver/fp-model.c
+++ clang/test/Driver/fp-model.c
@@ -1,65 +1,67 @@
 // Test that incompatible combinations of -ffp-model= options
 // and other floating point options get a warning diagnostic.
-//
-// REQUIRES: clang-driver
 
-// RUN: %clang -### -ffp-model=fast -ffp-contract=off -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=fast -ffp-contract=off -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN %s
 // WARN: warning: overriding '-ffp-model=fast' option with '-ffp-contract=off' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=fast -ffp-contract=on -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=fast -ffp-contract=on -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN1 %s
 // WARN1: warning: overriding '-ffp-model=fast' option with '-ffp-contract=on' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fassociative-math -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fassociative-math -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN2 %s
 // WARN2: warning: overriding '-ffp-model=strict' option with '-fassociative-math' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -ffast-math -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -ffast-math -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN3 %s
 // WARN3: warning: overriding '-ffp-model=strict' option with '-ffast-math' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -ffinite-math-only -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -ffinite-math-only -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN4 %s
 // WARN4: warning: overriding '-ffp-model=strict' option with '-ffinite-math-only' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -ffp-contract=fast -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -ffp-contract=fast -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN5 %s
 // WARN5: warning: overriding '-ffp-model=strict' option with '-ffp-contract=fast' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -ffp-contract=on -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -ffp-contract=fast -c %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=WARN6 %s
+// WARN6: warning: overriding '-ffp-model=strict' option with '-ffp-contract=fast' [-Woverriding-t-option]
+
+// RUN: %clang -target x86_64 -### -ffp-model=strict -ffp-contract=on -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN7 %s
 // WARN7: warning: overriding '-ffp-model=strict' option with '-ffp-contract=on' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fno-honor-infinities -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fno-honor-infinities -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN8 %s
 // WARN8: warning: overriding '-ffp-model=strict' option with '-fno-honor-infinities' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fno-honor-nans -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fno-honor-nans -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARN9 %s
 // WARN9: warning: overriding '-ffp-model=strict' option with '-fno-honor-nans' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fno-rounding-math -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fno-rounding-math -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARNa %s
 // WARNa: warning: overriding '-ffp-model=strict' option with '-fno-rounding-math' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fno-signed-zeros -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fno-signed-zeros -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARNb %s
 // WARNb: warning: overriding '-ffp-model=strict' option with '-fno-signed-zeros' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -fno-trapping-math -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -fno-trapping-math -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARNc %s
 // WARNc: warning: overriding '-ffp-model=strict' option with '-fno-trapping-math' [-Woverriding-t-option]
 
-// RUN: %clang -### -ffp-model=strict -freciprocal-math -c %s 2>&1 \
+// RUN: %clang -target x86_64 -### -ffp-model=strict -freciprocal-math -c %s 2>&1 \
 // RUN:   | FileCheck --check-prefix=WARNd %s
 // WARNd: warning: overriding '-ffp-model=strict' option with '-freciprocal-math' 

[PATCH] D85028: [clangd] Support new/delete operator in TargetFinder.

2020-08-03 Thread Haojian Wu via Phabricator via cfe-commits
hokein updated this revision to Diff 282590.
hokein marked 2 inline comments as done.
hokein added a comment.

address comments.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85028

Files:
  clang-tools-extra/clangd/FindTarget.cpp
  clang-tools-extra/clangd/XRefs.cpp
  clang-tools-extra/clangd/unittests/FindTargetTests.cpp


Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp
===
--- clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -535,6 +535,7 @@
   // FIXME: Auto-completion in a template requires disabling delayed template
   // parsing.
   Flags = {"-fno-delayed-template-parsing"};
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
 
   Code = R"cpp(
 void func(int*);
@@ -559,6 +560,36 @@
 };
   )cpp";
   EXPECT_DECLS("UnresolvedMemberExpr", "void func(int *)", "void func(char 
*)");
+
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long);
+};
+auto* k = [[new]] X();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "static void *operator new(unsigned long)");
+  Code = R"cpp(
+void *operator new(unsigned long);
+auto* k = [[new]] int();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "void *operator new(unsigned long)");
+
+  Code = R"cpp(
+struct X {
+  static void operator delete(void *) noexcept;
+};
+void k(X* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "static void operator delete(void *) 
noexcept");
+  Code = R"cpp(
+void operator delete(void *) noexcept;
+void k(int* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "void operator delete(void *) noexcept");
 }
 
 TEST_F(TargetDeclTest, DependentExprs) {
Index: clang-tools-extra/clangd/XRefs.cpp
===
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -238,6 +238,10 @@
   llvm::DenseMap ResultIndex;
 
   auto AddResultDecl = [&](const NamedDecl *D) {
+// FIXME: Canonical declarations of some symbols might refer to built-in
+// decls with possibly-invalid source locations (e.g. global new operator).
+// In such cases we should pick up a redecl with valid source location
+// instead of failing.
 D = llvm::cast(D->getCanonicalDecl());
 auto Loc =
 makeLocation(AST.getASTContext(), nameLocation(*D, SM), MainFilePath);
Index: clang-tools-extra/clangd/FindTarget.cpp
===
--- clang-tools-extra/clangd/FindTarget.cpp
+++ clang-tools-extra/clangd/FindTarget.cpp
@@ -460,6 +460,12 @@
   void VisitPseudoObjectExpr(const PseudoObjectExpr *POE) {
 Outer.add(POE->getSyntacticForm(), Flags);
   }
+  void VisitCXXNewExpr(const CXXNewExpr *CNE) {
+Outer.add(CNE->getOperatorNew(), Flags);
+  }
+  void VisitCXXDeleteExpr(const CXXDeleteExpr *CDE) {
+Outer.add(CDE->getOperatorDelete(), Flags);
+  }
 };
 Visitor(*this, Flags).Visit(S);
   }


Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp
===
--- clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -535,6 +535,7 @@
   // FIXME: Auto-completion in a template requires disabling delayed template
   // parsing.
   Flags = {"-fno-delayed-template-parsing"};
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
 
   Code = R"cpp(
 void func(int*);
@@ -559,6 +560,36 @@
 };
   )cpp";
   EXPECT_DECLS("UnresolvedMemberExpr", "void func(int *)", "void func(char *)");
+
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long);
+};
+auto* k = [[new]] X();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "static void *operator new(unsigned long)");
+  Code = R"cpp(
+void *operator new(unsigned long);
+auto* k = [[new]] int();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "void *operator new(unsigned long)");
+
+  Code = R"cpp(
+struct X {
+  static void operator delete(void *) noexcept;
+};
+void k(X* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "static void operator delete(void *) noexcept");
+  Code = R"cpp(
+void operator delete(void *) noexcept;
+void k(int* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "void operator delete(void *) noexcept");
 }
 
 TEST_F(TargetDeclTest, DependentExprs) {
Index: clang-tools-extra/clangd/XRefs.cpp
===
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -238,6 +238,10 @@
   llvm::DenseMap ResultIndex;
 
   auto AddResultDecl = [&](const NamedDecl *D) {
+// FIXME: 

[PATCH] D84839: Add document outline symbols from unnamed contexts, e.g. extern "C".

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGd76057c1fe6a: Add document outline symbols from unnamed 
contexts, e.g. extern C. (authored by ilya-golovenko, committed by 
kadircet).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84839

Files:
  clang-tools-extra/clangd/FindSymbols.cpp
  clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp

Index: clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
===
--- clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
+++ clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
@@ -429,6 +429,40 @@
   EXPECT_THAT(getSymbols(TU.build()), IsEmpty());
 }
 
+TEST(DocumentSymbols, ExternContext) {
+  TestTU TU;
+  TU.Code = R"cpp(
+  extern "C" {
+  void foo();
+  class Foo {};
+  }
+  namespace ns {
+extern "C" {
+void bar();
+class Bar {};
+}
+  })cpp";
+
+  EXPECT_THAT(getSymbols(TU.build()),
+  ElementsAre(WithName("foo"), WithName("Foo"),
+  AllOf(WithName("ns"),
+Children(WithName("bar"), WithName("Bar");
+}
+
+TEST(DocumentSymbols, ExportContext) {
+  TestTU TU;
+  TU.ExtraArgs = {"-std=c++20"};
+  TU.Code = R"cpp(
+  export module test;
+  export {
+  void foo();
+  class Foo {};
+  })cpp";
+
+  EXPECT_THAT(getSymbols(TU.build()),
+  ElementsAre(WithName("foo"), WithName("Foo")));
+}
+
 TEST(DocumentSymbols, NoLocals) {
   TestTU TU;
   TU.Code = R"cpp(
Index: clang-tools-extra/clangd/FindSymbols.cpp
===
--- clang-tools-extra/clangd/FindSymbols.cpp
+++ clang-tools-extra/clangd/FindSymbols.cpp
@@ -188,7 +188,7 @@
   }
 
 private:
-  enum class VisitKind { No, OnlyDecl, DeclAndChildren };
+  enum class VisitKind { No, OnlyDecl, OnlyChildren, DeclAndChildren };
 
   void traverseDecl(Decl *D, std::vector ) {
 if (auto *Templ = llvm::dyn_cast(D)) {
@@ -196,18 +196,25 @@
   if (auto *TD = Templ->getTemplatedDecl())
 D = TD;
 }
-auto *ND = llvm::dyn_cast(D);
-if (!ND)
-  return;
-VisitKind Visit = shouldVisit(ND);
+
+VisitKind Visit = shouldVisit(D);
 if (Visit == VisitKind::No)
   return;
-llvm::Optional Sym = declToSym(AST.getASTContext(), *ND);
+
+if (Visit == VisitKind::OnlyChildren)
+  return traverseChildren(D, Results);
+
+auto *ND = llvm::cast(D);
+auto Sym = declToSym(AST.getASTContext(), *ND);
 if (!Sym)
   return;
-if (Visit == VisitKind::DeclAndChildren)
-  traverseChildren(D, Sym->children);
 Results.push_back(std::move(*Sym));
+
+if (Visit == VisitKind::OnlyDecl)
+  return;
+
+assert(Visit == VisitKind::DeclAndChildren && "Unexpected VisitKind");
+traverseChildren(ND, Results.back().children);
   }
 
   void traverseChildren(Decl *D, std::vector ) {
@@ -218,10 +225,16 @@
   traverseDecl(C, Results);
   }
 
-  VisitKind shouldVisit(NamedDecl *D) {
+  VisitKind shouldVisit(Decl *D) {
 if (D->isImplicit())
   return VisitKind::No;
 
+if (llvm::isa(D) || llvm::isa(D))
+  return VisitKind::OnlyChildren;
+
+if (!llvm::isa(D))
+  return VisitKind::No;
+
 if (auto Func = llvm::dyn_cast(D)) {
   // Some functions are implicit template instantiations, those should be
   // ignored.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] d76057c - Add document outline symbols from unnamed contexts, e.g. extern "C".

2020-08-03 Thread Kadir Cetinkaya via cfe-commits

Author: Ilya Golovenko
Date: 2020-08-03T11:34:56+02:00
New Revision: d76057c1fe6a368e9e422cf586e09fba827c96e1

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

LOG: Add document outline symbols from unnamed contexts, e.g. extern "C".

It is necessary to traverse children of unnamed declaration contexts
to get symbols which are currently missing in document outline, e.g.:

extern "C" {
void foo();
}

Reviewed By: kadircet

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

Added: 


Modified: 
clang-tools-extra/clangd/FindSymbols.cpp
clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp

Removed: 




diff  --git a/clang-tools-extra/clangd/FindSymbols.cpp 
b/clang-tools-extra/clangd/FindSymbols.cpp
index f5d6a95aa713..247165698825 100644
--- a/clang-tools-extra/clangd/FindSymbols.cpp
+++ b/clang-tools-extra/clangd/FindSymbols.cpp
@@ -188,7 +188,7 @@ class DocumentOutline {
   }
 
 private:
-  enum class VisitKind { No, OnlyDecl, DeclAndChildren };
+  enum class VisitKind { No, OnlyDecl, OnlyChildren, DeclAndChildren };
 
   void traverseDecl(Decl *D, std::vector ) {
 if (auto *Templ = llvm::dyn_cast(D)) {
@@ -196,18 +196,25 @@ class DocumentOutline {
   if (auto *TD = Templ->getTemplatedDecl())
 D = TD;
 }
-auto *ND = llvm::dyn_cast(D);
-if (!ND)
-  return;
-VisitKind Visit = shouldVisit(ND);
+
+VisitKind Visit = shouldVisit(D);
 if (Visit == VisitKind::No)
   return;
-llvm::Optional Sym = declToSym(AST.getASTContext(), *ND);
+
+if (Visit == VisitKind::OnlyChildren)
+  return traverseChildren(D, Results);
+
+auto *ND = llvm::cast(D);
+auto Sym = declToSym(AST.getASTContext(), *ND);
 if (!Sym)
   return;
-if (Visit == VisitKind::DeclAndChildren)
-  traverseChildren(D, Sym->children);
 Results.push_back(std::move(*Sym));
+
+if (Visit == VisitKind::OnlyDecl)
+  return;
+
+assert(Visit == VisitKind::DeclAndChildren && "Unexpected VisitKind");
+traverseChildren(ND, Results.back().children);
   }
 
   void traverseChildren(Decl *D, std::vector ) {
@@ -218,10 +225,16 @@ class DocumentOutline {
   traverseDecl(C, Results);
   }
 
-  VisitKind shouldVisit(NamedDecl *D) {
+  VisitKind shouldVisit(Decl *D) {
 if (D->isImplicit())
   return VisitKind::No;
 
+if (llvm::isa(D) || llvm::isa(D))
+  return VisitKind::OnlyChildren;
+
+if (!llvm::isa(D))
+  return VisitKind::No;
+
 if (auto Func = llvm::dyn_cast(D)) {
   // Some functions are implicit template instantiations, those should be
   // ignored.

diff  --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp 
b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
index 07c42fcf2030..8576e11a5f21 100644
--- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp
@@ -429,6 +429,40 @@ TEST(DocumentSymbols, ExternSymbol) {
   EXPECT_THAT(getSymbols(TU.build()), IsEmpty());
 }
 
+TEST(DocumentSymbols, ExternContext) {
+  TestTU TU;
+  TU.Code = R"cpp(
+  extern "C" {
+  void foo();
+  class Foo {};
+  }
+  namespace ns {
+extern "C" {
+void bar();
+class Bar {};
+}
+  })cpp";
+
+  EXPECT_THAT(getSymbols(TU.build()),
+  ElementsAre(WithName("foo"), WithName("Foo"),
+  AllOf(WithName("ns"),
+Children(WithName("bar"), WithName("Bar");
+}
+
+TEST(DocumentSymbols, ExportContext) {
+  TestTU TU;
+  TU.ExtraArgs = {"-std=c++20"};
+  TU.Code = R"cpp(
+  export module test;
+  export {
+  void foo();
+  class Foo {};
+  })cpp";
+
+  EXPECT_THAT(getSymbols(TU.build()),
+  ElementsAre(WithName("foo"), WithName("Foo")));
+}
+
 TEST(DocumentSymbols, NoLocals) {
   TestTU TU;
   TU.Code = R"cpp(



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


[PATCH] D84511: Fix update_cc_test_checks.py --llvm-bin after D78478

2020-08-03 Thread Alexander Richardson 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 rGd1007478f19d: Fix update_cc_test_checks.py --llvm-bin after 
D78478 (authored by arichardson).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84511

Files:
  llvm/utils/UpdateTestChecks/common.py
  llvm/utils/update_cc_test_checks.py

Index: llvm/utils/update_cc_test_checks.py
===
--- llvm/utils/update_cc_test_checks.py
+++ llvm/utils/update_cc_test_checks.py
@@ -112,6 +112,20 @@
 return []
   return shlex.split(value)
 
+
+def infer_dependent_args(args):
+  if not args.clang:
+if not args.llvm_bin:
+  args.clang = 'clang'
+else:
+  args.clang = os.path.join(args.llvm_bin, 'clang')
+  if not args.opt:
+if not args.llvm_bin:
+  args.opt = 'opt'
+else:
+  args.opt = os.path.join(args.llvm_bin, 'opt')
+
+
 def config():
   parser = argparse.ArgumentParser(
   description=__doc__,
@@ -135,12 +149,8 @@
   help='Check "Function Attributes" for functions')
   parser.add_argument('tests', nargs='+')
   args = common.parse_commandline_args(parser)
+  infer_dependent_args(args)
 
-  if args.clang is None:
-if args.llvm_bin is None:
-  args.clang = 'clang'
-else:
-  args.clang = os.path.join(args.llvm_bin, 'clang')
   if not distutils.spawn.find_executable(args.clang):
 print('Please specify --llvm-bin or --clang', file=sys.stderr)
 sys.exit(1)
@@ -157,11 +167,6 @@
 common.warn('Could not determine clang builtins directory, some tests '
 'might not update correctly.')
 
-  if args.opt is None:
-if args.llvm_bin is None:
-  args.opt = 'opt'
-else:
-  args.opt = os.path.join(args.llvm_bin, 'opt')
   if not distutils.spawn.find_executable(args.opt):
 # Many uses of this tool will not need an opt binary, because it's only
 # needed for updating a test that runs clang | opt | FileCheck. So we
@@ -203,7 +208,7 @@
   script_name = os.path.basename(__file__)
 
   for ti in common.itertests(initial_args.tests, parser, 'utils/' + script_name,
- comment_prefix='//'):
+ comment_prefix='//', argparse_callback=infer_dependent_args):
 # Build a list of clang command lines and check prefixes from RUN lines.
 run_list = []
 line2spell_and_mangled_list = collections.defaultdict(list)
Index: llvm/utils/UpdateTestChecks/common.py
===
--- llvm/utils/UpdateTestChecks/common.py
+++ llvm/utils/UpdateTestChecks/common.py
@@ -44,8 +44,9 @@
 
 class TestInfo(object):
   def __init__(self, test, parser, script_name, input_lines, args, argv,
-   comment_prefix):
+   comment_prefix, argparse_callback):
 self.parser = parser
+self.argparse_callback = argparse_callback
 self.path = test
 self.args = args
 self.argv = argv
@@ -68,14 +69,14 @@
   if input_line.startswith(self.autogenerated_note_prefix):
 continue
   self.args, self.argv = check_for_command(input_line, self.parser,
-   self.args, self.argv)
+   self.args, self.argv, self.argparse_callback)
   if not self.args.enabled:
 output_lines.append(input_line)
 continue
   yield InputLineInfo(input_line, line_num, self.args, self.argv)
 
 
-def itertests(test_patterns, parser, script_name, comment_prefix=None):
+def itertests(test_patterns, parser, script_name, comment_prefix=None, argparse_callback=None):
   for pattern in test_patterns:
 # On Windows we must expand the patterns ourselves.
 tests_list = glob.glob(pattern)
@@ -86,19 +87,21 @@
   with open(test) as f:
 input_lines = [l.rstrip() for l in f]
   args = parser.parse_args()
+  if argparse_callback is not None:
+argparse_callback(args)
   argv = sys.argv[:]
   first_line = input_lines[0] if input_lines else ""
   if UTC_ADVERT in first_line:
 if script_name not in first_line and not args.force_update:
   warn("Skipping test which wasn't autogenerated by " + script_name, test)
   continue
-args, argv = check_for_command(first_line, parser, args, argv)
+args, argv = check_for_command(first_line, parser, args, argv, argparse_callback)
   elif args.update_only:
 assert UTC_ADVERT not in first_line
 warn("Skipping test which isn't autogenerated: " + test)
 continue
   yield TestInfo(test, parser, script_name, input_lines, args, argv,
- comment_prefix)
+ comment_prefix, argparse_callback)
 
 
 def should_add_line_to_output(input_line, prefix_set):
@@ -510,10 +513,12 

[PATCH] D74436: Change clang option -ffp-model=precise to select ffp-contract=on

2020-08-03 Thread Florian Hahn via Phabricator via cfe-commits
fhahn reopened this revision.
fhahn added a comment.
This revision is now accepted and ready to land.

IIUC the patch is currently reverted (in 
78654e8511cf16d49f6680d782f3771a767ba942 
), due to 
~20 llvm-test-suite failures.

The failures on X86 are listed below. Unfortunately most tests just compare the 
hash of the output, so it is not obvious in what way the results are changed. 
Any ideas on how to move forward on this? I'll update the diff with a rebased 
version on current trunk, which I used to reproduce the failures.

  Failed Tests (22):
test-suite :: MultiSource/Applications/oggenc/oggenc.test
test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/CLAMR/CLAMR.test
test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/HPCCG/HPCCG.test
test-suite :: MultiSource/Benchmarks/DOE-ProxyApps-C++/miniFE/miniFE.test
test-suite :: MultiSource/Benchmarks/Rodinia/srad/srad.test
test-suite :: SingleSource/Benchmarks/Linpack/linpack-pc.test
test-suite :: SingleSource/Benchmarks/Misc-C++/Large/sphereflake.test
test-suite :: 
SingleSource/Benchmarks/Polybench/datamining/correlation/correlation.test
test-suite :: 
SingleSource/Benchmarks/Polybench/datamining/covariance/covariance.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/2mm/2mm.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/3mm/3mm.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/atax/atax.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/bicg/bicg.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/gemver/gemver.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/gesummv/gesummv.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/symm/symm.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/trisolv/trisolv.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/kernels/trmm/trmm.test
test-suite :: 
SingleSource/Benchmarks/Polybench/linear-algebra/solvers/gramschmidt/gramschmidt.test
test-suite :: SingleSource/Benchmarks/Polybench/stencils/adi/adi.test
test-suite :: SingleSource/UnitTests/Vector/SSE/Vector-sse.expandfft.test
test-suite :: SingleSource/UnitTests/Vector/SSE/Vector-sse.stepfft.test


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74436

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


[PATCH] D85077: [clang][Tooling] Optimize addTargetAndMode in case of invalid modes

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet updated this revision to Diff 282584.
kadircet added a comment.

- Change bitwise assignment to logical operators, as bitwise operators do not 
have short-circuting.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85077

Files:
  clang/lib/Tooling/Tooling.cpp


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to 
insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget = ShouldAddTarget && !TokenRef.startswith(TargetOPT) &&
+  !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode = ShouldAddMode && !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }


Index: clang/lib/Tooling/Tooling.cpp
===
--- clang/lib/Tooling/Tooling.cpp
+++ clang/lib/Tooling/Tooling.cpp
@@ -258,22 +258,23 @@
   // --driver-mode=X
   const std::string DriverModeOPT =
   Table.getOption(driver::options::OPT_driver_mode).getPrefixedName();
-  bool AlreadyHasTarget = false;
-  bool AlreadyHasMode = false;
+  auto TargetMode =
+  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
+  // No need to search for target args if we don't have a target/mode to insert.
+  bool ShouldAddTarget = TargetMode.TargetIsValid;
+  bool ShouldAddMode = TargetMode.DriverMode != nullptr;
   // Skip CommandLine[0].
   for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
 StringRef TokenRef(*Token);
-AlreadyHasTarget |=
-TokenRef.startswith(TargetOPT) || TokenRef.equals(TargetOPTLegacy);
-AlreadyHasMode |= TokenRef.startswith(DriverModeOPT);
+ShouldAddTarget = ShouldAddTarget && !TokenRef.startswith(TargetOPT) &&
+  !TokenRef.equals(TargetOPTLegacy);
+ShouldAddMode = ShouldAddMode && !TokenRef.startswith(DriverModeOPT);
   }
-  auto TargetMode =
-  driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs);
-  if (!AlreadyHasMode && TargetMode.DriverMode) {
+  if (ShouldAddMode) {
 CommandLine.insert(++CommandLine.begin(), TargetMode.DriverMode);
   }
-  if (!AlreadyHasTarget && TargetMode.TargetIsValid) {
+  if (ShouldAddTarget) {
 CommandLine.insert(++CommandLine.begin(),
TargetOPT + TargetMode.TargetPrefix);
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D85028: [clangd] Support new/delete operator in TargetFinder.

2020-08-03 Thread Haojian Wu 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 rG5191f70ab1f4: [clangd] Support new/deleta operator in 
TargetFinder. (authored by hokein).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85028

Files:
  clang-tools-extra/clangd/FindTarget.cpp
  clang-tools-extra/clangd/XRefs.cpp
  clang-tools-extra/clangd/unittests/FindTargetTests.cpp


Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp
===
--- clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -535,6 +535,7 @@
   // FIXME: Auto-completion in a template requires disabling delayed template
   // parsing.
   Flags = {"-fno-delayed-template-parsing"};
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
 
   Code = R"cpp(
 void func(int*);
@@ -559,6 +560,36 @@
 };
   )cpp";
   EXPECT_DECLS("UnresolvedMemberExpr", "void func(int *)", "void func(char 
*)");
+
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long);
+};
+auto* k = [[new]] X();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "static void *operator new(unsigned long)");
+  Code = R"cpp(
+void *operator new(unsigned long);
+auto* k = [[new]] int();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "void *operator new(unsigned long)");
+
+  Code = R"cpp(
+struct X {
+  static void operator delete(void *) noexcept;
+};
+void k(X* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "static void operator delete(void *) 
noexcept");
+  Code = R"cpp(
+void operator delete(void *) noexcept;
+void k(int* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "void operator delete(void *) noexcept");
 }
 
 TEST_F(TargetDeclTest, DependentExprs) {
Index: clang-tools-extra/clangd/XRefs.cpp
===
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -238,6 +238,10 @@
   llvm::DenseMap ResultIndex;
 
   auto AddResultDecl = [&](const NamedDecl *D) {
+// FIXME: Canonical declarations of some symbols might refer to built-in
+// decls with possibly-invalid source locations (e.g. global new operator).
+// In such cases we should pick up a redecl with valid source location
+// instead of failing.
 D = llvm::cast(D->getCanonicalDecl());
 auto Loc =
 makeLocation(AST.getASTContext(), nameLocation(*D, SM), MainFilePath);
Index: clang-tools-extra/clangd/FindTarget.cpp
===
--- clang-tools-extra/clangd/FindTarget.cpp
+++ clang-tools-extra/clangd/FindTarget.cpp
@@ -460,6 +460,12 @@
   void VisitPseudoObjectExpr(const PseudoObjectExpr *POE) {
 Outer.add(POE->getSyntacticForm(), Flags);
   }
+  void VisitCXXNewExpr(const CXXNewExpr *CNE) {
+Outer.add(CNE->getOperatorNew(), Flags);
+  }
+  void VisitCXXDeleteExpr(const CXXDeleteExpr *CDE) {
+Outer.add(CDE->getOperatorDelete(), Flags);
+  }
 };
 Visitor(*this, Flags).Visit(S);
   }


Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp
===
--- clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -535,6 +535,7 @@
   // FIXME: Auto-completion in a template requires disabling delayed template
   // parsing.
   Flags = {"-fno-delayed-template-parsing"};
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
 
   Code = R"cpp(
 void func(int*);
@@ -559,6 +560,36 @@
 };
   )cpp";
   EXPECT_DECLS("UnresolvedMemberExpr", "void func(int *)", "void func(char *)");
+
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long);
+};
+auto* k = [[new]] X();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "static void *operator new(unsigned long)");
+  Code = R"cpp(
+void *operator new(unsigned long);
+auto* k = [[new]] int();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "void *operator new(unsigned long)");
+
+  Code = R"cpp(
+struct X {
+  static void operator delete(void *) noexcept;
+};
+void k(X* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "static void operator delete(void *) noexcept");
+  Code = R"cpp(
+void operator delete(void *) noexcept;
+void k(int* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "void operator delete(void *) noexcept");
 }
 
 TEST_F(TargetDeclTest, DependentExprs) {
Index: clang-tools-extra/clangd/XRefs.cpp
===
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -238,6 

[clang-tools-extra] 5191f70 - [clangd] Support new/deleta operator in TargetFinder.

2020-08-03 Thread Haojian Wu via cfe-commits

Author: Haojian Wu
Date: 2020-08-03T14:10:21+02:00
New Revision: 5191f70ab1f4b0b9225b2e9e11584e199172418c

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

LOG: [clangd] Support new/deleta operator in TargetFinder.

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

Added: 


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

Removed: 




diff  --git a/clang-tools-extra/clangd/FindTarget.cpp 
b/clang-tools-extra/clangd/FindTarget.cpp
index a346d6b662e9..e4d2dddb4b5d 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -460,6 +460,12 @@ struct TargetFinder {
   void VisitPseudoObjectExpr(const PseudoObjectExpr *POE) {
 Outer.add(POE->getSyntacticForm(), Flags);
   }
+  void VisitCXXNewExpr(const CXXNewExpr *CNE) {
+Outer.add(CNE->getOperatorNew(), Flags);
+  }
+  void VisitCXXDeleteExpr(const CXXDeleteExpr *CDE) {
+Outer.add(CDE->getOperatorDelete(), Flags);
+  }
 };
 Visitor(*this, Flags).Visit(S);
   }

diff  --git a/clang-tools-extra/clangd/XRefs.cpp 
b/clang-tools-extra/clangd/XRefs.cpp
index 1fc89f3e0847..26653aa409d7 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -238,6 +238,10 @@ locateASTReferent(SourceLocation CurLoc, const 
syntax::Token *TouchedIdentifier,
   llvm::DenseMap ResultIndex;
 
   auto AddResultDecl = [&](const NamedDecl *D) {
+// FIXME: Canonical declarations of some symbols might refer to built-in
+// decls with possibly-invalid source locations (e.g. global new operator).
+// In such cases we should pick up a redecl with valid source location
+// instead of failing.
 D = llvm::cast(D->getCanonicalDecl());
 auto Loc =
 makeLocation(AST.getASTContext(), nameLocation(*D, SM), MainFilePath);

diff  --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp 
b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index 92095e871e20..8b872d6314d4 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -535,6 +535,7 @@ TEST_F(TargetDeclTest, OverloadExpr) {
   // FIXME: Auto-completion in a template requires disabling delayed template
   // parsing.
   Flags = {"-fno-delayed-template-parsing"};
+  Flags.push_back("--target=x86_64-pc-linux-gnu");
 
   Code = R"cpp(
 void func(int*);
@@ -559,6 +560,36 @@ TEST_F(TargetDeclTest, OverloadExpr) {
 };
   )cpp";
   EXPECT_DECLS("UnresolvedMemberExpr", "void func(int *)", "void func(char 
*)");
+
+  Code = R"cpp(
+struct X {
+  static void *operator new(unsigned long);
+};
+auto* k = [[new]] X();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "static void *operator new(unsigned long)");
+  Code = R"cpp(
+void *operator new(unsigned long);
+auto* k = [[new]] int();
+  )cpp";
+  EXPECT_DECLS("CXXNewExpr", "void *operator new(unsigned long)");
+
+  Code = R"cpp(
+struct X {
+  static void operator delete(void *) noexcept;
+};
+void k(X* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "static void operator delete(void *) 
noexcept");
+  Code = R"cpp(
+void operator delete(void *) noexcept;
+void k(int* x) {
+  [[delete]] x;
+}
+  )cpp";
+  EXPECT_DECLS("CXXDeleteExpr", "void operator delete(void *) noexcept");
 }
 
 TEST_F(TargetDeclTest, DependentExprs) {



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


[PATCH] D83717: [clang-tidy] Add check fo SEI CERT item ENV32-C

2020-08-03 Thread Nathan James via Phabricator via cfe-commits
njames93 added inline comments.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:33
+bool isExitFunction(StringRef FnName) {
+  return FnName == "_Exit" || FnName == "exit" || FnName == "quick_exit";
+}

whisperity wrote:
> aaron.ballman wrote:
> > Because this rule applies in C++ as well as C, you should protect these 
> > names so that calling something like this doesn't trigger the check:
> > ```
> > namespace menu_items {
> > void exit(int);
> > }
> > ```
> > I think we want `::_Exit` and `::std::_Exit` to check the fully qualified 
> > names (I believe this will still work in C, but should be tested). The same 
> > goes for the other names (including `atexit` and `at_quick_exit` above).
> > I think we want `::_Exit` and `::std::_Exit` to check the fully qualified 
> > names (I believe this will still work in C, but should be tested).
> 
> Tested with Clang-Query:
> 
> ```
> clang-query> m functionDecl(hasName("::atexit"))
> 
> Match #1:
> 
> /home/whisperity/LLVM/Build/foo.c:1:1: note: "root" binds here
> int atexit(int) {}
> ^~
> 1 match.
> ```
That only works because the logic inside the `hasName`matcher 



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:32
 /// 'quick_exit'
 bool isExitFunction(StringRef FnName) {
   return FnName == "_Exit" || FnName == "exit" || FnName == "quick_exit";

This should take a pointer to the function to run other checks, like checking 
its decl context. 



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:37
 /// Only 'longjmp' is considered.
 bool isJumpFunction(StringRef FnName) { return FnName == "longjmp"; }
 

Ditto


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83717

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


[PATCH] D83325: [Sema] Be more thorough when unpacking the AS-qualified pointee for a pointer conversion.

2020-08-03 Thread Bevin Hansson via Phabricator via cfe-commits
ebevhan added a comment.

In D83325#2170813 , @rjmccall wrote:

> `removeAddrSpaceQualType` should guarantee that it removes the address space 
> qualifier; you shouldn't need to do something special here.  That means it 
> needs to iteratively desugar and collect qualifiers as long as the type is 
> still address-space-qualified.

Well, from what I observed, it is not doing that, so perhaps that's what needs 
to be addressed. That's a bit more involved, though.

We will still end up stripping all sugar up until we hit the AS-qualification, 
though. Unless we are supposed to reconstitute the sugared type with the AS 
altered somehow?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83325

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


[PATCH] D84599: [clang-index] Use NamedDecl::getDeclName() instead of NamedDecl::printName in USRGenerator::EmitDeclName

2020-08-03 Thread Kadir Cetinkaya via Phabricator via cfe-commits
kadircet added a comment.

I can see how this can cause problems with current implementation, but I don't 
think the proposed solution in here is also solving these problems.

For example, `MSGuidDecl`'s DeclName is actually empty (it is the printName 
overload that makes it meaningful). Hence when generating the USR
for two guid decls coming from similar contexts (there are other factors like 
namespace etc.) the code might end up producing the same output for both.

Generating the same USR for two different symbols might mess up lots of 
functionality in clangd's (and possibly other tools') index. I am not aware of
all the signals going into the USR generation and what is the importance of 
Decl name itself, maybe there should be a `getUniqueName` which defaults to
getDeclName, and can be overloaded for cases like MSGuidDecl. But as mentioned 
I don't understand this code well enough to make any concrete
suggestions so I would wait for an input from other reviewers.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84599

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


[PATCH] D85026: [analyzer] Introduce minor refactoring of SVal::getSubKind function

2020-08-03 Thread Denys Petrov via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG21fa82d5c63c: [analyzer] Introduce minor refactoring of 
SVal::getSubKind function (authored by ASDenysPetrov).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85026

Files:
  clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h


Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
===
--- clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
+++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
@@ -80,7 +80,7 @@
 #define ABSTRACT_SVAL_WITH_KIND(Id, Parent) Id ## Kind,
 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
   };
-  enum { BaseBits = 2, BaseMask = 0x3 };
+  enum { BaseBits = 2, BaseMask = 0b11 };
 
 protected:
   const void *Data = nullptr;
@@ -116,7 +116,7 @@
 
   unsigned getRawKind() const { return Kind; }
   BaseKind getBaseKind() const { return (BaseKind) (Kind & BaseMask); }
-  unsigned getSubKind() const { return (Kind & ~BaseMask) >> BaseBits; }
+  unsigned getSubKind() const { return Kind >> BaseBits; }
 
   // This method is required for using SVal in a FoldingSetNode.  It
   // extracts a unique signature for this SVal object.


Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
===
--- clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
+++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
@@ -80,7 +80,7 @@
 #define ABSTRACT_SVAL_WITH_KIND(Id, Parent) Id ## Kind,
 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
   };
-  enum { BaseBits = 2, BaseMask = 0x3 };
+  enum { BaseBits = 2, BaseMask = 0b11 };
 
 protected:
   const void *Data = nullptr;
@@ -116,7 +116,7 @@
 
   unsigned getRawKind() const { return Kind; }
   BaseKind getBaseKind() const { return (BaseKind) (Kind & BaseMask); }
-  unsigned getSubKind() const { return (Kind & ~BaseMask) >> BaseBits; }
+  unsigned getSubKind() const { return Kind >> BaseBits; }
 
   // This method is required for using SVal in a FoldingSetNode.  It
   // extracts a unique signature for this SVal object.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 21fa82d - [analyzer] Introduce minor refactoring of SVal::getSubKind function

2020-08-03 Thread Denys Petrov via cfe-commits

Author: Denys Petrov
Date: 2020-08-03T15:05:08+03:00
New Revision: 21fa82d5c63c30c745d5181889329084ac6d2767

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

LOG: [analyzer] Introduce minor refactoring of SVal::getSubKind function

Summary: `BaseMask` occupies the lowest bits. Effect of applying the mask is 
neutralized by right shift operation, thus making it useless.

Fix: Remove a redundant bitwise operation.

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

Added: 


Modified: 
clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h

Removed: 




diff  --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h 
b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
index a640d815a5ce..a561ac67bf78 100644
--- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
+++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
@@ -80,7 +80,7 @@ class SVal {
 #define ABSTRACT_SVAL_WITH_KIND(Id, Parent) Id ## Kind,
 #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.def"
   };
-  enum { BaseBits = 2, BaseMask = 0x3 };
+  enum { BaseBits = 2, BaseMask = 0b11 };
 
 protected:
   const void *Data = nullptr;
@@ -116,7 +116,7 @@ class SVal {
 
   unsigned getRawKind() const { return Kind; }
   BaseKind getBaseKind() const { return (BaseKind) (Kind & BaseMask); }
-  unsigned getSubKind() const { return (Kind & ~BaseMask) >> BaseBits; }
+  unsigned getSubKind() const { return Kind >> BaseBits; }
 
   // This method is required for using SVal in a FoldingSetNode.  It
   // extracts a unique signature for this SVal object.



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


[PATCH] D83717: [clang-tidy] Add check fo SEI CERT item ENV32-C

2020-08-03 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added inline comments.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:33
+bool isExitFunction(StringRef FnName) {
+  return FnName == "_Exit" || FnName == "exit" || FnName == "quick_exit";
+}

Because this rule applies in C++ as well as C, you should protect these names 
so that calling something like this doesn't trigger the check:
```
namespace menu_items {
void exit(int);
}
```
I think we want `::_Exit` and `::std::_Exit` to check the fully qualified names 
(I believe this will still work in C, but should be tested). The same goes for 
the other names (including `atexit` and `at_quick_exit` above).



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:64
+/// argument.
+void ExitHandlerCheck::registerMatchers(MatchFinder *Finder) {
+  const auto IsRegisterFunction =

whisperity wrote:
> What happens if this test is run on C++ code calling the same functions? I 
> see the rule is only applicable to C, for some reason... Should it be 
> disabled from registering if by accident the check is enabled on a C++ source 
> file?
The CERT C++ rules inherit many of the C rules, including this one. It's listed 
towards the bottom of the set of inherited rules here: 
https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046336



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:70
+ .bind("handler_expr"));
+  Finder->addMatcher(
+  callExpr(IsRegisterFunction, HasHandlerAsFirstArg).bind("register_call"),

I am not at all certain whether this is plausible, but I *think* this check can 
be almost entirely implemented in the matchers rather than having to do manual 
work. I think you can bind the argument node from the call to `at_quick_exit()` 
and then use `equalsBoundNode()` to find the function calls within the bound 
`functionDecl()` node.

However, if that's not workable, I think you can get rid of the 
`CalledFunctionsCollector` entirely and just use matchers directly within the 
`check()` function because by that point, you'll know exactly which AST nodes 
you want to traverse through.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:112-113
+  diag(RegisterCall->getBeginLoc(),
+   "exit-handler potentially calls an exit function. Handlers should "
+   "terminate by returning");
+  diag(HandlerDecl->getBeginLoc(), "handler function declared here",

whisperity wrote:
> Same as below, suggestion: "exit hander potentially calls exit function 
> instead of terminating normally with a return".
> 
> ("exit handler" and "exit function" without - is more in line with the SEI 
> CERT rule's phrasing too, they don't say "exit-handler".)
Slight tweak to the suggestion: `exit hander potentially calls an exit function 
instead of terminating normally with a return`



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:124-125
+  diag(RegisterCall->getSourceRange().getBegin(),
+   "exit-handler potentially calls a jump function. Handlers should "
+   "terminate by returning");
+  diag(HandlerDecl->getBeginLoc(), "handler function declared here",

whisperity wrote:
> This semi-sentence structure of starting with lowercase but also terminating 
> the sentence and leaving in another but unterminated sentences looks really 
> odd.
> 
> Suggestion: "exit handler potentially jumps instead of terminating normally 
> with a return"
Slight tweak here as well. I don't think we'll ever see a jump function other 
than longjmp for this rule, so what about writing `potentially calls 'longjmp'` 
instead of `potentially jumps`?



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:128
+   DiagnosticIDs::Note);
+  diag(CurrentUsage->getBeginLoc(), "jump function called here",
+   DiagnosticIDs::Note);

If you make the suggested change above, I'd do a similar change here.



Comment at: clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp:1
+//===--- Env32CCheck.cpp - clang-tidy 
-===//
+//

steakhal wrote:
> Env32CCheck.cpp -> ExitHandlerCheck.cpp
This comment was marked done but appears to still be an issue.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83717

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


[PATCH] D83553: [PATCH 3/4][Sema][AArch64] Add codegen for arm_sve_vector_bits attribute

2020-08-03 Thread Cullen Rhodes via Phabricator via cfe-commits
c-rhodes abandoned this revision.
c-rhodes added a comment.

I've posted a prototype D85128  with an 
alternative implementation, given it's quite different to this patch I've 
posted it as a separate patch and am abandoning this one. See new patch for 
more details, cheers


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

https://reviews.llvm.org/D83553

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


[PATCH] D85074: [WebAssembly] Use "signed char" instead of "char" in SIMD intrinsics.

2020-08-03 Thread Dan Gohman via Phabricator via cfe-commits
sunfish updated this revision to Diff 282608.
sunfish added a comment.

- Update clang/test/CodeGen/builtins-wasm.c.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85074

Files:
  clang/include/clang/Basic/BuiltinsWebAssembly.def
  clang/lib/Headers/wasm_simd128.h
  clang/test/CodeGen/builtins-wasm.c

Index: clang/test/CodeGen/builtins-wasm.c
===
--- clang/test/CodeGen/builtins-wasm.c
+++ clang/test/CodeGen/builtins-wasm.c
@@ -3,7 +3,7 @@
 // RUN: not %clang_cc1 -triple wasm64-unknown-unknown -target-feature +nontrapping-fptoint -target-feature +exception-handling -target-feature +bulk-memory -target-feature +atomics -flax-vector-conversions=none -O3 -emit-llvm -o - %s 2>&1 | FileCheck %s -check-prefixes MISSING-SIMD
 
 // SIMD convenience types
-typedef char i8x16 __attribute((vector_size(16)));
+typedef signed char i8x16 __attribute((vector_size(16)));
 typedef short i16x8 __attribute((vector_size(16)));
 typedef int i32x4 __attribute((vector_size(16)));
 typedef long long i64x2 __attribute((vector_size(16)));
@@ -201,7 +201,7 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-int extract_lane_u_i8x16(i8x16 v) {
+int extract_lane_u_i8x16(u8x16 v) {
   return __builtin_wasm_extract_lane_u_i8x16(v, 13);
   // WEBASSEMBLY: extractelement <16 x i8> %v, i32 13
   // WEBASSEMBLY-NEXT: zext
@@ -215,7 +215,7 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-int extract_lane_u_i16x8(i16x8 v) {
+int extract_lane_u_i16x8(u16x8 v) {
   return __builtin_wasm_extract_lane_u_i16x8(v, 7);
   // WEBASSEMBLY: extractelement <8 x i16> %v, i32 7
   // WEBASSEMBLY-NEXT: zext
@@ -291,7 +291,7 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-i8x16 add_saturate_u_i8x16(i8x16 x, i8x16 y) {
+u8x16 add_saturate_u_i8x16(u8x16 x, u8x16 y) {
   return __builtin_wasm_add_saturate_u_i8x16(x, y);
   // WEBASSEMBLY: call <16 x i8> @llvm.uadd.sat.v16i8(
   // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y)
@@ -305,7 +305,7 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-i16x8 add_saturate_u_i16x8(i16x8 x, i16x8 y) {
+u16x8 add_saturate_u_i16x8(u16x8 x, u16x8 y) {
   return __builtin_wasm_add_saturate_u_i16x8(x, y);
   // WEBASSEMBLY: call <8 x i16> @llvm.uadd.sat.v8i16(
   // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y)
@@ -319,7 +319,7 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-i8x16 sub_saturate_u_i8x16(i8x16 x, i8x16 y) {
+u8x16 sub_saturate_u_i8x16(u8x16 x, u8x16 y) {
   return __builtin_wasm_sub_saturate_u_i8x16(x, y);
   // WEBASSEMBLY: call <16 x i8> @llvm.wasm.sub.saturate.unsigned.v16i8(
   // WEBASSEMBLY-SAME: <16 x i8> %x, <16 x i8> %y)
@@ -357,7 +357,7 @@
   // WEBASSEMBLY-NEXT: ret <16 x i8> %1
 }
 
-i8x16 min_u_i8x16(i8x16 x, i8x16 y) {
+u8x16 min_u_i8x16(u8x16 x, u8x16 y) {
   return __builtin_wasm_min_u_i8x16(x, y);
   // WEBASSEMBLY: %0 = icmp ult <16 x i8> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y
@@ -371,7 +371,7 @@
   // WEBASSEMBLY-NEXT: ret <16 x i8> %1
 }
 
-i8x16 max_u_i8x16(i8x16 x, i8x16 y) {
+u8x16 max_u_i8x16(u8x16 x, u8x16 y) {
   return __builtin_wasm_max_u_i8x16(x, y);
   // WEBASSEMBLY: %0 = icmp ugt <16 x i8> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <16 x i1> %0, <16 x i8> %x, <16 x i8> %y
@@ -385,7 +385,7 @@
   // WEBASSEMBLY-NEXT: ret <8 x i16> %1
 }
 
-i16x8 min_u_i16x8(i16x8 x, i16x8 y) {
+u16x8 min_u_i16x8(u16x8 x, u16x8 y) {
   return __builtin_wasm_min_u_i16x8(x, y);
   // WEBASSEMBLY: %0 = icmp ult <8 x i16> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y
@@ -399,7 +399,7 @@
   // WEBASSEMBLY-NEXT: ret <8 x i16> %1
 }
 
-i16x8 max_u_i16x8(i16x8 x, i16x8 y) {
+u16x8 max_u_i16x8(u16x8 x, u16x8 y) {
   return __builtin_wasm_max_u_i16x8(x, y);
   // WEBASSEMBLY: %0 = icmp ugt <8 x i16> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <8 x i1> %0, <8 x i16> %x, <8 x i16> %y
@@ -413,7 +413,7 @@
   // WEBASSEMBLY-NEXT: ret <4 x i32> %1
 }
 
-i32x4 min_u_i32x4(i32x4 x, i32x4 y) {
+u32x4 min_u_i32x4(u32x4 x, u32x4 y) {
   return __builtin_wasm_min_u_i32x4(x, y);
   // WEBASSEMBLY: %0 = icmp ult <4 x i32> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y
@@ -427,7 +427,7 @@
   // WEBASSEMBLY-NEXT: ret <4 x i32> %1
 }
 
-i32x4 max_u_i32x4(i32x4 x, i32x4 y) {
+u32x4 max_u_i32x4(u32x4 x, u32x4 y) {
   return __builtin_wasm_max_u_i32x4(x, y);
   // WEBASSEMBLY: %0 = icmp ugt <4 x i32> %x, %y
   // WEBASSEMBLY-NEXT: %1 = select <4 x i1> %0, <4 x i32> %x, <4 x i32> %y
@@ -441,21 +441,21 @@
   // WEBASSEMBLY-NEXT: ret
 }
 
-i16x8 sub_saturate_u_i16x8(i16x8 x, i16x8 y) {
+u16x8 sub_saturate_u_i16x8(u16x8 x, u16x8 y) {
   return __builtin_wasm_sub_saturate_u_i16x8(x, y);
   // WEBASSEMBLY: call <8 x i16> @llvm.wasm.sub.saturate.unsigned.v8i16(
   // WEBASSEMBLY-SAME: <8 x i16> %x, <8 x i16> %y)
   // WEBASSEMBLY-NEXT: ret
 }
 
-i8x16 avgr_u_i8x16(i8x16 x, i8x16 y) {
+u8x16 avgr_u_i8x16(u8x16 x, u8x16 y) {
   return 

[PATCH] D84511: Fix update_cc_test_checks.py --llvm-bin after D78478

2020-08-03 Thread Alexander Richardson via Phabricator via cfe-commits
arichardson updated this revision to Diff 282563.
arichardson added a comment.

remove tests and check for empty instead of none


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84511

Files:
  llvm/utils/UpdateTestChecks/common.py
  llvm/utils/update_cc_test_checks.py

Index: llvm/utils/update_cc_test_checks.py
===
--- llvm/utils/update_cc_test_checks.py
+++ llvm/utils/update_cc_test_checks.py
@@ -112,6 +112,20 @@
 return []
   return shlex.split(value)
 
+
+def infer_dependent_args(args):
+  if not args.clang:
+if not args.llvm_bin:
+  args.clang = 'clang'
+else:
+  args.clang = os.path.join(args.llvm_bin, 'clang')
+  if not args.opt:
+if not args.llvm_bin:
+  args.opt = 'opt'
+else:
+  args.opt = os.path.join(args.llvm_bin, 'opt')
+
+
 def config():
   parser = argparse.ArgumentParser(
   description=__doc__,
@@ -135,12 +149,8 @@
   help='Check "Function Attributes" for functions')
   parser.add_argument('tests', nargs='+')
   args = common.parse_commandline_args(parser)
+  infer_dependent_args(args)
 
-  if args.clang is None:
-if args.llvm_bin is None:
-  args.clang = 'clang'
-else:
-  args.clang = os.path.join(args.llvm_bin, 'clang')
   if not distutils.spawn.find_executable(args.clang):
 print('Please specify --llvm-bin or --clang', file=sys.stderr)
 sys.exit(1)
@@ -157,11 +167,6 @@
 common.warn('Could not determine clang builtins directory, some tests '
 'might not update correctly.')
 
-  if args.opt is None:
-if args.llvm_bin is None:
-  args.opt = 'opt'
-else:
-  args.opt = os.path.join(args.llvm_bin, 'opt')
   if not distutils.spawn.find_executable(args.opt):
 # Many uses of this tool will not need an opt binary, because it's only
 # needed for updating a test that runs clang | opt | FileCheck. So we
@@ -203,7 +208,7 @@
   script_name = os.path.basename(__file__)
 
   for ti in common.itertests(initial_args.tests, parser, 'utils/' + script_name,
- comment_prefix='//'):
+ comment_prefix='//', argparse_callback=infer_dependent_args):
 # Build a list of clang command lines and check prefixes from RUN lines.
 run_list = []
 line2spell_and_mangled_list = collections.defaultdict(list)
Index: llvm/utils/UpdateTestChecks/common.py
===
--- llvm/utils/UpdateTestChecks/common.py
+++ llvm/utils/UpdateTestChecks/common.py
@@ -44,8 +44,9 @@
 
 class TestInfo(object):
   def __init__(self, test, parser, script_name, input_lines, args, argv,
-   comment_prefix):
+   comment_prefix, argparse_callback):
 self.parser = parser
+self.argparse_callback = argparse_callback
 self.path = test
 self.args = args
 self.argv = argv
@@ -68,14 +69,14 @@
   if input_line.startswith(self.autogenerated_note_prefix):
 continue
   self.args, self.argv = check_for_command(input_line, self.parser,
-   self.args, self.argv)
+   self.args, self.argv, self.argparse_callback)
   if not self.args.enabled:
 output_lines.append(input_line)
 continue
   yield InputLineInfo(input_line, line_num, self.args, self.argv)
 
 
-def itertests(test_patterns, parser, script_name, comment_prefix=None):
+def itertests(test_patterns, parser, script_name, comment_prefix=None, argparse_callback=None):
   for pattern in test_patterns:
 # On Windows we must expand the patterns ourselves.
 tests_list = glob.glob(pattern)
@@ -86,19 +87,21 @@
   with open(test) as f:
 input_lines = [l.rstrip() for l in f]
   args = parser.parse_args()
+  if argparse_callback is not None:
+argparse_callback(args)
   argv = sys.argv[:]
   first_line = input_lines[0] if input_lines else ""
   if UTC_ADVERT in first_line:
 if script_name not in first_line and not args.force_update:
   warn("Skipping test which wasn't autogenerated by " + script_name, test)
   continue
-args, argv = check_for_command(first_line, parser, args, argv)
+args, argv = check_for_command(first_line, parser, args, argv, argparse_callback)
   elif args.update_only:
 assert UTC_ADVERT not in first_line
 warn("Skipping test which isn't autogenerated: " + test)
 continue
   yield TestInfo(test, parser, script_name, input_lines, args, argv,
- comment_prefix)
+ comment_prefix, argparse_callback)
 
 
 def should_add_line_to_output(input_line, prefix_set):
@@ -510,10 +513,12 @@
   return autogenerated_note_args
 
 
-def check_for_command(line, parser, args, argv):
+def 

[PATCH] D85115: [update_cc_test_checks.py] Add test for D84511

2020-08-03 Thread Alexander Richardson via Phabricator via cfe-commits
arichardson created this revision.
arichardson added a reviewer: MaskRay.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
arichardson requested review of this revision.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85115

Files:
  clang/test/utils/update_cc_test_checks/basic-cplusplus.test
  clang/test/utils/update_cc_test_checks/lit.local.cfg


Index: clang/test/utils/update_cc_test_checks/lit.local.cfg
===
--- clang/test/utils/update_cc_test_checks/lit.local.cfg
+++ clang/test/utils/update_cc_test_checks/lit.local.cfg
@@ -23,3 +23,5 @@
 ('%update_cc_test_checks', "%s %s %s" % (
 shell_quote(config.python_executable), shell_quote(script_path),
 extra_args)))
+config.substitutions.append(
+('%clang_tools_dir', shell_quote(config.clang_tools_dir)))
Index: clang/test/utils/update_cc_test_checks/basic-cplusplus.test
===
--- clang/test/utils/update_cc_test_checks/basic-cplusplus.test
+++ clang/test/utils/update_cc_test_checks/basic-cplusplus.test
@@ -2,6 +2,9 @@
 
 # RUN: cp %S/Inputs/basic-cplusplus.cpp %t.cpp && %update_cc_test_checks %t.cpp
 # RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp
+## Check that it also works with the --llvm-bin flag instead of --clang
+# RUN: cp %S/Inputs/basic-cplusplus.cpp %t.cpp && %update_cc_test_checks 
--clang='' --llvm-bin=%clang_tools_dir %t.cpp
+# RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp
 ## Check that re-running update_cc_test_checks doesn't change the output
 # RUN: %update_cc_test_checks %t.cpp
 # RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp


Index: clang/test/utils/update_cc_test_checks/lit.local.cfg
===
--- clang/test/utils/update_cc_test_checks/lit.local.cfg
+++ clang/test/utils/update_cc_test_checks/lit.local.cfg
@@ -23,3 +23,5 @@
 ('%update_cc_test_checks', "%s %s %s" % (
 shell_quote(config.python_executable), shell_quote(script_path),
 extra_args)))
+config.substitutions.append(
+('%clang_tools_dir', shell_quote(config.clang_tools_dir)))
Index: clang/test/utils/update_cc_test_checks/basic-cplusplus.test
===
--- clang/test/utils/update_cc_test_checks/basic-cplusplus.test
+++ clang/test/utils/update_cc_test_checks/basic-cplusplus.test
@@ -2,6 +2,9 @@
 
 # RUN: cp %S/Inputs/basic-cplusplus.cpp %t.cpp && %update_cc_test_checks %t.cpp
 # RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp
+## Check that it also works with the --llvm-bin flag instead of --clang
+# RUN: cp %S/Inputs/basic-cplusplus.cpp %t.cpp && %update_cc_test_checks --clang='' --llvm-bin=%clang_tools_dir %t.cpp
+# RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp
 ## Check that re-running update_cc_test_checks doesn't change the output
 # RUN: %update_cc_test_checks %t.cpp
 # RUN: diff -u %S/Inputs/basic-cplusplus.cpp.expected %t.cpp
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D83717: [clang-tidy] Add check fo SEI CERT item ENV32-C

2020-08-03 Thread Endre Fülöp via Phabricator via cfe-commits
gamesh411 updated this revision to Diff 282535.
gamesh411 added a comment.

rebase


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83717

Files:
  clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
  clang-tools-extra/clang-tidy/cert/CMakeLists.txt
  clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.cpp
  clang-tools-extra/clang-tidy/cert/ExitHandlerCheck.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/cert-env32-c.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/test/clang-tidy/checkers/cert-env32-c.c
  llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn

Index: llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
===
--- llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
+++ llvm/utils/gn/secondary/clang-tools-extra/clang-tidy/cert/BUILD.gn
@@ -19,6 +19,7 @@
 "CommandProcessorCheck.cpp",
 "DefaultOperatorNewAlignmentCheck.cpp",
 "DontModifyStdNamespaceCheck.cpp",
+"ExitHandlerCheck.cpp",
 "FloatLoopCounter.cpp",
 "LimitedRandomnessCheck.cpp",
 "MutatingCopyCheck.cpp",
Index: clang-tools-extra/test/clang-tidy/checkers/cert-env32-c.c
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/cert-env32-c.c
@@ -0,0 +1,324 @@
+// RUN: %check_clang_tidy %s cert-env32-c %t
+
+// --
+// EXIT FUNCTIONS
+// --
+
+// No handlers are invoked when _Exit is called.
+void _Exit(int __status);
+
+// Handlers registered by atexit are invoked in reverse order when exit is
+// called.
+void exit(int __status);
+
+// Handlers registered by at_quick_exit are invoked in reverse order when
+// quick_exit is called.
+void quick_exit(int __status);
+
+// 
+// HANDLER REGISTRATION
+// 
+
+// Register handlers to run when exit is called.
+int atexit(void (*__func)(void));
+
+// Register handlers to run when exit is called.
+int at_quick_exit(void (*__func)(void));
+
+// --
+// Setjmp/longjmp
+// --
+// C99 requires jmp_buf to be an array type.
+typedef int jmp_buf[1];
+int setjmp(jmp_buf);
+void longjmp(jmp_buf, int);
+
+// Compliant solutions
+
+void cleanup1() {
+  // do cleanup
+}
+
+void cleanup2() {
+  // do cleanup
+}
+
+void test_atexit_single_compliant() {
+  (void)atexit(cleanup1);
+}
+
+void test_atexit_multiple_compliant() {
+  (void)atexit(cleanup1);
+  (void)atexit(cleanup2);
+}
+
+void test_at_quick_exit_single_compliant() {
+  (void)at_quick_exit(cleanup1);
+}
+
+void test_at_quick_exit_multiple_compliant() {
+  (void)at_quick_exit(cleanup1);
+  (void)at_quick_exit(cleanup2);
+}
+
+// Non-compliant solutions calling _Exit
+
+void call__Exit() {
+  _Exit(0);
+}
+
+void call_call__Exit() {
+  call__Exit();
+}
+
+extern int unknown__Exit_flag;
+
+void call__Exit_conditionally() {
+  if (unknown__Exit_flag)
+call__Exit();
+}
+
+void call_call__Exit_conditionally() {
+  call__Exit_conditionally();
+}
+
+void test__Exit_called_directly() {
+  (void)atexit(call__Exit);
+  // CHECK-NOTES: :[[@LINE-1]]:9: warning: exit-handler potentially calls an exit function. Handlers should terminate by returning [cert-env32-c]
+  // CHECK-NOTES: :[[@LINE-22]]:1: note: handler function declared here
+  // CHECK-NOTES: :[[@LINE-22]]:3: note: exit function called here
+  (void)at_quick_exit(call__Exit);
+  // CHECK-NOTES: :[[@LINE-1]]:9: warning: exit-handler potentially calls an exit function. Handlers should terminate by returning [cert-env32-c]
+  // CHECK-NOTES: :[[@LINE-26]]:1: note: handler function declared here
+  // CHECK-NOTES: :[[@LINE-26]]:3: note: exit function called here
+};
+
+void test__Exit_called_indirectly() {
+  (void)atexit(call_call__Exit);
+  // CHECK-NOTES: :[[@LINE-1]]:9: warning: exit-handler potentially calls an exit function. Handlers should terminate by returning [cert-env32-c]
+  // CHECK-NOTES: :[[@LINE-29]]:1: note: handler function declared here
+  // CHECK-NOTES: :[[@LINE-33]]:3: note: exit function called here
+  (void)at_quick_exit(call_call__Exit);
+  // CHECK-NOTES: :[[@LINE-1]]:9: warning: exit-handler potentially calls an exit function. Handlers should terminate by returning [cert-env32-c]
+  // CHECK-NOTES: :[[@LINE-33]]:1: note: handler function declared here
+  // CHECK-NOTES: :[[@LINE-37]]:3: note: exit function called here
+};
+
+void test_conditional__Exit_called_directly() {
+  (void)atexit(call__Exit_conditionally);
+  // CHECK-NOTES: :[[@LINE-1]]:9: warning: exit-handler potentially calls an exit function. Handlers should terminate by returning [cert-env32-c]
+  // CHECK-NOTES: :[[@LINE-34]]:1: note: handler function declared here
+  // CHECK-NOTES: :[[@LINE-44]]:3: note: exit function called here
+  

[PATCH] D78902: [Driver] Add output file to properties of Command

2020-08-03 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff added a comment.

Ping.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D78902

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


[PATCH] D79719: [AIX] Implement AIX special alignment rule about double/long double

2020-08-03 Thread Bevin Hansson via Phabricator via cfe-commits
ebevhan added inline comments.



Comment at: clang/lib/AST/RecordLayoutBuilder.cpp:1778
-std::pair FieldInfo =
-  Context.getTypeInfoInChars(D->getType());
-EffectiveFieldSize = FieldSize = FieldInfo.first;

It seems that in factoring out this to setDeclInfo, it was changed from using 
getTypeInfoInChars to using getTypeInfo+toCharUnitsFromBits. This is causing 
some downstream issues for us with non-bytesize-multiple types.

Changing setDeclInfo to use the original function instead seems to work without 
issues. Would it be acceptable to change this?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79719

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


[PATCH] D84599: [clang-index] Use NamedDecl::getDeclName() instead of NamedDecl::printName in USRGenerator::EmitDeclName

2020-08-03 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added a comment.

(Disclaimer: I am not at all familiar with this code)

**A few notes in no particular order**:
Some entities with special names should presumably be mangled, but are 
currently not. Example:

  namespace special_names {
  struct S { operator int(); };
  int operator""_udl(const char *);
  template  struct ST {};
  template  ST(T) -> ST;
  }

results in:

  // CHECK: usrs.cpp c:@N@special_names Extent=[120:1 - 127:2]
  // CHECK: usrs.cpp c:@N@special_names@S@S Extent=[121:1 - 123:2]
  // CHECK: usrs.cpp c:@N@special_names@S@S@F@operator int# Extent=[122:3 - 
122:17]
  // CHECK: usrs.cpp c:@N@special_names@F@operator""_udl#*1C# Extent=[124:1 - 
124:33]
  // CHECK: usrs.cpp c:@N@special_names@ST>1#T@ST Extent=[125:1 - 125:35]
  // CHECK: usrs.cpp c:usrs.cpp@2114 Extent=[125:11 - 125:21]
  // CHECK: usrs.cpp c:@N@special_names@FT@>1#T#t0.0#$@N@special_names@S@ST>#I# Extent=[126:1 - 126:38]
  // CHECK: usrs.cpp c:usrs.cpp@2149 Extent=[126:10 - 126:20]

Some unnamed entities are already handled. In particular:

- Unnamed bit-fields are ignored (`VisitFieldDecl`). But note that the comment 
is wrong; the fields in a lambda class are unnamed. Should they be mangled?
- Anonymous namespaces are handled (`VisitNamespaceDecl`).
- The name of template parameters is not included in the mangling 
(`VisitTemplateParameterList`) so unnamed template parameters are already 
indirectly handled.
- For anonymous records, no USR is generated for the unnamed variable but an 
USR is generated for the anonymous record. However it can ambiguous in some 
cases:

  namespace anonymous_records {
  static union { int i0; };
  static union { int i1; };
  struct S { union { int j; }; };
  struct T { struct { int k; }; };
  }

results in:

  // CHECK: usrs.cpp c:@N@anonymous_records Extent=[136:1 - 141:2]
  // CHECK: usrs.cpp c:usrs.cpp@N@anonymous_records@Ua Extent=[137:8 - 137:25]
  // CHECK: usrs.cpp c:usrs.cpp@N@anonymous_records@Ua@FI@i0 Extent=[137:16 - 
137:22]
  // CHECK: usrs.cpp c:usrs.cpp@N@anonymous_records@Ua Extent=[138:8 - 138:25]
  // CHECK: usrs.cpp c:usrs.cpp@N@anonymous_records@Ua@FI@i1 Extent=[138:16 - 
138:22]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@S Extent=[139:1 - 139:31]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@S@Ua Extent=[139:12 - 139:28]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@S@Ua@FI@j Extent=[139:20 - 139:25]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@T Extent=[140:1 - 140:32]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@T@Sa Extent=[140:12 - 140:29]
  // CHECK: usrs.cpp c:@N@anonymous_records@S@T@Sa@FI@k Extent=[140:21 - 140:26]

- For unnamed enumerations, the name of the first enumerator is used.
- No USRs are currently generated for  `MSGuidDecl` and `DecompositionDecl` 
anyway since they are not visited:

  namespace decomposition_decl {
  struct S { int i = 0; };
  void Test() { auto [x] = S(); } 
  }

results in:

  // CHECK: usrs.cpp c:@N@decomposition_decl Extent=[150:1 - 155:2]
  // CHECK: usrs.cpp c:@N@decomposition_decl@S@S Extent=[151:1 - 151:24]
  // CHECK: usrs.cpp c:@N@decomposition_decl@S@S@FI@i Extent=[151:12 - 151:21]
  // CHECK: usrs.cpp c:@N@decomposition_decl@F@Test# Extent=[152:1 - 154:2]
  // CHECK: usrs.cpp c:usrs.cpp@2610@N@decomposition_decl@F@Test#@x 
Extent=[153:9 - 153:10]

**Conclusion**: I think that USR generation should not depend in general on the 
pretty-printed name of entities. Therefore something like the following should 
be done:

- Instead of using `NamedDecl::printName` in `EmitDeclName`, use 
`NamedDecl::getName` for simple names and handle separately each kind of 
special names.
- For unnamed entities for which an USR should be generated, implement the 
corresponding `Visit*`. The `Visit*` function should not depend on the 
pretty-printed name.

Thoughts?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84599

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


[PATCH] D79719: [AIX] Implement AIX special alignment rule about double/long double

2020-08-03 Thread Eli Friedman via Phabricator via cfe-commits
efriedma added inline comments.



Comment at: clang/lib/AST/RecordLayoutBuilder.cpp:1778
-std::pair FieldInfo =
-  Context.getTypeInfoInChars(D->getType());
-EffectiveFieldSize = FieldSize = FieldInfo.first;

ebevhan wrote:
> It seems that in factoring out this to setDeclInfo, it was changed from using 
> getTypeInfoInChars to using getTypeInfo+toCharUnitsFromBits. This is causing 
> some downstream issues for us with non-bytesize-multiple types.
> 
> Changing setDeclInfo to use the original function instead seems to work 
> without issues. Would it be acceptable to change this?
In general, we want to avoid representing type size/alignment in bits where it 
isn't necessary; refactoring along those lines is welcome.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79719

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


[PATCH] D82562: Implement AVX ABI Warning/error

2020-08-03 Thread dmajor via Phabricator via cfe-commits
dmajor added a comment.

@erichkeane, could you help me understand what is the action item of these 
warnings?

In Firefox we don't require AVX so our compilations generally don't enable the 
feature. (A very small number of files do come with AVX versions, mostly in 
imported media codecs, but they are reasonably well-isolated from other code.) 
It's not clear to me what the warning wants me to do. I can't enable AVX across 
the board, and I can't change all the code that uses large types as parameters. 
I feel like the only thing to do is silence the warning since there are enough 
instances that people will complain about log spam. Have I misunderstood the 
situation?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82562

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


[PATCH] D84820: [WebAssembly] Implement prototype v128.load{32,64}_zero instructions

2020-08-03 Thread Thomas Lively 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 rGcb327922101b: [WebAssembly] Implement prototype 
v128.load{32,64}_zero instructions (authored by tlively).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84820

Files:
  clang/include/clang/Basic/BuiltinsWebAssembly.def
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/builtins-wasm.c
  llvm/include/llvm/IR/IntrinsicsWebAssembly.td
  llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
  llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
  llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
  llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td
  llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
  llvm/test/MC/WebAssembly/simd-encodings.s

Index: llvm/test/MC/WebAssembly/simd-encodings.s
===
--- llvm/test/MC/WebAssembly/simd-encodings.s
+++ llvm/test/MC/WebAssembly/simd-encodings.s
@@ -463,9 +463,6 @@
 # CHECK: i32x4.sub # encoding: [0xfd,0xb1,0x01]
 i32x4.sub
 
-# CHECK: i32x4.dot_i16x8_s # encoding: [0xfd,0xb4,0x01]
-i32x4.dot_i16x8_s
-
 # CHECK: i32x4.mul # encoding: [0xfd,0xb5,0x01]
 i32x4.mul
 
@@ -481,6 +478,9 @@
 # CHECK: i32x4.max_u # encoding: [0xfd,0xb9,0x01]
 i32x4.max_u
 
+# CHECK: i32x4.dot_i16x8_s # encoding: [0xfd,0xba,0x01]
+i32x4.dot_i16x8_s
+
 # CHECK: i64x2.neg # encoding: [0xfd,0xc1,0x01]
 i64x2.neg
 
@@ -610,10 +610,16 @@
 # CHECK: f32x4.convert_i32x4_u # encoding: [0xfd,0xfb,0x01]
 f32x4.convert_i32x4_u
 
-# CHECK: f32x4.qfma # encoding: [0xfd,0xfc,0x01]
+# CHECK: v128.load32_zero 32 # encoding: [0xfd,0xfc,0x01,0x02,0x20]
+v128.load32_zero 32
+
+# CHECK: v128.load64_zero 32 # encoding: [0xfd,0xfd,0x01,0x03,0x20]
+v128.load64_zero 32
+
+# CHECK: f32x4.qfma # encoding: [0xfd,0xb4,0x01]
 f32x4.qfma
 
-# CHECK: f32x4.qfms # encoding: [0xfd,0xfd,0x01]
+# CHECK: f32x4.qfms # encoding: [0xfd,0xd4,0x01]
 f32x4.qfms
 
 # CHECK: f64x2.qfma # encoding: [0xfd,0xfe,0x01]
Index: llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
===
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll
@@ -0,0 +1,228 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
+
+; Test SIMD v128.load{32,64}_zero instructions
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+declare <4 x i32> @llvm.wasm.load32.zero(i32*)
+declare <2 x i64> @llvm.wasm.load64.zero(i64*)
+
+;===
+; v128.load32_zero
+;===
+
+define <4 x i32> @load_zero_i32_no_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_no_offset:
+; CHECK: .functype load_zero_i32_no_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 0
+; CHECK-NEXT:# fallthrough-return
+  %v = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %p)
+  ret <4 x i32> %v
+}
+
+define <4 x i32> @load_zero_i32_with_folded_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_folded_offset:
+; CHECK: .functype load_zero_i32_with_folded_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 24
+; CHECK-NEXT:# fallthrough-return
+  %q = ptrtoint i32* %p to i32
+  %r = add nuw i32 %q, 24
+  %s = inttoptr i32 %r to i32*
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> @load_zero_i32_with_folded_gep_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_folded_gep_offset:
+; CHECK: .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:v128.load32_zero 24
+; CHECK-NEXT:# fallthrough-return
+  %s = getelementptr inbounds i32, i32* %p, i32 6
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(i32* %p) {
+; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset:
+; CHECK: .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128)
+; CHECK-NEXT:  # %bb.0:
+; CHECK-NEXT:local.get 0
+; CHECK-NEXT:i32.const -24
+; CHECK-NEXT:i32.add
+; CHECK-NEXT:v128.load32_zero 0
+; CHECK-NEXT:# fallthrough-return
+  %s = getelementptr inbounds i32, i32* %p, i32 -6
+  %t = tail call <4 x i32> @llvm.wasm.load32.zero(i32* %s)
+  ret <4 x i32> %t
+}
+
+define <4 x i32> 

[clang] cb32792 - [WebAssembly] Implement prototype v128.load{32,64}_zero instructions

2020-08-03 Thread Thomas Lively via cfe-commits

Author: Thomas Lively
Date: 2020-08-03T13:54:00-07:00
New Revision: cb327922101b28ea70ec68d7f026da0e5e388eed

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

LOG: [WebAssembly] Implement prototype v128.load{32,64}_zero instructions

Specified in https://github.com/WebAssembly/simd/pull/237, these
instructions load the first vector lane from memory and zero the other
lanes. Since these instructions are not officially part of the SIMD
proposal, they are only available on an opt-in basis via LLVM
intrinsics and clang builtin functions. If these instructions are
merged to the proposal, this implementation will change so that the
instructions will be generated from normal IR. At that point the
intrinsics and builtin functions would be removed.

This PR also changes the opcodes for the experimental f32x4.qfm{a,s}
instructions because their opcodes conflicted with those of the
v128.load{32,64}_zero instructions. The new opcodes were chosen to
match those used in V8.

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

Added: 
llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll

Modified: 
clang/include/clang/Basic/BuiltinsWebAssembly.def
clang/lib/CodeGen/CGBuiltin.cpp
clang/test/CodeGen/builtins-wasm.c
llvm/include/llvm/IR/IntrinsicsWebAssembly.td
llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td
llvm/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td
llvm/test/MC/WebAssembly/simd-encodings.s

Removed: 




diff  --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def 
b/clang/include/clang/Basic/BuiltinsWebAssembly.def
index d0f40f991a4c..39f29740cf56 100644
--- a/clang/include/clang/Basic/BuiltinsWebAssembly.def
+++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def
@@ -169,5 +169,8 @@ TARGET_BUILTIN(__builtin_wasm_narrow_u_i8x16_i16x8, 
"V16cV8sV8s", "nc", "simd128
 TARGET_BUILTIN(__builtin_wasm_narrow_s_i16x8_i32x4, "V8sV4iV4i", "nc", 
"simd128")
 TARGET_BUILTIN(__builtin_wasm_narrow_u_i16x8_i32x4, "V8sV4iV4i", "nc", 
"simd128")
 
+TARGET_BUILTIN(__builtin_wasm_load32_zero, "V4ii*", "nU", "simd128")
+TARGET_BUILTIN(__builtin_wasm_load64_zero, "V2LLiLLi*", "nU", "simd128")
+
 #undef BUILTIN
 #undef TARGET_BUILTIN

diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 042b41a09f19..2ef164b8b65a 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -16497,6 +16497,16 @@ Value 
*CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
 CGM.getIntrinsic(IntNo, {ConvertType(E->getType()), Low->getType()});
 return Builder.CreateCall(Callee, {Low, High});
   }
+  case WebAssembly::BI__builtin_wasm_load32_zero: {
+Value *Ptr = EmitScalarExpr(E->getArg(0));
+Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_load32_zero);
+return Builder.CreateCall(Callee, {Ptr});
+  }
+  case WebAssembly::BI__builtin_wasm_load64_zero: {
+Value *Ptr = EmitScalarExpr(E->getArg(0));
+Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_load64_zero);
+return Builder.CreateCall(Callee, {Ptr});
+  }
   case WebAssembly::BI__builtin_wasm_shuffle_v8x16: {
 Value *Ops[18];
 size_t OpIdx = 0;

diff  --git a/clang/test/CodeGen/builtins-wasm.c 
b/clang/test/CodeGen/builtins-wasm.c
index 0f66fceef4cc..14e0d0ac65ed 100644
--- a/clang/test/CodeGen/builtins-wasm.c
+++ b/clang/test/CodeGen/builtins-wasm.c
@@ -737,6 +737,18 @@ i16x8 narrow_u_i16x8_i32x4(i32x4 low, i32x4 high) {
   // WEBASSEMBLY: ret
 }
 
+i32x4 load32_zero(int *p) {
+  return __builtin_wasm_load32_zero(p);
+  // WEBASSEMBLY: call <4 x i32> @llvm.wasm.load32.zero(i32* %p)
+  // WEBASSEMBLY: ret
+}
+
+i64x2 load64_zero(long long *p) {
+  return __builtin_wasm_load64_zero(p);
+  // WEBASSEMBLY: call <2 x i64> @llvm.wasm.load64.zero(i64* %p)
+  // WEBASSEMBLY: ret
+}
+
 i8x16 swizzle_v8x16(i8x16 x, i8x16 y) {
   return __builtin_wasm_swizzle_v8x16(x, y);
   // WEBASSEMBLY: call <16 x i8> @llvm.wasm.swizzle(<16 x i8> %x, <16 x i8> %y)

diff  --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td 
b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td
index 9cc9f9eb6f18..627a579ae506 100644
--- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td
+++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td
@@ -190,6 +190,20 @@ def int_wasm_nearest :
 [LLVMMatchType<0>],
 [IntrNoMem, IntrSpeculatable]>;
 
+// TODO: Replace these intrinsic with normal ISel patterns once the
+// load_zero instructions are merged to the proposal.
+def int_wasm_load32_zero :
+  Intrinsic<[llvm_v4i32_ty],
+[LLVMPointerType],
+[IntrReadMem, IntrArgMemOnly],
+ "", 

[PATCH] D85157: [Sema] Add casting check for integer to fixed point conversions

2020-08-03 Thread Bjorn Pettersson via Phabricator via cfe-commits
bjope added inline comments.



Comment at: clang/test/Sema/warn-bad-function-cast.c:49
+#ifdef FIXED_POINT
+  (void)(_Fract) if1(); // no warning
+#endif

bjope wrote:
> bjope wrote:
> > This should be added before the line saying `/* All following casts issue 
> > warning */`.
> Is the `(void)` needed/relevant here?
As questioned earlier, shouldn't we expect a warning for this scenario?

There is however a problem that we get the warning for _Fract to _Fract 
conversion. And it would be nice with a more complete set of tests involving 
both FixedPoint->FixedPoint, FixedPoint->Integer and Integer->FixedPoint casts.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85157

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


[PATCH] D85146: [SyntaxTree] Fix crash on pointer to member function

2020-08-03 Thread Dmitri Gribenko via Phabricator via cfe-commits
gribozavr2 accepted this revision.
gribozavr2 added inline comments.
This revision is now accepted and ready to land.



Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:4076-4077
+  R"cpp(
+struct X{
+  struct Y{};
+};

Please add spaces before `{`.



Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:4082
+// i.e. create a syntax node for the outer member pointer
+void (X::Y::**xyp)(const int*, char);
+)cpp",

Could you add separate tests for `X::Y::` and for `**`?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85146

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


[PATCH] D84782: [PGO] Include the mem ops into the function hash.

2020-08-03 Thread Hiroshi Yamauchi via Phabricator via cfe-commits
yamauchi added a comment.

In D84782#2191243 , @MaskRay wrote:

> @yamauchi Do we need cd890944ad344b1b8cac58332ab11c9eec6b61e9 
>  and 
> 3d6f53018f845e893ad34f64ff2851a2e5c3ba1d 
>  in 
> https://github.com/llvm/llvm-project/tree/release/11.x ?

I think it'd be good to have them, if possible, though it's a latent, 
non-recent bug.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84782

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


[PATCH] D85144: [clang] Improve Dumping of APValues

2020-08-03 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added inline comments.



Comment at: clang/lib/AST/APValue.cpp:539
 Out << '[' << Path[I].getAsArrayIndex() << ']';
-ElemTy = Ctx.getAsArrayType(ElemTy)->getElementType();
+ElemTy = cast(ElemTy.getCanonicalType())->getElementType();
   }

And also I don't think that this change is safe since 
`ASTContext::getAsArrayType` applies qualifiers from the array type to the 
element type.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85144

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


[PATCH] D85102: [clang] improve diagnostics for misaligned and large atomics

2020-08-03 Thread Thorsten via Phabricator via cfe-commits
tschuett added a comment.

I would appreciate it, if somebody could commit this patch on my behalf.
Thorsten Schuett
schu...@gmail.com

Thanks.


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

https://reviews.llvm.org/D85102

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


[PATCH] D84572: Allow .dSYM's to be directly placed in an alternate directory

2020-08-03 Thread Daniel Sanders via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG7209f83112db: Allow .dSYMs to be directly placed in an 
alternate directory (authored by dsanders).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84572

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/Driver.cpp
  clang/test/Driver/darwin-dsymutil.c


Index: clang/test/Driver/darwin-dsymutil.c
===
--- clang/test/Driver/darwin-dsymutil.c
+++ clang/test/Driver/darwin-dsymutil.c
@@ -26,10 +26,21 @@
 //
 // RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
 // RUN:   -o foo %s -g 2> %t
-// RUN: FileCheck -check-prefix=CHECK-OUTPUT-NAME < %t %s
+// RUN: FileCheck -Doutfile=foo -Ddsymfile=foo.dSYM \
+// RUN:  -check-prefix=CHECK-OUTPUT-NAME < %t %s
 //
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Linker", inputs: 
[{{.*}}], output: "foo"
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["foo"], output: "foo.dSYM"
+// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
+// RUN:   -o bar/foo %s -g 2> %t
+// RUN: FileCheck -Doutfile=bar/foo -Ddsymfile=bar/foo.dSYM \
+// RUN:   -check-prefix=CHECK-OUTPUT-NAME < %t %s
+//
+// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
+// RUN:   -o bar/foo -dsym-dir external %s -g 2> %t
+// RUN: FileCheck -Doutfile=bar/foo -Ddsymfile=external/foo.dSYM \
+// RUN:   -check-prefix=CHECK-OUTPUT-NAME < %t %s
+//
+// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Linker", inputs: 
[{{.*}}], output: "[[outfile]]"
+// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["[[outfile]]"], output: "[[dsymfile]]"
 
 // Check that we only use dsymutil when needed.
 //
@@ -38,12 +49,5 @@
 // RUN:   -o foo %t.o -g 2> %t
 // RUN: not grep "Dsymutil" %t
 
-// Check that we put the .dSYM in the right place.
-// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
-// RUN:   -o bar/foo %s -g 2> %t
-// RUN: FileCheck -check-prefix=CHECK-LOCATION < %t %s
-
-// CHECK-LOCATION: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["bar/foo"], output: "bar/foo.dSYM"
-
 // Check that we don't crash when translating arguments for dsymutil.
 // RUN: %clang -m32 -arch x86_64 -g %s -###
Index: clang/lib/Driver/Driver.cpp
===
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -4604,7 +4604,17 @@
   StringRef BaseName;
 
   // Dsymutil actions should use the full path.
-  if (isa(JA) || isa(JA))
+  if (isa(JA) && C.getArgs().hasArg(options::OPT_dsym_dir)) 
{
+SmallString<128> ExternalPath(
+C.getArgs().getLastArg(options::OPT_dsym_dir)->getValue());
+// We use posix style here because the tests (specifically
+// darwin-dsymutil.c) demonstrate that posix style paths are acceptable
+// even on Windows and if we don't then the similar test covering this
+// fails.
+llvm::sys::path::append(ExternalPath, llvm::sys::path::Style::posix,
+llvm::sys::path::filename(BasePath));
+BaseName = ExternalPath;
+  } else if (isa(JA) || isa(JA))
 BaseName = BasePath;
   else
 BaseName = llvm::sys::path::filename(BasePath);
Index: clang/include/clang/Driver/Options.td
===
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -677,6 +677,9 @@
   HelpText<"Filename to write DOT-formatted header dependencies to">;
 def module_dependency_dir : Separate<["-"], "module-dependency-dir">,
   Flags<[CC1Option]>, HelpText<"Directory to dump module dependencies to">;
+def dsym_dir : JoinedOrSeparate<["-"], "dsym-dir">,
+  Flags<[DriverOption, RenderAsInput]>,
+  HelpText<"Directory to output dSYM's (if any) to">, MetaVarName<"">;
 def dumpmachine : Flag<["-"], "dumpmachine">;
 def dumpspecs : Flag<["-"], "dumpspecs">, Flags<[Unsupported]>;
 def dumpversion : Flag<["-"], "dumpversion">;


Index: clang/test/Driver/darwin-dsymutil.c
===
--- clang/test/Driver/darwin-dsymutil.c
+++ clang/test/Driver/darwin-dsymutil.c
@@ -26,10 +26,21 @@
 //
 // RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
 // RUN:   -o foo %s -g 2> %t
-// RUN: FileCheck -check-prefix=CHECK-OUTPUT-NAME < %t %s
+// RUN: FileCheck -Doutfile=foo -Ddsymfile=foo.dSYM \
+// RUN:  -check-prefix=CHECK-OUTPUT-NAME < %t %s
 //
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Linker", inputs: [{{.*}}], output: "foo"
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: ["foo"], output: "foo.dSYM"
+// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
+// RUN:   -o bar/foo %s -g 2> %t
+// RUN: FileCheck 

[clang] 7209f83 - Allow .dSYM's to be directly placed in an alternate directory

2020-08-03 Thread Daniel Sanders via cfe-commits

Author: Daniel Sanders
Date: 2020-08-03T13:18:52-07:00
New Revision: 7209f83112db4dbe15d8328705f9d2aff0624fbd

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

LOG: Allow .dSYM's to be directly placed in an alternate directory

Once available in the relevant toolchains this will allow us to implement
LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR after D84127 by directly placing the dSYM
in the desired location instead of emitting next to the output file and moving
it.

Reviewed By: JDevlieghere

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

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/lib/Driver/Driver.cpp
clang/test/Driver/darwin-dsymutil.c

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 16051934c1e0..fcb5c030755e 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -677,6 +677,9 @@ def dependency_dot : Separate<["-"], "dependency-dot">, 
Flags<[CC1Option]>,
   HelpText<"Filename to write DOT-formatted header dependencies to">;
 def module_dependency_dir : Separate<["-"], "module-dependency-dir">,
   Flags<[CC1Option]>, HelpText<"Directory to dump module dependencies to">;
+def dsym_dir : JoinedOrSeparate<["-"], "dsym-dir">,
+  Flags<[DriverOption, RenderAsInput]>,
+  HelpText<"Directory to output dSYM's (if any) to">, MetaVarName<"">;
 def dumpmachine : Flag<["-"], "dumpmachine">;
 def dumpspecs : Flag<["-"], "dumpspecs">, Flags<[Unsupported]>;
 def dumpversion : Flag<["-"], "dumpversion">;

diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 317098e24823..35263fbe1b2d 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4604,7 +4604,17 @@ const char *Driver::GetNamedOutputPath(Compilation , 
const JobAction ,
   StringRef BaseName;
 
   // Dsymutil actions should use the full path.
-  if (isa(JA) || isa(JA))
+  if (isa(JA) && C.getArgs().hasArg(options::OPT_dsym_dir)) 
{
+SmallString<128> ExternalPath(
+C.getArgs().getLastArg(options::OPT_dsym_dir)->getValue());
+// We use posix style here because the tests (specifically
+// darwin-dsymutil.c) demonstrate that posix style paths are acceptable
+// even on Windows and if we don't then the similar test covering this
+// fails.
+llvm::sys::path::append(ExternalPath, llvm::sys::path::Style::posix,
+llvm::sys::path::filename(BasePath));
+BaseName = ExternalPath;
+  } else if (isa(JA) || isa(JA))
 BaseName = BasePath;
   else
 BaseName = llvm::sys::path::filename(BasePath);

diff  --git a/clang/test/Driver/darwin-dsymutil.c 
b/clang/test/Driver/darwin-dsymutil.c
index 09451a81b797..8cdb2f3cbf64 100644
--- a/clang/test/Driver/darwin-dsymutil.c
+++ b/clang/test/Driver/darwin-dsymutil.c
@@ -26,10 +26,21 @@
 //
 // RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
 // RUN:   -o foo %s -g 2> %t
-// RUN: FileCheck -check-prefix=CHECK-OUTPUT-NAME < %t %s
+// RUN: FileCheck -Doutfile=foo -Ddsymfile=foo.dSYM \
+// RUN:  -check-prefix=CHECK-OUTPUT-NAME < %t %s
 //
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Linker", inputs: 
[{{.*}}], output: "foo"
-// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["foo"], output: "foo.dSYM"
+// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
+// RUN:   -o bar/foo %s -g 2> %t
+// RUN: FileCheck -Doutfile=bar/foo -Ddsymfile=bar/foo.dSYM \
+// RUN:   -check-prefix=CHECK-OUTPUT-NAME < %t %s
+//
+// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
+// RUN:   -o bar/foo -dsym-dir external %s -g 2> %t
+// RUN: FileCheck -Doutfile=bar/foo -Ddsymfile=external/foo.dSYM \
+// RUN:   -check-prefix=CHECK-OUTPUT-NAME < %t %s
+//
+// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Linker", inputs: 
[{{.*}}], output: "[[outfile]]"
+// CHECK-OUTPUT-NAME: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["[[outfile]]"], output: "[[dsymfile]]"
 
 // Check that we only use dsymutil when needed.
 //
@@ -38,12 +49,5 @@
 // RUN:   -o foo %t.o -g 2> %t
 // RUN: not grep "Dsymutil" %t
 
-// Check that we put the .dSYM in the right place.
-// RUN: %clang -target x86_64-apple-darwin10 -ccc-print-bindings \
-// RUN:   -o bar/foo %s -g 2> %t
-// RUN: FileCheck -check-prefix=CHECK-LOCATION < %t %s
-
-// CHECK-LOCATION: "x86_64-apple-darwin10" - "darwin::Dsymutil", inputs: 
["bar/foo"], output: "bar/foo.dSYM"
-
 // Check that we don't crash when translating arguments for dsymutil.
 // RUN: %clang -m32 -arch x86_64 -g %s -###



___
cfe-commits mailing list
cfe-commits@lists.llvm.org

[PATCH] D85146: [SyntaxTree] Fix crash on pointer to member function

2020-08-03 Thread Eduardo Caldas via Phabricator via cfe-commits
eduucaldas added a comment.

Additionally deleting TraverseParenTypeLoc changes nothing in the tests. I can 
also investigate that, I can try to come up with a test that makes this 
Traverse override relevant and if I'm not able, I would remove this override.




Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:4080-4081
+void (X::*xp)();
+// FIXME: Generate the right syntax tree for this type,
+// i.e. create a syntax node for the outer member pointer
+void (X::Y::**xyp)(const int*, char);

I spent 15 minutes investigating that, if you think I should go further I will.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85146

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


[PATCH] D75574: RFC: Implement objc_direct_protocol attribute to remove protocol metadata

2020-08-03 Thread Nathan Lanza via Phabricator via cfe-commits
lanza added a comment.

ping @rjmccall. Any update on a timeline for this review process? Thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D75574

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


[PATCH] D84844: [OpenMP] Ensure testing for versions 4.5 and default - Part 1

2020-08-03 Thread Johannes Doerfert via Phabricator via cfe-commits
jdoerfert added a comment.

I think this is good. Let's see if there are objections


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84844

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


[PATCH] D85144: [clang] Improve Dumping of APValues

2020-08-03 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added a comment.

Thanks for finishing this.

I don't see why you are adding `dumpPretty`; the point of the `dump` function I 
added is to dump the `APValue` as the tree-like structure it is. But your 
`dumpPretty` doesn't do that at all. Instead it is just an alias for 
`printPretty`. So `dump` does one thing and `dumpPretty` does another 
completely different thing.




Comment at: clang/include/clang/AST/PrettyPrinter.h:222
+  /// Whether null pointers should be printed as nullptr or as NULL.
+  unsigned UseNullptr : 1;
+

This seems to be unrelated. And anyway shouldn't this be inferred from the 
language mode?



Comment at: clang/lib/AST/APValue.cpp:429
 return;
   case APValue::LValue: {
 bool IsReference = Ty->isReferenceType();

What I would do here is continue to take a `const ASTContext &` here, but in 
the `LValue` case in `TextNodeDumper` just print `` if the 
context is null (which should only happens when debugging since the 
parameter-less version of `dump()` is not used in the code-base).

Trying to do without the context here can result in confusing output. I think 
it is better to just give-up and tell the user to please pass the `ASTContext` 
(which again, should only happens in a debugger).

Additionally since the context will always be present outside of debugging, the 
code-path without the context will not be tested.



Comment at: clang/lib/AST/APValue.cpp:629
+  QualType Ty) const {
+  ::InternalPrinter(Out, *this, Ty, , Ctx.getPrintingPolicy());
+}

What's up with this inconsistency? One time `OS` and the other time `Out`...



Comment at: clang/test/AST/ast-dump-APValue-MemPtr.cpp:4
+// RUN:-ast-dump %s -ast-dump-filter Test \
+// RUN: | FileCheck --strict-whitespace %s
+

Can you add a TODO to remember to add the serialization  part when the 
serialization of `APValue` is fixed?

Also can you match full lines? Here the test would still pass if you had written
`// CHECK-NEXT:  value: MemberPointer `.

You can use `utils/make-ast-dump-check.sh` + some manual editing to generate 
the test.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85144

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


RE: [PATCH] D84703: [clang codegen][AArch64] Use llvm.aarch64.neon.fcvtzs/u where it's necessary

2020-08-03 Thread Eli Friedman via cfe-commits
Committed dca23ed; should be fixed now.

-Eli

From: Azhar Mohammed 
Sent: Monday, August 3, 2020 11:01 AM
To: Eli Friedman ; Eli 
Friedman via Phabricator ; Eli Friedman 

Cc: sander.desma...@arm.com; sjoerd.mei...@arm.com; t.p.northo...@gmail.com; 
cameron.mcina...@nyu.edu; blitzrak...@gmail.com; ju...@samsung.com; Anna Welker 
via Phabricator via llvm-commits ; 
mlek...@skidmore.edu; kanh...@a-bix.com; Jonathan Coe via cfe-commits 
; shen...@google.com; kristof.be...@arm.com; 
daniel.k...@arm.com
Subject: [EXT] Re: [PATCH] D84703: [clang codegen][AArch64] Use 
llvm.aarch64.neon.fcvtzs/u where it's necessary

Hey Eli,

Looks like this is causing the test-suite build to fail. Can you please take a 
look.
Refer to 
http://green.lab.llvm.org/green/job/test-suite-verify-machineinstrs-aarch64-O3/8035/consoleFull.
FAILED: 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/test-suite-build/tools/timeit
 --summary 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o.time
 
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/compiler/bin/clang
 -DNDEBUG -B 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 -Wno-unused-command-line-argument -mllvm -verify-machineinstrs -O3 -arch arm64 
-isysroot 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.5.sdk
 -w -Werror=date-time -std=c99 -MD -MT 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
 -MF 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o.d
 -o 
SingleSource/UnitTests/Vector/AArch64/CMakeFiles/aarch64_neon_intrinsics.dir/aarch64_neon_intrinsics.c.o
 -c 
/Users/buildslave/jenkins/workspace/test-suite-verify-machineinstrs-aarch64-O3/test-suite/SingleSource/UnitTests/Vector/AArch64/aarch64_neon_intrinsics.c
fatal error: error in backend: Cannot select: intrinsic 
%llvm.aarch64.neon.fcvtzs

Thanks
Azhar


On Jul 30, 2020, at 3:42 PM, Eli Friedman via Phabricator via llvm-commits 
mailto:llvm-comm...@lists.llvm.org>> wrote:

This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG8dfb5d767e70: [clang codegen][AArch64] Use 
llvm.aarch64.neon.fcvtzs/u where its necessary (authored by efriedma).

Changed prior to commit:
 https://reviews.llvm.org/D84703?vs=281052=282069#toc

Repository:
 rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84703

Files:
 clang/lib/CodeGen/CGBuiltin.cpp
 clang/test/CodeGen/aarch64-neon-fcvt-intrinsics.c
 clang/test/CodeGen/aarch64-neon-intrinsics.c
 clang/test/CodeGen/aarch64-neon-misc.c
 clang/test/CodeGen/aarch64-v8.2a-fp16-intrinsics.c
 clang/test/CodeGen/aarch64-v8.2a-neon-intrinsics.c

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

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


[clang] 7cf4603 - Reland D61689 Change -gz and -Wa,--compress-debug-sections to use gABI compression (SHF_COMPRESSED) with integrated assembler

2020-08-03 Thread Fangrui Song via cfe-commits

Author: Fangrui Song
Date: 2020-08-03T15:12:01-07:00
New Revision: 7cf4603faee366a6e5860b6fdbedadd91872e231

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

LOG: Reland D61689 Change -gz and -Wa,--compress-debug-sections to use gABI 
compression (SHF_COMPRESSED) with integrated assembler

This fixes an inconsistency: clang -c -gz -fno-integrated-as means 
SHF_COMPRESSED
while clang -c -gz -fintegrated-as means zlib-gnu.

---

Since July 15, 2015 (binutils-gdb commit
19a7fe52ae3d0971e67a134bcb1648899e21ae1c, included in 2.26), gas
--compress-debug-sections=zlib (gcc -gz) means zlib-gabi:
SHF_COMPRESSED. Before that GCC/binutils used zlib-gnu (.zdebug).

clang's -gz was introduced in rC306115 (Jun 2017) to indicate zlib-gnu. It
is 2020 now and it is not unreasonable to assume users of the new
feature to have new linkers (ld.bfd/gold >= 2.26, lld >= rLLD273661).

Change clang's default accordingly to improve standard conformance.
zlib-gnu becomes out of fashion and gets poorer toolchain support.
Its mangled names confuse tools and are more likely to cause problems.

Reviewed By: compnerd

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

Added: 


Modified: 
clang/docs/ReleaseNotes.rst
clang/lib/Frontend/CompilerInvocation.cpp
clang/tools/driver/cc1as_main.cpp

Removed: 




diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 9274081c4d62..03eca8a26843 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -100,7 +100,10 @@ future versions of Clang.
 Modified Compiler Flags
 ---
 
-- ...
+- On ELF, ``-gz`` now defaults to ``-gz=zlib`` with the integrated assembler.
+  It produces ``SHF_COMPRESSED`` style compression of debug information. GNU
+  binutils 2.26 or newer, or lld is required to link produced object files. Use
+  ``-gz=zlib-gnu`` to get the old behavior.
 
 New Pragmas in Clang
 

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index 0b5f33541060..8e8bf9d9028e 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1155,8 +1155,7 @@ static bool ParseCodeGenArgs(CodeGenOptions , 
ArgList , InputKind IK,
   if (const Arg *A = Args.getLastArg(OPT_compress_debug_sections,
  OPT_compress_debug_sections_EQ)) {
 if (A->getOption().getID() == OPT_compress_debug_sections) {
-  // TODO: be more clever about the compression type auto-detection
-  Opts.setCompressDebugSections(llvm::DebugCompressionType::GNU);
+  Opts.setCompressDebugSections(llvm::DebugCompressionType::Z);
 } else {
   auto DCT = llvm::StringSwitch(A->getValue())
  .Case("none", llvm::DebugCompressionType::None)

diff  --git a/clang/tools/driver/cc1as_main.cpp 
b/clang/tools/driver/cc1as_main.cpp
index 77b99b201364..87047be3c2bc 100644
--- a/clang/tools/driver/cc1as_main.cpp
+++ b/clang/tools/driver/cc1as_main.cpp
@@ -224,8 +224,7 @@ bool 
AssemblerInvocation::CreateFromArgs(AssemblerInvocation ,
   if (const Arg *A = Args.getLastArg(OPT_compress_debug_sections,
  OPT_compress_debug_sections_EQ)) {
 if (A->getOption().getID() == OPT_compress_debug_sections) {
-  // TODO: be more clever about the compression type auto-detection
-  Opts.CompressDebugSections = llvm::DebugCompressionType::GNU;
+  Opts.CompressDebugSections = llvm::DebugCompressionType::Z;
 } else {
   Opts.CompressDebugSections =
   llvm::StringSwitch(A->getValue())



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


[PATCH] D85157: [Sema] Add casting check for integer to fixed point conversions

2020-08-03 Thread Bjorn Pettersson via Phabricator via cfe-commits
bjope added inline comments.



Comment at: clang/lib/Sema/SemaCast.cpp:2660
 return;
+  if (SrcType->isIntegerType() && DestType->isFixedPointType())
+return;

Is this really the intention with the patch?

It does match the "summary" above, but isn't the warning well deserved for 
int->fixed cast.

I also base that question on the you referred to this patch from our bugtracker 
at Ericsson, which was about conversions from `long __fixed` to `long __fixed`. 
So I kind of expected to find `(SrcType->isFixedPointType() && 
DestType->isFixedPointType())` here (similar to the checks above that avoids 
warning when SrcType equals the DestType).

The test case I expected (related to our downstream bug report) would look like 
this:

```
_Fract ff1(void);

void
foo(void)
{
  (_Fract)ff1();  // No warning expected.
}
```




Comment at: clang/test/Sema/warn-bad-function-cast.c:2
 // RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast 
-triple x86_64-unknown-unknown -verify
+// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast 
-DFIXED_POINT -ffixed-point -triple x86_64-unknown-unknown -verify
 // rdar://9103192

I doubt it is worth running the whole test twice just to test both with and 
without `-ffixed-point`, specially since there are no differences in the 
earlier tests when enabling `-ffixed-point`. So just adding `-ffixed-point` to 
the pre-existing RUN-line would save us from running this test case a humongous 
number of extra times during the next decade.



Comment at: clang/test/Sema/warn-bad-function-cast.c:49
+#ifdef FIXED_POINT
+  (void)(_Fract) if1(); // no warning
+#endif

This should be added before the line saying `/* All following casts issue 
warning */`.



Comment at: clang/test/Sema/warn-bad-function-cast.c:49
+#ifdef FIXED_POINT
+  (void)(_Fract) if1(); // no warning
+#endif

bjope wrote:
> This should be added before the line saying `/* All following casts issue 
> warning */`.
Is the `(void)` needed/relevant here?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85157

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


[PATCH] D85128: [Prototype][SVE] Support arm_sve_vector_bits attribute

2020-08-03 Thread Eli Friedman via Phabricator via cfe-commits
efriedma added a comment.

Not going to write detailed review comments, but this looks like the right 
approach in general.

One high-level thing to consider: we could still decide that in IR generation, 
we want to represent VLSTs registers using scalable vector types, like the 
original patch did.  This would allow avoiding the awkward "bitcast" 
implementation.  That interacts with a relatively narrow slice of clang 
CodeGen, though; we could easily change it later without impacting the rest of 
the changes.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D85128

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


[PATCH] D85157: [Sema] Add casting check for integer to fixed point conversions

2020-08-03 Thread Vince Bridgers via Phabricator via cfe-commits
vabridgers created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
vabridgers requested review of this revision.

This change squelches the warning for a cast from integer to fixed point
conversions.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85157

Files:
  clang/lib/Sema/SemaCast.cpp
  clang/test/Sema/warn-bad-function-cast.c


Index: clang/test/Sema/warn-bad-function-cast.c
===
--- clang/test/Sema/warn-bad-function-cast.c
+++ clang/test/Sema/warn-bad-function-cast.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast 
-triple x86_64-unknown-unknown -verify
+// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast 
-DFIXED_POINT -ffixed-point -triple x86_64-unknown-unknown -verify
 // rdar://9103192
 
 void vf(void);
@@ -43,5 +44,9 @@
   (int)bf(); /* expected-warning {{cast from function call of type '_Bool' to 
non-matching type 'int'}} */
   (__SIZE_TYPE__)pf1(); /* expected-warning {{cast from function call of type 
'char *' to non-matching type 'unsigned long'}} */
   (__PTRDIFF_TYPE__)pf2(); /* expected-warning {{cast from function call of 
type 'int *' to non-matching type 'long'}} */
+
+#ifdef FIXED_POINT
+  (void)(_Fract) if1(); // no warning
+#endif
 }
 
Index: clang/lib/Sema/SemaCast.cpp
===
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -2657,6 +2657,8 @@
 return;
   if (SrcType->isComplexIntegerType() && DestType->isComplexIntegerType())
 return;
+  if (SrcType->isIntegerType() && DestType->isFixedPointType())
+return;
 
   Self.Diag(SrcExpr.get()->getExprLoc(),
 diag::warn_bad_function_cast)


Index: clang/test/Sema/warn-bad-function-cast.c
===
--- clang/test/Sema/warn-bad-function-cast.c
+++ clang/test/Sema/warn-bad-function-cast.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast -triple x86_64-unknown-unknown -verify
+// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wbad-function-cast -DFIXED_POINT -ffixed-point -triple x86_64-unknown-unknown -verify
 // rdar://9103192
 
 void vf(void);
@@ -43,5 +44,9 @@
   (int)bf(); /* expected-warning {{cast from function call of type '_Bool' to non-matching type 'int'}} */
   (__SIZE_TYPE__)pf1(); /* expected-warning {{cast from function call of type 'char *' to non-matching type 'unsigned long'}} */
   (__PTRDIFF_TYPE__)pf2(); /* expected-warning {{cast from function call of type 'int *' to non-matching type 'long'}} */
+
+#ifdef FIXED_POINT
+  (void)(_Fract) if1(); // no warning
+#endif
 }
 
Index: clang/lib/Sema/SemaCast.cpp
===
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -2657,6 +2657,8 @@
 return;
   if (SrcType->isComplexIntegerType() && DestType->isComplexIntegerType())
 return;
+  if (SrcType->isIntegerType() && DestType->isFixedPointType())
+return;
 
   Self.Diag(SrcExpr.get()->getExprLoc(),
 diag::warn_bad_function_cast)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D84540: [CodeGen][ObjC] Mark calls to objc_unsafeClaimAutoreleasedReturnValue as notail on x86-64

2020-08-03 Thread Akira Hatanaka via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG41b1e97b12c1: [CodeGen][ObjC] Mark calls to 
objc_unsafeClaimAutoreleasedReturnValue as (authored by ahatanak).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D84540

Files:
  clang/lib/CodeGen/CGObjC.cpp
  clang/lib/CodeGen/TargetInfo.cpp
  clang/lib/CodeGen/TargetInfo.h
  clang/test/CodeGenObjC/arc-unsafeclaim.m

Index: clang/test/CodeGenObjC/arc-unsafeclaim.m
===
--- clang/test/CodeGenObjC/arc-unsafeclaim.m
+++ clang/test/CodeGenObjC/arc-unsafeclaim.m
@@ -1,16 +1,16 @@
 //   Make sure it works on x86-64.
-// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime=macosx-10.11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime=macosx-10.11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=NOTAIL-CALL
 
 //   Make sure it works on x86-32.
-// RUN: %clang_cc1 -triple i386-apple-darwin11 -fobjc-runtime=macosx-fragile-10.11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED
+// RUN: %clang_cc1 -triple i386-apple-darwin11 -fobjc-runtime=macosx-fragile-10.11 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED -check-prefix=CALL
 
 //   Make sure it works on ARM.
-// RUN: %clang_cc1 -triple arm64-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED
-// RUN: %clang_cc1 -triple arm64-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -O -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPTIMIZED
+// RUN: %clang_cc1 -triple arm64-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED -check-prefix=CALL
+// RUN: %clang_cc1 -triple arm64-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -O -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPTIMIZED -check-prefix=CALL
 
 //   Make sure it works on ARM64.
-// RUN: %clang_cc1 -triple armv7-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED
-// RUN: %clang_cc1 -triple armv7-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -O -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPTIMIZED
+// RUN: %clang_cc1 -triple armv7-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-UNOPTIMIZED -check-prefix=CHECK-MARKED -check-prefix=CALL
+// RUN: %clang_cc1 -triple armv7-apple-ios9 -fobjc-runtime=ios-9.0 -fobjc-arc -O -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-OPTIMIZED -check-prefix=CALL
 
 //   Make sure that it's implicitly disabled if the runtime version isn't high enough.
 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-10.10 -fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=DISABLED
@@ -29,7 +29,8 @@
 // CHECK:[[T0:%.*]] = call [[A:.*]]* @makeA()
 // CHECK-MARKED-NEXT:call void asm sideeffect
 // CHECK-NEXT:   [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8*
-// CHECK-NEXT:   [[T2:%.*]] = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
+// NOTAIL-CALL-NEXT: [[T2:%.*]] = notail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
+// CALL-NEXT:[[T2:%.*]] = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
 // CHECK-NEXT:   [[T3:%.*]] = bitcast i8* [[T2]] to [[A]]*
 // CHECK-NEXT:   [[T4:%.*]] = bitcast [[A]]* [[T3]] to i8*
 // CHECK-NEXT:   store i8* [[T4]], i8** [[X]]
@@ -53,7 +54,8 @@
 // CHECK:[[T0:%.*]] = call [[A]]* @makeA()
 // CHECK-MARKED-NEXT:call void asm sideeffect
 // CHECK-NEXT:   [[T1:%.*]] = bitcast [[A]]* [[T0]] to i8*
-// CHECK-NEXT:   [[T2:%.*]] = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
+// NOTAIL-CALL-NEXT: [[T2:%.*]] = notail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
+// CALL-NEXT:[[T2:%.*]] = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* [[T1]])
 // CHECK-NEXT:   [[T3:%.*]] = bitcast i8* [[T2]] to [[A]]*
 // CHECK-NEXT:   [[T4:%.*]] = bitcast [[A]]* [[T3]] to i8*
 // CHECK-NEXT:   store i8* [[T4]], i8** [[Y]]
@@ -126,7 +128,8 @@
 // CHECK:[[T0:%.*]] = call 

[clang] 41b1e97 - [CodeGen][ObjC] Mark calls to objc_unsafeClaimAutoreleasedReturnValue as

2020-08-03 Thread Akira Hatanaka via cfe-commits

Author: Akira Hatanaka
Date: 2020-08-03T13:25:25-07:00
New Revision: 41b1e97b12c1407e40d8e5081bf1f9cf183934b0

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

LOG: [CodeGen][ObjC] Mark calls to objc_unsafeClaimAutoreleasedReturnValue as
notail on x86-64

This is needed because the epilogue code inserted before tail calls on
x86-64 breaks the handshake between the caller and callee.

Calls to objc_retainAutoreleasedReturnValue used to have the same
problem, which was fixed in https://reviews.llvm.org/D59656.

rdar://problem/66029552

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

Added: 


Modified: 
clang/lib/CodeGen/CGObjC.cpp
clang/lib/CodeGen/TargetInfo.cpp
clang/lib/CodeGen/TargetInfo.h
clang/test/CodeGenObjC/arc-unsafeclaim.m

Removed: 




diff  --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index cd2b84f5dd20..26dfb6259a29 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -2250,8 +2250,7 @@ llvm::Value *
 CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {
   emitAutoreleasedReturnValueMarker(*this);
   llvm::CallInst::TailCallKind tailKind =
-  CGM.getTargetCodeGenInfo()
-  .shouldSuppressTailCallsOfRetainAutoreleasedReturnValue()
+  CGM.getTargetCodeGenInfo().markARCOptimizedReturnCallsAsNoTail()
   ? llvm::CallInst::TCK_NoTail
   : llvm::CallInst::TCK_None;
   return emitARCValueOperation(
@@ -2270,9 +2269,14 @@ 
CodeGenFunction::EmitARCRetainAutoreleasedReturnValue(llvm::Value *value) {
 llvm::Value *
 CodeGenFunction::EmitARCUnsafeClaimAutoreleasedReturnValue(llvm::Value *value) 
{
   emitAutoreleasedReturnValueMarker(*this);
-  return emitARCValueOperation(*this, value, nullptr,
-  CGM.getObjCEntrypoints().objc_unsafeClaimAutoreleasedReturnValue,
- llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue);
+  llvm::CallInst::TailCallKind tailKind =
+  CGM.getTargetCodeGenInfo().markARCOptimizedReturnCallsAsNoTail()
+  ? llvm::CallInst::TCK_NoTail
+  : llvm::CallInst::TCK_None;
+  return emitARCValueOperation(
+  *this, value, nullptr,
+  CGM.getObjCEntrypoints().objc_unsafeClaimAutoreleasedReturnValue,
+  llvm::Intrinsic::objc_unsafeClaimAutoreleasedReturnValue, tailKind);
 }
 
 /// Release the given object.

diff  --git a/clang/lib/CodeGen/TargetInfo.cpp 
b/clang/lib/CodeGen/TargetInfo.cpp
index 9cd63ebe29ee..f31d432eb317 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -2404,10 +2404,8 @@ class X86_64TargetCodeGenInfo : public TargetCodeGenInfo 
{
   }
 
   /// Disable tail call on x86-64. The epilogue code before the tail jump 
blocks
-  /// the autoreleaseRV/retainRV optimization.
-  bool shouldSuppressTailCallsOfRetainAutoreleasedReturnValue() const override 
{
-return true;
-  }
+  /// autoreleaseRV/retainRV and autoreleaseRV/unsafeClaimRV optimizations.
+  bool markARCOptimizedReturnCallsAsNoTail() const override { return true; }
 
   int getDwarfEHStackPointer(CodeGen::CodeGenModule ) const override {
 return 7;

diff  --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h
index 1152cabce4a0..0df9667e91e1 100644
--- a/clang/lib/CodeGen/TargetInfo.h
+++ b/clang/lib/CodeGen/TargetInfo.h
@@ -163,11 +163,9 @@ class TargetCodeGenInfo {
 return "";
   }
 
-  /// Determine whether a call to objc_retainAutoreleasedReturnValue should be
-  /// marked as 'notail'.
-  virtual bool shouldSuppressTailCallsOfRetainAutoreleasedReturnValue() const {
-return false;
-  }
+  /// Determine whether a call to objc_retainAutoreleasedReturnValue or
+  /// objc_unsafeClaimAutoreleasedReturnValue should be marked as 'notail'.
+  virtual bool markARCOptimizedReturnCallsAsNoTail() const { return false; }
 
   /// Return a constant used by UBSan as a signature to identify functions
   /// possessing type information, or 0 if the platform is unsupported.

diff  --git a/clang/test/CodeGenObjC/arc-unsafeclaim.m 
b/clang/test/CodeGenObjC/arc-unsafeclaim.m
index a8011e024180..40f1f164455a 100644
--- a/clang/test/CodeGenObjC/arc-unsafeclaim.m
+++ b/clang/test/CodeGenObjC/arc-unsafeclaim.m
@@ -1,16 +1,16 @@
 //   Make sure it works on x86-64.
-// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime=macosx-10.11 
-fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK 
-check-prefix=CHECK-UNOPTIMIZED
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime=macosx-10.11 
-fobjc-arc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK 
-check-prefix=CHECK-UNOPTIMIZED -check-prefix=NOTAIL-CALL
 
 //   Make sure it works on x86-32.
-// RUN: %clang_cc1 -triple i386-apple-darwin11 

[PATCH] D85146: [SyntaxTree] Fix crash on pointer to member function

2020-08-03 Thread Eduardo Caldas via Phabricator via cfe-commits
eduucaldas created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
eduucaldas requested review of this revision.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D85146

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

Index: clang/unittests/Tooling/Syntax/TreeTest.cpp
===
--- clang/unittests/Tooling/Syntax/TreeTest.cpp
+++ clang/unittests/Tooling/Syntax/TreeTest.cpp
@@ -4067,6 +4067,78 @@
 )txt"));
 }
 
+TEST_P(SyntaxTreeTest, MemberFunctionPointer) {
+  if (!GetParam().isCXX()) {
+return;
+  }
+  EXPECT_TRUE(treeDumpEqual(
+  R"cpp(
+struct X{
+  struct Y{};
+};
+void (X::*xp)();
+// FIXME: Generate the right syntax tree for this type,
+// i.e. create a syntax node for the outer member pointer
+void (X::Y::**xyp)(const int*, char);
+)cpp",
+  R"txt(
+*: TranslationUnit
+|-SimpleDeclaration
+| |-struct
+| |-X
+| |-{
+| |-SimpleDeclaration
+| | |-struct
+| | |-Y
+| | |-{
+| | |-}
+| | `-;
+| |-}
+| `-;
+|-SimpleDeclaration
+| |-void
+| |-SimpleDeclarator
+| | |-ParenDeclarator
+| | | |-(
+| | | |-MemberPointer
+| | | | |-X
+| | | | |-::
+| | | | `-*
+| | | |-xp
+| | | `-)
+| | `-ParametersAndQualifiers
+| |   |-(
+| |   `-)
+| `-;
+`-SimpleDeclaration
+  |-void
+  |-SimpleDeclarator
+  | |-ParenDeclarator
+  | | |-(
+  | | |-X
+  | | |-::
+  | | |-MemberPointer
+  | | | |-Y
+  | | | |-::
+  | | | `-*
+  | | |-*
+  | | |-xyp
+  | | `-)
+  | `-ParametersAndQualifiers
+  |   |-(
+  |   |-SimpleDeclaration
+  |   | |-const
+  |   | |-int
+  |   | `-SimpleDeclarator
+  |   |   `-*
+  |   |-,
+  |   |-SimpleDeclaration
+  |   | `-char
+  |   `-)
+  `-;
+)txt"));
+}
+
 TEST_P(SyntaxTreeTest, ComplexDeclarator) {
   EXPECT_TRUE(treeDumpEqual(
   R"cpp(
Index: clang/lib/Tooling/Syntax/BuildTree.cpp
===
--- clang/lib/Tooling/Syntax/BuildTree.cpp
+++ clang/lib/Tooling/Syntax/BuildTree.cpp
@@ -987,6 +987,16 @@
 return WalkUpFromFunctionTypeLoc(L);
   }
 
+  bool TraverseMemberPointerTypeLoc(MemberPointerTypeLoc L) {
+// In the source code "void (Y::*mp)()" `MemberPointerTypeLoc` corresponds
+// to "Y::*" but it points to a `ParenTypeLoc` that corresponds to
+// "(Y::*mp)" We thus reverse the order of traversal to get the proper
+// syntax structure.
+if (!WalkUpFromMemberPointerTypeLoc(L))
+  return false;
+return TraverseTypeLoc(L.getPointeeLoc());
+  }
+
   bool WalkUpFromMemberPointerTypeLoc(MemberPointerTypeLoc L) {
 auto SR = L.getLocalSourceRange();
 Builder.foldNode(Builder.getRange(SR),
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D83788: Removed unused variable in clang

2020-08-03 Thread David Blaikie via Phabricator via cfe-commits
dblaikie closed this revision.
dblaikie added a comment.

In D83788#2183684 , @hiraditya wrote:

> Not sure why this didnt get closed after the patch is merged in: 
> https://reviews.llvm.org/rG4fd91b0f946f49370a3ab33c480a807a3f48b247

The commit didn't contain the special line " Differential Revision: 
https://reviews.llvm.org/D; - it did link to the review, but without the 
special prefix, so Phab didn't pick it up and auto-close this review.


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

https://reviews.llvm.org/D83788

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


[PATCH] D82562: Implement AVX ABI Warning/error

2020-08-03 Thread Erich Keane via Phabricator via cfe-commits
erichkeane added a comment.

In D82562#2191512 , @dmajor wrote:

> @erichkeane, could you help me understand what is the action item of these 
> warnings?
>
> In Firefox we don't require AVX so our compilations generally don't enable 
> the feature. (A very small number of files do come with AVX versions, mostly 
> in imported media codecs, but they are reasonably well-isolated from other 
> code.) It's not clear to me what the warning wants me to do. I can't enable 
> AVX across the board, and I can't change all the code that uses large types 
> as parameters. I feel like the only thing to do is silence the warning since 
> there are enough instances that people will complain about log spam. Have I 
> misunderstood the situation?

With the warnings, yes, you can just disable them after you've made sure that 
you aren't compiling the functions with different settings. In the 'error' that 
this patch emits, it is that you have absolutely 'messed up'.

Basically:
If you try to call a function with a 256 bit type, and only 1 side uses 'avx' 
(either with 'target', multiversioning, or compiler flags), the ABI will not 
match.  THIS is a programming mistake.  If you're not making said programming 
mistake, suppressing the warning (with the suppression pragma) is your expected 
behavior.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82562

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


  1   2   >