mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-10 13:36:09 +00:00

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
65 lines
2.6 KiB
C++
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
|