Emit the ctors in the proper order on ARM/EABI.
authorAnton Korobeynikov <asl@math.spbu.ru>
Sat, 3 Dec 2011 23:49:37 +0000 (23:49 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sat, 3 Dec 2011 23:49:37 +0000 (23:49 +0000)
Maybe some targets should use this as well.

Patch by Evgeniy Stepanov!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145781 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmInfo.h
include/llvm/MC/MCObjectFileInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCAsmInfo.cpp
lib/MC/MCAsmInfoDarwin.cpp
lib/MC/MCObjectFileInfo.cpp
lib/Target/ARM/ARMTargetObjectFile.cpp
test/CodeGen/ARM/ctor_order.ll [new file with mode: 0644]

index d7402b33974fb8d3d9902cbb96e894d534261c07..5accabcd9f4efcaaf75be7d5b175db53d06c242a 100644 (file)
@@ -36,10 +36,6 @@ namespace llvm {
     enum LCOMMType { None, NoAlignment, ByteAlignment };
   }
 
-  namespace Structors {
-    enum OutputOrder { None, PriorityOrder, ReversePriorityOrder };
-  }
-
   /// MCAsmInfo - This class is intended to be used as a base class for asm
   /// properties and features specific to the target.
   class MCAsmInfo {
@@ -72,11 +68,6 @@ namespace llvm {
     /// the macho-specific .tbss directive for emitting thread local BSS Symbols
     bool HasMachoTBSSDirective;                 // Default is false.
 
-    /// StructorOutputOrder - Whether the static ctor/dtor list should be output
-    /// in no particular order, in order of increasing priority or the reverse:
-    /// in order of decreasing priority (the default).
-    Structors::OutputOrder StructorOutputOrder; // Default is reverse order.
-
     /// HasStaticCtorDtorReferenceInStaticMode - True if the compiler should
     /// emit a ".reference .constructors_used" or ".reference .destructors_used"
     /// directive after the a static ctor/dtor list.  This directive is only
@@ -428,9 +419,6 @@ namespace llvm {
     //
     bool hasMachoZeroFillDirective() const { return HasMachoZeroFillDirective; }
     bool hasMachoTBSSDirective() const { return HasMachoTBSSDirective; }
-    Structors::OutputOrder getStructorOutputOrder() const {
-      return StructorOutputOrder;
-    }
     bool hasStaticCtorDtorReferenceInStaticMode() const {
       return HasStaticCtorDtorReferenceInStaticMode;
     }
index 2c5a0a15c3129227991ddb25a2c8286614fceb5f..d91b11b1f77f61c05c5be7a0f1c25e28c50e649e 100644 (file)
 #include "llvm/MC/SectionKind.h"
 
 namespace llvm {
-class MCContext;
-class MCSection;
-class Triple;
+  class MCContext;
+  class MCSection;
+  class Triple;
   
+  namespace Structors {
+    enum OutputOrder { None, PriorityOrder, ReversePriorityOrder };
+  }
+
 class MCObjectFileInfo {  
 protected:
   /// CommDirectiveSupportsAlignment - True if .comm supports alignment.  This
@@ -164,6 +168,11 @@ protected:
   const MCSection *PDataSection;
   const MCSection *XDataSection;
   
+  /// StructorOutputOrder - Whether the static ctor/dtor list should be output
+  /// in no particular order, in order of increasing priority or the reverse:
+  /// in order of decreasing priority (the default).
+  Structors::OutputOrder StructorOutputOrder; // Default is reverse order.
+
 public:
   void InitMCObjectFileInfo(StringRef TT, Reloc::Model RM, CodeModel::Model CM,
                             MCContext &ctx);
@@ -291,6 +300,10 @@ public:
     return EHFrameSection;
   }
 
+  Structors::OutputOrder getStructorOutputOrder() const {
+    return StructorOutputOrder;
+  }
+
 private:
   enum Environment { IsMachO, IsELF, IsCOFF };
   Environment Env;
index 18670fe1087bebef0aa51bbc79901b6ebabdead7..d60a1f1e0a549be47b017a2132471194335dc711 100644 (file)
@@ -1291,7 +1291,7 @@ void AsmPrinter::EmitXXStructorList(const Constant *List) {
   }
 
   // Emit the function pointers in reverse priority order.
-  switch (MAI->getStructorOutputOrder()) {
+  switch (getObjFileLowering().getStructorOutputOrder()) {
   case Structors::None:
     break;
   case Structors::PriorityOrder:
index c330e740c2d6fa1fe5080993d76ffcb7c5849984..b1e1bdf6c758c52ad0da9d5de702f903b249691c 100644 (file)
@@ -29,7 +29,6 @@ MCAsmInfo::MCAsmInfo() {
   HasSubsectionsViaSymbols = false;
   HasMachoZeroFillDirective = false;
   HasMachoTBSSDirective = false;
-  StructorOutputOrder = Structors::ReversePriorityOrder;
   HasStaticCtorDtorReferenceInStaticMode = false;
   LinkerRequiresNonEmptyDwarfLines = false;
   MaxInstLength = 4;
index ec1d3b141a9144bffbfc05628c59d61fd946e8cb..24f1243cfc4dfd7e741899be7ce37653276d06f1 100644 (file)
@@ -39,7 +39,6 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
   ZeroDirective = "\t.space\t";  // ".space N" emits N zeros.
   HasMachoZeroFillDirective = true;  // Uses .zerofill
   HasMachoTBSSDirective = true; // Uses .tbss
-  StructorOutputOrder = Structors::PriorityOrder;
   HasStaticCtorDtorReferenceInStaticMode = true;
 
   CodeBegin = "L$start$code$";
index 7d235412b5addfeb56365f5d5f49e61f83004801..32ba92424b724f335b748fa8c9dd39c7ca47c604 100644 (file)
@@ -31,6 +31,8 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
     CommDirectiveSupportsAlignment = false;
 
+  StructorOutputOrder = Structors::PriorityOrder;
+
   TextSection // .text
     = Ctx->getMachOSection("__TEXT", "__text",
                            MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
@@ -258,6 +260,8 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
     }
   }
 
+  StructorOutputOrder = Structors::ReversePriorityOrder;
+
   // ELF
   BSSSection =
     Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
@@ -385,6 +389,8 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
 
 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
   // COFF
+  StructorOutputOrder = Structors::ReversePriorityOrder;
+
   TextSection =
     Ctx->getCOFFSection(".text",
                         COFF::IMAGE_SCN_CNT_CODE |
index 19defa1b519668fa3863291e1de828f208023314..721a225183f436f1047dba799efa6344da399e95 100644 (file)
@@ -36,6 +36,7 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
                                  ELF::SHF_WRITE |
                                  ELF::SHF_ALLOC,
                                  SectionKind::getDataRel());
+    StructorOutputOrder = Structors::PriorityOrder;
     LSDASection = NULL;
   }
 
diff --git a/test/CodeGen/ARM/ctor_order.ll b/test/CodeGen/ARM/ctor_order.ll
new file mode 100644 (file)
index 0000000..7f00eb3
--- /dev/null
@@ -0,0 +1,28 @@
+; RUN: llc < %s -mtriple=arm-apple-darwin  | FileCheck %s -check-prefix=DARWIN
+; RUN: llc < %s -mtriple=arm-linux-gnu     | FileCheck %s -check-prefix=ELF
+; RUN: llc < %s -mtriple=arm-linux-gnueabi | FileCheck %s -check-prefix=GNUEABI
+
+; DARWIN:      .section        __DATA,__mod_init_func,mod_init_funcs
+; DARWIN:      .long _f151
+; DARWIN-NEXT: .long _f152
+
+; ELF:      .section .ctors,"aw",%progbits
+; ELF:      .long    f152
+; ELF-NEXT: .long    f151
+
+; GNUEABI:      .section .init_array,"aw",%init_array
+; GNUEABI:      .long    f151
+; GNUEABI-NEXT: .long    f152
+
+
+@llvm.global_ctors = appending global [2 x { i32, void ()* }] [ { i32, void ()* } { i32 151, void ()* @f151 }, { i32, void ()* } { i32 152, void ()* @f152 } ]
+
+define void @f151() {
+entry:
+        ret void
+}
+
+define void @f152() {
+entry:
+        ret void
+}