Allow forward references to section symbols.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219835 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-10-15 19:30:18 +00:00
parent 40edbf130e
commit fc6e0f6f87
2 changed files with 36 additions and 1 deletions

View File

@ -119,11 +119,18 @@ MCSymbol *MCContext::getOrCreateSectionSymbol(const MCSectionELF &Section) {
return Sym;
StringRef Name = Section.getSectionName();
StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
MCSymbol *OldSym = Entry.getValue();
if (OldSym && OldSym->isUndefined()) {
Sym = OldSym;
return OldSym;
}
StringMapEntry<bool> *NameEntry = &UsedNames.GetOrCreateValue(Name);
NameEntry->setValue(true);
Sym = new (*this) MCSymbol(NameEntry->getKey(), /*isTemporary*/ false);
StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
if (!Entry.getValue())
Entry.setValue(Sym);

View File

@ -0,0 +1,28 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -t -r --expand-relocs | FileCheck %s
// Test that we can forward reference a section.
mov .rodata, %rsi
.section .rodata
// CHECK:Relocations [
// CHECK: Section (2) .rela.text {
// CHECK: Relocation {
// CHECK: Offset: 0x4
// CHECK: Type: R_X86_64_32S (11)
// CHECK: Symbol: .rodata
// CHECK: Addend: 0x0
// CHECK: }
// CHECK: }
// CHECK:]
// There is only one .rodata symbol
// CHECK:Symbols [
// CHECK-NOT: Name: .rodata
// CHECK: Name: .rodata
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local (0x0)
// CHECK-NEXT: Type: Section (0x3)
// CHECK-NOT: Name: .rodata