diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 97c068395176dfed4a9b3eb3d6445de2811120eb..d95dad55af244631dd2f521e74b112cc81de6d8c 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -270,7 +270,7 @@ private: int64_t Imm; const MCExpr *Sym; StringRef SymName; - bool StopOnLBrac, AddImmPrefix; + bool StopOnLBrac, AddImmPrefix, Rel, Abs; InfixCalculator IC; InlineAsmIdentifierInfo Info; @@ -278,9 +278,9 @@ private: IntelExprStateMachine(int64_t imm, bool stoponlbrac, bool addimmprefix) : State(IES_PLUS), PrevState(IES_ERROR), BaseReg(0), IndexReg(0), TmpReg(0), Scale(1), Imm(imm), Sym(nullptr), StopOnLBrac(stoponlbrac), - AddImmPrefix(addimmprefix) { Info.clear(); } + AddImmPrefix(addimmprefix), Rel(false), Abs(false) { Info.clear(); } - unsigned getBaseReg() { return BaseReg; } + unsigned getBaseReg() { return (Rel && !Abs && BaseReg == 0 && IndexReg == 0) ? X86::RIP : BaseReg; } unsigned getIndexReg() { return IndexReg; } unsigned getScale() { return Scale; } const MCExpr *getSym() { return Sym; } @@ -448,6 +448,12 @@ private: } PrevState = CurrState; } + void onRel() { + Rel = true; + } + void onAbs() { + Abs = true; + } void onRegister(unsigned Reg) { IntelExprState CurrState = State; switch (State) { @@ -1277,6 +1283,23 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) MCAsmParser &Parser = getParser(); const AsmToken &Tok = Parser.getTok(); + // nasm tokens rel / abs are only valid at the beginning of the expression. + if (KsSyntax == KS_OPT_SYNTAX_NASM) { + while (getLexer().getKind() == AsmToken::Identifier) { + StringRef Identifier = Tok.getString().lower(); + if (Identifier == "rel") { + SM.onRel(); + consumeToken(); + continue; + } else if (Identifier == "abs") { + SM.onAbs(); + consumeToken(); + continue; + } + break; + } + } + AsmToken::TokenKind PrevTK = AsmToken::Error; bool Done = false; while (!Done) {