diff options
author | Alexander Shaposhnikov <alexshap@fb.com> | 2020-10-06 03:41:19 -0700 |
---|---|---|
committer | Alexander Shaposhnikov <alexshap@fb.com> | 2020-10-06 04:01:40 -0700 |
commit | 315970de1d7140fa689dbbe7482620f134e5d021 (patch) | |
tree | 0343156d6983be67c7f32895a09cb5640bd17f60 /llvm/tools/llvm-objcopy/llvm-objcopy.cpp | |
parent | c08d48fc2d7cced7b86043854c235394e87c4506 (diff) | |
download | llvm-315970de1d7140fa689dbbe7482620f134e5d021.zip llvm-315970de1d7140fa689dbbe7482620f134e5d021.tar.gz llvm-315970de1d7140fa689dbbe7482620f134e5d021.tar.bz2 |
[llvm-objcopy][MachO] Add support for universal binaries
This diff adds support for universal binaries to llvm-objcopy.
This is a recommit of 32c8435ef70031 with the asan issue fixed.
Test plan: make check-all
Differential revision: https://reviews.llvm.org/D88400
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 175f292..e1f1ed8 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -25,6 +25,7 @@ #include "llvm/Object/ELFTypes.h" #include "llvm/Object/Error.h" #include "llvm/Object/MachO.h" +#include "llvm/Object/MachOUniversal.h" #include "llvm/Object/Wasm.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" @@ -144,6 +145,10 @@ static Error executeObjcopyOnBinary(CopyConfig &Config, object::Binary &In, return coff::executeObjcopyOnBinary(Config, *COFFBinary, Out); else if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) return macho::executeObjcopyOnBinary(Config, *MachOBinary, Out); + else if (auto *MachOUniversalBinary = + dyn_cast<object::MachOUniversalBinary>(&In)) + return macho::executeObjcopyOnMachOUniversalBinary( + Config, *MachOUniversalBinary, Out); else if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) return objcopy::wasm::executeObjcopyOnBinary(Config, *WasmBinary, Out); else @@ -151,7 +156,11 @@ static Error executeObjcopyOnBinary(CopyConfig &Config, object::Binary &In, "unsupported object file format"); } -static Error executeObjcopyOnArchive(CopyConfig &Config, const Archive &Ar) { +namespace llvm { +namespace objcopy { + +Expected<std::vector<NewArchiveMember>> +createNewArchiveMembers(CopyConfig &Config, const Archive &Ar) { std::vector<NewArchiveMember> NewArchiveMembers; Error Err = Error::success(); for (const Archive::Child &Child : Ar.children(Err)) { @@ -166,7 +175,7 @@ static Error executeObjcopyOnArchive(CopyConfig &Config, const Archive &Ar) { MemBuffer MB(ChildNameOrErr.get()); if (Error E = executeObjcopyOnBinary(Config, *ChildOrErr->get(), MB)) - return E; + return std::move(E); Expected<NewArchiveMember> Member = NewArchiveMember::getOldMember(Child, Config.DeterministicArchives); @@ -178,8 +187,19 @@ static Error executeObjcopyOnArchive(CopyConfig &Config, const Archive &Ar) { } if (Err) return createFileError(Config.InputFilename, std::move(Err)); + return std::move(NewArchiveMembers); +} + +} // end namespace objcopy +} // end namespace llvm - return deepWriteArchive(Config.OutputFilename, NewArchiveMembers, +static Error executeObjcopyOnArchive(CopyConfig &Config, + const object::Archive &Ar) { + Expected<std::vector<NewArchiveMember>> NewArchiveMembersOrErr = + createNewArchiveMembers(Config, Ar); + if (!NewArchiveMembersOrErr) + return NewArchiveMembersOrErr.takeError(); + return deepWriteArchive(Config.OutputFilename, *NewArchiveMembersOrErr, Ar.hasSymbolTable(), Ar.kind(), Config.DeterministicArchives, Ar.isThin()); } |