}
}
-
-extern "C" {
-
-void mc_dwarf_location_list_init(
- simgrid::dwarf::LocationList* list, simgrid::mc::ObjectInformation* info,
- Dwarf_Die * die, Dwarf_Attribute * attr)
-{
- list->clear();
-
- std::ptrdiff_t offset = 0;
- Dwarf_Addr base, start, end;
- Dwarf_Op *ops;
- std::size_t len;
-
- while (1) {
-
- offset = dwarf_getlocations(attr, offset, &base, &start, &end, &ops, &len);
- if (offset == 0)
- return;
- 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 = info->base_address();
- // If start == 0, this is not a location list:
- entry.lowpc = start == 0 ? NULL : (char *) base + start;
- entry.highpc = start == 0 ? NULL : (char *) base + end;
-
- list->push_back(std::move(entry));
- }
-
-}
-
-}
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
simgrid::mc::AddressSpace* address_space,
int process_index);
+XBT_PRIVATE
+simgrid::dwarf::LocationList location_list(
+ simgrid::mc::ObjectInformation& info,
+ Dwarf_Attribute& attr);
+
}
}
-SG_BEGIN_DECL()
-
-XBT_PRIVATE void mc_dwarf_location_list_init(
- simgrid::dwarf::LocationList*, simgrid::mc::ObjectInformation* info,
- Dwarf_Die* die, Dwarf_Attribute* attr);
-
-SG_END_DECL()
-
#endif
case simgrid::dwarf::FormClass::LocListPtr:
case simgrid::dwarf::FormClass::Constant:
// Reference to location list:
- mc_dwarf_location_list_init(
- &variable->location_list, info, die,
- &attr_location);
+ variable->location_list = simgrid::dwarf::location_list(
+ *info, attr_location);
break;
default:
if (klass == simgrid::dwarf::TagClass::Subprogram) {
Dwarf_Attribute attr_frame_base;
if (dwarf_attr_integrate(die, DW_AT_frame_base, &attr_frame_base))
- mc_dwarf_location_list_init(&frame.frame_base_location, info, die,
- &attr_frame_base);
+ frame.frame_base_location = simgrid::dwarf::location_list(*info,
+ attr_frame_base);
}
// Handle children: