96 lines · cpp
1//===- Objcopy.cpp --------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ObjCopy/ObjCopy.h"10#include "llvm/ObjCopy/COFF/COFFConfig.h"11#include "llvm/ObjCopy/COFF/COFFObjcopy.h"12#include "llvm/ObjCopy/DXContainer/DXContainerConfig.h"13#include "llvm/ObjCopy/DXContainer/DXContainerObjcopy.h"14#include "llvm/ObjCopy/ELF/ELFConfig.h"15#include "llvm/ObjCopy/ELF/ELFObjcopy.h"16#include "llvm/ObjCopy/MachO/MachOConfig.h"17#include "llvm/ObjCopy/MachO/MachOObjcopy.h"18#include "llvm/ObjCopy/MultiFormatConfig.h"19#include "llvm/ObjCopy/XCOFF/XCOFFConfig.h"20#include "llvm/ObjCopy/XCOFF/XCOFFObjcopy.h"21#include "llvm/ObjCopy/wasm/WasmConfig.h"22#include "llvm/ObjCopy/wasm/WasmObjcopy.h"23#include "llvm/Object/COFF.h"24#include "llvm/Object/DXContainer.h"25#include "llvm/Object/ELFObjectFile.h"26#include "llvm/Object/Error.h"27#include "llvm/Object/MachO.h"28#include "llvm/Object/MachOUniversal.h"29#include "llvm/Object/Wasm.h"30#include "llvm/Object/XCOFFObjectFile.h"31 32using namespace llvm;33using namespace llvm::object;34 35/// The function executeObjcopyOnBinary does the dispatch based on the format36/// of the input binary (ELF, MachO or COFF).37Error objcopy::executeObjcopyOnBinary(const MultiFormatConfig &Config,38 object::Binary &In, raw_ostream &Out) {39 if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) {40 Expected<const ELFConfig &> ELFConfig = Config.getELFConfig();41 if (!ELFConfig)42 return ELFConfig.takeError();43 44 return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig,45 *ELFBinary, Out);46 }47 if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) {48 Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig();49 if (!COFFConfig)50 return COFFConfig.takeError();51 52 return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig,53 *COFFBinary, Out);54 }55 if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) {56 Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig();57 if (!MachOConfig)58 return MachOConfig.takeError();59 60 return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig,61 *MachOBinary, Out);62 }63 if (auto *MachOUniversalBinary =64 dyn_cast<object::MachOUniversalBinary>(&In)) {65 return macho::executeObjcopyOnMachOUniversalBinary(66 Config, *MachOUniversalBinary, Out);67 }68 if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) {69 Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig();70 if (!WasmConfig)71 return WasmConfig.takeError();72 73 return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(),74 *WasmConfig, *WasmBinary, Out);75 }76 if (auto *XCOFFBinary = dyn_cast<object::XCOFFObjectFile>(&In)) {77 Expected<const XCOFFConfig &> XCOFFConfig = Config.getXCOFFConfig();78 if (!XCOFFConfig)79 return XCOFFConfig.takeError();80 81 return xcoff::executeObjcopyOnBinary(Config.getCommonConfig(), *XCOFFConfig,82 *XCOFFBinary, Out);83 }84 if (auto *DXContainerBinary = dyn_cast<object::DXContainerObjectFile>(&In)) {85 Expected<const DXContainerConfig &> DXContainerConfig =86 Config.getDXContainerConfig();87 if (!DXContainerConfig)88 return DXContainerConfig.takeError();89 90 return dxbc::executeObjcopyOnBinary(91 Config.getCommonConfig(), *DXContainerConfig, *DXContainerBinary, Out);92 }93 return createStringError(object_error::invalid_file_type,94 "unsupported object file format");95}96