[llvm] r175008 - [ms-inline-asm] Implement align directive (which is roughly equivalent to .align).

Chad Rosier mcrosier at apple.com
Tue Feb 12 13:52:57 PST 2013


On Feb 12, 2013, at 1:48 PM, Eric Christopher <echristo at gmail.com> wrote:

> Man would it be nice to have testcases that didn't need to go through clang :)

True story!

> 
> -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/16b9fd54/attachment.html>


More information about the llvm-commits mailing list