[llvm] r195654 - Fix .comm and .lcomm on COFF.

Rafael Espindola rafael.espindola at gmail.com
Mon Nov 25 08:06:04 PST 2013


Author: rafael
Date: Mon Nov 25 10:06:04 2013
New Revision: 195654

URL: http://llvm.org/viewvc/llvm-project?rev=195654&view=rev
Log:
Fix .comm and .lcomm on COFF.

These should not use COMDATs. GNU as uses .bss for .lcomm and section 0 for
.comm.

Given

static int a;
int b;

MSVC puts both in .bss. This patch then puts both .comm and .lcomm on .bss. With
this change we agree with gas on .lcomm, are much closer on .comm and clang-cl
matches msvc on the above example.

Added:
    llvm/trunk/test/MC/COFF/comm.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=195654&r1=195653&r2=195654&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WinCOFFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/WinCOFFStreamer.cpp Mon Nov 25 10:06:04 2013
@@ -140,28 +140,12 @@ void WinCOFFStreamer::AddCommonSymbol(MC
                                       unsigned ByteAlignment, bool External) {
   assert(!Symbol->isInSection() && "Symbol must not already have a section!");
 
-  std::string SectionName(".bss$linkonce");
-  SectionName.append(Symbol->getName().begin(), Symbol->getName().end());
-
-  MCSymbolData &SymbolData = getAssembler().getOrCreateSymbolData(*Symbol);
-
-  unsigned Characteristics =
-    COFF::IMAGE_SCN_LNK_COMDAT |
-    COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
-    COFF::IMAGE_SCN_MEM_READ |
-    COFF::IMAGE_SCN_MEM_WRITE;
-
-  int Selection = COFF::IMAGE_COMDAT_SELECT_LARGEST;
-
-  const MCSection *Section = MCStreamer::getContext().getCOFFSection(
-      SectionName, Characteristics, SectionKind::getBSS(), Symbol->getName(),
-      Selection);
-
+  const MCSectionCOFF *Section = getSectionBSS();
   MCSectionData &SectionData = getAssembler().getOrCreateSectionData(*Section);
-
   if (SectionData.getAlignment() < ByteAlignment)
     SectionData.setAlignment(ByteAlignment);
 
+  MCSymbolData &SymbolData = getAssembler().getOrCreateSymbolData(*Symbol);
   SymbolData.setExternal(External);
 
   AssignSection(Symbol, Section);

Added: llvm/trunk/test/MC/COFF/comm.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/comm.s?rev=195654&view=auto
==============================================================================
--- llvm/trunk/test/MC/COFF/comm.s (added)
+++ llvm/trunk/test/MC/COFF/comm.s Mon Nov 25 10:06:04 2013
@@ -0,0 +1,25 @@
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | llvm-readobj -t | FileCheck %s
+
+.lcomm _a,4,4
+.comm	_b, 4, 2
+
+
+// CHECK:       Symbol {
+// CHECK:         Name: _a
+// CHECK-NEXT:    Value:
+// CHECK-NEXT:    Section: .bss
+// CHECK-NEXT:    BaseType: Null
+// CHECK-NEXT:    ComplexType: Null
+// CHECK-NEXT:    StorageClass: Static
+// CHECK-NEXT:    AuxSymbolCount: 0
+// CHECK-NEXT:  }
+
+// CHECK:       Symbol {
+// CHECK:         Name: _b
+// CHECK-NEXT:    Value: 4
+// CHECK-NEXT:    Section: .bss
+// CHECK-NEXT:    BaseType: Null
+// CHECK-NEXT:    ComplexType: Null
+// CHECK-NEXT:    StorageClass: External
+// CHECK-NEXT:    AuxSymbolCount: 0
+// CHECK-NEXT:  }





More information about the llvm-commits mailing list