[llvm] r179030 - [ms-inline asm] Add support for ImmDisp [ Symbol ] memory operands.

Chad Rosier mcrosier at apple.com
Mon Apr 8 23:13:30 PDT 2013


IIRC, the test case was added in r179031 on the clang side.

On Apr 8, 2013, at 9:54 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com> wrote:

> testcase?
> 
> On 8 April 2013 13:43, Chad Rosier <mcrosier at apple.com> wrote:
>> Author: mcrosier
>> Date: Mon Apr  8 12:43:47 2013
>> New Revision: 179030
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=179030&view=rev
>> Log:
>> [ms-inline asm] Add support for ImmDisp [ Symbol ] memory operands.
>> rdar://13521249
>> 
>> Modified:
>>    llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
>>    llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>>    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>> 
>> Modified: llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetAsmParser.h?rev=179030&r1=179029&r2=179030&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCTargetAsmParser.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCTargetAsmParser.h Mon Apr  8 12:43:47 2013
>> @@ -22,7 +22,7 @@ class MCInst;
>> template <typename T> class SmallVectorImpl;
>> 
>> enum AsmRewriteKind {
>> -  AOK_Align,          // Rewrite align as .align.
>> +  AOK_Align = 0,      // 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.
>> @@ -34,6 +34,18 @@ enum AsmRewriteKind {
>>   AOK_Skip            // Skip emission (e.g., offset/type operators).
>> };
>> 
>> +const char AsmRewritePrecedence [] = {
>> +  0, // AOK_Align
>> +  0, // AOK_DotOperator
>> +  0, // AOK_Emit
>> +  2, // AOK_Imm
>> +  2, // AOK_ImmPrefix
>> +  1, // AOK_Input
>> +  1, // AOK_Output
>> +  3, // AOK_SizeDirective
>> +  0  // AOK_Skip
>> +};
>> +
>> struct AsmRewrite {
>>   AsmRewriteKind Kind;
>>   SMLoc Loc;
>> 
>> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=179030&r1=179029&r2=179030&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
>> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Apr  8 12:43:47 2013
>> @@ -4046,19 +4046,17 @@ static int RewritesSort(const void *A, c
>>   if (AsmRewriteB->Loc.getPointer() < AsmRewriteA->Loc.getPointer())
>>     return 1;
>> 
>> -  // It's possible to have a SizeDirective rewrite and an Input/Output rewrite
>> -  // to the same location.  Make sure the SizeDirective rewrite is performed
>> -  // first.  This also ensure the sort algorithm is stable.
>> -  if (AsmRewriteA->Kind == AOK_SizeDirective) {
>> -    assert ((AsmRewriteB->Kind == AOK_Input || AsmRewriteB->Kind == AOK_Output) &&
>> -            "Expected an Input/Output rewrite!");
>> +  // It's possible to have a SizeDirective, Imm/ImmPrefix and an Input/Output
>> +  // rewrite to the same location.  Make sure the SizeDirective rewrite is
>> +  // performed first, then the Imm/ImmPrefix and finally the Input/Output.  This
>> +  // ensures the sort algorithm is stable.
>> +  if (AsmRewritePrecedence [AsmRewriteA->Kind] >
>> +      AsmRewritePrecedence [AsmRewriteB->Kind])
>>     return -1;
>> -  }
>> -  if (AsmRewriteB->Kind == AOK_SizeDirective) {
>> -    assert ((AsmRewriteA->Kind == AOK_Input || AsmRewriteA->Kind == AOK_Output) &&
>> -            "Expected an Input/Output rewrite!");
>> +
>> +  if (AsmRewritePrecedence [AsmRewriteA->Kind] <
>> +      AsmRewritePrecedence [AsmRewriteB->Kind])
>>     return 1;
>> -  }
>>   llvm_unreachable ("Unstable rewrite sort.");
>> }
>> 
>> 
>> 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=179030&r1=179029&r2=179030&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Apr  8 12:43:47 2013
>> @@ -61,8 +61,8 @@ private:
>>   X86Operand *ParseIntelOperator(SMLoc StartLoc, unsigned OpKind);
>>   X86Operand *ParseIntelMemOperand(unsigned SegReg, uint64_t ImmDisp,
>>                                    SMLoc StartLoc);
>> -  X86Operand *ParseIntelBracExpression(unsigned SegReg, uint64_t ImmDisp,
>> -                                       unsigned Size);
>> +  X86Operand *ParseIntelBracExpression(unsigned SegReg, SMLoc SizeDirLoc,
>> +                                       uint64_t ImmDisp, unsigned Size);
>>   X86Operand *ParseIntelVarWithQualifier(const MCExpr *&Disp,
>>                                          SMLoc &IdentStart);
>>   X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
>> @@ -1100,6 +1100,7 @@ X86Operand *X86AsmParser::CreateMemForIn
>> }
>> 
>> X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
>> +                                                   SMLoc SizeDirLoc,
>>                                                    uint64_t ImmDisp,
>>                                                    unsigned Size) {
>>   const AsmToken &Tok = Parser.getTok();
>> @@ -1126,18 +1127,11 @@ X86Operand *X86AsmParser::ParseIntelBrac
>>       if (getLexer().isNot(AsmToken::RBrac))
>>         return ErrorOperand(Parser.getTok().getLoc(), "Expected ']' token!");
>> 
>> -      // FIXME: We don't handle 'ImmDisp' '[' 'Symbol' ']'.
>> -      if (ImmDisp)
>> -        return ErrorOperand(Start, "Unsupported immediate displacement!");
>> -
>>       // Adjust the EndLoc due to the ']'.
>>       End = SMLoc::getFromPointer(Parser.getTok().getEndLoc().getPointer()-1);
>>       Parser.Lex();
>>       if (!isParsingInlineAsm())
>>         return X86Operand::CreateMem(Disp, Start, End, Size);
>> -
>> -      // We want the size directive before the '['.
>> -      SMLoc SizeDirLoc = SMLoc::getFromPointer(Start.getPointer()-1);
>>       return CreateMemForInlineAsm(Disp, Start, End, SizeDirLoc, Size);
>>     }
>>   }
>> @@ -1302,11 +1296,11 @@ X86Operand *X86AsmParser::ParseIntelMemO
>>     Parser.Lex(); // Eat the integer.
>>     if (getLexer().isNot(AsmToken::LBrac))
>>       return ErrorOperand(Start, "Expected '[' token!");
>> -    return ParseIntelBracExpression(SegReg, ImmDisp, Size);
>> +    return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
>>   }
>> 
>>   if (getLexer().is(AsmToken::LBrac))
>> -    return ParseIntelBracExpression(SegReg, ImmDisp, Size);
>> +    return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
>> 
>>   if (!ParseRegister(SegReg, Start, End)) {
>>     // Handel SegReg : [ ... ]
>> @@ -1315,7 +1309,7 @@ X86Operand *X86AsmParser::ParseIntelMemO
>>     Parser.Lex(); // Eat :
>>     if (getLexer().isNot(AsmToken::LBrac))
>>       return ErrorOperand(Start, "Expected '[' token!");
>> -    return ParseIntelBracExpression(SegReg, ImmDisp, Size);
>> +    return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
>>   }
>> 
>>   const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list