From c7daeb3098f58028ffe1fc495cb4c51b4d378f9d Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 25 Nov 2013 16:06:04 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195654 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFStreamer.cpp | 20 ++------------------ test/MC/COFF/comm.s | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 test/MC/COFF/comm.s diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 0c205e50709..af313b2ff88 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/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/test/MC/COFF/comm.s b/test/MC/COFF/comm.s new file mode 100644 index 00000000000..21ae5d25dda --- /dev/null +++ b/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: } -- 2.11.0