diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:08 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:08 +0000 |
commit | bab175ec4b075c8076ba14c762900392533f6ee4 (patch) | |
tree | 01f4f29419a2cb10abe13c1e63cd2a66068b0137 /tools/libclang/CIndex.cpp | |
parent | 8b7a8012d223fac5d17d16a66bb39168a9a1dfc0 (diff) |
Notes
Diffstat (limited to 'tools/libclang/CIndex.cpp')
-rw-r--r-- | tools/libclang/CIndex.cpp | 222 |
1 files changed, 174 insertions, 48 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index deb4cc551b8ae..b26cd754128a7 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -12,8 +12,8 @@ // //===----------------------------------------------------------------------===// -#include "CIndexer.h" #include "CIndexDiagnostic.h" +#include "CIndexer.h" #include "CLog.h" #include "CXCursor.h" #include "CXSourceLocation.h" @@ -1249,6 +1249,17 @@ bool CursorVisitor::VisitStaticAssertDecl(StaticAssertDecl *D) { return false; } +bool CursorVisitor::VisitFriendDecl(FriendDecl *D) { + if (NamedDecl *FriendD = D->getFriendDecl()) { + if (Visit(MakeCXCursor(FriendD, TU, RegionOfInterest))) + return true; + } else if (TypeSourceInfo *TI = D->getFriendType()) { + if (Visit(TI->getTypeLoc())) + return true; + } + return false; +} + bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) { switch (Name.getName().getNameKind()) { case clang::DeclarationName::Identifier: @@ -1535,6 +1546,18 @@ bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU)); } +bool CursorVisitor::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { + if (Visit(MakeCursorTypeRef(TL.getDecl(), TL.getLocStart(), TU))) + return true; + for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) { + if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I), + TU))) + return true; + } + + return false; +} + bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc())) return true; @@ -1977,6 +2000,19 @@ public: void VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective *D); void VisitOMPTargetParallelForSimdDirective( const OMPTargetParallelForSimdDirective *D); + void VisitOMPTargetSimdDirective(const OMPTargetSimdDirective *D); + void VisitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective *D); + void VisitOMPTeamsDistributeSimdDirective( + const OMPTeamsDistributeSimdDirective *D); + void VisitOMPTeamsDistributeParallelForSimdDirective( + const OMPTeamsDistributeParallelForSimdDirective *D); + void VisitOMPTeamsDistributeParallelForDirective( + const OMPTeamsDistributeParallelForDirective *D); + void VisitOMPTargetTeamsDirective(const OMPTargetTeamsDirective *D); + void VisitOMPTargetTeamsDistributeDirective( + const OMPTargetTeamsDistributeDirective *D); + void VisitOMPTargetTeamsDistributeParallelForDirective( + const OMPTargetTeamsDistributeParallelForDirective *D); private: void AddDeclarationNameInfo(const Stmt *S); @@ -2756,6 +2792,46 @@ void EnqueueVisitor::VisitOMPTargetParallelForSimdDirective( VisitOMPLoopDirective(D); } +void EnqueueVisitor::VisitOMPTargetSimdDirective( + const OMPTargetSimdDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTeamsDistributeDirective( + const OMPTeamsDistributeDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTeamsDistributeSimdDirective( + const OMPTeamsDistributeSimdDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTeamsDistributeParallelForSimdDirective( + const OMPTeamsDistributeParallelForSimdDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTeamsDistributeParallelForDirective( + const OMPTeamsDistributeParallelForDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTargetTeamsDirective( + const OMPTargetTeamsDirective *D) { + VisitOMPExecutableDirective(D); +} + +void EnqueueVisitor::VisitOMPTargetTeamsDistributeDirective( + const OMPTargetTeamsDistributeDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForDirective( + const OMPTargetTeamsDistributeParallelForDirective *D) { + VisitOMPLoopDirective(D); +} + void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S); } @@ -3054,7 +3130,6 @@ struct RegisterFatalErrorHandler { static llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce; -extern "C" { CXIndex clang_createIndex(int excludeDeclarationsFromPCH, int displayDiagnostics) { // We use crash recovery to make some of our APIs more reliable, implicitly @@ -3469,10 +3544,12 @@ static StringLiteral* getCFSTR_value(CallExpr *callExpr) { struct ExprEvalResult { CXEvalResultKind EvalType; union { - int intVal; + unsigned long long unsignedVal; + long long intVal; double floatVal; char *stringVal; } EvalData; + bool IsUnsignedInt; ~ExprEvalResult() { if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float && EvalType != CXEval_Int) { @@ -3493,10 +3570,32 @@ CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { } int clang_EvalResult_getAsInt(CXEvalResult E) { + return clang_EvalResult_getAsLongLong(E); +} + +long long clang_EvalResult_getAsLongLong(CXEvalResult E) { if (!E) { return 0; } - return ((ExprEvalResult *)E)->EvalData.intVal; + ExprEvalResult *Result = (ExprEvalResult*)E; + if (Result->IsUnsignedInt) + return Result->EvalData.unsignedVal; + return Result->EvalData.intVal; +} + +unsigned clang_EvalResult_isUnsignedInt(CXEvalResult E) { + return ((ExprEvalResult *)E)->IsUnsignedInt; +} + +unsigned long long clang_EvalResult_getAsUnsigned(CXEvalResult E) { + if (!E) { + return 0; + } + + ExprEvalResult *Result = (ExprEvalResult*)E; + if (Result->IsUnsignedInt) + return Result->EvalData.unsignedVal; + return Result->EvalData.intVal; } double clang_EvalResult_getAsDouble(CXEvalResult E) { @@ -3527,10 +3626,19 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) { CallExpr *callExpr; auto result = llvm::make_unique<ExprEvalResult>(); result->EvalType = CXEval_UnExposed; + result->IsUnsignedInt = false; if (ER.Val.isInt()) { result->EvalType = CXEval_Int; - result->EvalData.intVal = ER.Val.getInt().getExtValue(); + + auto& val = ER.Val.getInt(); + if (val.isUnsigned()) { + result->IsUnsignedInt = true; + result->EvalData.unsignedVal = val.getZExtValue(); + } else { + result->EvalData.intVal = val.getExtValue(); + } + return result.release(); } @@ -3541,7 +3649,7 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) { result->EvalType = CXEval_Float; bool ignored; llvm::APFloat apFloat = ER.Val.getFloat(); - apFloat.convert(llvm::APFloat::IEEEdouble, + apFloat.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven, &ignored); result->EvalData.floatVal = apFloat.convertToDouble(); return result.release(); @@ -3879,13 +3987,10 @@ CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); } -} // end: extern "C" - //===----------------------------------------------------------------------===// // CXFile Operations. //===----------------------------------------------------------------------===// -extern "C" { CXString clang_getFileName(CXFile SFile) { if (!SFile) return cxstring::createNull(); @@ -3954,8 +4059,6 @@ int clang_File_isEqual(CXFile file1, CXFile file2) { return FEnt1->getUniqueID() == FEnt2->getUniqueID(); } -} // end: extern "C" - //===----------------------------------------------------------------------===// // CXCursor Operations. //===----------------------------------------------------------------------===// @@ -4340,7 +4443,8 @@ CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C, } if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor || - C.kind == CXCursor_ConversionFunction) { + C.kind == CXCursor_ConversionFunction || + C.kind == CXCursor_FunctionDecl) { if (pieceIndex > 0) return clang_getNullRange(); if (const FunctionDecl *FD = @@ -4880,12 +4984,30 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("OMPDistributeSimdDirective"); case CXCursor_OMPTargetParallelForSimdDirective: return cxstring::createRef("OMPTargetParallelForSimdDirective"); + case CXCursor_OMPTargetSimdDirective: + return cxstring::createRef("OMPTargetSimdDirective"); + case CXCursor_OMPTeamsDistributeDirective: + return cxstring::createRef("OMPTeamsDistributeDirective"); + case CXCursor_OMPTeamsDistributeSimdDirective: + return cxstring::createRef("OMPTeamsDistributeSimdDirective"); + case CXCursor_OMPTeamsDistributeParallelForSimdDirective: + return cxstring::createRef("OMPTeamsDistributeParallelForSimdDirective"); + case CXCursor_OMPTeamsDistributeParallelForDirective: + return cxstring::createRef("OMPTeamsDistributeParallelForDirective"); + case CXCursor_OMPTargetTeamsDirective: + return cxstring::createRef("OMPTargetTeamsDirective"); + case CXCursor_OMPTargetTeamsDistributeDirective: + return cxstring::createRef("OMPTargetTeamsDistributeDirective"); + case CXCursor_OMPTargetTeamsDistributeParallelForDirective: + return cxstring::createRef("OMPTargetTeamsDistributeParallelForDirective"); case CXCursor_OverloadCandidate: return cxstring::createRef("OverloadCandidate"); case CXCursor_TypeAliasTemplateDecl: return cxstring::createRef("TypeAliasTemplateDecl"); case CXCursor_StaticAssert: return cxstring::createRef("StaticAssert"); + case CXCursor_FriendDecl: + return cxstring::createRef("FriendDecl"); } llvm_unreachable("Unhandled CXCursorKind"); @@ -5453,8 +5575,6 @@ static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { return getRawCursorExtent(C); } -extern "C" { - CXSourceRange clang_getCursorExtent(CXCursor C) { SourceRange R = getRawCursorExtent(C); if (R.isInvalid()) @@ -5607,6 +5727,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::TemplateTypeParm: case Decl::EnumConstant: case Decl::Field: + case Decl::Binding: case Decl::MSProperty: case Decl::IndirectField: case Decl::ObjCIvar: @@ -5619,6 +5740,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::ObjCImplementation: case Decl::AccessSpec: case Decl::LinkageSpec: + case Decl::Export: case Decl::ObjCPropertyImpl: case Decl::FileScopeAsm: case Decl::StaticAssert: @@ -5634,6 +5756,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::BuiltinTemplate: case Decl::PragmaComment: case Decl::PragmaDetectMismatch: + case Decl::UsingPack: return C; // Declaration kinds that don't make any sense here, but are @@ -5677,7 +5800,8 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::Var: case Decl::VarTemplateSpecialization: - case Decl::VarTemplatePartialSpecialization: { + case Decl::VarTemplatePartialSpecialization: + case Decl::Decomposition: { // Ask the variable if it has a definition. if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition()) return MakeCXCursor(Def, TU); @@ -5944,8 +6068,6 @@ void clang_executeOnThread(void (*fn)(void*), void *user_data, llvm::llvm_execute_on_thread(fn, user_data, stack_size); } -} // end: extern "C" - //===----------------------------------------------------------------------===// // Token-based Operations. //===----------------------------------------------------------------------===// @@ -5958,8 +6080,6 @@ void clang_executeOnThread(void (*fn)(void*), void *user_data, * ptr_data: for identifiers and keywords, an IdentifierInfo*. * otherwise unused. */ -extern "C" { - CXTokenKind clang_getTokenKind(CXToken CXTok) { return static_cast<CXTokenKind>(CXTok.int_data[0]); } @@ -6103,7 +6223,7 @@ static void getTokens(ASTUnit *CXXUnit, SourceRange Range, } CXTokens.push_back(CXTok); previousWasAt = Tok.is(tok::at); - } while (Lex.getBufferLocation() <= EffectiveBufferEnd); + } while (Lex.getBufferLocation() < EffectiveBufferEnd); } void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, @@ -6148,8 +6268,6 @@ void clang_disposeTokens(CXTranslationUnit TU, free(Tokens); } -} // end: extern "C" - //===----------------------------------------------------------------------===// // Token annotation APIs. //===----------------------------------------------------------------------===// @@ -6817,8 +6935,6 @@ static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit, } } -extern "C" { - void clang_annotateTokens(CXTranslationUnit TU, CXToken *Tokens, unsigned NumTokens, CXCursor *Cursors) { @@ -6858,13 +6974,10 @@ void clang_annotateTokens(CXTranslationUnit TU, } } -} // end: extern "C" - //===----------------------------------------------------------------------===// // Operations for querying linkage of a cursor. //===----------------------------------------------------------------------===// -extern "C" { CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { if (!clang_isDeclaration(cursor.kind)) return CXLinkage_Invalid; @@ -6881,13 +6994,11 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { return CXLinkage_Invalid; } -} // end: extern "C" //===----------------------------------------------------------------------===// // Operations for querying visibility of a cursor. //===----------------------------------------------------------------------===// -extern "C" { CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { if (!clang_isDeclaration(cursor.kind)) return CXVisibility_Invalid; @@ -6902,7 +7013,6 @@ CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { return CXVisibility_Invalid; } -} // end: extern "C" //===----------------------------------------------------------------------===// // Operations for querying language of a cursor. @@ -6958,8 +7068,6 @@ static CXLanguageKind getDeclLanguage(const Decl *D) { return CXLanguage_C; } -extern "C" { - static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) { if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) return CXAvailability_NotAvailable; @@ -7429,14 +7537,10 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, return nullptr; } -} // end: extern "C" - //===----------------------------------------------------------------------===// // C++ AST instrospection. //===----------------------------------------------------------------------===// -extern "C" { - unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) { if (!clang_isDeclaration(C.kind)) return 0; @@ -7537,13 +7641,11 @@ unsigned clang_CXXMethod_isVirtual(CXCursor C) { D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; return (Method && Method->isVirtual()) ? 1 : 0; } -} // end: extern "C" //===----------------------------------------------------------------------===// // Attribute introspection. //===----------------------------------------------------------------------===// -extern "C" { CXType clang_getIBOutletCollectionType(CXCursor C) { if (C.kind != CXCursor_IBOutletCollectionAttr) return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); @@ -7553,7 +7655,6 @@ CXType clang_getIBOutletCollectionType(CXCursor C) { return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); } -} // end: extern "C" //===----------------------------------------------------------------------===// // Inspecting memory usage. @@ -7568,8 +7669,6 @@ static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries, entries.push_back(entry); } -extern "C" { - const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { const char *str = ""; switch (kind) { @@ -7708,7 +7807,7 @@ CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { CXTUResourceUsage usage = { (void*) entries.get(), (unsigned) entries->size(), !entries->empty() ? &(*entries)[0] : nullptr }; - entries.release(); + (void)entries.release(); return usage; } @@ -7756,6 +7855,33 @@ CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { return skipped; } +CXSourceRangeList *clang_getAllSkippedRanges(CXTranslationUnit TU) { + CXSourceRangeList *skipped = new CXSourceRangeList; + skipped->count = 0; + skipped->ranges = nullptr; + + if (isNotUsableTU(TU)) { + LOG_BAD_TU(TU); + return skipped; + } + + ASTUnit *astUnit = cxtu::getASTUnit(TU); + PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord(); + if (!ppRec) + return skipped; + + ASTContext &Ctx = astUnit->getASTContext(); + + const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); + + skipped->count = SkippedRanges.size(); + skipped->ranges = new CXSourceRange[skipped->count]; + for (unsigned i = 0, ei = skipped->count; i != ei; ++i) + skipped->ranges[i] = cxloc::translateSourceRange(Ctx, SkippedRanges[i]); + + return skipped; +} + void clang_disposeSourceRangeList(CXSourceRangeList *ranges) { if (ranges) { delete[] ranges->ranges; @@ -7763,8 +7889,6 @@ void clang_disposeSourceRangeList(CXSourceRangeList *ranges) { } } -} // end extern "C" - void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU); for (unsigned I = 0; I != Usage.numEntries; ++I) @@ -7927,14 +8051,10 @@ cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc, return checkForMacroInMacroDefinition(MI, Tok, TU); } -extern "C" { - CXString clang_getClangVersion() { return cxstring::createDup(getClangFullVersion()); } -} // end: extern "C" - Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) { if (TU) { if (ASTUnit *Unit = cxtu::getASTUnit(TU)) { @@ -8040,4 +8160,10 @@ cxindex::Logger::~Logger() { extern volatile int ClangTidyPluginAnchorSource; static int LLVM_ATTRIBUTE_UNUSED ClangTidyPluginAnchorDestination = ClangTidyPluginAnchorSource; + +// This anchor is used to force the linker to link the clang-include-fixer +// plugin. +extern volatile int ClangIncludeFixerPluginAnchorSource; +static int LLVM_ATTRIBUTE_UNUSED ClangIncludeFixerPluginAnchorDestination = + ClangIncludeFixerPluginAnchorSource; #endif |