2014-01-05 3 views
3

Если у меня есть несколько файлов в большом проекте, все из которых имеют большое количество включенных заголовочных файлов, есть ли способ поделиться работой по разбору файлов заголовков? Я надеялся, что создание одного индекса, а затем добавить несколько translationUnits к ней может вызвать некоторую работу для совместного использования - однако даже код вдоль линий (псевдокода)можно разделить работу при разборе нескольких файлов с помощью libclang?

index = clang_createIndex(); 
clang_parseTranslationUnit(index, "myfile"); 
clang_parseTranslationUnit(index, "myfile"); 

, кажется, берета полного количества времени для каждого вызова в parseTranslationUnit, не выполняя не лучше, чем

index1 = clang_createIndex(); 
clang_parseTranslationUnit(index1, "myfile"); 
index2 = clang_createIndex(); 
clang_parseTranslationUnit(index2, "myfile"); 

Я знаю, что существуют специализированные функции для повторной обработки и тот же файл; однако я действительно хочу, чтобы синтаксический анализ «myfile1» и «myfile2» мог разделить работу синтаксического анализа «myheader.h», а функции, зависящие от репарации, там не помогут.

В качестве подвопроса существует ли значительная разница между повторным использованием индекса и созданием нового индекса для каждой единицы перевода?

ответ

2

Один из способов сделать это состоит в создании Precompiled Headers (PCH-файла) из общего заголовка в вашем проекте.

Что-то вдоль этих линий, кажется, работает (вы можете увидеть весь пример here):

auto Idx = clang_createIndex (0, 0); 
    CXTranslationUnit TU; 
    Timer t; 

    { 
    char const *args[] = { "-xc++", "foo.hxx" }; 
    int nargs = 2; 

    t.reset(); 
    TU = clang_parseTranslationUnit(Idx, 0, args, nargs, 0, 0, CXTranslationUnit_ForSerialization); 
    std::cerr << "PCH parse time: " << t.get() << std::endl; 
    displayDiagnostics (TU); 
    clang_saveTranslationUnit (TU, "foo.pch", clang_defaultSaveOptions(TU)); 
    clang_disposeTranslationUnit (TU); 
    } 

    { 
    char const *args[] = { "-include-pch", "foo.pch", "foo.cxx" }; 
    int nargs = 3; 

    t.reset(); 
    TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0); 
    std::cerr << "foo.cxx parse time: " << t.get() << std::endl; 
    displayDiagnostics (TU); 
    clang_disposeTranslationUnit (TU); 
    } 

    { 
    char const *args[] = { "-include-pch", "foo.pch", "foo2.cxx" }; 
    int nargs = 3; 

    t.reset(); 
    TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0); 
    std::cerr << "foo2.cxx parse time: " << t.get() << std::endl; 
    displayDiagnostics (TU); 
    clang_disposeTranslationUnit (TU); 
    } 

получают следующий вывод:

PCH parse time: 5.35074 
0 diagnostics 

foo1.cxx parse time: 0.158232 
0 diagnostics 

foo2.cxx parse time: 0.143654 
0 diagnostics 

Я не нашел много информации о libclang и прекомпилирована заголовки в документации API, но вот несколько страниц, на которых отображается ключевое слово: CINDEX и TRANSLATION_UNIT

Обратите внимание, что это решение не является оптимальным любым способом. Я с нетерпением жду лучших ответов. В частности:

  1. каждый исходный файл может иметь не более одного не предкомпилированный заголовок
  2. ничего здесь является libclang -специфическими; это та же самая стратегия, которая используется для оптимизации времени сборки, используя стандартные командные строки clang.
  3. не совсем автоматизирован, так как вы должны явно создать предварительно скомпилированный заголовок (и, следовательно, знать имя общего файла заголовка)
  4. Я не думаю, что использование разных объектов CXIndex в данном случае имело бы значение