summaryrefslogtreecommitdiffstats
path: root/clang/tools
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2012-12-04 15:13:46 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2012-12-04 15:13:46 +0000
commitb506ba1d799f4b122bf6fdc497babc6d9a66fea4 (patch)
tree9132ba98c1cf33acf3f7a0338d33600ed09fe6e2 /clang/tools
parent242b6305f08c7f4d17acf74bc03d44e39e0027d6 (diff)
downloadbcm5719-llvm-b506ba1d799f4b122bf6fdc497babc6d9a66fea4.tar.gz
bcm5719-llvm-b506ba1d799f4b122bf6fdc497babc6d9a66fea4.zip
libclang: Add a function to libclang for retrieving the bit width value
Patch by Jyun-Yan You. llvm-svn: 169276
Diffstat (limited to 'clang/tools')
-rw-r--r--clang/tools/c-index-test/c-index-test.c21
-rw-r--r--clang/tools/libclang/CXType.cpp15
-rw-r--r--clang/tools/libclang/libclang.exports1
3 files changed, 37 insertions, 0 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c
index 3e4404cbaa0..5ca148f1e44 100644
--- a/clang/tools/c-index-test/c-index-test.c
+++ b/clang/tools/c-index-test/c-index-test.c
@@ -1134,6 +1134,23 @@ static enum CXChildVisitResult PrintTypeKind(CXCursor cursor, CXCursor p,
return CXChildVisit_Recurse;
}
+/******************************************************************************/
+/* Bitwidth testing. */
+/******************************************************************************/
+
+static enum CXChildVisitResult PrintBitWidth(CXCursor cursor, CXCursor p,
+ CXClientData d) {
+ if (clang_getCursorKind(cursor) != CXCursor_FieldDecl)
+ return CXChildVisit_Recurse;
+
+ int Bitwidth = clang_getFieldDeclBitWidth(cursor);
+ if (Bitwidth >= 0) {
+ PrintCursor(cursor, NULL);
+ printf(" bitwidth=%d\n", Bitwidth);
+ }
+
+ return CXChildVisit_Recurse;
+}
/******************************************************************************/
/* Loading ASTs/source. */
@@ -3382,6 +3399,7 @@ static void print_usage(void) {
fprintf(stderr,
" c-index-test -test-print-linkage-source {<args>}*\n"
" c-index-test -test-print-typekind {<args>}*\n"
+ " c-index-test -test-print-bitwidth {<args>}*\n"
" c-index-test -print-usr [<CursorKind> {<args>}]*\n"
" c-index-test -print-usr-file <file>\n"
" c-index-test -write-pch <file> <compiler arguments>\n");
@@ -3463,6 +3481,9 @@ int cindextest_main(int argc, const char **argv) {
else if (argc > 2 && strcmp(argv[1], "-test-print-typekind") == 0)
return perform_test_load_source(argc - 2, argv + 2, "all",
PrintTypeKind, 0);
+ else if (argc > 2 && strcmp(argv[1], "-test-print-bitwidth") == 0)
+ return perform_test_load_source(argc - 2, argv + 2, "all",
+ PrintBitWidth, 0);
else if (argc > 1 && strcmp(argv[1], "-print-usr") == 0) {
if (argc > 2)
return print_usrs(argv + 2, argv + argc);
diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp
index c4b8a09a547..e2fbc0be82e 100644
--- a/clang/tools/libclang/CXType.cpp
+++ b/clang/tools/libclang/CXType.cpp
@@ -265,6 +265,21 @@ unsigned long long clang_getEnumConstantDeclUnsignedValue(CXCursor C) {
return ULLONG_MAX;
}
+int clang_getFieldDeclBitWidth(CXCursor C) {
+ using namespace cxcursor;
+
+ if (clang_isDeclaration(C.kind)) {
+ Decl *D = getCursorDecl(C);
+
+ if (FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
+ if (FD->isBitField())
+ return FD->getBitWidthValue(getCursorContext(C));
+ }
+ }
+
+ return -1;
+}
+
CXType clang_getCanonicalType(CXType CT) {
if (CT.kind == CXType_Invalid)
return CT;
diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports
index ee34edcbb2d..68bfb71f18f 100644
--- a/clang/tools/libclang/libclang.exports
+++ b/clang/tools/libclang/libclang.exports
@@ -160,6 +160,7 @@ clang_getElementType
clang_getEnumConstantDeclUnsignedValue
clang_getEnumConstantDeclValue
clang_getEnumDeclIntegerType
+clang_getFieldDeclBitWidth
clang_getExpansionLocation
clang_getFile
clang_getFileName
OpenPOWER on IntegriCloud