Skip to content

Commit 5171e87

Browse files
committed
Refactor logic in the libdwarf resolver's resolve_frames, pull out trace flattening
1 parent a9f72c6 commit 5171e87

File tree

1 file changed

+54
-46
lines changed

1 file changed

+54
-46
lines changed

src/symbols/symbols_with_libdwarf.cpp

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,41 @@ namespace libdwarf {
11771177
}
11781178
}
11791179

1180+
// flatten trace with inlines
1181+
std::vector<stacktrace_frame> flatten_inlines(const std::vector<frame_with_inlines>& trace) {
1182+
std::vector<stacktrace_frame> final_trace;
1183+
for(const auto& entry : trace) {
1184+
// most recent call first
1185+
if(!entry.inlines.empty()) {
1186+
// insert in reverse order
1187+
final_trace.insert(
1188+
final_trace.end(),
1189+
std::make_move_iterator(entry.inlines.rbegin()),
1190+
std::make_move_iterator(entry.inlines.rend())
1191+
);
1192+
}
1193+
final_trace.push_back(std::move(entry.frame));
1194+
if(!entry.inlines.empty()) {
1195+
// rotate line info due to quirk of how dwarf stores this stuff
1196+
// inclusive range
1197+
auto begin = final_trace.end() - (1 + entry.inlines.size());
1198+
auto end = final_trace.end() - 1;
1199+
auto carry_line = end->line;
1200+
auto carry_column = end->column;
1201+
std::string carry_filename = std::move(end->filename);
1202+
for(auto it = end; it != begin; it--) {
1203+
it->line = (it - 1)->line;
1204+
it->column = (it - 1)->column;
1205+
it->filename = std::move((it - 1)->filename);
1206+
}
1207+
begin->line = carry_line;
1208+
begin->column = carry_column;
1209+
begin->filename = std::move(carry_filename);
1210+
}
1211+
}
1212+
return final_trace;
1213+
}
1214+
11801215
CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING
11811216
std::vector<stacktrace_frame> resolve_frames(const std::vector<object_frame>& frames) {
11821217
std::vector<frame_with_inlines> trace(frames.size(), {null_frame, {}});
@@ -1206,56 +1241,29 @@ namespace libdwarf {
12061241
if(!should_absorb_trace_exceptions()) {
12071242
throw;
12081243
}
1209-
for(const auto& entry : group.second) {
1210-
const auto& dlframe = entry.first.get();
1211-
auto& frame = entry.second.get();
1212-
frame = {
1213-
{
1214-
dlframe.raw_address,
1215-
dlframe.object_address,
1216-
nullable<std::uint32_t>::null(),
1217-
nullable<std::uint32_t>::null(),
1218-
dlframe.object_path,
1219-
"",
1220-
false
1221-
},
1222-
{}
1223-
};
1224-
}
12251244
}
12261245
}
1227-
// flatten trace with inlines
1228-
std::vector<stacktrace_frame> final_trace;
1229-
for(const auto& entry : trace) {
1230-
// most recent call first
1231-
if(!entry.inlines.empty()) {
1232-
// insert in reverse order
1233-
final_trace.insert(
1234-
final_trace.end(),
1235-
std::make_move_iterator(entry.inlines.rbegin()),
1236-
std::make_move_iterator(entry.inlines.rend())
1237-
);
1238-
}
1239-
final_trace.push_back(std::move(entry.frame));
1240-
if(!entry.inlines.empty()) {
1241-
// rotate line info due to quirk of how dwarf stores this stuff
1242-
// inclusive range
1243-
auto begin = final_trace.end() - (1 + entry.inlines.size());
1244-
auto end = final_trace.end() - 1;
1245-
auto carry_line = end->line;
1246-
auto carry_column = end->column;
1247-
std::string carry_filename = std::move(end->filename);
1248-
for(auto it = end; it != begin; it--) {
1249-
it->line = (it - 1)->line;
1250-
it->column = (it - 1)->column;
1251-
it->filename = std::move((it - 1)->filename);
1252-
}
1253-
begin->line = carry_line;
1254-
begin->column = carry_column;
1255-
begin->filename = std::move(carry_filename);
1246+
// fill in basic info for any frames where there were resolution issues
1247+
for(std::size_t i = 0; i < frames.size(); i++) {
1248+
const auto& dlframe = frames[i];
1249+
auto& frame = trace[i];
1250+
if(frame.frame == null_frame) {
1251+
frame = {
1252+
{
1253+
dlframe.raw_address,
1254+
dlframe.object_address,
1255+
nullable<std::uint32_t>::null(),
1256+
nullable<std::uint32_t>::null(),
1257+
dlframe.object_path,
1258+
"",
1259+
false
1260+
},
1261+
{}
1262+
};
12561263
}
12571264
}
1258-
return final_trace;
1265+
// flatten and finish
1266+
return flatten_inlines(trace);
12591267
}
12601268
}
12611269
}

0 commit comments

Comments
 (0)