r224924 - [multilib] Teach Clang's code about multilib by threading

Alexey Samsonov vonosmas at gmail.com
Mon Dec 29 12:07:11 PST 2014


... and the problem seems to be that getMainExecutable() returns a
StringRef to local buffer. I'll test a fix for that.

On Mon, Dec 29, 2014 at 11:44 AM, Alexey Samsonov <vonosmas at gmail.com>
wrote:

> Looks like this caused
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/204/steps/check-clang%20msan/logs/stdio
>
> On Mon, Dec 29, 2014 at 4:09 AM, Chandler Carruth <chandlerc at gmail.com>
> wrote:
>
>> Author: chandlerc
>> Date: Mon Dec 29 06:09:08 2014
>> New Revision: 224924
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=224924&view=rev
>> Log:
>> [multilib] Teach Clang's code about multilib by threading
>> a CLANG_LIBDIR_SUFFIX down from the build system and using that as part
>> of the default resource dir computation.
>>
>> Without this, essentially nothing that uses the clang driver works when
>> building clang with a libdir suffix. This is probably the single biggest
>> missing piece of support for multilib as without this people could hack
>> clang to end up installed in the correct location, but it would then
>> fail to find its own basic resources. I know of at least one distro that
>> has some variation on this patch to hack around this; hopefully they'll
>> be able to use the libdir suffix functionality directly as the rest of
>> these bits land.
>>
>> This required fixing a copy of the code to compute Clang's resource
>> directory that is buried inside of the frontend (!!!). It had bitrotted
>> significantly relative to the driver code. I've made it essentially
>> a clone of the driver code in order to keep tests (which use cc1
>> heavily) passing. This copy should probably just be removed and the
>> frontend taught to always rely on an explicit resource directory from
>> the driver, but that is a much more invasive change for another day.
>>
>> I've also updated one test which actually encoded the resource directory
>> in its checked output to tolerate multilib suffixes.
>>
>> Note that this relies on a prior LLVM commit to add a stub to the
>> autoconf build system for this variable.
>>
>> Modified:
>>     cfe/trunk/CMakeLists.txt
>>     cfe/trunk/include/clang/Config/config.h.cmake
>>     cfe/trunk/include/clang/Config/config.h.in
>>     cfe/trunk/lib/Driver/Driver.cpp
>>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>     cfe/trunk/test/Preprocessor/iwithprefix.c
>>
>> Modified: cfe/trunk/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/CMakeLists.txt?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/CMakeLists.txt (original)
>> +++ cfe/trunk/CMakeLists.txt Mon Dec 29 06:09:08 2014
>> @@ -193,6 +193,9 @@ endif()
>>  set(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING
>>    "Vendor-specific uti.")
>>
>> +# The libdir suffix must exactly match whatever LLVM's configuration
>> used.
>> +set(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")
>> +
>>  set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
>>  set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
>>
>>
>> Modified: cfe/trunk/include/clang/Config/config.h.cmake
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Config/config.h.cmake?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Config/config.h.cmake (original)
>> +++ cfe/trunk/include/clang/Config/config.h.cmake Mon Dec 29 06:09:08 2014
>> @@ -8,6 +8,9 @@
>>  /* Bug report URL. */
>>  #define BUG_REPORT_URL "${BUG_REPORT_URL}"
>>
>> +/* Multilib suffix for libdir. */
>> +#define CLANG_LIBDIR_SUFFIX "${CLANG_LIBDIR_SUFFIX}"
>> +
>>  /* Relative directory for resource files */
>>  #define CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}"
>>
>>
>> Modified: cfe/trunk/include/clang/Config/config.h.in
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Config/config.h.in?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Config/config.h.in (original)
>> +++ cfe/trunk/include/clang/Config/config.h.in Mon Dec 29 06:09:08 2014
>> @@ -8,6 +8,9 @@
>>  /* Bug report URL. */
>>  #undef BUG_REPORT_URL
>>
>> +/* Multilib suffix for libdir. */
>> +#undef CLANG_LIBDIR_SUFFIX
>> +
>>  /* Relative directory for resource files */
>>  #undef CLANG_RESOURCE_DIR
>>
>>
>> Modified: cfe/trunk/lib/Driver/Driver.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Driver.cpp (original)
>> +++ cfe/trunk/lib/Driver/Driver.cpp Mon Dec 29 06:09:08 2014
>> @@ -65,10 +65,13 @@ Driver::Driver(StringRef ClangExecutable
>>    // Compute the path to the resource directory.
>>    StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
>>    SmallString<128> P(Dir);
>> -  if (ClangResourceDir != "")
>> +  if (ClangResourceDir != "") {
>>      llvm::sys::path::append(P, ClangResourceDir);
>> -  else
>> -    llvm::sys::path::append(P, "..", "lib", "clang",
>> CLANG_VERSION_STRING);
>> +  } else {
>> +    StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
>> +    llvm::sys::path::append(P, "..", Twine("lib") + ClangLibdirSuffix,
>> "clang",
>> +                            CLANG_VERSION_STRING);
>> +  }
>>    ResourceDir = P.str();
>>  }
>>
>>
>> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Dec 29 06:09:08 2014
>> @@ -10,6 +10,7 @@
>>  #include "clang/Frontend/CompilerInvocation.h"
>>  #include "clang/Basic/FileManager.h"
>>  #include "clang/Basic/Version.h"
>> +#include "clang/Config/config.h"
>>  #include "clang/Driver/DriverDiagnostic.h"
>>  #include "clang/Driver/Options.h"
>>  #include "clang/Driver/Util.h"
>> @@ -982,14 +983,18 @@ static InputKind ParseFrontendArgs(Front
>>
>>  std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
>>                                                   void *MainAddr) {
>> -  SmallString<128> P(llvm::sys::fs::getMainExecutable(Argv0, MainAddr));
>> +  StringRef ClangExecutable = llvm::sys::fs::getMainExecutable(Argv0,
>> MainAddr);
>> +  StringRef Dir = llvm::sys::path::parent_path(ClangExecutable);
>>
>> -  if (!P.empty()) {
>> -    llvm::sys::path::remove_filename(P); // Remove /clang from
>> foo/bin/clang
>> -    llvm::sys::path::remove_filename(P); // Remove /bin   from foo/bin
>> -
>> -    // Get foo/lib/clang/<version>/include
>> -    llvm::sys::path::append(P, "lib", "clang", CLANG_VERSION_STRING);
>> +  // Compute the path to the resource directory.
>> +  StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
>> +  SmallString<128> P(Dir);
>> +  if (ClangResourceDir != "") {
>> +    llvm::sys::path::append(P, ClangResourceDir);
>> +  } else {
>> +    StringRef ClangLibdirSuffix(CLANG_LIBDIR_SUFFIX);
>> +    llvm::sys::path::append(P, "..", Twine("lib") + ClangLibdirSuffix,
>> "clang",
>> +                            CLANG_VERSION_STRING);
>>    }
>>
>>    return P.str();
>>
>> Modified: cfe/trunk/test/Preprocessor/iwithprefix.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/iwithprefix.c?rev=224924&r1=224923&r2=224924&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Preprocessor/iwithprefix.c (original)
>> +++ cfe/trunk/test/Preprocessor/iwithprefix.c Mon Dec 29 06:09:08 2014
>> @@ -9,7 +9,7 @@
>>
>>  // CHECK: #include <...> search starts here:
>>  // CHECK: {{.*}}.tmps/first
>> -// CHECK: {{/|\\}}lib{{/|\\}}clang{{/|\\}}{{[.0-9]+}}{{/|\\}}include
>> +// CHECK:
>> {{/|\\}}lib{{(32|64)?}}{{/|\\}}clang{{/|\\}}{{[.0-9]+}}{{/|\\}}include
>>  // CHECK: {{.*}}.tmps/second
>>  // CHECK-NOT: {{.*}}.tmps
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com
>



-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141229/4d585569/attachment.html>


More information about the cfe-commits mailing list