git: 3db2bfaf72d6 - main - devel/llvm16: merge backports from FreeBSD src

From: Brooks Davis <brooks_at_FreeBSD.org>
Date: Mon, 04 Dec 2023 20:55:30 UTC
The branch main has been updated by brooks:

URL: https://cgit.FreeBSD.org/ports/commit/?id=3db2bfaf72d6bd5dd92f8a0474883f365acbb016

commit 3db2bfaf72d6bd5dd92f8a0474883f365acbb016
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2023-12-04 20:42:18 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2023-12-04 20:55:18 +0000

    devel/llvm16: merge backports from FreeBSD src
    
    These upstream LLVM commits have been merged to FreeBSD's source tree
    post the 17.0.6 release:
    
    7440e4ed85aa [sanitizer] Add re-execution on FreeBSD when ASLR is detected (#73439)
    989879f8fded [Clang] Allow C++11 style initialisation of SVE types.
    9ca395b5ade1 [clang][AST] Propagate the contains-errors bit to DeclRefExpr from VarDecl's initializer.
    
    While here, be consistant about using 12 digits of commit hash.
---
 devel/llvm16/Makefile                              |  2 +-
 ...port-3450272fc2 => patch-backport-3450272fc281} |  0
 devel/llvm16/files/patch-backport-7440e4ed85aa     | 79 ++++++++++++++++++++++
 ...ckport-962c306a1 => patch-backport-962c306a11d} |  0
 devel/llvm16/files/patch-backport-989879f8fded     | 38 +++++++++++
 devel/llvm16/files/patch-backport-9ca395b5ade1     | 63 +++++++++++++++++
 6 files changed, 181 insertions(+), 1 deletion(-)

diff --git a/devel/llvm16/Makefile b/devel/llvm16/Makefile
index 77288c9bc607..fe47ead79817 100644
--- a/devel/llvm16/Makefile
+++ b/devel/llvm16/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	llvm
 DISTVERSION=	16.0.6
-PORTREVISION=	6
+PORTREVISION=	7
 CATEGORIES=	devel lang
 MASTER_SITES=	https://github.com/llvm/llvm-project/releases/download/llvmorg-${DISTVERSION:S/rc/-rc/}/ \
 		https://${PRE_}releases.llvm.org/${LLVM_RELEASE}${RCDIR}/
diff --git a/devel/llvm16/files/patch-backport-3450272fc2 b/devel/llvm16/files/patch-backport-3450272fc281
similarity index 100%
rename from devel/llvm16/files/patch-backport-3450272fc2
rename to devel/llvm16/files/patch-backport-3450272fc281
diff --git a/devel/llvm16/files/patch-backport-7440e4ed85aa b/devel/llvm16/files/patch-backport-7440e4ed85aa
new file mode 100644
index 000000000000..ce6954226d56
--- /dev/null
+++ b/devel/llvm16/files/patch-backport-7440e4ed85aa
@@ -0,0 +1,79 @@
+commit 7440e4ed85aa992718d4b5ccd1c97724bc3bdd2c
+Author: Dimitry Andric <dimitry@andric.com>
+Date:   Mon Nov 27 22:43:33 2023 +0100
+
+    [sanitizer] Add re-execution on FreeBSD when ASLR is detected (#73439)
+    
+    In the FreeBSD base system, re-executing the main binary when ASLR is
+    detected was implemented in the following commits:
+    
+    * freebsd/freebsd-src@7cafe89f9ce33
+    * freebsd/freebsd-src@96fe7c8ab0f65
+    * freebsd/freebsd-src@930a7c2ac67e1
+    * freebsd/freebsd-src@0a736f0a6aeb0
+    * freebsd/freebsd-src@4c9a0adad1826
+    
+    Squash all these to bring them into upstream compiler-rt.
+    
+    When ASLR is detected to be enabled, this first force-disables ASLR for
+    the current process, then calls ReExec(). The ReExec() function gets a
+    FreeBSD specific implementation for finding the path of the executed
+    program, via the ELF auxiliary vector. This is done without calling into
+    the regular elf_aux_info(3) function, as that makes use of several
+    already-intercepted functions.
+
+diff --git compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+index d2b3b63f3a7a..8759d96609e5 100644
+--- compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
++++ compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+@@ -2323,9 +2323,12 @@ void CheckASLR() {
+     return;
+   }
+   if ((aslr_status & PROC_ASLR_ACTIVE) != 0) {
+-    Printf("This sanitizer is not compatible with enabled ASLR "
+-           "and binaries compiled with PIE\n");
+-    Die();
++    VReport(1, "This sanitizer is not compatible with enabled ASLR "
++               "and binaries compiled with PIE\n"
++               "ASLR will be disabled and the program re-executed.\n");
++    int aslr_ctl = PROC_ASLR_FORCE_DISABLE;
++    CHECK_NE(internal_procctl(P_PID, 0, PROC_ASLR_CTL, &aslr_ctl), -1);
++    ReExec();
+   }
+ #  elif SANITIZER_PPC64V2
+   // Disable ASLR for Linux PPC64LE.
+diff --git compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
+index fcfaa0c36c22..b41f778ea94b 100644
+--- compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
++++ compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp
+@@ -48,12 +48,14 @@
+ #if SANITIZER_FREEBSD
+ #include <pthread_np.h>
+ #include <osreldate.h>
++#include <sys/auxv.h>
+ #include <sys/sysctl.h>
+ #define pthread_getattr_np pthread_attr_get_np
+ // The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before
+ // that, it was never implemented. So just define it to zero.
+ #undef MAP_NORESERVE
+ #define MAP_NORESERVE 0
++extern const Elf_Auxinfo *__elf_aux_vector;
+ #endif
+ 
+ #if SANITIZER_NETBSD
+@@ -941,7 +943,14 @@ u64 MonotonicNanoTime() {
+ void ReExec() {
+   const char *pathname = "/proc/self/exe";
+ 
+-#if SANITIZER_NETBSD
++#if SANITIZER_FREEBSD
++  for (const auto *aux = __elf_aux_vector; aux->a_type != AT_NULL; aux++) {
++    if (aux->a_type == AT_EXECPATH) {
++      pathname = static_cast<const char *>(aux->a_un.a_ptr);
++      break;
++    }
++  }
++#elif SANITIZER_NETBSD
+   static const int name[] = {
+       CTL_KERN,
+       KERN_PROC_ARGS,
diff --git a/devel/llvm16/files/patch-backport-962c306a1 b/devel/llvm16/files/patch-backport-962c306a11d
similarity index 100%
rename from devel/llvm16/files/patch-backport-962c306a1
rename to devel/llvm16/files/patch-backport-962c306a11d
diff --git a/devel/llvm16/files/patch-backport-989879f8fded b/devel/llvm16/files/patch-backport-989879f8fded
new file mode 100644
index 000000000000..dc53d35953cf
--- /dev/null
+++ b/devel/llvm16/files/patch-backport-989879f8fded
@@ -0,0 +1,38 @@
+commit 989879f8fded41c732db93864461b3a67b9f1501
+Author: Paul Walker <paul.walker@arm.com>
+Date:   Thu Jun 22 14:03:28 2023 +0000
+
+    [Clang] Allow C++11 style initialisation of SVE types.
+    
+    Fixes https://github.com/llvm/llvm-project/issues/63223
+    
+    Differential Revision: https://reviews.llvm.org/D153560
+
+diff --git clang/lib/CodeGen/CGExprScalar.cpp clang/lib/CodeGen/CGExprScalar.cpp
+index 02b80f3aba21..dbba8cc96f81 100644
+--- clang/lib/CodeGen/CGExprScalar.cpp
++++ clang/lib/CodeGen/CGExprScalar.cpp
+@@ -1869,6 +1869,23 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) {
+     return Visit(E->getInit(0));
+   }
+ 
++  if (isa<llvm::ScalableVectorType>(VType)) {
++    if (NumInitElements == 0) {
++      // C++11 value-initialization for the vector.
++      return EmitNullValue(E->getType());
++    }
++
++    if (NumInitElements == 1) {
++      Expr *InitVector = E->getInit(0);
++
++      // Initialize from another scalable vector of the same type.
++      if (InitVector->getType() == E->getType())
++        return Visit(InitVector);
++    }
++
++    llvm_unreachable("Unexpected initialization of a scalable vector!");
++  }
++
+   unsigned ResElts = cast<llvm::FixedVectorType>(VType)->getNumElements();
+ 
+   // Loop over initializers collecting the Value for each, and remembering
diff --git a/devel/llvm16/files/patch-backport-9ca395b5ade1 b/devel/llvm16/files/patch-backport-9ca395b5ade1
new file mode 100644
index 000000000000..7a0122918700
--- /dev/null
+++ b/devel/llvm16/files/patch-backport-9ca395b5ade1
@@ -0,0 +1,63 @@
+commit 9ca395b5ade105aee63db20534d49a1c58ac76c7
+Author: Haojian Wu <hokein.wu@gmail.com>
+Date:   Mon Jul 10 18:22:12 2023 +0200
+
+    [clang][AST] Propagate the contains-errors bit to DeclRefExpr from VarDecl's initializer.
+    
+    Similar to the https://reviews.llvm.org/D86048 (it only sets the bit for C++
+    code), we propagate the contains-errors bit for C-code path.
+    
+    Fixes https://github.com/llvm/llvm-project/issues/50236
+    Fixes https://github.com/llvm/llvm-project/issues/50243
+    Fixes https://github.com/llvm/llvm-project/issues/48636
+    Fixes https://github.com/llvm/llvm-project/issues/50320
+    
+    Differential Revision: https://reviews.llvm.org/D154861
+
+diff --git clang/lib/AST/ComputeDependence.cpp clang/lib/AST/ComputeDependence.cpp
+index 632f38f711fb..09df5401d669 100644
+--- clang/lib/AST/ComputeDependence.cpp
++++ clang/lib/AST/ComputeDependence.cpp
+@@ -489,7 +489,7 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
+   // more bullets here that we handle by treating the declaration as having a
+   // dependent type if they involve a placeholder type that can't be deduced.]
+   if (Type->isDependentType())
+-    return Deps | ExprDependence::TypeValueInstantiation;
++    Deps |= ExprDependence::TypeValueInstantiation;
+   else if (Type->isInstantiationDependentType())
+     Deps |= ExprDependence::Instantiation;
+ 
+@@ -525,13 +525,13 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
+   //   - it names a potentially-constant variable that is initialized with an
+   //     expression that is value-dependent
+   if (const auto *Var = dyn_cast<VarDecl>(Decl)) {
+-    if (Var->mightBeUsableInConstantExpressions(Ctx)) {
+-      if (const Expr *Init = Var->getAnyInitializer()) {
+-        if (Init->isValueDependent())
+-          Deps |= ExprDependence::ValueInstantiation;
+-        if (Init->containsErrors())
+-          Deps |= ExprDependence::Error;
+-      }
++    if (const Expr *Init = Var->getAnyInitializer()) {
++      if (Init->containsErrors())
++        Deps |= ExprDependence::Error;
++
++      if (Var->mightBeUsableInConstantExpressions(Ctx) &&
++          Init->isValueDependent())
++        Deps |= ExprDependence::ValueInstantiation;
+     }
+ 
+     // - it names a static data member that is a dependent member of the
+diff --git clang/test/SemaCXX/cxx11-crashes.cpp clang/test/SemaCXX/cxx11-crashes.cpp
+index a15fea336f8c..11bc42315421 100644
+--- clang/test/SemaCXX/cxx11-crashes.cpp
++++ clang/test/SemaCXX/cxx11-crashes.cpp
+@@ -65,7 +65,7 @@ namespace b6981007 {
+   struct S {}; // expected-note 3{{candidate}}
+   void f() {
+     S s(1, 2, 3); // expected-error {{no matching}}
+-    for (auto x : s) { // expected-error {{invalid range expression of}}
++    for (auto x : s) {
+       // We used to attempt to evaluate the initializer of this variable,
+       // and crash because it has an undeduced type.
+       const int &n(x);