Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix the hash computation
[simgrid.git] / src / mc / LocationList.cpp
index 03e4161..652d3f0 100644 (file)
@@ -4,9 +4,9 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "mc_dwarf.hpp"
-#include <mc/ObjectInformation.hpp>
-#include <mc/LocationList.hpp>
+#include "src/mc/mc_dwarf.hpp"
+#include "src/mc/ObjectInformation.hpp"
+#include "src/mc/LocationList.hpp"
 
 namespace simgrid {
 namespace dwarf {
@@ -71,5 +71,44 @@ Location resolve(
           frame_pointer_address, address_space, process_index);
 }
 
+simgrid::dwarf::LocationList location_list(
+  simgrid::mc::ObjectInformation& info,
+  Dwarf_Attribute& attr)
+{
+  simgrid::dwarf::LocationList locations;
+  std::ptrdiff_t offset = 0;
+  while (1) {
+
+    Dwarf_Addr base, start, end;
+    Dwarf_Op *ops;
+    std::size_t len;
+
+    offset = dwarf_getlocations(
+      &attr, offset, &base, &start, &end, &ops, &len);
+
+    if (offset == 0)
+      return std::move(locations);
+    else if (offset == -1)
+      xbt_die("Error while loading location list");
+
+    simgrid::dwarf::LocationListEntry entry;
+    entry.expression = simgrid::dwarf::DwarfExpression(ops, ops + len);
+
+    void *base_address = info.base_address();
+
+    // If start == 0, this is not a location list:
+    if (start == 0) {
+      entry.lowpc  = nullptr;
+      entry.highpc = nullptr;
+    } else {
+      entry.lowpc  = (char *) base_address + start;
+      entry.highpc = (char *) base_address + end;
+    }
+
+    locations.push_back(std::move(entry));
+  }
+}
+
+
 }
 }
\ No newline at end of file