diff options
Diffstat (limited to 'tools/libclang')
| -rw-r--r-- | tools/libclang/CIndex.cpp | 586 | ||||
| -rw-r--r-- | tools/libclang/CIndexCodeCompletion.cpp | 50 | ||||
| -rw-r--r-- | tools/libclang/CIndexer.h | 4 | ||||
| -rw-r--r-- | tools/libclang/CMakeLists.txt | 17 | ||||
| -rw-r--r-- | tools/libclang/CXCompilationDatabase.cpp | 10 | ||||
| -rw-r--r-- | tools/libclang/CXCursor.cpp | 24 | ||||
| -rw-r--r-- | tools/libclang/CXLoadedDiagnostic.cpp | 7 | ||||
| -rw-r--r-- | tools/libclang/CXString.cpp | 17 | ||||
| -rw-r--r-- | tools/libclang/CXString.h | 2 | ||||
| -rw-r--r-- | tools/libclang/CXType.cpp | 39 | ||||
| -rw-r--r-- | tools/libclang/CursorVisitor.h | 1 | ||||
| -rw-r--r-- | tools/libclang/IndexBody.cpp | 11 | ||||
| -rw-r--r-- | tools/libclang/IndexTypeSourceInfo.cpp | 4 | ||||
| -rw-r--r-- | tools/libclang/Indexing.cpp | 180 | ||||
| -rw-r--r-- | tools/libclang/IndexingContext.cpp | 5 | ||||
| -rw-r--r-- | tools/libclang/libclang.exports | 9 |
16 files changed, 583 insertions, 383 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 8225a6c44293..dbda13c23532 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -29,7 +29,6 @@ #include "clang/Basic/DiagnosticIDs.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/Version.h" -#include "clang/CodeGen/ObjectFilePCHContainerOperations.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" @@ -148,7 +147,7 @@ CXSourceRange cxloc::translateSourceRange(const SourceManager &SM, SourceLocation EndLoc = R.getEnd(); if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc)) EndLoc = SM.getExpansionRange(EndLoc).second; - if (R.isTokenRange() && !EndLoc.isInvalid()) { + if (R.isTokenRange() && EndLoc.isValid()) { unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), SM, LangOpts); EndLoc = EndLoc.getLocWithOffset(Length); @@ -665,6 +664,13 @@ bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) { llvm_unreachable("Translation units are visited directly by Visit()"); } +bool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { + if (VisitTemplateParameters(D->getTemplateParameters())) + return true; + + return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest)); +} + bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) { if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) return Visit(TSInfo->getTypeLoc()); @@ -711,11 +717,8 @@ bool CursorVisitor::VisitClassTemplateSpecializationDecl( return true; } } - - if (ShouldVisitBody && VisitCXXRecordDecl(D)) - return true; - - return false; + + return ShouldVisitBody && VisitCXXRecordDecl(D); } bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl( @@ -940,11 +943,8 @@ bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) { return true; } - if (ND->isThisDeclarationADefinition() && - Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest))) - return true; - - return false; + return ND->isThisDeclarationADefinition() && + Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)); } template <typename DeclIt> @@ -1461,9 +1461,19 @@ bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { case BuiltinType::OCLImage1dBuffer: case BuiltinType::OCLImage2d: case BuiltinType::OCLImage2dArray: + case BuiltinType::OCLImage2dDepth: + case BuiltinType::OCLImage2dArrayDepth: + case BuiltinType::OCLImage2dMSAA: + case BuiltinType::OCLImage2dArrayMSAA: + case BuiltinType::OCLImage2dMSAADepth: + case BuiltinType::OCLImage2dArrayMSAADepth: case BuiltinType::OCLImage3d: case BuiltinType::OCLSampler: case BuiltinType::OCLEvent: + case BuiltinType::OCLClkEvent: + case BuiltinType::OCLQueue: + case BuiltinType::OCLNDRange: + case BuiltinType::OCLReserveID: #define BUILTIN_TYPE(Id, SingletonId) #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: @@ -1514,10 +1524,7 @@ bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { } bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { - if (Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU))) - return true; - - return false; + return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU)); } bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { @@ -1635,10 +1642,7 @@ bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { } bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { - if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) - return true; - - return false; + return VisitNestedNameSpecifierLoc(TL.getQualifierLoc()); } bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( @@ -1745,13 +1749,27 @@ DEF_JOB(StmtVisit, Stmt, StmtVisitKind) DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) -DEF_JOB(ExplicitTemplateArgsVisit, ASTTemplateArgumentListInfo, - ExplicitTemplateArgsVisitKind) DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind) DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind) DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind) #undef DEF_JOB +class ExplicitTemplateArgsVisit : public VisitorJob { +public: + ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin, + const TemplateArgumentLoc *End, CXCursor parent) + : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin, + End) {} + static bool classof(const VisitorJob *VJ) { + return VJ->getKind() == ExplicitTemplateArgsVisitKind; + } + const TemplateArgumentLoc *begin() const { + return static_cast<const TemplateArgumentLoc *>(data[0]); + } + const TemplateArgumentLoc *end() { + return static_cast<const TemplateArgumentLoc *>(data[1]); + } +}; class DeclVisit : public VisitorJob { public: DeclVisit(const Decl *D, CXCursor parent, bool isFirst) : @@ -1930,12 +1948,17 @@ public: void VisitOMPOrderedDirective(const OMPOrderedDirective *D); void VisitOMPAtomicDirective(const OMPAtomicDirective *D); void VisitOMPTargetDirective(const OMPTargetDirective *D); + void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D); void VisitOMPTeamsDirective(const OMPTeamsDirective *D); + void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D); + void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D); + void VisitOMPDistributeDirective(const OMPDistributeDirective *D); private: void AddDeclarationNameInfo(const Stmt *S); void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier); - void AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A); + void AddExplicitTemplateArgs(const TemplateArgumentLoc *A, + unsigned NumTemplateArgs); void AddMemberRef(const FieldDecl *D, SourceLocation L); void AddStmt(const Stmt *S); void AddDecl(const Decl *D, bool isFirst = true); @@ -1965,10 +1988,9 @@ void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) { if (D) WL.push_back(DeclVisit(D, Parent, isFirst)); } -void EnqueueVisitor:: - AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A) { - if (A) - WL.push_back(ExplicitTemplateArgsVisit(A, Parent)); +void EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A, + unsigned NumTemplateArgs) { + WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent)); } void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) { if (D) @@ -2019,6 +2041,10 @@ void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) { Visitor->AddStmt(C->getSafelen()); } +void OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) { + Visitor->AddStmt(C->getSimdlen()); +} + void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) { Visitor->AddStmt(C->getNumForLoops()); } @@ -2032,7 +2058,9 @@ void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) { Visitor->AddStmt(C->getHelperChunkSize()); } -void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *) {} +void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) { + Visitor->AddStmt(C->getNumForLoops()); +} void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {} @@ -2050,6 +2078,40 @@ void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {} void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {} +void OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {} + +void OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {} + +void OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {} + +void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) { + Visitor->AddStmt(C->getDevice()); +} + +void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) { + Visitor->AddStmt(C->getNumTeams()); +} + +void OMPClauseEnqueue::VisitOMPThreadLimitClause(const OMPThreadLimitClause *C) { + Visitor->AddStmt(C->getThreadLimit()); +} + +void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) { + Visitor->AddStmt(C->getPriority()); +} + +void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) { + Visitor->AddStmt(C->getGrainsize()); +} + +void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) { + Visitor->AddStmt(C->getNumTasks()); +} + +void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) { + Visitor->AddStmt(C->getHint()); +} + template<typename T> void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { for (const auto *I : Node->varlists()) { @@ -2088,6 +2150,9 @@ void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { } void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { VisitOMPClauseList(C); + for (auto *E : C->privates()) { + Visitor->AddStmt(E); + } for (auto *E : C->lhs_exprs()) { Visitor->AddStmt(E); } @@ -2100,6 +2165,9 @@ void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { } void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { VisitOMPClauseList(C); + for (const auto *E : C->privates()) { + Visitor->AddStmt(E); + } for (const auto *E : C->inits()) { Visitor->AddStmt(E); } @@ -2147,6 +2215,9 @@ void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) { void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) { VisitOMPClauseList(C); } +void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) { + VisitOMPClauseList(C); +} } void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { @@ -2171,10 +2242,8 @@ void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { AddTypeLoc(E->getTypeSourceInfo()); } void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) { - for (CompoundStmt::const_reverse_body_iterator I = S->body_rbegin(), - E = S->body_rend(); I != E; ++I) { - AddStmt(*I); - } + for (auto &I : llvm::reverse(S->body())) + AddStmt(I); } void EnqueueVisitor:: VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) { @@ -2186,7 +2255,8 @@ VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) { void EnqueueVisitor:: VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) { - AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); + if (E->hasExplicitTemplateArgs()) + AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); AddDeclarationNameInfo(E); if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) AddNestedNameSpecifierLoc(QualifierLoc); @@ -2261,14 +2331,14 @@ void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) { } void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) { - if (DR->hasExplicitTemplateArgs()) { - AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs()); - } + if (DR->hasExplicitTemplateArgs()) + AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs()); WL.push_back(DeclRefExprParts(DR, Parent)); } void EnqueueVisitor::VisitDependentScopeDeclRefExpr( const DependentScopeDeclRefExpr *E) { - AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); + if (E->hasExplicitTemplateArgs()) + AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); AddDeclarationNameInfo(E); AddNestedNameSpecifierLoc(E->getQualifierLoc()); } @@ -2364,7 +2434,6 @@ void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) { void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) { // Visit the components of the offsetof expression. for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) { - typedef OffsetOfExpr::OffsetOfNode OffsetOfNode; const OffsetOfNode &Node = E->getComponent(I-1); switch (Node.getKind()) { case OffsetOfNode::Array: @@ -2382,7 +2451,8 @@ void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) { AddTypeLoc(E->getTypeSourceInfo()); } void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) { - AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); + if (E->hasExplicitTemplateArgs()) + AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); WL.push_back(OverloadExprParts(E, Parent)); } void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr( @@ -2549,6 +2619,11 @@ void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) { VisitOMPExecutableDirective(D); } +void EnqueueVisitor::VisitOMPTargetDataDirective(const + OMPTargetDataDirective *D) { + VisitOMPExecutableDirective(D); +} + void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) { VisitOMPExecutableDirective(D); } @@ -2562,6 +2637,20 @@ void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) { VisitOMPExecutableDirective(D); } +void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPTaskLoopSimdDirective( + const OMPTaskLoopSimdDirective *D) { + VisitOMPLoopDirective(D); +} + +void EnqueueVisitor::VisitOMPDistributeDirective( + const OMPDistributeDirective *D) { + VisitOMPLoopDirective(D); +} + void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S); } @@ -2597,12 +2686,9 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { continue; } case VisitorJob::ExplicitTemplateArgsVisitKind: { - const ASTTemplateArgumentListInfo *ArgList = - cast<ExplicitTemplateArgsVisit>(&LI)->get(); - for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(), - *ArgEnd = Arg + ArgList->NumTemplateArgs; - Arg != ArgEnd; ++Arg) { - if (VisitTemplateArgumentLoc(*Arg)) + for (const TemplateArgumentLoc &Arg : + *cast<ExplicitTemplateArgsVisit>(&LI)) { + if (VisitTemplateArgumentLoc(Arg)) return true; } continue; @@ -2804,10 +2890,9 @@ bool CursorVisitor::Visit(const Stmt *S) { namespace { typedef SmallVector<SourceRange, 4> RefNamePieces; -RefNamePieces -buildPieces(unsigned NameFlags, bool IsMemberRefExpr, - const DeclarationNameInfo &NI, const SourceRange &QLoc, - const ASTTemplateArgumentListInfo *TemplateArgs = nullptr) { +RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr, + const DeclarationNameInfo &NI, SourceRange QLoc, + const SourceRange *TemplateArgsLoc = nullptr) { const bool WantQualifier = NameFlags & CXNameRange_WantQualifier; const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs; const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece; @@ -2821,11 +2906,10 @@ buildPieces(unsigned NameFlags, bool IsMemberRefExpr, if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr) Pieces.push_back(NI.getLoc()); - - if (WantTemplateArgs && TemplateArgs) - Pieces.push_back(SourceRange(TemplateArgs->LAngleLoc, - TemplateArgs->RAngleLoc)); - + + if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid()) + Pieces.push_back(*TemplateArgsLoc); + if (Kind == DeclarationName::CXXOperatorName) { Pieces.push_back(SourceLocation::getFromRawEncoding( NI.getInfo().CXXOperatorName.BeginOpNameLoc)); @@ -2955,7 +3039,8 @@ enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx, CompilerInstance::createDiagnostics(new DiagnosticOptions()); std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile( ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), Diags, - FileSystemOpts, CXXIdx->getOnlyLocalDecls(), None, + FileSystemOpts, /*UseDebugInfo=*/false, + CXXIdx->getOnlyLocalDecls(), None, /*CaptureDiagnostics=*/true, /*AllowPCHWithCompilerErrors=*/true, /*UserFilesAreVolatile=*/true); @@ -2982,35 +3067,19 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, Options); } -struct ParseTranslationUnitInfo { - CXIndex CIdx; - const char *source_filename; - const char *const *command_line_args; - int num_command_line_args; - ArrayRef<CXUnsavedFile> unsaved_files; - unsigned options; - CXTranslationUnit *out_TU; - CXErrorCode &result; -}; -static void clang_parseTranslationUnit_Impl(void *UserData) { - const ParseTranslationUnitInfo *PTUI = - static_cast<ParseTranslationUnitInfo *>(UserData); - CXIndex CIdx = PTUI->CIdx; - const char *source_filename = PTUI->source_filename; - const char * const *command_line_args = PTUI->command_line_args; - int num_command_line_args = PTUI->num_command_line_args; - unsigned options = PTUI->options; - CXTranslationUnit *out_TU = PTUI->out_TU; - +static CXErrorCode +clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename, + const char *const *command_line_args, + int num_command_line_args, + ArrayRef<CXUnsavedFile> unsaved_files, + unsigned options, CXTranslationUnit *out_TU) { // Set up the initial return values. if (out_TU) *out_TU = nullptr; // Check arguments. - if (!CIdx || !out_TU) { - PTUI->result = CXError_InvalidArguments; - return; - } + if (!CIdx || !out_TU) + return CXError_InvalidArguments; CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); @@ -3018,6 +3087,8 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { setThreadBackgroundPriority(); bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; + bool CreatePreambleOnFirstParse = + options & CXTranslationUnit_CreatePreambleOnFirstParse; // FIXME: Add a flag for modules. TranslationUnitKind TUKind = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete; @@ -3044,7 +3115,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : PTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); @@ -3070,12 +3141,12 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { break; } } - if (!FoundSpellCheckingArgument) - Args->push_back("-fno-spell-checking"); - Args->insert(Args->end(), command_line_args, command_line_args + num_command_line_args); + if (!FoundSpellCheckingArgument) + Args->insert(Args->begin() + 1, "-fno-spell-checking"); + // The 'source_filename' argument is optional. If the caller does not // specify it then it is assumed that the source file is specified // in the actual argument list. @@ -3092,21 +3163,26 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { unsigned NumErrors = Diags->getClient()->getNumErrors(); std::unique_ptr<ASTUnit> ErrUnit; + // Unless the user specified that they want the preamble on the first parse + // set it up to be created on the first reparse. This makes the first parse + // faster, trading for a slower (first) reparse. + unsigned PrecompilePreambleAfterNParses = + !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse; std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine( Args->data(), Args->data() + Args->size(), CXXIdx->getPCHContainerOperations(), Diags, CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(), /*CaptureDiagnostics=*/true, *RemappedFiles.get(), - /*RemappedFilesKeepOriginalName=*/true, PrecompilePreamble, TUKind, - CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion, + /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses, + TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion, /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, - /*UserFilesAreVolatile=*/true, ForSerialization, &ErrUnit)); + /*UserFilesAreVolatile=*/true, ForSerialization, + CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(), + &ErrUnit)); // Early failures in LoadFromCommandLine may return with ErrUnit unset. - if (!Unit && !ErrUnit) { - PTUI->result = CXError_ASTReadError; - return; - } + if (!Unit && !ErrUnit) + return CXError_ASTReadError; if (NumErrors != Diags->getClient()->getNumErrors()) { // Make sure to check that 'Unit' is non-NULL. @@ -3114,12 +3190,11 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get()); } - if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) { - PTUI->result = CXError_ASTReadError; - } else { - *PTUI->out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release()); - PTUI->result = *PTUI->out_TU ? CXError_Success : CXError_Failure; - } + if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) + return CXError_ASTReadError; + + *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release()); + return *out_TU ? CXError_Success : CXError_Failure; } CXTranslationUnit @@ -3141,14 +3216,23 @@ clang_parseTranslationUnit(CXIndex CIdx, } enum CXErrorCode clang_parseTranslationUnit2( - CXIndex CIdx, - const char *source_filename, - const char *const *command_line_args, - int num_command_line_args, - struct CXUnsavedFile *unsaved_files, - unsigned num_unsaved_files, - unsigned options, - CXTranslationUnit *out_TU) { + CXIndex CIdx, const char *source_filename, + const char *const *command_line_args, int num_command_line_args, + struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, + unsigned options, CXTranslationUnit *out_TU) { + SmallVector<const char *, 4> Args; + Args.push_back("clang"); + Args.append(command_line_args, command_line_args + num_command_line_args); + return clang_parseTranslationUnit2FullArgv( + CIdx, source_filename, Args.data(), Args.size(), unsaved_files, + num_unsaved_files, options, out_TU); +} + +enum CXErrorCode clang_parseTranslationUnit2FullArgv( + CXIndex CIdx, const char *source_filename, + const char *const *command_line_args, int num_command_line_args, + struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, + unsigned options, CXTranslationUnit *out_TU) { LOG_FUNC_SECTION { *Log << source_filename << ": "; for (int i = 0; i != num_command_line_args; ++i) @@ -3159,18 +3243,14 @@ enum CXErrorCode clang_parseTranslationUnit2( return CXError_InvalidArguments; CXErrorCode result = CXError_Failure; - ParseTranslationUnitInfo PTUI = { - CIdx, - source_filename, - command_line_args, - num_command_line_args, - llvm::makeArrayRef(unsaved_files, num_unsaved_files), - options, - out_TU, - result}; + auto ParseTranslationUnitImpl = [=, &result] { + result = clang_parseTranslationUnit_Impl( + CIdx, source_filename, command_line_args, num_command_line_args, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU); + }; llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) { + if (!RunSafely(CRC, ParseTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during parsing: {\n"); fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); fprintf(stderr, " 'command_line_args' : ["); @@ -3193,7 +3273,7 @@ enum CXErrorCode clang_parseTranslationUnit2( return CXError_Crashed; } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { - if (CXTranslationUnit *TU = PTUI.out_TU) + if (CXTranslationUnit *TU = out_TU) PrintLibclangResourceUsage(*TU); } @@ -3204,27 +3284,15 @@ unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { return CXSaveTranslationUnit_None; } -namespace { - -struct SaveTranslationUnitInfo { - CXTranslationUnit TU; - const char *FileName; - unsigned options; - CXSaveError result; -}; - -} - -static void clang_saveTranslationUnit_Impl(void *UserData) { - SaveTranslationUnitInfo *STUI = - static_cast<SaveTranslationUnitInfo*>(UserData); - - CIndexer *CXXIdx = STUI->TU->CIdx; +static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU, + const char *FileName, + unsigned options) { + CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) setThreadBackgroundPriority(); - bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName); - STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None; + bool hadError = cxtu::getASTUnit(TU)->Save(FileName); + return hadError ? CXSaveError_Unknown : CXSaveError_None; } int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, @@ -3243,16 +3311,19 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, if (!CXXUnit->hasSema()) return CXSaveError_InvalidTU; - SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None }; + CXSaveError result; + auto SaveTranslationUnitImpl = [=, &result]() { + result = clang_saveTranslationUnit_Impl(TU, FileName, options); + }; if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() || getenv("LIBCLANG_NOTHREADS")) { - clang_saveTranslationUnit_Impl(&STUI); + SaveTranslationUnitImpl(); if (getenv("LIBCLANG_RESOURCE_USAGE")) PrintLibclangResourceUsage(TU); - return STUI.result; + return result; } // We have an AST that has invalid nodes due to compiler errors. @@ -3260,7 +3331,7 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) { + if (!RunSafely(CRC, SaveTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during AST saving: {\n"); fprintf(stderr, " 'filename' : '%s'\n", FileName); fprintf(stderr, " 'options' : %d,\n", options); @@ -3272,7 +3343,7 @@ int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, PrintLibclangResourceUsage(TU); } - return STUI.result; + return result; } void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { @@ -3296,25 +3367,14 @@ unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { return CXReparse_None; } -struct ReparseTranslationUnitInfo { - CXTranslationUnit TU; - ArrayRef<CXUnsavedFile> unsaved_files; - unsigned options; - CXErrorCode &result; -}; - -static void clang_reparseTranslationUnit_Impl(void *UserData) { - const ReparseTranslationUnitInfo *RTUI = - static_cast<ReparseTranslationUnitInfo *>(UserData); - CXTranslationUnit TU = RTUI->TU; - unsigned options = RTUI->options; - (void) options; - +static CXErrorCode +clang_reparseTranslationUnit_Impl(CXTranslationUnit TU, + ArrayRef<CXUnsavedFile> unsaved_files, + unsigned options) { // Check arguments. if (isNotUsableTU(TU)) { LOG_BAD_TU(TU); - RTUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } // Reset the associated diagnostics. @@ -3335,7 +3395,7 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar< std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); - for (auto &UF : RTUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); @@ -3343,9 +3403,10 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(), *RemappedFiles.get())) - RTUI->result = CXError_Success; - else if (isASTReadError(CXXUnit)) - RTUI->result = CXError_ASTReadError; + return CXError_Success; + if (isASTReadError(CXXUnit)) + return CXError_ASTReadError; + return CXError_Failure; } int clang_reparseTranslationUnit(CXTranslationUnit TU, @@ -3359,19 +3420,20 @@ int clang_reparseTranslationUnit(CXTranslationUnit TU, if (num_unsaved_files && !unsaved_files) return CXError_InvalidArguments; - CXErrorCode result = CXError_Failure; - ReparseTranslationUnitInfo RTUI = { - TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, - result}; + CXErrorCode result; + auto ReparseTranslationUnitImpl = [=, &result]() { + result = clang_reparseTranslationUnit_Impl( + TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); + }; if (getenv("LIBCLANG_NOTHREADS")) { - clang_reparseTranslationUnit_Impl(&RTUI); + ReparseTranslationUnitImpl(); return result; } llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) { + if (!RunSafely(CRC, ReparseTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during reparsing\n"); cxtu::getASTUnit(TU)->setUnsafeToFree(true); return CXError_Crashed; @@ -3551,6 +3613,26 @@ static SourceLocation getLocationFromExpr(const Expr *E) { return E->getLocStart(); } +static std::string getMangledStructor(std::unique_ptr<MangleContext> &M, + std::unique_ptr<llvm::DataLayout> &DL, + const NamedDecl *ND, + unsigned StructorType) { + std::string FrontendBuf; + llvm::raw_string_ostream FOS(FrontendBuf); + + if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND)) + M->mangleCXXCtor(CD, static_cast<CXXCtorType>(StructorType), FOS); + else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND)) + M->mangleCXXDtor(DD, static_cast<CXXDtorType>(StructorType), FOS); + + std::string BackendBuf; + llvm::raw_string_ostream BOS(BackendBuf); + + llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL); + + return BOS.str(); +} + extern "C" { unsigned clang_visitChildren(CXCursor parent, @@ -3780,6 +3862,19 @@ CXString clang_getCursorSpelling(CXCursor C) { return cxstring::createRef("packed"); } + if (C.kind == CXCursor_VisibilityAttr) { + const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C)); + switch (AA->getVisibility()) { + case VisibilityAttr::VisibilityType::Default: + return cxstring::createRef("default"); + case VisibilityAttr::VisibilityType::Hidden: + return cxstring::createRef("hidden"); + case VisibilityAttr::VisibilityType::Protected: + return cxstring::createRef("protected"); + } + llvm_unreachable("unknown visibility type"); + } + return cxstring::createEmpty(); } @@ -3893,11 +3988,15 @@ CXString clang_Cursor_getMangling(CXCursor C) { std::string FrontendBuf; llvm::raw_string_ostream FrontendBufOS(FrontendBuf); - MC->mangleName(ND, FrontendBufOS); + if (MC->shouldMangleDeclName(ND)) { + MC->mangleName(ND, FrontendBufOS); + } else { + ND->printName(FrontendBufOS); + } // Now apply backend mangling. std::unique_ptr<llvm::DataLayout> DL( - new llvm::DataLayout(Ctx.getTargetInfo().getTargetDescription())); + new llvm::DataLayout(Ctx.getTargetInfo().getDataLayoutString())); std::string FinalBuf; llvm::raw_string_ostream FinalBufOS(FinalBuf); @@ -3907,6 +4006,54 @@ CXString clang_Cursor_getMangling(CXCursor C) { return cxstring::createDup(FinalBufOS.str()); } +CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) { + if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) + return nullptr; + + const Decl *D = getCursorDecl(C); + if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D))) + return nullptr; + + const NamedDecl *ND = cast<NamedDecl>(D); + + ASTContext &Ctx = ND->getASTContext(); + std::unique_ptr<MangleContext> M(Ctx.createMangleContext()); + std::unique_ptr<llvm::DataLayout> DL( + new llvm::DataLayout(Ctx.getTargetInfo().getDataLayoutString())); + + std::vector<std::string> Manglings; + + auto hasDefaultCXXMethodCC = [](ASTContext &C, const CXXMethodDecl *MD) { + auto DefaultCC = C.getDefaultCallingConvention(/*IsVariadic=*/false, + /*IsCSSMethod=*/true); + auto CC = MD->getType()->getAs<FunctionProtoType>()->getCallConv(); + return CC == DefaultCC; + }; + + if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND)) { + Manglings.emplace_back(getMangledStructor(M, DL, CD, Ctor_Base)); + + if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily()) + if (!CD->getParent()->isAbstract()) + Manglings.emplace_back(getMangledStructor(M, DL, CD, Ctor_Complete)); + + if (Ctx.getTargetInfo().getCXXABI().isMicrosoft()) + if (CD->hasAttr<DLLExportAttr>() && CD->isDefaultConstructor()) + if (!(hasDefaultCXXMethodCC(Ctx, CD) && CD->getNumParams() == 0)) + Manglings.emplace_back(getMangledStructor(M, DL, CD, + Ctor_DefaultClosure)); + } else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND)) { + Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Base)); + if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily()) { + Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Complete)); + if (DD->isVirtual()) + Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Deleting)); + } + } + + return cxstring::createSet(Manglings); +} + CXString clang_getCursorDisplayName(CXCursor C) { if (!clang_isDeclaration(C.kind)) return clang_getCursorSpelling(C); @@ -4071,6 +4218,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("UnaryOperator"); case CXCursor_ArraySubscriptExpr: return cxstring::createRef("ArraySubscriptExpr"); + case CXCursor_OMPArraySectionExpr: + return cxstring::createRef("OMPArraySectionExpr"); case CXCursor_BinaryOperator: return cxstring::createRef("BinaryOperator"); case CXCursor_CompoundAssignOperator: @@ -4259,6 +4408,12 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("attribute(host)"); case CXCursor_CUDASharedAttr: return cxstring::createRef("attribute(shared)"); + case CXCursor_VisibilityAttr: + return cxstring::createRef("attribute(visibility)"); + case CXCursor_DLLExport: + return cxstring::createRef("attribute(dllexport)"); + case CXCursor_DLLImport: + return cxstring::createRef("attribute(dllimport)"); case CXCursor_PreprocessingDirective: return cxstring::createRef("preprocessing directive"); case CXCursor_MacroDefinition: @@ -4349,14 +4504,24 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("OMPAtomicDirective"); case CXCursor_OMPTargetDirective: return cxstring::createRef("OMPTargetDirective"); + case CXCursor_OMPTargetDataDirective: + return cxstring::createRef("OMPTargetDataDirective"); case CXCursor_OMPTeamsDirective: return cxstring::createRef("OMPTeamsDirective"); case CXCursor_OMPCancellationPointDirective: return cxstring::createRef("OMPCancellationPointDirective"); case CXCursor_OMPCancelDirective: return cxstring::createRef("OMPCancelDirective"); + case CXCursor_OMPTaskLoopDirective: + return cxstring::createRef("OMPTaskLoopDirective"); + case CXCursor_OMPTaskLoopSimdDirective: + return cxstring::createRef("OMPTaskLoopSimdDirective"); + case CXCursor_OMPDistributeDirective: + return cxstring::createRef("OMPDistributeDirective"); case CXCursor_OverloadCandidate: return cxstring::createRef("OverloadCandidate"); + case CXCursor_TypeAliasTemplateDecl: + return cxstring::createRef("TypeAliasTemplateDecl"); } llvm_unreachable("Unhandled CXCursorKind"); @@ -5100,6 +5265,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::Import: case Decl::OMPThreadPrivate: case Decl::ObjCTypeParam: + case Decl::BuiltinTemplate: return C; // Declaration kinds that don't make any sense here, but are @@ -5362,10 +5528,12 @@ CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags, break; case CXCursor_DeclRefExpr: - if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) - Pieces = buildPieces(NameFlags, false, E->getNameInfo(), - E->getQualifierLoc().getSourceRange(), - E->getOptionalExplicitTemplateArgs()); + if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) { + SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc()); + Pieces = + buildPieces(NameFlags, false, E->getNameInfo(), + E->getQualifierLoc().getSourceRange(), &TemplateArgLoc); + } break; case CXCursor_CallExpr: @@ -6055,16 +6223,6 @@ MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, parent); } -namespace { - struct clang_annotateTokens_Data { - CXTranslationUnit TU; - ASTUnit *CXXUnit; - CXToken *Tokens; - unsigned NumTokens; - CXCursor *Cursors; - }; -} - /// \brief Used by \c annotatePreprocessorTokens. /// \returns true if lexing was finished, false otherwise. static bool lexNext(Lexer &Lex, Token &Tok, @@ -6074,10 +6232,7 @@ static bool lexNext(Lexer &Lex, Token &Tok, ++NextIdx; Lex.LexFromRawLexer(Tok); - if (Tok.is(tok::eof)) - return true; - - return false; + return Tok.is(tok::eof); } static void annotatePreprocessorTokens(CXTranslationUnit TU, @@ -6184,13 +6339,9 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, } // This gets run a separate thread to avoid stack blowout. -static void clang_annotateTokensImpl(void *UserData) { - CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU; - ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit; - CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens; - const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; - CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; - +static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit, + CXToken *Tokens, unsigned NumTokens, + CXCursor *Cursors) { CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) setThreadBackgroundPriority(); @@ -6326,11 +6477,12 @@ void clang_annotateTokens(CXTranslationUnit TU, return; ASTUnit::ConcurrencyCheck Check(*CXXUnit); - - clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors }; + + auto AnnotateTokensImpl = [=]() { + clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors); + }; llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_annotateTokensImpl, &data, - GetSafetyThreadStackSize() * 2)) { + if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) { fprintf(stderr, "libclang: crash detected while annotating tokens\n"); } } @@ -6361,6 +6513,27 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { } // 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; + + const Decl *D = cxcursor::getCursorDecl(cursor); + if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) + switch (ND->getVisibility()) { + case HiddenVisibility: return CXVisibility_Hidden; + case ProtectedVisibility: return CXVisibility_Protected; + case DefaultVisibility: return CXVisibility_Default; + }; + + return CXVisibility_Invalid; +} +} // end: extern "C" + +//===----------------------------------------------------------------------===// // Operations for querying language of a cursor. //===----------------------------------------------------------------------===// @@ -6418,7 +6591,7 @@ extern "C" { static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) { if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) - return CXAvailability_Available; + return CXAvailability_NotAvailable; switch (D->getAvailability()) { case AR_Available: @@ -6612,8 +6785,6 @@ enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) { return CX_SC_Static; case SC_PrivateExtern: return CX_SC_PrivateExtern; - case SC_OpenCLWorkGroupLocal: - return CX_SC_OpenCLWorkGroupLocal; case SC_Auto: return CX_SC_Auto; case SC_Register: @@ -6893,6 +7064,16 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, //===----------------------------------------------------------------------===// extern "C" { +unsigned clang_CXXField_isMutable(CXCursor C) { + if (!clang_isDeclaration(C.kind)) + return 0; + + if (const auto D = cxcursor::getCursorDecl(C)) + if (const auto FD = dyn_cast_or_null<FieldDecl>(D)) + return FD->isMutable() ? 1 : 0; + return 0; +} + unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { if (!clang_isDeclaration(C.kind)) return 0; @@ -7179,14 +7360,13 @@ static unsigned SafetyStackThreadSize = 8 << 20; namespace clang { -bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData, +bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, unsigned Size) { if (!Size) Size = GetSafetyThreadStackSize(); if (Size) - return CRC.RunSafelyOnThread(Fn, UserData, Size); - return CRC.RunSafely(Fn, UserData); + return CRC.RunSafelyOnThread(Fn, Size); + return CRC.RunSafely(Fn); } unsigned GetSafetyThreadStackSize() { @@ -7408,8 +7588,6 @@ Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) { static llvm::ManagedStatic<llvm::sys::Mutex> LoggingMutex; cxindex::Logger::~Logger() { - LogOS.flush(); - llvm::sys::ScopedLock L(*LoggingMutex); static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime(); diff --git a/tools/libclang/CIndexCodeCompletion.cpp b/tools/libclang/CIndexCodeCompletion.cpp index 9609a693abdf..344ed27021a1 100644 --- a/tools/libclang/CIndexCodeCompletion.cpp +++ b/tools/libclang/CIndexCodeCompletion.cpp @@ -646,25 +646,12 @@ namespace { }; } -extern "C" { -struct CodeCompleteAtInfo { - CXTranslationUnit TU; - const char *complete_filename; - unsigned complete_line; - unsigned complete_column; - ArrayRef<CXUnsavedFile> unsaved_files; - unsigned options; - CXCodeCompleteResults *result; -}; -static void clang_codeCompleteAt_Impl(void *UserData) { - CodeCompleteAtInfo *CCAI = static_cast<CodeCompleteAtInfo*>(UserData); - CXTranslationUnit TU = CCAI->TU; - const char *complete_filename = CCAI->complete_filename; - unsigned complete_line = CCAI->complete_line; - unsigned complete_column = CCAI->complete_column; - unsigned options = CCAI->options; +static CXCodeCompleteResults * +clang_codeCompleteAt_Impl(CXTranslationUnit TU, const char *complete_filename, + unsigned complete_line, unsigned complete_column, + ArrayRef<CXUnsavedFile> unsaved_files, + unsigned options) { bool IncludeBriefComments = options & CXCodeComplete_IncludeBriefComments; - CCAI->result = nullptr; #ifdef UDP_CODE_COMPLETION_LOGGER #ifdef UDP_CODE_COMPLETION_LOGGER_PORT @@ -676,12 +663,12 @@ static void clang_codeCompleteAt_Impl(void *UserData) { if (cxtu::isNotUsableTU(TU)) { LOG_BAD_TU(TU); - return; + return nullptr; } ASTUnit *AST = cxtu::getASTUnit(TU); if (!AST) - return; + return nullptr; CIndexer *CXXIdx = TU->CIdx; if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) @@ -692,7 +679,7 @@ static void clang_codeCompleteAt_Impl(void *UserData) { // Perform the remapping of source files. SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; - for (auto &UF : CCAI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); RemappedFiles.push_back(std::make_pair(UF.Filename, MB.release())); @@ -804,8 +791,10 @@ static void clang_codeCompleteAt_Impl(void *UserData) { } #endif #endif - CCAI->result = Results; + return Results; } + +extern "C" { CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, const char *complete_filename, unsigned complete_line, @@ -821,25 +810,28 @@ CXCodeCompleteResults *clang_codeCompleteAt(CXTranslationUnit TU, if (num_unsaved_files && !unsaved_files) return nullptr; - CodeCompleteAtInfo CCAI = {TU, complete_filename, complete_line, - complete_column, llvm::makeArrayRef(unsaved_files, num_unsaved_files), - options, nullptr}; + CXCodeCompleteResults *result; + auto CodeCompleteAtImpl = [=, &result]() { + result = clang_codeCompleteAt_Impl( + TU, complete_filename, complete_line, complete_column, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); + }; if (getenv("LIBCLANG_NOTHREADS")) { - clang_codeCompleteAt_Impl(&CCAI); - return CCAI.result; + CodeCompleteAtImpl(); + return result; } llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_codeCompleteAt_Impl, &CCAI)) { + if (!RunSafely(CRC, CodeCompleteAtImpl)) { fprintf(stderr, "libclang: crash detected in code completion\n"); cxtu::getASTUnit(TU)->setUnsafeToFree(true); return nullptr; } else if (getenv("LIBCLANG_RESOURCE_USAGE")) PrintLibclangResourceUsage(TU); - return CCAI.result; + return result; } unsigned clang_defaultCodeCompleteOptions(void) { diff --git a/tools/libclang/CIndexer.h b/tools/libclang/CIndexer.h index bf55301d618e..94c27a05600f 100644 --- a/tools/libclang/CIndexer.h +++ b/tools/libclang/CIndexer.h @@ -85,8 +85,8 @@ public: /// threads when possible. /// /// \return False if a crash was detected. - bool RunSafely(llvm::CrashRecoveryContext &CRC, - void (*Fn)(void*), void *UserData, unsigned Size = 0); + bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, + unsigned Size = 0); /// \brief Set the thread priority to background. /// FIXME: Move to llvm/Support. diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt index 06db70e61ad5..5267c02db5f4 100644 --- a/tools/libclang/CMakeLists.txt +++ b/tools/libclang/CMakeLists.txt @@ -102,21 +102,16 @@ if(ENABLE_SHARED) PROPERTIES VERSION ${LIBCLANG_LIBRARY_VERSION} DEFINE_SYMBOL _CINDEX_LIB_) + elseif(APPLE) + set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1") + set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}") + + set_property(TARGET libclang APPEND_STRING PROPERTY + LINK_FLAGS ${LIBCLANG_LINK_FLAGS}) else() set_target_properties(libclang PROPERTIES VERSION ${LIBCLANG_LIBRARY_VERSION} DEFINE_SYMBOL _CINDEX_LIB_) endif() - - if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1") - if (DEFINED ${LLVM_SUBMIT_VERSION}) - set(LIBCLANG_LINK_FLAGS - "${LIBCLANG_LINK_FLAGS} -Wl,-current_version -Wl,${LLVM_SUBMIT_VERSION}.${LLVM_SUBMIT_SUBVERSION}") - endif() - - set_property(TARGET libclang APPEND_STRING PROPERTY - LINK_FLAGS ${LIBCLANG_LINK_FLAGS}) - endif() endif() diff --git a/tools/libclang/CXCompilationDatabase.cpp b/tools/libclang/CXCompilationDatabase.cpp index 1e4a2cd44aab..82498bf54c74 100644 --- a/tools/libclang/CXCompilationDatabase.cpp +++ b/tools/libclang/CXCompilationDatabase.cpp @@ -111,6 +111,16 @@ clang_CompileCommand_getDirectory(CXCompileCommand CCmd) return cxstring::createRef(cmd->Directory.c_str()); } +CXString +clang_CompileCommand_getFilename(CXCompileCommand CCmd) +{ + if (!CCmd) + return cxstring::createNull(); + + CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); + return cxstring::createRef(cmd->Filename.c_str()); +} + unsigned clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) { diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index 099edcf14fed..c766d2d69fa9 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -58,6 +58,9 @@ static CXCursorKind GetCursorKind(const Attr *A) { case attr::CUDAGlobal: return CXCursor_CUDAGlobalAttr; case attr::CUDAHost: return CXCursor_CUDAHostAttr; case attr::CUDAShared: return CXCursor_CUDASharedAttr; + case attr::Visibility: return CXCursor_VisibilityAttr; + case attr::DLLExport: return CXCursor_DLLExport; + case attr::DLLImport: return CXCursor_DLLImport; } return CXCursor_UnexposedAttr; @@ -226,6 +229,10 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent, case Stmt::AtomicExprClass: case Stmt::BinaryConditionalOperatorClass: case Stmt::TypeTraitExprClass: + case Stmt::CoroutineBodyStmtClass: + case Stmt::CoawaitExprClass: + case Stmt::CoreturnStmtClass: + case Stmt::CoyieldExprClass: case Stmt::CXXBindTemporaryExprClass: case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDefaultInitExprClass: @@ -324,10 +331,15 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent, K = CXCursor_UnaryExpr; break; + case Stmt::MSPropertySubscriptExprClass: case Stmt::ArraySubscriptExprClass: K = CXCursor_ArraySubscriptExpr; break; + case Stmt::OMPArraySectionExprClass: + K = CXCursor_OMPArraySectionExpr; + break; + case Stmt::BinaryOperatorClass: K = CXCursor_BinaryOperator; break; @@ -585,6 +597,9 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent, case Stmt::OMPTargetDirectiveClass: K = CXCursor_OMPTargetDirective; break; + case Stmt::OMPTargetDataDirectiveClass: + K = CXCursor_OMPTargetDataDirective; + break; case Stmt::OMPTeamsDirectiveClass: K = CXCursor_OMPTeamsDirective; break; @@ -594,6 +609,15 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent, case Stmt::OMPCancelDirectiveClass: K = CXCursor_OMPCancelDirective; break; + case Stmt::OMPTaskLoopDirectiveClass: + K = CXCursor_OMPTaskLoopDirective; + break; + case Stmt::OMPTaskLoopSimdDirectiveClass: + K = CXCursor_OMPTaskLoopSimdDirective; + break; + case Stmt::OMPDistributeDirectiveClass: + K = CXCursor_OMPDistributeDirective; + break; } CXCursor C = { K, 0, { Parent, S, TU } }; diff --git a/tools/libclang/CXLoadedDiagnostic.cpp b/tools/libclang/CXLoadedDiagnostic.cpp index 754ad55a6604..2c10d34844b7 100644 --- a/tools/libclang/CXLoadedDiagnostic.cpp +++ b/tools/libclang/CXLoadedDiagnostic.cpp @@ -25,6 +25,7 @@ #include "llvm/Bitcode/BitstreamReader.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" + using namespace clang; //===----------------------------------------------------------------------===// @@ -56,7 +57,7 @@ public: return mem; } }; -} +} // end anonymous namespace //===----------------------------------------------------------------------===// // Cleanup. @@ -246,7 +247,7 @@ public: CXDiagnosticSet load(const char *file); }; -} +} // end anonymous namespace CXDiagnosticSet DiagLoader::load(const char *file) { TopDiags = llvm::make_unique<CXLoadedDiagnosticSetImpl>(); @@ -264,7 +265,7 @@ CXDiagnosticSet DiagLoader::load(const char *file) { reportInvalidFile(EC.message()); break; } - return 0; + return nullptr; } return (CXDiagnosticSet)TopDiags.release(); diff --git a/tools/libclang/CXString.cpp b/tools/libclang/CXString.cpp index dec8ebcd98e1..1ccbed3b5c24 100644 --- a/tools/libclang/CXString.cpp +++ b/tools/libclang/CXString.cpp @@ -112,6 +112,15 @@ CXString createCXString(CXStringBuf *buf) { return Str; } +CXStringSet *createSet(const std::vector<std::string> &Strings) { + CXStringSet *Set = new CXStringSet; + Set->Count = Strings.size(); + Set->Strings = new CXString[Set->Count]; + for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI) + Set->Strings[SI] = createDup(Strings[SI]); + return Set; +} + //===----------------------------------------------------------------------===// // String pools. @@ -175,5 +184,13 @@ void clang_disposeString(CXString string) { break; } } + +void clang_disposeStringSet(CXStringSet *set) { + for (unsigned SI = 0, SE = set->Count; SI < SE; ++SI) + clang_disposeString(set->Strings[SI]); + delete[] set->Strings; + delete set; +} + } // end: extern "C" diff --git a/tools/libclang/CXString.h b/tools/libclang/CXString.h index 72ac0cf46914..6473eb2d7103 100644 --- a/tools/libclang/CXString.h +++ b/tools/libclang/CXString.h @@ -68,6 +68,8 @@ CXString createRef(std::string String) = delete; /// \brief Create a CXString object that is backed by a string buffer. CXString createCXString(CXStringBuf *buf); +CXStringSet *createSet(const std::vector<std::string> &Strings); + /// \brief A string pool used for fast allocation/deallocation of strings. class CXStringPool { public: diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp index 1318e86b5553..72c12cd16b97 100644 --- a/tools/libclang/CXType.cpp +++ b/tools/libclang/CXType.cpp @@ -90,6 +90,7 @@ static CXTypeKind GetTypeKind(QualType T) { TKCASE(DependentSizedArray); TKCASE(Vector); TKCASE(MemberPointer); + TKCASE(Auto); default: return CXType_Unexposed; } @@ -101,6 +102,11 @@ CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) { CXTypeKind TK = CXType_Invalid; if (TU && !T.isNull()) { + // Handle attributed types as the original type + if (auto *ATT = T->getAs<AttributedType>()) { + return MakeCXType(ATT->getModifiedType(), TU); + } + ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext(); if (Ctx.getLangOpts().ObjC1) { QualType UnqualT = T.getUnqualifiedType(); @@ -139,7 +145,7 @@ extern "C" { CXType clang_getCursorType(CXCursor C) { using namespace cxcursor; - + CXTranslationUnit TU = cxcursor::getCursorTU(C); if (!TU) return MakeCXType(QualType(), TU); @@ -159,23 +165,17 @@ CXType clang_getCursorType(CXCursor C) { return MakeCXType(Context.getTypeDeclType(TD), TU); if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) return MakeCXType(Context.getObjCInterfaceType(ID), TU); - if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { - if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo()) - return MakeCXType(TSInfo->getType(), TU); - return MakeCXType(DD->getType(), TU); - } + if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) + return MakeCXType(DD->getType(), TU); if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) return MakeCXType(VD->getType(), TU); if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) return MakeCXType(PD->getType(), TU); - if (const FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D)) { - if (TypeSourceInfo *TSInfo = FTD->getTemplatedDecl()->getTypeSourceInfo()) - return MakeCXType(TSInfo->getType(), TU); + if (const FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D)) return MakeCXType(FTD->getTemplatedDecl()->getType(), TU); - } return MakeCXType(QualType(), TU); } - + if (clang_isReference(C.kind)) { switch (C.kind) { case CXCursor_ObjCSuperClassRef: { @@ -183,18 +183,18 @@ CXType clang_getCursorType(CXCursor C) { = Context.getObjCInterfaceType(getCursorObjCSuperClassRef(C).first); return MakeCXType(T, TU); } - + case CXCursor_ObjCClassRef: { QualType T = Context.getObjCInterfaceType(getCursorObjCClassRef(C).first); return MakeCXType(T, TU); } - + case CXCursor_TypeRef: { QualType T = Context.getTypeDeclType(getCursorTypeRef(C).first); return MakeCXType(T, TU); } - + case CXCursor_CXXBaseSpecifier: return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU); @@ -211,7 +211,7 @@ CXType clang_getCursorType(CXCursor C) { default: break; } - + return MakeCXType(QualType(), TU); } @@ -349,10 +349,10 @@ unsigned clang_isRestrictQualifiedType(CXType CT) { CXType clang_getPointeeType(CXType CT) { QualType T = GetQualType(CT); const Type *TP = T.getTypePtrOrNull(); - + if (!TP) return MakeCXType(QualType(), GetTU(CT)); - + switch (TP->getTypeClass()) { case Type::Pointer: T = cast<PointerType>(TP)->getPointeeType(); @@ -411,7 +411,7 @@ try_again: D = cast<TemplateSpecializationType>(TP)->getTemplateName() .getAsTemplateDecl(); break; - + case Type::InjectedClassName: D = cast<InjectedClassNameType>(TP)->getDecl(); break; @@ -421,7 +421,7 @@ try_again: case Type::Elaborated: TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull(); goto try_again; - + default: break; } @@ -484,6 +484,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) { TKIND(DependentSizedArray); TKIND(Vector); TKIND(MemberPointer); + TKIND(Auto); } #undef TKIND return cxstring::createRef(s); diff --git a/tools/libclang/CursorVisitor.h b/tools/libclang/CursorVisitor.h index 91f63b40f6a5..3e5b0c9120c5 100644 --- a/tools/libclang/CursorVisitor.h +++ b/tools/libclang/CursorVisitor.h @@ -195,6 +195,7 @@ public: bool VisitChildren(CXCursor Parent); // Declaration visitors + bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D); bool VisitTypeAliasDecl(TypeAliasDecl *D); bool VisitAttributes(Decl *D); bool VisitBlockDecl(BlockDecl *B); diff --git a/tools/libclang/IndexBody.cpp b/tools/libclang/IndexBody.cpp index 5539971f04a7..64df4b85beac 100644 --- a/tools/libclang/IndexBody.cpp +++ b/tools/libclang/IndexBody.cpp @@ -8,19 +8,19 @@ //===----------------------------------------------------------------------===// #include "IndexingContext.h" -#include "clang/AST/DataRecursiveASTVisitor.h" +#include "clang/AST/RecursiveASTVisitor.h" using namespace clang; using namespace cxindex; namespace { -class BodyIndexer : public DataRecursiveASTVisitor<BodyIndexer> { +class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> { IndexingContext &IndexCtx; const NamedDecl *Parent; const DeclContext *ParentDC; - typedef DataRecursiveASTVisitor<BodyIndexer> base; + typedef RecursiveASTVisitor<BodyIndexer> base; public: BodyIndexer(IndexingContext &indexCtx, const NamedDecl *Parent, const DeclContext *DC) @@ -125,10 +125,11 @@ public: return true; } - bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E) { + bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E, + DataRecursionQueue *Q = nullptr) { if (E->getOperatorLoc().isInvalid()) return true; // implicit. - return base::TraverseCXXOperatorCallExpr(E); + return base::TraverseCXXOperatorCallExpr(E, Q); } bool VisitDeclStmt(DeclStmt *S) { diff --git a/tools/libclang/IndexTypeSourceInfo.cpp b/tools/libclang/IndexTypeSourceInfo.cpp index 706870e514b8..9666052ed181 100644 --- a/tools/libclang/IndexTypeSourceInfo.cpp +++ b/tools/libclang/IndexTypeSourceInfo.cpp @@ -8,14 +8,14 @@ //===----------------------------------------------------------------------===// #include "IndexingContext.h" -#include "clang/AST/DataRecursiveASTVisitor.h" +#include "clang/AST/RecursiveASTVisitor.h" using namespace clang; using namespace cxindex; namespace { -class TypeIndexer : public DataRecursiveASTVisitor<TypeIndexer> { +class TypeIndexer : public RecursiveASTVisitor<TypeIndexer> { IndexingContext &IndexCtx; const NamedDecl *Parent; const DeclContext *ParentDC; diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index e35640029e62..d6e35b0019c9 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -462,48 +462,24 @@ struct IndexSessionData { : CIdx(cIdx), SkipBodyData(new SessionSkipBodyData) {} }; -struct IndexSourceFileInfo { - CXIndexAction idxAction; - CXClientData client_data; - IndexerCallbacks *index_callbacks; - unsigned index_callbacks_size; - unsigned index_options; - const char *source_filename; - const char *const *command_line_args; - int num_command_line_args; - ArrayRef<CXUnsavedFile> unsaved_files; - CXTranslationUnit *out_TU; - unsigned TU_options; - CXErrorCode &result; -}; - } // anonymous namespace -static void clang_indexSourceFile_Impl(void *UserData) { - const IndexSourceFileInfo *ITUI = - static_cast<IndexSourceFileInfo *>(UserData); - CXIndexAction cxIdxAction = ITUI->idxAction; - CXClientData client_data = ITUI->client_data; - IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks; - unsigned index_callbacks_size = ITUI->index_callbacks_size; - unsigned index_options = ITUI->index_options; - const char *source_filename = ITUI->source_filename; - const char * const *command_line_args = ITUI->command_line_args; - int num_command_line_args = ITUI->num_command_line_args; - CXTranslationUnit *out_TU = ITUI->out_TU; - unsigned TU_options = ITUI->TU_options; - +static CXErrorCode clang_indexSourceFile_Impl( + CXIndexAction cxIdxAction, CXClientData client_data, + IndexerCallbacks *client_index_callbacks, unsigned index_callbacks_size, + unsigned index_options, const char *source_filename, + const char *const *command_line_args, int num_command_line_args, + ArrayRef<CXUnsavedFile> unsaved_files, CXTranslationUnit *out_TU, + unsigned TU_options) { if (out_TU) *out_TU = nullptr; bool requestedToGetTU = (out_TU != nullptr); if (!cxIdxAction) { - ITUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } if (!client_index_callbacks || index_callbacks_size == 0) { - ITUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } IndexerCallbacks CB; @@ -557,7 +533,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { CInvok(createInvocationFromCommandLine(*Args, Diags)); if (!CInvok) - return; + return CXError_Failure; // Recover resources if we crash before exiting this function. llvm::CrashRecoveryContextCleanupRegistrar<CompilerInvocation, @@ -565,7 +541,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { CInvokCleanup(CInvok.get()); if (CInvok->getFrontendOpts().Inputs.empty()) - return; + return CXError_Failure; typedef SmallVector<std::unique_ptr<llvm::MemoryBuffer>, 8> MemBufferOwner; std::unique_ptr<MemBufferOwner> BufOwner(new MemBufferOwner); @@ -574,7 +550,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { llvm::CrashRecoveryContextCleanupRegistrar<MemBufferOwner> BufOwnerCleanup( BufOwner.get()); - for (auto &UF : ITUI->unsaved_files) { + for (auto &UF : unsaved_files) { std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); CInvok->getPreprocessorOpts().addRemappedFile(UF.Filename, MB.get()); @@ -590,12 +566,14 @@ static void clang_indexSourceFile_Impl(void *UserData) { if (index_options & CXIndexOpt_SuppressWarnings) CInvok->getDiagnosticOpts().IgnoreWarnings = true; + // Make sure to use the raw module format. + CInvok->getHeaderSearchOpts().ModuleFormat = + CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(); + ASTUnit *Unit = ASTUnit::create(CInvok.get(), Diags, CaptureDiagnostics, /*UserFilesAreVolatile=*/true); - if (!Unit) { - ITUI->result = CXError_InvalidArguments; - return; - } + if (!Unit) + return CXError_InvalidArguments; std::unique_ptr<CXTUOwner> CXTU( new CXTUOwner(MakeCXTranslationUnit(CXXIdx, Unit))); @@ -623,6 +601,7 @@ static void clang_indexSourceFile_Impl(void *UserData) { bool Persistent = requestedToGetTU; bool OnlyLocalDecls = false; bool PrecompilePreamble = false; + bool CreatePreambleOnFirstParse = false; bool CacheCodeCompletionResults = false; PreprocessorOptions &PPOpts = CInvok->getPreprocessorOpts(); PPOpts.AllowPCHWithCompilerErrors = true; @@ -630,6 +609,8 @@ static void clang_indexSourceFile_Impl(void *UserData) { if (requestedToGetTU) { OnlyLocalDecls = CXXIdx->getOnlyLocalDecls(); PrecompilePreamble = TU_options & CXTranslationUnit_PrecompiledPreamble; + CreatePreambleOnFirstParse = + TU_options & CXTranslationUnit_CreatePreambleOnFirstParse; // FIXME: Add a flag for modules. CacheCodeCompletionResults = TU_options & CXTranslationUnit_CacheCompletionResults; @@ -642,49 +623,38 @@ static void clang_indexSourceFile_Impl(void *UserData) { if (!requestedToGetTU && !CInvok->getLangOpts()->Modules) PPOpts.DetailedRecord = false; + // Unless the user specified that they want the preamble on the first parse + // set it up to be created on the first reparse. This makes the first parse + // faster, trading for a slower (first) reparse. + unsigned PrecompilePreambleAfterNParses = + !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse; DiagnosticErrorTrap DiagTrap(*Diags); bool Success = ASTUnit::LoadFromCompilerInvocationAction( CInvok.get(), CXXIdx->getPCHContainerOperations(), Diags, IndexAction.get(), Unit, Persistent, CXXIdx->getClangResourcesPath(), - OnlyLocalDecls, CaptureDiagnostics, PrecompilePreamble, + OnlyLocalDecls, CaptureDiagnostics, PrecompilePreambleAfterNParses, CacheCodeCompletionResults, /*IncludeBriefCommentsInCodeCompletion=*/false, /*UserFilesAreVolatile=*/true); if (DiagTrap.hasErrorOccurred() && CXXIdx->getDisplayDiagnostics()) printDiagsToStderr(Unit); - if (isASTReadError(Unit)) { - ITUI->result = CXError_ASTReadError; - return; - } + if (isASTReadError(Unit)) + return CXError_ASTReadError; if (!Success) - return; + return CXError_Failure; if (out_TU) *out_TU = CXTU->takeTU(); - ITUI->result = CXError_Success; + return CXError_Success; } //===----------------------------------------------------------------------===// // clang_indexTranslationUnit Implementation //===----------------------------------------------------------------------===// -namespace { - -struct IndexTranslationUnitInfo { - CXIndexAction idxAction; - CXClientData client_data; - IndexerCallbacks *index_callbacks; - unsigned index_callbacks_size; - unsigned index_options; - CXTranslationUnit TU; - int result; -}; - -} // anonymous namespace - static void indexPreprocessingRecord(ASTUnit &Unit, IndexingContext &IdxCtx) { Preprocessor &PP = Unit.getPreprocessor(); if (!PP.getPreprocessingRecord()) @@ -711,9 +681,7 @@ static void indexPreprocessingRecord(ASTUnit &Unit, IndexingContext &IdxCtx) { static bool topLevelDeclVisitor(void *context, const Decl *D) { IndexingContext &IdxCtx = *static_cast<IndexingContext*>(context); IdxCtx.indexTopLevelDecl(D); - if (IdxCtx.shouldAbort()) - return false; - return true; + return !IdxCtx.shouldAbort(); } static void indexTranslationUnit(ASTUnit &Unit, IndexingContext &IdxCtx) { @@ -728,27 +696,17 @@ static void indexDiagnostics(CXTranslationUnit TU, IndexingContext &IdxCtx) { IdxCtx.handleDiagnosticSet(DiagSet); } -static void clang_indexTranslationUnit_Impl(void *UserData) { - IndexTranslationUnitInfo *ITUI = - static_cast<IndexTranslationUnitInfo*>(UserData); - CXTranslationUnit TU = ITUI->TU; - CXClientData client_data = ITUI->client_data; - IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks; - unsigned index_callbacks_size = ITUI->index_callbacks_size; - unsigned index_options = ITUI->index_options; - - // Set up the initial return value. - ITUI->result = CXError_Failure; - +static CXErrorCode clang_indexTranslationUnit_Impl( + CXIndexAction idxAction, CXClientData client_data, + IndexerCallbacks *client_index_callbacks, unsigned index_callbacks_size, + unsigned index_options, CXTranslationUnit TU) { // Check arguments. if (isNotUsableTU(TU)) { LOG_BAD_TU(TU); - ITUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } if (!client_index_callbacks || index_callbacks_size == 0) { - ITUI->result = CXError_InvalidArguments; - return; + return CXError_InvalidArguments; } CIndexer *CXXIdx = TU->CIdx; @@ -777,7 +735,7 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { ASTUnit *Unit = cxtu::getASTUnit(TU); if (!Unit) - return; + return CXError_Failure; ASTUnit::ConcurrencyCheck Check(*Unit); @@ -797,7 +755,7 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { indexTranslationUnit(*Unit, *IndexCtx); indexDiagnostics(TU, *IndexCtx); - ITUI->result = CXError_Success; + return CXError_Success; } //===----------------------------------------------------------------------===// @@ -959,6 +917,22 @@ int clang_indexSourceFile(CXIndexAction idxAction, unsigned num_unsaved_files, CXTranslationUnit *out_TU, unsigned TU_options) { + SmallVector<const char *, 4> Args; + Args.push_back("clang"); + Args.append(command_line_args, command_line_args + num_command_line_args); + return clang_indexSourceFileFullArgv( + idxAction, client_data, index_callbacks, index_callbacks_size, + index_options, source_filename, Args.data(), Args.size(), unsaved_files, + num_unsaved_files, out_TU, TU_options); +} + +int clang_indexSourceFileFullArgv( + CXIndexAction idxAction, CXClientData client_data, + IndexerCallbacks *index_callbacks, unsigned index_callbacks_size, + unsigned index_options, const char *source_filename, + const char *const *command_line_args, int num_command_line_args, + struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, + CXTranslationUnit *out_TU, unsigned TU_options) { LOG_FUNC_SECTION { *Log << source_filename << ": "; for (int i = 0; i != num_command_line_args; ++i) @@ -969,28 +943,23 @@ int clang_indexSourceFile(CXIndexAction idxAction, return CXError_InvalidArguments; CXErrorCode result = CXError_Failure; - IndexSourceFileInfo ITUI = { - idxAction, - client_data, - index_callbacks, - index_callbacks_size, - index_options, - source_filename, - command_line_args, - num_command_line_args, - llvm::makeArrayRef(unsaved_files, num_unsaved_files), - out_TU, - TU_options, - result}; + auto IndexSourceFileImpl = [=, &result]() { + result = clang_indexSourceFile_Impl( + idxAction, client_data, index_callbacks, index_callbacks_size, + index_options, source_filename, command_line_args, + num_command_line_args, + llvm::makeArrayRef(unsaved_files, num_unsaved_files), out_TU, + TU_options); + }; if (getenv("LIBCLANG_NOTHREADS")) { - clang_indexSourceFile_Impl(&ITUI); + IndexSourceFileImpl(); return result; } llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_indexSourceFile_Impl, &ITUI)) { + if (!RunSafely(CRC, IndexSourceFileImpl)) { fprintf(stderr, "libclang: crash detected during indexing source file: {\n"); fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); fprintf(stderr, " 'command_line_args' : ["); @@ -1030,24 +999,27 @@ int clang_indexTranslationUnit(CXIndexAction idxAction, *Log << TU; } - IndexTranslationUnitInfo ITUI = { idxAction, client_data, index_callbacks, - index_callbacks_size, index_options, TU, - 0 }; + CXErrorCode result; + auto IndexTranslationUnitImpl = [=, &result]() { + result = clang_indexTranslationUnit_Impl( + idxAction, client_data, index_callbacks, index_callbacks_size, + index_options, TU); + }; if (getenv("LIBCLANG_NOTHREADS")) { - clang_indexTranslationUnit_Impl(&ITUI); - return ITUI.result; + IndexTranslationUnitImpl(); + return result; } llvm::CrashRecoveryContext CRC; - if (!RunSafely(CRC, clang_indexTranslationUnit_Impl, &ITUI)) { + if (!RunSafely(CRC, IndexTranslationUnitImpl)) { fprintf(stderr, "libclang: crash detected during indexing TU\n"); return 1; } - return ITUI.result; + return result; } void clang_indexLoc_getFileLocation(CXIdxLoc location, diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index bf6e172fc074..f7640c63e05c 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -804,10 +804,7 @@ bool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D, RefFileOccurrence RefOccur(FE, D); std::pair<llvm::DenseSet<RefFileOccurrence>::iterator, bool> res = RefFileOccurrences.insert(RefOccur); - if (!res.second) - return true; // already in map. - - return false; + return !res.second; // already in map } const NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index f6a7175579aa..993644d02fc1 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -2,6 +2,7 @@ clang_CXCursorSet_contains clang_CXCursorSet_insert clang_CXIndex_getGlobalOptions clang_CXIndex_setGlobalOptions +clang_CXXField_isMutable clang_CXXMethod_isConst clang_CXXMethod_isPureVirtual clang_CXXMethod_isStatic @@ -14,6 +15,7 @@ clang_Cursor_getTemplateArgumentValue clang_Cursor_getTemplateArgumentUnsignedValue clang_Cursor_getBriefCommentText clang_Cursor_getCommentRange +clang_Cursor_getCXXManglings clang_Cursor_getMangling clang_Cursor_getParsedComment clang_Cursor_getRawCommentText @@ -119,6 +121,7 @@ clang_disposeOverriddenCursors clang_disposeCXPlatformAvailability clang_disposeSourceRangeList clang_disposeString +clang_disposeStringSet clang_disposeTokens clang_disposeTranslationUnit clang_enableStackTraces @@ -173,6 +176,7 @@ clang_getCursorSemanticParent clang_getCursorSpelling clang_getCursorType clang_getCursorUSR +clang_getCursorVisibility clang_getDeclObjCTypeEncoding clang_getDefinitionSpellingAndExtent clang_getDiagnostic @@ -246,6 +250,7 @@ clang_hashCursor clang_indexLoc_getCXSourceLocation clang_indexLoc_getFileLocation clang_indexSourceFile +clang_indexSourceFileFullArgv clang_indexTranslationUnit clang_index_getCXXClassDeclInfo clang_index_getClientContainer @@ -281,6 +286,7 @@ clang_Location_isInSystemHeader clang_Location_isFromMainFile clang_parseTranslationUnit clang_parseTranslationUnit2 +clang_parseTranslationUnit2FullArgv clang_remap_dispose clang_remap_getFilenames clang_remap_getNumFiles @@ -297,6 +303,9 @@ clang_CompileCommands_dispose clang_CompileCommands_getSize clang_CompileCommands_getCommand clang_CompileCommand_getDirectory +clang_CompileCommand_getFilename +clang_CompileCommand_getMappedSourceContent +clang_CompileCommand_getMappedSourcePath clang_CompileCommand_getNumArgs clang_CompileCommand_getArg clang_visitChildren |
