diff --git a/lib/Driver/UnixToolChains.cpp b/lib/Driver/UnixToolChains.cpp index d2fbc7f0547fe..c66a433859417 100644 --- a/lib/Driver/UnixToolChains.cpp +++ b/lib/Driver/UnixToolChains.cpp @@ -158,15 +158,29 @@ toolchains::GenericUnix::constructInvocation(const DynamicLinkJobAction &job, } // Configure the toolchain. - // By default, use the system clang++ to link. - const char *Clang = "clang++"; + // + // By default use the system `clang` to perform the link. We use `clang` for + // the driver here because we do not wish to select a particular C++ runtime. + // Furthermore, until C++ interop is enabled, we cannot have a dependency on + // C++ code from pure Swift code. If linked libraries are C++ based, they + // should properly link C++. In the case of static linking, the user can + // explicitly specify the C++ runtime to link against. This is particularly + // important for platforms like android where as it is a Linux platform, the + // default C++ runtime is `libstdc++` which is unsupported on the target but + // as the builds are usually cross-compiled from Linux, libstdc++ is going to + // be present. This results in linking the wrong version of libstdc++ + // generating invalid binaries. It is also possible to use different C++ + // runtimes than the default C++ runtime for the platform (e.g. libc++ on + // Windows rather than msvcprt). When C++ interop is enabled, we will need to + // surface this via a driver flag. For now, opt for the simpler approach of + // just using `clang` and avoid a dependency on the C++ runtime. + const char *Clang = "clang"; if (const Arg *A = context.Args.getLastArg(options::OPT_tools_directory)) { StringRef toolchainPath(A->getValue()); // If there is a clang in the toolchain folder, use that instead. - if (auto toolchainClang = - llvm::sys::findProgramByName("clang++", {toolchainPath})) { - Clang = context.Args.MakeArgString(toolchainClang.get()); + if (auto tool = llvm::sys::findProgramByName("clang", {toolchainPath})) { + Clang = context.Args.MakeArgString(tool.get()); } // Look for binutils in the toolchain folder. diff --git a/lib/Driver/WindowsToolChains.cpp b/lib/Driver/WindowsToolChains.cpp index 99a7b0a325df9..7554a1f18dbad 100644 --- a/lib/Driver/WindowsToolChains.cpp +++ b/lib/Driver/WindowsToolChains.cpp @@ -79,15 +79,29 @@ toolchains::Windows::constructInvocation(const DynamicLinkJobAction &job, } // Configure the toolchain. - // By default, use the system clang++ to link. - const char *Clang = "clang++"; + // + // By default use the system `clang` to perform the link. We use `clang` for + // the driver here because we do not wish to select a particular C++ runtime. + // Furthermore, until C++ interop is enabled, we cannot have a dependency on + // C++ code from pure Swift code. If linked libraries are C++ based, they + // should properly link C++. In the case of static linking, the user can + // explicitly specify the C++ runtime to link against. This is particularly + // important for platforms like android where as it is a Linux platform, the + // default C++ runtime is `libstdc++` which is unsupported on the target but + // as the builds are usually cross-compiled from Linux, libstdc++ is going to + // be present. This results in linking the wrong version of libstdc++ + // generating invalid binaries. It is also possible to use different C++ + // runtimes than the default C++ runtime for the platform (e.g. libc++ on + // Windows rather than msvcprt). When C++ interop is enabled, we will need to + // surface this via a driver flag. For now, opt for the simpler approach of + // just using `clang` and avoid a dependency on the C++ runtime. + const char *Clang = "clang"; if (const Arg *A = context.Args.getLastArg(options::OPT_tools_directory)) { StringRef toolchainPath(A->getValue()); // If there is a clang in the toolchain folder, use that instead. - if (auto toolchainClang = - llvm::sys::findProgramByName("clang++", {toolchainPath})) - Clang = context.Args.MakeArgString(toolchainClang.get()); + if (auto tool = llvm::sys::findProgramByName("clang", {toolchainPath})) + Clang = context.Args.MakeArgString(tool.get()); } std::string Target = getTriple().str(); diff --git a/test/Driver/Inputs/fake-toolchain/clang++ b/test/Driver/Inputs/fake-toolchain/clang similarity index 100% rename from test/Driver/Inputs/fake-toolchain/clang++ rename to test/Driver/Inputs/fake-toolchain/clang diff --git a/test/Driver/embed-bitcode.swift b/test/Driver/embed-bitcode.swift index 76e871dbb41e8..119e80c682a2b 100644 --- a/test/Driver/embed-bitcode.swift +++ b/test/Driver/embed-bitcode.swift @@ -4,12 +4,12 @@ // CHECK-macho: "ld", inputs: ["[[OBJECT]]"], output: {image: "embed-bitcode"} // CHECK-coff: "swiftc.EXE", inputs: ["{{.*}}embed-bitcode.swift"], output: {llvm-bc: "[[BC:.*\.bc]]"} // CHECK-coff: "swiftc.EXE", inputs: ["[[BC]]"], output: {object: "[[OBJECT:.*\.o]]"} -// CHECK-coff: "clang++.exe", inputs: ["[[OBJECT]]"], output: {image: "embed-bitcode"} +// CHECK-coff: "clang.exe", inputs: ["[[OBJECT]]"], output: {image: "embed-bitcode"} // CHECK-elf: "swift", inputs: ["{{.*}}embed-bitcode.swift"], output: {llvm-bc: "[[BC:.*\.bc]]"} // CHECK-elf: "swift", inputs: ["[[BC]]"], output: {object: "[[OBJECT:.*\.o]]"} // CHECK-elf: "swift-autolink-extract", inputs: ["[[OBJECT]]"], output: {autolink: "[[AUTOLINK:.*\.autolink]]"} -// CHECK-elf: "clang++", inputs: ["[[OBJECT]]", "[[AUTOLINK]]"], output: {image: "main"} +// CHECK-elf: "clang", inputs: ["[[OBJECT]]", "[[AUTOLINK]]"], output: {image: "main"} // RUN: %target-swiftc_driver -embed-bitcode %s 2>&1 -### | %FileCheck %s -check-prefix=CHECK-FRONT -check-prefix=CHECK-FRONT-%target-object-format // CHECK-FRONT: -frontend diff --git a/test/Driver/linker-autolink-extract.swift b/test/Driver/linker-autolink-extract.swift index e7a6eaecbe294..d689d057b679e 100644 --- a/test/Driver/linker-autolink-extract.swift +++ b/test/Driver/linker-autolink-extract.swift @@ -6,7 +6,7 @@ // DEBUG_LINUX-NEXT: bin/swift-autolink-extract // DEBUG_LINUX-NEXT: bin/swift // DEBUG_LINUX-NEXT: bin/swift -modulewrap -// DEBUG_LINUX-NEXT: bin/clang++{{"? }} +// DEBUG_LINUX-NEXT: bin/clang{{"? }} // DEBUG_LINUX: -o main // DEBUG_LINUX-NOT: dsymutil diff --git a/test/Driver/linker.swift b/test/Driver/linker.swift index 9bebc1676c841..967311007425c 100644 --- a/test/Driver/linker.swift +++ b/test/Driver/linker.swift @@ -147,7 +147,7 @@ // LINUX-x86_64: swift // LINUX-x86_64: -o [[OBJECTFILE:.*]] -// LINUX-x86_64: clang++{{(\.exe)?"? }} +// LINUX-x86_64: clang{{(\.exe)?"? }} // LINUX-x86_64-DAG: -pie // LINUX-x86_64-DAG: [[OBJECTFILE]] // LINUX-x86_64-DAG: -lswiftCore @@ -163,7 +163,7 @@ // LINUX-armv6: swift // LINUX-armv6: -o [[OBJECTFILE:.*]] -// LINUX-armv6: clang++{{(\.exe)?"? }} +// LINUX-armv6: clang{{(\.exe)?"? }} // LINUX-armv6-DAG: -pie // LINUX-armv6-DAG: [[OBJECTFILE]] // LINUX-armv6-DAG: -lswiftCore @@ -180,7 +180,7 @@ // LINUX-armv7: swift // LINUX-armv7: -o [[OBJECTFILE:.*]] -// LINUX-armv7: clang++{{(\.exe)?"? }} +// LINUX-armv7: clang{{(\.exe)?"? }} // LINUX-armv7-DAG: -pie // LINUX-armv7-DAG: [[OBJECTFILE]] // LINUX-armv7-DAG: -lswiftCore @@ -197,7 +197,7 @@ // LINUX-thumbv7: swift // LINUX-thumbv7: -o [[OBJECTFILE:.*]] -// LINUX-thumbv7: clang++{{(\.exe)?"? }} +// LINUX-thumbv7: clang{{(\.exe)?"? }} // LINUX-thumbv7-DAG: -pie // LINUX-thumbv7-DAG: [[OBJECTFILE]] // LINUX-thumbv7-DAG: -lswiftCore @@ -214,7 +214,7 @@ // ANDROID-armv7: swift // ANDROID-armv7: -o [[OBJECTFILE:.*]] -// ANDROID-armv7: clang++{{(\.exe)?"? }} +// ANDROID-armv7: clang{{(\.exe)?"? }} // ANDROID-armv7-DAG: -pie // ANDROID-armv7-DAG: [[OBJECTFILE]] // ANDROID-armv7-DAG: -lswiftCore @@ -231,7 +231,7 @@ // CYGWIN-x86_64: swift // CYGWIN-x86_64: -o [[OBJECTFILE:.*]] -// CYGWIN-x86_64: clang++{{(\.exe)?"? }} +// CYGWIN-x86_64: clang{{(\.exe)?"? }} // CYGWIN-x86_64-DAG: [[OBJECTFILE]] // CYGWIN-x86_64-DAG: -lswiftCore // CYGWIN-x86_64-DAG: -L [[STDLIB_PATH:[^ ]+(/|\\\\)lib(/|\\\\)swift]] @@ -246,7 +246,7 @@ // WINDOWS-x86_64: swift // WINDOWS-x86_64: -o [[OBJECTFILE:.*]] -// WINDOWS-x86_64: clang++{{(\.exe)?"? }} +// WINDOWS-x86_64: clang{{(\.exe)?"? }} // WINDOWS-x86_64-DAG: [[OBJECTFILE]] // WINDOWS-x86_64-DAG: -L [[STDLIB_PATH:[^ ]+(/|\\\\)lib(/|\\\\)swift(/|\\\\)windows(/|\\\\)x86_64]] // WINDOWS-x86_64-DAG: -F foo -iframework car -F cdr @@ -272,7 +272,7 @@ // LINUX_DYNLIB-x86_64: -o [[OBJECTFILE:.*]] // LINUX_DYNLIB-x86_64: -o {{"?}}[[AUTOLINKFILE:.*]] -// LINUX_DYNLIB-x86_64: clang++{{(\.exe)?"? }} +// LINUX_DYNLIB-x86_64: clang{{(\.exe)?"? }} // LINUX_DYNLIB-x86_64-DAG: -shared // LINUX_DYNLIB-x86_64-DAG: -fuse-ld=gold // LINUX_DYNLIB-x86_64-NOT: -pie @@ -297,7 +297,7 @@ // LINUX-linker-order: swift // LINUX-linker-order: -o [[OBJECTFILE:.*]] -// LINUX-linker-order: clang++{{(\.exe)?"? }} +// LINUX-linker-order: clang{{(\.exe)?"? }} // LINUX-linker-order: -Xlinker -rpath -Xlinker {{[^ ]+(/|\\\\)lib(/|\\\\)swift(/|\\\\)linux}} // LINUX-linker-order: -L foo // LINUX-linker-order: -Xlinker -rpath -Xlinker customrpath @@ -306,14 +306,14 @@ // LINUX-clang-linker-order: swift // LINUX-clang-linker-order: -o [[OBJECTFILE:.*]] -// LINUX-clang-linker-order: clang++{{"? }} +// LINUX-clang-linker-order: clang{{"? }} // LINUX-clang-linker-order: -foo foopath // LINUX-clang-linker-order: -o {{.*}} // WINDOWS-clang-linker-order: swift // WINDOWS-clang-linker-order: -o [[OBJECTFILE:.*]] -// WINDOWS-clang-linker-order: clang++{{"? }} +// WINDOWS-clang-linker-order: clang{{"? }} // WINDOWS-clang-linker-order: -foo foopath // WINDOWS-clang-linker-order: -o {{.*}} diff --git a/test/Driver/modulewrap.swift b/test/Driver/modulewrap.swift index a5595a71298e4..6dbd26aa95142 100644 --- a/test/Driver/modulewrap.swift +++ b/test/Driver/modulewrap.swift @@ -4,4 +4,4 @@ // CHECK: bin{{/|\\\\}}swift{{c?(\.EXE)?"?}} {{.*}}-emit-module [[MOD]] // CHECK-SAME: -o [[MERGED:.*\.swiftmodule]] // CHECK: bin{{/|\\\\}}swift{{c?(\.EXE)?"?}} -modulewrap [[MERGED]]{{"?}} -target x86_64-unknown-linux-gnu -o [[OBJ:.*\.o]] -// CHECK: bin{{/|\\\\}}clang++{{.*}} [[OBJ]] +// CHECK: bin{{/|\\\\}}clang{{.*}} [[OBJ]] diff --git a/test/Driver/multi-threaded.swift b/test/Driver/multi-threaded.swift index 6afa7da998770..5ad449bae73e4 100644 --- a/test/Driver/multi-threaded.swift +++ b/test/Driver/multi-threaded.swift @@ -25,19 +25,19 @@ // MODULE-DAG: -num-threads 4 // MODULE-DAG: {{[^ ]*[/\\]}}Inputs{{/|\\\\}}main.swift{{"?}} {{[^ ]*[/\\]}}multi-threaded.swift // MODULE-DAG: -o test.swiftmodule -// MODULE-NOT: {{ld|clang\+\+}} +// MODULE-NOT: {{ld|clang}} // ASSEMBLY: -frontend // ASSEMBLY-DAG: -num-threads 4 // ASSEMBLY-DAG: {{[^ ]*[/\\]}}Inputs{{/|\\\\}}main.swift{{"?}} {{[^ ]*[/\\]}}multi-threaded.swift // ASSEMBLY-DAG: -o /build/main.s -o /build/multi-threaded.s -// ASSEMBLY-NOT: {{ld|clang\+\+}} +// ASSEMBLY-NOT: {{ld|clang}} // OBJECT: -frontend // OBJECT-DAG: -num-threads 4 // OBJECT-DAG: {{[^ ]*[/\\]}}Inputs{{/|\\\\}}main.swift{{"?}} {{[^ ]*[/\\]}}multi-threaded.swift // OBJECT-DAG: -o main.o -o multi-threaded.o -// OBJECT-NOT: {{ld|clang\+\+}} +// OBJECT-NOT: {{ld|clang}} // BITCODE: -frontend // BITCODE-DAG: -num-threads 4 @@ -45,7 +45,7 @@ // BITCODE-DAG: -o {{.*[/\\]}}main.bc -o {{.*[/\\]}}multi-threaded.bc // BITCODE-DAG: -frontend -c -primary-file {{.*[/\\]}}main.bc {{.*}} -o {{[^ ]*}}main.o // BITCODE-DAG: -frontend -c -primary-file {{.*[/\\]}}multi-threaded.bc {{.*}} -o {{[^ ]*}}multi-threaded.o -// BITCODE-NOT: {{ld|clang\+\+}} +// BITCODE-NOT: {{ld|clang}} // PARSEABLE: "outputs": [ // PARSEABLE: "path": "main.o" @@ -55,7 +55,7 @@ // EXEC-DAG: -num-threads 4 // EXEC-DAG: {{[^ ]*[/\\]}}Inputs{{/|\\\\}}main.swift{{"?}} {{[^ ]*[/\\]}}multi-threaded.swift // EXEC-DAG: -o {{.*te?mp.*[/\\]}}main{{[^ ]*}}.o{{"?}} -o {{.*te?mp.*[/\\]}}multi-threaded{{[^ ]*}}.o -// EXEC: {{ld|clang\+\+}} +// EXEC: {{ld|clang}} // EXEC: {{.*te?mp.*[/\\]}}main{{[^ ]*}}.o{{"?}} {{.*te?mp.*[/\\]}}multi-threaded{{[^ ]*}}.o // DEPENDENCIES-DAG: {{.*}}multi-threaded.o : {{.*[/\\]}}multi-threaded.swift {{.*[/\\]}}Inputs{{[/\\]}}main.swift diff --git a/test/Driver/parseable_output.swift b/test/Driver/parseable_output.swift index a140a77807bbb..857757a4986ce 100644 --- a/test/Driver/parseable_output.swift +++ b/test/Driver/parseable_output.swift @@ -112,8 +112,8 @@ // CHECK-NEXT: { // CHECK-NEXT: "kind": "began", // CHECK-NEXT: "name": "link", -// CHECK-NEXT: "command": "{{.*[\\/](ld|clang\+\+)(\.exe)?(\\")?.*}}parseable_output-[[OUTPUT]].o{{(\\")?}} {{.*}}-o {{.*[\\/]}}parseable_output.swift.tmp.out{{(\\")?}}", -// CHECK-NEXT: "command_executable": "{{.*[\\/](ld|clang\+\+)(\.exe)?}}", +// CHECK-NEXT: "command": "{{.*[\\/](ld|clang)(\.exe)?(\\")?.*}}parseable_output-[[OUTPUT]].o{{(\\")?}} {{.*}}-o {{.*[\\/]}}parseable_output.swift.tmp.out{{(\\")?}}", +// CHECK-NEXT: "command_executable": "{{.*[\\/](ld|clang)(\.exe)?}}", // CHECK-NEXT: "command_arguments": [ // CHECK: "{{.*[\\/]}}parseable_output-[[OUTPUT]].o", // CHECK: "-o", diff --git a/test/Driver/parseable_output_unicode.swift b/test/Driver/parseable_output_unicode.swift index 40ffc5c010961..0162e886ff2c4 100644 --- a/test/Driver/parseable_output_unicode.swift +++ b/test/Driver/parseable_output_unicode.swift @@ -114,8 +114,8 @@ // CHECK-NEXT: { // CHECK-NEXT: "kind": "began", // CHECK-NEXT: "name": "link", -// CHECK-NEXT: "command": "{{.*[\\/](ld|clang\+\+.exe)(\\")?}} {{.*[\\/]}}你好-[[OUTPUT]].o{{(\\")?}}{{.*}}-o {{.*[\\/]}}parseable_output_unicode.swift.tmp.out{{(\\")?}}", -// CHECK-NEXT: "command_executable": "{{.*[\\/](ld|clang\+\+.exe)(\\")?}}", +// CHECK-NEXT: "command": "{{.*[\\/](ld|clang.exe)(\\")?}} {{.*[\\/]}}你好-[[OUTPUT]].o{{(\\")?}}{{.*}}-o {{.*[\\/]}}parseable_output_unicode.swift.tmp.out{{(\\")?}}", +// CHECK-NEXT: "command_executable": "{{.*[\\/](ld|clang.exe)(\\")?}}", // CHECK-NEXT: "command_arguments": [ // CHECK: "{{.*[\\/]}}你好-[[OUTPUT]].o", // CHECK: "-o", diff --git a/test/Driver/profiling.swift b/test/Driver/profiling.swift index 28439ddfdf78b..75dab36e7323b 100644 --- a/test/Driver/profiling.swift +++ b/test/Driver/profiling.swift @@ -44,11 +44,11 @@ // watchOS_SIM: {{(bin/)?ld(.exe)?"? }} // watchOS_SIM: lib{{(\\\\|/)}}swift{{(\\\\|/)}}clang{{(\\\\|/)}}lib{{(\\\\|/)}}darwin{{(\\\\|/)}}libclang_rt.profile_watchossim.a -// LINUX: clang++{{(\.exe)?"? }} +// LINUX: clang{{(\.exe)?"? }} // LINUX: lib{{(\\\\|/)}}swift{{(\\\\|/)}}clang{{(\\\\|/)}}lib{{(\\\\|/)}}linux{{(\\\\|/)}}libclang_rt.profile-x86_64.a // LINUX: -u__llvm_profile_runtime -// WINDOWS: clang++{{(\.exe)?"? }} +// WINDOWS: clang{{(\.exe)?"? }} // WINDOWS: lib{{(\\\\|/)}}swift{{(\\\\|/)}}clang{{(\\\\|/)}}lib{{(\\\\|/)}}windows{{(\\\\|/)}}clang_rt.profile-x86_64.lib // WINDOWS: -u__llvm_profile_runtime diff --git a/test/Driver/tools_directory.swift b/test/Driver/tools_directory.swift index 799acfdeb4cbc..d5e1536955dc1 100644 --- a/test/Driver/tools_directory.swift +++ b/test/Driver/tools_directory.swift @@ -1,5 +1,5 @@ //================================================= -// ** GENERIC UNIX TARGETS - linking via clang++ ** +// ** GENERIC UNIX TARGETS - linking via clang ** //================================================= // RUN: %swiftc_driver -### -target x86_64-linux-unknown -tools-directory %S/Inputs/fake-toolchain %s 2>&1 | %FileCheck -check-prefix CLANGSUB %s @@ -9,7 +9,7 @@ // CLANGSUB-SAME: -o [[OBJECTFILE:.*]] // CLANGSUB: swift-autolink-extract{{(\.exe)?"?}} [[OBJECTFILE]] // CLANGSUB-SAME: -o {{"?}}[[AUTOLINKFILE:.*]] -// CLANGSUB: {{[^ ]+(\\\\|/)}}Inputs{{/|\\\\}}fake-toolchain{{/|\\\\}}clang++ +// CLANGSUB: {{[^ ]+(\\\\|/)}}Inputs{{/|\\\\}}fake-toolchain{{/|\\\\}}clang // CLANGSUB-DAG: [[OBJECTFILE]] // CLANGSUB-DAG: @[[AUTOLINKFILE]] // CLANGSUB: -o tools_directory @@ -18,7 +18,7 @@ // BINUTILS-SAME: -o [[OBJECTFILE:.*]] // BINUTILS: swift-autolink-extract{{(\.exe)?"?}} [[OBJECTFILE]] // BINUTILS-SAME: -o {{"?}}[[AUTOLINKFILE:.*]] -// BINUTILS: clang++ +// BINUTILS: clang // BINUTILS-DAG: [[OBJECTFILE]] // BINUTILS-DAG: @[[AUTOLINKFILE]] // BINUTILS-DAG: -B /Something/obviously/fake diff --git a/test/Driver/verbose.swift b/test/Driver/verbose.swift index 2d79e720b284a..c180ff99b2781 100644 --- a/test/Driver/verbose.swift +++ b/test/Driver/verbose.swift @@ -1,4 +1,4 @@ // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-linux-gnu -v %s 2>&1 | %FileCheck %s -check-prefix=VERBOSE_CLANG // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-windows-msvc -v %s 2>&1 | %FileCheck %s -check-prefix=VERBOSE_CLANG -// VERBOSE_CLANG: clang++{{.*}} -v -o +// VERBOSE_CLANG: clang{{.*}} -v -o diff --git a/test/Driver/windows-link-job.swift b/test/Driver/windows-link-job.swift index 16eab3d7ab1e6..34e7b292daad0 100644 --- a/test/Driver/windows-link-job.swift +++ b/test/Driver/windows-link-job.swift @@ -1,4 +1,4 @@ // RUN: %empty-directory(%t/DISTINCTIVE-WINDOWS-PATH/usr/bin) // RUN: %hardlink-or-copy(from: %swift_driver_plain, to: %t/DISTINCTIVE-WINDOWS-PATH/usr/bin/swiftc) // RUN: env PATH= %t/DISTINCTIVE-WINDOWS-PATH/usr/bin/swiftc -target x86_64-unknown-windows-msvc -### -module-name link -emit-library %s 2>&1 | %FileCheck %s -// CHECK: {{^}}clang++ +// CHECK: {{^}}clang diff --git a/utils/gen-static-stdlib-link-args b/utils/gen-static-stdlib-link-args index a42c5e34a2e37..0fa009d67d3a7 100755 --- a/utils/gen-static-stdlib-link-args +++ b/utils/gen-static-stdlib-link-args @@ -66,6 +66,8 @@ function write_linkfile { -latomic -lswiftImageInspectionShared $ICU_LIBS +-lstdc++ +-lm -Xlinker -export-dynamic -Xlinker diff --git a/utils/static-executable-args.lnk b/utils/static-executable-args.lnk index f3da0ed6b0ed0..22da506455703 100644 --- a/utils/static-executable-args.lnk +++ b/utils/static-executable-args.lnk @@ -13,3 +13,5 @@ -licuuc -licudata -ldl +-lstdc++ +-lm