void lookup_pointer(DIContext *context, const char **name, size_t *line, const char **filename, size_t pointer, int demangle, int *fromC) { DILineInfo info; if (demangle && *name != NULL) *name = jl_demangle(*name); #ifdef LLVM35 DILineInfoSpecifier infoSpec(DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath, DILineInfoSpecifier::FunctionNameKind::ShortName); #else int infoSpec = DILineInfoSpecifier::FileLineInfo | DILineInfoSpecifier::AbsoluteFilePath | DILineInfoSpecifier::FunctionName; #endif if (context == NULL) goto done; info = context->getLineInfoForAddress(pointer, infoSpec); #ifndef LLVM35 // LLVM <= 3.4 if (strcmp(info.getFunctionName(), "<invalid>") == 0) goto done; if (demangle) *name = jl_demangle(info.getFunctionName()); else *name = strdup(info.getFunctionName()); *line = info.getLine(); *filename = strdup(info.getFileName()); #else if (strcmp(info.FunctionName.c_str(), "<invalid>") == 0) goto done; *name = strdup(info.FunctionName.c_str()); *line = info.Line; *filename = strdup(info.FileName.c_str()); #endif done: // If this is a jlcall wrapper, set fromC to match JIT behavior if (*name == NULL || memcmp(*name,"jlcall_",7) == 0) *fromC = true; }
void lookup_pointer(DIContext *context, const char **name, int *line, const char **filename, size_t pointer, int demangle) { if (context == NULL) return; #ifdef LLVM35 DILineInfoSpecifier infoSpec(DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath, DILineInfoSpecifier::FunctionNameKind::ShortName); #else int infoSpec = DILineInfoSpecifier::FileLineInfo | DILineInfoSpecifier::AbsoluteFilePath | DILineInfoSpecifier::FunctionName; #endif DILineInfo info = context->getLineInfoForAddress(pointer, infoSpec); #ifndef LLVM35 // LLVM <= 3.4 if (strcmp(info.getFunctionName(), "<invalid>") == 0) return; if (demangle) *name = jl_demangle(info.getFunctionName()); else *name = strdup(info.getFunctionName()); *line = info.getLine(); *filename = strdup(info.getFileName()); #else if (strcmp(info.FunctionName.c_str(), "<invalid>") == 0) return; *name = strdup(info.FunctionName.c_str()); *line = info.Line; *filename = strdup(info.FileName.c_str()); #endif }