cpu: Use the new asBytes function in the protobuf inst tracer.
authorGabe Black <gabeblack@google.com>
Thu, 25 Jan 2018 08:21:58 +0000 (00:21 -0800)
committerGabe Black <gabeblack@google.com>
Mon, 26 Mar 2018 22:34:03 +0000 (22:34 +0000)
Use this function to get the binary representation of the instruction
rather than referencing the ExtMachInst typed machInst member of the
StaticInst directly. ExtMachInst is an ISA specific type and can't
always be straightforwardly squished into a 32 bit integer.

Change-Id: Ic1f74d6d86eb779016677ae45c022939ce3e2b9f
Reviewed-on: https://gem5-review.googlesource.com/7563
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/cpu/inst_pb_trace.cc
src/cpu/inst_pb_trace.hh

index 400360078cb5eeb5f928ff87df88c24f1a1374bc..138ef5386926846b5506f400e52af526728ce376 100644 (file)
@@ -69,7 +69,7 @@ InstPBTraceRecord::dump()
 }
 
 InstPBTrace::InstPBTrace(const InstPBTraceParams *p)
-    : InstTracer(p), curMsg(nullptr)
+    : InstTracer(p), buf(nullptr), bufSize(0), curMsg(nullptr)
 {
     // Create our output file
     createTraceFile(p->file_name);
@@ -141,10 +141,22 @@ InstPBTrace::traceInst(ThreadContext *tc, StaticInstPtr si, TheISA::PCState pc)
         curMsg = NULL;
     }
 
+    size_t instSize = si->asBytes(buf.get(), bufSize);
+    if (instSize > bufSize) {
+        bufSize = instSize;
+        buf.reset(new uint8_t[bufSize]);
+        instSize = si->asBytes(buf.get(), bufSize);
+    }
+
     // Create a new instruction message and fill out the fields
     curMsg = new ProtoMessage::Inst;
     curMsg->set_pc(pc.pc());
-    curMsg->set_inst(static_cast<uint32_t>(bits(si->machInst, 31, 0)));
+    if (instSize == sizeof(uint32_t)) {
+        curMsg->set_inst(letoh(*reinterpret_cast<uint32_t *>(buf.get())));
+    } else if (instSize) {
+        curMsg->set_inst_bytes(
+            std::string(reinterpret_cast<const char *>(buf.get()), bufSize));
+    }
     curMsg->set_cpuid(tc->cpuId());
     curMsg->set_tick(curTick());
     curMsg->set_type(static_cast<ProtoMessage::Inst_InstType>(si->opClass()));
index 57b3c2c594ca22f30860ff0263cb9f537630c5ae..e9e014769fba48862ecaf4e4810b5b22f7e6e6fc 100644 (file)
@@ -93,6 +93,9 @@ class InstPBTrace : public InstTracer
                                     StaticInstPtr mi = NULL) override;
 
   protected:
+    std::unique_ptr<uint8_t []> buf;
+    size_t bufSize;
+
     /** One output stream for the entire simulation.
      * We encode the CPU & system ID so all we need is a single file
      */