mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-24 20:12:07 +00:00
Factor out shared backtrace code (#1793)
This commit is contained in:
@@ -11,11 +11,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "backtrace.hpp"
|
||||
#include "diagnostics.hpp"
|
||||
#include "helpers.hpp"
|
||||
#include "linkdefs.hpp"
|
||||
#include "platform.hpp" // S_ISDIR (stat macro)
|
||||
#include "style.hpp"
|
||||
#include "verbosity.hpp"
|
||||
|
||||
#include "asm/lexer.hpp"
|
||||
@@ -78,53 +78,12 @@ std::vector<std::pair<std::string, uint32_t>> FileStackNode::backtrace(uint32_t
|
||||
}
|
||||
}
|
||||
|
||||
static void printNode(std::pair<std::string, uint32_t> const &node) {
|
||||
style_Set(stderr, STYLE_CYAN, true);
|
||||
fputs(node.first.c_str(), stderr);
|
||||
style_Set(stderr, STYLE_CYAN, false);
|
||||
fprintf(stderr, "(%" PRIu32 ")", node.second);
|
||||
}
|
||||
|
||||
void FileStackNode::printBacktrace(uint32_t curLineNo) const {
|
||||
std::vector<std::pair<std::string, uint32_t>> nodes = backtrace(curLineNo);
|
||||
size_t n = nodes.size();
|
||||
|
||||
if (warnings.traceDepth == TRACE_COLLAPSE) {
|
||||
fputs(" ", stderr); // Just three spaces; the fourth will be handled by the loop
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
style_Reset(stderr);
|
||||
fprintf(stderr, " %s ", i == 0 ? "at" : "<-");
|
||||
printNode(nodes[n - i - 1]);
|
||||
}
|
||||
putc('\n', stderr);
|
||||
} else if (warnings.traceDepth == 0 || static_cast<size_t>(warnings.traceDepth) >= n) {
|
||||
for (size_t i = 0; i < n; ++i) {
|
||||
style_Reset(stderr);
|
||||
fprintf(stderr, " %s ", i == 0 ? "at" : "<-");
|
||||
printNode(nodes[n - i - 1]);
|
||||
putc('\n', stderr);
|
||||
}
|
||||
} else {
|
||||
size_t last = warnings.traceDepth / 2;
|
||||
size_t first = warnings.traceDepth - last;
|
||||
size_t skipped = n - warnings.traceDepth;
|
||||
for (size_t i = 0; i < first; ++i) {
|
||||
style_Reset(stderr);
|
||||
fprintf(stderr, " %s ", i == 0 ? "at" : "<-");
|
||||
printNode(nodes[n - i - 1]);
|
||||
putc('\n', stderr);
|
||||
}
|
||||
style_Reset(stderr);
|
||||
fprintf(stderr, " ...%zu more%s\n", skipped, last ? "..." : "");
|
||||
for (size_t i = n - last; i < n; ++i) {
|
||||
style_Reset(stderr);
|
||||
fputs(" <- ", stderr);
|
||||
printNode(nodes[n - i - 1]);
|
||||
putc('\n', stderr);
|
||||
}
|
||||
}
|
||||
|
||||
style_Reset(stderr);
|
||||
trace_PrintBacktrace(
|
||||
backtrace(curLineNo),
|
||||
[](std::pair<std::string, uint32_t> const &node) { return node.first.c_str(); },
|
||||
[](std::pair<std::string, uint32_t> const &node) { return node.second; }
|
||||
);
|
||||
}
|
||||
|
||||
void fstk_TraceCurrent() {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "backtrace.hpp"
|
||||
#include "diagnostics.hpp"
|
||||
#include "extern/getopt.hpp"
|
||||
#include "helpers.hpp"
|
||||
@@ -303,23 +304,11 @@ int main(int argc, char *argv[]) {
|
||||
switch (ch) {
|
||||
char *endptr;
|
||||
|
||||
case 'B': {
|
||||
if (!strcasecmp(musl_optarg, "collapse")) {
|
||||
warnings.traceDepth = TRACE_COLLAPSE;
|
||||
break;
|
||||
}
|
||||
|
||||
warnings.traceDepth = strtoul(musl_optarg, &endptr, 0);
|
||||
|
||||
if (musl_optarg[0] == '\0' || *endptr != '\0') {
|
||||
case 'B':
|
||||
if (!trace_ParseTraceDepth(musl_optarg)) {
|
||||
fatal("Invalid argument for option '-B'");
|
||||
}
|
||||
|
||||
if (warnings.traceDepth >= UINT64_MAX) {
|
||||
fatal("Argument for option '-B' is too large");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'b':
|
||||
if (strlen(musl_optarg) == 2) {
|
||||
|
||||
@@ -60,7 +60,6 @@ Diagnostics<WarningLevel, WarningID> warnings = {
|
||||
{WARNING_UNMAPPED_CHAR_1, WARNING_UNMAPPED_CHAR_2, 1},
|
||||
},
|
||||
.state = DiagnosticsState<WarningID>(),
|
||||
.traceDepth = 0,
|
||||
.nbErrors = 0,
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
Reference in New Issue
Block a user