Path: blob/main/contrib/llvm-project/llvm/lib/ObjCopy/ObjCopy.cpp
35233 views
//===- Objcopy.cpp --------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ObjCopy/ObjCopy.h"9#include "llvm/ObjCopy/COFF/COFFConfig.h"10#include "llvm/ObjCopy/COFF/COFFObjcopy.h"11#include "llvm/ObjCopy/CommonConfig.h"12#include "llvm/ObjCopy/ELF/ELFConfig.h"13#include "llvm/ObjCopy/ELF/ELFObjcopy.h"14#include "llvm/ObjCopy/MachO/MachOConfig.h"15#include "llvm/ObjCopy/MachO/MachOObjcopy.h"16#include "llvm/ObjCopy/MultiFormatConfig.h"17#include "llvm/ObjCopy/wasm/WasmConfig.h"18#include "llvm/ObjCopy/wasm/WasmObjcopy.h"19#include "llvm/ObjCopy/XCOFF/XCOFFConfig.h"20#include "llvm/ObjCopy/XCOFF/XCOFFObjcopy.h"21#include "llvm/Object/COFF.h"22#include "llvm/Object/ELFObjectFile.h"23#include "llvm/Object/Error.h"24#include "llvm/Object/MachO.h"25#include "llvm/Object/MachOUniversal.h"26#include "llvm/Object/Wasm.h"27#include "llvm/Object/XCOFFObjectFile.h"28#include "llvm/Support/SmallVectorMemoryBuffer.h"2930namespace llvm {31namespace objcopy {3233using namespace llvm::object;3435/// The function executeObjcopyOnBinary does the dispatch based on the format36/// of the input binary (ELF, MachO or COFF).37Error executeObjcopyOnBinary(const MultiFormatConfig &Config,38object::Binary &In, raw_ostream &Out) {39if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In)) {40Expected<const ELFConfig &> ELFConfig = Config.getELFConfig();41if (!ELFConfig)42return ELFConfig.takeError();4344return elf::executeObjcopyOnBinary(Config.getCommonConfig(), *ELFConfig,45*ELFBinary, Out);46}47if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In)) {48Expected<const COFFConfig &> COFFConfig = Config.getCOFFConfig();49if (!COFFConfig)50return COFFConfig.takeError();5152return coff::executeObjcopyOnBinary(Config.getCommonConfig(), *COFFConfig,53*COFFBinary, Out);54}55if (auto *MachOBinary = dyn_cast<object::MachOObjectFile>(&In)) {56Expected<const MachOConfig &> MachOConfig = Config.getMachOConfig();57if (!MachOConfig)58return MachOConfig.takeError();5960return macho::executeObjcopyOnBinary(Config.getCommonConfig(), *MachOConfig,61*MachOBinary, Out);62}63if (auto *MachOUniversalBinary =64dyn_cast<object::MachOUniversalBinary>(&In)) {65return macho::executeObjcopyOnMachOUniversalBinary(66Config, *MachOUniversalBinary, Out);67}68if (auto *WasmBinary = dyn_cast<object::WasmObjectFile>(&In)) {69Expected<const WasmConfig &> WasmConfig = Config.getWasmConfig();70if (!WasmConfig)71return WasmConfig.takeError();7273return objcopy::wasm::executeObjcopyOnBinary(Config.getCommonConfig(),74*WasmConfig, *WasmBinary, Out);75}76if (auto *XCOFFBinary = dyn_cast<object::XCOFFObjectFile>(&In)) {77Expected<const XCOFFConfig &> XCOFFConfig = Config.getXCOFFConfig();78if (!XCOFFConfig)79return XCOFFConfig.takeError();8081return xcoff::executeObjcopyOnBinary(Config.getCommonConfig(), *XCOFFConfig,82*XCOFFBinary, Out);83}84return createStringError(object_error::invalid_file_type,85"unsupported object file format");86}8788} // end namespace objcopy89} // end namespace llvm909192