mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
MC: Support multiple sections with the same name in the same comdat group
Code review by Eric Christopher and Rafael Espindola. llvm-svn: 193209
This commit is contained in:
parent
c5a6c85c4f
commit
329a9a8a33
@ -1298,10 +1298,12 @@ void ELFObjectWriter::WriteSection(MCAssembler &Asm,
|
||||
// Remove ".rel" and ".rela" prefixes.
|
||||
unsigned SecNameLen = (Section.getType() == ELF::SHT_REL) ? 4 : 5;
|
||||
StringRef SectionName = Section.getSectionName().substr(SecNameLen);
|
||||
StringRef GroupName =
|
||||
Section.getGroup() ? Section.getGroup()->getName() : "";
|
||||
|
||||
InfoSection = Asm.getContext().getELFSection(SectionName,
|
||||
ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getReadOnly());
|
||||
InfoSection = Asm.getContext().getELFSection(SectionName, ELF::SHT_PROGBITS,
|
||||
0, SectionKind::getReadOnly(),
|
||||
0, GroupName);
|
||||
sh_info = SectionIndexMap.lookup(InfoSection);
|
||||
break;
|
||||
}
|
||||
@ -1351,11 +1353,12 @@ void ELFObjectWriter::WriteSection(MCAssembler &Asm,
|
||||
ELF::SHF_EXECINSTR | ELF::SHF_ALLOC,
|
||||
SectionKind::getText()));
|
||||
} else if (SecName.startswith(".ARM.exidx")) {
|
||||
sh_link = SectionIndexMap.lookup(
|
||||
Asm.getContext().getELFSection(SecName.substr(sizeof(".ARM.exidx") - 1),
|
||||
ELF::SHT_PROGBITS,
|
||||
ELF::SHF_EXECINSTR | ELF::SHF_ALLOC,
|
||||
SectionKind::getText()));
|
||||
StringRef GroupName =
|
||||
Section.getGroup() ? Section.getGroup()->getName() : "";
|
||||
sh_link = SectionIndexMap.lookup(Asm.getContext().getELFSection(
|
||||
SecName.substr(sizeof(".ARM.exidx") - 1), ELF::SHT_PROGBITS,
|
||||
ELF::SHF_EXECINSTR | ELF::SHF_ALLOC, SectionKind::getText(), 0,
|
||||
GroupName));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,10 +25,15 @@
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/Support/SourceMgr.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
typedef std::pair<std::string, std::string> SectionGroupPair;
|
||||
|
||||
typedef StringMap<const MCSectionMachO*> MachOUniqueMapTy;
|
||||
typedef StringMap<const MCSectionELF*> ELFUniqueMapTy;
|
||||
typedef std::map<SectionGroupPair, const MCSectionELF *> ELFUniqueMapTy;
|
||||
typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
|
||||
|
||||
|
||||
@ -249,8 +254,9 @@ getELFSection(StringRef Section, unsigned Type, unsigned Flags,
|
||||
ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)ELFUniquingMap;
|
||||
|
||||
// Do the lookup, if we have a hit, return it.
|
||||
StringMapEntry<const MCSectionELF*> &Entry = Map.GetOrCreateValue(Section);
|
||||
if (Entry.getValue()) return Entry.getValue();
|
||||
std::pair<ELFUniqueMapTy::iterator, bool> Entry = Map.insert(
|
||||
std::make_pair(SectionGroupPair(Section, Group), (MCSectionELF *)0));
|
||||
if (!Entry.second) return Entry.first->second;
|
||||
|
||||
// Possibly refine the entry size first.
|
||||
if (!EntrySize) {
|
||||
@ -261,9 +267,9 @@ getELFSection(StringRef Section, unsigned Type, unsigned Flags,
|
||||
if (!Group.empty())
|
||||
GroupSym = GetOrCreateSymbol(Group);
|
||||
|
||||
MCSectionELF *Result = new (*this) MCSectionELF(Entry.getKey(), Type, Flags,
|
||||
Kind, EntrySize, GroupSym);
|
||||
Entry.setValue(Result);
|
||||
MCSectionELF *Result = new (*this) MCSectionELF(
|
||||
Entry.first->first.first, Type, Flags, Kind, EntrySize, GroupSym);
|
||||
Entry.first->second = Result;
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
41
test/MC/ELF/comdat-dup-group-name.s
Normal file
41
test/MC/ELF/comdat-dup-group-name.s
Normal file
@ -0,0 +1,41 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s -t | FileCheck %s
|
||||
|
||||
// Test that we produce two foo sections, each in separate groups
|
||||
|
||||
// CHECK: Index: 1
|
||||
// CHECK-NEXT: Name: .group
|
||||
|
||||
// CHECK: Index: 2
|
||||
// CHECK-NEXT: Name: .group
|
||||
|
||||
// CHECK: Index: 6
|
||||
// CHECK-NEXT: Name: .foo
|
||||
|
||||
// CHECK: Index: 7
|
||||
// CHECK-NEXT: Name: .foo
|
||||
|
||||
// CHECK: Symbols [
|
||||
|
||||
// CHECK: Name: f1
|
||||
// CHECK-NOT: }
|
||||
// CHECK: Section: .group (0x1)
|
||||
|
||||
// CHECK: Name: f2
|
||||
// CHECK-NOT: }
|
||||
// CHECK: Section: .group (0x2)
|
||||
|
||||
// CHECK: Name: .foo
|
||||
// CHECK-NOT: }
|
||||
// CHECK: Section: .foo (0x6)
|
||||
|
||||
// CHECK: Name: .foo
|
||||
// CHECK-NOT: }
|
||||
// CHECK: Section: .foo (0x7)
|
||||
|
||||
|
||||
.section .foo,"axG",@progbits,f1,comdat
|
||||
nop
|
||||
|
||||
.section .foo,"axG",@progbits,f2,comdat
|
||||
nop
|
||||
|
Loading…
Reference in New Issue
Block a user