diff options
-rw-r--r-- | src/binary-reader-objdump.cc | 39 | ||||
-rw-r--r-- | test/dump/debug-names.txt | 4 | ||||
-rw-r--r-- | test/dump/getlocal-param.txt | 4 | ||||
-rw-r--r-- | test/dump/getlocal.txt | 7 | ||||
-rw-r--r-- | test/dump/locals.txt | 4 | ||||
-rw-r--r-- | test/dump/setlocal-param.txt | 4 | ||||
-rw-r--r-- | test/dump/setlocal.txt | 7 | ||||
-rw-r--r-- | test/dump/tee_local.txt | 1 |
8 files changed, 70 insertions, 0 deletions
diff --git a/src/binary-reader-objdump.cc b/src/binary-reader-objdump.cc index f4c6b7ca..a320b93d 100644 --- a/src/binary-reader-objdump.cc +++ b/src/binary-reader-objdump.cc @@ -288,6 +288,9 @@ class BinaryReaderObjdumpDisassemble : public BinaryReaderObjdumpBase { Result BeginFunctionBody(Index index) override; + Result OnLocalDeclCount(Index count) override; + Result OnLocalDecl(Index decl_index, Index count, Type type) override; + Result OnOpcode(Opcode Opcode) override; Result OnOpcodeBare() override; Result OnOpcodeIndex(Index value) override; @@ -315,6 +318,7 @@ class BinaryReaderObjdumpDisassemble : public BinaryReaderObjdumpBase { Offset last_opcode_end = 0; int indent_level = 0; Index next_reloc = 0; + Index local_index_ = 0; }; Result BinaryReaderObjdumpDisassemble::OnOpcode(Opcode opcode) { @@ -343,6 +347,41 @@ Result BinaryReaderObjdumpDisassemble::OnOpcode(Opcode opcode) { #define IMMEDIATE_OCTET_COUNT 9 +Result BinaryReaderObjdumpDisassemble::OnLocalDeclCount(Index count) { + local_index_ = 0; + current_opcode_offset = state->offset; + return Result::Ok; +} + +Result BinaryReaderObjdumpDisassemble::OnLocalDecl(Index decl_index, + Index count, + Type type) { + Offset offset = current_opcode_offset; + size_t data_size = state->offset - offset; + + printf(" %06" PRIzx ":", offset); + for (size_t i = 0; i < data_size && i < IMMEDIATE_OCTET_COUNT; + i++, offset++) { + printf(" %02x", data_[offset]); + } + for (size_t i = data_size; i < IMMEDIATE_OCTET_COUNT; i++) { + printf(" "); + } + printf(" | local[%" PRIindex, local_index_); + + if (count != 1) { + printf("..%" PRIindex "", local_index_ + count - 1); + } + local_index_ += count; + + printf("] type=%s\n", GetTypeName(type)); + + last_opcode_end = current_opcode_offset + data_size; + current_opcode_offset = last_opcode_end; + + return Result::Ok; +} + void BinaryReaderObjdumpDisassemble::LogOpcode(const uint8_t* data, size_t data_size, const char* fmt, diff --git a/test/dump/debug-names.txt b/test/dump/debug-names.txt index 622afe1a..f944361b 100644 --- a/test/dump/debug-names.txt +++ b/test/dump/debug-names.txt @@ -146,9 +146,13 @@ Custom: Code Disassembly: 00001c <F1>: + 00001e: 01 7d | local[0] type=f32 + 000020: 02 7f | local[1..2] type=i32 000022: 0b | end 000023 func[1]: 000025: 0b | end 000026 <F2>: + 000028: 01 7c | local[0] type=f64 + 00002a: 02 7e | local[1..2] type=i64 00002c: 0b | end ;;; STDOUT ;;) diff --git a/test/dump/getlocal-param.txt b/test/dump/getlocal-param.txt index ed724f18..0fe93c50 100644 --- a/test/dump/getlocal-param.txt +++ b/test/dump/getlocal-param.txt @@ -77,6 +77,10 @@ getlocal-param.wasm: file format wasm 0x1 Code Disassembly: 000017 func[0]: + 000019: 01 7e | local[0] type=i64 + 00001b: 01 7d | local[1] type=f32 + 00001d: 01 7f | local[2] type=i32 + 00001f: 01 7d | local[3] type=f32 000021: 20 00 | get_local 0 000023: 1a | drop 000024: 20 01 | get_local 1 diff --git a/test/dump/getlocal.txt b/test/dump/getlocal.txt index cf7b6808..29e3e83c 100644 --- a/test/dump/getlocal.txt +++ b/test/dump/getlocal.txt @@ -91,6 +91,13 @@ getlocal.wasm: file format wasm 0x1 Code Disassembly: 000015 func[0]: + 000017: 01 7c | local[0] type=f64 + 000019: 01 7d | local[1] type=f32 + 00001b: 01 7e | local[2] type=i64 + 00001d: 02 7f | local[3..4] type=i32 + 00001f: 01 7d | local[5] type=f32 + 000021: 01 7c | local[6] type=f64 + 000023: 01 7e | local[7] type=i64 000025: 20 00 | get_local 0 000027: 1a | drop 000028: 20 01 | get_local 1 diff --git a/test/dump/locals.txt b/test/dump/locals.txt index dd92c947..195944f6 100644 --- a/test/dump/locals.txt +++ b/test/dump/locals.txt @@ -44,5 +44,9 @@ locals.wasm: file format wasm 0x1 Code Disassembly: 000015 func[0]: + 000017: 01 7f | local[0] type=i32 + 000019: 02 7e | local[1..2] type=i64 + 00001b: 03 7d | local[3..5] type=f32 + 00001d: 04 7c | local[6..9] type=f64 00001f: 0b | end ;;; STDOUT ;;) diff --git a/test/dump/setlocal-param.txt b/test/dump/setlocal-param.txt index cfafdb01..68f76c71 100644 --- a/test/dump/setlocal-param.txt +++ b/test/dump/setlocal-param.txt @@ -87,6 +87,10 @@ setlocal-param.wasm: file format wasm 0x1 Code Disassembly: 000017 func[0]: + 000019: 01 7e | local[0] type=i64 + 00001b: 01 7d | local[1] type=f32 + 00001d: 01 7f | local[2] type=i32 + 00001f: 01 7d | local[3] type=f32 000021: 41 00 | i32.const 0 000023: 21 00 | set_local 0 000025: 43 00 00 00 00 | f32.const 0x0p+0 diff --git a/test/dump/setlocal.txt b/test/dump/setlocal.txt index 6a379fbc..20ea9937 100644 --- a/test/dump/setlocal.txt +++ b/test/dump/setlocal.txt @@ -103,6 +103,13 @@ setlocal.wasm: file format wasm 0x1 Code Disassembly: 000015 func[0]: + 000017: 01 7c | local[0] type=f64 + 000019: 01 7d | local[1] type=f32 + 00001b: 01 7e | local[2] type=i64 + 00001d: 02 7f | local[3..4] type=i32 + 00001f: 01 7d | local[5] type=f32 + 000021: 01 7c | local[6] type=f64 + 000023: 01 7e | local[7] type=i64 000025: 44 00 00 00 00 00 00 00 00 | f64.const 0x0p+0 00002e: 21 00 | set_local 0 000030: 43 00 00 00 00 | f32.const 0x0p+0 diff --git a/test/dump/tee_local.txt b/test/dump/tee_local.txt index 6911f78b..0085cfda 100644 --- a/test/dump/tee_local.txt +++ b/test/dump/tee_local.txt @@ -47,6 +47,7 @@ tee_local.wasm: file format wasm 0x1 Code Disassembly: 000015 func[0]: + 000017: 01 7f | local[0] type=i32 000019: 41 00 | i32.const 0 00001b: 22 00 | tee_local 0 00001d: 1a | drop |