diff options
Diffstat (limited to 'tools/libclang/CIndex.cpp')
-rw-r--r-- | tools/libclang/CIndex.cpp | 125 |
1 files changed, 96 insertions, 29 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 00ef8c0..05287bd 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -240,9 +240,8 @@ static bool visitPreprocessedEntitiesInRange(SourceRange R, FID = FileID(); } - std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator> - Entities = PPRec.getPreprocessedEntitiesInRange(R); - return Visitor.visitPreprocessedEntities(Entities.first, Entities.second, + const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R); + return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(), PPRec, FID); } @@ -455,14 +454,14 @@ bool CursorVisitor::visitPreprocessedEntities(InputIterator First, if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) { if (Visit(MakeMacroExpansionCursor(ME, TU))) return true; - + continue; } - - if (MacroDefinition *MD = dyn_cast<MacroDefinition>(PPE)) { + + if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) { if (Visit(MakeMacroDefinitionCursor(MD, TU))) return true; - + continue; } @@ -569,8 +568,8 @@ bool CursorVisitor::VisitChildren(CXCursor Cursor) { SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc); const MacroInfo *MI = getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU); - if (MacroDefinition *MacroDef = - checkForMacroInMacroDefinition(MI, Loc, TU)) + if (MacroDefinitionRecord *MacroDef = + checkForMacroInMacroDefinition(MI, Loc, TU)) return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU)); } @@ -1719,7 +1718,7 @@ public: return VJ->getKind() == DeclVisitKind; } const Decl *get() const { return static_cast<const Decl *>(data[0]); } - bool isFirst() const { return data[1] ? true : false; } + bool isFirst() const { return data[1] != nullptr; } }; class TypeLocVisit : public VisitorJob { public: @@ -1983,6 +1982,7 @@ void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) { } void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) { Visitor->AddStmt(C->getChunkSize()); + Visitor->AddStmt(C->getHelperChunkSize()); } void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *) {} @@ -2023,16 +2023,47 @@ void OMPClauseEnqueue::VisitOMPFirstprivateClause( void OMPClauseEnqueue::VisitOMPLastprivateClause( const OMPLastprivateClause *C) { VisitOMPClauseList(C); + for (auto *E : C->private_copies()) { + Visitor->AddStmt(E); + } + for (auto *E : C->source_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->destination_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->assignment_ops()) { + Visitor->AddStmt(E); + } } void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { VisitOMPClauseList(C); } void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { VisitOMPClauseList(C); + for (auto *E : C->lhs_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->rhs_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->reduction_ops()) { + Visitor->AddStmt(E); + } } void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { VisitOMPClauseList(C); + for (const auto *E : C->inits()) { + Visitor->AddStmt(E); + } + for (const auto *E : C->updates()) { + Visitor->AddStmt(E); + } + for (const auto *E : C->finals()) { + Visitor->AddStmt(E); + } Visitor->AddStmt(C->getStep()); + Visitor->AddStmt(C->getCalcStep()); } void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) { VisitOMPClauseList(C); @@ -2040,10 +2071,28 @@ void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) { } void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) { VisitOMPClauseList(C); + for (auto *E : C->source_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->destination_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->assignment_ops()) { + Visitor->AddStmt(E); + } } void OMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) { VisitOMPClauseList(C); + for (auto *E : C->source_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->destination_exprs()) { + Visitor->AddStmt(E); + } + for (auto *E : C->assignment_ops()) { + Visitor->AddStmt(E); + } } void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) { VisitOMPClauseList(C); @@ -2239,8 +2288,21 @@ void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) { // visit it. // FIXME: If we ever want to show these implicit accesses, this will be // unfortunate. However, clang_getCursor() relies on this behavior. - if (!M->isImplicitAccess()) - AddStmt(M->getBase()); + if (M->isImplicitAccess()) + return; + + // Ignore base anonymous struct/union fields, otherwise they will shadow the + // real field that that we are interested in. + if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) { + if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) { + if (FD->isAnonymousStructOrUnion()) { + AddStmt(SubME->getBase()); + return; + } + } + } + + AddStmt(M->getBase()); } void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { AddTypeLoc(E->getEncodedTypeSourceInfo()); @@ -4208,6 +4270,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("OMPTargetDirective"); case CXCursor_OMPTeamsDirective: return cxstring::createRef("OMPTeamsDirective"); + case CXCursor_OverloadCandidate: + return cxstring::createRef("OverloadCandidate"); } llvm_unreachable("Unhandled CXCursorKind"); @@ -4824,9 +4888,10 @@ CXCursor clang_getCursorReferenced(CXCursor C) { return clang_getNullCursor(); } - + if (C.kind == CXCursor_MacroExpansion) { - if (const MacroDefinition *Def = getCursorMacroExpansion(C).getDefinition()) + if (const MacroDefinitionRecord *Def = + getCursorMacroExpansion(C).getDefinition()) return MakeMacroDefinitionCursor(Def, tu); } @@ -4950,6 +5015,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { // nonetheless harmless. case Decl::Empty: case Decl::TranslationUnit: + case Decl::ExternCContext: break; // Declaration kinds for which the definition is not resolvable. @@ -6000,11 +6066,12 @@ static void annotatePreprocessorTokens(CXTranslationUnit TU, if (MI) { SourceLocation SaveLoc = Tok.getLocation(); Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc)); - MacroDefinition *MacroDef = checkForMacroInMacroDefinition(MI,Tok,TU); + MacroDefinitionRecord *MacroDef = + checkForMacroInMacroDefinition(MI, Tok, TU); Tok.setLocation(SaveLoc); if (MacroDef) - Cursors[NextIdx-1] = MakeMacroExpansionCursor(MacroDef, - Tok.getLocation(), TU); + Cursors[NextIdx - 1] = + MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU); } } while (!Tok.isAtStartOfLine()); @@ -6943,7 +7010,7 @@ CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { CXTUResourceUsage usage = { (void*) entries.get(), (unsigned) entries->size(), - entries->size() ? &(*entries)[0] : nullptr }; + !entries->empty() ? &(*entries)[0] : nullptr }; entries.release(); return usage; } @@ -7080,7 +7147,7 @@ MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II, ASTUnit *Unit = cxtu::getASTUnit(TU); Preprocessor &PP = Unit->getPreprocessor(); - MacroDirective *MD = PP.getMacroDirectiveHistory(&II); + MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II); if (MD) { for (MacroDirective::DefInfo Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) { @@ -7092,7 +7159,7 @@ MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II, return nullptr; } -const MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef, +const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef, CXTranslationUnit TU) { if (!MacroDef || !TU) return nullptr; @@ -7103,9 +7170,9 @@ const MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef, return getMacroInfo(*II, MacroDef->getLocation(), TU); } -MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, - const Token &Tok, - CXTranslationUnit TU) { +MacroDefinitionRecord * +cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok, + CXTranslationUnit TU) { if (!MI || !TU) return nullptr; if (Tok.isNot(tok::raw_identifier)) @@ -7137,16 +7204,16 @@ MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end()) return nullptr; - MacroDirective *InnerMD = PP.getMacroDirectiveHistory(&II); + MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II); if (!InnerMD) return nullptr; return PPRec->findMacroDefinition(InnerMD->getMacroInfo()); } -MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, - SourceLocation Loc, - CXTranslationUnit TU) { +MacroDefinitionRecord * +cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc, + CXTranslationUnit TU) { if (Loc.isInvalid() || !MI || !TU) return nullptr; @@ -7266,10 +7333,10 @@ cxindex::Logger::~Logger() { llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime(); OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime()); - OS << Msg.str() << '\n'; + OS << Msg << '\n'; if (Trace) { - llvm::sys::PrintStackTrace(stderr); + llvm::sys::PrintStackTrace(OS); OS << "--------------------------------------------------\n"; } } |