-/* Copyright (c) 2004-2014. The SimGrid Team.
+/* Copyright (c) 2004-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include <libunwind.h>
#include <dwarf.h>
-#include <elfutils/libdw.h>
#include <simgrid_config.h>
#include "mc_base.h"
-#include "mc_forward.h"
+#include "mc_forward.hpp"
#include "AddressSpace.hpp"
namespace simgrid {
namespace mc {
-typedef std::vector<Dwarf_Op> DwarfExpression;
+typedef struct
+{
+ uint8_t atom;
+ std::uint64_t number;
+ std::uint64_t number2;
+ std::uint64_t offset;
+} DwarfInstruction;
+
+typedef std::vector<DwarfInstruction> DwarfExpression;
+
+/** \brief A DWARF expression with optional validity contraints */
+class LocationListEntry {
+public:
+ DwarfExpression expression;
+ void* lowpc, *highpc;
+
+ LocationListEntry() : lowpc(nullptr), highpc(nullptr) {}
+
+ bool valid_for_ip(unw_word_t ip)
+ {
+ return (this->lowpc == nullptr && this->highpc == nullptr)
+ || (ip >= (unw_word_t) this->lowpc
+ && ip < (unw_word_t) this->highpc);
+ }
+};
+
+typedef std::vector<LocationListEntry> LocationList;
}
}
SG_BEGIN_DECL()
-/** \brief a DWARF expression with optional validity contraints */
-typedef struct s_mc_expression {
- size_t size;
- Dwarf_Op* ops;
- // Optional validity:
- void* lowpc, *highpc;
-} s_mc_expression_t, *mc_expression_t;
-
-/** A location list (list of location expressions) */
-typedef struct s_mc_location_list {
- size_t size;
- mc_expression_t locations;
-} s_mc_location_list_t, *mc_location_list_t;
-
/** A location is either a location in memory of a register location
*
* Usage:
}
}
-XBT_INTERNAL void mc_dwarf_resolve_location(mc_location_t location, mc_expression_t expression, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_address_space_t address_space, int process_index);
-MC_SHOULD_BE_INTERNAL void mc_dwarf_resolve_locations(mc_location_t location, mc_location_list_t locations, mc_object_info_t object_info, unw_cursor_t* c, void* frame_pointer_address, mc_address_space_t address_space, int process_index);
-
-XBT_INTERNAL void mc_dwarf_expression_clear(mc_expression_t expression);
-XBT_INTERNAL void mc_dwarf_expression_init(mc_expression_t expression, size_t len, Dwarf_Op* ops);
-
-XBT_INTERNAL void mc_dwarf_location_list_clear(mc_location_list_t list);
-
-XBT_INTERNAL void mc_dwarf_location_list_init_from_expression(mc_location_list_t target, size_t len, Dwarf_Op* ops);
-XBT_INTERNAL void mc_dwarf_location_list_init(mc_location_list_t target, mc_object_info_t info, Dwarf_Die* die, Dwarf_Attribute* attr);
+XBT_INTERNAL void mc_dwarf_resolve_location(
+ mc_location_t location, simgrid::mc::DwarfExpression* expression,
+ simgrid::mc::ObjectInformation* object_info, unw_cursor_t* c,
+ void* frame_pointer_address, simgrid::mc::AddressSpace* address_space,
+ int process_index);
+MC_SHOULD_BE_INTERNAL void mc_dwarf_resolve_locations(
+ mc_location_t location, simgrid::mc::LocationList* locations,
+ simgrid::mc::ObjectInformation* object_info, unw_cursor_t* c,
+ void* frame_pointer_address, simgrid::mc::AddressSpace* address_space,
+ int process_index);
#define MC_EXPRESSION_STACK_SIZE 64
unw_cursor_t* cursor;
void* frame_base;
- mc_address_space_t address_space;
- mc_object_info_t object_info;
+ simgrid::mc::AddressSpace* address_space;
+ simgrid::mc::ObjectInformation* object_info;
int process_index;
} s_mc_expression_state_t, *mc_expression_state_t;
MC_SHOULD_BE_INTERNAL int mc_dwarf_execute_expression(
- size_t n, const Dwarf_Op* ops, mc_expression_state_t state);
+ size_t n, const simgrid::mc::DwarfInstruction* ops, mc_expression_state_t state);
MC_SHOULD_BE_INTERNAL void* mc_find_frame_base(
- dw_frame_t frame, mc_object_info_t object_info, unw_cursor_t* unw_cursor);
+ simgrid::mc::Frame* frame, simgrid::mc::ObjectInformation* object_info, unw_cursor_t* unw_cursor);
SG_END_DECL()