[PATCH] D30235: Disallow redefinition of section symbols.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 24 12:06:23 PST 2017
LGTM.
Evgeniy Stepanov via Phabricator <reviews at reviews.llvm.org> writes:
> eugenis created this revision.
>
> Fixes PR31850.
>
>
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D30235
>
> Files:
> lib/MC/MCContext.cpp
> test/CodeGen/XCore/section-name.ll
> test/MC/ELF/section-sym-err.s
> test/MC/ELF/section-sym-err2.s
> test/MC/ELF/section-sym-redefine.s
> test/MC/ELF/section.s
>
> Index: test/MC/ELF/section.s
> ===================================================================
> --- test/MC/ELF/section.s
> +++ test/MC/ELF/section.s
> @@ -143,12 +143,13 @@
>
> // 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
>
> Index: test/MC/ELF/section-sym-redefine.s
> ===================================================================
> --- 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", at 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", at progbits
> -.long x2 // reloc: .bss + 4
> -
> -// No overriding symbol.
> -.section x3,"a", at progbits
> -.long x3 // reloc: x3(section) + 0
> -
> -// Global vs section.
> -.section x4,"a", at 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: ]
> Index: test/MC/ELF/section-sym-err2.s
> ===================================================================
> --- /dev/null
> +++ 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
> Index: test/MC/ELF/section-sym-err.s
> ===================================================================
> --- /dev/null
> +++ 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
> Index: test/CodeGen/XCore/section-name.ll
> ===================================================================
> --- test/CodeGen/XCore/section-name.ll
> +++ 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
> Index: lib/MC/MCContext.cpp
> ===================================================================
> --- lib/MC/MCContext.cpp
> +++ lib/MC/MCContext.cpp
> @@ -315,6 +315,11 @@
> 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 {
> @@ -325,7 +330,6 @@
> }
> 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);
More information about the llvm-commits
mailing list