model: add read-acquire/fence-release support
[c11tester.git] / snapshot-interface.cc
index c22b8712b32937cbd415fb9f2ab7d1039e8c97a8..51fe2f08de1392dd6fe40cd3757edcf675367c60 100644 (file)
@@ -12,7 +12,8 @@
 #include <inttypes.h>
 #include "common.h"
 
-
+/* MYBINARYNAME only works because our pathname usually includes 'model' (e.g.,
+ * /.../model-checker/test/userprog.o) */
 #define MYBINARYNAME "model"
 #define MYLIBRARYNAME "libmodel.so"
 #define MAPFILE "/proc/self/maps"
@@ -67,12 +68,22 @@ static void SnapshotGlobalSegments(){
        pclose(map);
 }
 #else
+
+static void get_binary_name(char *buf, size_t len)
+{
+       if (readlink("/proc/self/exe", buf, len) == -1) {
+               perror("readlink");
+               exit(EXIT_FAILURE);
+       }
+}
+
 /** The SnapshotGlobalSegments function computes the memory regions
  *     that may contain globals and then configures the snapshotting
  *     library to snapshot them.
  */
 static void SnapshotGlobalSegments(){
        char buf[9000];
+       char binary_name[800];
        FILE *map;
 
        map = fopen(MAPFILE, "r");
@@ -80,13 +91,14 @@ static void SnapshotGlobalSegments(){
                perror("fopen");
                exit(EXIT_FAILURE);
        }
+       get_binary_name(binary_name, sizeof(binary_name));
        while (fgets(buf, sizeof(buf), map)) {
                char regionname[200] = "";
                char r, w, x, p;
                void *begin, *end;
 
                sscanf(buf, "%p-%p %c%c%c%c %*x %*x:%*x %*u %200s\n", &begin, &end, &r, &w, &x, &p, regionname);
-               if (w == 'w' && (strstr(regionname, MYBINARYNAME) || strstr(regionname, MYLIBRARYNAME))) {
+               if (w == 'w' && (strstr(regionname, binary_name) || strstr(regionname, MYLIBRARYNAME))) {
                        size_t len = ((uintptr_t)end - (uintptr_t)begin) / PAGESIZE;
                        if (len != 0)
                                addMemoryRegionToSnapShot(begin, len);