r260842 - [index] Enhance c-index-test tool and have it link and test the clangIndex library directly.

NAKAMURA Takumi via cfe-commits cfe-commits at lists.llvm.org
Sun Feb 14 01:26:56 PST 2016


Okay, I won't object as far as it were safe that libclang (many clang/llvm
libraries are linked) and other static libraries could stand side-by-side.

I supposed c-index-test is the tool to run and check libclang.

FYI, you should specify libraries that are used in the target. Updated
in r260847.

On Sun, Feb 14, 2016 at 4:53 PM Argyrios Kyrtzidis <akyrtzi at gmail.com>
wrote:

> On Feb 13, 2016, at 11:34 PM, NAKAMURA Takumi <geek4civic at gmail.com>
> wrote:
>
> I guess it would break layering violation.
>
>
> Not sure what you mean, what is the layering violation ?
> I don’t see an issue with a tool binary linking both against the libclang
> C API and a C++ library. I could add yet another tool binary to link just
> against the C++ library but I preferred the simplicity of merging the
> functionality into the existing one and avoid maintaining yet another one.
>
>
> libclang exports just C API and it involves clangIndex, but coremain
> requires clangIndex and other dependent modules.
>
> I think you should do;
>   - Export C++ API in libclang. (But I don't expect it would work for
> win32)
>   - Link libclang as static. Then c-index-test became the test that didn't
> test "libclang".
>
> On Sun, Feb 14, 2016 at 3:43 PM Argyrios Kyrtzidis via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: akirtzidis
>> Date: Sun Feb 14 00:39:11 2016
>> New Revision: 260842
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=260842&view=rev
>> Log:
>> [index] Enhance c-index-test tool and have it link and test the
>> clangIndex library directly.
>>
>> Added:
>>     cfe/trunk/test/Index/Core/
>>     cfe/trunk/test/Index/Core/index-source.m
>>     cfe/trunk/tools/c-index-test/core_main.cpp
>> Modified:
>>     cfe/trunk/include/clang/Index/IndexSymbol.h
>>     cfe/trunk/lib/Index/IndexSymbol.cpp
>>     cfe/trunk/tools/c-index-test/CMakeLists.txt
>>     cfe/trunk/tools/c-index-test/c-index-test.c
>>
>> Modified: cfe/trunk/include/clang/Index/IndexSymbol.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexSymbol.h?rev=260842&r1=260841&r2=260842&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Index/IndexSymbol.h (original)
>> +++ cfe/trunk/include/clang/Index/IndexSymbol.h Sun Feb 14 00:39:11 2016
>> @@ -11,6 +11,7 @@
>>  #define LLVM_CLANG_INDEX_INDEXSYMBOL_H
>>
>>  #include "clang/Basic/LLVM.h"
>> +#include "llvm/ADT/STLExtras.h"
>>  #include "llvm/Support/DataTypes.h"
>>
>>  namespace clang {
>> @@ -107,6 +108,13 @@ struct SymbolInfo {
>>
>>  SymbolInfo getSymbolInfo(const Decl *D);
>>
>> +void applyForEachSymbolRole(SymbolRoleSet Roles,
>> +                            llvm::function_ref<void(SymbolRole)> Fn);
>> +void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);
>> +StringRef getSymbolKindString(SymbolKind K);
>> +StringRef getTemplateKindStr(SymbolCXXTemplateKind TK);
>> +StringRef getSymbolLanguageString(SymbolLanguage K);
>> +
>>  } // namespace index
>>  } // namespace clang
>>
>>
>> Modified: cfe/trunk/lib/Index/IndexSymbol.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=260842&r1=260841&r2=260842&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Index/IndexSymbol.cpp (original)
>> +++ cfe/trunk/lib/Index/IndexSymbol.cpp Sun Feb 14 00:39:11 2016
>> @@ -185,3 +185,102 @@ SymbolInfo index::getSymbolInfo(const De
>>
>>    return Info;
>>  }
>> +
>> +void index::applyForEachSymbolRole(SymbolRoleSet Roles,
>> +                                   llvm::function_ref<void(SymbolRole)>
>> Fn) {
>> +#define APPLY_FOR_ROLE(Role) \
>> +  if (Roles & (unsigned)SymbolRole::Role) \
>> +    Fn(SymbolRole::Role)
>> +
>> +  APPLY_FOR_ROLE(Declaration);
>> +  APPLY_FOR_ROLE(Definition);
>> +  APPLY_FOR_ROLE(Reference);
>> +  APPLY_FOR_ROLE(Read);
>> +  APPLY_FOR_ROLE(Write);
>> +  APPLY_FOR_ROLE(Call);
>> +  APPLY_FOR_ROLE(Dynamic);
>> +  APPLY_FOR_ROLE(AddressOf);
>> +  APPLY_FOR_ROLE(Implicit);
>> +  APPLY_FOR_ROLE(RelationChildOf);
>> +  APPLY_FOR_ROLE(RelationBaseOf);
>> +  APPLY_FOR_ROLE(RelationOverrideOf);
>> +  APPLY_FOR_ROLE(RelationReceivedBy);
>> +
>> +#undef APPLY_FOR_ROLE
>> +}
>> +
>> +void index::printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS) {
>> +  bool VisitedOnce = false;
>> +  applyForEachSymbolRole(Roles, [&](SymbolRole Role) {
>> +    if (VisitedOnce)
>> +      OS << '/';
>> +    else
>> +      VisitedOnce = true;
>> +    switch (Role) {
>> +    case SymbolRole::Declaration: OS << "Decl"; break;
>> +    case SymbolRole::Definition: OS << "Def"; break;
>> +    case SymbolRole::Reference: OS << "Ref"; break;
>> +    case SymbolRole::Read: OS << "Read"; break;
>> +    case SymbolRole::Write: OS << "Writ"; break;
>> +    case SymbolRole::Call: OS << "Call"; break;
>> +    case SymbolRole::Dynamic: OS << "Dyn"; break;
>> +    case SymbolRole::AddressOf: OS << "Addr"; break;
>> +    case SymbolRole::Implicit: OS << "Impl"; break;
>> +    case SymbolRole::RelationChildOf: OS << "RelChild"; break;
>> +    case SymbolRole::RelationBaseOf: OS << "RelBase"; break;
>> +    case SymbolRole::RelationOverrideOf: OS << "RelOver"; break;
>> +    case SymbolRole::RelationReceivedBy: OS << "RelRec"; break;
>> +    }
>> +  });
>> +}
>> +
>> +StringRef index::getSymbolKindString(SymbolKind K) {
>> +  switch (K) {
>> +  case SymbolKind::Unknown: return "<unknown>";
>> +  case SymbolKind::Module: return "module";
>> +  case SymbolKind::Macro: return "macro";
>> +  case SymbolKind::Enum: return "enum";
>> +  case SymbolKind::Struct: return "struct";
>> +  case SymbolKind::Union: return "union";
>> +  case SymbolKind::Typedef: return "typedef";
>> +  case SymbolKind::Function: return "function";
>> +  case SymbolKind::Variable: return "variable";
>> +  case SymbolKind::Field: return "field";
>> +  case SymbolKind::EnumConstant: return "enumerator";
>> +  case SymbolKind::ObjCClass: return "objc-class";
>> +  case SymbolKind::ObjCProtocol: return "objc-protocol";
>> +  case SymbolKind::ObjCCategory: return "objc-category";
>> +  case SymbolKind::ObjCInstanceMethod: return "objc-instance-method";
>> +  case SymbolKind::ObjCClassMethod: return "objc-class-method";
>> +  case SymbolKind::ObjCProperty: return "objc-property";
>> +  case SymbolKind::ObjCIvar: return "objc-ivar";
>> +  case SymbolKind::CXXClass: return "c++-class";
>> +  case SymbolKind::CXXNamespace: return "namespace";
>> +  case SymbolKind::CXXNamespaceAlias: return "namespace-alias";
>> +  case SymbolKind::CXXStaticVariable: return "c++-static-var";
>> +  case SymbolKind::CXXStaticMethod: return "c++-static-method";
>> +  case SymbolKind::CXXInstanceMethod: return "c++-instance-method";
>> +  case SymbolKind::CXXConstructor: return "constructor";
>> +  case SymbolKind::CXXDestructor: return "destructor";
>> +  case SymbolKind::CXXConversionFunction: return "coversion-func";
>> +  case SymbolKind::CXXTypeAlias: return "type-alias";
>> +  case SymbolKind::CXXInterface: return "c++-__interface";
>> +  }
>> +}
>> +
>> +StringRef index::getTemplateKindStr(SymbolCXXTemplateKind TK) {
>> +  switch (TK) {
>> +  case SymbolCXXTemplateKind::NonTemplate: return "NT";
>> +  case SymbolCXXTemplateKind::Template : return "T";
>> +  case SymbolCXXTemplateKind::TemplatePartialSpecialization : return
>> "TPS";
>> +  case SymbolCXXTemplateKind::TemplateSpecialization: return "TS";
>> +  }
>> +}
>> +
>> +StringRef index::getSymbolLanguageString(SymbolLanguage K) {
>> +  switch (K) {
>> +  case SymbolLanguage::C: return "C";
>> +  case SymbolLanguage::ObjC: return "ObjC";
>> +  case SymbolLanguage::CXX: return "C++";
>> +  }
>> +}
>>
>> Added: cfe/trunk/test/Index/Core/index-source.m
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=260842&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/Index/Core/index-source.m (added)
>> +++ cfe/trunk/test/Index/Core/index-source.m Sun Feb 14 00:39:11 2016
>> @@ -0,0 +1,8 @@
>> +// RUN: c-index-test core -print-source-symbols -- %s | FileCheck %s
>> +
>> + at interface Base
>> +// CHECK: [[@LINE-1]]:12 | objc-class/ObjC | Base | c:objc(cs)Base |
>> Decl | rel: 0
>> +-(void)meth;
>> +// CHECK: [[@LINE-1]]:1 | objc-instance-method/ObjC | meth |
>> c:objc(cs)Base(im)meth | Decl/Dyn/RelChild | rel: 1
>> +// CHECK-NEXT: RelChild | Base | c:objc(cs)Base
>> + at end
>>
>> Modified: cfe/trunk/tools/c-index-test/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/CMakeLists.txt?rev=260842&r1=260841&r2=260842&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/tools/c-index-test/CMakeLists.txt (original)
>> +++ cfe/trunk/tools/c-index-test/CMakeLists.txt Sun Feb 14 00:39:11 2016
>> @@ -1,5 +1,10 @@
>> +set(LLVM_LINK_COMPONENTS
>> +  support
>> +)
>> +
>>  add_clang_executable(c-index-test
>>    c-index-test.c
>> +  core_main.cpp
>>    )
>>
>>  if(NOT MSVC)
>> @@ -12,10 +17,12 @@ endif()
>>  if (LLVM_BUILD_STATIC)
>>    target_link_libraries(c-index-test
>>      libclang_static
>> +    clangIndex
>>    )
>>  else()
>>    target_link_libraries(c-index-test
>>      libclang
>> +    clangIndex
>>    )
>>  endif()
>>
>>
>> Modified: cfe/trunk/tools/c-index-test/c-index-test.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=260842&r1=260841&r2=260842&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/tools/c-index-test/c-index-test.c (original)
>> +++ cfe/trunk/tools/c-index-test/c-index-test.c Sun Feb 14 00:39:11 2016
>> @@ -23,6 +23,8 @@
>>  #  include <unistd.h>
>>  #endif
>>
>> +extern int indextest_core_main(int argc, const char **argv);
>> +
>>
>>  /******************************************************************************/
>>  /* Utility functions.
>>      */
>>
>>  /******************************************************************************/
>> @@ -4410,13 +4412,15 @@ int cindextest_main(int argc, const char
>>   * size). */
>>
>>  typedef struct thread_info {
>> +  int (*main_func)(int argc, const char **argv);
>>    int argc;
>>    const char **argv;
>>    int result;
>>  } thread_info;
>>  void thread_runner(void *client_data_v) {
>>    thread_info *client_data = client_data_v;
>> -  client_data->result = cindextest_main(client_data->argc,
>> client_data->argv);
>> +  client_data->result = client_data->main_func(client_data->argc,
>> +                                               client_data->argv);
>>  }
>>
>>  static void flush_atexit(void) {
>> @@ -4435,11 +4439,19 @@ int main(int argc, const char **argv) {
>>    LIBXML_TEST_VERSION
>>  #endif
>>
>> -  if (getenv("CINDEXTEST_NOTHREADS"))
>> -    return cindextest_main(argc, argv);
>> -
>> +  client_data.main_func = cindextest_main;
>>    client_data.argc = argc;
>>    client_data.argv = argv;
>> +
>> +  if (argc > 1 && strcmp(argv[1], "core") == 0) {
>> +    client_data.main_func = indextest_core_main;
>> +    --client_data.argc;
>> +    ++client_data.argv;
>> +  }
>> +
>> +  if (getenv("CINDEXTEST_NOTHREADS"))
>> +    return client_data.main_func(client_data.argc, client_data.argv);
>> +
>>    clang_executeOnThread(thread_runner, &client_data, 0);
>>    return client_data.result;
>>  }
>>
>> Added: cfe/trunk/tools/c-index-test/core_main.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=260842&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/tools/c-index-test/core_main.cpp (added)
>> +++ cfe/trunk/tools/c-index-test/core_main.cpp Sun Feb 14 00:39:11 2016
>> @@ -0,0 +1,197 @@
>> +//===-- core_main.cpp - Core Index Tool testbed
>> ---------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/Frontend/ASTUnit.h"
>> +#include "clang/Frontend/CompilerInstance.h"
>> +#include "clang/Frontend/CompilerInvocation.h"
>> +#include "clang/Frontend/FrontendAction.h"
>> +#include "clang/Index/IndexingAction.h"
>> +#include "clang/Index/IndexDataConsumer.h"
>> +#include "clang/Index/USRGeneration.h"
>> +#include "llvm/Support/CommandLine.h"
>> +#include "llvm/Support/Signals.h"
>> +#include "llvm/Support/raw_ostream.h"
>> +#include "llvm/Support/PrettyStackTrace.h"
>> +
>> +using namespace clang;
>> +using namespace clang::index;
>> +using namespace llvm;
>> +
>> +extern "C" int indextest_core_main(int argc, const char **argv);
>> +
>> +namespace {
>> +
>> +enum class ActionType {
>> +  None,
>> +  PrintSourceSymbols,
>> +};
>> +
>> +namespace options {
>> +
>> +static cl::OptionCategory IndexTestCoreCategory("index-test-core
>> options");
>> +
>> +static cl::opt<ActionType>
>> +Action(cl::desc("Action:"), cl::init(ActionType::None),
>> +       cl::values(
>> +          clEnumValN(ActionType::PrintSourceSymbols,
>> +                     "print-source-symbols", "Print symbols from
>> source"),
>> +          clEnumValEnd),
>> +       cl::cat(IndexTestCoreCategory));
>> +
>> +static cl::extrahelp MoreHelp(
>> +  "\nAdd \"-- <compiler arguments>\" at the end to setup the compiler "
>> +  "invocation\n"
>> +);
>> +
>> +}
>> +} // anonymous namespace
>> +
>> +static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS);
>> +static void printSymbolNameAndUSR(const Decl *D, ASTContext &Ctx,
>> +                                  raw_ostream &OS);
>> +
>> +namespace {
>> +
>> +class PrintIndexDataConsumer : public IndexDataConsumer {
>> +  raw_ostream &OS;
>> +
>> +public:
>> +  PrintIndexDataConsumer(raw_ostream &OS) : OS(OS) {
>> +  }
>> +
>> +  bool handleDeclOccurence(const Decl *D, SymbolRoleSet Roles,
>> +                           ArrayRef<SymbolRelation> Relations,
>> +                           FileID FID, unsigned Offset,
>> +                           ASTNodeInfo ASTNode) override {
>> +    ASTContext &Ctx = D->getASTContext();
>> +    SourceManager &SM = Ctx.getSourceManager();
>> +
>> +    unsigned Line = SM.getLineNumber(FID, Offset);
>> +    unsigned Col = SM.getColumnNumber(FID, Offset);
>> +    OS << Line << ':' << Col << " | ";
>> +
>> +    printSymbolInfo(getSymbolInfo(D), OS);
>> +    OS << " | ";
>> +
>> +    printSymbolNameAndUSR(D, Ctx, OS);
>> +    OS << " | ";
>> +
>> +    printSymbolRoles(Roles, OS);
>> +    OS << " | ";
>> +
>> +    OS << "rel: " << Relations.size() << '\n';
>> +
>> +    for (auto &SymRel : Relations) {
>> +      OS << '\t';
>> +      printSymbolRoles(SymRel.Roles, OS);
>> +      OS << " | ";
>> +      printSymbolNameAndUSR(SymRel.RelatedSymbol, Ctx, OS);
>> +      OS << '\n';
>> +    }
>> +
>> +    return true;
>> +  }
>> +};
>> +
>> +} // anonymous namespace
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +// Print Source Symbols
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +static bool printSourceSymbols(ArrayRef<const char *> Args) {
>> +  SmallVector<const char *, 4> ArgsWithProgName;
>> +  ArgsWithProgName.push_back("clang");
>> +  ArgsWithProgName.append(Args.begin(), Args.end());
>> +  IntrusiveRefCntPtr<DiagnosticsEngine>
>> +    Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
>> +  IntrusiveRefCntPtr<CompilerInvocation>
>> +    CInvok(createInvocationFromCommandLine(ArgsWithProgName, Diags));
>> +  if (!CInvok)
>> +    return true;
>> +
>> +  auto DataConsumer = std::make_shared<PrintIndexDataConsumer>(outs());
>> +  IndexingOptions IndexOpts;
>> +  std::unique_ptr<FrontendAction> IndexAction;
>> +  IndexAction = createIndexingAction(DataConsumer, IndexOpts);
>> +
>> +  auto PCHContainerOps = std::make_shared<PCHContainerOperations>();
>> +  ASTUnit *Unit =
>> +   ASTUnit::LoadFromCompilerInvocationAction(CInvok.get(),
>> PCHContainerOps,
>> +                                             Diags, IndexAction.get());
>> +
>> +  if (!Unit)
>> +    return true;
>> +
>> +  return false;
>> +}
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +// Helper Utils
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS) {
>> +  OS << getSymbolKindString(SymInfo.Kind);
>> +  if (SymInfo.TemplateKind != SymbolCXXTemplateKind::NonTemplate) {
>> +    OS << '-' << getTemplateKindStr(SymInfo.TemplateKind);
>> +  }
>> +  OS << '/' << getSymbolLanguageString(SymInfo.Lang);
>> +}
>> +
>> +static void printSymbolNameAndUSR(const Decl *D, ASTContext &Ctx,
>> +                                  raw_ostream &OS) {
>> +  if (auto *ND = dyn_cast<NamedDecl>(D)) {
>> +    PrintingPolicy PrintPolicy(Ctx.getLangOpts());
>> +    ND->getDeclName().print(OS, PrintPolicy);
>> +  } else {
>> +    OS << "<no-name>";
>> +  }
>> +  OS << " | ";
>> +
>> +  SmallString<256> USRBuf;
>> +  if (generateUSRForDecl(D, USRBuf)) {
>> +    OS << "<no-usr>";
>> +  } else {
>> +    OS << USRBuf;
>> +  }
>> +}
>> +
>>
>> +//===----------------------------------------------------------------------===//
>> +// Command line processing.
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +int indextest_core_main(int argc, const char **argv) {
>> +  sys::PrintStackTraceOnErrorSignal();
>> +  PrettyStackTraceProgram X(argc, argv);
>> +
>> +  std::vector<const char *> CompArgs;
>> +  const char *const *DoubleDash = std::find(argv, argv + argc,
>> StringRef("--"));
>> +  if (DoubleDash != argv + argc) {
>> +    CompArgs = std::vector<const char *>(DoubleDash + 1, argv + argc);
>> +    argc = DoubleDash - argv;
>> +  }
>> +
>> +  cl::HideUnrelatedOptions(options::IndexTestCoreCategory);
>> +  cl::ParseCommandLineOptions(argc, argv, "index-test-core");
>> +
>> +  if (options::Action == ActionType::None) {
>> +    errs() << "error: action required; pass '-help' for options\n";
>> +    return 1;
>> +  }
>> +
>> +  if (options::Action == ActionType::PrintSourceSymbols) {
>> +    if (CompArgs.empty()) {
>> +      errs() << "error: missing compiler args; pass '-- <compiler
>> arguments>'\n";
>> +      return 1;
>> +    }
>> +    return printSourceSymbols(CompArgs);
>> +  }
>> +
>> +  return 0;
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160214/8ada0f1a/attachment-0001.html>


More information about the cfe-commits mailing list