Author: ehsan Date: Mon Nov 23 13:56:46 2015 New Revision: 253909 URL: http://llvm.org/viewvc/llvm-project?rev=253909&view=rev Log: 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 <m...@mozilla.com>. Added: cfe/trunk/test/Index/symbol-visibility.c Modified: cfe/trunk/include/clang-c/Index.h cfe/trunk/tools/c-index-test/c-index-test.c cfe/trunk/tools/libclang/CIndex.cpp cfe/trunk/tools/libclang/libclang.exports Modified: cfe/trunk/include/clang-c/Index.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=253909&r1=253908&r2=253909&view=diff ============================================================================== --- cfe/trunk/include/clang-c/Index.h (original) +++ cfe/trunk/include/clang-c/Index.h Mon Nov 23 13:56:46 2015 @@ -2461,6 +2461,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. * Added: cfe/trunk/test/Index/symbol-visibility.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/symbol-visibility.c?rev=253909&view=auto ============================================================================== --- cfe/trunk/test/Index/symbol-visibility.c (added) +++ cfe/trunk/test/Index/symbol-visibility.c Mon Nov 23 13:56:46 2015 @@ -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 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=253909&r1=253908&r2=253909&view=diff ============================================================================== --- cfe/trunk/tools/c-index-test/c-index-test.c (original) +++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Nov 23 13:56:46 2015 @@ -1248,6 +1248,32 @@ static enum CXChildVisitResult PrintLink } /******************************************************************************/ +/* 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 <AST file>\n"); fprintf(stderr, " c-index-test -test-print-linkage-source {<args>}*\n" + " c-index-test -test-print-visibility {<args>}*\n" " c-index-test -test-print-type {<args>}*\n" " c-index-test -test-print-type-size {<args>}*\n" " c-index-test -test-print-bitwidth {<args>}*\n" @@ -4171,6 +4198,9 @@ int cindextest_main(int argc, const char 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); Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=253909&r1=253908&r2=253909&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Mon Nov 23 13:56:46 2015 @@ -6451,6 +6451,27 @@ CXLinkageKind clang_getCursorLinkage(CXC } // 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<NamedDecl>(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. //===----------------------------------------------------------------------===// Modified: cfe/trunk/tools/libclang/libclang.exports URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=253909&r1=253908&r2=253909&view=diff ============================================================================== --- cfe/trunk/tools/libclang/libclang.exports (original) +++ cfe/trunk/tools/libclang/libclang.exports Mon Nov 23 13:56:46 2015 @@ -176,6 +176,7 @@ clang_getCursorSemanticParent clang_getCursorSpelling clang_getCursorType clang_getCursorUSR +clang_getCursorVisibility clang_getDeclObjCTypeEncoding clang_getDefinitionSpellingAndExtent clang_getDiagnostic _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits