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 <akyr...@gmail.com> wrote: > On Feb 13, 2016, at 11:34 PM, NAKAMURA Takumi <geek4ci...@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@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 >> + >> +@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 >> +@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@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits