From b5395ff11ac206e9cb3cd5fa97cb14c077e688ff Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Mon, 23 Nov 2015 19:56:46 +0000 Subject: [PATCH] Make clang_Cursor_getMangling not mangle if the declaration isn't mangled Right now clang_Cursor_getMangling will attempt to mangle any declaration, even if the declaration isn't mangled (extern C). This results in a partially mangled name which isn't useful for much. This patch makes clang_Cursor_getMangling return an empty string if the declaration isn't mangled. Patch by Michael Wu . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253909 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang-c/Index.h | 26 ++++++++++++++++++++++++++ test/Index/symbol-visibility.c | 7 +++++++ tools/c-index-test/c-index-test.c | 30 ++++++++++++++++++++++++++++++ tools/libclang/CIndex.cpp | 21 +++++++++++++++++++++ tools/libclang/libclang.exports | 1 + 5 files changed, 85 insertions(+) create mode 100644 test/Index/symbol-visibility.c diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 97d1ddecd9..b8314814d6 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -2460,6 +2460,32 @@ enum CXLinkageKind { */ CINDEX_LINKAGE enum CXLinkageKind clang_getCursorLinkage(CXCursor cursor); +/** + * \brief Describe the visibility of the entity referred to by a cursor. + * + * This returns the default visibility if not explicitly specified by + * a visibility attribute. The default visibility may be changed by + * commandline arguments. + * + * \param cursor The cursor to query. + * + * \returns The visibility of the cursor. + */ +enum CXVisibilityKind { + /** \brief This value indicates that no visibility information is available + * for a provided CXCursor. */ + CXVisibility_Invalid, + + /** \brief Symbol not seen by the linker. */ + CXVisibility_Hidden, + /** \brief Symbol seen by the linker but resolves to a symbol inside this object. */ + CXVisibility_Protected, + /** \brief Symbol seen by the linker and acts like a normal symbol. */ + CXVisibility_Default, +}; + +CINDEX_LINKAGE enum CXVisibilityKind clang_getCursorVisibility(CXCursor cursor); + /** * \brief Determine the availability of the entity that this cursor refers to, * taking the current target platform into account. diff --git a/test/Index/symbol-visibility.c b/test/Index/symbol-visibility.c new file mode 100644 index 0000000000..014e80f818 --- /dev/null +++ b/test/Index/symbol-visibility.c @@ -0,0 +1,7 @@ +// RUN: c-index-test -test-print-visibility %s | FileCheck %s + +__attribute__ ((visibility ("default"))) void foo1(); +__attribute__ ((visibility ("hidden"))) void foo2(); + +// CHECK: FunctionDecl=foo1:3:47visibility=Default +// CHECK: FunctionDecl=foo2:4:46visibility=Hidden diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 8181642d71..948195deba 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1247,6 +1247,32 @@ static enum CXChildVisitResult PrintLinkage(CXCursor cursor, CXCursor p, return CXChildVisit_Recurse; } +/******************************************************************************/ +/* Visibility testing. */ +/******************************************************************************/ + +static enum CXChildVisitResult PrintVisibility(CXCursor cursor, CXCursor p, + CXClientData d) { + const char *visibility = 0; + + if (clang_isInvalid(clang_getCursorKind(cursor))) + return CXChildVisit_Recurse; + + switch (clang_getCursorVisibility(cursor)) { + case CXVisibility_Invalid: break; + case CXVisibility_Hidden: visibility = "Hidden"; break; + case CXVisibility_Protected: visibility = "Protected"; break; + case CXVisibility_Default: visibility = "Default"; break; + } + + if (visibility) { + PrintCursor(cursor, NULL); + printf("visibility=%s\n", visibility); + } + + return CXChildVisit_Recurse; +} + /******************************************************************************/ /* Typekind testing. */ /******************************************************************************/ @@ -4084,6 +4110,7 @@ static void print_usage(void) { " c-index-test -test-inclusion-stack-tu \n"); fprintf(stderr, " c-index-test -test-print-linkage-source {}*\n" + " c-index-test -test-print-visibility {}*\n" " c-index-test -test-print-type {}*\n" " c-index-test -test-print-type-size {}*\n" " c-index-test -test-print-bitwidth {}*\n" @@ -4171,6 +4198,9 @@ int cindextest_main(int argc, const char **argv) { else if (argc > 2 && strcmp(argv[1], "-test-print-linkage-source") == 0) return perform_test_load_source(argc - 2, argv + 2, "all", PrintLinkage, NULL); + else if (argc > 2 && strcmp(argv[1], "-test-print-visibility") == 0) + return perform_test_load_source(argc - 2, argv + 2, "all", PrintVisibility, + NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-type") == 0) return perform_test_load_source(argc - 2, argv + 2, "all", PrintType, 0); diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index f070e39e71..589e39e797 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -6450,6 +6450,27 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { } } // end: extern "C" +//===----------------------------------------------------------------------===// +// Operations for querying visibility of a cursor. +//===----------------------------------------------------------------------===// + +extern "C" { +CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { + if (!clang_isDeclaration(cursor.kind)) + return CXVisibility_Invalid; + + const Decl *D = cxcursor::getCursorDecl(cursor); + if (const NamedDecl *ND = dyn_cast_or_null(D)) + switch (ND->getVisibility()) { + case HiddenVisibility: return CXVisibility_Hidden; + case ProtectedVisibility: return CXVisibility_Protected; + case DefaultVisibility: return CXVisibility_Default; + }; + + return CXVisibility_Invalid; +} +} // end: extern "C" + //===----------------------------------------------------------------------===// // Operations for querying language of a cursor. //===----------------------------------------------------------------------===// diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 452e92a815..993644d02f 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -176,6 +176,7 @@ clang_getCursorSemanticParent clang_getCursorSpelling clang_getCursorType clang_getCursorUSR +clang_getCursorVisibility clang_getDeclObjCTypeEncoding clang_getDefinitionSpellingAndExtent clang_getDiagnostic -- 2.40.0