mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 07:59:57 +00:00
[ms-inline asm] Fix a crasher when we fail on a direct match.
The issue was that the MatchingInlineAsm and VariantID args to the MatchInstructionImpl function weren't being set properly. Specifically, when parsing intel syntax, the parser thought it was parsing inline assembly in the at&t dialect; that will never be the case. The crash was caused when the emitter tried to emit the instruction, but the operands weren't set. When parsing inline assembly we only set the opcode, not the operands, which is used to lookup the instruction descriptor. rdar://13854391 and PR15945 Also, this commit reverts r176036. Now that we're correctly parsing the intel syntax the pushad/popad don't match properly. I've reimplemented that fix using a MnemonicAlias. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6e53180db1
commit
ffc49cbea4
@ -2308,25 +2308,25 @@ MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
unsigned Match1, Match2, Match3, Match4;
|
||||
|
||||
Match1 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
|
||||
isParsingIntelSyntax());
|
||||
MatchingInlineAsm, isParsingIntelSyntax());
|
||||
// If this returned as a missing feature failure, remember that.
|
||||
if (Match1 == Match_MissingFeature)
|
||||
ErrorInfoMissingFeature = ErrorInfoIgnore;
|
||||
Tmp[Base.size()] = Suffixes[1];
|
||||
Match2 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
|
||||
isParsingIntelSyntax());
|
||||
MatchingInlineAsm, isParsingIntelSyntax());
|
||||
// If this returned as a missing feature failure, remember that.
|
||||
if (Match2 == Match_MissingFeature)
|
||||
ErrorInfoMissingFeature = ErrorInfoIgnore;
|
||||
Tmp[Base.size()] = Suffixes[2];
|
||||
Match3 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
|
||||
isParsingIntelSyntax());
|
||||
MatchingInlineAsm, isParsingIntelSyntax());
|
||||
// If this returned as a missing feature failure, remember that.
|
||||
if (Match3 == Match_MissingFeature)
|
||||
ErrorInfoMissingFeature = ErrorInfoIgnore;
|
||||
Tmp[Base.size()] = Suffixes[3];
|
||||
Match4 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
|
||||
isParsingIntelSyntax());
|
||||
MatchingInlineAsm, isParsingIntelSyntax());
|
||||
// If this returned as a missing feature failure, remember that.
|
||||
if (Match4 == Match_MissingFeature)
|
||||
ErrorInfoMissingFeature = ErrorInfoIgnore;
|
||||
|
@ -884,12 +884,12 @@ def PUSHF64 : I<0x9C, RawFrm, (outs), (ins), "pushfq", [], IIC_PUSH_F>,
|
||||
|
||||
let Defs = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP], Uses = [ESP],
|
||||
mayLoad = 1, neverHasSideEffects = 1, SchedRW = [WriteLoad] in {
|
||||
def POPA32 : I<0x61, RawFrm, (outs), (ins), "popa{l|d}", [], IIC_POP_A>,
|
||||
def POPA32 : I<0x61, RawFrm, (outs), (ins), "popa{l}", [], IIC_POP_A>,
|
||||
Requires<[In32BitMode]>;
|
||||
}
|
||||
let Defs = [ESP], Uses = [EDI, ESI, EBP, EBX, EDX, ECX, EAX, ESP],
|
||||
mayStore = 1, neverHasSideEffects = 1, SchedRW = [WriteStore] in {
|
||||
def PUSHA32 : I<0x60, RawFrm, (outs), (ins), "pusha{l|d}", [], IIC_PUSH_A>,
|
||||
def PUSHA32 : I<0x60, RawFrm, (outs), (ins), "pusha{l}", [], IIC_PUSH_A>,
|
||||
Requires<[In32BitMode]>;
|
||||
}
|
||||
|
||||
@ -1867,6 +1867,9 @@ def : MnemonicAlias<"pushf", "pushfl", "att">, Requires<[In32BitMode]>;
|
||||
def : MnemonicAlias<"pushf", "pushfq", "att">, Requires<[In64BitMode]>;
|
||||
def : MnemonicAlias<"pushfd", "pushfl", "att">;
|
||||
|
||||
def : MnemonicAlias<"popad", "popa", "intel">, Requires<[In32BitMode]>;
|
||||
def : MnemonicAlias<"pushad", "pusha", "intel">, Requires<[In32BitMode]>;
|
||||
|
||||
def : MnemonicAlias<"repe", "rep", "att">;
|
||||
def : MnemonicAlias<"repz", "rep", "att">;
|
||||
def : MnemonicAlias<"repnz", "repne", "att">;
|
||||
|
@ -28,3 +28,6 @@ lea (%rsp, %rbp, $4), %rax
|
||||
// rdar://10423777
|
||||
// 64: error: index register is 32-bit, but base register is 64-bit
|
||||
movq (%rsi,%ecx),%xmm0
|
||||
|
||||
// 32: error: invalid operand for instruction
|
||||
outb al, 4
|
||||
|
Loading…
Reference in New Issue
Block a user