mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-20 08:54:08 +00:00
Emit an error is asm parser parsed X86_64 only registers, e.g. %rax, %sil.
This can happen in cases where TableGen generated asm matcher cannot check whether a register operand is in the right register class. e.g. mem operands. rdar://8204588 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ed398468b5
commit
5de728cfe1
@ -161,11 +161,6 @@ public:
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
namespace llvm {
|
||||
// FIXME: TableGen this?
|
||||
extern MCRegisterClass ARMMCRegisterClasses[]; // In ARMGenRegisterInfo.inc.
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/// ARMOperand - Instances of this class represent a parsed ARM machine
|
||||
|
@ -1152,11 +1152,6 @@ getMsbOpValue(const MCInst &MI, unsigned Op,
|
||||
return msb;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
// FIXME: TableGen this?
|
||||
extern MCRegisterClass ARMMCRegisterClasses[]; // In ARMGenRegisterInfo.inc.
|
||||
}
|
||||
|
||||
unsigned ARMMCCodeEmitter::
|
||||
getRegisterListOpValue(const MCInst &MI, unsigned Op,
|
||||
SmallVectorImpl<MCFixup> &Fixups) const {
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
||||
#include "llvm/MC/MCParser/MCAsmParser.h"
|
||||
@ -400,19 +401,25 @@ bool X86ATTAsmParser::ParseRegister(unsigned &RegNo,
|
||||
if (Tok.isNot(AsmToken::Identifier))
|
||||
return Error(Tok.getLoc(), "invalid register name");
|
||||
|
||||
// FIXME: Validate register for the current architecture; we have to do
|
||||
// validation later, so maybe there is no need for this here.
|
||||
RegNo = MatchRegisterName(Tok.getString());
|
||||
|
||||
// If the match failed, try the register name as lowercase.
|
||||
if (RegNo == 0)
|
||||
RegNo = MatchRegisterName(LowercaseString(Tok.getString()));
|
||||
|
||||
// FIXME: This should be done using Requires<In32BitMode> and
|
||||
// Requires<In64BitMode> so "eiz" usage in 64-bit instructions
|
||||
// can be also checked.
|
||||
if (RegNo == X86::RIZ && !is64BitMode())
|
||||
return Error(Tok.getLoc(), "riz register in 64-bit mode only");
|
||||
if (!is64BitMode()) {
|
||||
// FIXME: This should be done using Requires<In32BitMode> and
|
||||
// Requires<In64BitMode> so "eiz" usage in 64-bit instructions can be also
|
||||
// checked.
|
||||
// FIXME: Check AH, CH, DH, BH cannot be used in an instruction requiring a
|
||||
// REX prefix.
|
||||
if (RegNo == X86::RIZ ||
|
||||
X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) ||
|
||||
X86II::isX86_64NonExtLowByteReg(RegNo) ||
|
||||
X86II::isX86_64ExtendedReg(RegNo))
|
||||
return Error(Tok.getLoc(), "register %"
|
||||
+ Tok.getString() + " is only available in 64-bit mode");
|
||||
}
|
||||
|
||||
// Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
|
||||
if (RegNo == 0 && (Tok.getString() == "st" || Tok.getString() == "ST")) {
|
||||
@ -490,7 +497,7 @@ X86Operand *X86ATTAsmParser::ParseOperand() {
|
||||
SMLoc Start, End;
|
||||
if (ParseRegister(RegNo, Start, End)) return 0;
|
||||
if (RegNo == X86::EIZ || RegNo == X86::RIZ) {
|
||||
Error(Start, "eiz and riz can only be used as index registers");
|
||||
Error(Start, "%eiz and %riz can only be used as index registers");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -155,11 +155,6 @@ static MCFixupKind getImmFixupKind(uint64_t TSFlags) {
|
||||
return MCFixup::getKindForSize(Size, isPCRel);
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
// FIXME: TableGen this?
|
||||
extern MCRegisterClass X86MCRegisterClasses[]; // In X86GenRegisterInfo.inc.
|
||||
}
|
||||
|
||||
/// Is32BitMemOperand - Return true if the specified instruction with a memory
|
||||
/// operand should emit the 0x67 prefix byte in 64-bit mode due to a 32-bit
|
||||
/// memory operand. Op specifies the operand # of the memoperand.
|
||||
|
@ -1,18 +1,18 @@
|
||||
// RUN: llvm-mc -triple i386-unknown-unknown --show-encoding %s | FileCheck %s
|
||||
// RUN: llvm-mc -triple x86_64-unknown-unknown --show-encoding %s | FileCheck %s
|
||||
|
||||
// PR8283
|
||||
|
||||
// CHECK: pavgusb %mm2, %mm1 # encoding: [0x0f,0x0f,0xca,0xbf]
|
||||
pavgusb %mm2, %mm1
|
||||
|
||||
// CHECK: pavgusb 9(%esi,%edx), %mm3 # encoding: [0x0f,0x0f,0x5c,0x16,0x09,0xbf]
|
||||
// CHECK: pavgusb 9(%esi,%edx), %mm3 # encoding: [0x67,0x0f,0x0f,0x5c,0x16,0x09,0xbf]
|
||||
pavgusb 9(%esi,%edx), %mm3
|
||||
|
||||
|
||||
// CHECK: pf2id %mm2, %mm1 # encoding: [0x0f,0x0f,0xca,0x1d]
|
||||
pf2id %mm2, %mm1
|
||||
|
||||
// CHECK: pf2id 9(%esi,%edx), %mm3 # encoding: [0x0f,0x0f,0x5c,0x16,0x09,0x1d]
|
||||
// CHECK: pf2id 9(%esi,%edx), %mm3 # encoding: [0x67,0x0f,0x0f,0x5c,0x16,0x09,0x1d]
|
||||
pf2id 9(%esi,%edx), %mm3
|
||||
|
||||
// CHECK: pfacc %mm2, %mm1 # encoding: [0x0f,0x0f,0xca,0xae]
|
||||
|
@ -19571,8 +19571,8 @@
|
||||
// CHECK: aeskeygenassist $125, (%edx,%eax,4), %xmm2
|
||||
aeskeygenassist $125, (%edx,%eax,4), %xmm2
|
||||
|
||||
// CHECK: blendvps (%rax), %xmm1 # encoding: [0x66,0x0f,0x38,0x14,0x08]
|
||||
blendvps (%rax), %xmm1
|
||||
// CHECK: blendvps (%eax), %xmm1 # encoding: [0x66,0x0f,0x38,0x14,0x08]
|
||||
blendvps (%eax), %xmm1
|
||||
// CHECK: blendvps %xmm2, %xmm1 # encoding: [0x66,0x0f,0x38,0x14,0xca]
|
||||
blendvps %xmm2, %xmm1
|
||||
|
||||
|
@ -1,5 +1,12 @@
|
||||
// RUN: not llvm-mc -triple x86_64-unknown-unknown %s 2> %t.err
|
||||
// RUN: FileCheck < %t.err %s
|
||||
// RUN: FileCheck --check-prefix=64 < %t.err %s
|
||||
|
||||
// CHECK: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
|
||||
// RUN: not llvm-mc -triple i386-unknown-unknown %s 2> %t.err
|
||||
// RUN: FileCheck --check-prefix=32 < %t.err %s
|
||||
// rdar://8204588
|
||||
|
||||
// 64: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
|
||||
cmp $0, 0(%eax)
|
||||
|
||||
// 32: error: register %rax is only available in 64-bit mode
|
||||
addl $0, 0(%rax)
|
||||
|
@ -40,6 +40,9 @@ RegisterInfoEmitter::runEnums(raw_ostream &OS,
|
||||
|
||||
OS << "namespace llvm {\n\n";
|
||||
|
||||
OS << "class MCRegisterClass;\n"
|
||||
<< "extern MCRegisterClass " << Namespace << "MCRegisterClasses[];\n\n";
|
||||
|
||||
if (!Namespace.empty())
|
||||
OS << "namespace " << Namespace << " {\n";
|
||||
OS << "enum {\n NoRegister,\n";
|
||||
|
Loading…
x
Reference in New Issue
Block a user