summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-02-24 21:44:58 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-02-24 21:44:58 +0000
commit00400d36c9219079223ea9734ffd40abeea0cad0 (patch)
treedae86c1f07ca12cf1d443bc58a5dc39e4f5d010c
parent0338ce83cd94d74e1d7b0e68e54cc4ceba6dcb1b (diff)
downloadbcm5719-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.cpp6
-rw-r--r--llvm/test/CodeGen/XCore/section-name.ll5
-rw-r--r--llvm/test/MC/ELF/section-sym-err.s6
-rw-r--r--llvm/test/MC/ELF/section-sym-err2.s6
-rw-r--r--llvm/test/MC/ELF/section-sym-redefine.s138
-rw-r--r--llvm/test/MC/ELF/section.s5
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
OpenPOWER on IntegriCloud