//===---  InterfaceStubs.cpp - Base InterfaceStubs Implementations C++  ---===//
//
// 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 "InterfaceStubs.h"
#include "CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "llvm/Support/Path.h"

namespace clang {
namespace driver {
namespace tools {
namespace ifstool {
void Merger::ConstructJob(Compilation &C, const JobAction &JA,
                          const InputInfo &Output, const InputInfoList &Inputs,
                          const llvm::opt::ArgList &Args,
                          const char *LinkingOutput) const {
  std::string Merger = getToolChain().GetProgramPath(getShortName());
  llvm::opt::ArgStringList CmdArgs;
  CmdArgs.push_back("-action");
  const bool WriteBin = !Args.getLastArg(options::OPT_emit_merged_ifs);
  CmdArgs.push_back(WriteBin ? "write-bin" : "write-ifs");
  CmdArgs.push_back("-o");

  // Normally we want to write to a side-car file ending in ".ifso" so for
  // example if `clang -emit-interface-stubs -shared -o libhello.so` were
  // invoked then we would like to get libhello.so and libhello.ifso. If the
  // stdout stream is given as the output file (ie `-o -`), that is the one
  // exception where we will just append to the same filestream as the normal
  // output.
  SmallString<128> OutputFilename(Output.getFilename());
  if (OutputFilename != "-") {
    if (Args.hasArg(options::OPT_shared))
      llvm::sys::path::replace_extension(OutputFilename,
                                         (WriteBin ? "ifso" : "ifs"));
    else
      OutputFilename += (WriteBin ? ".ifso" : ".ifs");
  }

  CmdArgs.push_back(Args.MakeArgString(OutputFilename.c_str()));

  // Here we append the input files. If the input files are object files, then
  // we look for .ifs files present in the same location as the object files.
  for (const auto &Input : Inputs) {
    if (!Input.isFilename())
      continue;
    SmallString<128> InputFilename(Input.getFilename());
    if (Input.getType() == types::TY_Object)
      llvm::sys::path::replace_extension(InputFilename, ".ifs");
    CmdArgs.push_back(Args.MakeArgString(InputFilename.c_str()));
  }

  C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
                                         Args.MakeArgString(Merger), CmdArgs,
                                         Inputs, Output));
}
} // namespace ifstool
} // namespace tools
} // namespace driver
} // namespace clang
