From 1fa70c99dc9f357713be8a2127ac7812cee89c84 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 8 Oct 2014 06:38:53 +0000 Subject: [PATCH] COFF: Don't oversize COMMON symbols when targeting BFD ld COFF normally doesn't allow us to describe the alignment of COMMON symbols. It turns out that most linkers use the symbol size as a hint as to how aligned the symbol should be. However the BFD folks have added a .drectve command, which we now support as of r219229, that allows us to specify the alignment precisely. With this in mind, stop rounding sizes up. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219281 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFStreamer.cpp | 9 ++++----- test/MC/COFF/comm-align.s | 9 ++++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 9bae53706a0..b8d5f2a11b5 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -185,14 +185,13 @@ void MCWinCOFFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, "Got non-COFF section in the COFF backend!"); const Triple &T = getContext().getObjectFileInfo()->getTargetTriple(); - if (T.isKnownWindowsMSVCEnvironment()) + if (T.isKnownWindowsMSVCEnvironment()) { if (ByteAlignment > 32) report_fatal_error("alignment is limited to 32-bytes"); - // Round size up to alignment so that we will honor the alignment request. - // TODO: We don't need to do this if we are targeting the bfd linker once we - // add support for adding -aligncomm into the .drectve section. - Size = std::max(Size, static_cast(ByteAlignment)); + // Round size up to alignment so that we will honor the alignment request. + Size = std::max(Size, static_cast(ByteAlignment)); + } AssignSection(Symbol, nullptr); diff --git a/test/MC/COFF/comm-align.s b/test/MC/COFF/comm-align.s index e658c5685d3..ca6bfbea247 100644 --- a/test/MC/COFF/comm-align.s +++ b/test/MC/COFF/comm-align.s @@ -24,6 +24,8 @@ _a: .comm _s_4,4,2 # @s_3 .comm _s_8,4,3 # @s_4 + .comm _small_but_overaligned,1,3 # @s_4 + .text .def _b @@ -41,10 +43,15 @@ _b: # CHECK: Section: .text (1) # CHECK: } # CHECK: Symbol { +# CHECK: Name: _small_but_overaligned +# CHECK-NEXT:Value: 1 +# CHECK-NEXT:Section: IMAGE_SYM_UNDEFINED (0) +# CHECK: } +# CHECK: Symbol { # CHECK: Name: _b # CHECK: Section: .text (1) # CHECK: } # CHECK: ] -# CHECK: Directive(s): -aligncomm:"_s_2",1 -aligncomm:"_s_4",2 -aligncomm:"_s_8",3 +# CHECK: Directive(s): -aligncomm:"_s_2",1 -aligncomm:"_s_4",2 -aligncomm:"_s_8",3 -aligncomm:"_small_but_overaligned",3