summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/llvm-ar/llvm-ar.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp
index 0707fd66e7..2a9b4717d0 100644
--- a/tools/llvm-ar/llvm-ar.cpp
+++ b/tools/llvm-ar/llvm-ar.cpp
@@ -578,8 +578,29 @@ void doReplaceOrInsert() {
// Determine if this archive member matches one of the paths we're trying
// to replace.
- std::set<sys::Path>::iterator found =
- std::find(remaining.begin(),remaining.end(), I->getPath());
+
+ std::set<sys::Path>::iterator found = remaining.end();
+ for (std::set<sys::Path>::iterator RI = remaining.begin(),
+ RE = remaining.end(); RI != RE; ++RI ) {
+ std::string compare(RI->get());
+ if (TruncateNames && compare.length() > 15) {
+ const char* nm = compare.c_str();
+ unsigned len = compare.length();
+ size_t slashpos = compare.rfind('/');
+ if (slashpos != std::string::npos) {
+ nm += slashpos + 1;
+ len -= slashpos +1;
+ }
+ if (len > 15)
+ len = 15;
+ compare.assign(nm,len);
+ }
+ if (compare == I->getPath().get()) {
+ found = RI;
+ break;
+ }
+ }
+
if (found != remaining.end()) {
sys::Path::StatusInfo si;
found->getStatusInfo(si);