Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion base/test.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ function scrub_backtrace(bt)
if do_test_ind != 0 && length(bt) > do_test_ind
bt = bt[do_test_ind + 1:end]
end
name_ind = findfirst(addr->ip_matches_func_and_name(addr, Symbol("macro expansion;"), ".", "test.jl"), bt)
name_ind = findfirst(addr->ip_matches_func_and_name(addr, Symbol("macro expansion"), ".", "test.jl"), bt)
if name_ind != 0 && length(bt) != 0
bt = bt[1:name_ind]
end
Expand Down
36 changes: 19 additions & 17 deletions src/debuginfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -698,14 +698,15 @@ JL_DLLEXPORT void ORCNotifyObjectEmitted(JITEventListener *Listener,
}
#endif

extern "C"
char *jl_demangle(const char *name)
static std::pair<char *, bool> jl_demangle(const char *name)
{
// This function is not allowed to reference any TLS variables since
// it can be called from an unmanaged thread on OSX.
const char *start = name + 6;
const char *end = name + strlen(name);
char *ret;
if (end <= start)
goto done;
if (strncmp(name, "japi1_", 6) &&
strncmp(name, "japi3_", 6) &&
strncmp(name, "julia_", 6) &&
Expand All @@ -724,9 +725,9 @@ char *jl_demangle(const char *name)
ret = (char*)malloc(end - start + 1);
memcpy(ret, start, end - start);
ret[end - start] = '\0';
return ret;
return std::make_pair(ret, true);
done:
return strdup(name);
return std::make_pair(strdup(name), false);
}

static JuliaJITEventListener *jl_jit_events;
Expand All @@ -746,9 +747,11 @@ static int lookup_pointer(DIContext *context, jl_frame_t **frames,
// since it can be called from an unmanaged thread on OSX.
if (!context) {
if (demangle) {
if ((*frames)[0].func_name != NULL) {
char *oldname = (*frames)[0].func_name;
(*frames)[0].func_name = jl_demangle(oldname);
char *oldname = (*frames)[0].func_name;
if (oldname != NULL) {
std::pair<char *, bool> demangled = jl_demangle(oldname);
(*frames)[0].func_name = demangled.first;
(*frames)[0].fromC = !demangled.second;
free(oldname);
}
else {
Expand Down Expand Up @@ -805,11 +808,11 @@ static int lookup_pointer(DIContext *context, jl_frame_t **frames,
if (inlined_frame) {
frame->inlined = 1;
frame->fromC = fromC;
if ((*frames)[n_frames-1].linfo) {
if (!fromC) {
std::size_t semi_pos = func_name.find(';');
if (semi_pos != std::string::npos) {
func_name = func_name.substr(0, semi_pos);
frame->linfo = NULL; // TODO
frame->linfo = NULL; // TODO: if (new_frames[n_frames - 1].linfo) frame->linfo = lookup(func_name in linfo)?
}
}
}
Expand All @@ -818,24 +821,21 @@ static int lookup_pointer(DIContext *context, jl_frame_t **frames,
frame->func_name = NULL;
else
jl_copy_str(&frame->func_name, func_name.c_str());
if (!frame->func_name)
frame->fromC = 1;

#if JL_LLVM_VERSION < 30500
frame->line = info.getLine();
std::string file_name(info.getFileName());
#else
frame->line = info.Line;
std::string file_name(info.FileName);
#endif

if (file_name == "<invalid>")
frame->file_name = NULL;
else
jl_copy_str(&frame->file_name, file_name.c_str());

if (!frame->func_name ||
func_name.compare(0, 7, "jlsysw_") == 0 ||
func_name.compare(0, 7, "jlcall_") == 0 ||
func_name.compare(0, 7, "jlcapi_") == 0) {
frame->fromC = 1;
}
}
return n_frames;
}
Expand Down Expand Up @@ -1580,7 +1580,9 @@ int jl_getFunctionInfo(jl_frame_t **frames_out, size_t pointer, int skipC, int n
}
else {
char *oldname = frames[0].func_name;
frames[0].func_name = jl_demangle(frames[0].func_name);
std::pair<char *, bool> demangled = jl_demangle(oldname);
frames[0].func_name = demangled.first;
frames[0].fromC = !demangled.second;
free(oldname);
}

Expand Down