[llvm] r175008 - [ms-inline-asm] Implement align directive (which is roughly equivalent to .align).
Eric Christopher
echristo at gmail.com
Tue Feb 12 13:48:14 PST 2013
Man would it be nice to have testcases that didn't need to go through clang
:)
-eric
On Tue, Feb 12, 2013 at 1:33 PM, Chad Rosier <mcrosier at apple.com> wrote:
> Author: mcrosier
> Date: Tue Feb 12 15:33:51 2013
> New Revision: 175008
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175008&view=rev
> Log:
> [ms-inline-asm] Implement align directive (which is roughly equivalent to
> .align).
>
> Also, allow _EMIT and __EMIT for the emit directive. We already do the
> same
> for TYPE, SIZE, and LENGTH.
> rdar://13200215
>
> Modified:
> llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
> llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetAsmParser.h?rev=175008&r1=175007&r2=175008&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCTargetAsmParser.h (original)
> +++ llvm/trunk/include/llvm/MC/MCTargetAsmParser.h Tue Feb 12 15:33:51 2013
> @@ -22,6 +22,7 @@ class MCInst;
> template <typename T> class SmallVectorImpl;
>
> enum AsmRewriteKind {
> + AOK_Align, // Rewrite align as .align.
> AOK_DotOperator, // Rewrite a dot operator expression as an
> immediate.
> // E.g., [eax].foo.bar -> [eax].8
> AOK_Emit, // Rewrite _emit as .byte.
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=175008&r1=175007&r2=175008&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Feb 12 15:33:51 2013
> @@ -443,9 +443,12 @@ private:
> bool ParseDirectiveIrpc(SMLoc DirectiveLoc); // ".irpc"
> bool ParseDirectiveEndr(SMLoc DirectiveLoc); // ".endr"
>
> - // "_emit"
> - bool ParseDirectiveEmit(SMLoc DirectiveLoc, ParseStatementInfo &Info,
> - size_t len);
> + // "_emit" or "__emit"
> + bool ParseDirectiveMSEmit(SMLoc DirectiveLoc, ParseStatementInfo &Info,
> + size_t Len);
> +
> + // "align"
> + bool ParseDirectiveMSAlign(SMLoc DirectiveLoc, ParseStatementInfo
> &Info);
>
> void initializeDirectiveKindMap();
> };
> @@ -1447,9 +1450,14 @@ bool AsmParser::ParseStatement(ParseStat
> return Error(IDLoc, "unknown directive");
> }
>
> - // _emit or __emit
> - if (ParsingInlineAsm && (IDVal == "_emit" || IDVal == "__emit"))
> - return ParseDirectiveEmit(IDLoc, Info, IDVal.size());
> + // __asm _emit or __asm __emit
> + if (ParsingInlineAsm && (IDVal == "_emit" || IDVal == "__emit" ||
> + IDVal == "_EMIT" || IDVal == "__EMIT"))
> + return ParseDirectiveMSEmit(IDLoc, Info, IDVal.size());
> +
> + // __asm align
> + if (ParsingInlineAsm && (IDVal == "align" || IDVal == "ALIGN"))
> + return ParseDirectiveMSAlign(IDLoc, Info);
>
> CheckForValidSection();
>
> @@ -3989,7 +3997,7 @@ bool AsmParser::ParseDirectiveEndr(SMLoc
> return false;
> }
>
> -bool AsmParser::ParseDirectiveEmit(SMLoc IDLoc, ParseStatementInfo &Info,
> size_t len) {
> +bool AsmParser::ParseDirectiveMSEmit(SMLoc IDLoc, ParseStatementInfo
> &Info, size_t Len) {
> const MCExpr *Value;
> SMLoc ExprLoc = getLexer().getLoc();
> if (ParseExpression(Value))
> @@ -4001,7 +4009,23 @@ bool AsmParser::ParseDirectiveEmit(SMLoc
> if (!isUIntN(8, IntValue) && !isIntN(8, IntValue))
> return Error(ExprLoc, "literal value out of range for directive");
>
> - Info.AsmRewrites->push_back(AsmRewrite(AOK_Emit, IDLoc, len));
> + Info.AsmRewrites->push_back(AsmRewrite(AOK_Emit, IDLoc, Len));
> + return false;
> +}
> +
> +bool AsmParser::ParseDirectiveMSAlign(SMLoc IDLoc, ParseStatementInfo
> &Info) {
> + const MCExpr *Value;
> + SMLoc ExprLoc = getLexer().getLoc();
> + if (ParseExpression(Value))
> + return true;
> + const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value);
> + if (!MCE)
> + return Error(ExprLoc, "unexpected expression in align");
> + uint64_t IntValue = MCE->getValue();
> + if (!isPowerOf2_64(IntValue))
> + return Error(ExprLoc, "literal value not a power of two greater then
> zero");
> +
> + Info.AsmRewrites->push_back(AsmRewrite(AOK_Align, IDLoc, 5,
> Log2_64(IntValue)));
> return false;
> }
>
> @@ -4133,6 +4157,7 @@ bool AsmParser::ParseMSInlineAsm(void *A
> I = AsmStrRewrites.begin(), E = AsmStrRewrites.end(); I != E;
> ++I) {
> const char *Loc = (*I).Loc.getPointer();
>
> + unsigned AdditionalSkip = 0;
> AsmRewriteKind Kind = (*I).Kind;
>
> // Emit everything up to the immediate/expression. If the previous
> rewrite
> @@ -4180,6 +4205,15 @@ bool AsmParser::ParseMSInlineAsm(void *A
> case AOK_Emit:
> OS << ".byte";
> break;
> + case AOK_Align: {
> + unsigned Val = (*I).Val;
> + OS << ".align " << Val;
> +
> + // Skip the original immediate.
> + assert (Val < 10 && "Expected alignment less then 2^10.");
> + AdditionalSkip = (Val < 4) ? 2 : Val < 7 ? 3 : 4;
> + break;
> + }
> case AOK_DotOperator:
> OS << (*I).Val;
> break;
> @@ -4187,7 +4221,7 @@ bool AsmParser::ParseMSInlineAsm(void *A
>
> // Skip the original expression.
> if (Kind != AOK_SizeDirective)
> - Start = Loc + (*I).Len;
> + Start = Loc + (*I).Len + AdditionalSkip;
> }
>
> // Emit the remainder of the asm string.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130212/2ec2da19/attachment.html>
More information about the llvm-commits
mailing list