[clang-tools-extra] r291446 - [include-fixer] Load symbol index asynchronously.

Bill Seurer via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 10 11:31:52 PST 2017


On 01/09/2017 09:18 AM, Benjamin Kramer via cfe-commits wrote:
> Author: d0k
> Date: Mon Jan  9 09:18:28 2017
> New Revision: 291446
>
> URL: http://llvm.org/viewvc/llvm-project?rev=291446&view=rev
> Log:
> [include-fixer] Load symbol index asynchronously.
>
> We don't actually need the index until parse time, so fetch it in the
> background and start parsing. By the time it is actually needed it's
> likely that the loading phase has completed in the background.

This update causes a linker error on ppc64le on a Release+Asserts+Shared 
build.

cmake with -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON 
-DBUILD_SHARED_LIBS=ON

http://lab.llvm.org:8011/builders/clang-ppc64le-linux-multistage/builds/754


Details:

[117/123] Linking CXX shared library 
lib/libclangIncludeFixerPlugin.so.40.0svn
FAILED: : && /home/seurer/gcc/install/gcc-5.4.0/bin/g++  -fPIC -fPIC 
-fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter 
-Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic 
-Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor 
-Wno-comment -Werror=date-time -std=c++11 -ffunction-sections 
-fdata-sections -fno-common -Woverloaded-virtual -fno-strict-aliasing 
-O3  -L/home/seurer/gcc/install/gcc-5.4.0/lib64 -Wl,-z,defs 
-Wl,-rpath-link,/home/seurer/llvm/build/llvm-test2/./lib  -Wl,-O3 
-Wl,--gc-sections -shared -Wl,-soname,libclangIncludeFixerPlugin.so.40 
-o lib/libclangIncludeFixerPlugin.so.40.0svn 
tools/clang/tools/extra/include-fixer/plugin/CMakeFiles/clangIncludeFixerPlugin.dir/IncludeFixerPlugin.cpp.o 
  lib/libclangAST.so.40.0svn lib/libclangBasic.so.40.0svn 
lib/libclangFrontend.so.40.0svn lib/libclangIncludeFixer.so.40.0svn 
lib/libclangParse.so.40.0svn lib/libclangSema.so.40.0svn 
lib/libclangTooling.so.40.0svn lib/libLLVMSupport.so.40.0svn 
-Wl,-rpath,"\$ORIGIN/../lib" && :
tools/clang/tools/extra/include-fixer/plugin/CMakeFiles/clangIncludeFixerPlugin.dir/IncludeFixerPlugin.cpp.o:(.toc+0xb0): 
undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
[117/123] Building CXX object 
tools/clang/tools/extra/include-fixer/tool/CMakeFiles/clang-include-fixer.dir/ClangIncludeFixer.cpp.o
ninja: build stopped: subcommand failed.
[1/7] Linking CXX shared library lib/libclangIncludeFixerPlugin.so.40.0svn
FAILED: : && /home/seurer/gcc/install/gcc-5.4.0/bin/g++  -fPIC -fPIC 
-fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter 
-Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic 
-Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor 
-Wno-comment -Werror=date-time -std=c++11 -ffunction-sections 
-fdata-sections -fno-common -Woverloaded-virtual -fno-strict-aliasing 
-O3  -L/home/seurer/gcc/install/gcc-5.4.0/lib64 -Wl,-z,defs 
-Wl,-rpath-link,/home/seurer/llvm/build/llvm-test2/./lib  -Wl,-O3 
-Wl,--gc-sections -shared -Wl,-soname,libclangIncludeFixerPlugin.so.40 
-o lib/libclangIncludeFixerPlugin.so.40.0svn 
tools/clang/tools/extra/include-fixer/plugin/CMakeFiles/clangIncludeFixerPlugin.dir/IncludeFixerPlugin.cpp.o 
  lib/libclangAST.so.40.0svn lib/libclangBasic.so.40.0svn 
lib/libclangFrontend.so.40.0svn lib/libclangIncludeFixer.so.40.0svn 
lib/libclangParse.so.40.0svn lib/libclangSema.so.40.0svn 
lib/libclangTooling.so.40.0svn lib/libLLVMSupport.so.40.0svn 
-Wl,-rpath,"\$ORIGIN/../lib" && :
tools/clang/tools/extra/include-fixer/plugin/CMakeFiles/clangIncludeFixerPlugin.dir/IncludeFixerPlugin.cpp.o:(.toc+0xb0): 
undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status




> Modified:
>     clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp
>     clang-tools-extra/trunk/include-fixer/SymbolIndexManager.h
>     clang-tools-extra/trunk/include-fixer/plugin/IncludeFixerPlugin.cpp
>     clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp
>     clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp
>
> Modified: clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp?rev=291446&r1=291445&r2=291446&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp (original)
> +++ clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp Mon Jan  9 09:18:28 2017
> @@ -64,7 +64,7 @@ SymbolIndexManager::search(llvm::StringR
>    do {
>      std::vector<clang::find_all_symbols::SymbolInfo> Symbols;
>      for (const auto &DB : SymbolIndices) {
> -      auto Res = DB->search(Names.back().str());
> +      auto Res = DB.get()->search(Names.back());
>        Symbols.insert(Symbols.end(), Res.begin(), Res.end());
>      }
>
>
> Modified: clang-tools-extra/trunk/include-fixer/SymbolIndexManager.h
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/SymbolIndexManager.h?rev=291446&r1=291445&r2=291446&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/include-fixer/SymbolIndexManager.h (original)
> +++ clang-tools-extra/trunk/include-fixer/SymbolIndexManager.h Mon Jan  9 09:18:28 2017
> @@ -13,6 +13,7 @@
>  #include "SymbolIndex.h"
>  #include "find-all-symbols/SymbolInfo.h"
>  #include "llvm/ADT/StringRef.h"
> +#include <future>
>
>  namespace clang {
>  namespace include_fixer {
> @@ -21,8 +22,8 @@ namespace include_fixer {
>  /// to an indentifier in the source code from multiple symbol databases.
>  class SymbolIndexManager {
>  public:
> -  void addSymbolIndex(std::unique_ptr<SymbolIndex> DB) {
> -    SymbolIndices.push_back(std::move(DB));
> +  void addSymbolIndex(std::function<std::unique_ptr<SymbolIndex>()> F) {
> +    SymbolIndices.push_back(std::async(std::launch::async, F));
>    }
>
>    /// Search for header files to be included for an identifier.
> @@ -39,7 +40,7 @@ public:
>    search(llvm::StringRef Identifier, bool IsNestedSearch = true) const;
>
>  private:
> -  std::vector<std::unique_ptr<SymbolIndex>> SymbolIndices;
> +  std::vector<std::shared_future<std::unique_ptr<SymbolIndex>>> SymbolIndices;
>  };
>
>  } // namespace include_fixer
>
> Modified: clang-tools-extra/trunk/include-fixer/plugin/IncludeFixerPlugin.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/plugin/IncludeFixerPlugin.cpp?rev=291446&r1=291445&r2=291446&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/include-fixer/plugin/IncludeFixerPlugin.cpp (original)
> +++ clang-tools-extra/trunk/include-fixer/plugin/IncludeFixerPlugin.cpp Mon Jan  9 09:18:28 2017
> @@ -61,23 +61,26 @@ public:
>          Input = Arg.substr(strlen("-input="));
>      }
>
> -    llvm::ErrorOr<std::unique_ptr<include_fixer::YamlSymbolIndex>> SymbolIdx(
> -        nullptr);
> -    if (DB == "yaml") {
> -      if (!Input.empty()) {
> -        SymbolIdx = include_fixer::YamlSymbolIndex::createFromFile(Input);
> -      } else {
> -        // If we don't have any input file, look in the directory of the first
> -        // file and its parents.
> -        const FrontendOptions &FO = CI.getFrontendOpts();
> -        SmallString<128> AbsolutePath(
> -            tooling::getAbsolutePath(FO.Inputs[0].getFile()));
> -        StringRef Directory = llvm::sys::path::parent_path(AbsolutePath);
> -        SymbolIdx = include_fixer::YamlSymbolIndex::createFromDirectory(
> -            Directory, "find_all_symbols_db.yaml");
> +    std::string InputFile = CI.getFrontendOpts().Inputs[0].getFile();
> +    auto CreateYamlIdx = [=]() -> std::unique_ptr<include_fixer::SymbolIndex> {
> +      llvm::ErrorOr<std::unique_ptr<include_fixer::YamlSymbolIndex>> SymbolIdx(
> +          nullptr);
> +      if (DB == "yaml") {
> +        if (!Input.empty()) {
> +          SymbolIdx = include_fixer::YamlSymbolIndex::createFromFile(Input);
> +        } else {
> +          // If we don't have any input file, look in the directory of the first
> +          // file and its parents.
> +          SmallString<128> AbsolutePath(tooling::getAbsolutePath(InputFile));
> +          StringRef Directory = llvm::sys::path::parent_path(AbsolutePath);
> +          SymbolIdx = include_fixer::YamlSymbolIndex::createFromDirectory(
> +              Directory, "find_all_symbols_db.yaml");
> +        }
>        }
> -    }
> -    SymbolIndexMgr->addSymbolIndex(std::move(*SymbolIdx));
> +      return std::move(*SymbolIdx);
> +    };
> +
> +    SymbolIndexMgr->addSymbolIndex(std::move(CreateYamlIdx));
>      return true;
>    }
>
>
> Modified: clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp?rev=291446&r1=291445&r2=291446&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp (original)
> +++ clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp Mon Jan  9 09:18:28 2017
> @@ -179,30 +179,36 @@ createSymbolIndexManager(StringRef FileP
>              find_all_symbols::SymbolInfo::SymbolKind::Unknown,
>              CommaSplits[I].trim(), 1, {}, /*NumOccurrences=*/E - I));
>      }
> -    SymbolIndexMgr->addSymbolIndex(
> -        llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols));
> +    SymbolIndexMgr->addSymbolIndex([=]() {
> +      return llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols);
> +    });
>      break;
>    }
>    case yaml: {
> -    llvm::ErrorOr<std::unique_ptr<include_fixer::YamlSymbolIndex>> DB(nullptr);
> -    if (!Input.empty()) {
> -      DB = include_fixer::YamlSymbolIndex::createFromFile(Input);
> -    } else {
> -      // If we don't have any input file, look in the directory of the first
> -      // file and its parents.
> -      SmallString<128> AbsolutePath(tooling::getAbsolutePath(FilePath));
> -      StringRef Directory = llvm::sys::path::parent_path(AbsolutePath);
> -      DB = include_fixer::YamlSymbolIndex::createFromDirectory(
> -          Directory, "find_all_symbols_db.yaml");
> -    }
> +    auto CreateYamlIdx = [=]() -> std::unique_ptr<include_fixer::SymbolIndex> {
> +      llvm::ErrorOr<std::unique_ptr<include_fixer::YamlSymbolIndex>> DB(
> +          nullptr);
> +      if (!Input.empty()) {
> +        DB = include_fixer::YamlSymbolIndex::createFromFile(Input);
> +      } else {
> +        // If we don't have any input file, look in the directory of the
> +        // first
> +        // file and its parents.
> +        SmallString<128> AbsolutePath(tooling::getAbsolutePath(FilePath));
> +        StringRef Directory = llvm::sys::path::parent_path(AbsolutePath);
> +        DB = include_fixer::YamlSymbolIndex::createFromDirectory(
> +            Directory, "find_all_symbols_db.yaml");
> +      }
>
> -    if (!DB) {
> -      llvm::errs() << "Couldn't find YAML db: " << DB.getError().message()
> -                   << '\n';
> -      return nullptr;
> -    }
> +      if (!DB) {
> +        llvm::errs() << "Couldn't find YAML db: " << DB.getError().message()
> +                     << '\n';
> +        return nullptr;
> +      }
> +      return std::move(*DB);
> +    };
>
> -    SymbolIndexMgr->addSymbolIndex(std::move(*DB));
> +    SymbolIndexMgr->addSymbolIndex(std::move(CreateYamlIdx));
>      break;
>    }
>    }
>
> Modified: clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp?rev=291446&r1=291445&r2=291446&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp (original)
> +++ clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp Mon Jan  9 09:18:28 2017
> @@ -85,8 +85,9 @@ static std::string runIncludeFixer(
>                   1, {}),
>    };
>    auto SymbolIndexMgr = llvm::make_unique<include_fixer::SymbolIndexManager>();
> -  SymbolIndexMgr->addSymbolIndex(
> -      llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols));
> +  SymbolIndexMgr->addSymbolIndex([=]() {
> +    return llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols);
> +  });
>
>    std::vector<IncludeFixerContext> FixerContexts;
>    IncludeFixerActionFactory Factory(*SymbolIndexMgr, FixerContexts, "llvm");
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


-- 

-Bill Seurer



More information about the cfe-commits mailing list