//===- 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");
}
