diff options
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 52 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 45 | ||||
| -rw-r--r-- | clang/tools/libclang/CXTranslationUnit.h | 4 | ||||
| -rw-r--r-- | clang/tools/libclang/libclang.exports | 4 |
4 files changed, 103 insertions, 2 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 0978ccb28d7..1179fbf3911 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -1560,6 +1560,51 @@ static enum CXChildVisitResult PrintTypeDeclaration(CXCursor cursor, CXCursor p, } /******************************************************************************/ +/* Target information testing. */ +/******************************************************************************/ + +static int print_target_info(int argc, const char **argv) { + CXIndex Idx; + CXTranslationUnit TU; + CXTargetInfo TargetInfo; + CXString Triple; + const char *FileName; + enum CXErrorCode Err; + int PointerWidth; + + if (argc == 0) { + fprintf(stderr, "No filename specified\n"); + return 1; + } + + FileName = argv[1]; + + Idx = clang_createIndex(0, 1); + Err = clang_parseTranslationUnit2(Idx, FileName, argv, argc, NULL, 0, + getDefaultParsingOptions(), &TU); + if (Err != CXError_Success) { + fprintf(stderr, "Couldn't parse translation unit!\n"); + describeLibclangFailure(Err); + clang_disposeIndex(Idx); + return 1; + } + + TargetInfo = clang_getTranslationUnitTargetInfo(TU); + + Triple = clang_TargetInfo_getTriple(TargetInfo); + printf("TargetTriple: %s\n", clang_getCString(Triple)); + clang_disposeString(Triple); + + PointerWidth = clang_TargetInfo_getPointerWidth(TargetInfo); + printf("PointerWidth: %d\n", PointerWidth); + + clang_TargetInfo_dispose(TargetInfo); + clang_disposeTranslationUnit(TU); + clang_disposeIndex(Idx); + return 0; +} + +/******************************************************************************/ /* Loading ASTs/source. */ /******************************************************************************/ @@ -4301,11 +4346,12 @@ static void print_usage(void) { " 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" + " c-index-test -test-print-target-info {<args>}*\n" " c-index-test -test-print-type-declaration {<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"); + " c-index-test -print-usr-file <file>\n"); fprintf(stderr, + " c-index-test -write-pch <file> <compiler arguments>\n" " c-index-test -compilation-db [lookup <filename>] database\n"); fprintf(stderr, " c-index-test -print-build-session-timestamp\n"); @@ -4411,6 +4457,8 @@ int cindextest_main(int argc, const char **argv) { return perform_test_load_tu(argv[2], "all", NULL, PrintMangledName, NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-manglings") == 0) return perform_test_load_tu(argv[2], "all", NULL, PrintManglings, NULL); + else if (argc > 2 && strcmp(argv[1], "-test-print-target-info") == 0) + return print_target_info(argc - 2, argv + 2); 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/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index c7fdb5ad1aa..86f1047dee9 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -26,6 +26,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticCategories.h" #include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Basic/Version.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" @@ -4018,6 +4019,50 @@ CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); } +CXTargetInfo clang_getTranslationUnitTargetInfo(CXTranslationUnit CTUnit) { + if (isNotUsableTU(CTUnit)) { + LOG_BAD_TU(CTUnit); + return nullptr; + } + + CXTargetInfoImpl* impl = new CXTargetInfoImpl(); + impl->TranslationUnit = CTUnit; + return impl; +} + +CXString clang_TargetInfo_getTriple(CXTargetInfo TargetInfo) { + if (!TargetInfo) + return cxstring::createEmpty(); + + CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; + assert(!isNotUsableTU(CTUnit) && + "Unexpected unusable translation unit in TargetInfo"); + + ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); + std::string Triple = + CXXUnit->getASTContext().getTargetInfo().getTriple().normalize(); + return cxstring::createDup(Triple); +} + +int clang_TargetInfo_getPointerWidth(CXTargetInfo TargetInfo) { + if (!TargetInfo) + return -1; + + CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; + assert(!isNotUsableTU(CTUnit) && + "Unexpected unusable translation unit in TargetInfo"); + + ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); + return CXXUnit->getASTContext().getTargetInfo().getMaxPointerWidth(); +} + +void clang_TargetInfo_dispose(CXTargetInfo TargetInfo) { + if (!TargetInfo) + return; + + delete TargetInfo; +} + //===----------------------------------------------------------------------===// // CXFile Operations. //===----------------------------------------------------------------------===// diff --git a/clang/tools/libclang/CXTranslationUnit.h b/clang/tools/libclang/CXTranslationUnit.h index 67c31d2dba4..ce8469b501a 100644 --- a/clang/tools/libclang/CXTranslationUnit.h +++ b/clang/tools/libclang/CXTranslationUnit.h @@ -35,6 +35,10 @@ struct CXTranslationUnitImpl { clang::index::CommentToXMLConverter *CommentToXML; }; +struct CXTargetInfoImpl { + CXTranslationUnit TranslationUnit; +}; + namespace clang { namespace cxtu { diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 38ecedae3cd..895dd804b00 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -79,6 +79,9 @@ clang_TParamCommandComment_getParamName clang_TParamCommandComment_isParamPositionValid clang_TParamCommandComment_getDepth clang_TParamCommandComment_getIndex +clang_TargetInfo_dispose +clang_TargetInfo_getPointerWidth +clang_TargetInfo_getTriple clang_Type_getAlignOf clang_Type_getClassType clang_Type_getSizeOf @@ -250,6 +253,7 @@ clang_getTokenLocation clang_getTokenSpelling clang_getTranslationUnitCursor clang_getTranslationUnitSpelling +clang_getTranslationUnitTargetInfo clang_getTypeDeclaration clang_getTypeKindSpelling clang_getTypeSpelling |

