]> granicus.if.org Git - llvm/commitdiff
[CodeGen] Add support for emitting .init_array instead of .ctors on FreeBSD.
authorDavide Italiano <davide@freebsd.org>
Mon, 26 Sep 2016 22:53:15 +0000 (22:53 +0000)
committerDavide Italiano <davide@freebsd.org>
Mon, 26 Sep 2016 22:53:15 +0000 (22:53 +0000)
PR: 30494

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

lib/Target/X86/X86TargetMachine.cpp
lib/Target/X86/X86TargetObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.h
test/CodeGen/X86/constructor.ll

index cd48211dbabd8def5011caba648ee3da9d75c176..c92f9d88016dda512da4a3c5988bdfb5b51a5b4d 100644 (file)
@@ -50,6 +50,8 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
     return make_unique<TargetLoweringObjectFileMachO>();
   }
 
+  if (TT.isOSFreeBSD())
+    return make_unique<X86FreeBSDTargetObjectFile>();
   if (TT.isOSLinux() || TT.isOSNaCl())
     return make_unique<X86LinuxNaClTargetObjectFile>();
   if (TT.isOSBinFormatELF())
index f0713286bcce1b4434ec3d023c49a73da3b2c1fb..aa837c3f30c0a12e27f88f4f4dc0beb46ca699c4 100644 (file)
@@ -65,6 +65,13 @@ const MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(
   return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
 }
 
+void
+X86FreeBSDTargetObjectFile::Initialize(MCContext &Ctx,
+                                       const TargetMachine &TM) {
+  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
+  InitializeELF(TM.Options.UseInitArray);
+}
+
 void
 X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx,
                                          const TargetMachine &TM) {
index 6b38c0a800b7ce06691a800e53d0b121daed10a0..b57f0bb50164a1317ec00543577d6aca4424ee09 100644 (file)
@@ -49,6 +49,12 @@ namespace llvm {
     const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;
   };
 
+  /// X86FreeBSDTargetObjectFile - This implementation is used for FreeBSD
+  /// on x86 and x86-64.
+  class X86FreeBSDTargetObjectFile : public X86ELFTargetObjectFile {
+    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
+  };
+
   /// X86LinuxNaClTargetObjectFile - This implementation is used for linux and
   /// Native Client on x86 and x86-64.
   class X86LinuxNaClTargetObjectFile : public X86ELFTargetObjectFile {
index fd94f595005a239dcc4c5f916cba8ced74971a92..7b82125dc37254394a2f2ad75ad3932b2daacc95 100644 (file)
@@ -1,5 +1,7 @@
 ; RUN: llc -mtriple x86_64-pc-linux -use-ctors < %s | FileCheck --check-prefix=CTOR %s
+; RUN: llc -mtriple x86_64-unknown-freebsd -use-ctors < %s | FileCheck --check-prefix=CTOR %s
 ; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck --check-prefix=INIT-ARRAY %s
+; RUN: llc -mtriple x86_64-unknown-freebsd < %s | FileCheck --check-prefix=INIT-ARRAY %s
 ; RUN: llc -mtriple x86_64-unknown-nacl < %s | FileCheck --check-prefix=NACL %s
 @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @f, i8* null}, { i32, void ()*, i8* } { i32 15, void ()* @g, i8* @v }]