diff --git a/clang/include/clang/Driver/Job.h b/clang/include/clang/Driver/Job.h --- a/clang/include/clang/Driver/Job.h +++ b/clang/include/clang/Driver/Job.h @@ -141,6 +141,9 @@ /// See Command::setEnvironment std::vector Environment; + /// Optional redirection for stdin, stdout, stderr. + std::vector> RedirectFiles; + /// Information on executable run provided by OS. mutable Optional ProcStat; @@ -204,6 +207,8 @@ /// from the parent process will be used. virtual void setEnvironment(llvm::ArrayRef NewEnvironment); + void setRedirectFiles(const std::vector> &Redirects); + void replaceArguments(llvm::opt::ArgStringList List) { Arguments = std::move(List); } diff --git a/clang/lib/Driver/Job.cpp b/clang/lib/Driver/Job.cpp --- a/clang/lib/Driver/Job.cpp +++ b/clang/lib/Driver/Job.cpp @@ -301,6 +301,11 @@ Environment.push_back(nullptr); } +void Command::setRedirectFiles( + const std::vector> &Redirects) { + RedirectFiles = Redirects; +} + void Command::PrintFileNames() const { if (PrintInputFilenames) { for (const auto &Arg : InputInfoList) @@ -352,6 +357,21 @@ } auto Args = llvm::toStringRefArray(Argv.data()); + + if (!RedirectFiles.empty()) { + std::vector> RedirectFilesOptional; + for (const auto &Ele : RedirectFiles) + if (Ele) + RedirectFilesOptional.push_back(Optional(*Ele)); + else + RedirectFilesOptional.push_back(None); + + return llvm::sys::ExecuteAndWait(Executable, Args, Env, + makeArrayRef(RedirectFilesOptional), + /*secondsToWait=*/0, /*memoryLimit=*/0, + ErrMsg, ExecutionFailed, &ProcStat); + } + return llvm::sys::ExecuteAndWait(Executable, Args, Env, Redirects, /*secondsToWait*/ 0, /*memoryLimit*/ 0, ErrMsg, ExecutionFailed, &ProcStat); diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp --- a/clang/lib/Driver/ToolChains/AIX.cpp +++ b/clang/lib/Driver/ToolChains/AIX.cpp @@ -77,7 +77,7 @@ // Determine whether there are any linker options that supply an export list // (or equivalent information about what to export) being sent to the linker. static bool hasExportListLinkerOpts(const ArgStringList &CmdArgs) { - for (size_t i = 0; i < CmdArgs.size(); ++i) { + for (size_t i = 0, Size = CmdArgs.size(); i < Size; ++i) { llvm::StringRef ArgString(CmdArgs[i]); if (ArgString.startswith("-bE:") || ArgString.startswith("-bexport:") || @@ -194,7 +194,7 @@ const char *CreateExportListExec = Args.MakeArgString( llvm::sys::path::parent_path(ToolChain.getDriver().ClangExecutable) + - "/CreateExportList"); + "/llvm-nm"); ArgStringList CreateExportCmdArgs; auto CreateExportListPath = @@ -202,13 +202,12 @@ const char *ExportList = C.addTempFile(C.getArgs().MakeArgString(CreateExportListPath)); - CreateExportCmdArgs.push_back(ExportList); - for (const auto &II : Inputs) { if (II.isFilename()) CreateExportCmdArgs.push_back(II.getFilename()); } + CreateExportCmdArgs.push_back("--export-symbols"); CreateExportCmdArgs.push_back("-X"); if (IsArch32Bit) { CreateExportCmdArgs.push_back("32"); @@ -217,9 +216,11 @@ CreateExportCmdArgs.push_back("64"); } - C.addCommand(std::make_unique( + auto ExpCommand = std::make_unique( JA, *this, ResponseFileSupport::None(), CreateExportListExec, - CreateExportCmdArgs, Inputs, Output)); + CreateExportCmdArgs, Inputs, Output); + ExpCommand->setRedirectFiles({None, std::string(ExportList), None}); + C.addCommand(std::move(ExpCommand)); CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-bE:") + ExportList)); } diff --git a/clang/test/Driver/aix-ld.c b/clang/test/Driver/aix-ld.c --- a/clang/test/Driver/aix-ld.c +++ b/clang/test/Driver/aix-ld.c @@ -619,10 +619,9 @@ // CHECK-LD32-SHARED: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-SHARED: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD32-SHARED: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD32-SHARED: "{{.*}}CreateExportList" -// CHECK-LD32-SHARED: "[[EXPORTLIST:[^"]+]]" -// CHECK-LD32-SHARED: "-X" -// CHECK-LD32-SHARED: "32" +// CHECK-LD32-SHARED: "{{.*}}llvm-nm" +// CHECK-LD32-SHARED: "--export-symbols" +// CHECK-LD32-SHARED: "-X" "32" // CHECK-LD32-SHARED: "{{.*}}ld{{(.exe)?}}" // CHECK-LD32-SHARED: "-bM:SRE" // CHECK-LD32-SHARED: "-bnoentry" @@ -630,7 +629,6 @@ // CHECK-LD32-SHARED: "-bpT:0x10000000" "-bpD:0x20000000" // CHECK-LD32-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0.o" // CHECK-LD32-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti.o" -// CHECK-LD32-SHARED: "-bE:[[EXPORTLIST]]" // CHECK-LD32-SHARED: "-lc++" // CHECK-LD32-SHARED: "-lc++abi" // CHECK-LD32-SHARED: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}aix{{/|\\\\}}libclang_rt.builtins-powerpc.a" @@ -648,7 +646,7 @@ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: -ccc-install-dir %T/open_xl_aix_install/opt/IBM/openxlC/%open_xl_vrm/bin \ // RUN: -Wl,-bE:input.exp \ -// RUN: | FileCheck -DMASS_VRM=%mass_vrm -DOPEN_XL_VRM=%open_xl_vrm --check-prefix=CHECK-LD32-SHARED-EXPORTS %s +// RUN: | FileCheck --check-prefix=CHECK-LD32-SHARED-EXPORTS %s // Check powerpc-ibm-aix7.1.0.0, 32-bit. -shared with export list (no -Wl, variant). // RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ @@ -658,7 +656,7 @@ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: -ccc-install-dir %T/open_xl_aix_install/opt/IBM/openxlC/%open_xl_vrm/bin \ // RUN: -bE:input.exp \ -// RUN: | FileCheck -DMASS_VRM=%mass_vrm -DOPEN_XL_VRM=%open_xl_vrm --check-prefix=CHECK-LD32-SHARED-EXPORTS %s +// RUN: | FileCheck --check-prefix=CHECK-LD32-SHARED-EXPORTS %s // Check powerpc-ibm-aix7.1.0.0, 32-bit. -shared with export list (-Xlinker variant). // RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ @@ -673,7 +671,7 @@ // CHECK-LD32-SHARED-EXPORTS: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc-ibm-aix7.1.0.0" // CHECK-LD32-SHARED-EXPORTS: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD32-SHARED-EXPORTS: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD32-SHARED-EXPORTS-NOT: "{{.*}}CreateExportList" +// CHECK-LD32-SHARED-EXPORTS-NOT: "{{.*}}llvm-nm" // CHECK-LD32-SHARED-EXPORTS-NOT: "-X" // CHECK-LD32-SHARED-EXPORTS-NOT: "32" // CHECK-LD32-SHARED-EXPORTS: "{{.*}}ld{{(.exe)?}}" @@ -701,10 +699,9 @@ // CHECK-LD64-SHARED: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD64-SHARED: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD64-SHARED: "{{.*}}CreateExportList" -// CHECK-LD64-SHARED: "[[EXPORTLIST:[^"]+]]" -// CHECK-LD64-SHARED: "-X" -// CHECK-LD64-SHARED: "64" +/ /CHECK-LD64-SHARED: "{{.*}}llvm-nm" +// CHECK-LD64-SHARED: "--export-symbols" +// CHECK-LD64-SHARED: "-X" "64" // CHECK-LD64-SHARED: "{{.*}}ld{{(.exe)?}}" // CHECK-LD64-SHARED: "-bM:SRE" // CHECK-LD64-SHARED: "-bnoentry" @@ -712,7 +709,6 @@ // CHECK-LD64-SHARED: "-bpT:0x100000000" "-bpD:0x110000000" // CHECK-LD64-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crt0_64.o" // CHECK-LD64-SHARED-NOT: "[[SYSROOT]]/usr/lib{{/|\\\\}}crti_64.o" -// CHECK-LD64-SHARED: "-bE:[[EXPORTLIST]]" // CHECK-LD64-SHARED: "-lc++" // CHECK-LD64-SHARED: "-lc++abi" // CHECK-LD64-SHARED: "[[RESOURCE_DIR]]{{/|\\\\}}lib{{/|\\\\}}aix{{/|\\\\}}libclang_rt.builtins-powerpc64.a" @@ -751,7 +747,7 @@ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: -ccc-install-dir %T/open_xl_aix_install/opt/IBM/openxlC/%open_xl_vrm/bin \ // RUN: -Wl,-bE:input.exp \ -// RUN: | FileCheck -DMASS_VRM=%mass_vrm -DOPEN_XL_VRM=%open_xl_vrm --check-prefix=CHECK-LD64-SHARED-EXPORTS %s +// RUN: | FileCheck --check-prefix=CHECK-LD64-SHARED-EXPORTS %s // Check powerpc64-ibm-aix7.1.0.0, 64-bit. -shared with export list (no -Wl, variant). // RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ @@ -761,7 +757,7 @@ // RUN: --sysroot %S/Inputs/aix_ppc_tree \ // RUN: -ccc-install-dir %T/open_xl_aix_install/opt/IBM/openxlC/%open_xl_vrm/bin \ // RUN: -bE:input.exp \ -// RUN: | FileCheck -DMASS_VRM=%mass_vrm -DOPEN_XL_VRM=%open_xl_vrm --check-prefix=CHECK-LD64-SHARED-EXPORTS %s +// RUN: | FileCheck --check-prefix=CHECK-LD64-SHARED-EXPORTS %s // Check powerpc64-ibm-aix7.1.0.0, 64-bit. -shared with export list (-Xlinker variant). // RUN: %clangxx -x c++ -no-canonical-prefixes %s 2>&1 -### \ @@ -776,7 +772,7 @@ // CHECK-LD64-SHARED-EXPORTS: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED-EXPORTS: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD64-SHARED-EXPORTS: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD64-SHARED-EXPORTS-NOT: "{{.*}}CreateExportList" +// CHECK-LD64-SHARED-EXPORTS-NOT: "{{.*}}llvm-nm" // CHECK-LD64-SHARED-EXPORTS-NOT: "-X" // CHECK-LD64-SHARED-EXPORTS-NOT: "64" // CHECK-LD64-SHARED-EXPORTS: "{{.*}}ld{{(.exe)?}}" @@ -826,7 +822,7 @@ // CHECK-LD64-SHARED-EXPORTS-ALT: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED-EXPORTS-ALT: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD64-SHARED-EXPORTS-ALT: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD64-SHARED-EXPORTS-ALT-NOT: "{{.*}}CreateExportList" +// CHECK-LD64-SHARED-EXPORTS-ALT-NOT: "{{.*}}llvm-nm" // CHECK-LD64-SHARED-EXPORTS-ALT-NOT: "-X" // CHECK-LD64-SHARED-EXPORTS-ALT-NOT: "64" // CHECK-LD64-SHARED-EXPORTS-ALT: "{{.*}}ld{{(.exe)?}}" @@ -903,7 +899,7 @@ // CHECK-LD64-SHARED-EXPALL: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED-EXPALL: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD64-SHARED-EXPALL: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD64-SHARED-EXPALL-NOT: "{{.*}}CreateExportList" +// CHECK-LD64-SHARED-EXPALL-NOT: "{{.*}}llvm-nm" // CHECK-LD64-SHARED-EXPALL-NOT: "-X" // CHECK-LD64-SHARED-EXPALL-NOT: "64" // CHECK-LD64-SHARED-EXPALL: "{{.*}}ld{{(.exe)?}}" @@ -981,7 +977,7 @@ // CHECK-LD64-SHARED-EXPFULL: {{.*}}clang{{.*}}" "-cc1" "-triple" "powerpc64-ibm-aix7.1.0.0" // CHECK-LD64-SHARED-EXPFULL: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-LD64-SHARED-EXPFULL: "-isysroot" "[[SYSROOT:[^"]+]]" -// CHECK-LD64-SHARED-EXPFULL-NOT: "{{.*}}CreateExportList" +// CHECK-LD64-SHARED-EXPFULL-NOT: "{{.*}}llvm-nm" // CHECK-LD64-SHARED-EXPFULL-NOT: "-X" // CHECK-LD64-SHARED-EXPFULL-NOT: "64" // CHECK-LD64-SHARED-EXPFULL: "{{.*}}ld{{(.exe)?}}"