From af2cb7a2713b255f35a9e2598f70876fb41d3d79 Mon Sep 17 00:00:00 2001
From: Logan Chien <tzuhsiang.chien@gmail.com>
Date: Wed, 21 Nov 2012 13:19:53 +0800
Subject: [PATCH] Enable UseInitArray in android environment.

---
 lib/Target/Mips/MipsTargetObjectFile.cpp |    4 +++-
 lib/Target/X86/X86TargetObjectFile.cpp   |    4 +++-
 test/CodeGen/Generic/AndroidInitArray.ll |   18 ++++++++++++++++++
 3 files changed, 24 insertions(+), 2 deletions(-)
 create mode 100644 test/CodeGen/Generic/AndroidInitArray.ll

diff --git a/lib/Target/Mips/MipsTargetObjectFile.cpp b/lib/Target/Mips/MipsTargetObjectFile.cpp
index 881908b..786a40c 100644
--- a/lib/Target/Mips/MipsTargetObjectFile.cpp
+++ b/lib/Target/Mips/MipsTargetObjectFile.cpp
@@ -26,7 +26,9 @@ SSThreshold("mips-ssection-threshold", cl::Hidden,
 
 void MipsTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
-  InitializeELF(TM.Options.UseInitArray);
+  Triple TargetTriple(TM.getTargetTriple());
+  InitializeELF(TM.Options.UseInitArray ||
+                TargetTriple.getEnvironment() == Triple::Android);
 
   SmallDataSection =
     getContext().getELFSection(".sdata", ELF::SHT_PROGBITS,
diff --git a/lib/Target/X86/X86TargetObjectFile.cpp b/lib/Target/X86/X86TargetObjectFile.cpp
index 719bd68..f5772ae 100644
--- a/lib/Target/X86/X86TargetObjectFile.cpp
+++ b/lib/Target/X86/X86TargetObjectFile.cpp
@@ -49,5 +49,7 @@ getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
 void
 X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
-  InitializeELF(TM.Options.UseInitArray);
+  Triple TargetTriple(TM.getTargetTriple());
+  InitializeELF(TM.Options.UseInitArray ||
+                TargetTriple.getEnvironment() == Triple::Android);
 }
diff --git a/test/CodeGen/Generic/AndroidInitArray.ll b/test/CodeGen/Generic/AndroidInitArray.ll
new file mode 100644
index 0000000..2354724
--- /dev/null
+++ b/test/CodeGen/Generic/AndroidInitArray.ll
@@ -0,0 +1,18 @@
+; RUN: llc %s -o - -mtriple armv7-linux-androideabi | FileCheck %s
+; RUN: llc %s -o - -mtriple mipsel-linux-android | FileCheck %s
+; RUN: llc %s -o - -mtriple i686-linux-android | FileCheck %s
+
+@llvm.global_ctors = appending global [1 x { i32, void ()* }] [
+  { i32, void ()* } { i32 65535, void ()* @_test }
+]
+
+define internal void @_test() {
+entry:
+  ret void
+}
+
+; CHECK-NOT: .section .ctors
+; CHECK: .section .init_array
+; CHECK-NOT: .section .ctors
+; CHECK: _test
+; CHECK-NOT: .section .ctors
-- 
1.7.7.3

