1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

MC/X86 AsmMatcher: Fix a use after free spotted by d0k, and de-XFAIL

x86_32-encoding.s in on expectation of it passing.

llvm-svn: 95806
This commit is contained in:
Daniel Dunbar 2010-02-10 21:19:28 +00:00
parent 7f6e51fc2a
commit b20be19ae6
2 changed files with 15 additions and 22 deletions

View File

@ -10,6 +10,7 @@
#include "llvm/Target/TargetAsmParser.h"
#include "X86.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCExpr.h"
@ -492,24 +493,20 @@ X86Operand *X86ATTAsmParser::ParseMemOperand() {
bool X86ATTAsmParser::
ParseInstruction(const StringRef &Name, SMLoc NameLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
// FIXME: Hack to recognize "sal..." for now. We need a way to represent
// alternative syntaxes in the .td file, without requiring instruction
// duplication.
if (Name.startswith("sal")) {
std::string Tmp = "shl" + Name.substr(3).str();
Operands.push_back(X86Operand::CreateToken(Tmp, NameLoc));
} else {
// FIXME: This is a hack. We eventually want to add a general pattern
// mechanism to be used in the table gen file for these assembly names that
// use the same opcodes. Also we should only allow the "alternate names"
// for rep and repne with the instructions they can only appear with.
StringRef PatchedName = Name;
if (Name == "repe" || Name == "repz")
PatchedName = "rep";
else if (Name == "repnz")
PatchedName = "repne";
Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
}
// FIXME: Hack to recognize "sal..." and "rep..." for now. We need a way to
// represent alternative syntaxes in the .td file, without requiring
// instruction duplication.
StringRef PatchedName = StringSwitch<StringRef>(Name)
.Case("sal", "shl")
.Case("salb", "shlb")
.Case("sall", "shll")
.Case("salq", "shlq")
.Case("salw", "shlw")
.Case("repe", "rep")
.Case("repz", "rep")
.Case("repnz", "repne")
.Default(Name);
Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
if (getLexer().isNot(AsmToken::EndOfStatement)) {

View File

@ -1,9 +1,5 @@
// RUN: llvm-mc -triple i386-unknown-unknown --show-encoding %s | FileCheck %s
// FIXME: This is failing to match on linux currently, with some kind of match
// failure. I am investigating. - ddunbar
// XFAIL: linux
// CHECK: movb $127, 3735928559(%ebx,%ecx,8)
// CHECK: encoding: [0xc6,0x84,0xcb,0xef,0xbe,0xad,0xde,0x7f]
movb $0x7f,0xdeadbeef(%ebx,%ecx,8)