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

Reply via email to