1 //===--- InterfaceStubs.cpp - Base InterfaceStubs Implementations C++ ---===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "InterfaceStubs.h"
10 #include "CommonArgs.h"
11 #include "clang/Driver/Compilation.h"
12 #include "llvm/Support/Path.h"
18 void Merger::ConstructJob(Compilation
&C
, const JobAction
&JA
,
19 const InputInfo
&Output
, const InputInfoList
&Inputs
,
20 const llvm::opt::ArgList
&Args
,
21 const char *LinkingOutput
) const {
22 std::string Merger
= getToolChain().GetProgramPath(getShortName());
23 // TODO: Use IFS library directly in the future.
24 llvm::opt::ArgStringList CmdArgs
;
25 CmdArgs
.push_back("--input-format=IFS");
26 const bool WriteBin
= !Args
.getLastArg(options::OPT_emit_merged_ifs
);
27 CmdArgs
.push_back(WriteBin
? "--output-format=ELF" : "--output-format=IFS");
28 CmdArgs
.push_back("-o");
30 // Normally we want to write to a side-car file ending in ".ifso" so for
31 // example if `clang -emit-interface-stubs -shared -o libhello.so` were
32 // invoked then we would like to get libhello.so and libhello.ifso. If the
33 // stdout stream is given as the output file (ie `-o -`), that is the one
34 // exception where we will just append to the same filestream as the normal
36 SmallString
<128> OutputFilename(Output
.getFilename());
37 if (OutputFilename
!= "-") {
38 if (Args
.hasArg(options::OPT_shared
))
39 llvm::sys::path::replace_extension(OutputFilename
,
40 (WriteBin
? "ifso" : "ifs"));
42 OutputFilename
+= (WriteBin
? ".ifso" : ".ifs");
45 CmdArgs
.push_back(Args
.MakeArgString(OutputFilename
.c_str()));
47 // Here we append the input files. If the input files are object files, then
48 // we look for .ifs files present in the same location as the object files.
49 for (const auto &Input
: Inputs
) {
50 if (!Input
.isFilename())
52 SmallString
<128> InputFilename(Input
.getFilename());
53 if (Input
.getType() == types::TY_Object
)
54 llvm::sys::path::replace_extension(InputFilename
, ".ifs");
55 CmdArgs
.push_back(Args
.MakeArgString(InputFilename
.c_str()));
58 C
.addCommand(std::make_unique
<Command
>(JA
, *this, ResponseFileSupport::None(),
59 Args
.MakeArgString(Merger
), CmdArgs
,
62 } // namespace ifstool