[llvm-commits] [llvm] r166632 - /llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Eli Friedman eli.friedman at gmail.com
Wed Oct 24 16:30:40 PDT 2012


On Wed, Oct 24, 2012 at 3:21 PM, Chad Rosier <mcrosier at apple.com> wrote:
> Author: mcrosier
> Date: Wed Oct 24 17:21:50 2012
> New Revision: 166632
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166632&view=rev
> Log:
> [ms-inline asm] Add support for parsing the '.' operator.  Given,
>
> [register].field
>
> The operator returns the value at the location pointed to by register plus the
> offset of field within its structure or union.  This patch only handles
> immediate fields (i.e., [eax].4).  The original displacement has to be a
> MCConstantExpr as well.
> Part of rdar://12470415 and rdar://12470514
>
>
> Modified:
>     llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>
> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=166632&r1=166631&r2=166632&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Wed Oct 24 17:21:50 2012
> @@ -60,6 +60,8 @@
>    X86Operand *ParseIntelBracExpression(unsigned SegReg, unsigned Size);
>    X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
>
> +  const MCExpr *ParseIntelDotOperator(const MCExpr *Disp);
> +
>    bool ParseDirectiveWord(unsigned Size, SMLoc L);
>    bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
>
> @@ -742,6 +744,11 @@
>    Parser.Lex();
>    End = Tok.getLoc();
>
> +  if (Tok.getString().startswith("."))
> +    Disp = ParseIntelDotOperator(Disp);
> +
> +  End = Tok.getLoc();
> +
>    // handle [-42]
>    if (!BaseReg && !IndexReg)
>      return X86Operand::CreateMem(Disp, Start, End, Size);
> @@ -801,6 +808,33 @@
>                                   /*Scale*/1, Start, End, Size, NeedSizeDir);
>  }
>
> +/// Parse the '.' operator.
> +const MCExpr *X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp) {
> +  AsmToken Tok = *&Parser.getTok();
> +
> +  // Drop the '.'.
> +  StringRef DotDispStr = Tok.getString().drop_front(1);
> +
> +  Lex(); // Eat .field.
> +
> +  // .Imm gets lexed as a real.
> +  if (Tok.is(AsmToken::Real)) {
> +    APInt DotDisp;
> +    DotDispStr.getAsInteger(10, DotDisp);
> +    uint64_t DotDispVal = DotDisp.getZExtValue();
> +
> +    // Special case zero dot displacement.
> +    if (!DotDispVal) return Disp;
> +
> +    // FIXME: Handle non-constant expressions.
> +    if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp)) {
> +      uint64_t OrigDispVal = OrigDisp->getValue();
> +      return MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
> +    }
> +  }
> +  return Disp;
> +}

Error handling?

-Eli



More information about the llvm-commits mailing list