diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -634,20 +634,29 @@ } } - MCSection *ELFSection = getContext().getELFSection( + MCSectionELF *Section = getContext().getELFSection( SectionName, Type, Flags, Size, GroupName, UniqueID, LinkedToSym); - getStreamer().SwitchSection(ELFSection, Subsection); + getStreamer().SwitchSection(Section, Subsection); + if (Section->getType() != Type) + Error(loc, "changed section type for " + SectionName + ", expected: 0x" + + utohexstr(Section->getType())); + if (Section->getFlags() != Flags) + Error(loc, "changed section flags for " + SectionName + ", expected: 0x" + + utohexstr(Section->getFlags())); + if (Section->getEntrySize() != Size) + Error(loc, "changed section entsize for " + SectionName + + ", expected: " + Twine(Section->getEntrySize())); if (getContext().getGenDwarfForAssembly()) { - bool InsertResult = getContext().addGenDwarfSection(ELFSection); + bool InsertResult = getContext().addGenDwarfSection(Section); if (InsertResult) { if (getContext().getDwarfVersion() <= 2) Warning(loc, "DWARF2 only supports one section per compilation unit"); - if (!ELFSection->getBeginSymbol()) { + if (!Section->getBeginSymbol()) { MCSymbol *SectionStartSymbol = getContext().createTempSymbol(); getStreamer().emitLabel(SectionStartSymbol); - ELFSection->setBeginSymbol(SectionStartSymbol); + Section->setBeginSymbol(SectionStartSymbol); } } } diff --git a/llvm/test/MC/ELF/exclude-debug-dwo.s b/llvm/test/MC/ELF/exclude-debug-dwo.s --- a/llvm/test/MC/ELF/exclude-debug-dwo.s +++ b/llvm/test/MC/ELF/exclude-debug-dwo.s @@ -10,23 +10,23 @@ # CHECK: .debug_loc.dwo {{.*}} E # CHECK: .debug_str_offsets.dwo {{.*}} E -.section .debug_info.dwo +.section .debug_info.dwo,"e" nop -.section .debug_types.dwo +.section .debug_types.dwo,"e" nop -.section .debug_abbrev.dwo +.section .debug_abbrev.dwo,"e" nop -.section .debug_str.dwo +.section .debug_str.dwo,"MSe",@progbits,1 nop -.section .debug_line.dwo +.section .debug_line.dwo,"e" nop -.section .debug_loc.dwo +.section .debug_loc.dwo,"e" nop -.section .debug_str_offsets.dwo +.section .debug_str_offsets.dwo,"e" nop diff --git a/llvm/test/MC/ELF/section-entsize-changed.s b/llvm/test/MC/ELF/section-entsize-changed.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/ELF/section-entsize-changed.s @@ -0,0 +1,12 @@ +# RUN: not llvm-mc -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error: + +foo: +.section .foo,"aM",@progbits,1 + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section entsize for .foo, expected: 1 +.section .foo,"aM",@progbits,4 + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section entsize for .foo, expected: 1 +.pushsection .foo,"aM",@progbits,4 + +.pushsection .foo,"aM",@progbits,1 diff --git a/llvm/test/MC/ELF/section-flags-changed.s b/llvm/test/MC/ELF/section-flags-changed.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/ELF/section-flags-changed.s @@ -0,0 +1,12 @@ +# RUN: not llvm-mc -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error: + +foo: +.section .foo,"ax",@progbits + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section flags for .foo, expected: 0x6 +.section .foo,"awx",@progbits + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section flags for .foo, expected: 0x6 +.pushsection .foo,"a",@progbits + +.pushsection .foo,"ax",@progbits diff --git a/llvm/test/MC/ELF/section-type-changed.s b/llvm/test/MC/ELF/section-type-changed.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/ELF/section-type-changed.s @@ -0,0 +1,11 @@ +# RUN: not llvm-mc -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error: + +.section .foo,"a",@progbits + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section type for .foo, expected: 0x1 +.section .foo,"a",@init_array + +# CHECK: {{.*}}.s:[[# @LINE+1]]:1: error: changed section type for .foo, expected: 0x1 +.pushsection .foo,"a",@nobits + +.pushsection .foo,"a",@progbits