From f5b1c5043de4d485ff17d8b2aad709c63a5a9ff3 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Wed, 10 Jul 2013 20:58:17 +0000 Subject: [PATCH] Put ELF COMDAT relocations into the relevant COMDAT group. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186034 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 11 +++++++++-- test/MC/ELF/comdat-reloc.s | 29 +++++++++++++++++++++++++++++ test/MC/ELF/comdat.s | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 test/MC/ELF/comdat-reloc.s diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 4f66156f6de..2db59acd504 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -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/test/MC/ELF/comdat-reloc.s b/test/MC/ELF/comdat-reloc.s new file mode 100644 index 00000000000..d893a7b149e --- /dev/null +++ b/test/MC/ELF/comdat-reloc.s @@ -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 diff --git a/test/MC/ELF/comdat.s b/test/MC/ELF/comdat.s index f9469dfae27..6dbe583df01 100644 --- a/test/MC/ELF/comdat.s +++ b/test/MC/ELF/comdat.s @@ -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 -- 2.34.1