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

Chad Rosier mcrosier at apple.com
Thu Oct 25 10:39:39 PDT 2012


On Oct 24, 2012, at 4:30 PM, Eli Friedman <eli.friedman at gmail.com> wrote:

> 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?

Committed revision 166698.  Chad

> -Eli




More information about the llvm-commits mailing list