From: Evgeniy Stepanov Date: Fri, 24 Feb 2017 21:44:58 +0000 (+0000) Subject: Disallow redefinition of section symbols. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89efd71a889aaa092eba602ea95f6150a92c8ab3;p=llvm Disallow redefinition of section symbols. Differential Revision: https://reviews.llvm.org/D30235 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296180 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index cc7533f87b7..9d5bd39b56f 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -320,6 +320,11 @@ MCSectionELF *MCContext::createELFSectionImpl(StringRef Section, unsigned Type, const MCSectionELF *Associated) { MCSymbolELF *R; MCSymbol *&Sym = Symbols[Section]; + // A section symbol can not redefine regular symbols. There may be multiple + // sections with the same name, in which case the first such section wins. + if (Sym && Sym->isDefined() && + (!Sym->isInSection() || Sym->getSection().getBeginSymbol() != Sym)) + reportError(SMLoc(), "invalid symbol redefinition"); if (Sym && Sym->isUndefined()) { R = cast(Sym); } else { @@ -330,7 +335,6 @@ MCSectionELF *MCContext::createELFSectionImpl(StringRef Section, unsigned Type, } R->setBinding(ELF::STB_LOCAL); R->setType(ELF::STT_SECTION); - R->setRedefinable(true); auto *Ret = new (ELFAllocator.Allocate()) MCSectionELF( Section, Type, Flags, K, EntrySize, Group, UniqueID, R, Associated); diff --git a/test/CodeGen/XCore/section-name.ll b/test/CodeGen/XCore/section-name.ll index ee9eeb606bb..65161db34be 100644 --- a/test/CodeGen/XCore/section-name.ll +++ b/test/CodeGen/XCore/section-name.ll @@ -1,8 +1,9 @@ -; RUN: llc < %s -march=xcore +; RUN: not llc < %s -march=xcore 2>&1 | FileCheck %s -; we used to crash in this. @bar = internal global i32 zeroinitializer define void @".dp.bss"() { ret void } + +; CHECK: LLVM ERROR: invalid symbol redefinition diff --git a/test/MC/ELF/section-sym-err.s b/test/MC/ELF/section-sym-err.s new file mode 100644 index 00000000000..789fee7c422 --- /dev/null +++ b/test/MC/ELF/section-sym-err.s @@ -0,0 +1,6 @@ +// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o 2>&1 | FileCheck %s + +.section foo +foo: + +// CHECK: error: invalid symbol redefinition diff --git a/test/MC/ELF/section-sym-err2.s b/test/MC/ELF/section-sym-err2.s new file mode 100644 index 00000000000..27d8e9a9ac2 --- /dev/null +++ b/test/MC/ELF/section-sym-err2.s @@ -0,0 +1,6 @@ +// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t.o 2>&1 | FileCheck %s + +foo: +.section foo + +// CHECK: error: invalid symbol redefinition diff --git a/test/MC/ELF/section-sym-redefine.s b/test/MC/ELF/section-sym-redefine.s deleted file mode 100644 index 1f6dd5723af..00000000000 --- a/test/MC/ELF/section-sym-redefine.s +++ /dev/null @@ -1,138 +0,0 @@ -// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -t -r --expand-relocs | FileCheck %s - -// Local symbol overriding section. -.section x1,"a",@progbits -.local x1 -.comm x1,4,4 -.long x1 // reloc: .bss + 0 - -// Section declared after local. Local symbol wins. -.local x2 -.comm x2,4,4 -.section x2,"a",@progbits -.long x2 // reloc: .bss + 4 - -// No overriding symbol. -.section x3,"a",@progbits -.long x3 // reloc: x3(section) + 0 - -// Global vs section. -.section x4,"a",@progbits -.long 0 -.globl x4 -.section foo, "a", @progbits -x4: -.long 0 -.long x4 // reloc: x4(global) + 0 - -// Global vs implicit section -.globl .data -.data: -.long 42 -.long .data // reloc: .data(global) + 0 - -// CHECK: Relocations [ -// CHECK: Section (4) .relax1 { -// CHECK: Relocation { -// CHECK: Offset: 0x0 -// CHECK: Type: R_X86_64_32 (10) -// CHECK: Symbol: .bss (3) -// CHECK: Addend: 0x0 -// CHECK: } -// CHECK: } -// CHECK: Section (7) .relax2 { -// CHECK: Relocation { -// CHECK: Offset: 0x0 -// CHECK: Type: R_X86_64_32 (10) -// CHECK: Symbol: .bss (3) -// CHECK: Addend: 0x4 -// CHECK: } -// CHECK: } -// CHECK: Section (9) .relax3 { -// CHECK: Relocation { -// CHECK: Offset: 0x0 -// CHECK: Type: R_X86_64_32 (10) -// CHECK: Symbol: x3 (4) -// CHECK: Addend: 0x0 -// CHECK: } -// CHECK: } -// CHECK: Section (12) .relafoo { -// CHECK: Relocation { -// CHECK: Offset: 0x4 -// CHECK: Type: R_X86_64_32 (10) -// CHECK: Symbol: x4 (6) -// CHECK: Addend: 0x0 -// CHECK: } -// CHECK: Relocation { -// CHECK: Offset: 0xC -// CHECK: Type: R_X86_64_32 (10) -// CHECK: Symbol: .data (5) -// CHECK: Addend: 0x0 -// CHECK: } -// CHECK: } -// CHECK: ] -// CHECK: Symbols [ -// CHECK: Symbol { -// CHECK: Name: (0) -// CHECK: Value: 0x0 -// CHECK: Size: 0 -// CHECK: Binding: Local (0x0) -// CHECK: Type: None (0x0) -// CHECK: Other: 0 -// CHECK: Section: Undefined (0x0) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: x1 (67) -// CHECK: Value: 0x0 -// CHECK: Size: 4 -// CHECK: Binding: Local (0x0) -// CHECK: Type: Object (0x1) -// CHECK: Other: 0 -// CHECK: Section: .bss (0x5) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: x2 (59) -// CHECK: Value: 0x4 -// CHECK: Size: 4 -// CHECK: Binding: Local (0x0) -// CHECK: Type: Object (0x1) -// CHECK: Other: 0 -// CHECK: Section: .bss (0x5) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: (0) -// CHECK: Value: 0x0 -// CHECK: Size: 0 -// CHECK: Binding: Local (0x0) -// CHECK: Type: Section (0x3) -// CHECK: Other: 0 -// CHECK: Section: .bss (0x5) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: (0) -// CHECK: Value: 0x0 -// CHECK: Size: 0 -// CHECK: Binding: Local (0x0) -// CHECK: Type: Section (0x3) -// CHECK: Other: 0 -// CHECK: Section: x3 (0x8) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: .data (37) -// CHECK: Value: 0x8 -// CHECK: Size: 0 -// CHECK: Binding: Global (0x1) -// CHECK: Type: None (0x0) -// CHECK: Other: 0 -// CHECK: Section: foo (0xB) -// CHECK: } -// CHECK: Symbol { -// CHECK: Name: x4 (43) -// CHECK: Value: 0x0 -// CHECK: Size: 0 -// CHECK: Binding: Global (0x1) -// CHECK: Type: None (0x0) -// CHECK: Other: 0 -// CHECK: Section: foo (0xB) -// CHECK: } -// CHECK: ] diff --git a/test/MC/ELF/section.s b/test/MC/ELF/section.s index f70139f36ba..1177bb769cc 100644 --- a/test/MC/ELF/section.s +++ b/test/MC/ELF/section.s @@ -143,12 +143,13 @@ bar: // Test that we handle the strings like gas .section bar-"foo" -.section "foo" +.section "fooo" + // CHECK: Section { // CHECK: Name: bar-"foo" // CHECK: Section { -// CHECK: Name: foo +// CHECK: Name: fooo // Test SHF_LINK_ORDER