[dsymutil] Support more than 4 architectures
authorJonas Devlieghere <jonas@devlieghere.com>
Wed, 5 Jun 2019 17:14:32 +0000 (17:14 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Wed, 5 Jun 2019 17:14:32 +0000 (17:14 +0000)
When running dsymutil on a fat binary, we use temporary files in a small
vector of size four. When processing more than 4 architectures, this
resulted in a user-after-move, because the temporary files got moved to
the heap. Instead of storing an optional temp file, we now use a unique
pointer, so the location of the actual temp file doesn't change.

We could test this by checking in 5 binaries for 5 different
architectures, but this seems wasteful, especially since the number of
elements in the small vector is arbitrary.

llvm-svn: 362621

llvm/tools/dsymutil/MachOUtils.cpp
llvm/tools/dsymutil/MachOUtils.h

index b7ab352..cd0f280 100644 (file)
@@ -35,7 +35,7 @@ llvm::Error ArchAndFile::createTempFile() {
   if (!T)
     return T.takeError();
 
-  File = llvm::Optional<sys::fs::TempFile>(std::move(*T));
+  File = llvm::make_unique<sys::fs::TempFile>(std::move(*T));
   return Error::success();
 }
 
index 83b6481..bc88f58 100644 (file)
@@ -26,13 +26,14 @@ namespace MachOUtils {
 struct ArchAndFile {
   std::string Arch;
   // Optional because TempFile has no default constructor.
-  Optional<llvm::sys::fs::TempFile> File;
+  std::unique_ptr<llvm::sys::fs::TempFile> File;
 
   llvm::Error createTempFile();
   llvm::StringRef path() const;
 
   ArchAndFile(StringRef Arch) : Arch(Arch) {}
   ArchAndFile(ArchAndFile &&A) = default;
+  ArchAndFile &operator=(ArchAndFile &&A) = default;
   ~ArchAndFile();
 };