brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 152600f Raw
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