diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 21 | ||||
-rw-r--r-- | tools/libclang/CXType.cpp | 15 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 1 |
3 files changed, 37 insertions, 0 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 3e4404cbaa..5ca148f1e4 100644 --- a/tools/c-index-test/c-index-test.c +++ b/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/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp index c4b8a09a54..e2fbc0be82 100644 --- a/tools/libclang/CXType.cpp +++ b/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/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index ee34edcbb2..68bfb71f18 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -160,6 +160,7 @@ clang_getElementType clang_getEnumConstantDeclUnsignedValue clang_getEnumConstantDeclValue clang_getEnumDeclIntegerType +clang_getFieldDeclBitWidth clang_getExpansionLocation clang_getFile clang_getFileName |