#include "src/simgrid/util.hpp"
#include "xbt/log.h"
+#include "xbt/string.hpp"
#include "xbt/sysdep.h"
#include <simgrid_config.h>
* Before this version of DWARF, the MIPS extensions
* DW_AT_MIPS_linkage_name is used (at least by GCC).
*
- * \param the DIE
+ * \param die the DIE
* \return linkage name of the given DIE (or nullptr)
* */
static const char *MC_dwarf_at_linkage_name(Dwarf_Die * die)
/** \brief Find the type/subtype (DW_AT_type) for a DIE
*
- * \param dit the DIE
+ * \param die the DIE
* \return DW_AT_type reference as a global offset in hexadecimal (or nullptr)
*/
static
/** \brief Create a MC type object from a DIE
*
* \param info current object info object
- * \param DIE (for a given type)
+ * \param die DIE (for a given type)
* \param unit compilation unit of the current DIE
* \return MC representation of the type
*/
const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
if (name != nullptr) {
- char* full_name = ns ? bprintf("%s%s::%s", prefix, ns, name) :
- bprintf("%s%s", prefix, name);
- type.name = std::string(full_name);
- free(full_name);
+ if (ns)
+ type.name = simgrid::xbt::string_printf("%s%s::%s", prefix, ns, name);
+ else
+ type.name = simgrid::xbt::string_printf("%s%s", prefix, name);
}
type.type_id = MC_dwarf_at_type(die);
case DW_TAG_union_type:
case DW_TAG_class_type:
MC_dwarf_add_members(info, die, unit, &type);
- char *new_ns = ns == nullptr ? xbt_strdup(type.name.c_str())
- : bprintf("%s::%s", ns, name);
- MC_dwarf_handle_children(info, die, unit, frame, new_ns);
- free(new_ns);
+ MC_dwarf_handle_children(info, die, unit, frame,
+ ns ? simgrid::xbt::string_printf("%s::%s", ns, name).c_str() : type.name.c_str());
+ break;
+
+ default:
+ XBT_DEBUG("Unhandled type: %d (%s)", type.type, simgrid::dwarf::tagname(type.type));
break;
}
variable->address = (void *) (base + offset);
} else
variable->location_list = {
- simgrid::dwarf::DwarfExpression(expr, expr + len) };
+ simgrid::dwarf::LocationListEntry(simgrid::dwarf::DwarfExpression(expr, expr + len))};
break;
}
dwarf_attr(die, DW_AT_start_scope, &attr);
int form = dwarf_whatform(&attr);
simgrid::dwarf::FormClass form_class = simgrid::dwarf::classify_form(form);
- switch (form_class) {
- case simgrid::dwarf::FormClass::Constant: {
- Dwarf_Word value;
- variable->start_scope =
- dwarf_formudata(&attr, &value) == 0 ? (size_t) value : 0;
- break;
- }
-
- default: // includes FormClass::RangeListPtr (TODO)
- xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s", (unsigned)form,
- (unsigned)form_class, name == nullptr ? "?" : name);
+ if (form_class == simgrid::dwarf::FormClass::Constant) {
+ Dwarf_Word value;
+ variable->start_scope = dwarf_formudata(&attr, &value) == 0 ? (size_t)value : 0;
+ } else {
+ // TODO: FormClass::RangeListPtr
+ xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s", (unsigned)form,
+ (unsigned)form_class, name == nullptr ? "?" : name);
}
}
// The current code needs a variable name,
// generate a fake one:
- if (variable->name.empty())
- variable->name =
- "@anonymous#" + std::to_string(mc_anonymous_variable_index++);
-
+ if (variable->name.empty()) {
+ variable->name = "@anonymous#" + std::to_string(mc_anonymous_variable_index);
+ mc_anonymous_variable_index++;
+ }
return variable;
}
if (not variable)
return;
// Those arrays are sorted later:
- else if (variable->global)
+ if (variable->global)
info->global_variables.push_back(std::move(*variable));
else if (frame != nullptr)
frame->variables.push_back(std::move(*variable));