aganea created this revision.
aganea added reviewers: hans, sthibaul, kristina.
Herald added subscribers: cfe-commits, dexonsmith, Prazek.
Herald added a project: clang.
aganea added a comment.

@hans, do you think this could be included in 10.0?


As noted in PR45061, a two-stage ThinLTO build fails the 
`clang/test/Driver/hurd.c` test because of a `static_cast` here 
<https://github.com/llvm/llvm-project/blob/master/clang/lib/Driver/ToolChains/Gnu.cpp#L350>
 which wrongly converts an instance of `clang::driver::toolchains::Hurd` into 
that of `clang::driver::toolchains::Linux`. ThinLTO will later devirtualize the 
`ToolChain.getDynamicLinker(Args);` call and use `Linux::getDynamicLinker()` 
instead, causing the test to generate a wrong `-dynamic-linker` linker flag 
(`/lib/ld-linux.so.2` instead of `/lib/ld.so`)

This patch simply fixes the `Hurd` class hierarchy as (I think) it was intended 
to be.

Ideally, and because of the `static_cast` mentioned above, maybe 
`gnutools::Linker` should take a `const Linux &` instance, not a `const 
ToolChain &`. But that causes other issues and could be done later.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D75373

Files:
  clang/lib/Driver/ToolChains/Hurd.cpp
  clang/lib/Driver/ToolChains/Hurd.h


Index: clang/lib/Driver/ToolChains/Hurd.h
===================================================================
--- clang/lib/Driver/ToolChains/Hurd.h
+++ clang/lib/Driver/ToolChains/Hurd.h
@@ -10,13 +10,14 @@
 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Hurd_H
 
 #include "Gnu.h"
+#include "Linux.h"
 #include "clang/Driver/ToolChain.h"
 
 namespace clang {
 namespace driver {
 namespace toolchains {
 
-class LLVM_LIBRARY_VISIBILITY Hurd : public Generic_ELF {
+class LLVM_LIBRARY_VISIBILITY Hurd : public Linux {
 public:
   Hurd(const Driver &D, const llvm::Triple &Triple,
        const llvm::opt::ArgList &Args);
@@ -27,9 +28,9 @@
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
 
-  virtual std::string computeSysRoot() const;
+  std::string computeSysRoot() const override;
 
-  virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const;
+  std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override;
 
   std::vector<std::string> ExtraOpts;
 
Index: clang/lib/Driver/ToolChains/Hurd.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Hurd.cpp
+++ clang/lib/Driver/ToolChains/Hurd.cpp
@@ -63,7 +63,7 @@
 
 Hurd::Hurd(const Driver &D, const llvm::Triple &Triple,
            const ArgList &Args)
-    : Generic_ELF(D, Triple, Args) {
+    : Linux(D, Triple, Args) {
   std::string SysRoot = computeSysRoot();
   path_list &Paths = getFilePaths();
 


Index: clang/lib/Driver/ToolChains/Hurd.h
===================================================================
--- clang/lib/Driver/ToolChains/Hurd.h
+++ clang/lib/Driver/ToolChains/Hurd.h
@@ -10,13 +10,14 @@
 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_Hurd_H
 
 #include "Gnu.h"
+#include "Linux.h"
 #include "clang/Driver/ToolChain.h"
 
 namespace clang {
 namespace driver {
 namespace toolchains {
 
-class LLVM_LIBRARY_VISIBILITY Hurd : public Generic_ELF {
+class LLVM_LIBRARY_VISIBILITY Hurd : public Linux {
 public:
   Hurd(const Driver &D, const llvm::Triple &Triple,
        const llvm::opt::ArgList &Args);
@@ -27,9 +28,9 @@
   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
                             llvm::opt::ArgStringList &CC1Args) const override;
 
-  virtual std::string computeSysRoot() const;
+  std::string computeSysRoot() const override;
 
-  virtual std::string getDynamicLinker(const llvm::opt::ArgList &Args) const;
+  std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override;
 
   std::vector<std::string> ExtraOpts;
 
Index: clang/lib/Driver/ToolChains/Hurd.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Hurd.cpp
+++ clang/lib/Driver/ToolChains/Hurd.cpp
@@ -63,7 +63,7 @@
 
 Hurd::Hurd(const Driver &D, const llvm::Triple &Triple,
            const ArgList &Args)
-    : Generic_ELF(D, Triple, Args) {
+    : Linux(D, Triple, Args) {
   std::string SysRoot = computeSysRoot();
   path_list &Paths = getFilePaths();
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to