diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-07-08 21:54:16 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-07-08 21:54:16 +0000 |
commit | 230bbfbeecf8f3923c0c3f273778fd0af0256239 (patch) | |
tree | f9bae9dafb80708e23aafa812ab823cffdb2694e | |
parent | 15f3e82d4230afb81d908d1fa4b5cc73c5cc238f (diff) | |
download | bcm5719-llvm-230bbfbeecf8f3923c0c3f273778fd0af0256239.tar.gz bcm5719-llvm-230bbfbeecf8f3923c0c3f273778fd0af0256239.zip |
[MC, COFF] Permit a variable to be redefined
Our assertions in WinCOFFStreamer had unexpected side effects resulting
in symbols getting unexpectedly marked as used.
This fixes PR28462.
llvm-svn: 274941
-rw-r--r-- | llvm/lib/MC/WinCOFFStreamer.cpp | 30 | ||||
-rw-r--r-- | llvm/test/MC/COFF/pr28462.s | 14 |
2 files changed, 25 insertions, 19 deletions
diff --git a/llvm/lib/MC/WinCOFFStreamer.cpp b/llvm/lib/MC/WinCOFFStreamer.cpp index 312cebf9589..5c6407ef1e5 100644 --- a/llvm/lib/MC/WinCOFFStreamer.cpp +++ b/llvm/lib/MC/WinCOFFStreamer.cpp @@ -75,7 +75,8 @@ void MCWinCOFFStreamer::InitSections(bool NoExecStack) { SwitchSection(getContext().getObjectFileInfo()->getTextSection()); } -void MCWinCOFFStreamer::EmitLabel(MCSymbol *Symbol) { +void MCWinCOFFStreamer::EmitLabel(MCSymbol *S) { + auto *Symbol = cast<MCSymbolCOFF>(S); assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); MCObjectStreamer::EmitLabel(Symbol); } @@ -88,20 +89,16 @@ void MCWinCOFFStreamer::EmitThumbFunc(MCSymbol *Func) { llvm_unreachable("not implemented"); } -bool MCWinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol, +bool MCWinCOFFStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) { - assert(Symbol && "Symbol must be non-null!"); - assert((!Symbol->isInSection() || - Symbol->getSection().getVariant() == MCSection::SV_COFF) && - "Got non-COFF section in the COFF backend!"); - + auto *Symbol = cast<MCSymbolCOFF>(S); getAssembler().registerSymbol(*Symbol); switch (Attribute) { default: return false; case MCSA_WeakReference: case MCSA_Weak: - cast<MCSymbolCOFF>(Symbol)->setIsWeakExternal(); + Symbol->setIsWeakExternal(); Symbol->setExternal(true); break; case MCSA_Global: @@ -118,11 +115,8 @@ void MCWinCOFFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { llvm_unreachable("not implemented"); } -void MCWinCOFFStreamer::BeginCOFFSymbolDef(MCSymbol const *Symbol) { - assert((!Symbol->isInSection() || - Symbol->getSection().getVariant() == MCSection::SV_COFF) && - "Got non-COFF section in the COFF backend!"); - +void MCWinCOFFStreamer::BeginCOFFSymbolDef(MCSymbol const *S) { + auto *Symbol = cast<MCSymbolCOFF>(S); if (CurSymbol) Error("starting a new symbol definition without completing the " "previous one"); @@ -209,11 +203,9 @@ void MCWinCOFFStreamer::EmitCOFFSecRel32(MCSymbol const *Symbol) { DF->getContents().resize(DF->getContents().size() + 4, 0); } -void MCWinCOFFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, +void MCWinCOFFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size, unsigned ByteAlignment) { - assert((!Symbol->isInSection() || - Symbol->getSection().getVariant() == MCSection::SV_COFF) && - "Got non-COFF section in the COFF backend!"); + auto *Symbol = cast<MCSymbolCOFF>(S); const Triple &T = getContext().getObjectFileInfo()->getTargetTriple(); if (T.isKnownWindowsMSVCEnvironment()) { @@ -243,9 +235,9 @@ void MCWinCOFFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, } } -void MCWinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, +void MCWinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *S, uint64_t Size, unsigned ByteAlignment) { - assert(!Symbol->isInSection() && "Symbol must not already have a section!"); + auto *Symbol = cast<MCSymbolCOFF>(S); MCSection *Section = getContext().getObjectFileInfo()->getBSSSection(); getAssembler().registerSection(*Section); diff --git a/llvm/test/MC/COFF/pr28462.s b/llvm/test/MC/COFF/pr28462.s new file mode 100644 index 00000000000..271963d01c5 --- /dev/null +++ b/llvm/test/MC/COFF/pr28462.s @@ -0,0 +1,14 @@ +// RUN: llvm-mc -filetype=obj -triple i686-pc-windows-msvc < %s | llvm-readobj -s --section-data | FileCheck %s + +.text +.set var, 42 +.long var +.set var, 19 +.long var + +// CHECK:Sections [ +// CHECK: Section { +// CHECK: Name: .text (2E 74 65 78 74 00 00 00) +// CHECK: SectionData ( +// CHECK: 0000: 2A000000 13000000 +// CHECK: ) |