Put ELF COMDAT relocations into the relevant COMDAT group.
authorTim Northover <tnorthover@apple.com>
Wed, 10 Jul 2013 20:58:17 +0000 (20:58 +0000)
committerTim Northover <tnorthover@apple.com>
Wed, 10 Jul 2013 20:58:17 +0000 (20:58 +0000)
Patch from Игорь Пашев  (I do hope we support utf-8 commit messages; I
also hope he'll forgive me for transliterating it as Igor Pashev in
case things go horribly wrong).

llvm-svn: 186034

llvm/lib/MC/ELFObjectWriter.cpp
llvm/test/MC/ELF/comdat-reloc.s [new file with mode: 0644]
llvm/test/MC/ELF/comdat.s

index 4f66156..2db59ac 100644 (file)
@@ -1002,11 +1002,18 @@ void ELFObjectWriter::CreateRelocationSections(MCAssembler &Asm,
     else
       EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel);
 
+    unsigned Flags = 0;
+    StringRef Group = "";
+    if (Section.getFlags() & ELF::SHF_GROUP) {
+        Flags = ELF::SHF_GROUP;
+        Group = Section.getGroup()->getName();
+    }
+
     const MCSectionELF *RelaSection =
       Ctx.getELFSection(RelaSectionName, hasRelocationAddend() ?
-                        ELF::SHT_RELA : ELF::SHT_REL, 0,
+                        ELF::SHT_RELA : ELF::SHT_REL, Flags,
                         SectionKind::getReadOnly(),
-                        EntrySize, "");
+                        EntrySize, Group);
     RelMap[&Section] = RelaSection;
     Asm.getOrCreateSectionData(*RelaSection);
   }
diff --git a/llvm/test/MC/ELF/comdat-reloc.s b/llvm/test/MC/ELF/comdat-reloc.s
new file mode 100644 (file)
index 0000000..d893a7b
--- /dev/null
@@ -0,0 +1,29 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s -sd | FileCheck %s
+
+  .text
+  .globl  hello
+  .type  hello,@function
+hello:
+  call  world
+  ret
+
+  .section  .text.world,"axG",@progbits,world,comdat
+  .type  world,@function
+world:
+  call  doctor
+  ret
+
+// CHECK:  Name: .group
+// CHECK-NOT: SectionData
+// CHECK: SectionData
+// CHECK-NEXT: 0000: 01000000 06000000 07000000
+
+// CHECK: Index: 6
+// CHECK-NEXT: Name: .text.world
+// CHECK-NOT: Section {
+// CHECK: SHF_GROUP
+
+// CHECK: Index: 7
+// CHECK-NEXT: Name: .rela.text.world
+// CHECK-NOT: Section {
+// CHECK: SHF_GROUP
index f9469df..6dbe583 100644 (file)
@@ -39,7 +39,7 @@
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     Address: 0x0
 // CHECK-NEXT:     Offset: 0x54
-// CHECK-NEXT:     Size: 8
+// CHECK-NEXT:     Size: 12
 // CHECK-NEXT:     Link: 13
 // CHECK-NEXT:     Info: 13
 // CHECK-NEXT:     AddressAlignment: 4