From e9902d8325c613bf14f9b45ef2572fce8c192e0c Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 12 Apr 2013 19:51:49 +0000 Subject: [PATCH] [ms-inline asm] Address the FIXME for ImmDisp before brackets. This is a follow on to r179393 and r179399. Test case to be added on the clang side. Part of rdar://13453209 llvm-svn: 179403 --- .../lib/Target/X86/AsmParser/X86AsmParser.cpp | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 8317a87baa0a..6e11e42822ff 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -61,7 +61,7 @@ private: X86Operand *ParseIntelOperator(unsigned OpKind); X86Operand *ParseIntelMemOperand(unsigned SegReg, uint64_t ImmDisp, SMLoc StartLoc); - X86Operand *ParseIntelBracExpression(unsigned SegReg, SMLoc SizeDirLoc, + X86Operand *ParseIntelBracExpression(unsigned SegReg, SMLoc Start, uint64_t ImmDisp, unsigned Size); X86Operand *ParseIntelVarWithQualifier(const MCExpr *&Disp, StringRef &Identifier); @@ -70,8 +70,7 @@ private: X86Operand *CreateMemForInlineAsm(unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, unsigned IndexReg, unsigned Scale, SMLoc Start, SMLoc End, - SMLoc SizeDirLoc, unsigned Size, - StringRef SymName); + unsigned Size, StringRef SymName); bool ParseIntelDotOperator(const MCExpr *Disp, const MCExpr **NewDisp, SmallString<64> &Err); @@ -1083,8 +1082,7 @@ X86Operand * X86AsmParser::CreateMemForInlineAsm(unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, unsigned IndexReg, unsigned Scale, SMLoc Start, SMLoc End, - SMLoc SizeDirLoc, unsigned Size, - StringRef SymName) { + unsigned Size, StringRef SymName) { bool NeedSizeDir = false; if (const MCSymbolRefExpr *SymRef = dyn_cast(Disp)) { const MCSymbol &Sym = SymRef->getSymbol(); @@ -1111,8 +1109,8 @@ X86AsmParser::CreateMemForInlineAsm(unsigned SegReg, const MCExpr *Disp, } if (NeedSizeDir) - InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, SizeDirLoc, - /*Len*/0, Size)); + InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, Start, + /*Len=*/0, Size)); // When parsing inline assembly we set the base register to a non-zero value // if we don't know the actual value at this time. This is necessary to @@ -1122,15 +1120,13 @@ X86AsmParser::CreateMemForInlineAsm(unsigned SegReg, const MCExpr *Disp, End, Size, SymName); } -X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, - SMLoc SizeDirLoc, +X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, SMLoc Start, uint64_t ImmDisp, unsigned Size) { const AsmToken &Tok = Parser.getTok(); - SMLoc Start = Tok.getLoc(), End = Tok.getEndLoc(); - + SMLoc BracLoc = Tok.getLoc(), End = Tok.getEndLoc(); if (getLexer().isNot(AsmToken::LBrac)) - return ErrorOperand(Start, "Expected '[' token!"); + return ErrorOperand(BracLoc, "Expected '[' token!"); Parser.Lex(); // Eat '[' unsigned TmpReg = 0; @@ -1210,7 +1206,7 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, if (isParsingInlineAsm()) { // Remove the '[' and ']' from the IR string. - InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Start, 1)); + InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, BracLoc, 1)); InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, End, 1)); // If ImmDisp is non-zero, then we parsed a displacement before the @@ -1221,14 +1217,29 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, // then we have an additional displacement in the bracketed expression. if (ImmDisp != FinalImmDisp) { if (ImmDisp) { - // FIXME: We have an immediate displacement before the bracketed - // expression. Adjust this to match the final immediate displacement. + // We have an immediate displacement before the bracketed expression. + // Adjust this to match the final immediate displacement. + bool Found = false; + for (SmallVectorImpl::iterator + I = InstInfo->AsmRewrites->begin(), + E = InstInfo->AsmRewrites->end(); I != E; ++I) { + if ((*I).Loc.getPointer() > BracLoc.getPointer()) + continue; + if ((*I).Kind == AOK_ImmPrefix) { + (*I).Kind = AOK_Imm; + (*I).Len = BracLoc.getPointer() - (*I).Loc.getPointer(); + (*I).Val = FinalImmDisp; + Found = true; + break; + } + } + assert (Found && "Unable to rewrite ImmDisp."); } else { // We have a symbolic and an immediate displacement, but no displacement // before the bracketed expression. // Put the immediate displacement before the bracketed expression. - InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Imm, Start, 0, + InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Imm, BracLoc, 0, FinalImmDisp)); } } @@ -1278,7 +1289,7 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, if (isParsingInlineAsm()) return CreateMemForInlineAsm(SegReg, Disp, BaseReg, IndexReg, Scale, Start, - End, SizeDirLoc, Size, SM.getSymName()); + End, Size, SM.getSymName()); // handle [-42] if (!BaseReg && !IndexReg) { @@ -1385,7 +1396,7 @@ X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg, return Err; return CreateMemForInlineAsm(/*SegReg=*/0, Disp, /*BaseReg=*/0,/*IndexReg=*/0, - /*Scale=*/1, Start, End, Start, Size,Identifier); + /*Scale=*/1, Start, End, Size, Identifier); } /// Parse the '.' operator. -- 2.34.1