temporarily comment out setting of elwidth
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Oct 2018 22:11:43 +0000 (23:11 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 19 Oct 2018 22:11:43 +0000 (23:11 +0100)
sv_reg_t seems to be being typecast somewhere, probably to a uint64_t,
and accessing the elwidth corrupts memory

riscv/sv_insn_redirect.cc
riscv/sv_reg.h

index 19df7b71605966d8752dd47c6abf869ff3a4441d..da1a643c241286b69b077e3e14f9ad3f6a84909a 100644 (file)
@@ -104,7 +104,7 @@ sv_reg_t sv_proc_t::get_intreg(reg_t reg)
 {
     uint8_t elwidth = _insn->reg_elwidth(reg, true);
     uint64_t data = _insn->p->get_state()->XPR[reg];
-    return sv_reg_t(data, elwidth);
+    return sv_reg_t(data /*, elwidth*/);
 }
 
 #define GET_REG(name) \
@@ -265,6 +265,7 @@ sv_reg_t::operator sv_reg_t ()
     return y;
 }
 */
+
 sv_reg_t sv_proc_t::rv_add(sv_reg_t lhs, sv_reg_t rhs)
 {
     return lhs + rhs;
index 5a38d0964245f8fb9d0e28f261d2a1b1447fae9d..8db28daba326d7c21b378eaa70859d6daa6cbf01 100644 (file)
@@ -5,34 +5,37 @@ class sv_sreg_t;
 
 class sv_reg_t {
 public:
-    sv_reg_t(uint64_t _reg) : reg(_reg), elwidth(0) { } // default elwidth
-    sv_reg_t(uint64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
+    sv_reg_t(uint64_t _reg) : reg(_reg) /*, elwidth(0)*/ { } // default elwidth
+    //sv_reg_t(uint64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
 
     uint64_t reg;
     uint8_t elwidth;
 public:
   uint64_t get_data() { return reg; }
-  uint8_t get_width() { return elwidth; }
+  //uint8_t get_width() { return elwidth; }
 
-  operator uint64_t() { return reg; }
-  operator sv_sreg_t();
+  operator uint64_t() const & { return reg; }
+  operator sv_sreg_t() const &;
 };
 
 class sv_sreg_t {
 public:
-    sv_sreg_t(int64_t _reg) : reg(_reg), elwidth(0) {} // default elwidth
-    sv_sreg_t(int64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
+    sv_sreg_t(int64_t _reg) : reg(_reg) /*, elwidth(0)*/ {} // default elwidth
+    //sv_sreg_t(int64_t _reg, uint8_t _elwidth) : reg(_reg), elwidth(_elwidth) {}
 
     int64_t reg;
     uint8_t elwidth;
 public:
   int64_t get_data() { return reg; }
-  uint8_t get_width() { return elwidth; }
+  //uint8_t get_width() { return elwidth; }
 
-  operator int64_t() { return reg; }
-  operator sv_reg_t() { return sv_reg_t((uint64_t)reg, elwidth); }
+  operator int64_t() const& { return reg; }
+  //operator sv_reg_t() { return sv_reg_t((uint64_t)reg, elwidth); }
+  operator sv_reg_t() const& { return sv_reg_t((uint64_t)reg); }
 };
 
-inline sv_reg_t::operator sv_sreg_t() { return sv_sreg_t((int64_t)reg, elwidth); }
+//inline sv_reg_t::operator sv_sreg_t() { return sv_sreg_t((int64_t)reg, elwidth); }
+inline sv_reg_t::operator sv_sreg_t() const &
+{ return sv_sreg_t((int64_t)reg); }
 
 #endif