[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