- // Use either of:
- simgrid::mc::LocationList location_list;
- void* address;
-
- size_t start_scope;
- mc_object_info_t object_info;
-};
-
-class Frame {
-public:
- Frame();
-
- int tag;
- std::string name;
- void *low_pc;
- void *high_pc;
- simgrid::mc::LocationList frame_base;
- std::vector<Variable> variables;
- unsigned long int id; /* DWARF offset of the subprogram */
- std::vector<Frame> scopes;
- Dwarf_Off abstract_origin_id;
- mc_object_info_t object_info;
-};
-
-/** An entry in the functions index
- *
- * See the code of ObjectInformation::find_function.
- */
-struct FunctionIndexEntry {
- void* low_pc;
- mc_frame_t function;
-};
-
-/** Information about an (ELF) executable/sharedobject
- *
- * This contain sall the information we have at runtime about an
- * executable/shared object in the target (modelchecked) process:
- * - where it is located in the virtual address space;
- * - where are located it's different memory mapping in the the
- * virtual address space ;
- * - all the debugging (DWARF) information,
- * - location of the functions,
- * - types
- * - etc.
- *
- * It is not copyable because we are taking pointers to Types/Frames.
- * We'd have to update/rebuild some data structures in order to copy
- * successfully.
- */
-
-class ObjectInformation {
-public:
- ObjectInformation();
-
- // Not copyable:
- ObjectInformation(ObjectInformation const&) = delete;
- ObjectInformation& operator=(ObjectInformation const&) = delete;
-
- mc_object_info_flags flags;
- std::string file_name;
- const void* start;
- const void *end;
- char *start_exec;
- char *end_exec; // Executable segment
- char *start_rw;
- char *end_rw; // Read-write segment
- char *start_ro;
- char *end_ro; // read-only segment
- std::unordered_map<std::uint64_t, simgrid::mc::Frame> subprograms;
- // TODO, remove the mutable (to remove it we'll have to add a lot of const everywhere)
- mutable std::vector<simgrid::mc::Variable> global_variables;
- std::unordered_map<std::uint64_t, simgrid::mc::Type> types;
- std::unordered_map<std::string, simgrid::mc::Type*> full_types_by_name;
-
- /** Index of functions by IP
- *
- * The entries are sorted by low_pc and a binary search can be used to look
- * them up. Should we used a binary tree instead?
- */
- std::vector<FunctionIndexEntry> functions_index;
-
- bool executable() const
- {
- return this->flags & MC_OBJECT_INFO_EXECUTABLE;
- }
-
- bool privatized() const
- {
- return this->executable() && smpi_privatize_global_variables;
- }
-
- void* base_address() const;
-
- mc_frame_t find_function(const void *ip) const;
- // TODO, should be simgrid::mc::Variable*
- simgrid::mc::Variable* find_variable(const char* name) const;
-
-};
-
-}
-}
-
-
-XBT_INTERNAL std::shared_ptr<s_mc_object_info_t> MC_find_object_info(