Index: lldb/include/lldb/Symbol/ObjectFile.h =================================================================== --- lldb/include/lldb/Symbol/ObjectFile.h +++ lldb/include/lldb/Symbol/ObjectFile.h @@ -201,7 +201,7 @@ /// \b false otherwise and \a archive_file and \a archive_object /// are guaranteed to be remain unchanged. static bool SplitArchivePathWithObject( - const char *path_with_object, lldb_private::FileSpec &archive_file, + llvm::StringRef path_with_object, lldb_private::FileSpec &archive_file, lldb_private::ConstString &archive_object, bool must_exist); // LLVM RTTI support Index: lldb/source/Symbol/ObjectFile.cpp =================================================================== --- lldb/source/Symbol/ObjectFile.cpp +++ lldb/source/Symbol/ObjectFile.cpp @@ -19,7 +19,6 @@ #include "lldb/Utility/DataBuffer.h" #include "lldb/Utility/DataBufferHeap.h" #include "lldb/Utility/Log.h" -#include "lldb/Utility/RegularExpression.h" #include "lldb/Utility/Timer.h" #include "lldb/lldb-private.h" @@ -83,9 +82,8 @@ if (!data_sp || data_sp->GetByteSize() == 0) { // Check for archive file with format "/path/to/archive.a(object.o)" - char path_with_object[PATH_MAX * 2]; - module_sp->GetFileSpec().GetPath(path_with_object, - sizeof(path_with_object)); + llvm::SmallString path_with_object; + module_sp->GetFileSpec().GetPath(path_with_object); ConstString archive_object; const bool must_exist = true; @@ -571,21 +569,22 @@ } } -bool ObjectFile::SplitArchivePathWithObject(const char *path_with_object, +bool ObjectFile::SplitArchivePathWithObject(llvm::StringRef path_with_object, FileSpec &archive_file, ConstString &archive_object, bool must_exist) { - llvm::SmallVector matches; - RegularExpression g_object_regex(llvm::StringRef("(.*)\\(([^\\)]+)\\)$")); - if (g_object_regex.Execute(llvm::StringRef::withNullAsEmpty(path_with_object), - &matches)) { - std::string path = matches[1].str(); - std::string obj = matches[2].str(); - archive_file.SetFile(path, FileSpec::Style::native); - archive_object.SetCString(obj.c_str()); - return !(must_exist && !FileSystem::Instance().Exists(archive_file)); - } - return false; + size_t len = path_with_object.size(); + if (len < 2 || path_with_object[len-1] != ')') + return false; + llvm::StringRef archive = path_with_object.substr(0, path_with_object.rfind('(')); + if (archive.empty()) + return false; + llvm::StringRef object = path_with_object.substr(archive.size() + 1).drop_back(); + archive_file.SetFile(archive, FileSpec::Style::native); + if (must_exist && !FileSystem::Instance().Exists(archive_file)) + return false; + archive_object.SetString(object); + return true; } void ObjectFile::ClearSymtab() {