//===- ConfigManager.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/ConfigManager.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"

using namespace llvm;
using namespace llvm::objcopy;

Expected<const ELFConfig &> ConfigManager::getELFConfig() const {
  if (!Common.ExtractSection.empty())
    return createStringError(llvm::errc::invalid_argument,
                             "option is not supported for ELF");
  return ELF;
}

Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
  if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
      !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
      !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
      !Common.SymbolsToLocalize.empty() || !Common.SymbolsToWeaken.empty() ||
      !Common.SymbolsToKeepGlobal.empty() || !Common.SectionsToRename.empty() ||
      !Common.SetSectionAlignment.empty() || !Common.SetSectionType.empty() ||
      Common.ExtractDWO || Common.StripDWO || Common.StripNonAlloc ||
      Common.StripSections || Common.Weaken ||
      Common.CompressionType != DebugCompressionType::None ||
      !Common.compressSections.empty() || Common.DecompressDebugSections ||
      Common.DiscardMode == DiscardType::Locals ||
      !Common.SymbolsToAdd.empty() || Common.GapFill != 0 ||
      Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 ||
      !Common.ChangeSectionAddress.empty() || !Common.ExtractSection.empty())
    return createStringError(llvm::errc::invalid_argument,
                             "option is not supported for COFF");

  return COFF;
}

Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
  if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
      !Common.SymbolsPrefixRemove.empty() ||
      !Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
      !Common.SymbolsToKeep.empty() || !Common.SectionsToRename.empty() ||
      !Common.UnneededSymbolsToRemove.empty() ||
      !Common.SetSectionAlignment.empty() || !Common.SetSectionFlags.empty() ||
      !Common.SetSectionType.empty() || Common.ExtractDWO ||
      Common.PreserveDates || Common.StripAllGNU || Common.StripDWO ||
      Common.StripNonAlloc || Common.StripSections ||
      Common.CompressionType != DebugCompressionType::None ||
      !Common.compressSections.empty() || Common.DecompressDebugSections ||
      Common.StripUnneeded || Common.DiscardMode == DiscardType::Locals ||
      !Common.SymbolsToAdd.empty() || Common.GapFill != 0 ||
      Common.PadTo != 0 || Common.ChangeSectionLMAValAll != 0 ||
      !Common.ChangeSectionAddress.empty() || !Common.ExtractSection.empty())
    return createStringError(llvm::errc::invalid_argument,
                             "option is not supported for MachO");

  return MachO;
}

Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
  if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
      !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
      !Common.AllocSectionsPrefix.empty() ||
      Common.DiscardMode != DiscardType::None || !Common.SymbolsToAdd.empty() ||
      !Common.SymbolsToGlobalize.empty() || !Common.SymbolsToLocalize.empty() ||
      !Common.SymbolsToKeep.empty() || !Common.SymbolsToRemove.empty() ||
      !Common.UnneededSymbolsToRemove.empty() ||
      !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
      !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
      !Common.SetSectionFlags.empty() || !Common.SetSectionType.empty() ||
      !Common.SymbolsToRename.empty() ||
      Common.CompressionType != DebugCompressionType::None ||
      !Common.compressSections.empty() || Common.DecompressDebugSections ||
      Common.GapFill != 0 || Common.PadTo != 0 ||
      Common.ChangeSectionLMAValAll != 0 ||
      !Common.ChangeSectionAddress.empty() || !Common.ExtractSection.empty())
    return createStringError(llvm::errc::invalid_argument,
                             "only flags for section dumping, removal, and "
                             "addition are supported");

  return Wasm;
}

Expected<const XCOFFConfig &> ConfigManager::getXCOFFConfig() const {
  if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
      !Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
      !Common.SymbolsPrefixRemove.empty() || !Common.SymbolsToSkip.empty() ||
      !Common.AllocSectionsPrefix.empty() ||
      Common.DiscardMode != DiscardType::None || !Common.AddSection.empty() ||
      !Common.DumpSection.empty() || !Common.SymbolsToAdd.empty() ||
      !Common.KeepSection.empty() || !Common.OnlySection.empty() ||
      !Common.ToRemove.empty() || !Common.SymbolsToGlobalize.empty() ||
      !Common.SymbolsToKeep.empty() || !Common.SymbolsToLocalize.empty() ||
      !Common.SymbolsToRemove.empty() ||
      !Common.UnneededSymbolsToRemove.empty() ||
      !Common.SymbolsToWeaken.empty() || !Common.SymbolsToKeepGlobal.empty() ||
      !Common.SectionsToRename.empty() || !Common.SetSectionAlignment.empty() ||
      !Common.SetSectionFlags.empty() || !Common.SetSectionType.empty() ||
      !Common.SymbolsToRename.empty() || Common.ExtractDWO ||
      Common.ExtractMainPartition || Common.OnlyKeepDebug ||
      Common.PreserveDates || Common.StripAllGNU || Common.StripDWO ||
      Common.StripDebug || Common.StripNonAlloc || Common.StripSections ||
      Common.Weaken || Common.StripUnneeded ||
      Common.CompressionType != DebugCompressionType::None ||
      !Common.compressSections.empty() || Common.DecompressDebugSections ||
      Common.GapFill != 0 || Common.PadTo != 0 ||
      Common.ChangeSectionLMAValAll != 0 ||
      !Common.ChangeSectionAddress.empty() || !Common.ExtractSection.empty()) {
    return createStringError(
        llvm::errc::invalid_argument,
        "no flags are supported yet, only basic copying is allowed");
  }

  return XCOFF;
}

Expected<const DXContainerConfig &>
ConfigManager::getDXContainerConfig() const {
  // All other flags are either supported or not applicable for DXContainer
  // object files and will be silently ignored.
  if (!Common.AddGnuDebugLink.empty() || !Common.SplitDWO.empty() ||
      !Common.AllocSectionsPrefix.empty() ||
      Common.DiscardMode != DiscardType::None || !Common.AddSection.empty() ||
      !Common.KeepSection.empty() || !Common.SectionsToRename.empty() ||
      !Common.SetSectionAlignment.empty() || !Common.SetSectionFlags.empty() ||
      !Common.SetSectionType.empty() || Common.ExtractDWO ||
      Common.OnlyKeepDebug || Common.StripAllGNU || Common.StripDWO ||
      Common.StripDebug || Common.StripNonAlloc || Common.StripSections ||
      Common.StripUnneeded ||
      Common.CompressionType != DebugCompressionType::None ||
      !Common.compressSections.empty() || Common.DecompressDebugSections ||
      Common.GapFill != 0 || Common.PadTo != 0 ||
      Common.ChangeSectionLMAValAll != 0 ||
      !Common.ChangeSectionAddress.empty()) {
    return createStringError(llvm::errc::invalid_argument,
                             "option is not supported for DXContainer");
  }
  return DXContainer;
}
