about summary refs log tree commit diff stats
path: root/src/tools/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/env.c')
-rw-r--r--src/tools/env.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/tools/env.c b/src/tools/env.c
index 9d84fd5c..016d4025 100644
--- a/src/tools/env.c
+++ b/src/tools/env.c
@@ -22,6 +22,9 @@ KHASH_MAP_INIT_STR(box64env_entry, box64env_t)
 static kh_box64env_entry_t* box64env_entries = NULL;
 static kh_box64env_entry_t* box64env_entries_gen = NULL;
 
+mmaplist_t* NewMmaplist();
+void DelMmaplist(mmaplist_t* list);
+
 static rbtree_t* envmap = NULL;
 
 static const char default_rcfile[] = 
@@ -649,6 +652,7 @@ typedef struct mapping_s {
     char*       fullname;
     box64env_t* env;
     uintptr_t   start;  //lower address of the map for this file
+    mmaplist_t* mmaplist;
 } mapping_t;
 
 KHASH_MAP_INIT_STR(mapping_entry, mapping_t*);
@@ -742,6 +746,8 @@ void RemoveMapping(uintptr_t addr, size_t length)
         khint_t k = kh_get(mapping_entry, mapping_entries, mapping->fullname);
         if(k!=kh_end(mapping_entries))
             kh_del(mapping_entry, mapping_entries, k);
+        if(mapping->mmaplist)
+            DelMmaplist(mapping->mmaplist);
         box_free(mapping->filename);
         box_free(mapping->fullname);
         box_free(mapping);
@@ -758,6 +764,18 @@ box64env_t* GetCurEnvByAddr(uintptr_t addr)
     return env;
 }
 
+mmaplist_t* GetMmaplistByAddr(uintptr_t addr)
+{
+    if (!envmap) return NULL;
+    mapping_t* mapping = ((mapping_t*)rb_get_64(envmap, addr));
+    if(!mapping) return NULL;
+    mmaplist_t* list = mapping->mmaplist;
+    if(!list)
+        list = mapping->mmaplist = NewMmaplist();
+    return list;
+}
+
+
 int IsAddrFileMapped(uintptr_t addr, const char** filename, uintptr_t* start)
 {
     if(!envmap) return 0;