aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/MC/Disassembler/dg.exp4
-rw-r--r--test/MC/Disassembler/simple-tests.txt15
-rw-r--r--tools/llvm-mc/HexDisassembler.cpp40
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);