From: Saleem Abdulrasool Date: Thu, 10 Dec 2015 18:45:18 +0000 (+0000) Subject: libclang: expose dllexport, dllimport attributes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be1340d2b90c0016d232d327098caf9a9c3b40bd;p=clang libclang: expose dllexport, dllimport attributes These attributes were previously unexposed. Expose them through the libclang interfaces. Add tests that cover both the MSVC spelling and the GNU spelling. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255273 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py index 06a1893493..e4b38769b7 100644 --- a/bindings/python/clang/cindex.py +++ b/bindings/python/clang/cindex.py @@ -1102,6 +1102,9 @@ CursorKind.CUDASHARED_ATTR = CursorKind(416) CursorKind.VISIBILITY_ATTR = CursorKind(417) +CursorKind.DLLEXPORT_ATTR = CursorKind(418) +CursorKind.DLLIMPORT_ATTR = CursorKind(419) + ### # Preprocessing CursorKind.PREPROCESSING_DIRECTIVE = CursorKind(500) diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 5541322ae8..5aebf0973f 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -32,7 +32,7 @@ * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable. */ #define CINDEX_VERSION_MAJOR 0 -#define CINDEX_VERSION_MINOR 31 +#define CINDEX_VERSION_MINOR 32 #define CINDEX_VERSION_ENCODE(major, minor) ( \ ((major) * 10000) \ @@ -2297,7 +2297,9 @@ enum CXCursorKind { CXCursor_CUDAHostAttr = 415, CXCursor_CUDASharedAttr = 416, CXCursor_VisibilityAttr = 417, - CXCursor_LastAttr = CXCursor_VisibilityAttr, + CXCursor_DLLExport = 418, + CXCursor_DLLImport = 419, + CXCursor_LastAttr = CXCursor_DLLImport, /* Preprocessing */ CXCursor_PreprocessingDirective = 500, diff --git a/test/Index/index-attrs.c b/test/Index/index-attrs.c new file mode 100644 index 0000000000..d526721f5b --- /dev/null +++ b/test/Index/index-attrs.c @@ -0,0 +1,16 @@ +// RUN: c-index-test -index-file -check-prefix CHECK %s -target armv7-windows-gnu -fdeclspec + +void __declspec(dllexport) export_function(void) {} +// CHECK: [indexDeclaraton]: kind: function | name: export_function | {{.*}} | lang: C +// CHECK: : attribute(dllexport) +void __attribute__((dllexport)) export_gnu_attribute(void) {} +// CHECK: [indexDeclaration] kind: function | name: export_gnu_attribute | {{.*}} | lang: C +// CHECK: : attribute(dllexport) + +void __declspec(dllimport) import_function(void); +// CHECK: [indexDeclaration] kind: function | name: import_function | {{.*}} | lang: C +// CHECK: : attribute(dllimport) +void __attribute__((dllimport)) import_gnu_attribute(void); +// CHECK: [indexDeclaration] kind: function | name: import_gnu_function | {{.*}} | lang: C +// CHECK: : attribute(dllimport) + diff --git a/test/Index/index-attrs.cpp b/test/Index/index-attrs.cpp new file mode 100644 index 0000000000..b6100acf88 --- /dev/null +++ b/test/Index/index-attrs.cpp @@ -0,0 +1,50 @@ +// RUN: c-index-test -index-file -check-prefix CHECK %s -target armv7-windows-gnu -fdeclspec + +struct __declspec(dllexport) export_s { + void m(); +}; +// CHECK: [indexDeclaration]: kind: struct | name: export_s | {{.*}} | lang: C++ +// CHECK: : attribute(dllexport) +// CHECK: [indexDeclaration]: kind: c++-instance-method | name: m | {{.*}} | lang: C++ +// CHECK: : attribute(dllexport) + +struct __declspec(dllimport) import_s { + void m(); +}; +// CHECK: [indexDeclaration]: kind: struct | name: import_s | {{.*}} | lang: C++ +// CHECK: : attribute(dllimport) +// CHECK: [indexDeclaration]: kind: c++-instance-method | name: m | {{.*}} | lang: C++ +// CHECK: : attribute(dllimport) + +class __attribute__((dllexport)) export_gnu_s { + void m(); +}; +// CHECK: [indexDeclaration]: kind: struct | name: export_gnu_s | {{.*}} | lang: C++ +// CHECK: : attribute(dllexport) +// CHECK: [indexDeclaration]: kind: c++-instance-method | name: m | {{.*}} | lang: C++ +// CHECK: : attribute(dllexport) + +class __attribute__((dllimport)) import_gnu_s { + void m(); +}; +// CHECK: [indexDeclaration]: kind: struct | name: import_gnu_s | {{.*}} | lang: C++ +// CHECK: : attribute(dllimport) +// CHECK: [indexDeclaration]: kind: c++-instance-method | name: m | {{.*}} | lang: C++ +// CHECK: : attribute(dllimport) + +extern "C" void __declspec(dllexport) export_function(void) {} +// CHECK: [indexDeclaraton]: kind: function | name: export_function | {{.*}} | lang: C +// CHECK: : attribute(dllexport) +extern "C" void __attribute__((dllexport)) export_gnu_function(void) {} +// CHECK: [indexDeclaraton]: kind: function | name: export_gnu_function | {{.*}} | lang: C +// CHECK: : attribute(dllexport) + +extern "C" { +void __declspec(dllimport) import_function(void); +// CHECK: [indexDeclaration] kind: function | name: import_function | {{.*}} | lang: C +// CHECK: : attribute(dllimport) +void __attribute__((dllimport)) import_gnu_function(void); +// CHECK: [indexDeclaration] kind: function | name: import_gnu_function | {{.*}} | lang: C +// CHECK: : attribute(dllimport) +} + diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index c1143715d6..486d24a5fb 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -4389,6 +4389,10 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("attribute(shared)"); case CXCursor_VisibilityAttr: return cxstring::createRef("attribute(visibility)"); + case CXCursor_DLLExport: + return cxstring::createRef("attribute(dllexport)"); + case CXCursor_DLLImport: + return cxstring::createRef("attribute(dllimport)"); case CXCursor_PreprocessingDirective: return cxstring::createRef("preprocessing directive"); case CXCursor_MacroDefinition: diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index fbf0aaf049..a980981166 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -59,6 +59,8 @@ static CXCursorKind GetCursorKind(const Attr *A) { case attr::CUDAHost: return CXCursor_CUDAHostAttr; case attr::CUDAShared: return CXCursor_CUDASharedAttr; case attr::Visibility: return CXCursor_VisibilityAttr; + case attr::DLLExport: return CXCursor_DLLExport; + case attr::DLLImport: return CXCursor_DLLImport; } return CXCursor_UnexposedAttr;