diff options
| author | Adrian Prantl <aprantl@apple.com> | 2019-10-08 16:29:39 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2019-10-08 16:29:39 +0000 |
| commit | ea6377505435f0a6c9deb154a38dc6960d28726e (patch) | |
| tree | eebce67753362a50cac11602b2dace1634e81a6e /lldb/source/Symbol/ObjectFile.cpp | |
| parent | 917b8df0e531d4b2ecb9c9bc7370a75905587bbc (diff) | |
| download | bcm5719-llvm-ea6377505435f0a6c9deb154a38dc6960d28726e.tar.gz bcm5719-llvm-ea6377505435f0a6c9deb154a38dc6960d28726e.zip | |
Replace regex match with rfind (NFCish)
This change is mostly performance-neutral since our regex engine is
fast, but it's IMHO slightly more readable. Also, matching matching
parenthesis is not a great match for regular expressions.
Differential Revision: https://reviews.llvm.org/D68609
llvm-svn: 374082
Diffstat (limited to 'lldb/source/Symbol/ObjectFile.cpp')
| -rw-r--r-- | lldb/source/Symbol/ObjectFile.cpp | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp index 4a897f2d367..8bfce5ce7a4 100644 --- a/lldb/source/Symbol/ObjectFile.cpp +++ b/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 @@ ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file, 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<256> path_with_object; + module_sp->GetFileSpec().GetPath(path_with_object); ConstString archive_object; const bool must_exist = true; @@ -571,21 +569,22 @@ size_t ObjectFile::ReadSectionData(Section *section, } } -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<llvm::StringRef, 3> 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.back() != ')') + 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() { |

