@@ -464,9 +464,11 @@ static void doDisplayTable(StringRef Name, const object::Archive::Child &C) {
464
464
}
465
465
466
466
if (C.getParent ()->isThin ()) {
467
- StringRef ParentDir = sys::path::parent_path (ArchiveName);
468
- if (!ParentDir.empty ())
469
- outs () << ParentDir << ' /' ;
467
+ if (!sys::path::is_absolute (Name)) {
468
+ StringRef ParentDir = sys::path::parent_path (ArchiveName);
469
+ if (!ParentDir.empty ())
470
+ outs () << sys::path::convert_to_slash (ParentDir) << ' /' ;
471
+ }
470
472
}
471
473
outs () << Name << " \n " ;
472
474
}
@@ -593,10 +595,18 @@ static void addChildMember(std::vector<NewArchiveMember> &Members,
593
595
// the archive it's in, so the file resolves correctly.
594
596
if (Thin && FlattenArchive) {
595
597
StringSaver Saver (Alloc);
596
- Expected<std::string> FileNameOrErr = M.getFullName ();
598
+ Expected<std::string> FileNameOrErr = M.getName ();
597
599
failIfError (FileNameOrErr.takeError ());
598
- NMOrErr->MemberName =
599
- Saver.save (computeArchiveRelativePath (ArchiveName, *FileNameOrErr));
600
+ if (sys::path::is_absolute (*FileNameOrErr)) {
601
+ NMOrErr->MemberName = Saver.save (sys::path::convert_to_slash (*FileNameOrErr));
602
+ } else {
603
+ FileNameOrErr = M.getFullName ();
604
+ failIfError (FileNameOrErr.takeError ());
605
+ Expected<std::string> PathOrErr =
606
+ computeArchiveRelativePath (ArchiveName, *FileNameOrErr);
607
+ NMOrErr->MemberName = Saver.save (
608
+ PathOrErr ? *PathOrErr : sys::path::convert_to_slash (*FileNameOrErr));
609
+ }
600
610
}
601
611
if (FlattenArchive &&
602
612
identify_magic (NMOrErr->Buf ->getBuffer ()) == file_magic::archive) {
@@ -625,9 +635,19 @@ static void addMember(std::vector<NewArchiveMember> &Members,
625
635
// For regular archives, use the basename of the object path for the member
626
636
// name. For thin archives, use the full relative paths so the file resolves
627
637
// correctly.
628
- NMOrErr->MemberName =
629
- Thin ? Saver.save (computeArchiveRelativePath (ArchiveName, FileName))
630
- : sys::path::filename (NMOrErr->MemberName );
638
+ if (!Thin) {
639
+ NMOrErr->MemberName = sys::path::filename (NMOrErr->MemberName );
640
+ } else {
641
+ if (sys::path::is_absolute (FileName))
642
+ NMOrErr->MemberName = Saver.save (sys::path::convert_to_slash (FileName));
643
+ else {
644
+ Expected<std::string> PathOrErr =
645
+ computeArchiveRelativePath (ArchiveName, FileName);
646
+ NMOrErr->MemberName = Saver.save (
647
+ PathOrErr ? *PathOrErr : sys::path::convert_to_slash (FileName));
648
+ }
649
+ }
650
+
631
651
if (FlattenArchive &&
632
652
identify_magic (NMOrErr->Buf ->getBuffer ()) == file_magic::archive) {
633
653
object::Archive &Lib = readLibrary (FileName);
0 commit comments