Added memhasher (yosys -M)
authorClifford Wolf <clifford@clifford.at>
Sun, 28 Dec 2014 20:27:51 +0000 (21:27 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 28 Dec 2014 20:27:51 +0000 (21:27 +0100)
kernel/driver.cc
kernel/rtlil.cc
kernel/yosys.cc
kernel/yosys.h

index 4700bf61b9ccdcce870588cf5f9adf61baf9015b..9a81d8a4879bb8d2f2bf0804af58d9dd0a3d361e 100644 (file)
@@ -151,8 +151,11 @@ int main(int argc, char **argv)
                printf("    -m module_file\n");
                printf("        load the specified module (aka plugin)\n");
                printf("\n");
+               printf("    -M\n");
+               printf("        will slightly randomize allocated pointer addresses. for debugging\n");
+               printf("\n");
                printf("    -A\n");
-               printf("        will call abort() at the end of the script. useful for debugging\n");
+               printf("        will call abort() at the end of the script. for debugging\n");
                printf("\n");
                printf("    -V\n");
                printf("        print version information and exit\n");
@@ -174,10 +177,13 @@ int main(int argc, char **argv)
        }
 
        int opt;
-       while ((opt = getopt(argc, argv, "AQTVSm:f:Hh:b:o:p:l:qv:tds:c:")) != -1)
+       while ((opt = getopt(argc, argv, "MAQTVSm:f:Hh:b:o:p:l:qv:tds:c:")) != -1)
        {
                switch (opt)
                {
+               case 'M':
+                       memhasher_on();
+                       break;
                case 'A':
                        call_abort = true;
                        break;
@@ -407,6 +413,7 @@ int main(int argc, char **argv)
        }
 #endif
 
+       memhasher_off();
        if (call_abort)
                abort();
 
index 6f2d367d6531d6e363fb3c4efbcb7c4e8f63269a..cdbaa5bbff1ab56c32c0614115769eb21b4cf6b6 100644 (file)
@@ -1766,6 +1766,9 @@ RTLIL::Cell::Cell() : module(nullptr)
 {
        static unsigned int hashidx_count = 0;
        hashidx_ = hashidx_count++;
+
+       // log("#memtrace# %p\n", this);
+       memhasher();
 }
 
 bool RTLIL::Cell::hasPort(RTLIL::IdString portname) const
index 6cc6431522a104aba35d83ccaf4b18bc3649a722..52bd066b77d47287e43a17d7b41f110df8306b69 100644 (file)
@@ -55,6 +55,43 @@ RTLIL::Design *yosys_design = NULL;
 Tcl_Interp *yosys_tcl_interp = NULL;
 #endif
 
+bool memhasher_active = false;
+uint32_t memhasher_rng;
+std::vector<void*> memhasher_store;
+
+void memhasher_on()
+{
+       memhasher_rng += time(NULL) << 16 ^ getpid();
+       memhasher_store.resize(0x10000);
+       memhasher_active = true;
+}
+
+void memhasher_off()
+{
+       for (auto p : memhasher_store)
+               if (p) free(p);
+       memhasher_store.clear();
+       memhasher_active = false;
+}
+
+void memhasher_do()
+{
+       memhasher_rng ^= memhasher_rng << 13;
+       memhasher_rng ^= memhasher_rng >> 17;
+       memhasher_rng ^= memhasher_rng << 5;
+
+       int size, index = (memhasher_rng >> 4) & 0xffff;
+       switch (memhasher_rng & 7) {
+               case 0: size =   16; break;
+               case 1: size =  256; break;
+               case 2: size = 1024; break;
+               case 3: size = 4096; break;
+               default: size = 0;
+       }
+       if (index < 16) size *= 16;
+       memhasher_store[index] = realloc(memhasher_store[index], size);
+}
+
 std::string stringf(const char *fmt, ...)
 {
        std::string string;
index b653941ce47d24466155a061e5740a23bba4de01..50a15993944b87f41af2887ec20f1e25ed6ee89b 100644 (file)
@@ -169,6 +169,13 @@ template<> struct hash_ops<const RTLIL::Module*> : hash_obj_ops {};
 template<> struct hash_ops<const RTLIL::Design*> : hash_obj_ops {};
 template<> struct hash_ops<const RTLIL::Monitor*> : hash_obj_ops {};
 
+void memhasher_on();
+void memhasher_off();
+void memhasher_do();
+
+extern bool memhasher_active;
+inline void memhasher() { if (memhasher_active) memhasher_do(); }
+
 std::string stringf(const char *fmt, ...) YS_ATTRIBUTE(format(printf, 1, 2));
 std::string vstringf(const char *fmt, va_list ap);
 int readsome(std::istream &f, char *s, int n);