//===- 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/CommonConfig.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/wasm/WasmConfig.h" #include "llvm/ObjCopy/wasm/WasmObjcopy.h" #include "llvm/ObjCopy/XCOFF/XCOFFConfig.h" #include "llvm/ObjCopy/XCOFF/XCOFFObjcopy.h" #include "llvm/Object/COFF.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" #include "llvm/Support/SmallVectorMemoryBuffer.h" namespace llvm { namespace objcopy { using namespace llvm::object; /// The function executeObjcopyOnBinary does the dispatch based on the format /// of the input binary (ELF, MachO or COFF). Error executeObjcopyOnBinary(const MultiFormatConfig &Config, object::Binary &In, raw_ostream &Out) { if (auto *ELFBinary = dyn_cast(&In)) { Expected ELFConfig = Config.getELFConfig(); if (!ELFConfig) return ELFConfig.takeError(); return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig, *ELFBinary, Out); } if (auto *COFFBinary = dyn_cast(&In)) { Expected COFFConfig = Config.getCOFFConfig(); if (!COFFConfig) return COFFConfig.takeError(); return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig, *COFFBinary, Out); } if (auto *MachOBinary = dyn_cast(&In)) { Expected MachOConfig = Config.getMachOConfig(); if (!MachOConfig) return MachOConfig.takeError(); return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig, *MachOBinary, Out); } if (auto *MachOUniversalBinary = dyn_cast(&In)) { return macho::executeObjcopyOnMachOUniversalBinary( Config, *MachOUniversalBinary, Out); } if (auto *WasmBinary = dyn_cast(&In)) { Expected WasmConfig = Config.getWasmConfig(); if (!WasmConfig) return WasmConfig.takeError(); return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(), *WasmConfig, *WasmBinary, Out); } if (auto *XCOFFBinary = dyn_cast(&In)) { Expected XCOFFConfig = Config.getXCOFFConfig(); if (!XCOFFConfig) return XCOFFConfig.takeError(); return xcoff::executeObjcopyOnBinary(Config.getCommonConfig(), *XCOFFConfig, *XCOFFBinary, Out); } return createStringError(object_error::invalid_file_type, "unsupported object file format"); } } // end namespace objcopy } // end namespace llvm