summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-11-25 16:06:04 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-11-25 16:06:04 +0000
commitedcf1ff7d1855d29a8befa335d79e5d0a61523d6 (patch)
treed973a1658ae4a0c529a006477877d84783e588a4
parent3294e05762d478451e76ad566301b275ec4307cb (diff)
downloadbcm5719-llvm-edcf1ff7d1855d29a8befa335d79e5d0a61523d6.tar.gz
bcm5719-llvm-edcf1ff7d1855d29a8befa335d79e5d0a61523d6.zip
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. llvm-svn: 195654
-rw-r--r--llvm/lib/MC/WinCOFFStreamer.cpp20
-rw-r--r--llvm/test/MC/COFF/comm.s25
2 files changed, 27 insertions, 18 deletions
diff --git a/llvm/lib/MC/WinCOFFStreamer.cpp b/llvm/lib/MC/WinCOFFStreamer.cpp
index 0c205e50709..af313b2ff88 100644
--- a/llvm/lib/MC/WinCOFFStreamer.cpp
+++ b/llvm/lib/MC/WinCOFFStreamer.cpp
@@ -140,28 +140,12 @@ void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size,
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);
diff --git a/llvm/test/MC/COFF/comm.s b/llvm/test/MC/COFF/comm.s
new file mode 100644
index 00000000000..21ae5d25dda
--- /dev/null
+++ b/llvm/test/MC/COFF/comm.s
@@ -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: }
OpenPOWER on IntegriCloud