[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Petr Hosek via Phabricator via cfe-commits
phosek added a comment.

In D110128#3021876 , @thakis wrote:

> Note that stage 2 fails, where we're supposed to use lld. So I think this is 
> probably some compiler-rt test config problem you need to sort out, and not a 
> fundamental problem with the patch.

It looks like the `LLVM_ENABLE_LLD` option doesn't affect compiler-rt tests.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Nico Weber via Phabricator via cfe-commits
thakis added a comment.

Re-reverted for now in 6ece82e9006d16b7fba7660ce09b2c62ab8460fa 
.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Nico Weber via Phabricator via cfe-commits
thakis added a comment.

Note that stage 2 fails, where we're supposed to use lld. So I think this is 
probably some compiler-rt test config problem you need to sort out, and not a 
fundamental problem with the patch.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Nico Weber via Phabricator via cfe-commits
thakis added a comment.

This breaks our packaging builders too: 
https://logs.chromium.org/logs/chromium/buildbucket/cr-buildbucket/8835201798501639249/+/u/package_clang/stdout?format=raw


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Petr Hosek via Phabricator via cfe-commits
phosek added a comment.

In D110128#3020468 , @nemanjai wrote:

> In D110128#3018992 , @phosek wrote:
>
>> @MaskRay Do you think we should gate the use of this feature on 
>> `-fbinutils-version=` or `-fuse-ld=lld`? It'd be nice if the owner of 
>> `clang-ppc64le-rhel` builder could update the binutils version but I'm not 
>> sure how feasible is it.
>
> We certainly don't mind updating binutils to a supported version. However, if 
> a specific version of binutils (or really any other software package) is 
> required by Clang/LLVM, that should be documented at 
> https://llvm.org/docs/GettingStarted.html#software
>
> Of course, if our bot has a version of binutils that is older than the one 
> listed there currently, we will be sure to update it ASAP.
>
> But of course, as @MaskRay pointed out, this may not be an issue.

Thanks for reaching out @nemanjai, I assume you're responsible for this 
builder? Do you know what version of Binutils is currently installed on that 
machine? Is newer version available for RHEL 7?

We don't specify Binutils version on https://llvm.org/docs/GettingStarted.html 
but I think we should. We need to determine that baseline first though. It 
looks like 2.25 roughly corresponds to GCC 5.1 which is the minimum requirement 
for the compiler.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Nemanja Ivanovic via Phabricator via cfe-commits
nemanjai added a comment.

In D110128#3018992 , @phosek wrote:

> @MaskRay Do you think we should gate the use of this feature on 
> `-fbinutils-version=` or `-fuse-ld=lld`? It'd be nice if the owner of 
> `clang-ppc64le-rhel` builder could update the binutils version but I'm not 
> sure how feasible is it.

We certainly don't mind updating binutils to a supported version. However, if a 
specific version of binutils (or really any other software package) is required 
by Clang/LLVM, that should be documented at 
https://llvm.org/docs/GettingStarted.html#software

Of course, if our bot has a version of binutils that is older than the one 
listed there currently, we will be sure to update it ASAP.

But of course, as @MaskRay pointed out, this may not be an issue.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-24 Thread Petr Hosek via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG03142c5f6778: [Driver] Correctly handle static C++ standard 
library (authored by phosek).

Changed prior to commit:
  https://reviews.llvm.org/D110128?vs=374699&id=374743#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,22 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: 
"{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lm"
+// RUN: %clangxx  -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -37,8 +37,8 @@
 // CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
-// CHECK: "-lm"
 // CHECK: "--pop-state"
+// CHECK: "-lm"
 // CHECK-X86_64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -55,12 +55,10 @@
 // RUN: -fuse-ld=lld 2>&1 \
 // RUN: | FileCheck %s -check-prefix=CHECK-STATIC
 // CHECK-STATIC: "--push-state"
-// CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ 
-fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,13 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
-  if (OnlyLibstdcxxStatic)
+  if (OnlyLibstdcxxStatic) {
+CmdArgs.push_back("--push-state");
 CmdArgs.push_back("-Bstatic");
+  }
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -138,14 +138,13 @@
 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) 
&&
!Args.hasArg(options::OPT_static);
 CmdArgs.push_back("--push-state");
-CmdArgs.push_back("--as-needed");
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
+else
+  CmdArgs.push_back("--as-needed");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
-CmdArgs.push_back("-lm");
 CmdArgs.push_back("--pop-state");
+CmdArgs.push_back("-lm");
   }
 }
 


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,22 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: "{{.*}}/Inputs/

[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Petr Hosek via Phabricator via cfe-commits
phosek updated this revision to Diff 374699.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,22 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: 
"{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lm"
+// RUN: %clangxx  -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -34,11 +34,9 @@
 // CHECK-NOT: crti.o
 // CHECK-NOT: crtbegin.o
 // CHECK: "-L[[SYSROOT]]{{/|}}lib"
-// CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
 // CHECK: "-lm"
-// CHECK: "--pop-state"
 // CHECK-X86_64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -55,12 +53,10 @@
 // RUN: -fuse-ld=lld 2>&1 \
 // RUN: | FileCheck %s -check-prefix=CHECK-STATIC
 // CHECK-STATIC: "--push-state"
-// CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ 
-fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,13 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
-  if (OnlyLibstdcxxStatic)
+  if (OnlyLibstdcxxStatic) {
+CmdArgs.push_back("--push-state");
 CmdArgs.push_back("-Bstatic");
+  }
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -138,14 +138,13 @@
 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) 
&&
!Args.hasArg(options::OPT_static);
 CmdArgs.push_back("--push-state");
-CmdArgs.push_back("--as-needed");
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
+else
+  CmdArgs.push_back("--as-needed");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
-CmdArgs.push_back("-lm");
 CmdArgs.push_back("--pop-state");
+CmdArgs.push_back("-lm");
   }
 }
 


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,22 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: "{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   

[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added inline comments.



Comment at: clang/lib/Driver/ToolChains/Fuchsia.cpp:144
+} else {
+  CmdArgs.push_back("--as-needed");
+}

as-needed needs push-state as well.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Petr Hosek via Phabricator via cfe-commits
phosek updated this revision to Diff 374690.
phosek marked an inline comment as done.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c

Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,22 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: "{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lm"
+// RUN: %clangxx  -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -34,11 +34,9 @@
 // CHECK-NOT: crti.o
 // CHECK-NOT: crtbegin.o
 // CHECK: "-L[[SYSROOT]]{{/|}}lib"
-// CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
 // CHECK: "-lm"
-// CHECK: "--pop-state"
 // CHECK-X86_64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -55,12 +53,10 @@
 // RUN: -fuse-ld=lld 2>&1 \
 // RUN: | FileCheck %s -check-prefix=CHECK-STATIC
 // CHECK-STATIC: "--push-state"
-// CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ -fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,13 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
-  if (OnlyLibstdcxxStatic)
+  if (OnlyLibstdcxxStatic) {
+CmdArgs.push_back("--push-state");
 CmdArgs.push_back("-Bstatic");
+  }
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
   if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -137,15 +137,16 @@
   if (ToolChain.ShouldLinkCXXStdlib(Args)) {
 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
!Args.hasArg(options::OPT_static);
-CmdArgs.push_back("--push-state");
-CmdArgs.push_back("--as-needed");
-if (OnlyLibstdcxxStatic)
+if (OnlyLibstdcxxStatic) {
+  CmdArgs.push_back("--push-state");
   CmdArgs.push_back("-Bstatic");
+} else {
+  CmdArgs.push_back("--as-needed");
+}
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
 if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
+  CmdArgs.push_back("--pop-state");
 CmdArgs.push_back("-lm");
-CmdArgs.push_back("--pop-state");
   }
 }
 
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added inline comments.



Comment at: clang/lib/Driver/ToolChains/Gnu.cpp:581
+  CmdArgs.push_back("--push-state");
+  CmdArgs.push_back("--as-needed");
   if (OnlyLibstdcxxStatic)

MaskRay wrote:
> The --as-needed change should be dropped from this patch.
> 
`--push-state` should only be added when -Bstatic is added.

Then the old clang-ppc64le-rhel issue may be moot because they probably don't 
use -static-libstdc++ ...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Petr Hosek via Phabricator via cfe-commits
phosek added a comment.

@MaskRay Do you think we should gate the use of this feature on 
`-fbinutils-version=` or `-fuse-ld=lld`? It'd be nice if the owner of 
`clang-ppc64le-rhel` builder could update the binutils version but I'm not sure 
how feasible is it.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Petr Hosek via Phabricator via cfe-commits
phosek added a comment.

Looks like the linker used on `clang-ppc64le-rhel` bot doesn't support 
`--push-state`/`--pop-state`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-23 Thread Petr Hosek via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG5e28c892d06f: [Driver] Correctly handle static C++ standard 
library (authored by phosek).

Changed prior to commit:
  https://reviews.llvm.org/D110128?vs=374154&id=374467#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,24 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: 
"{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "--push-state"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lm"
+// RUN: %clangxx  -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -37,8 +37,8 @@
 // CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
-// CHECK: "-lm"
 // CHECK: "--pop-state"
+// CHECK: "-lm"
 // CHECK-X86_64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -55,12 +55,10 @@
 // RUN: -fuse-ld=lld 2>&1 \
 // RUN: | FileCheck %s -check-prefix=CHECK-STATIC
 // CHECK-STATIC: "--push-state"
-// CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ 
-fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,11 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
+  CmdArgs.push_back("--push-state");
   if (OnlyLibstdcxxStatic)
 CmdArgs.push_back("-Bstatic");
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-  if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+  CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -138,14 +138,13 @@
 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) 
&&
!Args.hasArg(options::OPT_static);
 CmdArgs.push_back("--push-state");
-CmdArgs.push_back("--as-needed");
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
+else
+  CmdArgs.push_back("--as-needed");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
-CmdArgs.push_back("-lm");
 CmdArgs.push_back("--pop-state");
+CmdArgs.push_back("-lm");
   }
 }
 


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,24 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--

[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-22 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added a comment.

Please mention GNU ld 2.25 (2014) in the description.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-22 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay accepted this revision.
MaskRay added a comment.
This revision is now accepted and ready to land.

Thanks!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-22 Thread Petr Hosek via Phabricator via cfe-commits
phosek updated this revision to Diff 374154.
phosek marked 5 inline comments as done.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c

Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,24 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: "{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "--push-state"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-SHARED-SAME: {{^}} "-lm"
+// RUN: %clangxx  -x c++ %s -### 2>&1 \
+// RUN: --target=x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC-SAME: {{^}} "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
@@ -542,7 +560,7 @@
 // CHECK-BASIC-LIBCXX-C-LINK: "-internal-isystem" "[[SYSROOT]]/usr/local/include"
 // CHECK-BASIC-LIBCXX-C-LINK: "--sysroot=[[SYSROOT]]"
 // CHECK-BASIC-LIBCXX-C-LINK: "-L[[SYSROOT]]/usr/bin/../lib"
-//
+
 // Check multi arch support on Ubuntu 12.04 LTS.
 // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
 // RUN: --target=arm-unknown-linux-gnueabihf -rtlib=platform \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -37,8 +37,8 @@
 // CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
-// CHECK: "-lm"
 // CHECK: "--pop-state"
+// CHECK: "-lm"
 // CHECK-X86_64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: "[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -55,12 +55,10 @@
 // RUN: -fuse-ld=lld 2>&1 \
 // RUN: | FileCheck %s -check-prefix=CHECK-STATIC
 // CHECK-STATIC: "--push-state"
-// CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ -fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,11 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
+  CmdArgs.push_back("--push-state");
   if (OnlyLibstdcxxStatic)
 CmdArgs.push_back("-Bstatic");
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-  if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+  CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -138,14 +138,13 @@
 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
!Args.hasArg(options::OPT_static);
 CmdArgs.push_back("--push-state");
-CmdArgs.push_back("--as-needed");
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
+else
+  CmdArgs.push_back("--as-needed");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
-CmdArgs.push_back("-lm");
 CmdArgs.push_back("--pop-state");
+CmdArgs.push_back("-lm");
   }
 }
 
___
cfe-commits mailing list
cfe-commi

[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-21 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added inline comments.



Comment at: clang/test/Driver/linux-ld.c:499
 
+// RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
+// RUN: -target x86_64-unknown-linux-gnu \

`-no-canonical-prefixes` is only useful when the CHECK lines inspect the 
spelling of clang.
Otherwise `-no-canonical-prefixes` can be omitted.

Omit `-o %t.o` since it is not used.



Comment at: clang/test/Driver/linux-ld.c:504
+// CHECK-BASIC-LIBCXX-SHARED: "--push-state"
+// CHECK-BASIC-LIBCXX-SHARED: "--as-needed"
+// CHECK-BASIC-LIBCXX-SHARED: "-lc++"

To improve the robustness of the test, use the `-SAME: {{^}}` style in 
linux-cross.cpp, or just place these consecutive options on the same line.



Comment at: clang/test/Driver/linux-ld.c:509
+// RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
+// RUN: -target x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \

Prefer `--target=` to `-target `


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-21 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added a comment.

LGTM.

I looked at this in 2019 but did not change because GNU ld 2.25 (2014) 
introduced --push-state. (gold added it in 2016 but I think we can have higher 
version requirement for gold.)
In 2021, binutils 2.24 (2013) compatibility should be irrelevant now...




Comment at: clang/lib/Driver/ToolChains/Fuchsia.cpp:143
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);

`--as-needed` only applies to shared objects so you can move it into the `else` 
code path.



Comment at: clang/lib/Driver/ToolChains/Gnu.cpp:581
+  CmdArgs.push_back("--push-state");
+  CmdArgs.push_back("--as-needed");
   if (OnlyLibstdcxxStatic)

The --as-needed change should be dropped from this patch.



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110128/new/

https://reviews.llvm.org/D110128

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D110128: [Driver] Correctly handle static C++ standard library

2021-09-20 Thread Petr Hosek via Phabricator via cfe-commits
phosek created this revision.
phosek added reviewers: MaskRay, mcgrathr.
phosek requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

When statically linking C++ standard library, we shouldn't add -Bdynamic
after including the library on the link line because that might override
user settings like -static and -static-pie. Rather, we should surround
the library with --push-state/--pop-state to make sure that -Bstatic
only applies to C++ standard library and nothing else.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D110128

Files:
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/test/Driver/fuchsia.cpp
  clang/test/Driver/linux-ld.c


Index: clang/test/Driver/linux-ld.c
===
--- clang/test/Driver/linux-ld.c
+++ clang/test/Driver/linux-ld.c
@@ -496,6 +496,26 @@
 // CHECK-GCC-VERSION1: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
 // CHECK-GCC-VERSION1: 
"{{.*}}/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/10.2.0{{/|}}crtbegin.o"
 
+// RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
+// RUN: -target x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-SHARED %s
+// CHECK-BASIC-LIBCXX-SHARED: "--push-state"
+// CHECK-BASIC-LIBCXX-SHARED: "--as-needed"
+// CHECK-BASIC-LIBCXX-SHARED: "-lc++"
+// CHECK-BASIC-LIBCXX-SHARED: "--pop-state"
+// CHECK-BASIC-LIBCXX-SHARED: "-lm"
+// RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
+// RUN: -target x86_64-unknown-linux-gnu \
+// RUN: -stdlib=libc++ -static-libstdc++ \
+// RUN:   | FileCheck --check-prefix=CHECK-BASIC-LIBCXX-STATIC %s
+// CHECK-BASIC-LIBCXX-STATIC: "--push-state"
+// CHECK-BASIC-LIBCXX-STATIC: "--as-needed"
+// CHECK-BASIC-LIBCXX-STATIC: "-Bstatic"
+// CHECK-BASIC-LIBCXX-STATIC: "-lc++"
+// CHECK-BASIC-LIBCXX-STATIC: "--pop-state"
+// CHECK-BASIC-LIBCXX-STATIC: "-lm"
+
 // Test a simulated installation of libc++ on Linux, both through sysroot and
 // the installation path of Clang.
 // RUN: %clangxx -no-canonical-prefixes -x c++ %s -### -o %t.o 2>&1 \
@@ -542,7 +562,7 @@
 // CHECK-BASIC-LIBCXX-C-LINK: "-internal-isystem" 
"[[SYSROOT]]/usr/local/include"
 // CHECK-BASIC-LIBCXX-C-LINK: "--sysroot=[[SYSROOT]]"
 // CHECK-BASIC-LIBCXX-C-LINK: "-L[[SYSROOT]]/usr/bin/../lib"
-//
+
 // Check multi arch support on Ubuntu 12.04 LTS.
 // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
 // RUN: --target=arm-unknown-linux-gnueabihf -rtlib=platform \
Index: clang/test/Driver/fuchsia.cpp
===
--- clang/test/Driver/fuchsia.cpp
+++ clang/test/Driver/fuchsia.cpp
@@ -37,8 +37,8 @@
 // CHECK: "--push-state"
 // CHECK: "--as-needed"
 // CHECK: "-lc++"
-// CHECK: "-lm"
 // CHECK: "--pop-state"
+// CHECK: "-lm"
 // CHECK-X86_64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}x86_64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-AARCH64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}aarch64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
 // CHECK-RISCV64: 
"[[RESOURCE_DIR]]{{/|}}lib{{/|}}riscv64-unknown-fuchsia{{/|}}libclang_rt.builtins.a"
@@ -58,9 +58,8 @@
 // CHECK-STATIC: "--as-needed"
 // CHECK-STATIC: "-Bstatic"
 // CHECK-STATIC: "-lc++"
-// CHECK-STATIC: "-Bdynamic"
-// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "--pop-state"
+// CHECK-STATIC: "-lm"
 // CHECK-STATIC: "-lc"
 
 // RUN: %clangxx %s -### --target=x86_64-unknown-fuchsia -nostdlib++ 
-fuse-ld=lld 2>&1 \
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ clang/lib/Driver/ToolChains/Gnu.cpp
@@ -577,11 +577,12 @@
 if (ToolChain.ShouldLinkCXXStdlib(Args)) {
   bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
  !Args.hasArg(options::OPT_static);
+  CmdArgs.push_back("--push-state");
+  CmdArgs.push_back("--as-needed");
   if (OnlyLibstdcxxStatic)
 CmdArgs.push_back("-Bstatic");
   ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-  if (OnlyLibstdcxxStatic)
-CmdArgs.push_back("-Bdynamic");
+  CmdArgs.push_back("--pop-state");
 }
 CmdArgs.push_back("-lm");
   }
Index: clang/lib/Driver/ToolChains/Fuchsia.cpp
===
--- clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -142,10 +142,8 @@
 if (OnlyLibstdcxxStatic)
   CmdArgs.push_back("-Bstatic");
 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
-if (OnlyLibstdcxxStatic)
-  CmdArgs.push_back("-Bdynamic");
-CmdArgs.push_back("-lm");
 CmdArgs.push_back("--pop-state");
+CmdArgs.push_back("-lm");
   }
 }
 


Index: