[llvm] r274941 - [MC, COFF] Permit a variable to be redefined

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 8 14:54:17 PDT 2016


Author: majnemer
Date: Fri Jul  8 16:54:16 2016
New Revision: 274941

URL: http://llvm.org/viewvc/llvm-project?rev=274941&view=rev
Log:
[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.

Added:
    llvm/trunk/test/MC/COFF/pr28462.s
Modified:
    llvm/trunk/lib/MC/WinCOFFStreamer.cpp

Modified: llvm/trunk/lib/MC/WinCOFFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFStreamer.cpp?rev=274941&r1=274940&r2=274941&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Fri Jul  8 16:54:16 2016
@@ -75,7 +75,8 @@ void MCWinCOFFStreamer::InitSections(boo
   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(MC
   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(M
   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
   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
   }
 }
 
-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);

Added: llvm/trunk/test/MC/COFF/pr28462.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/pr28462.s?rev=274941&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/pr28462.s (added)
+++ llvm/trunk/test/MC/COFF/pr28462.s Fri Jul  8 16:54:16 2016
@@ -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:    )




More information about the llvm-commits mailing list