diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 55f1a90b2a01a..5355d38fc046d 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -2123,14 +2123,18 @@ ParseStatus RISCVAsmParser::parseCallSymbol(OperandVector &Operands) { if (getLexer().getKind() != AsmToken::Identifier) return ParseStatus::NoMatch; + std::string Identifier(getTok().getIdentifier()); + SMLoc E = getTok().getEndLoc(); if (getLexer().peekTok().is(AsmToken::At)) { Lex(); Lex(); StringRef PLT; + SMLoc PLTLoc = getLoc(); if (getParser().parseIdentifier(PLT) || PLT != "plt") - return ParseStatus::Failure; + return Error(PLTLoc, + "'@plt' is the only valid operand for this instruction"); } else if (!getLexer().peekTok().is(AsmToken::EndOfStatement)) { // Avoid parsing the register in `call rd, foo` as a call symbol. return ParseStatus::NoMatch; @@ -2138,7 +2142,6 @@ ParseStatus RISCVAsmParser::parseCallSymbol(OperandVector &Operands) { Lex(); } - SMLoc E = SMLoc::getFromPointer(S.getPointer() + Identifier.size()); RISCVMCExpr::Specifier Kind = RISCVMCExpr::VK_CALL_PLT; MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier); diff --git a/llvm/test/MC/RISCV/function-call-invalid.s b/llvm/test/MC/RISCV/function-call-invalid.s index 2b7a85245880d..358d7342c6d1f 100644 --- a/llvm/test/MC/RISCV/function-call-invalid.s +++ b/llvm/test/MC/RISCV/function-call-invalid.s @@ -10,3 +10,4 @@ call %lo(1234) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name call %hi(foo) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name call %lo(foo) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name call foo, bar # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name +call foo@rlt # CHECK: :[[@LINE]]:10: error: '@plt' is the only valid operand for this instruction diff --git a/llvm/test/MC/RISCV/tail-call-invalid.s b/llvm/test/MC/RISCV/tail-call-invalid.s index 270d84df58ac4..6d31354ffce1f 100644 --- a/llvm/test/MC/RISCV/tail-call-invalid.s +++ b/llvm/test/MC/RISCV/tail-call-invalid.s @@ -10,3 +10,4 @@ tail %hi(1234) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name tail %lo(1234) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name tail %hi(foo) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name tail %lo(foo) # CHECK: :[[@LINE]]:6: error: operand must be a bare symbol name +tail foo@mlt # CHECK: :[[@LINE]]:10: error: '@plt' is the only valid operand for this instruction