| //===- Objcopy.cpp --------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ObjCopy/ObjCopy.h" | |
| #include "llvm/ObjCopy/COFF/COFFConfig.h" | |
| #include "llvm/ObjCopy/COFF/COFFObjcopy.h" | |
| #include "llvm/ObjCopy/DXContainer/DXContainerConfig.h" | |
| #include "llvm/ObjCopy/DXContainer/DXContainerObjcopy.h" | |
| #include "llvm/ObjCopy/ELF/ELFConfig.h" | |
| #include "llvm/ObjCopy/ELF/ELFObjcopy.h" | |
| #include "llvm/ObjCopy/MachO/MachOConfig.h" | |
| #include "llvm/ObjCopy/MachO/MachOObjcopy.h" | |
| #include "llvm/ObjCopy/MultiFormatConfig.h" | |
| #include "llvm/ObjCopy/XCOFF/XCOFFConfig.h" | |
| #include "llvm/ObjCopy/XCOFF/XCOFFObjcopy.h" | |
| #include "llvm/ObjCopy/wasm/WasmConfig.h" | |
| #include "llvm/ObjCopy/wasm/WasmObjcopy.h" | |
| #include "llvm/Object/COFF.h" | |
| #include "llvm/Object/DXContainer.h" | |
| #include "llvm/Object/ELFObjectFile.h" | |
| #include "llvm/Object/Error.h" | |
| #include "llvm/Object/MachO.h" | |
| #include "llvm/Object/MachOUniversal.h" | |
| #include "llvm/Object/Wasm.h" | |
| #include "llvm/Object/XCOFFObjectFile.h" | |
| using namespace llvm; | |
| using namespace llvm::object; | |
| StringRef objcopy::getObjectFormatName(const object::Binary &B) { | |
| if (const auto *OF = dyn_cast<ObjectFile>(&B)) | |
| return OF->getFileFormatName(); | |
| return {}; | |
| } | |
| void objcopy::printCopyMessage(StringRef InPath, StringRef InFormatName, | |
| StringRef OutPath, StringRef OutFormatName) { | |
| if (OutFormatName.empty()) | |
| OutFormatName = InFormatName; | |
| outs() << "copy from '" << InPath << "' [" << InFormatName << "] to '" | |
| << OutPath << "' [" << OutFormatName << "]\n"; | |
| } | |
| /// The function executeObjcopyOnBinary does the dispatch based on the format | |
| /// of the input binary (ELF, MachO or COFF). | |
| Error objcopy::executeObjcopyOnBinary(const MultiFormatConfig &Config, | |
| object::Binary &In, raw_ostream &Out) { | |
| if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) { | |
| Expected<const ELFConfig &> ELFConfig = Config.getELFConfig(); | |
| if (!ELFConfig) | |
| return ELFConfig.takeError(); | |
| return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig, | |
| *ELFBinary, Out); | |
| } | |
| if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) { | |
| Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig(); | |
| if (!COFFConfig) | |
| return COFFConfig.takeError(); | |
| return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig, | |
| *COFFBinary, Out); | |
| } | |
| if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) { | |
| Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig(); | |
| if (!MachOConfig) | |
| return MachOConfig.takeError(); | |
| return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig, | |
| *MachOBinary, Out); | |
| } | |
| if (auto *MachOUniversalBinary = | |
| dyn_cast<object::MachOUniversalBinary>(&In)) { | |
| return macho::executeObjcopyOnMachOUniversalBinary( | |
| Config, *MachOUniversalBinary, Out); | |
| } | |
| if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) { | |
| Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig(); | |
| if (!WasmConfig) | |
| return WasmConfig.takeError(); | |
| return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(), | |
| *WasmConfig, *WasmBinary, Out); | |
| } | |
| if (auto *XCOFFBinary = dyn_cast<object::XCOFFObjectFile>(&In)) { | |
| Expected<const XCOFFConfig &> XCOFFConfig = Config.getXCOFFConfig(); | |
| if (!XCOFFConfig) | |
| return XCOFFConfig.takeError(); | |
| return xcoff::executeObjcopyOnBinary(Config.getCommonConfig(), *XCOFFConfig, | |
| *XCOFFBinary, Out); | |
| } | |
| if (auto *DXContainerBinary = dyn_cast<object::DXContainerObjectFile>(&In)) { | |
| Expected<const DXContainerConfig &> DXContainerConfig = | |
| Config.getDXContainerConfig(); | |
| if (!DXContainerConfig) | |
| return DXContainerConfig.takeError(); | |
| return dxbc::executeObjcopyOnBinary( | |
| Config.getCommonConfig(), *DXContainerConfig, *DXContainerBinary, Out); | |
| } | |
| return createStringError(object_error::invalid_file_type, | |
| "unsupported object file format"); | |
| } |