[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-12 Thread Saleem Abdulrasool via Phabricator via cfe-commits
compnerd closed this revision.
compnerd added a comment.

SVN r313111


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-12 Thread Masud Rahman via Phabricator via cfe-commits
frutiger added a comment.

I do not have commit rights - please commit this yourself, thanks!


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-12 Thread Saleem Abdulrasool via Phabricator via cfe-commits
compnerd added a comment.

Do you have commit rights or would you like me to commit this on your behalf?


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-12 Thread Masud Rahman via Phabricator via cfe-commits
frutiger updated this revision to Diff 114818.
frutiger added a comment.

Expand the acronym 'TLS' to 'thread-local storage' in documentation.


https://reviews.llvm.org/D37577

Files:
  bindings/python/clang/cindex.py
  bindings/python/tests/cindex/test_tls_kind.py
  include/clang-c/Index.h
  tools/libclang/CIndex.cpp
  tools/libclang/libclang.exports

Index: tools/libclang/libclang.exports
===
--- tools/libclang/libclang.exports
+++ tools/libclang/libclang.exports
@@ -189,6 +189,7 @@
 clang_getCursorResultType
 clang_getCursorSemanticParent
 clang_getCursorSpelling
+clang_getCursorTLSKind
 clang_getCursorType
 clang_getCursorUSR
 clang_getCursorVisibility
Index: tools/libclang/CIndex.cpp
===
--- tools/libclang/CIndex.cpp
+++ tools/libclang/CIndex.cpp
@@ -7412,6 +7412,22 @@
   return CXLanguage_Invalid;
 }
 
+CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
+  const Decl *D = cxcursor::getCursorDecl(cursor);
+  if (const VarDecl *VD = dyn_cast(D)) {
+switch (VD->getTLSKind()) {
+case VarDecl::TLS_None:
+  return CXTLS_None;
+case VarDecl::TLS_Dynamic:
+  return CXTLS_Dynamic;
+case VarDecl::TLS_Static:
+  return CXTLS_Static;
+}
+  }
+
+  return CXTLS_None;
+}
+
  /// \brief If the given cursor is the "templated" declaration
  /// descibing a class or function template, return the class or
  /// function template.
Index: include/clang-c/Index.h
===
--- include/clang-c/Index.h
+++ include/clang-c/Index.h
@@ -2836,6 +2836,22 @@
  */
 CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
 
+/**
+ * \brief Describe the "thread-local storage (TLS) kind" of the declaration
+ * referred to by a cursor.
+ */
+enum CXTLSKind {
+  CXTLS_None = 0,
+  CXTLS_Dynamic,
+  CXTLS_Static
+};
+
+/**
+ * \brief Determine the "thread-local storage (TLS) kind" of the declaration
+ * referred to by a cursor.
+ */
+CINDEX_LINKAGE enum CXTLSKind clang_getCursorTLSKind(CXCursor cursor);
+
 /**
  * \brief Returns the translation unit that a cursor originated from.
  */
Index: bindings/python/tests/cindex/test_tls_kind.py
===
--- /dev/null
+++ bindings/python/tests/cindex/test_tls_kind.py
@@ -0,0 +1,37 @@
+
+from clang.cindex import TLSKind
+from clang.cindex import Cursor
+from clang.cindex import TranslationUnit
+
+from .util import get_cursor
+from .util import get_tu
+
+def test_tls_kind():
+"""Ensure that thread-local storage kinds are available on cursors."""
+
+tu = get_tu("""
+int tls_none;
+thread_local int tls_dynamic;
+_Thread_local int tls_static;
+""", lang = 'cpp')
+
+tls_none = get_cursor(tu.cursor, 'tls_none')
+assert tls_none.tls_kind == TLSKind.NONE;
+
+tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
+assert tls_dynamic.tls_kind == TLSKind.DYNAMIC
+
+tls_static = get_cursor(tu.cursor, 'tls_static')
+assert tls_static.tls_kind == TLSKind.STATIC
+
+# The following case tests '__declspec(thread)'.  Since it is a Microsoft
+# specific extension, specific flags are required for the parser to pick
+# these up.
+flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32']
+tu = get_tu("""
+__declspec(thread) int tls_declspec;
+""", lang = 'cpp', flags=flags)
+
+tls_declspec = get_cursor(tu.cursor, 'tls_declspec')
+assert tls_declspec.tls_kind == TLSKind.STATIC
+
Index: bindings/python/clang/cindex.py
===
--- bindings/python/clang/cindex.py
+++ bindings/python/clang/cindex.py
@@ -1548,6 +1548,14 @@
 
 return self._loc
 
+@property
+def tls_kind(self):
+"""Return the thread-local storage (TLS) kind of this cursor."""
+if not hasattr(self, '_tls_kind'):
+self._tls_kind = conf.lib.clang_getCursorTLSKind(self)
+
+return TLSKind.from_id(self._tls_kind)
+
 @property
 def extent(self):
 """
@@ -2061,6 +2069,23 @@
 RefQualifierKind.LVALUE = RefQualifierKind(1)
 RefQualifierKind.RVALUE = RefQualifierKind(2)
 
+class TLSKind(BaseEnumeration):
+"""Describes the kind of thread-local storage (TLS) of a cursor."""
+
+# The unique kind objects, indexed by id.
+_kinds = []
+_name_map = None
+
+def from_param(self):
+return self.value
+
+def __repr__(self):
+return 'TLSKind.%s' % (self.name,)
+
+TLSKind.NONE = TLSKind(0)
+TLSKind.DYNAMIC = TLSKind(1)
+TLSKind.STATIC = TLSKind(2)
+
 class Type(Structure):
 """
 The type of an element in the abstract syntax tree.
@@ -4066,6 +4091,7 @@
 'Index',
 'SourceLocation',
 'SourceRange',
+'TLSKind',
 'TokenKind',
 'Token',
 'TranslationUnitLoadError',
___
cfe-commits 

[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-12 Thread Nikolai Kosjar via Phabricator via cfe-commits
nik added inline comments.



Comment at: include/clang-c/Index.h:2840
+/**
+ * \brief Describe the "TLS kind" of the declaration referred to by a cursor.
+ */

I was wondering what "TLS" is and had to look it up. If not adapting the 
function and enum name, then maybe at least write it out once in the 
documentation.



https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Masud Rahman via Phabricator via cfe-commits
frutiger updated this revision to Diff 114701.
frutiger added a comment.

Use more specific target platform.


https://reviews.llvm.org/D37577

Files:
  bindings/python/clang/cindex.py
  bindings/python/tests/cindex/test_tls_kind.py
  include/clang-c/Index.h
  tools/libclang/CIndex.cpp
  tools/libclang/libclang.exports

Index: tools/libclang/libclang.exports
===
--- tools/libclang/libclang.exports
+++ tools/libclang/libclang.exports
@@ -189,6 +189,7 @@
 clang_getCursorResultType
 clang_getCursorSemanticParent
 clang_getCursorSpelling
+clang_getCursorTLSKind
 clang_getCursorType
 clang_getCursorUSR
 clang_getCursorVisibility
Index: tools/libclang/CIndex.cpp
===
--- tools/libclang/CIndex.cpp
+++ tools/libclang/CIndex.cpp
@@ -7412,6 +7412,22 @@
   return CXLanguage_Invalid;
 }
 
+CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
+  const Decl *D = cxcursor::getCursorDecl(cursor);
+  if (const VarDecl *VD = dyn_cast(D)) {
+switch (VD->getTLSKind()) {
+case VarDecl::TLS_None:
+  return CXTLS_None;
+case VarDecl::TLS_Dynamic:
+  return CXTLS_Dynamic;
+case VarDecl::TLS_Static:
+  return CXTLS_Static;
+}
+  }
+
+  return CXTLS_None;
+}
+
  /// \brief If the given cursor is the "templated" declaration
  /// descibing a class or function template, return the class or
  /// function template.
Index: include/clang-c/Index.h
===
--- include/clang-c/Index.h
+++ include/clang-c/Index.h
@@ -2836,6 +2836,20 @@
  */
 CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
 
+/**
+ * \brief Describe the "TLS kind" of the declaration referred to by a cursor.
+ */
+enum CXTLSKind {
+  CXTLS_None = 0,
+  CXTLS_Dynamic,
+  CXTLS_Static
+};
+
+/**
+ * \brief Determine the "TLS kind" of the declaration referred to by a cursor.
+ */
+CINDEX_LINKAGE enum CXTLSKind clang_getCursorTLSKind(CXCursor cursor);
+
 /**
  * \brief Returns the translation unit that a cursor originated from.
  */
Index: bindings/python/tests/cindex/test_tls_kind.py
===
--- /dev/null
+++ bindings/python/tests/cindex/test_tls_kind.py
@@ -0,0 +1,37 @@
+
+from clang.cindex import TLSKind
+from clang.cindex import Cursor
+from clang.cindex import TranslationUnit
+
+from .util import get_cursor
+from .util import get_tu
+
+def test_tls_kind():
+"""Ensure that linkage specifers are available on cursors"""
+
+tu = get_tu("""
+int tls_none;
+thread_local int tls_dynamic;
+_Thread_local int tls_static;
+""", lang = 'cpp')
+
+tls_none = get_cursor(tu.cursor, 'tls_none')
+assert tls_none.tls_kind == TLSKind.NONE;
+
+tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
+assert tls_dynamic.tls_kind == TLSKind.DYNAMIC
+
+tls_static = get_cursor(tu.cursor, 'tls_static')
+assert tls_static.tls_kind == TLSKind.STATIC
+
+# The following case tests '__declspec(thread)'.  Since it is a Microsoft
+# specific extension, specific flags are required for the parser to pick
+# these up.
+flags = ['-fms-extensions', '-target', 'x86_64-unknown-windows-win32']
+tu = get_tu("""
+__declspec(thread) int tls_declspec;
+""", lang = 'cpp', flags=flags)
+
+tls_declspec = get_cursor(tu.cursor, 'tls_declspec')
+assert tls_declspec.tls_kind == TLSKind.STATIC
+
Index: bindings/python/clang/cindex.py
===
--- bindings/python/clang/cindex.py
+++ bindings/python/clang/cindex.py
@@ -1548,6 +1548,14 @@
 
 return self._loc
 
+@property
+def tls_kind(self):
+"""Return the TLS kind of this cursor."""
+if not hasattr(self, '_tls_kind'):
+self._tls_kind = conf.lib.clang_getCursorTLSKind(self)
+
+return TLSKind.from_id(self._tls_kind)
+
 @property
 def extent(self):
 """
@@ -2061,6 +2069,23 @@
 RefQualifierKind.LVALUE = RefQualifierKind(1)
 RefQualifierKind.RVALUE = RefQualifierKind(2)
 
+class TLSKind(BaseEnumeration):
+"""Describes the kind of thread local storage of a cursor."""
+
+# The unique kind objects, indexed by id.
+_kinds = []
+_name_map = None
+
+def from_param(self):
+return self.value
+
+def __repr__(self):
+return 'TLSKind.%s' % (self.name,)
+
+TLSKind.NONE = TLSKind(0)
+TLSKind.DYNAMIC = TLSKind(1)
+TLSKind.STATIC = TLSKind(2)
+
 class Type(Structure):
 """
 The type of an element in the abstract syntax tree.
@@ -4066,6 +4091,7 @@
 'Index',
 'SourceLocation',
 'SourceRange',
+'TLSKind',
 'TokenKind',
 'Token',
 'TranslationUnitLoadError',
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Saleem Abdulrasool via Phabricator via cfe-commits
compnerd accepted this revision.
compnerd added inline comments.
This revision is now accepted and ready to land.



Comment at: bindings/python/tests/cindex/test_tls_kind.py:32
+__declspec(thread) int tls_declspec;
+""", lang = 'cpp', flags=['-fms-extensions', '-target', 'amd64-win32'])
+

Would be nicer to use `x86_64-unknown-windows-msvc` as the target.


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Masud Rahman via Phabricator via cfe-commits
frutiger updated this revision to Diff 114640.
frutiger added a comment.

Add test cases for `__declspec(thread)` and static TLS.  Clean up formatting to 
adhere to the project style.


https://reviews.llvm.org/D37577

Files:
  bindings/python/clang/cindex.py
  bindings/python/tests/cindex/test_tls_kind.py
  include/clang-c/Index.h
  tools/libclang/CIndex.cpp
  tools/libclang/libclang.exports

Index: tools/libclang/libclang.exports
===
--- tools/libclang/libclang.exports
+++ tools/libclang/libclang.exports
@@ -189,6 +189,7 @@
 clang_getCursorResultType
 clang_getCursorSemanticParent
 clang_getCursorSpelling
+clang_getCursorTLSKind
 clang_getCursorType
 clang_getCursorUSR
 clang_getCursorVisibility
Index: tools/libclang/CIndex.cpp
===
--- tools/libclang/CIndex.cpp
+++ tools/libclang/CIndex.cpp
@@ -7412,6 +7412,22 @@
   return CXLanguage_Invalid;
 }
 
+CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
+  const Decl *D = cxcursor::getCursorDecl(cursor);
+  if (const VarDecl *VD = dyn_cast(D)) {
+switch (VD->getTLSKind()) {
+case VarDecl::TLS_None:
+  return CXTLS_None;
+case VarDecl::TLS_Dynamic:
+  return CXTLS_Dynamic;
+case VarDecl::TLS_Static:
+  return CXTLS_Static;
+}
+  }
+
+  return CXTLS_None;
+}
+
  /// \brief If the given cursor is the "templated" declaration
  /// descibing a class or function template, return the class or
  /// function template.
Index: include/clang-c/Index.h
===
--- include/clang-c/Index.h
+++ include/clang-c/Index.h
@@ -2836,6 +2836,20 @@
  */
 CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
 
+/**
+ * \brief Describe the "TLS kind" of the declaration referred to by a cursor.
+ */
+enum CXTLSKind {
+  CXTLS_None = 0,
+  CXTLS_Dynamic,
+  CXTLS_Static
+};
+
+/**
+ * \brief Determine the "TLS kind" of the declaration referred to by a cursor.
+ */
+CINDEX_LINKAGE enum CXTLSKind clang_getCursorTLSKind(CXCursor cursor);
+
 /**
  * \brief Returns the translation unit that a cursor originated from.
  */
Index: bindings/python/tests/cindex/test_tls_kind.py
===
--- /dev/null
+++ bindings/python/tests/cindex/test_tls_kind.py
@@ -0,0 +1,36 @@
+
+from clang.cindex import TLSKind
+from clang.cindex import Cursor
+from clang.cindex import TranslationUnit
+
+from .util import get_cursor
+from .util import get_tu
+
+def test_tls_kind():
+"""Ensure that linkage specifers are available on cursors"""
+
+tu = get_tu("""
+int tls_none;
+thread_local int tls_dynamic;
+_Thread_local int tls_static;
+""", lang = 'cpp')
+
+tls_none = get_cursor(tu.cursor, 'tls_none')
+assert tls_none.tls_kind == TLSKind.NONE;
+
+tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
+assert tls_dynamic.tls_kind == TLSKind.DYNAMIC
+
+tls_static = get_cursor(tu.cursor, 'tls_static')
+assert tls_static.tls_kind == TLSKind.STATIC
+
+# The following case tests '__declspec(thread)'.  Since it is a Microsoft
+# specific extension, specific flags are required for the parser to pick
+# these up.
+tu = get_tu("""
+__declspec(thread) int tls_declspec;
+""", lang = 'cpp', flags=['-fms-extensions', '-target', 'amd64-win32'])
+
+tls_declspec = get_cursor(tu.cursor, 'tls_declspec')
+assert tls_declspec.tls_kind == TLSKind.STATIC
+
Index: bindings/python/clang/cindex.py
===
--- bindings/python/clang/cindex.py
+++ bindings/python/clang/cindex.py
@@ -1548,6 +1548,14 @@
 
 return self._loc
 
+@property
+def tls_kind(self):
+"""Return the TLS kind of this cursor."""
+if not hasattr(self, '_tls_kind'):
+self._tls_kind = conf.lib.clang_getCursorTLSKind(self)
+
+return TLSKind.from_id(self._tls_kind)
+
 @property
 def extent(self):
 """
@@ -2061,6 +2069,23 @@
 RefQualifierKind.LVALUE = RefQualifierKind(1)
 RefQualifierKind.RVALUE = RefQualifierKind(2)
 
+class TLSKind(BaseEnumeration):
+"""Describes the kind of thread local storage of a cursor."""
+
+# The unique kind objects, indexed by id.
+_kinds = []
+_name_map = None
+
+def from_param(self):
+return self.value
+
+def __repr__(self):
+return 'TLSKind.%s' % (self.name,)
+
+TLSKind.NONE = TLSKind(0)
+TLSKind.DYNAMIC = TLSKind(1)
+TLSKind.STATIC = TLSKind(2)
+
 class Type(Structure):
 """
 The type of an element in the abstract syntax tree.
@@ -4066,6 +4091,7 @@
 'Index',
 'SourceLocation',
 'SourceRange',
+'TLSKind',
 'TokenKind',
 'Token',
 'TranslationUnitLoadError',
___
cfe-commits mailing list
cfe-commits@lists.llvm.org

[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Masud Rahman via Phabricator via cfe-commits
frutiger added inline comments.



Comment at: bindings/python/tests/cindex/test_tls_kind.py:14
+int tls_none;
+thread_local tls_dynamic;
+""", lang = 'cpp')

frutiger wrote:
> compnerd wrote:
> > Can we add a test case for static TLS as well please?  Also, I think that 
> > we should add a test case for `__declspec(thread)`.
> I will add a test case for static TLS.
> 
> `__declspec(thread)` is not implemented as a TLS kind on a cursor; instead it 
> is implemented as a child attribute of the cursor.  Would you like me to add 
> a test case for that here?
Please ignore the above comment regarding `__declspec(thread)`, it does indeed 
add a static TLS kind to the cursor.


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Masud Rahman via Phabricator via cfe-commits
frutiger added inline comments.



Comment at: bindings/python/tests/cindex/test_tls_kind.py:14
+int tls_none;
+thread_local tls_dynamic;
+""", lang = 'cpp')

compnerd wrote:
> Can we add a test case for static TLS as well please?  Also, I think that we 
> should add a test case for `__declspec(thread)`.
I will add a test case for static TLS.

`__declspec(thread)` is not implemented as a TLS kind on a cursor; instead it 
is implemented as a child attribute of the cursor.  Would you like me to add a 
test case for that here?



Comment at: tools/libclang/CIndex.cpp:7426
+}
+  }
+

compnerd wrote:
> This block is not properly formatted.  Please clang-format your code.
I will fix this, thank you for the feedback.


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-11 Thread Saleem Abdulrasool via Phabricator via cfe-commits
compnerd added inline comments.



Comment at: bindings/python/tests/cindex/test_tls_kind.py:14
+int tls_none;
+thread_local tls_dynamic;
+""", lang = 'cpp')

Can we add a test case for static TLS as well please?  Also, I think that we 
should add a test case for `__declspec(thread)`.



Comment at: tools/libclang/CIndex.cpp:7426
+}
+  }
+

This block is not properly formatted.  Please clang-format your code.


https://reviews.llvm.org/D37577



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-07 Thread Masud Rahman via Phabricator via cfe-commits
frutiger updated this revision to Diff 114256.
frutiger added a comment.

Exports 'TLSKind' in the '__all__' array.


https://reviews.llvm.org/D37577

Files:
  bindings/python/clang/cindex.py
  bindings/python/tests/cindex/test_tls_kind.py
  include/clang-c/Index.h
  tools/libclang/CIndex.cpp
  tools/libclang/libclang.exports

Index: tools/libclang/libclang.exports
===
--- tools/libclang/libclang.exports
+++ tools/libclang/libclang.exports
@@ -189,6 +189,7 @@
 clang_getCursorResultType
 clang_getCursorSemanticParent
 clang_getCursorSpelling
+clang_getCursorTLSKind
 clang_getCursorType
 clang_getCursorUSR
 clang_getCursorVisibility
Index: tools/libclang/CIndex.cpp
===
--- tools/libclang/CIndex.cpp
+++ tools/libclang/CIndex.cpp
@@ -7412,6 +7412,22 @@
   return CXLanguage_Invalid;
 }
 
+CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
+  const Decl *D  = cxcursor::getCursorDecl(cursor);
+  if (const VarDecl *VD = dyn_cast(D)) {
+switch (VD->getTLSKind()) {
+  case VarDecl::TLS_None:
+return CXTLS_None;
+  case VarDecl::TLS_Dynamic:
+return CXTLS_Dynamic;
+  case VarDecl::TLS_Static:
+return CXTLS_Static;
+}
+  }
+
+  return CXTLS_None;
+}
+
  /// \brief If the given cursor is the "templated" declaration
  /// descibing a class or function template, return the class or
  /// function template.
Index: include/clang-c/Index.h
===
--- include/clang-c/Index.h
+++ include/clang-c/Index.h
@@ -2836,6 +2836,20 @@
  */
 CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
 
+/**
+ * \brief Describe the "TLS kind" of the declaration referred to by a cursor.
+ */
+enum CXTLSKind {
+  CXTLS_None = 0,
+  CXTLS_Dynamic,
+  CXTLS_Static
+};
+
+/**
+ * \brief Determine the "TLS kind" of the declaration referred to by a cursor.
+ */
+CINDEX_LINKAGE enum CXTLSKind clang_getCursorTLSKind(CXCursor cursor);
+
 /**
  * \brief Returns the translation unit that a cursor originated from.
  */
Index: bindings/python/tests/cindex/test_tls_kind.py
===
--- /dev/null
+++ bindings/python/tests/cindex/test_tls_kind.py
@@ -0,0 +1,22 @@
+
+from clang.cindex import TLSKind
+from clang.cindex import Cursor
+from clang.cindex import TranslationUnit
+
+from .util import get_cursor
+from .util import get_tu
+
+def test_tls_kind():
+"""Ensure that linkage specifers are available on cursors"""
+
+tu = get_tu("""
+int tls_none;
+thread_local tls_dynamic;
+""", lang = 'cpp')
+
+tls_none = get_cursor(tu.cursor, 'tls_none')
+assert tls_none.tls_kind == TLSKind.NONE;
+
+tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
+assert tls_dynamic.tls_kind == TLSKind.DYNAMIC
+
Index: bindings/python/clang/cindex.py
===
--- bindings/python/clang/cindex.py
+++ bindings/python/clang/cindex.py
@@ -1548,6 +1548,14 @@
 
 return self._loc
 
+@property
+def tls_kind(self):
+"""Return the TLS kind of this cursor."""
+if not hasattr(self, '_tls_kind'):
+self._tls_kind = conf.lib.clang_getCursorTLSKind(self)
+
+return TLSKind.from_id(self._tls_kind)
+
 @property
 def extent(self):
 """
@@ -2061,6 +2069,23 @@
 RefQualifierKind.LVALUE = RefQualifierKind(1)
 RefQualifierKind.RVALUE = RefQualifierKind(2)
 
+class TLSKind(BaseEnumeration):
+"""Describes the kind of thread local storage of a cursor."""
+
+# The unique kind objects, indexed by id.
+_kinds = []
+_name_map = None
+
+def from_param(self):
+return self.value
+
+def __repr__(self):
+return 'TLSKind.%s' % (self.name,)
+
+TLSKind.NONE = TLSKind(0)
+TLSKind.DYNAMIC = TLSKind(1)
+TLSKind.STATIC = TLSKind(2)
+
 class Type(Structure):
 """
 The type of an element in the abstract syntax tree.
@@ -4066,6 +4091,7 @@
 'Index',
 'SourceLocation',
 'SourceRange',
+'TLSKind',
 'TokenKind',
 'Token',
 'TranslationUnitLoadError',
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D37577: [libclang] add 'clang_getCursorTLSKind'

2017-09-07 Thread Masud Rahman via Phabricator via cfe-commits
frutiger created this revision.

Introduce the 'TLS Kind' property of variable declarations through
libclang.  Additionally, provide a Python accessor for it, and test that
functionality.


https://reviews.llvm.org/D37577

Files:
  bindings/python/clang/cindex.py
  bindings/python/tests/cindex/test_tls_kind.py
  include/clang-c/Index.h
  tools/libclang/CIndex.cpp
  tools/libclang/libclang.exports

Index: tools/libclang/libclang.exports
===
--- tools/libclang/libclang.exports
+++ tools/libclang/libclang.exports
@@ -189,6 +189,7 @@
 clang_getCursorResultType
 clang_getCursorSemanticParent
 clang_getCursorSpelling
+clang_getCursorTLSKind
 clang_getCursorType
 clang_getCursorUSR
 clang_getCursorVisibility
Index: tools/libclang/CIndex.cpp
===
--- tools/libclang/CIndex.cpp
+++ tools/libclang/CIndex.cpp
@@ -7412,6 +7412,22 @@
   return CXLanguage_Invalid;
 }
 
+CXTLSKind clang_getCursorTLSKind(CXCursor cursor) {
+  const Decl *D  = cxcursor::getCursorDecl(cursor);
+  if (const VarDecl *VD = dyn_cast(D)) {
+switch (VD->getTLSKind()) {
+  case VarDecl::TLS_None:
+return CXTLS_None;
+  case VarDecl::TLS_Dynamic:
+return CXTLS_Dynamic;
+  case VarDecl::TLS_Static:
+return CXTLS_Static;
+}
+  }
+
+  return CXTLS_None;
+}
+
  /// \brief If the given cursor is the "templated" declaration
  /// descibing a class or function template, return the class or
  /// function template.
Index: include/clang-c/Index.h
===
--- include/clang-c/Index.h
+++ include/clang-c/Index.h
@@ -2836,6 +2836,20 @@
  */
 CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
 
+/**
+ * \brief Describe the "TLS kind" of the declaration referred to by a cursor.
+ */
+enum CXTLSKind {
+  CXTLS_None = 0,
+  CXTLS_Dynamic,
+  CXTLS_Static
+};
+
+/**
+ * \brief Determine the "TLS kind" of the declaration referred to by a cursor.
+ */
+CINDEX_LINKAGE enum CXTLSKind clang_getCursorTLSKind(CXCursor cursor);
+
 /**
  * \brief Returns the translation unit that a cursor originated from.
  */
Index: bindings/python/tests/cindex/test_tls_kind.py
===
--- /dev/null
+++ bindings/python/tests/cindex/test_tls_kind.py
@@ -0,0 +1,22 @@
+
+from clang.cindex import TLSKind
+from clang.cindex import Cursor
+from clang.cindex import TranslationUnit
+
+from .util import get_cursor
+from .util import get_tu
+
+def test_tls_kind():
+"""Ensure that linkage specifers are available on cursors"""
+
+tu = get_tu("""
+int tls_none;
+thread_local tls_dynamic;
+""", lang = 'cpp')
+
+tls_none = get_cursor(tu.cursor, 'tls_none')
+assert tls_none.tls_kind == TLSKind.NONE;
+
+tls_dynamic = get_cursor(tu.cursor, 'tls_dynamic')
+assert tls_dynamic.tls_kind == TLSKind.DYNAMIC
+
Index: bindings/python/clang/cindex.py
===
--- bindings/python/clang/cindex.py
+++ bindings/python/clang/cindex.py
@@ -1548,6 +1548,14 @@
 
 return self._loc
 
+@property
+def tls_kind(self):
+"""Return the TLS kind of this cursor."""
+if not hasattr(self, '_tls_kind'):
+self._tls_kind = conf.lib.clang_getCursorTLSKind(self)
+
+return TLSKind.from_id(self._tls_kind)
+
 @property
 def extent(self):
 """
@@ -2061,6 +2069,23 @@
 RefQualifierKind.LVALUE = RefQualifierKind(1)
 RefQualifierKind.RVALUE = RefQualifierKind(2)
 
+class TLSKind(BaseEnumeration):
+"""Describes the kind of thread local storage of a cursor."""
+
+# The unique kind objects, indexed by id.
+_kinds = []
+_name_map = None
+
+def from_param(self):
+return self.value
+
+def __repr__(self):
+return 'TLSKind.%s' % (self.name,)
+
+TLSKind.NONE = TLSKind(0)
+TLSKind.DYNAMIC = TLSKind(1)
+TLSKind.STATIC = TLSKind(2)
+
 class Type(Structure):
 """
 The type of an element in the abstract syntax tree.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits