AndreiGrischenko created this revision. Our runtime for MCU X86 target supports .init_array section for globals that should be dynamically initialized. But default Clang generates .ctors section and even if it has option -fuse-init-array, the option has no effect if set explicitly in a command-line. The problem is in lack of -fuse-array-init option initialization in CodeGen
void X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { TargetLoweringObjectFileELF::Initialize(Ctx, TM); InitializeELF(TM.Options.UseInitArray); } https://reviews.llvm.org/D32543 Files: llvm/lib/Target/X86/X86TargetMachine.cpp llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c Index: llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c =================================================================== --- llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c +++ llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c @@ -0,0 +1,18 @@ +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -o - < %s | FileCheck %s --check-prefix=CTORS +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -fuse-init-array -o - < %s | FileCheck %s --check-prefix=INIT_ARR +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -fno-use-init-array -o - < %s | FileCheck %s --check-prefix=CTORS + + +int a = 1; + +void __attribute__((constructor)) foo() +{ + a = 0; +} + +// INIT_ARR: .init_array +// CTORS-NOT: .init_array +// CTORS: .ctors +// CTORS-NOT: .init_array Index: llvm/lib/Target/X86/X86TargetMachine.cpp =================================================================== --- llvm/lib/Target/X86/X86TargetMachine.cpp +++ llvm/lib/Target/X86/X86TargetMachine.cpp @@ -56,7 +56,7 @@ if (TT.isOSFreeBSD()) return make_unique<X86FreeBSDTargetObjectFile>(); - if (TT.isOSLinux() || TT.isOSNaCl()) + if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU()) return make_unique<X86LinuxNaClTargetObjectFile>(); if (TT.isOSFuchsia()) return make_unique<X86FuchsiaTargetObjectFile>();
Index: llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c =================================================================== --- llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c +++ llvm/tools/clang/test/CodeGen/init_array_sectionMCU.c @@ -0,0 +1,18 @@ +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -o - < %s | FileCheck %s --check-prefix=CTORS +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -fuse-init-array -o - < %s | FileCheck %s --check-prefix=INIT_ARR +// RUN: %clang_cc1 -triple i586-intel-elfiamcu -S -fno-use-init-array -o - < %s | FileCheck %s --check-prefix=CTORS + + +int a = 1; + +void __attribute__((constructor)) foo() +{ + a = 0; +} + +// INIT_ARR: .init_array +// CTORS-NOT: .init_array +// CTORS: .ctors +// CTORS-NOT: .init_array Index: llvm/lib/Target/X86/X86TargetMachine.cpp =================================================================== --- llvm/lib/Target/X86/X86TargetMachine.cpp +++ llvm/lib/Target/X86/X86TargetMachine.cpp @@ -56,7 +56,7 @@ if (TT.isOSFreeBSD()) return make_unique<X86FreeBSDTargetObjectFile>(); - if (TT.isOSLinux() || TT.isOSNaCl()) + if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU()) return make_unique<X86LinuxNaClTargetObjectFile>(); if (TT.isOSFuchsia()) return make_unique<X86FuchsiaTargetObjectFile>();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits