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