Index: llvm/test/tools/llvm-ar/non-windows-name-case.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-ar/non-windows-name-case.test @@ -0,0 +1,27 @@ +## Test that on windows, members are case insensitive. +# UNSUPPORTED: system-windows + +# RUN: mkdir -p %t +# RUN: rm -rf %t/lowerCase %t/UPPERCASE && mkdir %t/lowerCase %t/UPPERCASE +# RUN: echo lowerCase > %t/lowerCase/file.txt +# RUN: echo UPPERCASE > %t/UPPERCASE/FILE.TXT + +# RUN: rm -f %t/archive.a +# RUN: llvm-ar rc %t/archive.a %t/lowerCase/file.txt +# RUN: llvm-ar rc %t/archive.a %t/UPPERCASE/FILE.TXT +# RUN: FileCheck %s -input-file=%t/archive.a --check-prefix=ARCHIVE + +# ARCHIVE: file.txt +# ARCHIVE: FILE.TXT + +# RUN: rm -f %t/thin-archive.a +# RUN: llvm-ar Trc %t/thin-archive.a %t/lowerCase/file.txt %t/UPPERCASE/FILE.TXT +# RUN: llvm-ar dTP %t/thin-archive.a %t/uppercase/file.txt + +# RUN: FileCheck %s -input-file=%t/thin-archive.a --check-prefix=THIN-ARCHIVE -DPATH=%/t + +# RUN: llvm-ar dTP %t/thin-archive.a %t/LOWERCASE/FILE.TXT +# RUN: FileCheck %s -input-file=%t/thin-archive.a --check-prefix=THIN-ARCHIVE -DPATH=%/t + +# THIN-ARCHIVE: [[PATH]]/lowerCase/file.txt +# THIN-ARCHIVE: [[PATH]]/UPPERCASE/FILE.TXT Index: llvm/test/tools/llvm-ar/windows-name-case.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-ar/windows-name-case.test @@ -0,0 +1,29 @@ +## Test that on windows, members are case insensitive. +# REQUIRES: system-windows + +# RUN: mkdir -p %t +# RUN: rm -rf %t/lowerCase %t/UPPERCASE && mkdir %t/lowerCase %t/UPPERCASE +# RUN: echo lowerCase > %t/lowerCase/file.txt +# RUN: echo UPPERCASE > %t/UPPERCASE/FILE.TXT + +# RUN: rm -f %t/archive.a +# RUN: llvm-ar rc %t/archive.a %t/lowerCase/file.txt +# RUN: FileCheck %s -input-file=%t/archive.a --check-prefix=LOWER --implicit-check-not=FILE.TXT +# RUN: llvm-ar rc %t/archive.a %t/UPPERCASE/FILE.TXT +# RUN: FileCheck %s -input-file=%t/archive.a --check-prefix=UPPER --implicit-check-not=file.txt + +# LOWER: file.txt +# UPPER: FILE.TXT + +# RUN: rm -f %t/thin-archive.a +# RUN: llvm-ar Trc %t/thin-archive.a %t/lowerCase/file.txt %t/UPPERCASE/FILE.txt +# RUN: llvm-ar dTP %t/thin-archive.a %t/uppercase/file.txt + +# RUN: FileCheck %s -input-file=%t/thin-archive.a --check-prefix=THIN-ARCHIVE -DPATH=%/t +# THIN-ARCHIVE-NOT: [[PATH]]/UPPERCASE/FILE.TXT +# THIN-ARCHIVE: [[PATH]]/lowerCase/file.txt + +# RUN: llvm-ar dTP %t/thin-archive.a %t/LOWERCASE/FILE.TXT +# RUN: FileCheck %s -input-file=%t/thin-archive.a --check-prefix=EMPTY --implicit-check-not {{.}} + +EMPTY: ! Index: llvm/tools/llvm-ar/llvm-ar.cpp =================================================================== --- llvm/tools/llvm-ar/llvm-ar.cpp +++ llvm/tools/llvm-ar/llvm-ar.cpp @@ -484,8 +484,14 @@ } static std::string normalizePath(StringRef Path) { - return CompareFullPath ? sys::path::convert_to_slash(Path) - : std::string(sys::path::filename(Path)); + std::string NormalizedPath = CompareFullPath + ? sys::path::convert_to_slash(Path) + : std::string(sys::path::filename(Path)); + + if (Triple(sys::getProcessTriple()).isOSWindows()) + llvm::transform(NormalizedPath, NormalizedPath.begin(), ::toupper); + + return NormalizedPath; } // Implement the 'x' operation. This function extracts files back to the file @@ -561,7 +567,7 @@ if (Filter) { auto I = find_if(Members, [Name](StringRef Path) { - return Name == normalizePath(Path); + return normalizePath(Name) == normalizePath(Path); }); if (I == Members.end()) continue; @@ -690,8 +696,9 @@ StringMap &MemberCount) { if (Operation == QuickAppend || Members.empty()) return IA_AddOldMember; - auto MI = find_if( - Members, [Name](StringRef Path) { return Name == normalizePath(Path); }); + auto MI = find_if(Members, [Name](StringRef Path) { + return normalizePath(Name) == normalizePath(Path); + }); if (MI == Members.end()) return IA_AddOldMember; @@ -749,7 +756,7 @@ int Pos = Ret.size(); Expected NameOrErr = Child.getName(); failIfError(NameOrErr.takeError()); - StringRef Name = NameOrErr.get(); + std::string Name = normalizePath(NameOrErr.get()); if (Name == PosName) { assert(AddAfter || AddBefore); if (AddBefore) @@ -1019,8 +1026,9 @@ break; case MRICommand::Delete: { std::string Name = normalizePath(Rest); - llvm::erase_if(NewMembers, - [=](NewArchiveMember &M) { return M.MemberName == Name; }); + llvm::erase_if(NewMembers, [=](NewArchiveMember &M) { + return normalizePath(M.MemberName) == Name; + }); break; } case MRICommand::Save: