Hi,

2012/3/10 Rafael Espíndola <[email protected]>:
> On the clang patch:
>
> Typo: Retunrs in
>
>  /// Retunrs the sysroot path after removing the trailing /.
>
>
> + #include "clang/Config/config.h"
>
> This should be with the other includes
>
> getSysRoot is returning a StringRef to a deleted object, no? Probably
> the best is to avoid using SmallString in Compilation::getSysRoot
> (which unfortunately means not using
> llvm::sys::path::remove_filename).
>
> The getSysRoot code is duplicated inline in Driver::BuildCompilation, no?

The code in the Driver happens before Compilation is created.
I took care of this duplication of code by initializing a field in Compilation
with the value that we computed in the Driver::SysRoot field.

>
> On the llvm patch:
>
> GCC_INSTALL_PREFIX and DEFAULT_SYSROOT can go in the clang CMakeFile,
> no? (thanks for adding GCC_INSTALL_PREFIX!).

Fixed: I moved both vars in the clang CMakeLists.txt

Thanks,
Sebastian
--
Qualcomm Innovation Center, Inc is a member of Code Aurora Forum
From d27eef5acdbe4150784bcebca8923d79cd0d9e55 Mon Sep 17 00:00:00 2001
From: Sebastian Pop <[email protected]>
Date: Thu, 9 Feb 2012 13:02:01 -0600
Subject: [PATCH] add configure flag --with-default-sysroot

---
 autoconf/configure.ac              |    7 +++++++
 configure                          |   17 ++++++++++++++++-
 include/llvm/Config/config.h.cmake |    3 ---
 include/llvm/Config/config.h.in    |    3 +++
 4 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/autoconf/configure.ac b/autoconf/configure.ac
index 5ea2e30..6ab1544 100644
--- a/autoconf/configure.ac
+++ b/autoconf/configure.ac
@@ -845,6 +845,13 @@ AC_ARG_WITH(gcc-toolchain,
 AC_DEFINE_UNQUOTED(GCC_INSTALL_PREFIX,"$withval",
                    [Directory where gcc is installed.])
 
+AC_ARG_WITH(sysroot,
+  AS_HELP_STRING([--with-default-sysroot],
+    [Add --sysroot=<path> to all compiler invocations.]),,
+    withval="")
+AC_DEFINE_UNQUOTED(DEFAULT_SYSROOT,"$withval",
+                   [Default <path> to all compiler invocations for --sysroot=<path>.])
+
 dnl Allow linking of LLVM with GPLv3 binutils code.
 AC_ARG_WITH(binutils-include,
   AS_HELP_STRING([--with-binutils-include],
diff --git a/configure b/configure
index 00f49df..254e96b 100755
--- a/configure
+++ b/configure
@@ -1442,6 +1442,7 @@ Optional Packages:
   --with-c-include-dirs   Colon separated list of directories clang will
                           search for headers
   --with-gcc-toolchain    Directory where gcc is installed.
+  --with-default-sysroot  Add --sysroot=<path> to all compiler invocations.
   --with-binutils-include Specify path to binutils/include/ containing
                           plugin-api.h file for gold plugin.
   --with-bug-report-url   Specify the URL where bug reports should be
@@ -5592,6 +5593,20 @@ _ACEOF
 
 
 
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then
+  withval=$with_sysroot;
+else
+  withval=""
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_SYSROOT "$withval"
+_ACEOF
+
+
+
 # Check whether --with-binutils-include was given.
 if test "${with_binutils_include+set}" = set; then
   withval=$with_binutils_include;
@@ -10395,7 +10410,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 10398 "configure"
+#line 10413 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake
index c475014..55e738f 100644
--- a/include/llvm/Config/config.h.cmake
+++ b/include/llvm/Config/config.h.cmake
@@ -11,9 +11,6 @@
 /* Relative directory for resource files */
 #define CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}"
 
-/* Directory wherelibstdc++ is installed. */
-#define GCC_INSTALL_PREFIX "${GCC_INSTALL_PREFIX}"
-
 /* Directories clang will search for headers */
 #define C_INCLUDE_DIRS "${C_INCLUDE_DIRS}"
 
diff --git a/include/llvm/Config/config.h.in b/include/llvm/Config/config.h.in
index 1a996a2..62376b1 100644
--- a/include/llvm/Config/config.h.in
+++ b/include/llvm/Config/config.h.in
@@ -12,6 +12,9 @@
 /* Directories clang will search for headers */
 #undef C_INCLUDE_DIRS
 
+/* Default <path> to all compiler invocations for --sysroot=<path>. */
+#undef DEFAULT_SYSROOT
+
 /* Define if CBE is enabled for printf %a output */
 #undef ENABLE_CBE_PRINTF_A
 
-- 
1.7.5.4

From a6c17b4fe73a7f959e5ec3d7de2583c5a51bef95 Mon Sep 17 00:00:00 2001
From: Sebastian Pop <[email protected]>
Date: Thu, 9 Feb 2012 13:06:08 -0600
Subject: [PATCH] use DEFAULT_SYSROOT

---
 CMakeLists.txt                      |    4 ++++
 include/clang/Config/config.h.cmake |    9 ++++++---
 include/clang/Config/config.h.in    |    9 ++++++---
 include/clang/Driver/Compilation.h  |    8 ++++++++
 lib/Driver/Compilation.cpp          |    5 +++--
 lib/Driver/Driver.cpp               |   16 +++++++++++++---
 lib/Driver/Tools.cpp                |   10 ++++++----
 7 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1197610..c828482 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -66,6 +66,10 @@ set(CLANG_RESOURCE_DIR "" CACHE STRING
 set(C_INCLUDE_DIRS "" CACHE STRING
   "Colon separated list of directories clang will search for headers.")
 
+set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
+set(DEFAULT_SYSROOT "" CACHE PATH
+  "Default <path> to all compiler invocations for --sysroot=<path>." )
+
 set(CLANG_VENDOR "" CACHE STRING
   "Vendor-specific text for showing with version information.")
 
diff --git a/include/clang/Config/config.h.cmake b/include/clang/Config/config.h.cmake
index bd5dc31..c18c4cc 100644
--- a/include/clang/Config/config.h.cmake
+++ b/include/clang/Config/config.h.cmake
@@ -4,8 +4,11 @@
 /* Relative directory for resource files */
 #define CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}"
 
-/* Directory where gcc is installed. */
-#define GCC_INSTALL_PREFIX "${GCC_INSTALL_PREFIX}"
-
 /* Directories clang will search for headers */
 #define C_INCLUDE_DIRS "${C_INCLUDE_DIRS}"
+
+/* Default <path> to all compiler invocations for --sysroot=<path>. */
+#define DEFAULT_SYSROOT "${DEFAULT_SYSROOT}"
+
+/* Directory where gcc is installed. */
+#define GCC_INSTALL_PREFIX "${GCC_INSTALL_PREFIX}"
diff --git a/include/clang/Config/config.h.in b/include/clang/Config/config.h.in
index 3f5d503..24ed6bd 100644
--- a/include/clang/Config/config.h.in
+++ b/include/clang/Config/config.h.in
@@ -9,10 +9,13 @@
 /* Relative directory for resource files */
 #undef CLANG_RESOURCE_DIR
 
-/* Directory where gcc is installed. */
-#undef GCC_INSTALL_PREFIX
-
 /* Directories clang will search for headers */
 #undef C_INCLUDE_DIRS
 
+/* Default <path> to all compiler invocations for --sysroot=<path>. */
+#undef DEFAULT_SYSROOT
+
+/* Directory where gcc is installed. */
+#undef GCC_INSTALL_PREFIX
+
 #endif
diff --git a/include/clang/Driver/Compilation.h b/include/clang/Driver/Compilation.h
index fd88c3a..6a8f351 100644
--- a/include/clang/Driver/Compilation.h
+++ b/include/clang/Driver/Compilation.h
@@ -63,6 +63,9 @@ class Compilation {
   /// Redirection for stdout, stderr, etc.
   const llvm::sys::Path **Redirects;
 
+  /// sysroot, if present.
+  StringRef SysRoot;
+
 public:
   Compilation(const Driver &D, const ToolChain &DefaultToolChain,
               InputArgList *Args, DerivedArgList *TranslatedArgs);
@@ -92,6 +95,11 @@ public:
     return FailureResultFiles;
   }
 
+  /// Returns the sysroot path without the trailing /.
+  StringRef getSysRoot() const {
+    return SysRoot;
+  }
+
   /// getArgsForToolChain - Return the derived argument list for the
   /// tool chain \arg TC (or the default tool chain, if TC is not
   /// specified).
diff --git a/lib/Driver/Compilation.cpp b/lib/Driver/Compilation.cpp
index 42c8449..cd72fe9 100644
--- a/lib/Driver/Compilation.cpp
+++ b/lib/Driver/Compilation.cpp
@@ -7,9 +7,10 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "clang/Config/config.h"
 #include "clang/Driver/Compilation.h"
-
 #include "clang/Driver/Action.h"
+#include "clang/Driver/Arg.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/DriverDiagnostic.h"
@@ -28,7 +29,7 @@ using namespace clang;
 Compilation::Compilation(const Driver &D, const ToolChain &_DefaultToolChain,
                          InputArgList *_Args, DerivedArgList *_TranslatedArgs)
   : TheDriver(D), DefaultToolChain(_DefaultToolChain), Args(_Args),
-    TranslatedArgs(_TranslatedArgs), Redirects(0) {
+    TranslatedArgs(_TranslatedArgs), Redirects(0), SysRoot(D.SysRoot) {
 }
 
 Compilation::~Compilation() {
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index c985e2f..b83e525 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -323,8 +323,20 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
     A->claim();
     PrefixDirs.push_back(A->getValue(*Args, 0));
   }
+
   if (const Arg *A = Args->getLastArg(options::OPT__sysroot_EQ))
     SysRoot = A->getValue(*Args);
+  else
+    SysRoot = DEFAULT_SYSROOT;
+
+  if (SysRoot != "") {
+    llvm::SmallString<128> Prefix(SysRoot);
+    if (Prefix.back() == '/') {
+      llvm::sys::path::remove_filename(Prefix); // remove the /
+      SysRoot = Prefix.str();
+    }
+  }
+
   if (Args->hasArg(options::OPT_nostdlib))
     UseStdLib = false;
 
@@ -659,9 +671,7 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
     llvm::outs() << "\n";
     llvm::outs() << "libraries: =" << ResourceDir;
 
-    std::string sysroot;
-    if (Arg *A = C.getArgs().getLastArg(options::OPT__sysroot_EQ))
-      sysroot = A->getValue(C.getArgs());
+    StringRef sysroot = C.getSysRoot();
 
     for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(),
            ie = TC.getFilePaths().end(); it != ie; ++it) {
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index c9db799..64bb6a2 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -373,10 +373,11 @@ void Clang::AddPreprocessingOptions(Compilation &C,
 
   // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
   // -isysroot to the CC1 invocation.
-  if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
+  StringRef sysroot = C.getSysRoot();
+  if (sysroot != "") {
     if (!Args.hasArg(options::OPT_isysroot)) {
       CmdArgs.push_back("-isysroot");
-      CmdArgs.push_back(A->getValue(Args));
+      CmdArgs.push_back(sysroot.str().c_str());
     }
   }
   
@@ -3906,9 +3907,10 @@ void darwin::Link::AddLinkArgs(Compilation &C,
 
   // Give --sysroot= preference, over the Apple specific behavior to also use
   // --isysroot as the syslibroot.
-  if (const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
+  StringRef sysroot = C.getSysRoot();
+  if (sysroot != "") {
     CmdArgs.push_back("-syslibroot");
-    CmdArgs.push_back(A->getValue(Args));
+    CmdArgs.push_back(sysroot.str().c_str());
   } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
     CmdArgs.push_back("-syslibroot");
     CmdArgs.push_back(A->getValue(Args));
-- 
1.7.5.4

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to