aboutsummaryrefslogtreecommitdiff
path: root/spike_main/spike-log-parser.cc
blob: 0a4442fcdee67467ecd2b1ff7d81af508662b753 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// See LICENSE for license details.

// This little program finds occurrences of strings like
//   core   0: 0x000000008000c36c (0xfe843783) ld      a5, -24(s0)
// in its inputs, then output the RISC-V instruction with the disassembly
// enclosed hexadecimal number.

#include <iostream>
#include <string>
#include <cstdint>
#include <regex>
#include "fesvr/option_parser.h"

#include "disasm.h"
#include "extension.h"

using namespace std;

int main(int argc, char** argv)
{
  string s;
  const char* isa_string = DEFAULT_ISA;

  std::function<extension_t*()> extension;
  option_parser_t parser;
  parser.option(0, "extension", 1, [&](const char* s){extension = find_extension(s);});
  parser.option(0, "isa", 1, [&](const char* s){isa_string = s;});
  parser.parse(argv);

  isa_parser_t isa(isa_string, DEFAULT_PRIV);
  processor_t p(isa, DEFAULT_VARCH, 0, 0, false, nullptr, cerr);
  if (extension) {
    p.register_extension(extension());
  }

  std::regex reg("^core\\s+\\d+:\\s+0x[0-9a-f]+\\s+\\(0x([0-9a-f]+)\\)", std::regex_constants::icase);
  std::smatch m;
  std::ssub_match sm ;

  while (getline(cin,s)){
    if (regex_search(s, m, reg)){
      // the opcode string
      string op = m[1].str();
      uint32_t bit_num = op.size() * 4;
      uint64_t opcode = strtoull(op.c_str(), nullptr, 16);

      if (bit_num<64){
          opcode = opcode << (64-bit_num) >> (64-bit_num);
      }

      const disasm_insn_t* disasm = p.get_disassembler()->lookup(opcode);
      if (disasm) {
          cout << disasm->get_name() << '\n';
      } else {
          cout << "unknown_op\n";
      }
    }
  }

  return 0;
}