llvm-project/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
Serge Pavlov 70bf35070a [Driver] Add output file to properties of Command
Object of class `Command` contains various properties of a command to
execute, but output file was missed from them. This change adds this
property. It is required for reporting consumed time and memory implemented
in D78903 and may be used in other cases too.

Differential Revision: https://reviews.llvm.org/D78902
2020-10-08 18:23:39 +07:00

65 lines
2.6 KiB
C++

//===--- 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