[PATCH] D30235: Disallow redefinition of section symbols.

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 24 12:56:50 PST 2017


Thanks!
Btw, your comments do not show in phabricator for some reason.

On Fri, Feb 24, 2017 at 12:06 PM, Rafael Avila de Espindola
<rafael.espindola at gmail.com> wrote:
> 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