[PATCH] Driver: implement --runtime-sysroot option.

Peter Collingbourne peter at pcc.me.uk
Thu May 23 11:57:08 PDT 2013


Hi matthewbg,

This option is used to select a sysroot location to be used at runtime.
Currently the Linux toolchain uses this option to determine the
runtime path to the dynamic loader.

http://llvm-reviews.chandlerc.com/D851

Files:
  include/clang/Driver/Driver.h
  include/clang/Driver/Options.td
  lib/Driver/Driver.cpp
  lib/Driver/Tools.cpp
  test/Driver/runtime-sysroot.c

Index: include/clang/Driver/Driver.h
===================================================================
--- include/clang/Driver/Driver.h
+++ include/clang/Driver/Driver.h
@@ -79,6 +79,9 @@
   /// sysroot, if present
   std::string SysRoot;
 
+  /// Runtime sysroot, if present
+  std::string RuntimeSysRoot;
+
   /// If the standard library is used
   bool UseStdLib;
 
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -1222,6 +1222,8 @@
 def _resource_EQ : Joined<["--"], "resource=">, Alias<fcompile_resource_EQ>;
 def _resource : Separate<["--"], "resource">, Alias<fcompile_resource_EQ>;
 def _rtlib : Separate<["--"], "rtlib">, Alias<rtlib_EQ>;
+def _runtime_sysroot_EQ : Joined<["--"], "runtime-sysroot=">;
+def _runtime_sysroot : Separate<["--"], "runtime-sysroot">, Alias<_runtime_sysroot_EQ>;
 def _serialize_diags : Separate<["-", "--"], "serialize-diagnostics">, Flags<[DriverOption]>,
   HelpText<"Serialize compiler diagnostics to a file">;
 // We give --version different semantics from -version.
Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp
+++ lib/Driver/Driver.cpp
@@ -289,6 +289,8 @@
   }
   if (const Arg *A = Args->getLastArg(options::OPT__sysroot_EQ))
     SysRoot = A->getValue();
+  if (const Arg *A = Args->getLastArg(options::OPT__runtime_sysroot_EQ))
+    RuntimeSysRoot = A->getValue();
   if (Args->hasArg(options::OPT_nostdlib))
     UseStdLib = false;
 
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -6003,35 +6003,42 @@
        !Args.hasArg(options::OPT_shared))) {
     CmdArgs.push_back("-dynamic-linker");
     if (isAndroid)
-      CmdArgs.push_back("/system/bin/linker");
+      CmdArgs.push_back(
+          Args.MakeArgString(D.RuntimeSysRoot + "/system/bin/linker"));
     else if (ToolChain.getArch() == llvm::Triple::x86)
-      CmdArgs.push_back("/lib/ld-linux.so.2");
+      CmdArgs.push_back(
+          Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld-linux.so.2"));
     else if (ToolChain.getArch() == llvm::Triple::aarch64)
-      CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
+      CmdArgs.push_back(
+          Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld-linux-aarch64.so.1"));
     else if (ToolChain.getArch() == llvm::Triple::arm ||
              ToolChain.getArch() == llvm::Triple::thumb) {
       if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
-        CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
+        CmdArgs.push_back(
+            Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld-linux-armhf.so.3"));
       else
-        CmdArgs.push_back("/lib/ld-linux.so.3");
-    }
-    else if (ToolChain.getArch() == llvm::Triple::mips ||
-             ToolChain.getArch() == llvm::Triple::mipsel)
-      CmdArgs.push_back("/lib/ld.so.1");
+        CmdArgs.push_back(
+            Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld-linux.so.3"));
+    } else if (ToolChain.getArch() == llvm::Triple::mips ||
+               ToolChain.getArch() == llvm::Triple::mipsel)
+      CmdArgs.push_back(Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld.so.1"));
     else if (ToolChain.getArch() == llvm::Triple::mips64 ||
              ToolChain.getArch() == llvm::Triple::mips64el) {
       if (hasMipsN32ABIArg(Args))
-        CmdArgs.push_back("/lib32/ld.so.1");
+        CmdArgs.push_back(
+            Args.MakeArgString(D.RuntimeSysRoot + "/lib32/ld.so.1"));
       else
-        CmdArgs.push_back("/lib64/ld.so.1");
-    }
-    else if (ToolChain.getArch() == llvm::Triple::ppc)
-      CmdArgs.push_back("/lib/ld.so.1");
+        CmdArgs.push_back(
+            Args.MakeArgString(D.RuntimeSysRoot + "/lib64/ld.so.1"));
+    } else if (ToolChain.getArch() == llvm::Triple::ppc)
+      CmdArgs.push_back(Args.MakeArgString(D.RuntimeSysRoot + "/lib/ld.so.1"));
     else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
-	     ToolChain.getArch() == llvm::Triple::systemz)
-      CmdArgs.push_back("/lib64/ld64.so.1");
+             ToolChain.getArch() == llvm::Triple::systemz)
+      CmdArgs.push_back(
+          Args.MakeArgString(D.RuntimeSysRoot + "/lib64/ld64.so.1"));
     else
-      CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
+      CmdArgs.push_back(
+          Args.MakeArgString(D.RuntimeSysRoot + "/lib64/ld-linux-x86-64.so.2"));
   }
 
   CmdArgs.push_back("-o");
Index: test/Driver/runtime-sysroot.c
===================================================================
--- /dev/null
+++ test/Driver/runtime-sysroot.c
@@ -0,0 +1,7 @@
+// RUN: touch %t.o
+
+// RUN: %clang -target i386-unknown-linux --runtime-sysroot /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-32 %s
+// CHECK-32: "-dynamic-linker" "/foo/lib/ld-linux.so.2"
+
+// RUN: %clang -target x86_64-unknown-linux --runtime-sysroot /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-64 %s
+// CHECK-64: "-dynamic-linker" "/foo/lib64/ld-linux-x86-64.so.2"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D851.1.patch
Type: text/x-patch
Size: 5134 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130523/99e476b9/attachment.bin>


More information about the cfe-commits mailing list