mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
rewrite the file parser for the disassembler, implementing support for
comments. Also, check in a simple testcase for the disassembler, including a test for r91864 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91894 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
222af46482
commit
2adbef06a6
4
test/MC/Disassembler/dg.exp
Normal file
4
test/MC/Disassembler/dg.exp
Normal file
@ -0,0 +1,4 @@
|
||||
load_lib llvm.exp
|
||||
|
||||
RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{txt}]]
|
||||
|
15
test/MC/Disassembler/simple-tests.txt
Normal file
15
test/MC/Disassembler/simple-tests.txt
Normal file
@ -0,0 +1,15 @@
|
||||
# RUN: llvm-mc --disassemble %s | FileCheck %s
|
||||
|
||||
# CHECK: int $33
|
||||
0xCD 0x21
|
||||
|
||||
# CHECK: int $33
|
||||
0xCD 0x21
|
||||
|
||||
|
||||
# CHECK: addb %al, (%rax)
|
||||
0 0 0 0 0 0
|
||||
|
||||
# CHECK: callq -1234
|
||||
0xe8 0x2e 0xfb 0xff 0xff
|
||||
|
@ -114,31 +114,43 @@ int HexDisassembler::disassemble(const Target &T, const std::string &Triple,
|
||||
StringRef Str = Buffer.getBuffer();
|
||||
|
||||
while (!Str.empty()) {
|
||||
if (Str.find_first_of('\n') < Str.find_first_not_of(" \t\n\r")) {
|
||||
if (!ByteArray.empty())
|
||||
printInst(*DisAsm, *InstPrinter, ByteArray);
|
||||
|
||||
ByteArray.clear();
|
||||
// Strip horizontal whitespace.
|
||||
if (size_t Pos = Str.find_first_not_of(" \t\r")) {
|
||||
Str = Str.substr(Pos);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip leading space.
|
||||
Str = Str.substr(Str.find_first_not_of(" \t\n\r"));
|
||||
// If this is the end of a line or start of a comment, process the
|
||||
// instruction we have so far.
|
||||
if (Str[0] == '\n' || Str[0] == '#') {
|
||||
// If we have bytes to process, do so.
|
||||
if (!ByteArray.empty()) {
|
||||
printInst(*DisAsm, *InstPrinter, ByteArray);
|
||||
ByteArray.clear();
|
||||
}
|
||||
|
||||
// Strip to the end of line if we already processed any bytes on this
|
||||
// line. This strips the comment and/or the \n.
|
||||
if (Str[0] == '\n')
|
||||
Str = Str.substr(1);
|
||||
else {
|
||||
Str = Str.substr(Str.find_first_of('\n'));
|
||||
if (!Str.empty())
|
||||
Str = Str.substr(1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the current token.
|
||||
size_t Next = Str.find_first_of(" \t\n\r");
|
||||
|
||||
if(Next == (size_t)StringRef::npos)
|
||||
break;
|
||||
|
||||
StringRef Value = Str.slice(0, Next);
|
||||
size_t Next = Str.find_first_of(" \t\n\r#");
|
||||
StringRef Value = Str.substr(0, Next);
|
||||
|
||||
// Convert to a byte and add to the byte vector.
|
||||
unsigned ByteVal;
|
||||
if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) {
|
||||
errs() << "warning: invalid input token '" << Value << "' of length "
|
||||
<< Next << "\n";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
ByteArray.push_back((unsigned char)ByteVal);
|
||||
}
|
||||
Str = Str.substr(Next);
|
||||
|
Loading…
Reference in New Issue
Block a user