tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: clang/llvm on aarch64



Michał Górny <mgorny%gentoo.org@localhost> wrote:
>On Wed, 2019-08-28 at 02:40 +0100, Robert Swindells wrote:
>> I wrote:
>> > It looks like clang++ on aarch64 is broken too, but in a different way.
>> > 
>> > Static constructors don't get called. I do have a small test application
>> > that demonstrates this.
>> 
>> This looks to be caused by clang/llvm putting the references to the
>> constructor in the .ctors section instead of the .init_array section as
>> required by the ABI.
>> 
>> There is code in clang to select this and a web search turns up some
>> patches from 2014 to enable it for all AARCH64 ELF platforms but the
>> source tree seems to have changed a lot since then.
>
>I see the following for Generic_ELF thingy:
>
>  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
>                         options::OPT_fno_use_init_array, UseInitArrayDefault))
>    CC1Args.push_back("-fuse-init-array");
>
>NetBSD should be using that.  Could you verify with 'clang -v' whether
>it's being passed to cc1?

The NetBSD ToolChain class that is derived from the Generic_ELF class
also has an addClangTargetOptions() method that will override the one in
the parent, the code fragment above won't get called.

The version of clang in base looks fine.

I'm using this patch:

$NetBSD$

--- lib/Driver/ToolChains/NetBSD.cpp.orig       2019-01-30 19:13:49.000000000 +0000
+++ lib/Driver/ToolChains/NetBSD.cpp
@@ -469,10 +469,20 @@ SanitizerMask NetBSD::getSupportedSaniti
   return Res;
 }
 
-void NetBSD::addClangTargetOptions(const ArgList &,
+void NetBSD::addClangTargetOptions(const ArgList &DriverArgs,
                                    ArgStringList &CC1Args,
                                    Action::OffloadKind) const {
   const SanitizerArgs &SanArgs = getSanitizerArgs();
+  bool UseInitArrayDefault =
+      getTriple().getArch() == llvm::Triple::aarch64 ||
+      getTriple().getArch() == llvm::Triple::aarch64_be ||
+      getTriple().getArch() == llvm::Triple::riscv32 ||
+      getTriple().getArch() == llvm::Triple::riscv64;
+
+  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
+                         options::OPT_fno_use_init_array, UseInitArrayDefault))
+    CC1Args.push_back("-fuse-init-array");
+
   if (SanArgs.hasAnySanitizer())
     CC1Args.push_back("-D_REENTRANT");
 }


Home | Main Index | Thread Index | Old Index