diff options
author | Alexander Shaposhnikov <alexshap@fb.com> | 2020-09-28 03:37:21 -0700 |
---|---|---|
committer | Alexander Shaposhnikov <alexshap@fb.com> | 2020-10-05 10:44:28 -0700 |
commit | 32c8435ef70031d7bd3dce48e41bdce65747e123 (patch) | |
tree | 6899ad6f52f2772db1c0995d2667283c50ccbf2a /llvm/tools/llvm-objcopy/llvm-objcopy.cpp | |
parent | b326d4ff946d2061a566a3fcce9f33b484759fe0 (diff) | |
download | llvm-32c8435ef70031d7bd3dce48e41bdce65747e123.zip llvm-32c8435ef70031d7bd3dce48e41bdce65747e123.tar.gz llvm-32c8435ef70031d7bd3dce48e41bdce65747e123.tar.bz2 |
[llvm-objcopy][MachO] Add support for universal binaries
This diff adds support for universal binaries to llvm-objcopy.
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..8cd5857 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 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()); } |