[PATCH] D159138: [clang][Sema] Fix format size estimator's handling of %o, %x, %X with alternative form

2023-09-08 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/docs/ReleaseNotes.rst:125
 * ``-Woverriding-t-option`` is renamed to ``-Woverriding-option``.
 * ``-Winterrupt-service-routine`` is renamed to ``-Wexcessive-regsave`` as a 
generalization
 

??



Comment at: clang/docs/ReleaseNotes.rst:136
 - On X86, a function with ``__attribute__((interrupt))`` can now call a 
function without
   ``__attribute__((no_caller_saved_registers))`` provided that it is compiled 
with ``-mgeneral-regs-only``
 

looks like a leak from another patch ^^!


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

https://reviews.llvm.org/D159138

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


[PATCH] D156337: [clang] Allow setting the uninitialized attribute on record

2023-09-04 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D156337#4558410 , @aaron.ballman 
wrote:

> Was there an RFC for this extension to the attribute? (There doesn't need to 
> be one, I'm just wondering if there's more background info on what's driving 
> this patch forward and discussion around the design.)
>
> I'd like some more details about how this attribute impacts class 
> hierarchies. e.g., if you put the attribute on the base class, does it impact 
> the derived class members as well, or just the base class members? Also, what 
> should happen in a case like this:
>
>   template 
>   void func() {
> Ty Val; // Does this know it's uninitialized? Or did we lose that 
> information because this isn't a type attribute?
>   }
>   
>   struct __attribute__((uninitialized)) S { int  value; };
>   
>   int main() {
> func();
>   }

All very relevant topics. Concerning inheritance, I'd say that if the base 
class is marked as uninitialized and the child class is not, then base members 
are uninitialized and child members are not.

Concerning your example, I'd expect `Val` to be uninitialized as it's type has 
the according attribute, but I also don't quite understand "Or did we lose that 
information because this isn't a type attribute?"


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

https://reviews.llvm.org/D156337

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


[PATCH] D159138: [clang][Sema] Fix format size estimator's handling of %o, %x, %X with alternative form

2023-08-30 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:966
+// size. e.g.(("%#3x", 0xf) is "0xf")
+
+// If the result is zero, o, b, x, X adds nothing.

Then couldn't we increase the Size if the `FieldWidth` is unspecified?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D159138

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


[PATCH] D148381: [WIP][Clang] Add counted_by attribute

2023-08-29 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Jumping a bit late in the thread, apologize in advance if I missed something.

The GCC version of the attributes seems to be `element_count` (as found in the 
link https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 mentionned by @kees) I 
guess we could align (I personally prefer the GCC name, FWIW)

I may be wrong , but it seems to me that there is nothing specific to FAM 
there, and this would work as well for

  struct foo {
size_t num_elements;
 // ...
struct bar ** data __attribute__((counted_by(num_elements)));
  };
  
  struct foo make_foo(size_t num_elements) {
  struct foo f;
f.data = malloc(num_elements *
   sizeof(struct bar *));
  
f.num_elements = num_elements;
return f;
  }

Which makes us very close to:

  void stuff(int n, int *data __attribute__((counted_by(n {
  for(int i = 0; i < n; ++i)
other_stuff(data[i]);
  }

which is very close to VLA, right?




Comment at: clang/lib/AST/Expr.cpp:286
-
-  return false;
 }

I really like this cleanup!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148381

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


[PATCH] D158558: [clang] - Add missing builtin name to AtomicExpr JSON dump

2023-08-25 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D158558#4616275 , @efocht wrote:

> Can somebody please revert this patch? It kills all builds on 
> https://lab.llvm.org/buildbot/#/builders/91 since yesterday. 
> @serge-sans-paille ?

This got reverted by 
https://reviews.llvm.org/rGbfbea459af391266cf6a4611f0da4952930d7834 and I just 
pushed a fix


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D158558

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


[PATCH] D158558: [clang] - Add missing builtin name to AtomicExpr JSON dump

2023-08-24 Thread serge 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 rGdbccf3c6f13d: [clang] - Add missing builtin name to 
AtomicExpr JSON dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D158558

Files:
  clang/include/clang/AST/Expr.h
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-atomic-json.c

Index: clang/test/AST/ast-dump-atomic-json.c
===
--- /dev/null
+++ clang/test/AST/ast-dump-atomic-json.c
@@ -0,0 +1,128 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -ast-dump=json %s | FileCheck %s
+
+int foo(int * ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+}
+
+// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
+// using --filters=AtomicExpr
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "AtomicExpr",
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 132,
+// CHECK-NEXT:"col": 10,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 169,
+// CHECK-NEXT:"col": 47,
+// CHECK-NEXT:"tokLen": 1
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "valueCategory": "prvalue",
+// CHECK-NEXT:  "name": "__atomic_load_n",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "ImplicitCastExpr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 148,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 3
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 148,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 3
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"type": {
+// CHECK-NEXT: "qualType": "int *"
+// CHECK-NEXT:},
+// CHECK-NEXT:"valueCategory": "prvalue",
+// CHECK-NEXT:"castKind": "LValueToRValue",
+// CHECK-NEXT:"inner": [
+// CHECK-NEXT: {
+// CHECK-NEXT:  "id": "0x{{.*}}",
+// CHECK-NEXT:  "kind": "DeclRefExpr",
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 148,
+// CHECK-NEXT:"col": 26,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 148,
+// CHECK-NEXT:"col": 26,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int *"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "valueCategory": "lvalue",
+// CHECK-NEXT:  "referencedDecl": {
+// CHECK-NEXT:   "id": "0x{{.*}}",
+// CHECK-NEXT:   "kind": "ParmVarDecl",
+// CHECK-NEXT:   "name": "ptr",
+// CHECK-NEXT:   "type": {
+// CHECK-NEXT:"qualType": "int *"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+// CHECK-NEXT:]
+// CHECK-NEXT:   },
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "IntegerLiteral",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "spellingLoc": {
+// CHECK-NEXT:   "offset": 417,
+// CHECK-NEXT:   "file": "",
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "presumedLine": 12,
+// CHECK-NEXT:   "col": 26,
+// CHECK-NEXT:   "tokLen": 1
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "expansionLoc": {
+// CHECK-NEXT:   "offset": 153,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 31,
+// CHECK-NEXT:   "tokLen": 16
+// CHECK-NEXT:  }
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "spellingLoc": {
+// CHECK-NEXT:   "offset": 417,
+// CHECK-NEXT:   "file": "",
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "presumedLine": 12,
+// CHECK-NEXT:   "col": 26,
+// CHECK-NEXT:   "tokLen": 1
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "expansionLoc": {
+// CHECK-NEXT:   "offset": 153,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 31,
+// CHECK-NEXT:   "tokLen": 16
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"type": {
+// CHECK-NEXT: "qualType": "int"
+// CHECK-NEXT:},
+// CHECK-NEXT:"valueCategory": "prvalue",
+// CHECK-NEXT:"value": "5"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ 

[PATCH] D158558: [clang] - Add missing builtin name to AtomicExpr JSON dump

2023-08-24 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

I don't have a strong opinion on the synchronization with `TextNodeDumper`. I'm 
pretty sure I didn't update it while adding fields for the Attribute nodes 
though...


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D158558

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


[PATCH] D158558: [clang] - Add missing builtin name to AtomicExpr JSON dump

2023-08-22 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

As a side effect, introduce AtomicExpr::getOpAsString() to dump the
AtomicOp string representation.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D158558

Files:
  clang/include/clang/AST/Expr.h
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-atomic-json.c

Index: clang/test/AST/ast-dump-atomic-json.c
===
--- /dev/null
+++ clang/test/AST/ast-dump-atomic-json.c
@@ -0,0 +1,128 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -ast-dump=json %s | FileCheck %s
+
+int foo(int * ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
+}
+
+// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
+// using --filters=AtomicExpr
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "AtomicExpr",
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 132,
+// CHECK-NEXT:"col": 10,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 169,
+// CHECK-NEXT:"col": 47,
+// CHECK-NEXT:"tokLen": 1
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "valueCategory": "prvalue",
+// CHECK-NEXT:  "name": "__atomic_load_n",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "ImplicitCastExpr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 148,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 3
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 148,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 3
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"type": {
+// CHECK-NEXT: "qualType": "int *"
+// CHECK-NEXT:},
+// CHECK-NEXT:"valueCategory": "prvalue",
+// CHECK-NEXT:"castKind": "LValueToRValue",
+// CHECK-NEXT:"inner": [
+// CHECK-NEXT: {
+// CHECK-NEXT:  "id": "0x{{.*}}",
+// CHECK-NEXT:  "kind": "DeclRefExpr",
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 148,
+// CHECK-NEXT:"col": 26,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 148,
+// CHECK-NEXT:"col": 26,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int *"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "valueCategory": "lvalue",
+// CHECK-NEXT:  "referencedDecl": {
+// CHECK-NEXT:   "id": "0x{{.*}}",
+// CHECK-NEXT:   "kind": "ParmVarDecl",
+// CHECK-NEXT:   "name": "ptr",
+// CHECK-NEXT:   "type": {
+// CHECK-NEXT:"qualType": "int *"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+// CHECK-NEXT:]
+// CHECK-NEXT:   },
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "IntegerLiteral",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "spellingLoc": {
+// CHECK-NEXT:   "offset": 417,
+// CHECK-NEXT:   "file": "",
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "presumedLine": 12,
+// CHECK-NEXT:   "col": 26,
+// CHECK-NEXT:   "tokLen": 1
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "expansionLoc": {
+// CHECK-NEXT:   "offset": 153,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 31,
+// CHECK-NEXT:   "tokLen": 16
+// CHECK-NEXT:  }
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "spellingLoc": {
+// CHECK-NEXT:   "offset": 417,
+// CHECK-NEXT:   "file": "",
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "presumedLine": 12,
+// CHECK-NEXT:   "col": 26,
+// CHECK-NEXT:   "tokLen": 1
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "expansionLoc": {
+// CHECK-NEXT:   "offset": 153,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 31,
+// CHECK-NEXT:   "tokLen": 16
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"type": {
+// CHECK-NEXT: "qualType": "int"
+// CHECK-NEXT:},
+// CHECK-NEXT:"valueCategory": "prvalue",
+// CHECK-NEXT:"value": "5"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ 

[PATCH] D157814: [clang] Add missing field to TLSModelAttr json AST dump

2023-08-14 Thread serge 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 rG2105c32b32bf: [clang] Add missing field to TLSModelAttr json 
AST dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157814

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -19,6 +19,7 @@
 
 __attribute__ ((visibility ("hidden"))) int visibility_var;
 
+__thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
 
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
@@ -479,3 +480,51 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 724,
+// CHECK-NEXT:   "line": 22,
+// CHECK-NEXT:   "col": 57,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 668,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 8
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 724,
+// CHECK-NEXT:"col": 57,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "tls_model_var",
+// CHECK-NEXT:  "mangledName": "tls_model_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "tls": "static",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "TLSModelAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 693,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 9
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 716,
+// CHECK-NEXT:  "col": 49,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"tls_model": "local-exec"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -559,6 +559,10 @@
   VA->getVisibility()));
 }
 
+void JSONNodeDumper::VisitTLSModelAttr(const TLSModelAttr *TA) {
+  JOS.attribute("tls_model", TA->getModel());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -214,6 +214,7 @@
   void VisitUnavailableAttr(const UnavailableAttr *UA);
   void VisitSectionAttr(const SectionAttr *SA);
   void VisitVisibilityAttr(const VisibilityAttr *VA);
+  void VisitTLSModelAttr(const TLSModelAttr *TA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -19,6 +19,7 @@
 
 __attribute__ ((visibility ("hidden"))) int visibility_var;
 
+__thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
 
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
@@ -479,3 +480,51 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 724,
+// CHECK-NEXT:   "line": 22,
+// CHECK-NEXT:   "col": 57,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 668,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 8
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 724,
+// CHECK-NEXT:"col": 57,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "tls_model_var",
+// CHECK-NEXT:  "mangledName": "tls_model_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "tls": "static",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "TLSModelAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// 

[PATCH] D157808: [clang] Add missing field to VisibilityAttr json AST dump

2023-08-14 Thread serge 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 rG2107d87c5a91: [clang] Add missing field to VisibilityAttr 
json AST dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157808

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,9 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visibility_var;
+
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -429,3 +432,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 14
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 14
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visibility_var",
+// CHECK-NEXT:  "mangledName": "visibility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 623,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 643,
+// CHECK-NEXT:  "col": 37,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"visibility": "hidden"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -554,6 +554,11 @@
   JOS.attribute("section_name", SA->getName());
 }
 
+void JSONNodeDumper::VisitVisibilityAttr(const VisibilityAttr *VA) {
+  JOS.attribute("visibility", VisibilityAttr::ConvertVisibilityTypeToStr(
+  VA->getVisibility()));
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -213,6 +213,7 @@
   void VisitDeprecatedAttr(const DeprecatedAttr *DA);
   void VisitUnavailableAttr(const UnavailableAttr *UA);
   void VisitSectionAttr(const SectionAttr *SA);
+  void VisitVisibilityAttr(const VisibilityAttr *VA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,9 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visibility_var;
+
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -429,3 +432,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 14
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 14
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visibility_var",
+// CHECK-NEXT:  "mangledName": "visibility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: 

[PATCH] D157795: [clang] Add missing field to SectionAttr json AST dump

2023-08-14 Thread serge 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 rG4cf7666b8f09: [clang] Add missing field to SectionAttr json 
AST dump (authored by serge-sans-paille).

Changed prior to commit:
  https://reviews.llvm.org/D157795?vs=549646=550078#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157795

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -15,6 +15,8 @@
 __attribute__((unavailable)) int unavailable_var0;
 __attribute__((unavailable("reason"))) int unavailable_var1;
 
+__attribute__ ((section ("SECTION_NAME"))) int section_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -380,3 +382,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 593,
+// CHECK-NEXT:   "line": 18,
+// CHECK-NEXT:   "col": 48,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 546,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 593,
+// CHECK-NEXT:"col": 48,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "section_var",
+// CHECK-NEXT:  "mangledName": "section_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "SectionAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 562,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 7
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 585,
+// CHECK-NEXT:  "col": 40,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"section_name": "SECTION_NAME"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -550,6 +550,10 @@
 JOS.attribute("message", UA->getMessage());
 }
 
+void JSONNodeDumper::VisitSectionAttr(const SectionAttr *SA) {
+  JOS.attribute("section_name", SA->getName());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -212,6 +212,7 @@
   void VisitCleanupAttr(const CleanupAttr *CA);
   void VisitDeprecatedAttr(const DeprecatedAttr *DA);
   void VisitUnavailableAttr(const UnavailableAttr *UA);
+  void VisitSectionAttr(const SectionAttr *SA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -15,6 +15,8 @@
 __attribute__((unavailable)) int unavailable_var0;
 __attribute__((unavailable("reason"))) int unavailable_var1;
 
+__attribute__ ((section ("SECTION_NAME"))) int section_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -380,3 +382,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 593,
+// CHECK-NEXT:   "line": 18,
+// CHECK-NEXT:   "col": 48,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 546,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 593,
+// CHECK-NEXT:"col": 48,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "section_var",
+// CHECK-NEXT:  "mangledName": "section_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:

[PATCH] D157783: [clang] Add rmissing fields to DeprecatedAttr and UnavailableAttr json AST dump

2023-08-14 Thread serge 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 rG3dadc290b210: [clang] Add missing fields to DeprecatedAttr 
and Unavailable json AST dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157783

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -8,6 +8,13 @@
   __attribute__((cleanup(cleanup_function))) int var;
 }
 
+__attribute__((deprecated)) int deprecated_var0;
+__attribute__((deprecated("reason"))) int deprecated_var1;
+__attribute__((deprecated("reason", "replacement"))) int deprecated_var2;
+
+__attribute__((unavailable)) int unavailable_var0;
+__attribute__((unavailable("reason"))) int unavailable_var1;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -139,3 +146,237 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 282,
+// CHECK-NEXT:   "line": 11,
+// CHECK-NEXT:   "col": 33,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 250,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 282,
+// CHECK-NEXT:"col": 33,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var0",
+// CHECK-NEXT:  "mangledName": "deprecated_var0",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: }
+// CHECK-NEXT:}
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 341,
+// CHECK-NEXT:   "line": 12,
+// CHECK-NEXT:   "col": 43,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 299,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 341,
+// CHECK-NEXT:"col": 43,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var1",
+// CHECK-NEXT:  "mangledName": "deprecated_var1",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 314,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 333,
+// CHECK-NEXT:  "col": 35,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "reason"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 415,
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "col": 58,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 358,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 415,
+// CHECK-NEXT:"col": 58,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var2",
+// CHECK-NEXT:  "mangledName": "deprecated_var2",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 373,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// 

[PATCH] D157781: [clang] Add cleanup_function field to CleanupAttr json AST dump

2023-08-14 Thread serge 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 rG903e530bb898: [clang] Add cleanup_function field to 
CleanupAttr json AST dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157781

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -3,6 +3,11 @@
 int global_decl;
 extern __attribute__((alias("global_decl"))) int global_alias;
 
+void cleanup_function(int*);
+void some() {
+  __attribute__((cleanup(cleanup_function))) int var;
+}
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -78,7 +83,59 @@
 // CHECK-NEXT:  "tokLen": 1
 // CHECK-NEXT: }
 // CHECK-NEXT:},
-// CHECK-NEXT:"decl": "global_decl"
+// CHECK-NEXT:"aliasee": "global_decl"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 242,
+// CHECK-NEXT:   "col": 50,
+// CHECK-NEXT:   "tokLen": 3
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 195,
+// CHECK-NEXT:"col": 3,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 242,
+// CHECK-NEXT:"col": 50,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "CleanupAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 210,
+// CHECK-NEXT:  "col": 18,
+// CHECK-NEXT:  "tokLen": 7
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 234,
+// CHECK-NEXT:  "col": 42,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"cleanup_function": {
+// CHECK-NEXT: "id": "0x{{.*}}",
+// CHECK-NEXT: "kind": "FunctionDecl",
+// CHECK-NEXT: "name": "cleanup_function",
+// CHECK-NEXT: "type": {
+// CHECK-NEXT:  "qualType": "void (int *)"
+// CHECK-NEXT: }
+// CHECK-NEXT:}
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -534,6 +534,10 @@
   JOS.attribute("aliasee", AA->getAliasee());
 }
 
+void JSONNodeDumper::VisitCleanupAttr(const CleanupAttr *CA) {
+  JOS.attribute("cleanup_function", createBareDeclRef(CA->getFunctionDecl()));
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -209,6 +209,7 @@
   void Visit(const APValue , QualType Ty);
 
   void VisitAliasAttr(const AliasAttr *AA);
+  void VisitCleanupAttr(const CleanupAttr *CA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D157775: [clang] Add aliasee field to AliasAttr json AST dump

2023-08-14 Thread serge 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 rG11f3286585ce: [clang] Add aliasee field to AliasAttr json 
AST dump (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D157775

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -0,0 +1,84 @@
+// RUN: %clang_cc1 -Wdocumentation -ast-dump=json %s | FileCheck %s
+
+int global_decl;
+extern __attribute__((alias("global_decl"))) int global_alias;
+
+// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
+// using --filters=VarDecl
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 73,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 3,
+// CHECK-NEXT:   "col": 5,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 69,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 73,
+// CHECK-NEXT:"col": 5,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "global_decl",
+// CHECK-NEXT:  "mangledName": "global_decl",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 135,
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 50,
+// CHECK-NEXT:   "tokLen": 12
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 86,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 6
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 135,
+// CHECK-NEXT:"col": 50,
+// CHECK-NEXT:"tokLen": 12
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "global_alias",
+// CHECK-NEXT:  "mangledName": "global_alias",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "storageClass": "extern",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "AliasAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 108,
+// CHECK-NEXT:  "col": 23,
+// CHECK-NEXT:  "tokLen": 5
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 127,
+// CHECK-NEXT:  "col": 42,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"decl": "global_decl"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -530,6 +530,10 @@
   return Ret;
 }
 
+void JSONNodeDumper::VisitAliasAttr(const AliasAttr *AA) {
+  JOS.attribute("aliasee", AA->getAliasee());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -208,6 +208,8 @@
   void Visit(const concepts::Requirement *R);
   void Visit(const APValue , QualType Ty);
 
+  void VisitAliasAttr(const AliasAttr *AA);
+
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);
   void VisitFunctionType(const FunctionType *T);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D157783: [clang] Add rmissing fields to DeprecatedAttr and UnavailableAttr json AST dump

2023-08-14 Thread serge via Phabricator via cfe-commits
serge-sans-paille marked an inline comment as done.
serge-sans-paille added a comment.

Review taken into account. Thanks for handling this batch of patches o/


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

https://reviews.llvm.org/D157783

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


[PATCH] D157783: [clang] Add rmissing fields to DeprecatedAttr and UnavailableAttr json AST dump

2023-08-14 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 549929.
serge-sans-paille added a comment.

Only output extra fields if they are not empty


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

https://reviews.llvm.org/D157783

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -8,6 +8,13 @@
   __attribute__((cleanup(cleanup_function))) int var;
 }
 
+__attribute__((deprecated)) int deprecated_var0;
+__attribute__((deprecated("reason"))) int deprecated_var1;
+__attribute__((deprecated("reason", "replacement"))) int deprecated_var2;
+
+__attribute__((unavailable)) int unavailable_var0;
+__attribute__((unavailable("reason"))) int unavailable_var1;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -139,3 +146,237 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 282,
+// CHECK-NEXT:   "line": 11,
+// CHECK-NEXT:   "col": 33,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 250,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 282,
+// CHECK-NEXT:"col": 33,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var0",
+// CHECK-NEXT:  "mangledName": "deprecated_var0",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: }
+// CHECK-NEXT:}
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 341,
+// CHECK-NEXT:   "line": 12,
+// CHECK-NEXT:   "col": 43,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 299,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 341,
+// CHECK-NEXT:"col": 43,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var1",
+// CHECK-NEXT:  "mangledName": "deprecated_var1",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 314,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 333,
+// CHECK-NEXT:  "col": 35,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "reason"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 415,
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "col": 58,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 358,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 415,
+// CHECK-NEXT:"col": 58,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var2",
+// CHECK-NEXT:  "mangledName": "deprecated_var2",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 373,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 407,
+// CHECK-NEXT:  "col": 50,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// 

[PATCH] D157814: [clang] Add missing field to TLSModelAttr json AST dump

2023-08-13 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157814

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -19,6 +19,7 @@
 
 __attribute__ ((visibility ("hidden"))) int visibility_var;
 
+__thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
 
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
@@ -483,3 +484,51 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 724,
+// CHECK-NEXT:   "line": 22,
+// CHECK-NEXT:   "col": 57,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 668,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 8
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 724,
+// CHECK-NEXT:"col": 57,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "tls_model_var",
+// CHECK-NEXT:  "mangledName": "tls_model_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "tls": "static",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "TLSModelAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 693,
+// CHECK-NEXT:  "col": 26,
+// CHECK-NEXT:  "tokLen": 9
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 716,
+// CHECK-NEXT:  "col": 49,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"tls_model": "local-exec"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -556,6 +556,10 @@
   VA->getVisibility()));
 }
 
+void JSONNodeDumper::VisitTLSModelAttr(const TLSModelAttr *TA) {
+  JOS.attribute("tls_model", TA->getModel());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -214,6 +214,7 @@
   void VisitUnavailableAttr(const UnavailableAttr *UA);
   void VisitSectionAttr(const SectionAttr *SA);
   void VisitVisibilityAttr(const VisibilityAttr *VA);
+  void VisitTLSModelAttr(const TLSModelAttr *TA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -19,6 +19,7 @@
 
 __attribute__ ((visibility ("hidden"))) int visibility_var;
 
+__thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
 
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
@@ -483,3 +484,51 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 724,
+// CHECK-NEXT:   "line": 22,
+// CHECK-NEXT:   "col": 57,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 668,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 8
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 724,
+// CHECK-NEXT:"col": 57,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "tls_model_var",
+// CHECK-NEXT:  "mangledName": "tls_model_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "tls": "static",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "TLSModelAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 693,
+// CHECK-NEXT:  "col": 26,
+// 

[PATCH] D157808: [clang] Add missing field to VisibilityAttr json AST dump

2023-08-13 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 549717.
serge-sans-paille added a comment.

Fix typo in example


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

https://reviews.llvm.org/D157808

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,9 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visibility_var;
+
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -433,3 +436,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 14
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 14
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visibility_var",
+// CHECK-NEXT:  "mangledName": "visibility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 623,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 643,
+// CHECK-NEXT:  "col": 37,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"visibility": "hidden"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -551,6 +551,11 @@
   JOS.attribute("section_name", SA->getName());
 }
 
+void JSONNodeDumper::VisitVisibilityAttr(const VisibilityAttr *VA) {
+  JOS.attribute("visibility", VisibilityAttr::ConvertVisibilityTypeToStr(
+  VA->getVisibility()));
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -213,6 +213,7 @@
   void VisitDeprecatedAttr(const DeprecatedAttr *DA);
   void VisitUnavailableAttr(const UnavailableAttr *UA);
   void VisitSectionAttr(const SectionAttr *SA);
+  void VisitVisibilityAttr(const VisibilityAttr *VA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,9 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visibility_var;
+
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -433,3 +436,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 14
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 14
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visibility_var",
+// CHECK-NEXT:  "mangledName": "visibility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 623,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:

[PATCH] D157808: [clang] Add missing field to VisibilityAttr json AST dump

2023-08-13 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157808

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,8 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visbility_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -433,3 +435,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visbility_var",
+// CHECK-NEXT:  "mangledName": "visbility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 623,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 643,
+// CHECK-NEXT:  "col": 37,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"visibility": "hidden"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -551,6 +551,10 @@
   JOS.attribute("section_name", SA->getName());
 }
 
+void JSONNodeDumper::VisitVisibilityAttr(const VisibilityAttr *VA) {
+  JOS.attribute("visibility",  
VisibilityAttr::ConvertVisibilityTypeToStr(VA->getVisibility()));
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -213,6 +213,7 @@
   void VisitDeprecatedAttr(const DeprecatedAttr *DA);
   void VisitUnavailableAttr(const UnavailableAttr *UA);
   void VisitSectionAttr(const SectionAttr *SA);
+  void VisitVisibilityAttr(const VisibilityAttr *VA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -17,6 +17,8 @@
 
 __attribute__ ((section ("SECTION_NAME"))) int section_var;
 
+__attribute__ ((visibility ("hidden"))) int visbility_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -433,3 +435,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 651,
+// CHECK-NEXT:   "line": 20,
+// CHECK-NEXT:   "col": 45,
+// CHECK-NEXT:   "tokLen": 13
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 607,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 651,
+// CHECK-NEXT:"col": 45,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "visbility_var",
+// CHECK-NEXT:  "mangledName": "visbility_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "VisibilityAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 623,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 10
+// 

[PATCH] D157795: [clang] Add missing field to SectionAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157795

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -15,6 +15,8 @@
 __attribute__((unavailable)) int unavailable_var0;
 __attribute__((unavailable("reason"))) int unavailable_var1;
 
+__attribute__ ((section ("SECTION_NAME"))) int section_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -384,3 +386,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 593,
+// CHECK-NEXT:   "line": 18,
+// CHECK-NEXT:   "col": 48,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 546,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 593,
+// CHECK-NEXT:"col": 48,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "section_var",
+// CHECK-NEXT:  "mangledName": "section_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "SectionAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 562,
+// CHECK-NEXT:  "col": 17,
+// CHECK-NEXT:  "tokLen": 7
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 585,
+// CHECK-NEXT:  "col": 40,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"section_name": "SECTION_NAME"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -547,6 +547,10 @@
   JOS.attribute("message", UA->getMessage());
 }
 
+void JSONNodeDumper::VisitSectionAttr(const SectionAttr *SA) {
+  JOS.attribute("section_name", SA->getName());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -212,6 +212,7 @@
   void VisitCleanupAttr(const CleanupAttr *CA);
   void VisitDeprecatedAttr(const DeprecatedAttr *DA);
   void VisitUnavailableAttr(const UnavailableAttr *UA);
+  void VisitSectionAttr(const SectionAttr *SA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);


Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -15,6 +15,8 @@
 __attribute__((unavailable)) int unavailable_var0;
 __attribute__((unavailable("reason"))) int unavailable_var1;
 
+__attribute__ ((section ("SECTION_NAME"))) int section_var;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -384,3 +386,50 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 593,
+// CHECK-NEXT:   "line": 18,
+// CHECK-NEXT:   "col": 48,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 546,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 593,
+// CHECK-NEXT:"col": 48,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "section_var",
+// CHECK-NEXT:  "mangledName": "section_var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "SectionAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 562,
+// CHECK-NEXT:  "col": 17,
+// 

[PATCH] D157783: [clang] Add rmissing fields to DeprecatedAttr and UnavailableAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 549645.
serge-sans-paille added a comment.

+ test case


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

https://reviews.llvm.org/D157783

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -8,6 +8,13 @@
   __attribute__((cleanup(cleanup_function))) int var;
 }
 
+__attribute__((deprecated)) int deprecated_var0;
+__attribute__((deprecated("reason"))) int deprecated_var1;
+__attribute__((deprecated("reason", "replacement"))) int deprecated_var2;
+
+__attribute__((unavailable)) int unavailable_var0;
+__attribute__((unavailable("reason"))) int unavailable_var1;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -139,3 +146,241 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 282,
+// CHECK-NEXT:   "line": 11,
+// CHECK-NEXT:   "col": 33,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 250,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 282,
+// CHECK-NEXT:"col": 33,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var0",
+// CHECK-NEXT:  "mangledName": "deprecated_var0",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 341,
+// CHECK-NEXT:   "line": 12,
+// CHECK-NEXT:   "col": 43,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 299,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 341,
+// CHECK-NEXT:"col": 43,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var1",
+// CHECK-NEXT:  "mangledName": "deprecated_var1",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 314,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 333,
+// CHECK-NEXT:  "col": 35,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "reason",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 415,
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "col": 58,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 358,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 415,
+// CHECK-NEXT:"col": 58,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var2",
+// CHECK-NEXT:  "mangledName": "deprecated_var2",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 373,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 407,
+// CHECK-NEXT:  "col": 50,
+// 

[PATCH] D157783: [clang] Add rmissing fields to DeprecatedAttr and UnavailableAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 549644.
serge-sans-paille retitled this revision from "[clang] Add reason and 
replacement fields to DeprecatedAttr json AST dump" to "[clang] Add rmissing 
fields to DeprecatedAttr and UnavailableAttr json AST dump".
serge-sans-paille added a comment.

+ Unavailable attr


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

https://reviews.llvm.org/D157783

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -8,6 +8,13 @@
   __attribute__((cleanup(cleanup_function))) int var;
 }
 
+__attribute__((deprecated)) int deprecated_var0;
+__attribute__((deprecated("reason"))) int deprecated_var1;
+__attribute__((deprecated("reason", "replacement"))) int deprecated_var2;
+
+__attribute__((unavailable)) int unavailable_var0;
+__attribute__((unavailable("reason"))) int unavailable_var1;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -139,3 +146,147 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 282,
+// CHECK-NEXT:   "line": 11,
+// CHECK-NEXT:   "col": 33,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 250,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 282,
+// CHECK-NEXT:"col": 33,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var0",
+// CHECK-NEXT:  "mangledName": "deprecated_var0",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 341,
+// CHECK-NEXT:   "line": 12,
+// CHECK-NEXT:   "col": 43,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 299,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 341,
+// CHECK-NEXT:"col": 43,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var1",
+// CHECK-NEXT:  "mangledName": "deprecated_var1",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 314,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 333,
+// CHECK-NEXT:  "col": 35,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "reason",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 415,
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "col": 58,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 358,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 415,
+// CHECK-NEXT:"col": 58,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var2",
+// CHECK-NEXT:  "mangledName": "deprecated_var2",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT: 

[PATCH] D157783: [clang] Add reason and replacement fields to DeprecatedAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157783

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -8,6 +8,10 @@
   __attribute__((cleanup(cleanup_function))) int var;
 }
 
+__attribute__((deprecated)) int deprecated_var0;
+__attribute__((deprecated("reason"))) int deprecated_var1;
+__attribute__((deprecated("reason", "replacement"))) int deprecated_var2;
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -139,3 +143,147 @@
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 282,
+// CHECK-NEXT:   "line": 11,
+// CHECK-NEXT:   "col": 33,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 250,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 282,
+// CHECK-NEXT:"col": 33,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var0",
+// CHECK-NEXT:  "mangledName": "deprecated_var0",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 265,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 341,
+// CHECK-NEXT:   "line": 12,
+// CHECK-NEXT:   "col": 43,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 299,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 341,
+// CHECK-NEXT:"col": 43,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var1",
+// CHECK-NEXT:  "mangledName": "deprecated_var1",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 314,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 333,
+// CHECK-NEXT:  "col": 35,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"message": "reason",
+// CHECK-NEXT:"replacement": ""
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 415,
+// CHECK-NEXT:   "line": 13,
+// CHECK-NEXT:   "col": 58,
+// CHECK-NEXT:   "tokLen": 15
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 358,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 415,
+// CHECK-NEXT:"col": 58,
+// CHECK-NEXT:"tokLen": 15
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "deprecated_var2",
+// CHECK-NEXT:  "mangledName": "deprecated_var2",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "DeprecatedAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 373,
+// CHECK-NEXT:  "col": 16,
+// CHECK-NEXT:  "tokLen": 10
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 407,
+// CHECK-NEXT:  "col": 50,
+// 

[PATCH] D157781: [clang] Add cleanup_function field to CleanupAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157781

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- clang/test/AST/ast-dump-attr-json.cpp
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -3,6 +3,11 @@
 int global_decl;
 extern __attribute__((alias("global_decl"))) int global_alias;
 
+void cleanup_function(int*);
+void some() {
+  __attribute__((cleanup(cleanup_function))) int var;
+}
+
 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
 // using --filters=VarDecl
 
@@ -78,7 +83,59 @@
 // CHECK-NEXT:  "tokLen": 1
 // CHECK-NEXT: }
 // CHECK-NEXT:},
-// CHECK-NEXT:"decl": "global_decl"
+// CHECK-NEXT:"aliasee": "global_decl"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 242,
+// CHECK-NEXT:   "col": 50,
+// CHECK-NEXT:   "tokLen": 3
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 195,
+// CHECK-NEXT:"col": 3,
+// CHECK-NEXT:"tokLen": 13
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 242,
+// CHECK-NEXT:"col": 50,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "var",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "CleanupAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 210,
+// CHECK-NEXT:  "col": 18,
+// CHECK-NEXT:  "tokLen": 7
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 234,
+// CHECK-NEXT:  "col": 42,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"cleanup_function": {
+// CHECK-NEXT: "id": "0x{{.*}}",
+// CHECK-NEXT: "kind": "FunctionDecl",
+// CHECK-NEXT: "name": "cleanup_function",
+// CHECK-NEXT: "type": {
+// CHECK-NEXT:  "qualType": "void (int *)"
+// CHECK-NEXT: }
+// CHECK-NEXT:}
 // CHECK-NEXT:   }
 // CHECK-NEXT:  ]
 // CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -534,6 +534,10 @@
   JOS.attribute("aliasee", AA->getAliasee());
 }
 
+void JSONNodeDumper::VisitCleanupAttr(const CleanupAttr *CA) {
+  JOS.attribute("cleanup_function", createBareDeclRef(CA->getFunctionDecl()));
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -209,6 +209,7 @@
   void Visit(const APValue , QualType Ty);
 
   void VisitAliasAttr(const AliasAttr *AA);
+  void VisitCleanupAttr(const CleanupAttr *CA);
 
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D157775: [clang] Add aliasee field to AliasAttr json AST dump

2023-08-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: aaron.ballman.
Herald added a subscriber: jeroen.dobbelaere.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D157775

Files:
  clang/include/clang/AST/JSONNodeDumper.h
  clang/lib/AST/JSONNodeDumper.cpp
  clang/test/AST/ast-dump-attr-json.cpp

Index: clang/test/AST/ast-dump-attr-json.cpp
===
--- /dev/null
+++ clang/test/AST/ast-dump-attr-json.cpp
@@ -0,0 +1,84 @@
+// RUN: %clang_cc1 -Wdocumentation -ast-dump=json %s | FileCheck %s
+
+int global_decl;
+extern __attribute__((alias("global_decl"))) int global_alias;
+
+// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
+// using --filters=VarDecl
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 73,
+// CHECK-NEXT:   "file": "{{.*}}",
+// CHECK-NEXT:   "line": 3,
+// CHECK-NEXT:   "col": 5,
+// CHECK-NEXT:   "tokLen": 11
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 69,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 3
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 73,
+// CHECK-NEXT:"col": 5,
+// CHECK-NEXT:"tokLen": 11
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "global_decl",
+// CHECK-NEXT:  "mangledName": "global_decl",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  }
+// CHECK-NEXT: }
+
+
+// CHECK-NOT: {{^}}Dumping
+// CHECK:  "kind": "VarDecl",
+// CHECK-NEXT:  "loc": {
+// CHECK-NEXT:   "offset": 135,
+// CHECK-NEXT:   "line": 4,
+// CHECK-NEXT:   "col": 50,
+// CHECK-NEXT:   "tokLen": 12
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "range": {
+// CHECK-NEXT:   "begin": {
+// CHECK-NEXT:"offset": 86,
+// CHECK-NEXT:"col": 1,
+// CHECK-NEXT:"tokLen": 6
+// CHECK-NEXT:   },
+// CHECK-NEXT:   "end": {
+// CHECK-NEXT:"offset": 135,
+// CHECK-NEXT:"col": 50,
+// CHECK-NEXT:"tokLen": 12
+// CHECK-NEXT:   }
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "name": "global_alias",
+// CHECK-NEXT:  "mangledName": "global_alias",
+// CHECK-NEXT:  "type": {
+// CHECK-NEXT:   "qualType": "int"
+// CHECK-NEXT:  },
+// CHECK-NEXT:  "storageClass": "extern",
+// CHECK-NEXT:  "inner": [
+// CHECK-NEXT:   {
+// CHECK-NEXT:"id": "0x{{.*}}",
+// CHECK-NEXT:"kind": "AliasAttr",
+// CHECK-NEXT:"range": {
+// CHECK-NEXT: "begin": {
+// CHECK-NEXT:  "offset": 108,
+// CHECK-NEXT:  "col": 23,
+// CHECK-NEXT:  "tokLen": 5
+// CHECK-NEXT: },
+// CHECK-NEXT: "end": {
+// CHECK-NEXT:  "offset": 127,
+// CHECK-NEXT:  "col": 42,
+// CHECK-NEXT:  "tokLen": 1
+// CHECK-NEXT: }
+// CHECK-NEXT:},
+// CHECK-NEXT:"decl": "global_decl"
+// CHECK-NEXT:   }
+// CHECK-NEXT:  ]
+// CHECK-NEXT: }
Index: clang/lib/AST/JSONNodeDumper.cpp
===
--- clang/lib/AST/JSONNodeDumper.cpp
+++ clang/lib/AST/JSONNodeDumper.cpp
@@ -530,6 +530,10 @@
   return Ret;
 }
 
+void JSONNodeDumper::VisitAliasAttr(const AliasAttr *AA) {
+  JOS.attribute("aliasee", AA->getAliasee());
+}
+
 void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
   JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
   if (!TT->typeMatchesDecl())
Index: clang/include/clang/AST/JSONNodeDumper.h
===
--- clang/include/clang/AST/JSONNodeDumper.h
+++ clang/include/clang/AST/JSONNodeDumper.h
@@ -208,6 +208,8 @@
   void Visit(const concepts::Requirement *R);
   void Visit(const APValue , QualType Ty);
 
+  void VisitAliasAttr(const AliasAttr *AA);
+
   void VisitTypedefType(const TypedefType *TT);
   void VisitUsingType(const UsingType *TT);
   void VisitFunctionType(const FunctionType *T);
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D156337: [clang] Allow setting the uninitialized attribute on record

2023-07-28 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 545074.
serge-sans-paille added a comment.

(rebased on `main`)


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

https://reviews.llvm.org/D156337

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/AttrDocs.td
  clang/lib/CodeGen/CGDecl.cpp
  clang/lib/Sema/SemaDeclAttr.cpp
  clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
  clang/test/Misc/pragma-attribute-supported-attributes-list.test
  clang/test/Sema/attr-uninitialized.c
  clang/test/SemaCXX/constant-expression-cxx14.cpp
  clang/test/SemaCXX/constant-expression-cxx2a.cpp

Index: clang/test/SemaCXX/constant-expression-cxx2a.cpp
===
--- clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -1362,6 +1362,9 @@
   static_assert( == (Y));
 }
 
+struct __attribute__((uninitialized)) j { int v; constexpr j() {}};
+static_assert(j().v == 0, ""); // expected-error {{constant expression}} expected-note {{read of uninitialized object is not allowed in a constant expression}}
+
 namespace PR45133 {
   struct A { long x; };
 
Index: clang/test/SemaCXX/constant-expression-cxx14.cpp
===
--- clang/test/SemaCXX/constant-expression-cxx14.cpp
+++ clang/test/SemaCXX/constant-expression-cxx14.cpp
@@ -850,6 +850,13 @@
 ({ if (true) {} }); // expected-note {{not supported}}
 return 0;
   }
+
+  // Make sure the uninitialized attribute does not silent constant expression
+  // warnings.
+  constexpr int i() {
+return ({ __attribute__((uninitialized)) int n; n; }); // expected-note {{read of uninitialized object}}
+  }
+  static_assert(i() == 0, ""); // expected-error {{constant expression}} expected-note {{in call}}
 }
 
 namespace VirtualFromBase {
Index: clang/test/Sema/attr-uninitialized.c
===
--- clang/test/Sema/attr-uninitialized.c
+++ clang/test/Sema/attr-uninitialized.c
@@ -18,4 +18,4 @@
 
 struct TheWordIsOut {
   __attribute((uninitialized)) int youre_doin_wrong; // expected-warning {{'uninitialized' attribute only applies to local variables}}
-} __attribute((uninitialized));  // expected-warning {{'uninitialized' attribute only applies to local variables}}
+} __attribute((uninitialized));
Index: clang/test/Misc/pragma-attribute-supported-attributes-list.test
===
--- clang/test/Misc/pragma-attribute-supported-attributes-list.test
+++ clang/test/Misc/pragma-attribute-supported-attributes-list.test
@@ -188,7 +188,7 @@
 // CHECK-NEXT: TargetVersion (SubjectMatchRule_function)
 // CHECK-NEXT: TestTypestate (SubjectMatchRule_function_is_member)
 // CHECK-NEXT: TrivialABI (SubjectMatchRule_record)
-// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local)
+// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local, SubjectMatchRule_record)
 // CHECK-NEXT: UnsafeBufferUsage (SubjectMatchRule_function)
 // CHECK-NEXT: UseHandle (SubjectMatchRule_variable_is_parameter)
 // CHECK-NEXT: VecReturn (SubjectMatchRule_record)
Index: clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
===
--- clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
+++ clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
@@ -38,4 +38,24 @@
 }
 #pragma clang attribute pop
 
+struct [[clang::uninitialized]] uninitialized_record {
+  int i;
+};
+
+// UNINIT-LABEL:  test_record_attribute_uninitialized(
+// UNINIT:  alloca
+// UNINIT-NEXT: call void
+// ZERO-LABEL:test_record_attribute_uninitialized(
+// ZERO:  alloca
+// ZERO-NOT:  !annotation
+// ZERO-NEXT: call void
+// PATTERN-LABEL: test_record_attribute_uninitialized(
+// PATTERN:  alloca
+// PATTERN-NOT:  !annotation
+// PATTERN-NEXT: call void
+void test_record_attribute_uninitialized() {
+  uninitialized_record some;
+  used(some);
+}
+
 } // extern "C"
Index: clang/lib/Sema/SemaDeclAttr.cpp
===
--- clang/lib/Sema/SemaDeclAttr.cpp
+++ clang/lib/Sema/SemaDeclAttr.cpp
@@ -8457,8 +8457,10 @@
 }
 
 static void handleUninitializedAttr(Sema , Decl *D, const ParsedAttr ) {
-  assert(cast(D)->getStorageDuration() == SD_Automatic &&
- "uninitialized is only valid on automatic duration variables");
+  assert((isa(D) ||
+  (cast(D)->getStorageDuration() == SD_Automatic)) &&
+ "uninitialized is only valid on automatic duration variables and "
+ "record type");
   D->addAttr(::new (S.Context) UninitializedAttr(S.Context, AL));
 }
 
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1905,13 +1905,17 @@
   const 

[PATCH] D156337: [clang] Allow setting the uninitialized attribute on record

2023-07-28 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 545060.
serge-sans-paille added a comment.

Take reviewers comment into account.


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

https://reviews.llvm.org/D156337

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/AttrDocs.td
  clang/lib/CodeGen/CGDecl.cpp
  clang/lib/Sema/SemaDeclAttr.cpp
  clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
  clang/test/Misc/pragma-attribute-supported-attributes-list.test
  clang/test/Sema/attr-uninitialized.c
  clang/test/SemaCXX/constant-expression-cxx14.cpp
  clang/test/SemaCXX/constant-expression-cxx2a.cpp

Index: clang/test/SemaCXX/constant-expression-cxx2a.cpp
===
--- clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -1362,6 +1362,9 @@
   static_assert( == (Y));
 }
 
+struct __attribute__((uninitialized)) j { int v; constexpr j() {}};
+static_assert(j().v == 0, ""); // expected-error {{constant expression}} expected-note {{read of uninitialized object is not allowed in a constant expression}}
+
 namespace PR45133 {
   struct A { long x; };
 
Index: clang/test/SemaCXX/constant-expression-cxx14.cpp
===
--- clang/test/SemaCXX/constant-expression-cxx14.cpp
+++ clang/test/SemaCXX/constant-expression-cxx14.cpp
@@ -849,6 +849,13 @@
 ({ if (true) {} }); // expected-note {{not supported}}
 return 0;
   }
+
+  // Make sure the uninitialized attribute does not silent constant expression
+  // warnings.
+  constexpr int i() {
+return ({ __attribute__((uninitialized)) int n; n; }); // expected-note {{read of uninitialized object}}
+  }
+  static_assert(i() == 0, ""); // expected-error {{constant expression}} expected-note {{in call}}
 }
 
 namespace VirtualFromBase {
Index: clang/test/Sema/attr-uninitialized.c
===
--- clang/test/Sema/attr-uninitialized.c
+++ clang/test/Sema/attr-uninitialized.c
@@ -18,4 +18,4 @@
 
 struct TheWordIsOut {
   __attribute((uninitialized)) int youre_doin_wrong; // expected-warning {{'uninitialized' attribute only applies to local variables}}
-} __attribute((uninitialized));  // expected-warning {{'uninitialized' attribute only applies to local variables}}
+} __attribute((uninitialized));
Index: clang/test/Misc/pragma-attribute-supported-attributes-list.test
===
--- clang/test/Misc/pragma-attribute-supported-attributes-list.test
+++ clang/test/Misc/pragma-attribute-supported-attributes-list.test
@@ -188,7 +188,7 @@
 // CHECK-NEXT: TargetVersion (SubjectMatchRule_function)
 // CHECK-NEXT: TestTypestate (SubjectMatchRule_function_is_member)
 // CHECK-NEXT: TrivialABI (SubjectMatchRule_record)
-// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local)
+// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local, SubjectMatchRule_record)
 // CHECK-NEXT: UnsafeBufferUsage (SubjectMatchRule_function)
 // CHECK-NEXT: UseHandle (SubjectMatchRule_variable_is_parameter)
 // CHECK-NEXT: VecReturn (SubjectMatchRule_record)
Index: clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
===
--- clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
+++ clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
@@ -38,4 +38,24 @@
 }
 #pragma clang attribute pop
 
+struct [[clang::uninitialized]] uninitialized_record {
+  int i;
+};
+
+// UNINIT-LABEL:  test_record_attribute_uninitialized(
+// UNINIT:  alloca
+// UNINIT-NEXT: call void
+// ZERO-LABEL:test_record_attribute_uninitialized(
+// ZERO:  alloca
+// ZERO-NOT:  !annotation
+// ZERO-NEXT: call void
+// PATTERN-LABEL: test_record_attribute_uninitialized(
+// PATTERN:  alloca
+// PATTERN-NOT:  !annotation
+// PATTERN-NEXT: call void
+void test_record_attribute_uninitialized() {
+  uninitialized_record some;
+  used(some);
+}
+
 } // extern "C"
Index: clang/lib/Sema/SemaDeclAttr.cpp
===
--- clang/lib/Sema/SemaDeclAttr.cpp
+++ clang/lib/Sema/SemaDeclAttr.cpp
@@ -8438,8 +8438,10 @@
 }
 
 static void handleUninitializedAttr(Sema , Decl *D, const ParsedAttr ) {
-  assert(cast(D)->getStorageDuration() == SD_Automatic &&
- "uninitialized is only valid on automatic duration variables");
+  assert((isa(D) ||
+  (cast(D)->getStorageDuration() == SD_Automatic)) &&
+ "uninitialized is only valid on automatic duration variables and "
+ "record type");
   D->addAttr(::new (S.Context) UninitializedAttr(S.Context, AL));
 }
 
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1902,13 

[PATCH] D156337: [clang] Allow setting the uninitialized attribute on record

2023-07-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: jfb, aaron.ballman.
Herald added a subscriber: jdoerfert.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This attribute would then affect all stack variables of that type, when the 
type has been evaluated as ok wrt. initialisation, or a for performance / 
security trade-offs.
An example of use could be container with preallocated storage like 
SmallVector, if we consider that it is too costly to initialize that storage.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D156337

Files:
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/AttrDocs.td
  clang/lib/CodeGen/CGDecl.cpp
  clang/lib/Sema/SemaDeclAttr.cpp
  clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
  clang/test/Misc/pragma-attribute-supported-attributes-list.test
  clang/test/Sema/attr-uninitialized.c

Index: clang/test/Sema/attr-uninitialized.c
===
--- clang/test/Sema/attr-uninitialized.c
+++ clang/test/Sema/attr-uninitialized.c
@@ -18,4 +18,4 @@
 
 struct TheWordIsOut {
   __attribute((uninitialized)) int youre_doin_wrong; // expected-warning {{'uninitialized' attribute only applies to local variables}}
-} __attribute((uninitialized));  // expected-warning {{'uninitialized' attribute only applies to local variables}}
+} __attribute((uninitialized));
Index: clang/test/Misc/pragma-attribute-supported-attributes-list.test
===
--- clang/test/Misc/pragma-attribute-supported-attributes-list.test
+++ clang/test/Misc/pragma-attribute-supported-attributes-list.test
@@ -188,7 +188,7 @@
 // CHECK-NEXT: TargetVersion (SubjectMatchRule_function)
 // CHECK-NEXT: TestTypestate (SubjectMatchRule_function_is_member)
 // CHECK-NEXT: TrivialABI (SubjectMatchRule_record)
-// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local)
+// CHECK-NEXT: Uninitialized (SubjectMatchRule_variable_is_local, SubjectMatchRule_record)
 // CHECK-NEXT: UnsafeBufferUsage (SubjectMatchRule_function)
 // CHECK-NEXT: UseHandle (SubjectMatchRule_variable_is_parameter)
 // CHECK-NEXT: VecReturn (SubjectMatchRule_record)
Index: clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
===
--- clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
+++ clang/test/CodeGenCXX/trivial-auto-var-init-attribute.cpp
@@ -38,4 +38,24 @@
 }
 #pragma clang attribute pop
 
+struct [[clang::uninitialized]] uninitialized_record {
+  int i;
+};
+
+// UNINIT-LABEL:  test_record_attribute_uninitialized(
+// UNINIT:  alloca
+// UNINIT-NEXT: call void
+// ZERO-LABEL:test_record_attribute_uninitialized(
+// ZERO:  alloca
+// ZERO-NOT:  !annotation
+// ZERO-NEXT: call void
+// PATTERN-LABEL: test_record_attribute_uninitialized(
+// PATTERN:  alloca
+// PATTERN-NOT:  !annotation
+// PATTERN-NEXT: call void
+void test_record_attribute_uninitialized() {
+  uninitialized_record some;
+  used(some);
+}
+
 } // extern "C"
Index: clang/lib/Sema/SemaDeclAttr.cpp
===
--- clang/lib/Sema/SemaDeclAttr.cpp
+++ clang/lib/Sema/SemaDeclAttr.cpp
@@ -8438,8 +8438,11 @@
 }
 
 static void handleUninitializedAttr(Sema , Decl *D, const ParsedAttr ) {
-  assert(cast(D)->getStorageDuration() == SD_Automatic &&
- "uninitialized is only valid on automatic duration variables");
+  assert(((isa(D) &&
+   cast(D)->getStorageDuration() == SD_Automatic) ||
+  isa(D)) &&
+ "uninitialized is only valid on automatic duration variables and "
+ "record type");
   D->addAttr(::new (S.Context) UninitializedAttr(S.Context, AL));
 }
 
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1902,13 +1902,17 @@
   const Address Loc =
   locIsByrefHeader ? emission.getObjectAddress(*this) : emission.Addr;
 
-  // Note: constexpr already initializes everything correctly.
-  LangOptions::TrivialAutoVarInitKind trivialAutoVarInit =
-  (D.isConstexpr()
-   ? LangOptions::TrivialAutoVarInitKind::Uninitialized
-   : (D.getAttr()
-  ? LangOptions::TrivialAutoVarInitKind::Uninitialized
-  : getContext().getLangOpts().getTrivialAutoVarInit()));
+  LangOptions::TrivialAutoVarInitKind trivialAutoVarInit;
+  if (D.isConstexpr())
+// Note: constexpr already initializes everything correctly.
+trivialAutoVarInit = LangOptions::TrivialAutoVarInitKind::Uninitialized;
+  else if (D.getAttr())
+trivialAutoVarInit = LangOptions::TrivialAutoVarInitKind::Uninitialized;
+  else if (const auto *RecordTy = D.getType()->getAsRecordDecl();

[PATCH] D155580: [trivial-auto-var-init] Do not emit initialization code for empty class

2023-07-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille abandoned this revision.
serge-sans-paille added a comment.

gcc bug filled as https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110816


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

https://reviews.llvm.org/D155580

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


[PATCH] D155580: [trivial-auto-var-init] Do not emit initialization code for empty class

2023-07-20 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a subscriber: jakubjelinek.
serge-sans-paille added a comment.

@jfb ok, makes sense. For the record it does show up in our profile but I have 
been able to workaround it without touching the compiler. This probably mean 
that the GCC implementation is having a small hole, @jakubjelinek do you think 
it's worth opening a bug in GCC concerning the lack of memsetting on empty 
class byte under `-ftrivial-auto-var-init`?


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

https://reviews.llvm.org/D155580

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


[PATCH] D155580: [trivial-auto-var-init] Do not emit initialization code for empty class

2023-07-18 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 541475.
serge-sans-paille added a comment.

switch from cascading ternary operator to cascading if for readability.


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

https://reviews.llvm.org/D155580

Files:
  clang/lib/CodeGen/CGDecl.cpp
  clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
  clang/test/CodeGenCXX/auto-var-init.cpp

Index: clang/test/CodeGenCXX/auto-var-init.cpp
===
--- clang/test/CodeGenCXX/auto-var-init.cpp
+++ clang/test/CodeGenCXX/auto-var-init.cpp
@@ -43,9 +43,6 @@
 // PATTERN-NOT: undef
 // ZERO-NOT: undef
 
-// PATTERN-O0: @__const.test_empty_uninit.uninit = private unnamed_addr constant %struct.empty { i8 [[I8]] }, align 1
-// PATTERN-O1-NOT: @__const.test_empty_uninit.uninit
-struct empty {};
 // PATTERN-O0: @__const.test_small_uninit.uninit = private unnamed_addr constant %struct.small { i8 [[I8]] }, align 1
 // PATTERN-O0: @__const.test_small_custom.custom = private unnamed_addr constant %struct.small { i8 42 }, align 1
 // ZERO-O0: @__const.test_small_custom.custom = private unnamed_addr constant %struct.small { i8 42 }, align 1
@@ -586,24 +583,6 @@
 // CHECK-NOT:   !annotation
 // CHECK-NEXT:  call void @{{.*}}used{{.*}}%braces)
 
-TEST_UNINIT(empty, empty);
-// CHECK-LABEL: @test_empty_uninit()
-// CHECK:   %uninit = alloca %struct.empty, align
-// CHECK-NEXT:  call void @{{.*}}used{{.*}}%uninit)
-// PATTERN-LABEL: @test_empty_uninit()
-// PATTERN-O0: call void @llvm.memcpy{{.*}} @__const.test_empty_uninit.uninit{{.+}}), !annotation [[AUTO_INIT]]
-// PATTERN-O1: store i8 [[I8]], {{.*}} align 1, !annotation [[AUTO_INIT]]
-// ZERO-LABEL: @test_empty_uninit()
-// ZERO-O0: call void @llvm.memset{{.*}}, i8 0,{{.+}}), !annotation [[AUTO_INIT]]
-// ZERO-O1: store i8 0, {{.*}} align 1, !annotation [[AUTO_INIT]]
-
-TEST_BRACES(empty, empty);
-// CHECK-LABEL: @test_empty_braces()
-// CHECK:   %braces = alloca %struct.empty, align
-// CHECK-NEXT:  call void @llvm.memcpy
-// CHECK-NOT:   !annotation
-// CHECK-NEXT:  call void @{{.*}}used{{.*}}%braces)
-
 TEST_UNINIT(small, small);
 // CHECK-LABEL: @test_small_uninit()
 // CHECK:   %uninit = alloca %struct.small, align
Index: clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s
+
+// C++ empty classes still take some memory, but there is no need to initialize
+// it has it cannot be accessed. This matches GCC behavior.
+
+struct S {
+};
+
+extern "C" void use(struct S*);
+
+// CHECK-LABEL: @empty_class(
+// CHECK:   %s = alloca
+// CHECK-NEXT:  call void @use(ptr noundef %s)
+extern "C" void empty_class(void) {
+  S s;
+  return use();
+}
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1855,6 +1855,13 @@
   }
 }
 
+static bool isEmptyClass(VarDecl const ) {
+  const Type *Ty = D.getType().getTypePtr();
+  if (const auto *CxxRecordTy = Ty->getAsCXXRecordDecl())
+return CxxRecordTy->isEmpty();
+  return false;
+}
+
 void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission ) {
   assert(emission.Variable && "emission was not valid!");
 
@@ -1902,13 +1909,18 @@
   const Address Loc =
   locIsByrefHeader ? emission.getObjectAddress(*this) : emission.Addr;
 
-  // Note: constexpr already initializes everything correctly.
-  LangOptions::TrivialAutoVarInitKind trivialAutoVarInit =
-  (D.isConstexpr()
-   ? LangOptions::TrivialAutoVarInitKind::Uninitialized
-   : (D.getAttr()
-  ? LangOptions::TrivialAutoVarInitKind::Uninitialized
-  : getContext().getLangOpts().getTrivialAutoVarInit()));
+  LangOptions::TrivialAutoVarInitKind trivialAutoVarInit;
+  if (D.isConstexpr())
+// Constexpr already initializes everything correctly.
+trivialAutoVarInit = LangOptions::TrivialAutoVarInitKind::Uninitialized;
+  else if (D.getAttr())
+trivialAutoVarInit = LangOptions::TrivialAutoVarInitKind::Uninitialized;
+  else if (isEmptyClass(D))
+// Empty classes still use a byte, but it's ok not to initialize it as
+// it cannot be legitimately accessed.
+trivialAutoVarInit = LangOptions::TrivialAutoVarInitKind::Uninitialized;
+  else
+trivialAutoVarInit = getContext().getLangOpts().getTrivialAutoVarInit();
 
   auto initializeWhatIsTechnicallyUninitialized = [&](Address Loc) {
 if (trivialAutoVarInit ==
___
cfe-commits mailing list
cfe-commits@lists.llvm.org

[PATCH] D155580: [trivial-auto-var-init] Do not emit initialization code for empty class

2023-07-18 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Comparison with GCC behavior here: https://godbolt.org/z/xc3j9jEsf


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D155580

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


[PATCH] D155580: [trivial-auto-var-init] Do not emit initialization code for empty class

2023-07-18 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: nickdesaulniers, jfb, aaron.ballman.
Herald added a subscriber: kristof.beyls.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Empty class still use one byte, but there is no way to read that byte
programmatically in a legitimate way. Yet trivial auto var init always
generate a store for it and there is no programmatic way to prevent the
generation of that extra store.

This patch harmonizes Clang behavior with GCC and does not generate
initialization code for empty classes under -ftrivial-auto-var-init


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D155580

Files:
  clang/lib/CodeGen/CGDecl.cpp
  clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
  clang/test/CodeGenCXX/auto-var-init.cpp


Index: clang/test/CodeGenCXX/auto-var-init.cpp
===
--- clang/test/CodeGenCXX/auto-var-init.cpp
+++ clang/test/CodeGenCXX/auto-var-init.cpp
@@ -43,9 +43,6 @@
 // PATTERN-NOT: undef
 // ZERO-NOT: undef
 
-// PATTERN-O0: @__const.test_empty_uninit.uninit = private unnamed_addr 
constant %struct.empty { i8 [[I8]] }, align 1
-// PATTERN-O1-NOT: @__const.test_empty_uninit.uninit
-struct empty {};
 // PATTERN-O0: @__const.test_small_uninit.uninit = private unnamed_addr 
constant %struct.small { i8 [[I8]] }, align 1
 // PATTERN-O0: @__const.test_small_custom.custom = private unnamed_addr 
constant %struct.small { i8 42 }, align 1
 // ZERO-O0: @__const.test_small_custom.custom = private unnamed_addr constant 
%struct.small { i8 42 }, align 1
@@ -586,24 +583,6 @@
 // CHECK-NOT:   !annotation
 // CHECK-NEXT:  call void @{{.*}}used{{.*}}%braces)
 
-TEST_UNINIT(empty, empty);
-// CHECK-LABEL: @test_empty_uninit()
-// CHECK:   %uninit = alloca %struct.empty, align
-// CHECK-NEXT:  call void @{{.*}}used{{.*}}%uninit)
-// PATTERN-LABEL: @test_empty_uninit()
-// PATTERN-O0: call void @llvm.memcpy{{.*}} 
@__const.test_empty_uninit.uninit{{.+}}), !annotation [[AUTO_INIT]]
-// PATTERN-O1: store i8 [[I8]], {{.*}} align 1, !annotation [[AUTO_INIT]]
-// ZERO-LABEL: @test_empty_uninit()
-// ZERO-O0: call void @llvm.memset{{.*}}, i8 0,{{.+}}), !annotation 
[[AUTO_INIT]]
-// ZERO-O1: store i8 0, {{.*}} align 1, !annotation [[AUTO_INIT]]
-
-TEST_BRACES(empty, empty);
-// CHECK-LABEL: @test_empty_braces()
-// CHECK:   %braces = alloca %struct.empty, align
-// CHECK-NEXT:  call void @llvm.memcpy
-// CHECK-NOT:   !annotation
-// CHECK-NEXT:  call void @{{.*}}used{{.*}}%braces)
-
 TEST_UNINIT(small, small);
 // CHECK-LABEL: @test_small_uninit()
 // CHECK:   %uninit = alloca %struct.small, align
Index: clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
===
--- /dev/null
+++ clang/test/CodeGenCXX/auto-var-init-empty-class.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown 
-ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero 
%s -emit-llvm -o - | FileCheck %s
+
+// C++ empty classes still take some memory, but there is no need to initialize
+// it has it cannot be accessed. This matches GCC behavior.
+
+struct S {
+};
+
+extern "C" void use(struct S*);
+
+// CHECK-LABEL: @empty_class(
+// CHECK:   %s = alloca
+// CHECK-NEXT:  call void @use(ptr noundef %s)
+extern "C" void empty_class(void) {
+  S s;
+  return use();
+}
Index: clang/lib/CodeGen/CGDecl.cpp
===
--- clang/lib/CodeGen/CGDecl.cpp
+++ clang/lib/CodeGen/CGDecl.cpp
@@ -1855,6 +1855,13 @@
   }
 }
 
+static bool isEmptyClass(VarDecl const ) {
+  const Type *Ty = D.getType().getTypePtr();
+  if (const auto *CxxRecordTy = Ty->getAsCXXRecordDecl())
+return CxxRecordTy->isEmpty();
+  return false;
+}
+
 void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission ) {
   assert(emission.Variable && "emission was not valid!");
 
@@ -1903,12 +1910,18 @@
   locIsByrefHeader ? emission.getObjectAddress(*this) : emission.Addr;
 
   // Note: constexpr already initializes everything correctly.
+  // Note: empty classes still use a byte, but it's ok not to initialize it as
+  // it cannot be legitimately accessed.
   LangOptions::TrivialAutoVarInitKind trivialAutoVarInit =
   (D.isConstexpr()
? LangOptions::TrivialAutoVarInitKind::Uninitialized
: (D.getAttr()
   ? LangOptions::TrivialAutoVarInitKind::Uninitialized
-  : getContext().getLangOpts().getTrivialAutoVarInit()));
+  : (isEmptyClass(D)
+ ? LangOptions::TrivialAutoVarInitKind::Uninitialized
+ : getContext()
+   .getLangOpts()
+   

[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-27 Thread serge via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGdc6f5c9b588a: [Clang][Sema] Do not try to analyze dependent 
alignment during -Wcast-align (authored by serge-sans-paille).

Changed prior to commit:
  https://reviews.llvm.org/D151753?vs=528999=534869#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D151753

Files:
  clang/docs/ReleaseNotes.rst
  clang/lib/Sema/SemaChecking.cpp
  clang/test/SemaCXX/warn-cast-align.cpp


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16351,8 +16351,12 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (VD->hasDependentAlignment())
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }
Index: clang/docs/ReleaseNotes.rst
===
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -370,6 +370,7 @@
 - Clang now diagnoses unexpected tokens after a
   ``#pragma clang|GCC diagnostic push|pop`` directive.
   (`#13920: `_)
+- Clang now does not try to analyze cast validity on variables with dependent 
alignment (`#63007: `_).
 
 Bug Fixes in This Version
 -


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16351,8 +16351,12 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (VD->hasDependentAlignment())
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }
Index: clang/docs/ReleaseNotes.rst
===
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -370,6 +370,7 @@
 - Clang now diagnoses unexpected tokens after a
   ``#pragma clang|GCC diagnostic push|pop`` directive.
   (`#13920: `_)
+- Clang now does not try to analyze cast validity on variables with dependent alignment (`#63007: `_).
 
 Bug Fixes in This Version
 -
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D153746: [Remarks] Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness

2023-06-26 Thread serge via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf686e4bbc20a: [Remarks] Make sure 
-fdiagnostics-hotness-threshold implies -fdiagnostics-show… (authored by 
serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D153746

Files:
  clang/test/Frontend/remarks-hotness.cpp
  llvm/lib/IR/LLVMRemarkStreamer.cpp


Index: llvm/lib/IR/LLVMRemarkStreamer.cpp
===
--- llvm/lib/IR/LLVMRemarkStreamer.cpp
+++ llvm/lib/IR/LLVMRemarkStreamer.cpp
@@ -96,8 +96,8 @@
 LLVMContext , StringRef RemarksFilename, StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
-Context.setDiagnosticsHotnessRequested(true);
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
+  Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
 
@@ -143,7 +143,7 @@
 LLVMContext , raw_ostream , StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
 Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
Index: clang/test/Frontend/remarks-hotness.cpp
===
--- clang/test/Frontend/remarks-hotness.cpp
+++ clang/test/Frontend/remarks-hotness.cpp
@@ -13,6 +13,13 @@
 // RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
 // RUN: | FileCheck -check-prefix=HOT_CALL %s
 
+// Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness
+// RUN: %clang_cc1 -triple x86_64-linux %s -emit-llvm-only -O3 \
+// RUN: -fprofile-sample-use=%S/Inputs/remarks-hotness.prof \
+// RUN: -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline \
+// RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
+// RUN: | FileCheck -check-prefix=HOT_CALL %s
+
 int callee1() {
   return 1;
 }


Index: llvm/lib/IR/LLVMRemarkStreamer.cpp
===
--- llvm/lib/IR/LLVMRemarkStreamer.cpp
+++ llvm/lib/IR/LLVMRemarkStreamer.cpp
@@ -96,8 +96,8 @@
 LLVMContext , StringRef RemarksFilename, StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
-Context.setDiagnosticsHotnessRequested(true);
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
+  Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
 
@@ -143,7 +143,7 @@
 LLVMContext , raw_ostream , StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
 Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
Index: clang/test/Frontend/remarks-hotness.cpp
===
--- clang/test/Frontend/remarks-hotness.cpp
+++ clang/test/Frontend/remarks-hotness.cpp
@@ -13,6 +13,13 @@
 // RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
 // RUN: | FileCheck -check-prefix=HOT_CALL %s
 
+// Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness
+// RUN: %clang_cc1 -triple x86_64-linux %s -emit-llvm-only -O3 \
+// RUN: -fprofile-sample-use=%S/Inputs/remarks-hotness.prof \
+// RUN: -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline \
+// RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
+// RUN: | FileCheck -check-prefix=HOT_CALL %s
+
 int callee1() {
   return 1;
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D153746: [Remarks] Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness

2023-06-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: weiwang.
Herald added a subscriber: hiraditya.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

When asking for -fdiagnostics-hotness-threshold, we currently require
-fdiagnostics-show-hotness otherwise we silently display nothing.

I don't see a scenario where that makes sense, so have one option impy
the other.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D153746

Files:
  clang/test/Frontend/remarks-hotness.cpp
  llvm/lib/IR/LLVMRemarkStreamer.cpp


Index: llvm/lib/IR/LLVMRemarkStreamer.cpp
===
--- llvm/lib/IR/LLVMRemarkStreamer.cpp
+++ llvm/lib/IR/LLVMRemarkStreamer.cpp
@@ -96,8 +96,8 @@
 LLVMContext , StringRef RemarksFilename, StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
-Context.setDiagnosticsHotnessRequested(true);
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
+  Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
 
@@ -143,7 +143,7 @@
 LLVMContext , raw_ostream , StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
 Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
Index: clang/test/Frontend/remarks-hotness.cpp
===
--- clang/test/Frontend/remarks-hotness.cpp
+++ clang/test/Frontend/remarks-hotness.cpp
@@ -13,6 +13,13 @@
 // RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
 // RUN: | FileCheck -check-prefix=HOT_CALL %s
 
+// Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness
+// RUN: %clang_cc1 -triple x86_64-linux %s -emit-llvm-only -O3 \
+// RUN: -fprofile-sample-use=%S/Inputs/remarks-hotness.prof \
+// RUN: -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline \
+// RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
+// RUN: | FileCheck -check-prefix=HOT_CALL %s
+
 int callee1() {
   return 1;
 }


Index: llvm/lib/IR/LLVMRemarkStreamer.cpp
===
--- llvm/lib/IR/LLVMRemarkStreamer.cpp
+++ llvm/lib/IR/LLVMRemarkStreamer.cpp
@@ -96,8 +96,8 @@
 LLVMContext , StringRef RemarksFilename, StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
-Context.setDiagnosticsHotnessRequested(true);
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
+  Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
 
@@ -143,7 +143,7 @@
 LLVMContext , raw_ostream , StringRef RemarksPasses,
 StringRef RemarksFormat, bool RemarksWithHotness,
 std::optional RemarksHotnessThreshold) {
-  if (RemarksWithHotness)
+  if (RemarksWithHotness || RemarksHotnessThreshold.value_or(1))
 Context.setDiagnosticsHotnessRequested(true);
 
   Context.setDiagnosticsHotnessThreshold(RemarksHotnessThreshold);
Index: clang/test/Frontend/remarks-hotness.cpp
===
--- clang/test/Frontend/remarks-hotness.cpp
+++ clang/test/Frontend/remarks-hotness.cpp
@@ -13,6 +13,13 @@
 // RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
 // RUN: | FileCheck -check-prefix=HOT_CALL %s
 
+// Make sure -fdiagnostics-hotness-threshold implies -fdiagnostics-show-hotness
+// RUN: %clang_cc1 -triple x86_64-linux %s -emit-llvm-only -O3 \
+// RUN: -fprofile-sample-use=%S/Inputs/remarks-hotness.prof \
+// RUN: -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline \
+// RUN: -fdiagnostics-hotness-threshold=auto 2>&1 \
+// RUN: | FileCheck -check-prefix=HOT_CALL %s
+
 int callee1() {
   return 1;
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-25 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Gentle ping :-)


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

https://reviews.llvm.org/D151753

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


[PATCH] D152771: [docs] Fix LibTooling documentation for OptionsParser change

2023-06-12 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

I'm fine with the change. It would be great if this could `literalinclude` 
these two sample codes  (as in 
https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-literalinclude)
 and have them being compiled as part of the validation process. That way we 
would avoid such doc-bit-rotting (?) in the future. This require some effort so 
I'm still okay if you don't give it a try, in which case I will do. Please tell 
me!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D152771

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


[PATCH] D152396: [clang][doc] Rescue some deleted bits of the command-line reference.

2023-06-07 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

Another argument for not having generated file in-tree. Thanks for doing this.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D152396

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


[PATCH] D151594: [clang-tidy] Optimize misc-confusable-identifiers

2023-06-07 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

LGTM with a minor nit. Thanks for the optimization!




Comment at: clang-tools-extra/clang-tidy/misc/ConfusableIdentifierCheck.cpp:124
+if (ND0->getAccess() != AS_private && isMemberOf(DC0, DC1))
+  return true;
+  }

I <3 this simplification. It's more difficult to understand though, could you 
add a small content along those lines: `if any of the declaration is a 
non-private member of the other declaration, it's shadowed by the former`


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D151594

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


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-06 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:16163
+// Dependent alignment cannot be resolved -> bail out.
+if (any_of(VD->specific_attrs(),
+   [](auto *A) { return A->isAlignmentDependent(); }))

shafik wrote:
> Can't we just use `hasDependentAlignment()` which basically does this.
> 
> I am curious that we don't have to do this check in every location we use 
> `getDeclAlign`
I missed that method, thanks for point it out. I think we should be doing that 
check in the other reference in SemaChecking.cpp, but I failed to find a 
reproducer...


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

https://reviews.llvm.org/D151753

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


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-06 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D151753#4383602 , @Fznamznon wrote:

> Have you checked that it fixes the non-reduced original example?

Just did and it passes.


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

https://reviews.llvm.org/D151753

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


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-06 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 528999.
serge-sans-paille added a comment.

Take review into account


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

https://reviews.llvm.org/D151753

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/SemaCXX/warn-cast-align.cpp


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16158,8 +16158,12 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (VD->hasDependentAlignment())
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16158,8 +16158,12 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (VD->hasDependentAlignment())
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151783: [clang] Use the appropriate definition when checking FunctionDecl::isInlineBuiltinDeclaration

2023-05-31 Thread serge via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG1676b1ff63af: [clang] Use the appropriate definition when 
checking FunctionDecl… (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D151783

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c


Index: clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
===
--- /dev/null
+++ clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple i686-w64-mingw32 -S -emit-llvm -disable-llvm-passes 
-o - %s | FileCheck %s
+//
+// Verifies that clang detects memcpy inline version and uses it instead of 
the builtin.
+// Checks that clang correctly walks through multiple forward declaration.
+
+typedef unsigned int size_t;
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) 
__attribute__((__artificial__))
+void *memcpy(void *__dst, const void *__src, size_t __n)
+{
+  return __builtin___memcpy_chk(__dst, __src, __n, 
__builtin_object_size((__dst), ((0) > 0) && (2 > 1)));
+}
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+char *a, *b;
+void func(void) {
+memcpy(a, b, 42);
+}
+
+// CHECK-LABEL: define {{.*}} @func(
+// CHECK: call ptr @memcpy.inline
+
+// CHECK-LABEL: declare {{.*}} @memcpy(
+
+// CHECK-LABEL: define {{.*}} @memcpy.inline(
+// CHECK: call ptr @__memcpy_chk
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3322,7 +3322,7 @@
 return false;
 
   ASTContext  = getASTContext();
-  switch (Context.GetGVALinkageForFunction(this)) {
+  switch (Context.GetGVALinkageForFunction(Definition)) {
   case GVA_Internal:
   case GVA_DiscardableODR:
   case GVA_StrongODR:


Index: clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
===
--- /dev/null
+++ clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple i686-w64-mingw32 -S -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
+//
+// Verifies that clang detects memcpy inline version and uses it instead of the builtin.
+// Checks that clang correctly walks through multiple forward declaration.
+
+typedef unsigned int size_t;
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) __attribute__((__artificial__))
+void *memcpy(void *__dst, const void *__src, size_t __n)
+{
+  return __builtin___memcpy_chk(__dst, __src, __n, __builtin_object_size((__dst), ((0) > 0) && (2 > 1)));
+}
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+char *a, *b;
+void func(void) {
+memcpy(a, b, 42);
+}
+
+// CHECK-LABEL: define {{.*}} @func(
+// CHECK: call ptr @memcpy.inline
+
+// CHECK-LABEL: declare {{.*}} @memcpy(
+
+// CHECK-LABEL: define {{.*}} @memcpy.inline(
+// CHECK: call ptr @__memcpy_chk
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3322,7 +3322,7 @@
 return false;
 
   ASTContext  = getASTContext();
-  switch (Context.GetGVALinkageForFunction(this)) {
+  switch (Context.GetGVALinkageForFunction(Definition)) {
   case GVA_Internal:
   case GVA_DiscardableODR:
   case GVA_StrongODR:
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D148723: [clang] Restrict Inline Builtin to non-static, non-odr linkage

2023-05-31 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Companion patch that fixes the issue reported by @mstorsjo  : 
https://reviews.llvm.org/D151783


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

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


[PATCH] D151783: [clang] Use the appropriate definition when checking FunctionDecl::isInlineBuiltinDeclaration

2023-05-31 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added a reviewer: mstorsjo.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This is a follow-up to https://reviews.llvm.org/D148723 and fixes the
bug reported by @mstorsjo.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D151783

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c


Index: clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
===
--- /dev/null
+++ clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple i686-w64-mingw32 -S -emit-llvm -disable-llvm-passes 
-o - %s | FileCheck %s
+//
+// Verifies that clang detects memcpy inline version and uses it instead of 
the builtin.
+// Checks that clang correctly walks through multiple forward declaration.
+
+typedef unsigned int size_t;
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) 
__attribute__((__artificial__))
+void *memcpy(void *__dst, const void *__src, size_t __n)
+{
+  return __builtin___memcpy_chk(__dst, __src, __n, 
__builtin_object_size((__dst), ((0) > 0) && (2 > 1)));
+}
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+char *a, *b;
+void func(void) {
+memcpy(a, b, 42);
+}
+
+// CHECK-LABEL: define {{.*}} @func(
+// CHECK: call ptr @memcpy.inline
+
+// CHECK-LABEL: declare {{.*}} @memcpy(
+
+// CHECK-LABEL: define {{.*}} @memcpy.inline(
+// CHECK: call ptr @__memcpy_chk
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3322,7 +3322,7 @@
 return false;
 
   ASTContext  = getASTContext();
-  switch (Context.GetGVALinkageForFunction(this)) {
+  switch (Context.GetGVALinkageForFunction(Definition)) {
   case GVA_Internal:
   case GVA_DiscardableODR:
   case GVA_StrongODR:


Index: clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
===
--- /dev/null
+++ clang/test/CodeGen/memcpy-inline-builtin-mutliple-decl.c
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple i686-w64-mingw32 -S -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
+//
+// Verifies that clang detects memcpy inline version and uses it instead of the builtin.
+// Checks that clang correctly walks through multiple forward declaration.
+
+typedef unsigned int size_t;
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) __attribute__((__artificial__))
+void *memcpy(void *__dst, const void *__src, size_t __n)
+{
+  return __builtin___memcpy_chk(__dst, __src, __n, __builtin_object_size((__dst), ((0) > 0) && (2 > 1)));
+}
+
+void *memcpy(void *_Dst, const void *_Src, size_t _Size);
+
+char *a, *b;
+void func(void) {
+memcpy(a, b, 42);
+}
+
+// CHECK-LABEL: define {{.*}} @func(
+// CHECK: call ptr @memcpy.inline
+
+// CHECK-LABEL: declare {{.*}} @memcpy(
+
+// CHECK-LABEL: define {{.*}} @memcpy.inline(
+// CHECK: call ptr @__memcpy_chk
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3322,7 +3322,7 @@
 return false;
 
   ASTContext  = getASTContext();
-  switch (Context.GetGVALinkageForFunction(this)) {
+  switch (Context.GetGVALinkageForFunction(Definition)) {
   case GVA_Internal:
   case GVA_DiscardableODR:
   case GVA_StrongODR:
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-05-30 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: dim, Fznamznon.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Fix #63007


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D151753

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/SemaCXX/warn-cast-align.cpp


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16158,8 +16158,13 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (any_of(VD->specific_attrs(),
+   [](auto *A) { return A->isAlignmentDependent(); }))
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }


Index: clang/test/SemaCXX/warn-cast-align.cpp
===
--- clang/test/SemaCXX/warn-cast-align.cpp
+++ clang/test/SemaCXX/warn-cast-align.cpp
@@ -44,6 +44,11 @@
   c = IntPtr(P);
 }
 
+template  void DependentAlign() {
+  alignas(A) int lut[]{};
+  (long *)lut; // expected-warning {{cast from 'int *' to 'long *'}}
+}
+
 struct __attribute__((aligned(16))) AlignedS {
   char m[16];
 };
Index: clang/lib/Sema/SemaChecking.cpp
===
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -16158,8 +16158,13 @@
 if (auto *VD = dyn_cast(cast(E)->getDecl())) {
   // FIXME: If VD is captured by copy or is an escaping __block variable,
   // use the alignment of VD's type.
-  if (!VD->getType()->isReferenceType())
+  if (!VD->getType()->isReferenceType()) {
+// Dependent alignment cannot be resolved -> bail out.
+if (any_of(VD->specific_attrs(),
+   [](auto *A) { return A->isAlignmentDependent(); }))
+  break;
 return std::make_pair(Ctx.getDeclAlign(VD), CharUnits::Zero());
+  }
   if (VD->hasInit())
 return getBaseAlignmentAndOffsetFromLValue(VD->getInit(), Ctx);
 }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D148723: [clang] Restrict Inline Builtin to non-static, non-odr linkage

2023-05-30 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D148723#4380165 , @mstorsjo wrote:

> This causes failed asserts with `_FORTIFY_SOURCE` with the mingw-w64 headers. 
> Here's a reduced reproducer:
>
>   $ cat reduced.c
>   typedef unsigned int size_t;
>   
>   void *memcpy(void *_Dst, const void *_Src, size_t _Size);
>   
>   extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) 
> __attribute__((__artificial__)) 
>   void *memcpy(void *__dst, const void *__src, size_t __n) 
>   {
> return __builtin___memcpy_chk(__dst, __src, __n, 
> __builtin_object_size((__dst), ((0) > 0) && (2 > 1))); 
>   } 
>   
>   void *memcpy(void *_Dst, const void *_Src, size_t _Size);
>   
>   char *a, *b;
>   void func(void) {
>   memcpy(a, b, 42);
>   }
>   $ clang -target i686-w64-mingw32 -c reduced.c -O2
>   clang: ../../clang/lib/AST/Decl.cpp:3763: bool 
> clang::FunctionDecl::isInlineDefinitionExternallyVisible() const: Assertion 
> `(doesThisDeclarationHaveABody() || willHaveBody() || hasAttr()) 
> && "Must be a function definition"' failed.
>
> Here, the second declaration of the regular extern version of the function is 
> what is triggering the issue.
>
> Can we revert this to unbreak my builds until we have a fix?

I can't reproduce locally. Can you check your reproducer on current main?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Restrict Inline Builtin to non-static, non-odr linkage

2023-05-29 Thread serge via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGe20931b2ccd1: [clang] Restrict Inline Builtin to non-static, 
non-odr linkage (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/inline-builtin-comdat.c


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes 
%s -o - | FileCheck %s
+// Inline builtin are not supported for odr linkage
+// CHECK-NOT: .inline
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double 
__x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3314,8 +3314,23 @@
 return false;
 
   const FunctionDecl *Definition;
-  return hasBody(Definition) && Definition->isInlineSpecified() &&
- Definition->hasAttr();
+  if (!hasBody(Definition))
+return false;
+
+  if (!Definition->isInlineSpecified() ||
+  !Definition->hasAttr())
+return false;
+
+  ASTContext  = getASTContext();
+  switch (Context.GetGVALinkageForFunction(this)) {
+  case GVA_Internal:
+  case GVA_DiscardableODR:
+  case GVA_StrongODR:
+return false;
+  case GVA_AvailableExternally:
+  case GVA_StrongExternal:
+return true;
+  }
 }
 
 bool FunctionDecl::isDestroyingOperatorDelete() const {


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
+// Inline builtin are not supported for odr linkage
+// CHECK-NOT: .inline
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double __x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3314,8 +3314,23 @@
 return false;
 
   const FunctionDecl *Definition;
-  return hasBody(Definition) && Definition->isInlineSpecified() &&
- Definition->hasAttr();
+  if (!hasBody(Definition))
+return false;
+
+  if (!Definition->isInlineSpecified() ||
+  !Definition->hasAttr())
+return false;
+
+  ASTContext  = getASTContext();
+  switch (Context.GetGVALinkageForFunction(this)) {
+  case GVA_Internal:
+  case GVA_DiscardableODR:
+  case GVA_StrongODR:
+return false;
+  case GVA_AvailableExternally:
+  case GVA_StrongExternal:
+return true;
+  }
 }
 
 bool FunctionDecl::isDestroyingOperatorDelete() const {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D148723: [clang] Restrict Inline Builtin to non-static, non-odr linkage

2023-05-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

@jyu2 : could you test that patch in your setup ? Also I can't find the bug id 
associated with your original bug anymore...


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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Restrict Inline Builtin to non-static, non-odr linkage

2023-05-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 526059.
serge-sans-paille retitled this revision from "[clang] Fix comdat for 
InlineBuiltin declarations" to "[clang] Restrict Inline Builtin to non-static, 
non-odr linkage".
serge-sans-paille edited the summary of this revision.
serge-sans-paille added a comment.

Add a linkage check to further restrict what's an inline builtin.


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

https://reviews.llvm.org/D148723

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/inline-builtin-comdat.c


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes 
%s -o - | FileCheck %s
+// Inline builtin are not supported for odr linkage
+// CHECK-NOT: .inline
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double 
__x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3301,8 +3301,23 @@
 return false;
 
   const FunctionDecl *Definition;
-  return hasBody(Definition) && Definition->isInlineSpecified() &&
- Definition->hasAttr();
+  if (!hasBody(Definition))
+return false;
+
+  if (!Definition->isInlineSpecified() ||
+  !Definition->hasAttr())
+return false;
+
+  ASTContext  = getASTContext();
+  switch (Context.GetGVALinkageForFunction(this)) {
+  case GVA_Internal:
+  case GVA_DiscardableODR:
+  case GVA_StrongODR:
+return false;
+  case GVA_AvailableExternally:
+  case GVA_StrongExternal:
+return true;
+  }
 }
 
 bool FunctionDecl::isDestroyingOperatorDelete() const {


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
+// Inline builtin are not supported for odr linkage
+// CHECK-NOT: .inline
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double __x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3301,8 +3301,23 @@
 return false;
 
   const FunctionDecl *Definition;
-  return hasBody(Definition) && Definition->isInlineSpecified() &&
- Definition->hasAttr();
+  if (!hasBody(Definition))
+return false;
+
+  if (!Definition->isInlineSpecified() ||
+  !Definition->hasAttr())
+return false;
+
+  ASTContext  = getASTContext();
+  switch (Context.GetGVALinkageForFunction(this)) {
+  case GVA_Internal:
+  case GVA_DiscardableODR:
+  case GVA_StrongODR:
+return false;
+  case GVA_AvailableExternally:
+  case GVA_StrongExternal:
+return true;
+  }
 }
 
 bool FunctionDecl::isDestroyingOperatorDelete() const {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151051: [clang-tidy] Optimize misc-confusable-identifiers

2023-05-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

Memoizing the calls to getPrimaryContext()... LGTM!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D151051

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


[PATCH] D148723: [clang] Fix comdat for InlineBuiltin declarations

2023-05-19 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 523747.
serge-sans-paille retitled this revision from "[clang] Enforce external linkage 
for inline builtin original declaration" to "[clang] Fix comdat for 
InlineBuiltin declarations".
serge-sans-paille edited the summary of this revision.

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

https://reviews.llvm.org/D148723

Files:
  clang/lib/AST/Decl.cpp
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/test/CodeGen/inline-builtin-asm-name.c
  clang/test/CodeGen/inline-builtin-comdat.c
  clang/test/CodeGen/pr9614.c

Index: clang/test/CodeGen/pr9614.c
===
--- clang/test/CodeGen/pr9614.c
+++ clang/test/CodeGen/pr9614.c
@@ -37,9 +37,9 @@
 // CHECK: call void @llvm.prefetch.p0(
 // CHECK: call ptr @memchr(
 // CHECK: ret void
-
-// CHECK: declare void @foo()
-// CHECK: declare i32 @abs(i32
-// CHECK: declare ptr @strrchr(ptr noundef, i32 noundef)
-// CHECK: declare ptr @memchr(
-// CHECK: declare void @llvm.prefetch.p0(
+//
+// CHECK-LABEL: declare void @foo()
+// CHECK-LABEL: declare i32 @abs(i32
+// CHECK-LABEL: declare ptr @strrchr(ptr noundef, i32 noundef)
+// CHECK-LABEL: declare ptr @memchr(
+// CHECK-LABEL: declare void @llvm.prefetch.p0(
Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
+// Make sure we don't add definition for Inline Builtinsto any comdat.
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double __x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
+
+// CHECK-LABEL: define dso_local double @pain(
+// CHECK:call double @frexpl.inline(
+//
+// CHECK-LABEL: declare dso_local double @frexpl(
+//
+// CHECK-LABEL: define internal double @frexpl.inline(
+// CHECK:   call double @frexp
+//
+// CHECK-LABEL: declare dso_local double @frexp(
Index: clang/test/CodeGen/inline-builtin-asm-name.c
===
--- clang/test/CodeGen/inline-builtin-asm-name.c
+++ clang/test/CodeGen/inline-builtin-asm-name.c
@@ -1,14 +1,14 @@
 // RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -o - %s -disable-llvm-optzns | FileCheck %s
 
+// CHECK-LABEL: define dso_local void @call(ptr noundef %fmt, ...)
 // CHECK: call i32 @"\01_asm_func_name.inline"
-
-// CHECK: declare dso_local i32 @"\01_asm_func_name"(ptr noundef, i32 noundef, ptr noundef, ptr noundef)
-
-// CHECK: define internal i32 @"\01_asm_func_name.inline"
-
+//
+// CHECK-LABEL: declare dso_local i32 @"\01_asm_func_name"(ptr noundef, i32 noundef, ptr noundef, ptr noundef)
+//
+// CHECK-LABEL: define internal i32 @"\01_asm_func_name.inline"(
 // CHECK: call i32 @__mingw_vsnprintf
-
-// CHECK: declare dso_local i32 @__mingw_vsnprintf
+//
+// CHECK-LABEL: declare dso_local i32 @__mingw_vsnprintf
 
 typedef unsigned int size_t;
 
Index: clang/lib/CodeGen/CodeGenModule.cpp
===
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -4813,6 +4813,10 @@
   if (D.hasAttr())
 return true;
 
+  FunctionDecl const *FD;
+  if ((FD = dyn_cast()) && FD->isInlineBuiltinDeclaration())
+return false;
+
   GVALinkage Linkage;
   if (auto *VD = dyn_cast())
 Linkage = CGM.getContext().GetGVALinkageForVariable(VD);
Index: clang/lib/AST/Decl.cpp
===
--- clang/lib/AST/Decl.cpp
+++ clang/lib/AST/Decl.cpp
@@ -3300,6 +3300,9 @@
   if (!getBuiltinID())
 return false;
 
+  if (getLanguageLinkage() != CLanguageLinkage)
+return false;
+
   const FunctionDecl *Definition;
   return hasBody(Definition) && Definition->isInlineSpecified() &&
  Definition->hasAttr();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D148723: [clang] Enforce external linkage for inline builtin original declaration

2023-05-19 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

> So if isInlineBuiltinDeclaration() simply returns false for C++ code, 
> everything should just work, without messing with the linkage.

Unfortunately not. See the example from 
`clang/test/CodeGen/inline-builtin-comdat.c` above. There's no C++ involved, 
the actual issue is that the initial Global Declacaration is stripped from its 
body which is moved to it's `.inline` suffixed version. But during codegen, if 
we don't take into account the fact that it's an inline builtin, we still put 
it in a COMDAT (because it's *inline*) while it shouldn't (because it's a 
declaration. I've uploaded a new patch that should be slightly less intrusive.


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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce external linkage for inline builtin original declaration

2023-05-02 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D148723#4296111 , @efriedma wrote:

> I'm a little concerned that this will explode in unexpected ways... in 
> particular, it'll fail to link if the function doesn't actually exist 
> externally.  Which it probably doesn't if it would otherwise be linkonce_odr.

Let me summarize current approach and the problem it tries to solve in order to 
find a solution (I'm not claiming current solution is the best).

Some code define an always inline version of existing builtins. This has 
happened in the past in the case of Fortified source, and also for in some 
math.h header. Previous behavior of clang was to ignore the actual definition 
because it knew the builtin behavior and directly replaced it by a builtin 
call. This was not satisfying because this by-passed fortified implementation 
of these builtins.

What we were doing before extending the scope of what is an inline builtin was 
to detect inline, always-inline, gnu-inline functions and rename them into 
`.inline`, updating all call site (except the trivially recursive 
ones) to call this version. The original definition remained but got stripped 
of its body (so that the `.inline` version could call it in a 
non-recursive manner), turning it into a declaration. This declaration kept its 
original attribute, which made it fall into a COMDAT section which is invalid. 
What this patch is trying to achieve is to massage the original definition in 
such a way that it's compatible with the other assumptions.

Writing this I realize that I could also remove its inline / always_inline 
attribute when it's stripped of its body, that maybe enough.

What this p


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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce external linkage for inline builtin original declaration

2023-05-02 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D148723#4296112 , @efriedma wrote:

> Really, I'd prefer to keep isInlineBuiltinDeclaration() targeted as narrowly 
> as possible; part of that is making it not trigger for C++ inline functions 
> (which it never did in the past).

I second that. Unfortunately the original bug showcase a situation that no 
longer holds the GNUinline attribute 
https://github.com/llvm/llvm-project/issues/61691


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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce external linkage for inline builtin original declaration

2023-04-25 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 516645.
serge-sans-paille retitled this revision from "[clang] Enforce internal linkage 
for inline builtin" to "[clang] Enforce external linkage for inline builtin 
original declaration".
serge-sans-paille edited the summary of this revision.
serge-sans-paille added a comment.
Herald added a subscriber: mstorsjo.

Change approach and update test case accordingly.


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

https://reviews.llvm.org/D148723

Files:
  clang/lib/AST/ASTContext.cpp
  clang/test/CodeGen/asm-label-inline-builtins.c
  clang/test/CodeGen/inline-builtin-asm-name.c
  clang/test/CodeGen/inline-builtin-comdat.c
  clang/test/CodeGen/pr9614.c

Index: clang/test/CodeGen/pr9614.c
===
--- clang/test/CodeGen/pr9614.c
+++ clang/test/CodeGen/pr9614.c
@@ -30,6 +30,8 @@
   memchr("", '.', 0);
 }
 
+// CHECK-LABEL: declare i32 @abs(i32
+//
 // CHECK-LABEL: define{{.*}} void @f()
 // CHECK: call void @foo()
 // CHECK: call i32 @abs(i32 noundef %0)
@@ -37,9 +39,8 @@
 // CHECK: call void @llvm.prefetch.p0(
 // CHECK: call ptr @memchr(
 // CHECK: ret void
-
-// CHECK: declare void @foo()
-// CHECK: declare i32 @abs(i32
-// CHECK: declare ptr @strrchr(ptr noundef, i32 noundef)
-// CHECK: declare ptr @memchr(
-// CHECK: declare void @llvm.prefetch.p0(
+//
+// CHECK-LABEL: declare void @foo()
+// CHECK-LABEL: declare ptr @strrchr(ptr noundef, i32 noundef)
+// CHECK-LABEL: declare ptr @memchr(
+// CHECK-LABEL: declare void @llvm.prefetch.p0(
Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
+// Make sure we don't generate definition for Inline Builtins, and that all
+// linkage are compatible with comdat rules.
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double __x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
+
+// CHECK-NOT: define {{.*}} @frexpl(
+//
+// CHECK-LABEL: declare dso_local double @frexpl(
+//
+// CHECK-LABEL: define internal double @frexpl.inline(
+// CHECK:   call double @frexp
+//
+// CHECK-LABEL: declare dso_local double @frexp(
+//
+// CHECK-LABEL: define dso_local double @pain(
+// CHECK:call double @frexpl.inline(
Index: clang/test/CodeGen/inline-builtin-asm-name.c
===
--- clang/test/CodeGen/inline-builtin-asm-name.c
+++ clang/test/CodeGen/inline-builtin-asm-name.c
@@ -1,14 +1,14 @@
 // RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -o - %s -disable-llvm-optzns | FileCheck %s
 
-// CHECK: call i32 @"\01_asm_func_name.inline"
-
-// CHECK: declare dso_local i32 @"\01_asm_func_name"(ptr noundef, i32 noundef, ptr noundef, ptr noundef)
-
-// CHECK: define internal i32 @"\01_asm_func_name.inline"
-
+// CHECK-LABEL: declare dso_local i32 @"\01_asm_func_name"(ptr noundef, i32 noundef, ptr noundef, ptr noundef)
+//
+// CHECK-LABEL: define internal i32 @"\01_asm_func_name.inline"(
 // CHECK: call i32 @__mingw_vsnprintf
-
-// CHECK: declare dso_local i32 @__mingw_vsnprintf
+//
+// CHECK-LABEL: declare dso_local i32 @__mingw_vsnprintf
+//
+// CHECK-LABEL: define dso_local void @call(ptr noundef %fmt, ...)
+// CHECK: call i32 @"\01_asm_func_name.inline"
 
 typedef unsigned int size_t;
 
Index: clang/test/CodeGen/asm-label-inline-builtins.c
===
--- clang/test/CodeGen/asm-label-inline-builtins.c
+++ clang/test/CodeGen/asm-label-inline-builtins.c
@@ -25,8 +25,8 @@
   vprintf(fmt, ap);
 }
 
-// CHECK-LABEL: void @test(
-// CHECK: call i32 @__vprintfieee128.inline(
-//
 // CHECK-LABEL: internal i32 @__vprintfieee128.inline(
 // CHECK: call i32 @__vfprintf_chkieee128(
+//
+// CHECK-LABEL: void @test(
+// CHECK: call i32 @__vprintfieee128.inline(
Index: clang/lib/AST/ASTContext.cpp
===
--- clang/lib/AST/ASTContext.cpp
+++ clang/lib/AST/ASTContext.cpp
@@ -11552,6 +11552,11 @@
   if (!FD->isExternallyVisible())
 return GVA_Internal;
 
+  // Inline Builtin declaration are forward declared as external and their
+  // actual implementation is provided under the ".inline" declaration.
+  if (FD->isInlineBuiltinDeclaration())
+return GVA_StrongExternal;
+
   // Non-user-provided functions get emitted as weak definitions with every
   // use, no matter whether they've been explicitly instantiated etc.
   if (!FD->isUserProvided())
___
cfe-commits mailing list

[PATCH] D148723: [clang] Enforce internal linkage for inline builtin

2023-04-20 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/CodeGen/CodeGenModule.cpp:5192
 
-  if (const auto *FD = D->getAsFunction())
+  if (const auto *FD = D->getAsFunction()) {
 if (FD->isMultiVersion() && Linkage == GVA_AvailableExternally)

erichkeane wrote:
> Is this an unrelated change?
indeed ^^!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce internal linkage for inline builtin

2023-04-20 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/AST/ASTContext.cpp:11538
  const FunctionDecl *FD) {
-  if (!FD->isExternallyVisible())
+  if (!FD->isExternallyVisible() || FD->isInlineBuiltinDeclaration())
 return GVA_Internal;

jyu2 wrote:
> How about __declspec(dllimpor/dllexprort) __forceinline fexprl?
Out of curiosity : where does the failing code comes from? A standard library 
or user-specific code? I assume standard library, in that case would you mind 
sharing a link to the source? I'm trying to understand the meaning we would 
like to give to an inline builtin with external linkage but force inline 
attribute. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce internal linkage for inline builtin

2023-04-20 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D148723#4280916 , @efriedma wrote:

> This seems like a weird way to fix this.

I agree, not a big fan either. But wanting to start the bike shedding in some 
way.

> The point of an "inline builtin" is that the inline function is actually the 
> original function; it's just the inline implementation is only used in 
> limited circumstances (in particular, it can't be used recursively).  
> Changing the linkage could have unexpected side-effects.

That's not my understanding. An inline builtin provides an alternate 
implementation of the builtin that usually wraps the original builtin in some 
way. It's not meant to be externally visible (it would probably collide with 
libc's implementation in that case).

> Maybe it makes sense to restore some form of the "GNUInlineAttr" check in 
> isInlineBuiltinDeclaration.  But instead of actually checking for the 
> attribute, check that the function would be emitted with available_externally 
> linkage.  So "inline builtins" don't exist on Windows because inline 
> functions are linkonce_odr.  But we still detect builtins that are declared 
> `inline` instead of `extern inline __attribute((gnu_inline))`.

I'll give this some thoughts / experiments. Thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148723

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


[PATCH] D148723: [clang] Enforce internal linkage for inline builtin

2023-04-19 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: jyu2, efriedma.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Otherwise we end up with link once odr because of the inline keyword, which 
translates to comdat in windows world. But we prune the body and that's 
inconsistent...
See https://godbolt.org/z/z9G87Wr37 for the original failing test case


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D148723

Files:
  clang/lib/AST/ASTContext.cpp
  clang/lib/CodeGen/CodeGenModule.cpp
  clang/test/CodeGen/inline-builtin-comdat.c


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm %s -o - | FileCheck %s
+// Make sure we don't generate definition for Inline Builtins on windows
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double 
__x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
+
+// CHECK-NOT: define{{.*}}@frexpl(
+// CHECK: define dso_local double @pain
+// CHECK:[[CALL_I:%.*]] = call double @frexp(double noundef [[TMP2]], ptr 
noundef [[TMP1]]) #[[ATTR3:[0-9]+]]
+// CHECK: declare dso_local double @frexp(double noundef, ptr noundef)
Index: clang/lib/CodeGen/CodeGenModule.cpp
===
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -5189,9 +5189,10 @@
   if (D->hasAttr())
 return llvm::GlobalVariable::WeakAnyLinkage;
 
-  if (const auto *FD = D->getAsFunction())
+  if (const auto *FD = D->getAsFunction()) {
 if (FD->isMultiVersion() && Linkage == GVA_AvailableExternally)
   return llvm::GlobalVariable::LinkOnceAnyLinkage;
+  }
 
   // We are guaranteed to have a strong definition somewhere else,
   // so we can use available_externally linkage.
Index: clang/lib/AST/ASTContext.cpp
===
--- clang/lib/AST/ASTContext.cpp
+++ clang/lib/AST/ASTContext.cpp
@@ -11535,7 +11535,7 @@
 
 static GVALinkage basicGVALinkageForFunction(const ASTContext ,
  const FunctionDecl *FD) {
-  if (!FD->isExternallyVisible())
+  if (!FD->isExternallyVisible() || FD->isInlineBuiltinDeclaration())
 return GVA_Internal;
 
   // Non-user-provided functions get emitted as weak definitions with every


Index: clang/test/CodeGen/inline-builtin-comdat.c
===
--- /dev/null
+++ clang/test/CodeGen/inline-builtin-comdat.c
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -triple x86_64-windows -S -emit-llvm %s -o - | FileCheck %s
+// Make sure we don't generate definition for Inline Builtins on windows
+
+double __cdecl frexp( double _X, int* _Y);
+inline __attribute__((always_inline))  long double __cdecl frexpl( long double __x, int *__exp ) {
+  return (long double) frexp((double)__x, __exp );
+}
+
+long double pain(void)
+{
+long double f = 123.45;
+int i;
+long double f2 = frexpl(f, );
+return f2;
+}
+
+// CHECK-NOT: define{{.*}}@frexpl(
+// CHECK: define dso_local double @pain
+// CHECK:[[CALL_I:%.*]] = call double @frexp(double noundef [[TMP2]], ptr noundef [[TMP1]]) #[[ATTR3:[0-9]+]]
+// CHECK: declare dso_local double @frexp(double noundef, ptr noundef)
Index: clang/lib/CodeGen/CodeGenModule.cpp
===
--- clang/lib/CodeGen/CodeGenModule.cpp
+++ clang/lib/CodeGen/CodeGenModule.cpp
@@ -5189,9 +5189,10 @@
   if (D->hasAttr())
 return llvm::GlobalVariable::WeakAnyLinkage;
 
-  if (const auto *FD = D->getAsFunction())
+  if (const auto *FD = D->getAsFunction()) {
 if (FD->isMultiVersion() && Linkage == GVA_AvailableExternally)
   return llvm::GlobalVariable::LinkOnceAnyLinkage;
+  }
 
   // We are guaranteed to have a strong definition somewhere else,
   // so we can use available_externally linkage.
Index: clang/lib/AST/ASTContext.cpp
===
--- clang/lib/AST/ASTContext.cpp
+++ clang/lib/AST/ASTContext.cpp
@@ -11535,7 +11535,7 @@
 
 static GVALinkage basicGVALinkageForFunction(const ASTContext ,
  const FunctionDecl *FD) {
-  if (!FD->isExternallyVisible())
+  if (!FD->isExternallyVisible() || FD->isInlineBuiltinDeclaration())
 return GVA_Internal;
 
   // Non-user-provided functions get emitted as weak definitions with every
___
cfe-commits mailing list

[PATCH] D147307: [clang] Do not require GNUInlineAttr for inline builtins

2023-04-19 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D147307#4279337 , @jyu2 wrote:

> This change seems cause assert:
>
> https://godbolt.org/z/z9G87Wr37

I can reproduce, investigating...


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D147307

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


[PATCH] D147307: [clang] Do not require GNUInlineAttr for inline builtins

2023-04-13 Thread serge via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfd8745c252bc: [clang] Do not require GNUInlineAttr for 
inline builtins (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D147307

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/memcpy-inline-builtin.c
  clang/test/CodeGen/pr9614.c

Index: clang/test/CodeGen/pr9614.c
===
--- clang/test/CodeGen/pr9614.c
+++ clang/test/CodeGen/pr9614.c
@@ -32,7 +32,7 @@
 
 // CHECK-LABEL: define{{.*}} void @f()
 // CHECK: call void @foo()
-// CHECK: call i32 @abs(i32 noundef 0)
+// CHECK: call i32 @abs(i32 noundef %0)
 // CHECK: call ptr @strrchr(
 // CHECK: call void @llvm.prefetch.p0(
 // CHECK: call ptr @memchr(
Index: clang/test/CodeGen/memcpy-inline-builtin.c
===
--- clang/test/CodeGen/memcpy-inline-builtin.c
+++ clang/test/CodeGen/memcpy-inline-builtin.c
@@ -3,18 +3,27 @@
 // RUN: %clang_cc1 -triple x86_64 -S -emit-llvm -o - %s | FileCheck %s
 //
 // Verifies that clang detects memcpy inline version and uses it instead of the builtin.
+// Checks alternate version with the `artificial` attribute.
 
 typedef unsigned long size_t;
 
 // Clang requires these attributes for a function to be redefined.
 #define AVAILABLE_EXTERNALLY extern inline __attribute__((always_inline)) __attribute__((gnu_inline))
 
+#define AVAILABLE_EXTERNALLY_ALTERNATE extern inline __attribute__((__always_inline__)) __attribute__((__artificial__))
+
 // Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
 AVAILABLE_EXTERNALLY void *memcpy(void *a, const void *b, size_t c) {
   asm("# memcpy.inline marker");
   return __builtin_memcpy(a, b, c);
 }
 
+// Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
+AVAILABLE_EXTERNALLY_ALTERNATE void *memmove(void *a, const void *b, size_t c) {
+  asm("# memmove.inline marker");
+  return __builtin_memmove(a, b, c);
+}
+
 // CHECK-LABEL: @foo(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
@@ -43,6 +52,34 @@
   return memcpy(a, b, c);
 }
 
+// CHECK-LABEL: @foo_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR_I:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
+// CHECK-NEXT:[[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:store ptr [[TMP0]], ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:store ptr [[TMP1]], ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:store i64 [[TMP2]], ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void asm sideeffect "# memmove.inline marker", "~{dirflag},~{fpsr},~{flags}"() #[[ATTR3]], !srcloc !3
+// CHECK-NEXT:[[TMP3:%.*]] = load ptr, ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP4:%.*]] = load ptr, ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP5:%.*]] = load i64, ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void @llvm.memmove.p0.p0.i64(ptr align 1 [[TMP3]], ptr align 1 [[TMP4]], i64 [[TMP5]], i1 false)
+// CHECK-NEXT:ret ptr [[TMP3]]
+//
+void *foo_alt(void *a, const void *b, size_t c) {
+  return memmove(a, b, c);
+}
+
 // CHECK-LABEL: @bar(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
@@ -68,3 +105,29 @@
   void *(*cpy)(void *, const void *, size_t) = c > 10 ? memcpy : foo;
   cpy(a, b, c);
 }
+
+// CHECK-LABEL: @bar_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[CPY:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[CMP:%.*]] = icmp ugt i64 [[TMP0]], 10
+// CHECK-NEXT:[[TMP1:%.*]] = zext i1 [[CMP]] to i64
+// CHECK-NEXT:[[COND:%.*]] = select i1 [[CMP]], ptr @memmove, ptr @foo_alt
+// CHECK-NEXT:store ptr [[COND]], ptr [[CPY]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load ptr, ptr [[CPY]], align 8
+// CHECK-NEXT:[[TMP3:%.*]] = load ptr, ptr 

[PATCH] D147307: [clang] Do not require GNUInlineAttr for inline builtins

2023-04-04 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 510752.
serge-sans-paille retitled this revision from "[clang] Consider artificial 
always inline builtin as inline builtins" to "[clang] Do not require 
GNUInlineAttr for inline builtins".
serge-sans-paille added a comment.

DO not require gnu inline, period.


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

https://reviews.llvm.org/D147307

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/memcpy-inline-builtin.c
  clang/test/CodeGen/pr9614.c

Index: clang/test/CodeGen/pr9614.c
===
--- clang/test/CodeGen/pr9614.c
+++ clang/test/CodeGen/pr9614.c
@@ -32,7 +32,7 @@
 
 // CHECK-LABEL: define{{.*}} void @f()
 // CHECK: call void @foo()
-// CHECK: call i32 @abs(i32 noundef 0)
+// CHECK: call i32 @abs(i32 noundef %0)
 // CHECK: call ptr @strrchr(
 // CHECK: call void @llvm.prefetch.p0(
 // CHECK: call ptr @memchr(
Index: clang/test/CodeGen/memcpy-inline-builtin.c
===
--- clang/test/CodeGen/memcpy-inline-builtin.c
+++ clang/test/CodeGen/memcpy-inline-builtin.c
@@ -3,18 +3,27 @@
 // RUN: %clang_cc1 -triple x86_64 -S -emit-llvm -o - %s | FileCheck %s
 //
 // Verifies that clang detects memcpy inline version and uses it instead of the builtin.
+// Checks alternate version with the `artificial` attribute.
 
 typedef unsigned long size_t;
 
 // Clang requires these attributes for a function to be redefined.
 #define AVAILABLE_EXTERNALLY extern inline __attribute__((always_inline)) __attribute__((gnu_inline))
 
+#define AVAILABLE_EXTERNALLY_ALTERNATE extern inline __attribute__((__always_inline__)) __attribute__((__artificial__))
+
 // Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
 AVAILABLE_EXTERNALLY void *memcpy(void *a, const void *b, size_t c) {
   asm("# memcpy.inline marker");
   return __builtin_memcpy(a, b, c);
 }
 
+// Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
+AVAILABLE_EXTERNALLY_ALTERNATE void *memmove(void *a, const void *b, size_t c) {
+  asm("# memmove.inline marker");
+  return __builtin_memmove(a, b, c);
+}
+
 // CHECK-LABEL: @foo(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
@@ -43,6 +52,34 @@
   return memcpy(a, b, c);
 }
 
+// CHECK-LABEL: @foo_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR_I:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
+// CHECK-NEXT:[[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:store ptr [[TMP0]], ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:store ptr [[TMP1]], ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:store i64 [[TMP2]], ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void asm sideeffect "# memmove.inline marker", "~{dirflag},~{fpsr},~{flags}"() #[[ATTR3]], !srcloc !3
+// CHECK-NEXT:[[TMP3:%.*]] = load ptr, ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP4:%.*]] = load ptr, ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP5:%.*]] = load i64, ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void @llvm.memmove.p0.p0.i64(ptr align 1 [[TMP3]], ptr align 1 [[TMP4]], i64 [[TMP5]], i1 false)
+// CHECK-NEXT:ret ptr [[TMP3]]
+//
+void *foo_alt(void *a, const void *b, size_t c) {
+  return memmove(a, b, c);
+}
+
 // CHECK-LABEL: @bar(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
@@ -68,3 +105,29 @@
   void *(*cpy)(void *, const void *, size_t) = c > 10 ? memcpy : foo;
   cpy(a, b, c);
 }
+
+// CHECK-LABEL: @bar_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[CPY:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[CMP:%.*]] = icmp ugt i64 [[TMP0]], 10
+// CHECK-NEXT:[[TMP1:%.*]] = zext i1 [[CMP]] to i64
+// CHECK-NEXT:[[COND:%.*]] = select i1 [[CMP]], ptr @memmove, ptr @foo_alt
+// CHECK-NEXT:store ptr [[COND]], ptr [[CPY]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load ptr, 

[PATCH] D147307: [clang] Consider artificial always inline builtin as inline builtins

2023-03-31 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: aaron.ballman, tstellar, efriedma.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Fix #61691


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D147307

Files:
  clang/lib/AST/Decl.cpp
  clang/test/CodeGen/memcpy-inline-builtin.c

Index: clang/test/CodeGen/memcpy-inline-builtin.c
===
--- clang/test/CodeGen/memcpy-inline-builtin.c
+++ clang/test/CodeGen/memcpy-inline-builtin.c
@@ -3,18 +3,27 @@
 // RUN: %clang_cc1 -triple x86_64 -S -emit-llvm -o - %s | FileCheck %s
 //
 // Verifies that clang detects memcpy inline version and uses it instead of the builtin.
+// Checks alternate version with the `artificial` attribute.
 
 typedef unsigned long size_t;
 
 // Clang requires these attributes for a function to be redefined.
 #define AVAILABLE_EXTERNALLY extern inline __attribute__((always_inline)) __attribute__((gnu_inline))
 
+#define AVAILABLE_EXTERNALLY_ALTERNATE extern inline __attribute__((__always_inline__)) __attribute__((__artificial__))
+
 // Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
 AVAILABLE_EXTERNALLY void *memcpy(void *a, const void *b, size_t c) {
   asm("# memcpy.inline marker");
   return __builtin_memcpy(a, b, c);
 }
 
+// Clang recognizes an inline builtin and renames it to prevent conflict with builtins.
+AVAILABLE_EXTERNALLY_ALTERNATE void *memmove(void *a, const void *b, size_t c) {
+  asm("# memmove.inline marker");
+  return __builtin_memmove(a, b, c);
+}
+
 // CHECK-LABEL: @foo(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
@@ -43,6 +52,34 @@
   return memcpy(a, b, c);
 }
 
+// CHECK-LABEL: @foo_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR_I:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR_I:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
+// CHECK-NEXT:[[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:store ptr [[TMP0]], ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:store ptr [[TMP1]], ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:store i64 [[TMP2]], ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void asm sideeffect "# memmove.inline marker", "~{dirflag},~{fpsr},~{flags}"() #[[ATTR3]], !srcloc !3
+// CHECK-NEXT:[[TMP3:%.*]] = load ptr, ptr [[A_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP4:%.*]] = load ptr, ptr [[B_ADDR_I]], align 8
+// CHECK-NEXT:[[TMP5:%.*]] = load i64, ptr [[C_ADDR_I]], align 8
+// CHECK-NEXT:call void @llvm.memmove.p0.p0.i64(ptr align 1 [[TMP3]], ptr align 1 [[TMP4]], i64 [[TMP5]], i1 false)
+// CHECK-NEXT:ret ptr [[TMP3]]
+//
+void *foo_alt(void *a, const void *b, size_t c) {
+  return memmove(a, b, c);
+}
+
 // CHECK-LABEL: @bar(
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
@@ -68,3 +105,29 @@
   void *(*cpy)(void *, const void *, size_t) = c > 10 ? memcpy : foo;
   cpy(a, b, c);
 }
+
+// CHECK-LABEL: @bar_alt(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[A_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[B_ADDR:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:[[C_ADDR:%.*]] = alloca i64, align 8
+// CHECK-NEXT:[[CPY:%.*]] = alloca ptr, align 8
+// CHECK-NEXT:store ptr [[A:%.*]], ptr [[A_ADDR]], align 8
+// CHECK-NEXT:store ptr [[B:%.*]], ptr [[B_ADDR]], align 8
+// CHECK-NEXT:store i64 [[C:%.*]], ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[TMP0:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[CMP:%.*]] = icmp ugt i64 [[TMP0]], 10
+// CHECK-NEXT:[[TMP1:%.*]] = zext i1 [[CMP]] to i64
+// CHECK-NEXT:[[COND:%.*]] = select i1 [[CMP]], ptr @memmove, ptr @foo_alt
+// CHECK-NEXT:store ptr [[COND]], ptr [[CPY]], align 8
+// CHECK-NEXT:[[TMP2:%.*]] = load ptr, ptr [[CPY]], align 8
+// CHECK-NEXT:[[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8
+// CHECK-NEXT:[[TMP4:%.*]] = load ptr, ptr [[B_ADDR]], align 8
+// CHECK-NEXT:[[TMP5:%.*]] = load i64, ptr [[C_ADDR]], align 8
+// CHECK-NEXT:[[CALL:%.*]] = call ptr [[TMP2]](ptr noundef [[TMP3]], ptr noundef [[TMP4]], i64 noundef [[TMP5]])
+// CHECK-NEXT:ret void
+//
+void bar_alt(void *a, const void *b, size_t c) {
+  void *(*cpy)(void *, const void *, size_t) = c > 10 ? memmove : foo_alt;
+  cpy(a, b, c);
+}

[PATCH] D140075: [libclang] Expose using shadow types and declarations in libclang.

2023-02-28 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/tools/libclang/CXCursor.cpp:1281
+if (const UsingShadowDecl *Shadow = Using->getFoundDecl())
+  if (const auto *TD = dyn_cast_or_null(Shadow->getTargetDecl()))
+return MakeCursorTypeRef(TD, Loc, TU);

In which case can this be null?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140075

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


[PATCH] D140074: [libclang] Remove redundant return statements in CXType.cpp

2023-02-28 Thread serge 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 rG5c943e368818: [libclang] Remove redundant return statements 
in CXType.cpp (authored by emilio, committed by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140074

Files:
  clang/tools/libclang/CXType.cpp


Index: clang/tools/libclang/CXType.cpp
===
--- clang/tools/libclang/CXType.cpp
+++ clang/tools/libclang/CXType.cpp
@@ -322,8 +322,6 @@
   QualType T = TD->getUnderlyingType();
   return MakeCXType(T, TU);
 }
-
-return MakeCXType(QualType(), TU);
   }
 
   return MakeCXType(QualType(), TU);
@@ -340,8 +338,6 @@
   QualType T = TD->getIntegerType();
   return MakeCXType(T, TU);
 }
-
-return MakeCXType(QualType(), TU);
   }
 
   return MakeCXType(QualType(), TU);
@@ -356,8 +352,6 @@
 if (const EnumConstantDecl *TD = dyn_cast_or_null(D)) {
   return TD->getInitVal().getSExtValue();
 }
-
-return LLONG_MIN;
   }
 
   return LLONG_MIN;
@@ -372,8 +366,6 @@
 if (const EnumConstantDecl *TD = dyn_cast_or_null(D)) {
   return TD->getInitVal().getZExtValue();
 }
-
-return ULLONG_MAX;
   }
 
   return ULLONG_MAX;


Index: clang/tools/libclang/CXType.cpp
===
--- clang/tools/libclang/CXType.cpp
+++ clang/tools/libclang/CXType.cpp
@@ -322,8 +322,6 @@
   QualType T = TD->getUnderlyingType();
   return MakeCXType(T, TU);
 }
-
-return MakeCXType(QualType(), TU);
   }
 
   return MakeCXType(QualType(), TU);
@@ -340,8 +338,6 @@
   QualType T = TD->getIntegerType();
   return MakeCXType(T, TU);
 }
-
-return MakeCXType(QualType(), TU);
   }
 
   return MakeCXType(QualType(), TU);
@@ -356,8 +352,6 @@
 if (const EnumConstantDecl *TD = dyn_cast_or_null(D)) {
   return TD->getInitVal().getSExtValue();
 }
-
-return LLONG_MIN;
   }
 
   return LLONG_MIN;
@@ -372,8 +366,6 @@
 if (const EnumConstantDecl *TD = dyn_cast_or_null(D)) {
   return TD->getInitVal().getZExtValue();
 }
-
-return ULLONG_MAX;
   }
 
   return ULLONG_MAX;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D140074: [libclang] Remove redundant return statements in CXType.cpp

2023-02-28 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

The cleanup looks good to me, thanks! Out of curiosity, did just stumble on 
this, or did an automatic tool gave you an hint?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140074

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


[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-06 Thread serge via Phabricator via cfe-commits
This revision was not accepted when it landed; it landed in state "Needs 
Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rG0ffaffcaac97: Reapply 
6fa2abf90886f18472c87bc9bffbcdf4f73c465e (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142606

Files:
  clang/lib/Driver/ToolChains/AMDGPU.cpp
  clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
  clang/lib/Driver/ToolChains/FreeBSD.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/lib/Driver/ToolChains/LazyDetector.h
  clang/lib/Driver/ToolChains/Linux.cpp

Index: clang/lib/Driver/ToolChains/Linux.cpp
===
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -681,23 +681,23 @@
 
 void Linux::AddCudaIncludeArgs(const ArgList ,
ArgStringList ) const {
-  CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
+  CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPIncludeArgs(const ArgList ,
   ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPRuntimeLibArgs(const ArgList ,
  ArgStringList ) const {
   CmdArgs.push_back(
-  Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()));
+  Args.MakeArgString(StringRef("-L") + RocmInstallation->getLibPath()));
 
   if (Args.hasFlag(options::OPT_offload_add_rpath,
options::OPT_no_offload_add_rpath, false))
 CmdArgs.append(
-{"-rpath", Args.MakeArgString(RocmInstallation.getLibPath())});
+{"-rpath", Args.MakeArgString(RocmInstallation->getLibPath())});
 
   CmdArgs.push_back("-lamdhip64");
 }
Index: clang/lib/Driver/ToolChains/LazyDetector.h
===
--- /dev/null
+++ clang/lib/Driver/ToolChains/LazyDetector.h
@@ -0,0 +1,45 @@
+//===--- LazyDetector.h - Lazy ToolChain Detection --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+#include 
+
+namespace clang {
+
+/// Simple wrapper for toolchain detector with costly initialization. This
+/// delays the creation of the actual detector until its first usage.
+
+template  class LazyDetector {
+  const driver::Driver 
+  const llvm::Triple 
+  const llvm::opt::ArgList 
+
+  std::optional Detector;
+
+public:
+  LazyDetector(const driver::Driver , const llvm::Triple ,
+   const llvm::opt::ArgList )
+  : D(D), Triple(Triple), Args(Args) {}
+  T *operator->() {
+if (!Detector)
+  Detector.emplace(D, Triple, Args);
+return &*Detector;
+  }
+  const T *operator->() const {
+return const_cast(
+const_cast(*this).operator->());
+  }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -314,7 +314,7 @@
 
 void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList ,
 ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
@@ -343,7 +343,7 @@
   ArgStringList LibraryPaths;
 
   // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
-  for (StringRef Path : RocmInstallation.getRocmDeviceLibPathArg())
+  for (StringRef Path : RocmInstallation->getRocmDeviceLibPathArg())
 LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
 
   addDirectoryList(DriverArgs, LibraryPaths, "", "HIP_DEVICE_LIB_PATH");
@@ -365,7 +365,7 @@
   getDriver().Diag(diag::err_drv_no_such_file) << BCName;
 });
   } else {
-if (!RocmInstallation.hasDeviceLibrary()) {
+if (!RocmInstallation->hasDeviceLibrary()) {
   getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;
   return {};
 }
@@ -376,7 +376,7 @@
 if (DriverArgs.hasFlag(options::OPT_fgpu_sanitize,
options::OPT_fno_gpu_sanitize, true) &&
 

[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-06 Thread serge via Phabricator via cfe-commits
This revision was not accepted when it landed; it landed in state "Needs 
Review".
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG6fa2abf90886: Lazyly initialize uncommon toolchain detector 
(authored by serge-sans-paille).

Changed prior to commit:
  https://reviews.llvm.org/D142606?vs=494927=495058#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142606

Files:
  clang/lib/Driver/ToolChains/AMDGPU.cpp
  clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
  clang/lib/Driver/ToolChains/FreeBSD.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/lib/Driver/ToolChains/LazyDetector.h
  clang/lib/Driver/ToolChains/Linux.cpp

Index: clang/lib/Driver/ToolChains/Linux.cpp
===
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -681,23 +681,23 @@
 
 void Linux::AddCudaIncludeArgs(const ArgList ,
ArgStringList ) const {
-  CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
+  CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPIncludeArgs(const ArgList ,
   ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPRuntimeLibArgs(const ArgList ,
  ArgStringList ) const {
   CmdArgs.push_back(
-  Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()));
+  Args.MakeArgString(StringRef("-L") + RocmInstallation->getLibPath()));
 
   if (Args.hasFlag(options::OPT_offload_add_rpath,
options::OPT_no_offload_add_rpath, false))
 CmdArgs.append(
-{"-rpath", Args.MakeArgString(RocmInstallation.getLibPath())});
+{"-rpath", Args.MakeArgString(RocmInstallation->getLibPath())});
 
   CmdArgs.push_back("-lamdhip64");
 }
Index: clang/lib/Driver/ToolChains/LazyDetector.h
===
--- /dev/null
+++ clang/lib/Driver/ToolChains/LazyDetector.h
@@ -0,0 +1,45 @@
+//===--- LazyDetector.h - Lazy ToolChain Detection --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+#include 
+
+namespace clang {
+
+/// Simple wrapper for toolchain detector with costly initialization. This
+/// delays the creation of the actual detector until its first usage.
+
+template  class LazyDetector {
+  const driver::Driver 
+  const llvm::Triple 
+  const llvm::opt::ArgList 
+
+  std::optional Detector;
+
+public:
+  LazyDetector(const driver::Driver , const llvm::Triple ,
+   const llvm::opt::ArgList )
+  : D(D), Triple(Triple), Args(Args) {}
+  T *operator->() {
+if (!Detector)
+  Detector.emplace(D, Triple, Args);
+return &*Detector;
+  }
+  const T *operator->() const {
+return const_cast(
+const_cast(*this).operator->());
+  }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -314,7 +314,7 @@
 
 void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList ,
 ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
@@ -343,7 +343,7 @@
   ArgStringList LibraryPaths;
 
   // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
-  for (StringRef Path : RocmInstallation.getRocmDeviceLibPathArg())
+  for (StringRef Path : RocmInstallation->getRocmDeviceLibPathArg())
 LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
 
   addDirectoryList(DriverArgs, LibraryPaths, "", "HIP_DEVICE_LIB_PATH");
@@ -365,7 +365,7 @@
   getDriver().Diag(diag::err_drv_no_such_file) << BCName;
 });
   } else {
-if (!RocmInstallation.hasDeviceLibrary()) {
+if (!RocmInstallation->hasDeviceLibrary()) {
   getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;
   return {};
 }
@@ -376,7 +376,7 @@
 if 

[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-05 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 494927.
serge-sans-paille added a comment.

Address @tbader's comment


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

https://reviews.llvm.org/D142606

Files:
  clang/lib/Driver/ToolChains/AMDGPU.cpp
  clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
  clang/lib/Driver/ToolChains/FreeBSD.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/lib/Driver/ToolChains/LazyDetector.h
  clang/lib/Driver/ToolChains/Linux.cpp

Index: clang/lib/Driver/ToolChains/Linux.cpp
===
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -681,23 +681,23 @@
 
 void Linux::AddCudaIncludeArgs(const ArgList ,
ArgStringList ) const {
-  CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
+  CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPIncludeArgs(const ArgList ,
   ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPRuntimeLibArgs(const ArgList ,
  ArgStringList ) const {
   CmdArgs.push_back(
-  Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()));
+  Args.MakeArgString(StringRef("-L") + RocmInstallation->getLibPath()));
 
   if (Args.hasFlag(options::OPT_offload_add_rpath,
options::OPT_no_offload_add_rpath, false))
 CmdArgs.append(
-{"-rpath", Args.MakeArgString(RocmInstallation.getLibPath())});
+{"-rpath", Args.MakeArgString(RocmInstallation->getLibPath())});
 
   CmdArgs.push_back("-lamdhip64");
 }
Index: clang/lib/Driver/ToolChains/LazyDetector.h
===
--- /dev/null
+++ clang/lib/Driver/ToolChains/LazyDetector.h
@@ -0,0 +1,45 @@
+//===--- LazyDetector.h - Lazy ToolChain Detection --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+#include 
+
+namespace clang {
+
+/// Simple wrapper for toolchain detector with costly initialization. This
+/// delays the creation of the actual detector until its first usage.
+
+template  class LazyDetector {
+  const driver::Driver 
+  const llvm::Triple 
+  const llvm::opt::ArgList 
+
+  std::optional Detector;
+
+public:
+  LazyDetector(const driver::Driver , const llvm::Triple ,
+   const llvm::opt::ArgList )
+  : D(D), Triple(Triple), Args(Args) {}
+  T *operator->() {
+if (!Detector)
+  Detector.emplace(D, Triple, Args);
+return &*Detector;
+  }
+  T const *operator->() const {
+return const_cast(
+const_cast(*this).operator->());
+  }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -315,7 +315,7 @@
 
 void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList ,
 ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
@@ -344,7 +344,7 @@
   ArgStringList LibraryPaths;
 
   // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
-  for (StringRef Path : RocmInstallation.getRocmDeviceLibPathArg())
+  for (StringRef Path : RocmInstallation->getRocmDeviceLibPathArg())
 LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
 
   addDirectoryList(DriverArgs, LibraryPaths, "", "HIP_DEVICE_LIB_PATH");
@@ -366,7 +366,7 @@
   getDriver().Diag(diag::err_drv_no_such_file) << BCName;
 });
   } else {
-if (!RocmInstallation.hasDeviceLibrary()) {
+if (!RocmInstallation->hasDeviceLibrary()) {
   getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;
   return {};
 }
@@ -377,7 +377,7 @@
 if (DriverArgs.hasFlag(options::OPT_fgpu_sanitize,
options::OPT_fno_gpu_sanitize, true) &&
 getSanitizerArgs(DriverArgs).needsAsanRt()) {
-  auto AsanRTL = RocmInstallation.getAsanRTLPath();
+  auto AsanRTL = RocmInstallation->getAsanRTLPath();
   if (AsanRTL.empty()) {
 unsigned DiagID = 

[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-05 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/Driver/ToolChains/LazyDetector.h:26
+
+  mutable std::optional Detector;
+

zero9178 wrote:
> serge-sans-paille wrote:
> > zero9178 wrote:
> > > Any reason this is `mutable`? I don't see it being used a non-const way 
> > > in a const method
> > yeah, `T const *operator->() const` updates the optional by actually 
> > creating the value. (`std::optional::empalce` is not const)
> Your `T const *operator->() const` method does not do so, `T *operator->()` 
> does, which is non-const and hence can call `emplace` without issues. 
> So as far as C++ goes it is not required. 
gotcha :-)


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

https://reviews.llvm.org/D142606

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


[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-05 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 494877.
serge-sans-paille added a comment.

remove mutable qualifier


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

https://reviews.llvm.org/D142606

Files:
  clang/lib/Driver/ToolChains/AMDGPU.cpp
  clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
  clang/lib/Driver/ToolChains/FreeBSD.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/lib/Driver/ToolChains/LazyDetector.h
  clang/lib/Driver/ToolChains/Linux.cpp

Index: clang/lib/Driver/ToolChains/Linux.cpp
===
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -681,23 +681,23 @@
 
 void Linux::AddCudaIncludeArgs(const ArgList ,
ArgStringList ) const {
-  CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
+  CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPIncludeArgs(const ArgList ,
   ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPRuntimeLibArgs(const ArgList ,
  ArgStringList ) const {
   CmdArgs.push_back(
-  Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()));
+  Args.MakeArgString(StringRef("-L") + RocmInstallation->getLibPath()));
 
   if (Args.hasFlag(options::OPT_offload_add_rpath,
options::OPT_no_offload_add_rpath, false))
 CmdArgs.append(
-{"-rpath", Args.MakeArgString(RocmInstallation.getLibPath())});
+{"-rpath", Args.MakeArgString(RocmInstallation->getLibPath())});
 
   CmdArgs.push_back("-lamdhip64");
 }
Index: clang/lib/Driver/ToolChains/LazyDetector.h
===
--- /dev/null
+++ clang/lib/Driver/ToolChains/LazyDetector.h
@@ -0,0 +1,46 @@
+//===--- LazyDetector.h - Lazy ToolChain Detection --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+#include 
+
+namespace clang {
+
+/// Simple wrapper for toolchain detector with costly initialization. This
+/// delays the creation of the actual detector until its first usage.
+
+template  class LazyDetector {
+  const driver::Driver 
+  const llvm::Triple 
+  const llvm::opt::ArgList 
+
+  std::optional Detector;
+
+public:
+  LazyDetector(const driver::Driver , const llvm::Triple ,
+   const llvm::opt::ArgList )
+  : D(D), Triple(Triple), Args(Args) {}
+  T *operator->() {
+if (!Detector) {
+  Detector.emplace(D, Triple, Args);
+}
+return ();
+  }
+  T const *operator->() const {
+return const_cast(
+const_cast(*this).operator->());
+  }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -315,7 +315,7 @@
 
 void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList ,
 ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
@@ -344,7 +344,7 @@
   ArgStringList LibraryPaths;
 
   // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
-  for (StringRef Path : RocmInstallation.getRocmDeviceLibPathArg())
+  for (StringRef Path : RocmInstallation->getRocmDeviceLibPathArg())
 LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
 
   addDirectoryList(DriverArgs, LibraryPaths, "", "HIP_DEVICE_LIB_PATH");
@@ -366,7 +366,7 @@
   getDriver().Diag(diag::err_drv_no_such_file) << BCName;
 });
   } else {
-if (!RocmInstallation.hasDeviceLibrary()) {
+if (!RocmInstallation->hasDeviceLibrary()) {
   getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;
   return {};
 }
@@ -377,7 +377,7 @@
 if (DriverArgs.hasFlag(options::OPT_fgpu_sanitize,
options::OPT_fno_gpu_sanitize, true) &&
 getSanitizerArgs(DriverArgs).needsAsanRt()) {
-  auto AsanRTL = RocmInstallation.getAsanRTLPath();
+  auto AsanRTL = RocmInstallation->getAsanRTLPath();
   if (AsanRTL.empty()) {
 unsigned DiagID = 

[PATCH] D142181: [OptTable] Store llvm::cl::Option into a DenseMap instead of a StringMap

2023-02-02 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Gentle ping :-)


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

https://reviews.llvm.org/D142181

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


[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-02-02 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/Driver/ToolChains/LazyDetector.h:26
+
+  mutable std::optional Detector;
+

zero9178 wrote:
> Any reason this is `mutable`? I don't see it being used a non-const way in a 
> const method
yeah, `T const *operator->() const` updates the optional by actually creating 
the value. (`std::optional::empalce` is not const)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142606

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


[PATCH] D142862: [Support] change StringMap hash function from djbHash to xxHash

2023-02-01 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

https://llvm-compile-time-tracker.com/compare.php?from=1a17739d3aa78599c32f6106e05dcfa7f3f9e823=9c1adc5fcca177d6628bdb22c72e7546c7b691aa=instructions:u

looks good to me!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142862

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


[PATCH] D142862: [Support] change StringMap hash function from djbHash to xxHash

2023-01-30 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Do you intend to (optionnaly) provide XXH3 as described in 
https://github.com/Cyan4973/xxHash ?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142862

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


[PATCH] D142862: [Support] change StringMap hash function from djbHash to xxHash

2023-01-30 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

Can  you take a shot against https://llvm-compile-time-tracker.com/ so that we 
get an hint of the practical speedup?

Looks like xxhash.h is missing from the patch.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142862

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


[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-01-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D142606#4082753 , @tstellar wrote:

> Does this mean that clang will no longer search for the ROCM and CUDA library 
> paths for every C compile?

That's the goal, yes.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142606

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


[PATCH] D142606: Lazyly initialize uncommon toolchain detector

2023-01-26 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
Herald added subscribers: kosarev, kerbowa, jvesely, emaste.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang.

Cuda and rocm toolchain detectors are currently run unconditionally, while 
their result may not be used at all. Make their initialization lazy so that the 
discovery code is not run in common cases.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142606

Files:
  clang/lib/Driver/ToolChains/AMDGPU.cpp
  clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
  clang/lib/Driver/ToolChains/FreeBSD.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/lib/Driver/ToolChains/LazyDetector.h
  clang/lib/Driver/ToolChains/Linux.cpp

Index: clang/lib/Driver/ToolChains/Linux.cpp
===
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ clang/lib/Driver/ToolChains/Linux.cpp
@@ -681,23 +681,23 @@
 
 void Linux::AddCudaIncludeArgs(const ArgList ,
ArgStringList ) const {
-  CudaInstallation.AddCudaIncludeArgs(DriverArgs, CC1Args);
+  CudaInstallation->AddCudaIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPIncludeArgs(const ArgList ,
   ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 void Linux::AddHIPRuntimeLibArgs(const ArgList ,
  ArgStringList ) const {
   CmdArgs.push_back(
-  Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()));
+  Args.MakeArgString(StringRef("-L") + RocmInstallation->getLibPath()));
 
   if (Args.hasFlag(options::OPT_offload_add_rpath,
options::OPT_no_offload_add_rpath, false))
 CmdArgs.append(
-{"-rpath", Args.MakeArgString(RocmInstallation.getLibPath())});
+{"-rpath", Args.MakeArgString(RocmInstallation->getLibPath())});
 
   CmdArgs.push_back("-lamdhip64");
 }
Index: clang/lib/Driver/ToolChains/LazyDetector.h
===
--- /dev/null
+++ clang/lib/Driver/ToolChains/LazyDetector.h
@@ -0,0 +1,46 @@
+//===--- LazyDetector.h - Lazy ToolChain Detection --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
+
+#include "clang/Driver/Tool.h"
+#include "clang/Driver/ToolChain.h"
+#include 
+
+namespace clang {
+
+/// Simple wrapper for toolchain detector with costly initialization. This
+/// delays the creation of the actual detector until its first usage.
+
+template  class LazyDetector {
+  const driver::Driver 
+  const llvm::Triple 
+  const llvm::opt::ArgList 
+
+  mutable std::optional Detector;
+
+public:
+  LazyDetector(const driver::Driver , const llvm::Triple ,
+   const llvm::opt::ArgList )
+  : D(D), Triple(Triple), Args(Args) {}
+  T *operator->() {
+if (!Detector) {
+  Detector.emplace(D, Triple, Args);
+}
+return ();
+  }
+  T const *operator->() const {
+return const_cast(
+const_cast(*this).operator->());
+  }
+};
+
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_LAZYDETECTOR_H
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -315,7 +315,7 @@
 
 void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList ,
 ArgStringList ) const {
-  RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args);
+  RocmInstallation->AddHIPIncludeArgs(DriverArgs, CC1Args);
 }
 
 SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
@@ -344,7 +344,7 @@
   ArgStringList LibraryPaths;
 
   // Find in --hip-device-lib-path and HIP_LIBRARY_PATH.
-  for (StringRef Path : RocmInstallation.getRocmDeviceLibPathArg())
+  for (StringRef Path : RocmInstallation->getRocmDeviceLibPathArg())
 LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
 
   addDirectoryList(DriverArgs, LibraryPaths, "", "HIP_DEVICE_LIB_PATH");
@@ -366,7 +366,7 @@
   getDriver().Diag(diag::err_drv_no_such_file) << BCName;
 });
   } else {
-if (!RocmInstallation.hasDeviceLibrary()) {
+if (!RocmInstallation->hasDeviceLibrary()) {
   getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;
   return {};
 }
@@ -377,7 +377,7 @@
 if 

[PATCH] D142024: [clang] Optimize clang::Builtin::Info density

2023-01-23 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

This got fixed in d1f313e73a1b33d662dbab54be76720b9c875645 
.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142024

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


[PATCH] D142181: [OptTable] Store llvm::cl::Option into a DenseMap instead of a StringMap

2023-01-23 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 491400.
serge-sans-paille added a comment.

Do not enfore StringLiteral parameter. This is too invasive on the code base.


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

https://reviews.llvm.org/D142181

Files:
  clang-tools-extra/clangd/tool/ClangdMain.cpp
  clang/include/clang/Tooling/Refactoring/RefactoringOption.h
  clang/lib/Tooling/Refactoring/RefactoringActions.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/include/llvm/Option/Option.h
  llvm/include/llvm/Support/CommandLine.h
  llvm/lib/CodeGen/TargetPassConfig.cpp
  llvm/lib/Support/CommandLine.cpp
  llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
  llvm/unittests/Support/CommandLineTest.cpp

Index: llvm/unittests/Support/CommandLineTest.cpp
===
--- llvm/unittests/Support/CommandLineTest.cpp
+++ llvm/unittests/Support/CommandLineTest.cpp
@@ -98,7 +98,7 @@
   static const char ArgString[] = "new-test-option";
   static const char ValueString[] = "Integer";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
 
   ASSERT_EQ(Map.count("test-option"), 1u) << "Could not find option in map.";
@@ -419,7 +419,7 @@
   ASSERT_EQ(cl::NotHidden, TestOption2.getOptionHiddenFlag())
   << "Hid extra option that should be visable.";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
   ASSERT_TRUE(Map.count("help") == (size_t)0 ||
   cl::NotHidden == Map["help"]->getOptionHiddenFlag())
@@ -445,7 +445,7 @@
   ASSERT_EQ(cl::NotHidden, TestOption3.getOptionHiddenFlag())
   << "Hid extra option that should be visable.";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
   ASSERT_TRUE(Map.count("help") == (size_t)0 ||
   cl::NotHidden == Map["help"]->getOptionHiddenFlag())
@@ -1319,7 +1319,7 @@
   }
 
   enum class OptionValue { Val };
-  const StringRef Opt = "some-option";
+  const StringLiteral Opt = "some-option";
   const StringRef HelpText = "some help";
 
 private:
@@ -1421,7 +1421,7 @@
   enum class OptionValue { Val };
 
   template 
-  size_t runTest(StringRef ArgName, Ts... OptionAttributes) {
+  size_t runTest(StringLiteral ArgName, Ts... OptionAttributes) {
 StackOption TestOption(ArgName, cl::desc("some help"),
 OptionAttributes...);
 return getOptionWidth(TestOption);
@@ -1435,7 +1435,7 @@
 };
 
 TEST_F(GetOptionWidthTest, GetOptionWidthArgNameLonger) {
-  StringRef ArgName("a-long-argument-name");
+  StringLiteral ArgName("a-long-argument-name");
   size_t ExpectedStrSize = ("  --" + ArgName + "= - ").str().size();
   EXPECT_EQ(
   runTest(ArgName, cl::values(clEnumValN(OptionValue::Val, "v", "help"))),
@@ -1443,7 +1443,7 @@
 }
 
 TEST_F(GetOptionWidthTest, GetOptionWidthFirstOptionNameLonger) {
-  StringRef OptName("a-long-option-name");
+  StringLiteral OptName("a-long-option-name");
   size_t ExpectedStrSize = ("=" + OptName + " - ").str().size();
   EXPECT_EQ(
   runTest("a", cl::values(clEnumValN(OptionValue::Val, OptName, "help"),
@@ -1452,7 +1452,7 @@
 }
 
 TEST_F(GetOptionWidthTest, GetOptionWidthSecondOptionNameLonger) {
-  StringRef OptName("a-long-option-name");
+  StringLiteral OptName("a-long-option-name");
   size_t ExpectedStrSize = ("=" + OptName + " - ").str().size();
   EXPECT_EQ(
   runTest("a", cl::values(clEnumValN(OptionValue::Val, "b", "help"),
@@ -1472,7 +1472,7 @@
 
 TEST_F(GetOptionWidthTest,
GetOptionWidthValueOptionalEmptyOptionWithNoDescription) {
-  StringRef ArgName("a");
+  StringLiteral ArgName("a");
   // The length of a= (including indentation) is actually the same as the
   // = string, so it is impossible to distinguish via testing the case
   // where the empty string is ignored from where it is not ignored.
Index: llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
===
--- llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
+++ llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
@@ -50,7 +50,7 @@
 }
 
 TEST(CommandLineInitTest, GetPresetOptions) {
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
 
   for (auto *Str :
Index: llvm/lib/Support/CommandLine.cpp
===
--- llvm/lib/Support/CommandLine.cpp
+++ llvm/lib/Support/CommandLine.cpp
@@ -275,7 +275,7 @@
 auto End = Sub.OptionsMap.end();
 for (auto Name : OptionNames) {
   auto I = Sub.OptionsMap.find(Name);
-  if (I != End && I->getValue() == O)
+  if (I != End && I->second == O)
 Sub.OptionsMap.erase(I);
 }
 
@@ -381,7 +381,7 @@
 O->hasArgStr())
   addOption(O, sub);
 else
-  addLiteralOption(*O, sub, 

[PATCH] D142181: [OptTable] Store llvm::cl::Option into a DenseMap instead of a StringMap

2023-01-21 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

In D142181#4070881 , @nikic wrote:

> In D142181#4070868 , 
> @serge-sans-paille wrote:
>
>> @nikic : I thought I fixed that with 
>> e8a163dc03e6913360beb305620104ba129c081c 
>>  ... is 
>> it included in your build?
>
> Oh yeah, I missed that fix. Sorry for the noise.

^^! Answered in the wrong thread, so I dupliaded that message to 
https://reviews.llvm.org/D142026 where it belongs :-)


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

https://reviews.llvm.org/D142181

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


[PATCH] D142026: Optimize OptTable::findNearest implementation and usage

2023-01-21 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.



> Plausibly caused by this change -- I'm thinking that `MaximumDistance` is 
> initialized to `UINT_MAX - 1`, but then we cast that to a signed integer and 
> compare that, so it wraps to a large negative number.

@nikic : I thought I fixed that with e8a163dc03e6913360beb305620104ba129c081c 
 ... is it 
included in your build?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142026

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


[PATCH] D142181: [OptTable] Store llvm::cl::Option into a DenseMap instead of a StringMap

2023-01-21 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

@nikic : I thought I fixed that with e8a163dc03e6913360beb305620104ba129c081c 
 ... is it 
included in your build?


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

https://reviews.llvm.org/D142181

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


[PATCH] D142181: [OptTable] Store llvm::cl::Option into a DenseMap instead of a StringMap

2023-01-20 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 490804.
serge-sans-paille added a comment.
Herald added subscribers: cfe-commits, kadircet, arphaman.
Herald added a project: clang-tools-extra.

Fix build + make StringLiteral initialization constexpr.


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

https://reviews.llvm.org/D142181

Files:
  clang-tools-extra/clangd/tool/ClangdMain.cpp
  clang/include/clang/Tooling/Refactoring/RefactoringOption.h
  clang/lib/Tooling/Refactoring/RefactoringActions.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/include/llvm/Option/Option.h
  llvm/include/llvm/Support/CommandLine.h
  llvm/lib/CodeGen/TargetPassConfig.cpp
  llvm/lib/Support/CommandLine.cpp
  llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
  llvm/unittests/Support/CommandLineTest.cpp

Index: llvm/unittests/Support/CommandLineTest.cpp
===
--- llvm/unittests/Support/CommandLineTest.cpp
+++ llvm/unittests/Support/CommandLineTest.cpp
@@ -98,7 +98,7 @@
   static const char ArgString[] = "new-test-option";
   static const char ValueString[] = "Integer";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
 
   ASSERT_EQ(Map.count("test-option"), 1u) << "Could not find option in map.";
@@ -419,7 +419,7 @@
   ASSERT_EQ(cl::NotHidden, TestOption2.getOptionHiddenFlag())
   << "Hid extra option that should be visable.";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
   ASSERT_TRUE(Map.count("help") == (size_t)0 ||
   cl::NotHidden == Map["help"]->getOptionHiddenFlag())
@@ -445,7 +445,7 @@
   ASSERT_EQ(cl::NotHidden, TestOption3.getOptionHiddenFlag())
   << "Hid extra option that should be visable.";
 
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
   ASSERT_TRUE(Map.count("help") == (size_t)0 ||
   cl::NotHidden == Map["help"]->getOptionHiddenFlag())
@@ -1319,7 +1319,7 @@
   }
 
   enum class OptionValue { Val };
-  const StringRef Opt = "some-option";
+  const StringLiteral Opt = "some-option";
   const StringRef HelpText = "some help";
 
 private:
@@ -1421,7 +1421,7 @@
   enum class OptionValue { Val };
 
   template 
-  size_t runTest(StringRef ArgName, Ts... OptionAttributes) {
+  size_t runTest(StringLiteral ArgName, Ts... OptionAttributes) {
 StackOption TestOption(ArgName, cl::desc("some help"),
 OptionAttributes...);
 return getOptionWidth(TestOption);
@@ -1435,7 +1435,7 @@
 };
 
 TEST_F(GetOptionWidthTest, GetOptionWidthArgNameLonger) {
-  StringRef ArgName("a-long-argument-name");
+  StringLiteral ArgName("a-long-argument-name");
   size_t ExpectedStrSize = ("  --" + ArgName + "= - ").str().size();
   EXPECT_EQ(
   runTest(ArgName, cl::values(clEnumValN(OptionValue::Val, "v", "help"))),
@@ -1443,7 +1443,7 @@
 }
 
 TEST_F(GetOptionWidthTest, GetOptionWidthFirstOptionNameLonger) {
-  StringRef OptName("a-long-option-name");
+  StringLiteral OptName("a-long-option-name");
   size_t ExpectedStrSize = ("=" + OptName + " - ").str().size();
   EXPECT_EQ(
   runTest("a", cl::values(clEnumValN(OptionValue::Val, OptName, "help"),
@@ -1452,7 +1452,7 @@
 }
 
 TEST_F(GetOptionWidthTest, GetOptionWidthSecondOptionNameLonger) {
-  StringRef OptName("a-long-option-name");
+  StringLiteral OptName("a-long-option-name");
   size_t ExpectedStrSize = ("=" + OptName + " - ").str().size();
   EXPECT_EQ(
   runTest("a", cl::values(clEnumValN(OptionValue::Val, "b", "help"),
@@ -1472,7 +1472,7 @@
 
 TEST_F(GetOptionWidthTest,
GetOptionWidthValueOptionalEmptyOptionWithNoDescription) {
-  StringRef ArgName("a");
+  StringLiteral ArgName("a");
   // The length of a= (including indentation) is actually the same as the
   // = string, so it is impossible to distinguish via testing the case
   // where the empty string is ignored from where it is not ignored.
Index: llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
===
--- llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
+++ llvm/unittests/Support/CommandLineInit/CommandLineInitTest.cpp
@@ -50,7 +50,7 @@
 }
 
 TEST(CommandLineInitTest, GetPresetOptions) {
-  StringMap  =
+  DenseMap  =
   cl::getRegisteredOptions(cl::SubCommand::getTopLevel());
 
   for (auto *Str :
Index: llvm/lib/Support/CommandLine.cpp
===
--- llvm/lib/Support/CommandLine.cpp
+++ llvm/lib/Support/CommandLine.cpp
@@ -275,7 +275,7 @@
 auto End = Sub.OptionsMap.end();
 for (auto Name : OptionNames) {
   auto I = Sub.OptionsMap.find(Name);
-  if (I != End && I->getValue() == O)
+  if (I != End && I->second == O)
 Sub.OptionsMap.erase(I);
 }
 
@@ -381,7 +381,7 @@
 O->hasArgStr())
 

[PATCH] D142026: Optimize OptTable::findNearest implementation and usage

2023-01-19 Thread serge 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 rG6ad1b4095172: Optimize OptTable::findNearest implementation 
and usage (authored by serge-sans-paille).

Changed prior to commit:
  https://reviews.llvm.org/D142026?vs=490412=490465#toc

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D142026

Files:
  clang/lib/Driver/Driver.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/Option/OptTable.cpp


Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -227,12 +227,13 @@
 
 unsigned OptTable::findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude, unsigned 
FlagsToExclude,
-   unsigned MinimumLength) const {
+   unsigned MinimumLength,
+   unsigned MaximumDistance) const {
   assert(!Option.empty());
 
   // Consider each [option prefix + option name] pair as a candidate, finding
   // the closest match.
-  unsigned BestDistance = UINT_MAX;
+  unsigned BestDistance = MaximumDistance + 1;
   SmallString<16> Candidate;
   SmallString<16> NormalizedName;
 
@@ -276,6 +277,14 @@
 // appropriate one. For example, if a user asks for "--helm", suggest
 // "--help" over "-help".
 for (auto CandidatePrefix : CandidateInfo.Prefixes) {
+  // If Candidate and NormalizedName have more than 'BestDistance'
+  // characters of difference, no need to compute the edit distance, it's
+  // going to be greater than BestDistance. Don't bother computing 
Candidate
+  // at all.
+  if (std::abs((ssize_t)(CandidatePrefix.size() + CandidateName.size()) -
+   (ssize_t)NormalizedName.size()) > (ssize_t)BestDistance) {
+continue;
+  }
   Candidate = CandidatePrefix;
   Candidate += CandidateName;
   unsigned Distance = StringRef(Candidate).edit_distance(
Index: llvm/include/llvm/Option/OptTable.h
===
--- llvm/include/llvm/Option/OptTable.h
+++ llvm/include/llvm/Option/OptTable.h
@@ -175,11 +175,21 @@
   /// \param [in] MinimumLength - Don't find options shorter than this length.
   /// For example, a minimum length of 3 prevents "-x" from being considered
   /// near to "-S".
+  /// \param [in] MaximumDistance - Don't find options whose distance is 
greater
+  /// than this value.
   ///
   /// \return The edit distance of the nearest string found.
   unsigned findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 
0,
-   unsigned MinimumLength = 4) const;
+   unsigned MinimumLength = 4,
+   unsigned MaximumDistance = UINT_MAX - 1) const;
+
+  bool findExact(StringRef Option, std::string ,
+ unsigned FlagsToInclude = 0,
+ unsigned FlagsToExclude = 0) const {
+return findNearest(Option, ExactString, FlagsToInclude, FlagsToExclude, 4,
+   0) == 0;
+  }
 
   /// Parse a single argument; returning the new argument and
   /// updating Index.
Index: clang/lib/Driver/Driver.cpp
===
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -313,8 +313,8 @@
 std::string Nearest;
 if (getOpts().findNearest(ArgString, Nearest, IncludedFlagsBitmask,
   ExcludedFlagsBitmask) > 1) {
-  if (getOpts().findNearest(ArgString, Nearest, options::CC1Option) == 0 &&
-  !IsCLMode()) {
+  if (!IsCLMode() &&
+  getOpts().findExact(ArgString, Nearest, options::CC1Option)) {
 DiagID = diag::err_drv_unknown_argument_with_suggestion;
 Diags.Report(DiagID) << ArgString << "-Xclang " + Nearest;
   } else {
@@ -339,8 +339,8 @@
 // Warn on joined arguments that are similar to a long argument.
 std::string ArgString = ArgStrings[A->getIndex()];
 std::string Nearest;
-if (getOpts().findNearest("-" + ArgString, Nearest, IncludedFlagsBitmask,
-  ExcludedFlagsBitmask) == 0)
+if (getOpts().findExact("-" + ArgString, Nearest, IncludedFlagsBitmask,
+ExcludedFlagsBitmask))
   Diags.Report(diag::warn_drv_potentially_misspelled_joined_argument)
   << A->getAsString(Args) << Nearest;
   }


Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -227,12 +227,13 @@
 
 unsigned OptTable::findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude, 

[PATCH] D142026: Optimize OptTable::findNearest implementation and usage

2023-01-19 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 490412.
serge-sans-paille added a comment.

Thanks @nikic for the review. Remarks taken into account.


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

https://reviews.llvm.org/D142026

Files:
  clang/lib/Driver/Driver.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/Option/OptTable.cpp


Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -227,12 +227,13 @@
 
 unsigned OptTable::findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude, unsigned 
FlagsToExclude,
-   unsigned MinimumLength) const {
+   unsigned MinimumLength,
+   unsigned MaximumDistance) const {
   assert(!Option.empty());
 
   // Consider each [option prefix + option name] pair as a candidate, finding
   // the closest match.
-  unsigned BestDistance = UINT_MAX;
+  unsigned BestDistance = MaximumDistance + 1;
   SmallString<16> Candidate;
   SmallString<16> NormalizedName;
 
@@ -276,6 +277,14 @@
 // appropriate one. For example, if a user asks for "--helm", suggest
 // "--help" over "-help".
 for (auto CandidatePrefix : CandidateInfo.Prefixes) {
+  // If Candidate and NormalizedName have more than 'BestDistance'
+  // characters of difference, no need to compute the edit distance, it's
+  // going to be greater than BestDistance. Don't bother computing 
Candidate
+  // at all.
+  if (std::abs((ssize_t)(CandidatePrefix.size() + CandidateName.size()) -
+   (ssize_t)NormalizedName.size()) > (ssize_t)BestDistance) {
+continue;
+  }
   Candidate = CandidatePrefix;
   Candidate += CandidateName;
   unsigned Distance = StringRef(Candidate).edit_distance(
Index: llvm/include/llvm/Option/OptTable.h
===
--- llvm/include/llvm/Option/OptTable.h
+++ llvm/include/llvm/Option/OptTable.h
@@ -175,11 +175,21 @@
   /// \param [in] MinimumLength - Don't find options shorter than this length.
   /// For example, a minimum length of 3 prevents "-x" from being considered
   /// near to "-S".
+  /// \param [in] MaximumDistance - Don't find options whose distance is 
greater
+  /// than this value.
   ///
   /// \return The edit distance of the nearest string found.
   unsigned findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 
0,
-   unsigned MinimumLength = 4) const;
+   unsigned MinimumLength = 4,
+   unsigned MaximumDistance = UINT_MAX - 1) const;
+
+  bool findExact(StringRef Option, std::string ,
+ unsigned FlagsToInclude = 0,
+ unsigned FlagsToExclude = 0) const {
+return findNearest(Option, ExactString, FlagsToInclude, FlagsToExclude,
+   4, 0) == 0;
+  }
 
   /// Parse a single argument; returning the new argument and
   /// updating Index.
Index: clang/lib/Driver/Driver.cpp
===
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -313,8 +313,8 @@
 std::string Nearest;
 if (getOpts().findNearest(ArgString, Nearest, IncludedFlagsBitmask,
   ExcludedFlagsBitmask) > 1) {
-  if (getOpts().findNearest(ArgString, Nearest, options::CC1Option) == 0 &&
-  !IsCLMode()) {
+  if (!IsCLMode() &&
+  getOpts().findExact(ArgString, Nearest, options::CC1Option)) {
 DiagID = diag::err_drv_unknown_argument_with_suggestion;
 Diags.Report(DiagID) << ArgString << "-Xclang " + Nearest;
   } else {
@@ -339,8 +339,8 @@
 // Warn on joined arguments that are similar to a long argument.
 std::string ArgString = ArgStrings[A->getIndex()];
 std::string Nearest;
-if (getOpts().findNearest("-" + ArgString, Nearest, IncludedFlagsBitmask,
-  ExcludedFlagsBitmask) == 0)
+if (getOpts().findExact("-" + ArgString, Nearest, IncludedFlagsBitmask,
+ExcludedFlagsBitmask))
   Diags.Report(diag::warn_drv_potentially_misspelled_joined_argument)
   << A->getAsString(Args) << Nearest;
   }


Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -227,12 +227,13 @@
 
 unsigned OptTable::findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude, unsigned FlagsToExclude,
-   unsigned MinimumLength) const {
+   unsigned MinimumLength,
+   unsigned MaximumDistance) const {
   

[PATCH] D142026: Optimize OptTable::findNearest implementation and usage

2023-01-18 Thread serge via Phabricator via cfe-commits
serge-sans-paille created this revision.
serge-sans-paille added reviewers: aaron.ballman, nikic.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, MaskRay.
Herald added projects: clang, LLVM.

When used to find an exact match, some extra context can be used to
totally cut some computations.

This saves 1% of the instruction count when pre processing sqlite3.c
through

valgrind --tool=callgrind ./bin/clang -E sqlite3.c -o/dev/null


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142026

Files:
  clang/lib/Driver/Driver.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/Option/OptTable.cpp


Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -227,12 +227,13 @@
 
 unsigned OptTable::findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude, unsigned 
FlagsToExclude,
-   unsigned MinimumLength) const {
+   unsigned MinimumLength,
+   unsigned MinimumDistance) const {
   assert(!Option.empty());
 
   // Consider each [option prefix + option name] pair as a candidate, finding
   // the closest match.
-  unsigned BestDistance = UINT_MAX;
+  unsigned BestDistance = MinimumDistance + 1;
   SmallString<16> Candidate;
   SmallString<16> NormalizedName;
 
@@ -276,6 +277,14 @@
 // appropriate one. For example, if a user asks for "--helm", suggest
 // "--help" over "-help".
 for (auto CandidatePrefix : CandidateInfo.Prefixes) {
+  // If Candidate and NormalizedName have more than 'BestDistance'
+  // characters of difference, no need to compute the edit distance, it's
+  // going to be greater than BestDistance. Don't bother computing 
Candidate
+  // at all.
+  if (std::abs((signed)(CandidatePrefix.size() + CandidateName.size()) -
+   (signed)NormalizedName.size()) > (signed)BestDistance) {
+continue;
+  }
   Candidate = CandidatePrefix;
   Candidate += CandidateName;
   unsigned Distance = StringRef(Candidate).edit_distance(
Index: llvm/include/llvm/Option/OptTable.h
===
--- llvm/include/llvm/Option/OptTable.h
+++ llvm/include/llvm/Option/OptTable.h
@@ -175,11 +175,21 @@
   /// \param [in] MinimumLength - Don't find options shorter than this length.
   /// For example, a minimum length of 3 prevents "-x" from being considered
   /// near to "-S".
+  /// \param [in] MinimumDistance - Don't find options whose distance is 
greater
+  /// than this value.
   ///
   /// \return The edit distance of the nearest string found.
   unsigned findNearest(StringRef Option, std::string ,
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 
0,
-   unsigned MinimumLength = 4) const;
+   unsigned MinimumLength = 4,
+   unsigned MinimumDistance = UINT_MAX - 1) const;
+
+  bool findExact(StringRef Option, std::string ,
+ unsigned FlagsToInclude = 0,
+ unsigned FlagsToExclude = 0) const {
+return findNearest(Option, ExactString, FlagsToInclude, FlagsToExclude,
+   Option.size(), 0) == 0;
+  }
 
   /// Parse a single argument; returning the new argument and
   /// updating Index.
Index: clang/lib/Driver/Driver.cpp
===
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -313,8 +313,8 @@
 std::string Nearest;
 if (getOpts().findNearest(ArgString, Nearest, IncludedFlagsBitmask,
   ExcludedFlagsBitmask) > 1) {
-  if (getOpts().findNearest(ArgString, Nearest, options::CC1Option) == 0 &&
-  !IsCLMode()) {
+  if (!IsCLMode() &&
+  getOpts().findExact(ArgString, Nearest, options::CC1Option)) {
 DiagID = diag::err_drv_unknown_argument_with_suggestion;
 Diags.Report(DiagID) << ArgString << "-Xclang " + Nearest;
   } else {
@@ -339,8 +339,8 @@
 // Warn on joined arguments that are similar to a long argument.
 std::string ArgString = ArgStrings[A->getIndex()];
 std::string Nearest;
-if (getOpts().findNearest("-" + ArgString, Nearest, IncludedFlagsBitmask,
-  ExcludedFlagsBitmask) == 0)
+if (getOpts().findExact("-" + ArgString, Nearest, IncludedFlagsBitmask,
+ExcludedFlagsBitmask))
   Diags.Report(diag::warn_drv_potentially_misspelled_joined_argument)
   << A->getAsString(Args) << Nearest;
   }
@@ -2472,7 +2472,7 @@
 getIncludeExcludeOptionFlagMasks(IsCLMode());
 std::string Nearest;
 if (getOpts().findNearest(Value, 

[PATCH] D141814: [llvm][ADT] Replace uses of `makeMutableArrayRef` with deduction guides

2023-01-15 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

LGTM




Comment at: lldb/source/Host/common/NativeProcessProtocol.cpp:652
 
   auto data =
+  llvm::MutableArrayRef(static_cast(buf), bytes_read);

random nit: This could be rewritten as

```
llvm::MutableArrayRef data(static_cast(buf), bytes_read);
```

now


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141814

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


[PATCH] D140800: [OptTable] Precompute OptTable prefixes union table through tablegen

2023-01-12 Thread serge 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 rG07bb29d8ffc3: [OptTable] Precompute OptTable prefixes union 
table through tablegen (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140800

Files:
  clang/lib/Driver/DriverOptions.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
  lld/COFF/Driver.h
  lld/COFF/DriverUtils.cpp
  lld/ELF/Driver.h
  lld/ELF/DriverUtils.cpp
  lld/MachO/Driver.h
  lld/MachO/DriverUtils.cpp
  lld/MinGW/Driver.cpp
  lld/wasm/Driver.cpp
  lldb/tools/driver/Driver.cpp
  lldb/tools/lldb-server/lldb-gdbserver.cpp
  lldb/tools/lldb-vscode/lldb-vscode.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
  llvm/lib/Option/OptTable.cpp
  llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
  llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
  llvm/tools/dsymutil/dsymutil.cpp
  llvm/tools/llvm-cvtres/llvm-cvtres.cpp
  llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
  llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
  llvm/tools/llvm-ifs/llvm-ifs.cpp
  llvm/tools/llvm-lipo/llvm-lipo.cpp
  llvm/tools/llvm-ml/llvm-ml.cpp
  llvm/tools/llvm-mt/llvm-mt.cpp
  llvm/tools/llvm-nm/llvm-nm.cpp
  llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
  llvm/tools/llvm-objdump/llvm-objdump.cpp
  llvm/tools/llvm-rc/llvm-rc.cpp
  llvm/tools/llvm-readobj/llvm-readobj.cpp
  llvm/tools/llvm-size/llvm-size.cpp
  llvm/tools/llvm-strings/llvm-strings.cpp
  llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
  llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
  llvm/unittests/Option/OptionParsingTest.cpp
  llvm/utils/TableGen/OptParserEmitter.cpp

Index: llvm/utils/TableGen/OptParserEmitter.cpp
===
--- llvm/utils/TableGen/OptParserEmitter.cpp
+++ llvm/utils/TableGen/OptParserEmitter.cpp
@@ -237,8 +237,14 @@
   CurPrefix = NewPrefix;
   }
 
-  // Dump prefixes.
+  DenseSet PrefixesUnionSet;
+  for (const auto  : Prefixes)
+PrefixesUnionSet.insert(Prefix.first.begin(), Prefix.first.end());
+  SmallVector PrefixesUnion(PrefixesUnionSet.begin(),
+   PrefixesUnionSet.end());
+  array_pod_sort(PrefixesUnion.begin(), PrefixesUnion.end());
 
+  // Dump prefixes.
   OS << "/\n";
   OS << "// Prefixes\n\n";
   OS << "#ifdef PREFIX\n";
@@ -259,6 +265,20 @@
   OS << "#undef COMMA\n";
   OS << "#endif // PREFIX\n\n";
 
+  // Dump prefix unions.
+  OS << "/\n";
+  OS << "// Prefix Union\n\n";
+  OS << "#ifdef PREFIX_UNION\n";
+  OS << "#define COMMA ,\n";
+  OS << "PREFIX_UNION({\n";
+  for (const auto  : PrefixesUnion) {
+OS << "llvm::StringLiteral(\"" << Prefix << "\") COMMA ";
+  }
+  OS << "llvm::StringLiteral(\"\")})\n";
+  OS << "#undef COMMA\n";
+  OS << "#endif // PREFIX_UNION\n\n";
+
+  // Dump groups.
   OS << "/\n";
   OS << "// ValuesCode\n\n";
   OS << "#ifdef OPTTABLE_VALUES_CODE\n";
Index: llvm/unittests/Option/OptionParsingTest.cpp
===
--- llvm/unittests/Option/OptionParsingTest.cpp
+++ llvm/unittests/Option/OptionParsingTest.cpp
@@ -32,6 +32,14 @@
 #include "Opts.inc"
 #undef PREFIX
 
+static constexpr const StringLiteral PrefixTable_init[] =
+#define PREFIX_UNION(VALUES) VALUES
+#include "Opts.inc"
+#undef PREFIX_UNION
+;
+static constexpr const ArrayRef
+PrefixTable(PrefixTable_init, std::size(PrefixTable_init) - 1);
+
 enum OptionFlags {
   OptFlag1 = (1 << 4),
   OptFlag2 = (1 << 5),
@@ -48,10 +56,16 @@
 };
 
 namespace {
-class TestOptTable : public OptTable {
+class TestOptTable : public GenericOptTable {
 public:
   TestOptTable(bool IgnoreCase = false)
-: OptTable(InfoTable, IgnoreCase) {}
+  : GenericOptTable(InfoTable, IgnoreCase) {}
+};
+
+class TestPrecomputedOptTable : public PrecomputedOptTable {
+public:
+  TestPrecomputedOptTable(bool IgnoreCase = false)
+  : PrecomputedOptTable(InfoTable, PrefixTable, IgnoreCase) {}
 };
 }
 
@@ -67,8 +81,20 @@
   "-Gchuu", "2"
   };
 
-TEST(Option, OptionParsing) {
-  TestOptTable T;
+// Test fixture
+template  class OptTableTest : public ::testing::Test {};
+
+template  class DISABLED_OptTableTest : public ::testing::Test {};
+
+// Test both precomputed and computed OptTables with the same suite of tests.
+using OptTableTestTypes =
+::testing::Types;
+
+TYPED_TEST_SUITE(OptTableTest, OptTableTestTypes, );
+TYPED_TEST_SUITE(DISABLED_OptTableTest, OptTableTestTypes, );
+
+TYPED_TEST(OptTableTest, OptionParsing) {
+  TypeParam T;
   unsigned MAI, MAC;
   InputArgList AL = T.ParseArgs(Args, MAI, MAC);
 
@@ -114,8 +140,8 @@
   EXPECT_EQ("desu", StringRef(ASL[1]));
 }
 
-TEST(Option, ParseWithFlagExclusions) {
-  TestOptTable T;
+TYPED_TEST(OptTableTest, 

[PATCH] D140699: [OptTable] Make ValuesCode initialisation of Options constexpr

2023-01-12 Thread serge 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 rGbbe463d6ba26: [OptTable] Make ValuesCode initialisation of 
Options constexpr (authored by serge-sans-paille).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140699

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/DriverOptions.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/Option/OptTable.cpp
  llvm/utils/TableGen/OptParserEmitter.cpp

Index: llvm/utils/TableGen/OptParserEmitter.cpp
===
--- llvm/utils/TableGen/OptParserEmitter.cpp
+++ llvm/utils/TableGen/OptParserEmitter.cpp
@@ -259,6 +259,21 @@
   OS << "#undef COMMA\n";
   OS << "#endif // PREFIX\n\n";
 
+  OS << "/\n";
+  OS << "// ValuesCode\n\n";
+  OS << "#ifdef OPTTABLE_VALUES_CODE\n";
+  for (const Record  : llvm::make_pointee_range(Opts)) {
+// The option values, if any;
+if (!isa(R.getValueInit("ValuesCode"))) {
+  assert(isa(R.getValueInit("Values")) &&
+ "Cannot choose between Values and ValuesCode");
+  OS << "#define VALUES_CODE " << getOptionName(R) << "_Values\n";
+  OS << R.getValueAsString("ValuesCode") << "\n";
+  OS << "#undef VALUES_CODE\n";
+}
+  }
+  OS << "#endif\n";
+
   OS << "/\n";
   OS << "// Groups\n\n";
   OS << "#ifdef OPTION\n";
@@ -388,6 +403,9 @@
 OS << ", ";
 if (!isa(R.getValueInit("Values")))
   write_cstring(OS, R.getValueAsString("Values"));
+else if (!isa(R.getValueInit("ValuesCode"))) {
+  OS << getOptionName(R) << "_Values";
+}
 else
   OS << "nullptr";
   };
@@ -460,29 +478,5 @@
   OS << "\n";
 
   OS << "\n";
-  OS << "#ifdef OPTTABLE_ARG_INIT\n";
-  OS << "//\n";
-  OS << "// Option Values\n\n";
-  for (const Record  : llvm::make_pointee_range(Opts)) {
-if (isa(R.getValueInit("ValuesCode")))
-  continue;
-OS << "{\n";
-OS << "bool ValuesWereAdded;\n";
-OS << R.getValueAsString("ValuesCode");
-OS << "\n";
-for (StringRef Prefix : R.getValueAsListOfStrings("Prefixes")) {
-  OS << "ValuesWereAdded = Opt.addValues(";
-  std::string S(Prefix);
-  S += R.getValueAsString("Name");
-  write_cstring(OS, S);
-  OS << ", Values);\n";
-  OS << "(void)ValuesWereAdded;\n";
-  OS << "assert(ValuesWereAdded && \"Couldn't add values to "
-"OptTable!\");\n";
-}
-OS << "}\n";
-  }
-  OS << "\n";
-  OS << "#endif // OPTTABLE_ARG_INIT\n";
 }
 } // end namespace llvm
Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -300,17 +300,6 @@
   return BestDistance;
 }
 
-bool OptTable::addValues(StringRef Option, const char *Values) {
-  for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
-Info  = OptionInfos[I];
-if (optionMatches(In, Option)) {
-  In.Values = Values;
-  return true;
-}
-  }
-  return false;
-}
-
 // Parse a single argument, return the new argument, and update Index. If
 // GroupedShortOptions is true, -a matches "-abc" and the argument in Args will
 // be updated to "-bc". This overload does not support
Index: llvm/include/llvm/Option/OptTable.h
===
--- llvm/include/llvm/Option/OptTable.h
+++ llvm/include/llvm/Option/OptTable.h
@@ -60,7 +60,7 @@
 
 private:
   /// The option information table.
-  std::vector OptionInfos;
+  ArrayRef OptionInfos;
   bool IgnoreCase;
   bool GroupedShortOptions = false;
   const char *EnvVar = nullptr;
@@ -174,17 +174,6 @@
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 0,
unsigned MinimumLength = 4) const;
 
-  /// Add Values to Option's Values class
-  ///
-  /// \param [in] Option - Prefix + Name of the flag which Values will be
-  ///  changed. For example, "-analyzer-checker".
-  /// \param [in] Values - String of Values seperated by ",", such as
-  ///  "foo, bar..", where foo and bar is the argument which the Option flag
-  ///  takes
-  ///
-  /// \return true in success, and false in fail.
-  bool addValues(StringRef Option, const char *Values);
-
   /// Parse a single argument; returning the new argument and
   /// updating Index.
   ///
Index: clang/lib/Driver/DriverOptions.cpp
===
--- clang/lib/Driver/DriverOptions.cpp
+++ clang/lib/Driver/DriverOptions.cpp
@@ -16,6 +16,10 @@
 using namespace clang::driver::options;
 using namespace llvm::opt;
 
+#define OPTTABLE_VALUES_CODE
+#include "clang/Driver/Options.inc"
+#undef OPTTABLE_VALUES_CODE
+
 #define PREFIX(NAME, VALUE)\
   static constexpr 

[PATCH] D140699: [OptTable] Make ValuesCode initialisation of Options constexpr

2023-01-11 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 488348.
serge-sans-paille added a comment.

nits + rebased on main


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

https://reviews.llvm.org/D140699

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/DriverOptions.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/Option/OptTable.cpp
  llvm/utils/TableGen/OptParserEmitter.cpp

Index: llvm/utils/TableGen/OptParserEmitter.cpp
===
--- llvm/utils/TableGen/OptParserEmitter.cpp
+++ llvm/utils/TableGen/OptParserEmitter.cpp
@@ -259,6 +259,21 @@
   OS << "#undef COMMA\n";
   OS << "#endif // PREFIX\n\n";
 
+  OS << "/\n";
+  OS << "// ValuesCode\n\n";
+  OS << "#ifdef OPTTABLE_VALUES_CODE\n";
+  for (const Record  : llvm::make_pointee_range(Opts)) {
+// The option values, if any;
+if (!isa(R.getValueInit("ValuesCode"))) {
+  assert(isa(R.getValueInit("Values")) &&
+ "Cannot choose between Values and ValuesCode");
+  OS << "#define VALUES_CODE " << getOptionName(R) << "_Values\n";
+  OS << R.getValueAsString("ValuesCode") << "\n";
+  OS << "#undef VALUES_CODE\n";
+}
+  }
+  OS << "#endif\n";
+
   OS << "/\n";
   OS << "// Groups\n\n";
   OS << "#ifdef OPTION\n";
@@ -388,6 +403,9 @@
 OS << ", ";
 if (!isa(R.getValueInit("Values")))
   write_cstring(OS, R.getValueAsString("Values"));
+else if (!isa(R.getValueInit("ValuesCode"))) {
+  OS << getOptionName(R) << "_Values";
+}
 else
   OS << "nullptr";
   };
@@ -460,29 +478,5 @@
   OS << "\n";
 
   OS << "\n";
-  OS << "#ifdef OPTTABLE_ARG_INIT\n";
-  OS << "//\n";
-  OS << "// Option Values\n\n";
-  for (const Record  : llvm::make_pointee_range(Opts)) {
-if (isa(R.getValueInit("ValuesCode")))
-  continue;
-OS << "{\n";
-OS << "bool ValuesWereAdded;\n";
-OS << R.getValueAsString("ValuesCode");
-OS << "\n";
-for (StringRef Prefix : R.getValueAsListOfStrings("Prefixes")) {
-  OS << "ValuesWereAdded = Opt.addValues(";
-  std::string S(Prefix);
-  S += R.getValueAsString("Name");
-  write_cstring(OS, S);
-  OS << ", Values);\n";
-  OS << "(void)ValuesWereAdded;\n";
-  OS << "assert(ValuesWereAdded && \"Couldn't add values to "
-"OptTable!\");\n";
-}
-OS << "}\n";
-  }
-  OS << "\n";
-  OS << "#endif // OPTTABLE_ARG_INIT\n";
 }
 } // end namespace llvm
Index: llvm/lib/Option/OptTable.cpp
===
--- llvm/lib/Option/OptTable.cpp
+++ llvm/lib/Option/OptTable.cpp
@@ -300,17 +300,6 @@
   return BestDistance;
 }
 
-bool OptTable::addValues(StringRef Option, const char *Values) {
-  for (size_t I = FirstSearchableIndex, E = OptionInfos.size(); I < E; I++) {
-Info  = OptionInfos[I];
-if (optionMatches(In, Option)) {
-  In.Values = Values;
-  return true;
-}
-  }
-  return false;
-}
-
 // Parse a single argument, return the new argument, and update Index. If
 // GroupedShortOptions is true, -a matches "-abc" and the argument in Args will
 // be updated to "-bc". This overload does not support
Index: llvm/include/llvm/Option/OptTable.h
===
--- llvm/include/llvm/Option/OptTable.h
+++ llvm/include/llvm/Option/OptTable.h
@@ -60,7 +60,7 @@
 
 private:
   /// The option information table.
-  std::vector OptionInfos;
+  ArrayRef OptionInfos;
   bool IgnoreCase;
   bool GroupedShortOptions = false;
   const char *EnvVar = nullptr;
@@ -174,17 +174,6 @@
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 0,
unsigned MinimumLength = 4) const;
 
-  /// Add Values to Option's Values class
-  ///
-  /// \param [in] Option - Prefix + Name of the flag which Values will be
-  ///  changed. For example, "-analyzer-checker".
-  /// \param [in] Values - String of Values seperated by ",", such as
-  ///  "foo, bar..", where foo and bar is the argument which the Option flag
-  ///  takes
-  ///
-  /// \return true in success, and false in fail.
-  bool addValues(StringRef Option, const char *Values);
-
   /// Parse a single argument; returning the new argument and
   /// updating Index.
   ///
Index: clang/lib/Driver/DriverOptions.cpp
===
--- clang/lib/Driver/DriverOptions.cpp
+++ clang/lib/Driver/DriverOptions.cpp
@@ -16,6 +16,10 @@
 using namespace clang::driver::options;
 using namespace llvm::opt;
 
+#define OPTTABLE_VALUES_CODE
+#include "clang/Driver/Options.inc"
+#undef OPTTABLE_VALUES_CODE
+
 #define PREFIX(NAME, VALUE)\
   static constexpr llvm::StringLiteral NAME##_init[] = VALUE;  \
   static constexpr llvm::ArrayRef NAME(   \
@@ -43,16 +47,6 @@
 }
 
 const llvm::opt::OptTable 

[PATCH] D140800: [OptTable] Precompute OptTable prefixes union table through tablegen

2023-01-11 Thread serge via Phabricator via cfe-commits
serge-sans-paille marked 2 inline comments as done.
serge-sans-paille added a comment.

In D140800#4043723 , @nikic wrote:

> Just to check, this isn't going to cause some warning spew about all those 
> OptTable implementations being non-final?

nope. Why would there be?




Comment at: llvm/unittests/Option/OptionParsingTest.cpp:327
 
-TEST(DISABLED_Option, FindNearestFIXME) {
-  TestOptTable T;

@nikic: the `DISABLED_` prefix seems to be a gtest convention, see 
https://github.com/google/googletest/blob/main/docs/advanced.md#temporarily-disabling-tests


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

https://reviews.llvm.org/D140800

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


[PATCH] D140800: [OptTable] Precompute OptTable prefixes union table through tablegen

2023-01-11 Thread serge via Phabricator via cfe-commits
serge-sans-paille updated this revision to Diff 488344.
serge-sans-paille added a comment.

Nits + rebase on main branch


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

https://reviews.llvm.org/D140800

Files:
  clang/lib/Driver/DriverOptions.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
  lld/COFF/Driver.h
  lld/COFF/DriverUtils.cpp
  lld/ELF/Driver.h
  lld/ELF/DriverUtils.cpp
  lld/MachO/Driver.h
  lld/MachO/DriverUtils.cpp
  lld/MinGW/Driver.cpp
  lld/wasm/Driver.cpp
  lldb/tools/driver/Driver.cpp
  lldb/tools/lldb-server/lldb-gdbserver.cpp
  lldb/tools/lldb-vscode/lldb-vscode.cpp
  llvm/include/llvm/Option/OptTable.h
  llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
  llvm/lib/Option/OptTable.cpp
  llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
  llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
  llvm/tools/dsymutil/dsymutil.cpp
  llvm/tools/llvm-cvtres/llvm-cvtres.cpp
  llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
  llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
  llvm/tools/llvm-ifs/llvm-ifs.cpp
  llvm/tools/llvm-lipo/llvm-lipo.cpp
  llvm/tools/llvm-ml/llvm-ml.cpp
  llvm/tools/llvm-mt/llvm-mt.cpp
  llvm/tools/llvm-nm/llvm-nm.cpp
  llvm/tools/llvm-objcopy/ObjcopyOptions.cpp
  llvm/tools/llvm-objdump/llvm-objdump.cpp
  llvm/tools/llvm-rc/llvm-rc.cpp
  llvm/tools/llvm-readobj/llvm-readobj.cpp
  llvm/tools/llvm-size/llvm-size.cpp
  llvm/tools/llvm-strings/llvm-strings.cpp
  llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
  llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
  llvm/unittests/Option/OptionParsingTest.cpp
  llvm/utils/TableGen/OptParserEmitter.cpp

Index: llvm/utils/TableGen/OptParserEmitter.cpp
===
--- llvm/utils/TableGen/OptParserEmitter.cpp
+++ llvm/utils/TableGen/OptParserEmitter.cpp
@@ -237,8 +237,14 @@
   CurPrefix = NewPrefix;
   }
 
-  // Dump prefixes.
+  DenseSet PrefixesUnionSet;
+  for (const auto  : Prefixes)
+PrefixesUnionSet.insert(Prefix.first.begin(), Prefix.first.end());
+  SmallVector PrefixesUnion(PrefixesUnionSet.begin(),
+   PrefixesUnionSet.end());
+  array_pod_sort(PrefixesUnion.begin(), PrefixesUnion.end());
 
+  // Dump prefixes.
   OS << "/\n";
   OS << "// Prefixes\n\n";
   OS << "#ifdef PREFIX\n";
@@ -259,6 +265,20 @@
   OS << "#undef COMMA\n";
   OS << "#endif // PREFIX\n\n";
 
+  // Dump prefix unions.
+  OS << "/\n";
+  OS << "// Prefix Union\n\n";
+  OS << "#ifdef PREFIX_UNION\n";
+  OS << "#define COMMA ,\n";
+  OS << "PREFIX_UNION({\n";
+  for (const auto  : PrefixesUnion) {
+OS << "llvm::StringLiteral(\"" << Prefix << "\") COMMA ";
+  }
+  OS << "llvm::StringLiteral(\"\")})\n";
+  OS << "#undef COMMA\n";
+  OS << "#endif // PREFIX_UNION\n\n";
+
+  // Dump groups.
   OS << "/\n";
   OS << "// ValuesCode\n\n";
   OS << "#ifdef OPTTABLE_VALUES_CODE\n";
Index: llvm/unittests/Option/OptionParsingTest.cpp
===
--- llvm/unittests/Option/OptionParsingTest.cpp
+++ llvm/unittests/Option/OptionParsingTest.cpp
@@ -32,6 +32,14 @@
 #include "Opts.inc"
 #undef PREFIX
 
+static constexpr const StringLiteral PrefixTable_init[] =
+#define PREFIX_UNION(VALUES) VALUES
+#include "Opts.inc"
+#undef PREFIX_UNION
+;
+static constexpr const ArrayRef
+PrefixTable(PrefixTable_init, std::size(PrefixTable_init) - 1);
+
 enum OptionFlags {
   OptFlag1 = (1 << 4),
   OptFlag2 = (1 << 5),
@@ -48,10 +56,16 @@
 };
 
 namespace {
-class TestOptTable : public OptTable {
+class TestOptTable : public GenericOptTable {
 public:
   TestOptTable(bool IgnoreCase = false)
-: OptTable(InfoTable, IgnoreCase) {}
+  : GenericOptTable(InfoTable, IgnoreCase) {}
+};
+
+class TestPrecomputedOptTable : public PrecomputedOptTable {
+public:
+  TestPrecomputedOptTable(bool IgnoreCase = false)
+  : PrecomputedOptTable(InfoTable, PrefixTable, IgnoreCase) {}
 };
 }
 
@@ -67,8 +81,20 @@
   "-Gchuu", "2"
   };
 
-TEST(Option, OptionParsing) {
-  TestOptTable T;
+// Test fixture
+template  class OptTableTest : public ::testing::Test {};
+
+template  class DISABLED_OptTableTest : public ::testing::Test {};
+
+// Test both precomputed and computed OptTables with the same suite of tests.
+using OptTableTestTypes =
+::testing::Types;
+
+TYPED_TEST_SUITE(OptTableTest, OptTableTestTypes, );
+TYPED_TEST_SUITE(DISABLED_OptTableTest, OptTableTestTypes, );
+
+TYPED_TEST(OptTableTest, OptionParsing) {
+  TypeParam T;
   unsigned MAI, MAC;
   InputArgList AL = T.ParseArgs(Args, MAI, MAC);
 
@@ -114,8 +140,8 @@
   EXPECT_EQ("desu", StringRef(ASL[1]));
 }
 
-TEST(Option, ParseWithFlagExclusions) {
-  TestOptTable T;
+TYPED_TEST(OptTableTest, ParseWithFlagExclusions) {
+  TypeParam T;
   unsigned MAI, MAC;
 
   // Exclude flag3 to avoid parsing as OPT_SLASH_C.
@@ -142,8 +168,8 @@
   EXPECT_EQ("bar", AL.getLastArgValue(OPT_C));
 }
 

[PATCH] D141047: build: with -DCLANGD_ENABLE_REMOTE=ON, search for grpc++ dependencies too

2023-01-10 Thread serge via Phabricator via cfe-commits
serge-sans-paille accepted this revision.
serge-sans-paille added a comment.
This revision is now accepted and ready to land.

LGTM, assuming, you actually tested that locally.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141047

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


[PATCH] D140800: [OptTable] Precompute OptTable prefixes union table through tablegen

2023-01-09 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.

@nikic : gentle ping :-)


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

https://reviews.llvm.org/D140800

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


[PATCH] D140699: [OptTable] Make ValuesCode initialisation of Options constexpr

2023-01-09 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.
Herald added a subscriber: StephenFan.

@nikic: gentle ping


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

https://reviews.llvm.org/D140699

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


[PATCH] D141298: Move from llvm::makeArrayRef to ArrayRef deduction guides - last part

2023-01-09 Thread serge via Phabricator via cfe-commits
serge-sans-paille added a comment.
Herald added subscribers: Michael137, JDevlieghere.

Once that patch lands, I'll mark `makeArrayRef` as deprecated.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141298

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


[PATCH] D141047: build: with -DCLANGD_ENABLE_REMOTE=ON, search for grpc++ dependencies too

2023-01-05 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: cmake/Modules/FindGRPC.cmake:85
   if(NOT TARGET grpc++)
+find_library(GPR_LIBRARY gpr $GRPC_OPTS REQUIRED)
+add_library(gpr UNKNOWN IMPORTED GLOBAL)

Shouldn't this be `${GPRC_OPTS}`?



Comment at: cmake/Modules/FindGRPC.cmake:95
 target_include_directories(grpc++ INTERFACE ${GRPC_INCLUDE_PATHS})
+find_library(GRPC2_LIBRARY grpc $GRPC_OPTS REQUIRED)
+add_library(grpc UNKNOWN IMPORTED GLOBAL)

same here



Comment at: cmake/Modules/FindGRPC.cmake:100
+
+find_library(ABSL_SYNCHRONIZATION_LIBRARY absl_synchronization $GRPC_OPTS 
QUIET)
+if (ABSL_SYNCHRONIZATION_LIBRARY)

and here?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141047

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


  1   2   3   4   5   6   7   8   9   >