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

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 29 14:48:38 PDT 2016


On Thu, Sep 29, 2016 at 1:40 PM, Ed Maste <emaste at freebsd.org> wrote:
> 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

Fair enough, but please get approval from somebody Clang-side.

-- 
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare


More information about the llvm-commits mailing list