diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-05-17 21:54:30 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-05-17 21:54:30 +0000 |
commit | 648ac5153e2317d8eb21c5b201f7c58e6a04e2d6 (patch) | |
tree | bd0033f43606e67c72103041a84fb5d2b9851ba0 /lib/MC/MCParser/AsmParser.cpp | |
parent | 9a744e38607bc3046dffea56efec0b2dfc51d5e4 (diff) | |
download | external_llvm-648ac5153e2317d8eb21c5b201f7c58e6a04e2d6.tar.gz external_llvm-648ac5153e2317d8eb21c5b201f7c58e6a04e2d6.tar.bz2 external_llvm-648ac5153e2317d8eb21c5b201f7c58e6a04e2d6.zip |
MC/Mach-O/x86: Optimal nop sequences should only be used for the .text sections, not all sections in the text segment.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103981 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 0df839b84d..c4916731ef 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -1178,10 +1178,8 @@ bool AsmParser::ParseDirectiveAlign(bool IsPow2, unsigned ValueSize) { Lex(); - if (!HasFillExpr) { - // FIXME: Sometimes fill with nop. + if (!HasFillExpr) FillExpr = 0; - } // Compute alignment in bytes. if (IsPow2) { @@ -1209,14 +1207,21 @@ bool AsmParser::ParseDirectiveAlign(bool IsPow2, unsigned ValueSize) { } } - // FIXME: hard code the parser to use EmitCodeAlignment for text when using - // the TextAlignFillValue. - if(Out.getCurrentSection()->getKind().isText() && - Lexer.getMAI().getTextAlignFillValue() == FillExpr) + // Check whether we should use optimal code alignment for this .align + // directive. + // + // FIXME: This should be using a target hook. + bool UseCodeAlign = false; + if (const MCSectionMachO *S = dyn_cast<MCSectionMachO>( + Out.getCurrentSection())) + UseCodeAlign = S->hasAttribute(MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS); + if ((!HasFillExpr || Lexer.getMAI().getTextAlignFillValue() == FillExpr) && + ValueSize == 1 && UseCodeAlign) { Out.EmitCodeAlignment(Alignment, MaxBytesToFill); - else + } else { // FIXME: Target specific behavior about how the "extra" bytes are filled. Out.EmitValueToAlignment(Alignment, FillExpr, ValueSize, MaxBytesToFill); + } return false; } |