diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-02-24 21:44:58 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2017-02-24 21:44:58 +0000 |
commit | 00400d36c9219079223ea9734ffd40abeea0cad0 (patch) | |
tree | dae86c1f07ca12cf1d443bc58a5dc39e4f5d010c | |
parent | 0338ce83cd94d74e1d7b0e68e54cc4ceba6dcb1b (diff) | |
download | bcm5719-llvm-00400d36c9219079223ea9734ffd40abeea0cad0.tar.gz bcm5719-llvm-00400d36c9219079223ea9734ffd40abeea0cad0.zip |
Disallow redefinition of section symbols.
Differential Revision: https://reviews.llvm.org/D30235
llvm-svn: 296180
-rw-r--r-- | llvm/lib/MC/MCContext.cpp | 6 | ||||
-rw-r--r-- | llvm/test/CodeGen/XCore/section-name.ll | 5 | ||||
-rw-r--r-- | llvm/test/MC/ELF/section-sym-err.s | 6 | ||||
-rw-r--r-- | llvm/test/MC/ELF/section-sym-err2.s | 6 | ||||
-rw-r--r-- | llvm/test/MC/ELF/section-sym-redefine.s | 138 | ||||
-rw-r--r-- | llvm/test/MC/ELF/section.s | 5 |
6 files changed, 23 insertions, 143 deletions
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index cc7533f87b7..9d5bd39b56f 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/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<MCSymbolELF>(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/llvm/test/CodeGen/XCore/section-name.ll b/llvm/test/CodeGen/XCore/section-name.ll index ee9eeb606bb..65161db34be 100644 --- a/llvm/test/CodeGen/XCore/section-name.ll +++ b/llvm/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/llvm/test/MC/ELF/section-sym-err.s b/llvm/test/MC/ELF/section-sym-err.s new file mode 100644 index 00000000000..789fee7c422 --- /dev/null +++ b/llvm/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/llvm/test/MC/ELF/section-sym-err2.s b/llvm/test/MC/ELF/section-sym-err2.s new file mode 100644 index 00000000000..27d8e9a9ac2 --- /dev/null +++ b/llvm/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/llvm/test/MC/ELF/section-sym-redefine.s b/llvm/test/MC/ELF/section-sym-redefine.s deleted file mode 100644 index 1f6dd5723af..00000000000 --- a/llvm/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/llvm/test/MC/ELF/section.s b/llvm/test/MC/ELF/section.s index f70139f36ba..1177bb769cc 100644 --- a/llvm/test/MC/ELF/section.s +++ b/llvm/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 |