]> granicus.if.org Git - llvm/commitdiff
Fix pr20793.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Sep 2014 23:03:58 +0000 (23:03 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Sep 2014 23:03:58 +0000 (23:03 +0000)
With this patch the third field of llvm.global_ctors is also used on ELF.

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

lib/CodeGen/TargetLoweringObjectFileImpl.cpp
test/CodeGen/X86/constructor.ll

index a89769f0535211ce03cd8709141069aa4d2a18ec..971d0f903cd11bfcd9c62a2ec34dde28e4d0d6b0 100644 (file)
@@ -360,42 +360,66 @@ TargetLoweringObjectFileELF::getSectionForConstant(SectionKind Kind,
 
 const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(
     unsigned Priority, const MCSymbol *KeySym) const {
-  // The default scheme is .ctor / .dtor, so we have to invert the priority
-  // numbering.
-  if (Priority == 65535)
-    return StaticCtorSection;
+  std::string Name;
+  unsigned Type;
+  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
+  SectionKind Kind = SectionKind::getDataRel();
+  StringRef COMDAT = KeySym ? KeySym->getName() : "";
+
+  if (KeySym)
+    Flags |= ELF::SHF_GROUP;
 
   if (UseInitArray) {
-    std::string Name = std::string(".init_array.") + utostr(Priority);
-    return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY,
-                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
-                                      SectionKind::getDataRel());
+    Name = ".init_array";
+    if (Priority != 65535) {
+      Name += '.';
+      Name += utostr(Priority);
+    }
+    Type = ELF::SHT_INIT_ARRAY;
   } else {
-    std::string Name = std::string(".ctors.") + utostr(65535 - Priority);
-    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
-                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
-                                      SectionKind::getDataRel());
+    // The default scheme is .ctor / .dtor, so we have to invert the priority
+    // numbering.
+    Name = std::string(".ctors");
+    if (Priority != 65535) {
+      Name += '.';
+      Name += utostr(65535 - Priority);
+    }
+    Type = ELF::SHT_PROGBITS;
   }
+
+  return getContext().getELFSection(Name, Type, Flags, Kind, 0, COMDAT);
 }
 
 const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection(
     unsigned Priority, const MCSymbol *KeySym) const {
-  // The default scheme is .ctor / .dtor, so we have to invert the priority
-  // numbering.
-  if (Priority == 65535)
-    return StaticDtorSection;
+  std::string Name;
+  unsigned Type;
+  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
+  SectionKind Kind = SectionKind::getDataRel();
+  StringRef COMDAT = KeySym ? KeySym->getName() : "";
+
+  if (KeySym)
+    Flags |= ELF::SHF_GROUP;
 
   if (UseInitArray) {
-    std::string Name = std::string(".fini_array.") + utostr(Priority);
-    return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY,
-                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
-                                      SectionKind::getDataRel());
+    Name = ".fini_array";
+    if (Priority != 65535) {
+      Name += '.';
+      Name += utostr(Priority);
+    }
+    Type = ELF::SHT_FINI_ARRAY;
   } else {
-    std::string Name = std::string(".dtors.") + utostr(65535 - Priority);
-    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
-                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
-                                      SectionKind::getDataRel());
+    // The default scheme is .ctor / .dtor, so we have to invert the priority
+    // numbering.
+    Name = ".dtors";
+    if (Priority != 65535) {
+      Name += '.';
+      Name += utostr(65535 - Priority);
+    }
+    Type = ELF::SHT_PROGBITS;
   }
+
+  return getContext().getELFSection(Name, Type, Flags, Kind, 0, COMDAT);
 }
 
 void
index 23860be4a3b038d03e8325e4389174fe7aeecbeb..7160dcc614c029c1eca2776c5251f492a425e63b 100644 (file)
@@ -1,6 +1,8 @@
 ; RUN: llc -mtriple x86_64-pc-linux -use-ctors < %s | FileCheck --check-prefix=CTOR %s
 ; RUN: llc -mtriple x86_64-pc-linux < %s | FileCheck --check-prefix=INIT-ARRAY %s
-@llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @f }, { i32, void ()* } { i32 15, void ()* @g }]
+@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 }]
+
+@v = weak_odr global i8 0
 
 define void @f() {
 entry:
@@ -12,14 +14,14 @@ entry:
   ret void
 }
 
-; CTOR:                .section        .ctors.65520,"aw",@progbits
+; CTOR:                .section        .ctors.65520,"aGw",@progbits,v,comdat
 ; CTOR-NEXT:   .align  8
 ; CTOR-NEXT:   .quad   g
 ; CTOR-NEXT:   .section        .ctors,"aw",@progbits
 ; CTOR-NEXT:   .align  8
 ; CTOR-NEXT:   .quad   f
 
-; INIT-ARRAY:          .section        .init_array.15,"aw",@init_array
+; INIT-ARRAY:          .section        .init_array.15,"aGw",@init_array,v,comdat
 ; INIT-ARRAY-NEXT:     .align  8
 ; INIT-ARRAY-NEXT:     .quad   g
 ; INIT-ARRAY-NEXT:     .section        .init_array,"aw",@init_array