[llvm] r282451 - [CodeGen] Add support for emitting .init_array instead of .ctors on FreeBSD.

Ed Maste via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 29 13:40:03 PDT 2016


On 26 September 2016 at 18:53, Davide Italiano via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: davide
> Date: Mon Sep 26 17:53:15 2016
> New Revision: 282451
>
> URL: http://llvm.org/viewvc/llvm-project?rev=282451&view=rev
> Log:
> [CodeGen] Add support for emitting .init_array instead of .ctors on FreeBSD.

This needs to be based on the FreeBSD version - there's no .init_array
support in rtld in FreeBSD 9. FreeBSD 10 and 11 support .init_array
but the default toolchains use .ctors, so we could end up with hard to
track down changes in static ctor ordering.

I tried the change below in Clang, which is how I found in PR30494
that -fuse-init-array does nothing on certain targets.

commit 35620dc26267407da73f5d82777398ad6552facc
Author: Ed Maste <emaste at freebsd.org>
Date:   Thu Sep 22 12:49:27 2016 -0400

    Request init/fini array on FreeBSD 12 and later

diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 06cb227..e41f917 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -2827,6 +2827,8 @@ void Generic_ELF::addClangTargetOptions(const
ArgList &DriverArgs,
   bool UseInitArrayDefault =
       getTriple().getArch() == llvm::Triple::aarch64 ||
       getTriple().getArch() == llvm::Triple::aarch64_be ||
+      (getTriple().getOS() == llvm::Triple::FreeBSD &&
+       getTriple().getOSMajorVersion() >= 12) ||
       (getTriple().getOS() == llvm::Triple::Linux &&
        (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
       getTriple().getOS() == llvm::Triple::NaCl ||
diff --git a/test/Driver/constructors.c b/test/Driver/constructors.c
index cd14ed7..fb6ea31 100644
--- a/test/Driver/constructors.c
+++ b/test/Driver/constructors.c
@@ -74,3 +74,11 @@
 // RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1       \
 // RUN:     -target arm64-none-none-eabi \
 // RUN:   | FileCheck --check-prefix=CHECK-INIT-ARRAY %s
+
+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1       \
+// RUN:     -target i386-unknown-freebsd11 \
+// RUN:   | FileCheck --check-prefix=CHECK-NO-INIT-ARRAY %s
+
+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1       \
+// RUN:     -target i386-unknown-freebsd12 \
+// RUN:   | FileCheck --check-prefix=CHECK-INIT-ARRAY %s


More information about the llvm-commits mailing list