diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-09-07 21:08:01 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-09-07 21:08:01 +0000 |
commit | 68b9f0583f6af28c4912367899e4156edee3c3d0 (patch) | |
tree | d21d85fdc8f62496a06b06fd2fb3c34f8e933bc3 /llvm/lib/MC | |
parent | 2c39b77f894579c367e8b4dd640193a7d92aa876 (diff) | |
download | bcm5719-llvm-68b9f0583f6af28c4912367899e4156edee3c3d0.tar.gz bcm5719-llvm-68b9f0583f6af28c4912367899e4156edee3c3d0.zip |
Fix alignment of .comm and .lcomm on mingw32.
For some reason .lcomm uses byte alignment and .comm log2 alignment so we can't
use the same setting for both. Fix this by reintroducing the LCOMM enum.
I verified this against mingw's gcc.
llvm-svn: 163420
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCAsmInfo.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmInfoCOFF.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmInfoDarwin.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 6 |
5 files changed, 17 insertions, 10 deletions
diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp index 11e368c81a3..7ea0f3b85a5 100644 --- a/llvm/lib/MC/MCAsmInfo.cpp +++ b/llvm/lib/MC/MCAsmInfo.cpp @@ -69,7 +69,7 @@ MCAsmInfo::MCAsmInfo() { HasSetDirective = true; HasAggressiveSymbolFolding = true; COMMDirectiveAlignmentIsInBytes = true; - LCOMMDirectiveSupportsAlignment = false; + LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; HasDotTypeDotSizeDirective = true; HasSingleParameterDotFile = true; HasNoDeadStrip = false; diff --git a/llvm/lib/MC/MCAsmInfoCOFF.cpp b/llvm/lib/MC/MCAsmInfoCOFF.cpp index 4b426f8a731..fd79193073d 100644 --- a/llvm/lib/MC/MCAsmInfoCOFF.cpp +++ b/llvm/lib/MC/MCAsmInfoCOFF.cpp @@ -19,8 +19,10 @@ void MCAsmInfoCOFF::anchor() { } MCAsmInfoCOFF::MCAsmInfoCOFF() { GlobalPrefix = "_"; - COMMDirectiveAlignmentIsInBytes = true; - LCOMMDirectiveSupportsAlignment = true; + // MingW 4.5 and later support .comm with log2 alignment, but .lcomm uses byte + // alignment. + COMMDirectiveAlignmentIsInBytes = false; + LCOMMDirectiveAlignmentType = LCOMM::ByteAlignment; HasDotTypeDotSizeDirective = false; HasSingleParameterDotFile = false; PrivateGlobalPrefix = "L"; // Prefix for private global symbols diff --git a/llvm/lib/MC/MCAsmInfoDarwin.cpp b/llvm/lib/MC/MCAsmInfoDarwin.cpp index 99520d4bf9a..a0e3ebad5e2 100644 --- a/llvm/lib/MC/MCAsmInfoDarwin.cpp +++ b/llvm/lib/MC/MCAsmInfoDarwin.cpp @@ -32,7 +32,7 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { AlignmentIsInBytes = false; COMMDirectiveAlignmentIsInBytes = false; - LCOMMDirectiveSupportsAlignment = true; + LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; InlineAsmStart = " InlineAsm Start"; InlineAsmEnd = " InlineAsm End"; diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 804e38ead08..b0bc2900ecb 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -519,13 +519,16 @@ void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlign) { OS << "\t.lcomm\t" << *Symbol << ',' << Size; if (ByteAlign > 1) { - assert(MAI.getLCOMMDirectiveSupportsAlignment() && - "alignment not supported on .lcomm!"); - if (MAI.getCOMMDirectiveAlignmentIsInBytes()) { + switch (MAI.getLCOMMDirectiveAlignmentType()) { + case LCOMM::NoAlignment: + llvm_unreachable("alignment not supported on .lcomm!"); + case LCOMM::ByteAlignment: OS << ',' << ByteAlign; - } else { + break; + case LCOMM::Log2Alignment: assert(isPowerOf2_32(ByteAlign) && "alignment must be a power of 2"); OS << ',' << Log2_32(ByteAlign); + break; } } EmitEOL(); diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 271fee02ada..55ef01c7961 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -2280,11 +2280,13 @@ bool AsmParser::ParseDirectiveComm(bool IsLocal) { if (ParseAbsoluteExpression(Pow2Alignment)) return true; - if (IsLocal && !Lexer.getMAI().getLCOMMDirectiveSupportsAlignment()) + LCOMM::LCOMMType LCOMM = Lexer.getMAI().getLCOMMDirectiveAlignmentType(); + if (IsLocal && LCOMM == LCOMM::NoAlignment) return Error(Pow2AlignmentLoc, "alignment not supported on this target"); // If this target takes alignments in bytes (not log) validate and convert. - if (Lexer.getMAI().getCOMMDirectiveAlignmentIsInBytes()) { + if ((!IsLocal && Lexer.getMAI().getCOMMDirectiveAlignmentIsInBytes()) || + (IsLocal && LCOMM == LCOMM::ByteAlignment)) { if (!isPowerOf2_64(Pow2Alignment)) return Error(Pow2AlignmentLoc, "alignment must be a power of 2"); Pow2Alignment = Log2_64(Pow2Alignment); |