Index: llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h =================================================================== --- llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h +++ llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.h @@ -63,6 +63,9 @@ uint64_t OpdAddress = 0); std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj); + /// Search for the first occurence of specified Address in ObjectFile. + uint64_t getModuleSectionIndexForAddress(uint64_t Address) const; + object::ObjectFile *Module; std::unique_ptr DebugInfoContext; Index: llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp =================================================================== --- llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp +++ llvm/lib/DebugInfo/Symbolize/SymbolizableObjectFile.cpp @@ -227,6 +227,11 @@ FunctionNameKind FNKind, bool UseSymbolTable) const { DILineInfo LineInfo; + + if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection) + ModuleOffset.SectionIndex = + getModuleSectionIndexForAddress(ModuleOffset.Address); + if (DebugInfoContext) { LineInfo = DebugInfoContext->getLineInfoForAddress( ModuleOffset, getDILineInfoSpecifier(FNKind)); @@ -248,6 +253,10 @@ bool UseSymbolTable) const { DIInliningInfo InlinedContext; + if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection) + ModuleOffset.SectionIndex = + getModuleSectionIndexForAddress(ModuleOffset.Address); + if (DebugInfoContext) InlinedContext = DebugInfoContext->getInliningInfoForAddress( ModuleOffset, getDILineInfoSpecifier(FNKind)); @@ -276,3 +285,20 @@ Res.Start, Res.Size); return Res; } + +/// Search for the first occurence of specified Address in ObjectFile. +uint64_t SymbolizableObjectFile::getModuleSectionIndexForAddress( + uint64_t Address) const { + + for (SectionRef Sec : Module->sections()) { + if (!Sec.isText() || Sec.isVirtual()) + continue; + + if (Address >= Sec.getAddress() && + Address <= Sec.getAddress() + Sec.getSize()) { + return Sec.getIndex(); + } + } + + return object::SectionedAddress::UndefSection; +} Index: llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp =================================================================== --- llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -194,48 +194,6 @@ return !StringRef(pos, offset_length).getAsInteger(0, ModuleOffset); } -// This routine returns section index for an address. -// Assumption: would work ambiguously for object files which have sections not -// assigned to an address(since the same address could belong to various -// sections). -static uint64_t getModuleSectionIndexForAddress(const std::string &ModuleName, - uint64_t Address) { - - // following ModuleName processing was copied from - // LLVMSymbolizer::getOrCreateModuleInfo(). - // it needs to be refactored to avoid code duplication. - std::string BinaryName = ModuleName; - size_t ColonPos = ModuleName.find_last_of(':'); - // Verify that substring after colon form a valid arch name. - if (ColonPos != std::string::npos) { - std::string ArchStr = ModuleName.substr(ColonPos + 1); - if (Triple(ArchStr).getArch() != Triple::UnknownArch) { - BinaryName = ModuleName.substr(0, ColonPos); - } - } - - Expected> BinaryOrErr = createBinary(BinaryName); - - if (error(BinaryOrErr)) - return object::SectionedAddress::UndefSection; - - Binary &Binary = *BinaryOrErr->getBinary(); - - if (ObjectFile *O = dyn_cast(&Binary)) { - for (SectionRef Sec : O->sections()) { - if (!Sec.isText() || Sec.isVirtual()) - continue; - - if (Address >= Sec.getAddress() && - Address <= Sec.getAddress() + Sec.getSize()) { - return Sec.getIndex(); - } - } - } - - return object::SectionedAddress::UndefSection; -} - static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer, DIPrinter &Printer) { bool IsData = false; @@ -253,18 +211,19 @@ outs() << Delimiter; } Offset -= ClAdjustVMA; - object::SectionedAddress ModuleOffset = { - Offset, getModuleSectionIndexForAddress(ModuleName, Offset)}; if (IsData) { - auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset); + auto ResOrErr = Symbolizer.symbolizeData( + ModuleName, {Offset, object::SectionedAddress::UndefSection}); Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get()); } else if (ClPrintInlining) { - auto ResOrErr = - Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset, ClDwpName); + auto ResOrErr = Symbolizer.symbolizeInlinedCode( + ModuleName, {Offset, object::SectionedAddress::UndefSection}, + ClDwpName); Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get()); } else { - auto ResOrErr = - Symbolizer.symbolizeCode(ModuleName, ModuleOffset, ClDwpName); + auto ResOrErr = Symbolizer.symbolizeCode( + ModuleName, {Offset, object::SectionedAddress::UndefSection}, + ClDwpName); Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get()); } outs() << "\n";