[clang] d044dcc - Revert "[clang][IFS] Driver pipeline: generate interface stubs after standard pipeline."
Puyan Lotfi via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 18 23:09:52 PST 2019
Author: Puyan Lotfi
Date: 2019-11-19T02:08:22-05:00
New Revision: d044dcc5e492181b1517347013a780d9eda6c3c3
URL: https://github.com/llvm/llvm-project/commit/d044dcc5e492181b1517347013a780d9eda6c3c3
DIFF: https://github.com/llvm/llvm-project/commit/d044dcc5e492181b1517347013a780d9eda6c3c3.diff
LOG: Revert "[clang][IFS] Driver pipeline: generate interface stubs after standard pipeline."
This reverts commit 58ea00b51fe9b011301484957556872fced7dd08.
Test for .o + .ifs sidecar files is brittle and failing on bots.
Reverting to unblock.
Added:
Modified:
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChains/InterfaceStubs.cpp
clang/lib/Driver/Types.cpp
clang/test/InterfaceStubs/driver-test.c
clang/test/InterfaceStubs/windows.cpp
Removed:
clang/test/InterfaceStubs/driver-test2.c
################################################################################
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 40cada744d05..cdf4a579f431 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -292,6 +292,10 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
(PhaseArg = DAL.getLastArg(options::OPT_emit_ast))) {
FinalPhase = phases::Compile;
+ // clang interface stubs
+ } else if ((PhaseArg = DAL.getLastArg(options::OPT_emit_interface_stubs))) {
+ FinalPhase = phases::IfsMerge;
+
// -S only runs up to the backend.
} else if ((PhaseArg = DAL.getLastArg(options::OPT_S))) {
FinalPhase = phases::Backend;
@@ -3498,68 +3502,6 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
Actions.push_back(
C.MakeAction<IfsMergeJobAction>(MergerInputs, types::TY_Image));
- if (Arg *A = Args.getLastArg(options::OPT_emit_interface_stubs)) {
- llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> PhaseList;
- if (Args.hasArg(options::OPT_c)) {
- llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> CompilePhaseList;
- types::getCompilationPhases(types::TY_IFS_CPP, CompilePhaseList);
- llvm::copy_if(PhaseList, std::back_inserter(CompilePhaseList),
- [&](phases::ID Phase) { return Phase <= phases::Compile; });
- } else {
- types::getCompilationPhases(types::TY_IFS_CPP, PhaseList);
- }
-
- ActionList MergerInputs;
-
- for (auto &I : Inputs) {
- types::ID InputType = I.first;
- const Arg *InputArg = I.second;
-
- // Currently clang and the llvm assembler do not support generating symbol
- // stubs from assembly, so we skip the input on asm files. For ifs files
- // we rely on the normal pipeline setup in the pipeline setup code above.
- if (InputType == types::TY_IFS || InputType == types::TY_PP_Asm ||
- InputType == types::TY_Asm)
- continue;
-
- Action *Current = C.MakeAction<InputAction>(*InputArg, InputType);
-
- for (auto Phase : PhaseList) {
- switch (Phase) {
- default:
- llvm_unreachable(
- "IFS Pipeline can only consist of Compile followed by IfsMerge.");
- case phases::Compile: {
- // Only IfsMerge (llvm-ifs) can handle .o files by looking for ifs
- // files where the .o file is located. The compile action can not
- // handle this.
- if (InputType == types::TY_Object)
- break;
-
- Current = C.MakeAction<CompileJobAction>(Current, types::TY_IFS_CPP);
- break;
- }
- case phases::IfsMerge: {
- assert(Phase == PhaseList.back() &&
- "merging must be final compilation step.");
- MergerInputs.push_back(Current);
- Current = nullptr;
- break;
- }
- }
- }
-
- // If we ended with something, add to the output list.
- if (Current)
- Actions.push_back(Current);
- }
-
- // Add an interface stubs merge action if necessary.
- if (!MergerInputs.empty())
- Actions.push_back(
- C.MakeAction<IfsMergeJobAction>(MergerInputs, types::TY_Image));
- }
-
// If --print-supported-cpus, -mcpu=? or -mtune=? is specified, build a custom
// Compile phase that prints out supported cpu models and quits.
if (Arg *A = Args.getLastArg(options::OPT_print_supported_cpus)) {
@@ -3661,6 +3603,8 @@ Action *Driver::ConstructPhaseAction(
return C.MakeAction<CompileJobAction>(Input, types::TY_ModuleFile);
if (Args.hasArg(options::OPT_verify_pch))
return C.MakeAction<VerifyPCHJobAction>(Input, types::TY_Nothing);
+ if (Args.hasArg(options::OPT_emit_interface_stubs))
+ return C.MakeAction<CompileJobAction>(Input, types::TY_IFS_CPP);
return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC);
}
case phases::Backend: {
@@ -3689,16 +3633,11 @@ void Driver::BuildJobs(Compilation &C) const {
Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
// It is an error to provide a -o option if we are making multiple output
- // files. There is one exception, IfsMergeJob: when generating interface stubs
- // enabled we want to be able to generate the stub file at the same time that
- // we generate the real library/a.out. So when a .o, .so, etc are the output,
- // with clang interface stubs there will also be a .ifs and .ifso at the same
- // location.
+ // files.
if (FinalOutput) {
unsigned NumOutputs = 0;
for (const Action *A : C.getActions())
- if (A->getType() != types::TY_Nothing &&
- A->getKind() != Action::IfsMergeJobClass)
+ if (A->getType() != types::TY_Nothing)
++NumOutputs;
if (NumOutputs > 1) {
diff --git a/clang/lib/Driver/ToolChains/InterfaceStubs.cpp b/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
index b57602cd3624..6677843b2c53 100644
--- a/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
+++ b/clang/lib/Driver/ToolChains/InterfaceStubs.cpp
@@ -9,7 +9,6 @@
#include "InterfaceStubs.h"
#include "CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "llvm/Support/Path.h"
namespace clang {
namespace driver {
@@ -22,36 +21,13 @@ void Merger::ConstructJob(Compilation &C, const JobAction &JA,
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(Args.getLastArg(options::OPT_emit_merged_ifs)
+ ? "write-ifs"
+ : "write-bin");
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 += ".ifso";
- }
-
- 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) {
- 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()));
- }
-
+ CmdArgs.push_back(Output.getFilename());
+ for (const auto &Input : Inputs)
+ CmdArgs.push_back(Input.getFilename());
C.addCommand(std::make_unique<Command>(JA, *this, Args.MakeArgString(Merger),
CmdArgs, Inputs));
}
diff --git a/clang/lib/Driver/Types.cpp b/clang/lib/Driver/Types.cpp
index 7d83be2521e7..0e14e3d63fab 100644
--- a/clang/lib/Driver/Types.cpp
+++ b/clang/lib/Driver/Types.cpp
@@ -330,6 +330,22 @@ void types::getCompilationPhases(const clang::driver::Driver &Driver,
llvm::copy_if(PhaseList, std::back_inserter(P),
[](phases::ID Phase) { return Phase <= phases::Precompile; });
+ // Treat Interface Stubs like its own compilation mode.
+ else if (DAL.getLastArg(options::OPT_emit_interface_stubs)) {
+ llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> IfsModePhaseList;
+ llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> &PL = PhaseList;
+ phases::ID LastPhase = phases::IfsMerge;
+ if (Id != types::TY_IFS) {
+ if (DAL.hasArg(options::OPT_c))
+ LastPhase = phases::Compile;
+ PL = IfsModePhaseList;
+ types::getCompilationPhases(types::TY_IFS_CPP, PL);
+ }
+ llvm::copy_if(PL, std::back_inserter(P), [&](phases::ID Phase) {
+ return Phase <= LastPhase;
+ });
+ }
+
// -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
else if (DAL.getLastArg(options::OPT_fsyntax_only) ||
DAL.getLastArg(options::OPT_print_supported_cpus) ||
diff --git a/clang/test/InterfaceStubs/driver-test.c b/clang/test/InterfaceStubs/driver-test.c
index bb2868f6df03..d4e50295411a 100644
--- a/clang/test/InterfaceStubs/driver-test.c
+++ b/clang/test/InterfaceStubs/driver-test.c
@@ -1,13 +1,11 @@
// REQUIRES: x86-registered-target
-// RUN: %clang -target x86_64-unknown-linux-gnu -x c -o %t1 -emit-interface-stubs %s %S/object.c %S/weak.cpp
-// RUN: llvm-nm %t1 2>&1 | FileCheck %s
-// RUN: llvm-nm %t1.ifso 2>&1 | FileCheck %s
+// RUN: %clang -target x86_64-unknown-linux-gnu -x c -o %t1.so -emit-interface-stubs %s %S/object.c %S/weak.cpp && \
+// RUN: llvm-nm %t1.so 2>&1 | FileCheck --check-prefix=CHECK-IFS %s
-// CHECK-DAG: data
-// CHECK-DAG: foo
-// CHECK-DAG: strongFunc
-// CHECK-DAG: weakFunc
+// CHECK-IFS-DAG: data
+// CHECK-IFS-DAG: foo
+// CHECK-IFS-DAG: strongFunc
+// CHECK-IFS-DAG: weakFunc
int foo(int bar) { return 42 + 1844; }
-int main() { return foo(23); }
diff --git a/clang/test/InterfaceStubs/driver-test2.c b/clang/test/InterfaceStubs/driver-test2.c
deleted file mode 100644
index f0f889a799dd..000000000000
--- a/clang/test/InterfaceStubs/driver-test2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-// REQUIRES: x86-registered-target
-
-// RUN: %clang -target x86_64-unknown-linux-gnu -c -emit-interface-stubs \
-// RUN: %s %S/object.c %S/weak.cpp
-// RUN: %clang -emit-interface-stubs -emit-merged-ifs \
-// RUN: driver-test2.o object.o weak.o -S -o - | FileCheck %s
-
-// CHECK-DAG: data
-// CHECK-DAG: bar
-// CHECK-DAG: strongFunc
-// CHECK-DAG: weakFunc
-
-int bar(int a) { return a; }
-int main() { return 0; }
diff --git a/clang/test/InterfaceStubs/windows.cpp b/clang/test/InterfaceStubs/windows.cpp
index c81c702861e4..9ccb771a2f39 100644
--- a/clang/test/InterfaceStubs/windows.cpp
+++ b/clang/test/InterfaceStubs/windows.cpp
@@ -1,7 +1,6 @@
// REQUIRES: x86-registered-target
// RUN: %clang_cc1 -triple x86_64-windows-msvc -o - %s -emit-interface-stubs | FileCheck -check-prefix=CHECK-CC1 %s
-// RUN: %clang -target x86_64-windows-msvc -o - %s -emit-interface-stubs -emit-merged-ifs -S | FileCheck -check-prefix=CHECK-IFS %s
-// note: -S is added here to prevent clang from invoking link.exe
+// RUN: %clang -target x86_64-windows-msvc -o - %s -emit-interface-stubs -emit-merged-ifs | FileCheck -check-prefix=CHECK-IFS %s
// CHECK-CC1: Symbols:
// CHECK-CC1-NEXT: ?helloWindowsMsvc@@YAHXZ
More information about the cfe-commits
mailing list