static void PrintDILineInfo(DILineInfo dli) { if (PrintFunctions) outs() << (dli.getFunctionName() ? dli.getFunctionName() : "<unknown>") << "\n"; outs() << (dli.getFileName() ? dli.getFileName() : "<unknown>") << ':' << dli.getLine() << ':' << dli.getColumn() << '\n'; }
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 }
std::string LLVMSymbolizer::printDILineInfo(DILineInfo LineInfo) const { // By default, DILineInfo contains "<invalid>" for function/filename it // cannot fetch. We replace it to "??" to make our output closer to addr2line. static const std::string kDILineInfoBadString = "<invalid>"; std::stringstream Result; if (Opts.PrintFunctions) { std::string FunctionName = LineInfo.getFunctionName(); if (FunctionName == kDILineInfoBadString) FunctionName = kBadString; DemangleName(FunctionName); Result << FunctionName << "\n"; } std::string Filename = LineInfo.getFileName(); if (Filename == kDILineInfoBadString) Filename = kBadString; Result << Filename << ":" << LineInfo.getLine() << ":" << LineInfo.getColumn() << "\n"; return Result.str(); }
static void DumpInput(const StringRef &Filename) { OwningPtr<MemoryBuffer> Buff; if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, Buff)) { errs() << Filename << ": " << ec.message() << "\n"; return; } OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take())); StringRef DebugInfoSection; StringRef DebugAbbrevSection; StringRef DebugLineSection; StringRef DebugArangesSection; StringRef DebugStringSection; error_code ec; for (section_iterator i = Obj->begin_sections(), e = Obj->end_sections(); i != e; i.increment(ec)) { StringRef name; i->getName(name); StringRef data; i->getContents(data); if (name.startswith("__DWARF,")) name = name.substr(8); // Skip "__DWARF," prefix. name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes. if (name == "debug_info") DebugInfoSection = data; else if (name == "debug_abbrev") DebugAbbrevSection = data; else if (name == "debug_line") DebugLineSection = data; else if (name == "debug_aranges") DebugArangesSection = data; else if (name == "debug_str") DebugStringSection = data; } OwningPtr<DIContext> dictx(DIContext::getDWARFContext(/*FIXME*/true, DebugInfoSection, DebugAbbrevSection, DebugArangesSection, DebugLineSection, DebugStringSection)); if (Address == -1ULL) { outs() << Filename << ":\tfile format " << Obj->getFileFormatName() << "\n\n"; // Dump the complete DWARF structure. dictx->dump(outs()); } else { // Print line info for the specified address. int spec_flags = DILineInfoSpecifier::FileLineInfo; if (PrintFunctions) spec_flags |= DILineInfoSpecifier::FunctionName; DILineInfo dli = dictx->getLineInfoForAddress(Address, spec_flags); if (PrintFunctions) outs() << (dli.getFunctionName() ? dli.getFunctionName() : "<unknown>") << "\n"; outs() << (dli.getFileName() ? dli.getFileName() : "<unknown>") << ':' << dli.getLine() << ':' << dli.getColumn() << '\n'; } }