diff options
author | Chris Lattner <sabre@nondot.org> | 2009-12-22 06:37:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-12-22 06:37:58 +0000 |
commit | 2adbef06a637b367f724d0a46f7fa78d5827ec64 (patch) | |
tree | 030e004d00d3ce2ce5254b6f9ee1d844fcfc0fe2 | |
parent | 222af464822c9c47b2859e813912ed6ba5339217 (diff) | |
download | external_llvm-2adbef06a637b367f724d0a46f7fa78d5827ec64.zip external_llvm-2adbef06a637b367f724d0a46f7fa78d5827ec64.tar.gz external_llvm-2adbef06a637b367f724d0a46f7fa78d5827ec64.tar.bz2 |
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
-rw-r--r-- | test/MC/Disassembler/dg.exp | 4 | ||||
-rw-r--r-- | test/MC/Disassembler/simple-tests.txt | 15 | ||||
-rw-r--r-- | tools/llvm-mc/HexDisassembler.cpp | 40 |
3 files changed, 45 insertions, 14 deletions
diff --git a/test/MC/Disassembler/dg.exp b/test/MC/Disassembler/dg.exp new file mode 100644 index 0000000..68d5f1d --- /dev/null +++ b/test/MC/Disassembler/dg.exp @@ -0,0 +1,4 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{txt}]] + diff --git a/test/MC/Disassembler/simple-tests.txt b/test/MC/Disassembler/simple-tests.txt new file mode 100644 index 0000000..92f3036 --- /dev/null +++ b/test/MC/Disassembler/simple-tests.txt @@ -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 + diff --git a/tools/llvm-mc/HexDisassembler.cpp b/tools/llvm-mc/HexDisassembler.cpp index bae4b02..c1ccf57 100644 --- a/tools/llvm-mc/HexDisassembler.cpp +++ b/tools/llvm-mc/HexDisassembler.cpp @@ -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()) + // Strip horizontal whitespace. + if (size_t Pos = Str.find_first_not_of(" \t\r")) { + Str = Str.substr(Pos); + continue; + } + + // 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(); + } - 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; } - // Skip leading space. - Str = Str.substr(Str.find_first_not_of(" \t\n\r")); - // 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); |