diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 63f9693562b3..9a39c3019cd3 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -201,7 +201,20 @@ static bool parseCommand(StringRef InputString, bool &IsData, static uint64_t getModuleSectionIndexForAddress(const std::string &ModuleName, uint64_t Address) { - Expected> BinaryOrErr = createBinary(ModuleName); + // 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;