Hi Richard, This commit crashes the preprocessing record (and in general PPCallbacks clients). To reproduce the crash try this change:
diff --git a/test/Modules/macros.c b/test/Modules/macros.c index 0761669..d2dc326 100644 --- a/test/Modules/macros.c +++ b/test/Modules/macros.c @@ -1,5 +1,5 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s +// RUN: %clang_cc1 -fmodules -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record // RUN: %clang_cc1 -fmodules -DLOCAL_VISIBILITY -fmodules-local-submodule-visibility -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s // RUN: not %clang_cc1 -E -fmodules -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix CHECK-PREPROCESSED %s // FIXME: When we have a syntax for modules in C, use that. Could you take a look ? > On Apr 29, 2015, at 4:20 PM, Richard Smith <[email protected]> wrote: > > Author: rsmith > Date: Wed Apr 29 18:20:19 2015 > New Revision: 236176 > > URL: http://llvm.org/viewvc/llvm-project?rev=236176&view=rev > Log: > [modules] Stop trying to fake up a linear MacroDirective history. > > Modules builds fundamentally have a non-linear macro history. In the interest > of better source fidelity, represent the macro definition information > faithfully: we have a linear macro directive history within each module, and > at > any point we have a unique "latest" local macro directive and a collection of > visible imported directives. This also removes the attendent complexity of > attempting to create a correct MacroDirective history (which we got wrong > in the general case). > > No functionality change intended. > > Modified: > cfe/trunk/include/clang/AST/NSAPI.h > cfe/trunk/include/clang/Basic/IdentifierTable.h > cfe/trunk/include/clang/Lex/HeaderSearch.h > cfe/trunk/include/clang/Lex/Preprocessor.h > cfe/trunk/include/clang/Serialization/ASTReader.h > cfe/trunk/lib/ARCMigrate/ObjCMT.cpp > cfe/trunk/lib/ARCMigrate/TransAPIUses.cpp > cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp > cfe/trunk/lib/ARCMigrate/TransUnusedInitDelegate.cpp > cfe/trunk/lib/ARCMigrate/Transforms.cpp > cfe/trunk/lib/ARCMigrate/Transforms.h > cfe/trunk/lib/AST/NSAPI.cpp > cfe/trunk/lib/Frontend/CompilerInstance.cpp > cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp > cfe/trunk/lib/Lex/HeaderSearch.cpp > cfe/trunk/lib/Lex/MacroArgs.cpp > cfe/trunk/lib/Lex/PPDirectives.cpp > cfe/trunk/lib/Lex/PPExpressions.cpp > cfe/trunk/lib/Lex/PPLexerChange.cpp > cfe/trunk/lib/Lex/PPMacroExpansion.cpp > cfe/trunk/lib/Lex/Pragma.cpp > cfe/trunk/lib/Lex/Preprocessor.cpp > cfe/trunk/lib/Sema/SemaCodeComplete.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/lib/Sema/SemaFixItUtils.cpp > cfe/trunk/lib/Serialization/ASTReader.cpp > cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > cfe/trunk/lib/Serialization/ASTWriter.cpp > cfe/trunk/test/Index/complete-macros.c > cfe/trunk/test/Modules/macros.c > cfe/trunk/tools/libclang/CIndex.cpp > > Modified: cfe/trunk/include/clang/AST/NSAPI.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/NSAPI.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/include/clang/AST/NSAPI.h (original) > +++ cfe/trunk/include/clang/AST/NSAPI.h Wed Apr 29 18:20:19 2015 > @@ -216,6 +216,9 @@ public: > /// of that name in objective-c. > StringRef GetNSIntegralKind(QualType T) const; > > + /// \brief Returns \c true if \p Id is currently defined as a macro. > + bool isMacroDefined(StringRef Id) const; > + > private: > bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const; > bool isObjCEnumerator(const Expr *E, > > Modified: cfe/trunk/include/clang/Basic/IdentifierTable.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/IdentifierTable.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/IdentifierTable.h (original) > +++ cfe/trunk/include/clang/Basic/IdentifierTable.h Wed Apr 29 18:20:19 2015 > @@ -124,6 +124,7 @@ public: > } > > /// \brief Return true if this identifier is \#defined to some other value. > + /// \note The current definition may be in a module and not currently > visible. > bool hasMacroDefinition() const { > return HasMacro; > } > > Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original) > +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Wed Apr 29 18:20:19 2015 > @@ -32,6 +32,7 @@ class FileEntry; > class FileManager; > class HeaderSearchOptions; > class IdentifierInfo; > +class Preprocessor; > > /// \brief The preprocessor keeps track of this information for each > /// file that is \#included. > @@ -419,8 +420,8 @@ public: > /// > /// \return false if \#including the file will have no effect or true > /// if we should include it. > - bool ShouldEnterIncludeFile(const FileEntry *File, bool isImport); > - > + bool ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File, > + bool isImport); > > /// \brief Return whether the specified file is a normal header, > /// a system header, or a C++ friendly system header. > > Modified: cfe/trunk/include/clang/Lex/Preprocessor.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Lex/Preprocessor.h (original) > +++ cfe/trunk/include/clang/Lex/Preprocessor.h Wed Apr 29 18:20:19 2015 > @@ -386,7 +386,8 @@ class Preprocessor : public RefCountedBa > class MacroState { > mutable llvm::PointerUnion<MacroDirective *, ModuleMacroInfo *> State; > > - ModuleMacroInfo *getModuleInfo(Preprocessor &PP, IdentifierInfo *II) > const { > + ModuleMacroInfo *getModuleInfo(Preprocessor &PP, > + const IdentifierInfo *II) const { > // FIXME: Find a spare bit on IdentifierInfo and store a > // HasModuleMacros flag. > if (!II->hasMacroDefinition() || !PP.getLangOpts().Modules || > @@ -434,12 +435,12 @@ class Preprocessor : public RefCountedBa > State = MD; > } > > - bool isAmbiguous(Preprocessor &PP, IdentifierInfo *II) const { > + bool isAmbiguous(Preprocessor &PP, const IdentifierInfo *II) const { > auto *Info = getModuleInfo(PP, II); > return Info ? Info->IsAmbiguous : false; > } > - ArrayRef<ModuleMacro *> getActiveModuleMacros(Preprocessor &PP, > - IdentifierInfo *II) const { > + ArrayRef<ModuleMacro *> > + getActiveModuleMacros(Preprocessor &PP, const IdentifierInfo *II) const { > if (auto *Info = getModuleInfo(PP, II)) > return Info->ActiveModuleMacros; > return None; > @@ -755,33 +756,119 @@ public: > } > /// \} > > - /// \brief Given an identifier, return its latest MacroDirective if it is > - /// \#defined or null if it isn't \#define'd. > - MacroDirective *getMacroDirective(IdentifierInfo *II) const { > + /// \brief A description of the current definition of a macro. > + class MacroDefinition { > + llvm::PointerIntPair<DefMacroDirective*, 1, bool> > LatestLocalAndAmbiguous; > + ArrayRef<ModuleMacro*> ModuleMacros; > + public: > + MacroDefinition() : LatestLocalAndAmbiguous(), ModuleMacros() {} > + MacroDefinition(DefMacroDirective *MD, ArrayRef<ModuleMacro *> MMs, > + bool IsAmbiguous) > + : LatestLocalAndAmbiguous(MD, IsAmbiguous), ModuleMacros(MMs) {} > + > + /// \brief Determine whether there is a definition of this macro. > + explicit operator bool() const { > + return getLocalDirective() || !ModuleMacros.empty(); > + } > + > + /// \brief Get the MacroInfo that should be used for this definition. > + MacroInfo *getMacroInfo() const { > + if (!ModuleMacros.empty()) > + return ModuleMacros.back()->getMacroInfo(); > + if (auto *MD = getLocalDirective()) > + return MD->getMacroInfo(); > + return nullptr; > + } > + > + /// \brief \c true if the definition is ambiguous, \c false otherwise. > + bool isAmbiguous() const { return LatestLocalAndAmbiguous.getInt(); } > + > + /// \brief Get the latest non-imported, non-\#undef'd macro definition > + /// for this macro. > + DefMacroDirective *getLocalDirective() const { > + return LatestLocalAndAmbiguous.getPointer(); > + } > + > + /// \brief Get the active module macros for this macro. > + ArrayRef<ModuleMacro *> getModuleMacros() const { > + return ModuleMacros; > + } > + > + template<typename Fn> void forAllDefinitions(Fn F) const { > + if (auto *MD = getLocalDirective()) > + F(MD->getMacroInfo()); > + for (auto *MM : getModuleMacros()) > + F(MM->getMacroInfo()); > + } > + }; > + > + bool isMacroDefined(StringRef Id) { > + return isMacroDefined(&Identifiers.get(Id)); > + } > + bool isMacroDefined(const IdentifierInfo *II) { > + return II->hasMacroDefinition() && > + (!getLangOpts().Modules || (bool)getMacroDefinition(II)); > + } > + > + MacroDefinition getMacroDefinition(const IdentifierInfo *II) { > if (!II->hasMacroDefinition()) > + return MacroDefinition(); > + > + MacroState &S = Macros[II]; > + auto *MD = S.getLatest(); > + while (MD && isa<VisibilityMacroDirective>(MD)) > + MD = MD->getPrevious(); > + return MacroDefinition(dyn_cast_or_null<DefMacroDirective>(MD), > + S.getActiveModuleMacros(*this, II), > + S.isAmbiguous(*this, II)); > + } > + > + MacroDefinition getMacroDefinitionAtLoc(const IdentifierInfo *II, > + SourceLocation Loc) { > + if (!II->hadMacroDefinition()) > + return MacroDefinition(); > + > + MacroState &S = Macros[II]; > + MacroDirective::DefInfo DI; > + if (auto *MD = S.getLatest()) > + DI = MD->findDirectiveAtLoc(Loc, getSourceManager()); > + // FIXME: Compute the set of active module macros at the specified > location. > + return MacroDefinition(DI.getDirective(), > + S.getActiveModuleMacros(*this, II), > + S.isAmbiguous(*this, II)); > + } > + > + /// \brief Given an identifier, return its latest non-imported > MacroDirective > + /// if it is \#define'd and not \#undef'd, or null if it isn't \#define'd. > + MacroDirective *getLocalMacroDirective(const IdentifierInfo *II) const { > + if (!II->hasMacroDefinition()) > + return nullptr; > + > + auto *MD = getLocalMacroDirectiveHistory(II); > + if (!MD || MD->getDefinition().isUndefined()) > return nullptr; > > - MacroDirective *MD = getMacroDirectiveHistory(II); > - assert(MD->isDefined() && "Macro is undefined!"); > return MD; > } > > - const MacroInfo *getMacroInfo(IdentifierInfo *II) const { > + const MacroInfo *getMacroInfo(const IdentifierInfo *II) const { > return const_cast<Preprocessor*>(this)->getMacroInfo(II); > } > > - MacroInfo *getMacroInfo(IdentifierInfo *II) { > - if (MacroDirective *MD = getMacroDirective(II)) > - return MD->getMacroInfo(); > + MacroInfo *getMacroInfo(const IdentifierInfo *II) { > + if (!II->hasMacroDefinition()) > + return nullptr; > + if (auto MD = getMacroDefinition(II)) > + return MD.getMacroInfo(); > return nullptr; > } > > - /// \brief Given an identifier, return the (probably #undef'd) MacroInfo > - /// representing the most recent macro definition. > + /// \brief Given an identifier, return the latest non-imported macro > + /// directive for that identifier. > /// > - /// One can iterate over all previous macro definitions from the most > recent > - /// one. This should only be called for identifiers that > hadMacroDefinition(). > - MacroDirective *getMacroDirectiveHistory(const IdentifierInfo *II) const; > + /// One can iterate over all previous macro directives from the most recent > + /// one. > + MacroDirective *getLocalMacroDirectiveHistory(const IdentifierInfo *II) > const; > > /// \brief Add a directive to the macro directive history for this > identifier. > void appendMacroDirective(IdentifierInfo *II, MacroDirective *MD); > @@ -1580,7 +1667,7 @@ private: > > /// Update the set of active module macros and ambiguity flag for a module > /// macro name. > - void updateModuleMacroInfo(IdentifierInfo *II, ModuleMacroInfo &Info); > + void updateModuleMacroInfo(const IdentifierInfo *II, ModuleMacroInfo > &Info); > > /// \brief Allocate a new MacroInfo object. > MacroInfo *AllocateMacroInfo(); > @@ -1644,7 +1731,7 @@ private: > /// If an identifier token is read that is to be expanded as a macro, handle > /// it and return the next token as 'Tok'. If we lexed a token, return > true; > /// otherwise the caller should lex again. > - bool HandleMacroExpandedIdentifier(Token &Tok, MacroDirective *MD); > + bool HandleMacroExpandedIdentifier(Token &Tok, const MacroDefinition &MD); > > /// \brief Cache macro expanded tokens for TokenLexers. > // > > Modified: cfe/trunk/include/clang/Serialization/ASTReader.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Serialization/ASTReader.h (original) > +++ cfe/trunk/include/clang/Serialization/ASTReader.h Wed Apr 29 18:20:19 2015 > @@ -576,54 +576,8 @@ private: > /// global submodule ID to produce a local ID. > GlobalSubmoduleMapType GlobalSubmoduleMap; > > - /// \brief Information on a macro definition or undefinition that is > visible > - /// at the end of a submodule. > - struct ModuleMacroInfo; > - > - /// \brief An entity that has been hidden. > - class HiddenName { > - public: > - enum NameKind { > - Declaration, > - Macro > - } Kind; > - > - private: > - union { > - Decl *D; > - ModuleMacroInfo *MMI; > - }; > - > - IdentifierInfo *Id; > - > - public: > - HiddenName(Decl *D) : Kind(Declaration), D(D), Id() { } > - > - HiddenName(IdentifierInfo *II, ModuleMacroInfo *MMI) > - : Kind(Macro), MMI(MMI), Id(II) { } > - > - NameKind getKind() const { return Kind; } > - > - Decl *getDecl() const { > - assert(getKind() == Declaration && "Hidden name is not a declaration"); > - return D; > - } > - > - std::pair<IdentifierInfo *, ModuleMacroInfo *> getMacro() const { > - assert(getKind() == Macro && "Hidden name is not a macro!"); > - return std::make_pair(Id, MMI); > - } > - }; > - > - typedef llvm::SmallDenseMap<IdentifierInfo*, > - ModuleMacroInfo*> HiddenMacrosMap; > - > /// \brief A set of hidden declarations. > - struct HiddenNames { > - SmallVector<Decl*, 2> HiddenDecls; > - HiddenMacrosMap HiddenMacros; > - }; > - > + typedef SmallVector<Decl*, 2> HiddenNames; > typedef llvm::DenseMap<Module *, HiddenNames> HiddenNamesMapType; > > /// \brief A mapping from each of the hidden submodules to the deserialized > @@ -1850,20 +1804,6 @@ public: > > void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo > &PMInfo); > > - void installImportedMacro(IdentifierInfo *II, ModuleMacroInfo &MMI, > - Module *Owner); > - > - typedef llvm::TinyPtrVector<DefMacroDirective *> AmbiguousMacros; > - llvm::DenseMap<IdentifierInfo*, AmbiguousMacros> AmbiguousMacroDefs; > - > - void removeOverriddenMacros(IdentifierInfo *II, SourceLocation Loc, > - AmbiguousMacros &Ambig, > - ArrayRef<ModuleMacro *> Overrides); > - > - AmbiguousMacros *removeOverriddenMacros(IdentifierInfo *II, > - SourceLocation Loc, > - ArrayRef<ModuleMacro *> Overrides); > - > /// \brief Retrieve the macro with the given ID. > MacroInfo *getMacro(serialization::MacroID ID); > > > Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Wed Apr 29 18:20:19 2015 > @@ -468,7 +468,7 @@ static void rewriteToObjCProperty(const > ASTContext &Context = NS.getASTContext(); > bool LParenAdded = false; > std::string PropertyString = "@property "; > - if (UseNsIosOnlyMacro && > Context.Idents.get("NS_NONATOMIC_IOSONLY").hasMacroDefinition()) { > + if (UseNsIosOnlyMacro && NS.isMacroDefined("NS_NONATOMIC_IOSONLY")) { > PropertyString += "(NS_NONATOMIC_IOSONLY"; > LParenAdded = true; > } else if (!Atomic) { > @@ -1277,7 +1277,7 @@ void ObjCMigrateASTConsumer::migrateNsRe > > QualType RT = OM->getReturnType(); > if (!TypeIsInnerPointer(RT) || > - !Ctx.Idents.get("NS_RETURNS_INNER_POINTER").hasMacroDefinition()) > + !NSAPIObj->isMacroDefined("NS_RETURNS_INNER_POINTER")) > return; > > edit::Commit commit(*Editor); > @@ -1288,9 +1288,9 @@ void ObjCMigrateASTConsumer::migrateNsRe > void ObjCMigrateASTConsumer::migratePropertyNsReturnsInnerPointer(ASTContext > &Ctx, > > ObjCPropertyDecl *P) { > QualType T = P->getType(); > - > + > if (!TypeIsInnerPointer(T) || > - !Ctx.Idents.get("NS_RETURNS_INNER_POINTER").hasMacroDefinition()) > + !NSAPIObj->isMacroDefined("NS_RETURNS_INNER_POINTER")) > return; > edit::Commit commit(*Editor); > commit.insertBefore(P->getLocEnd(), " NS_RETURNS_INNER_POINTER "); > @@ -1408,7 +1408,7 @@ static bool AuditedType (QualType AT) { > void ObjCMigrateASTConsumer::AnnotateImplicitBridging(ASTContext &Ctx) { > if (CFFunctionIBCandidates.empty()) > return; > - if (!Ctx.Idents.get("CF_IMPLICIT_BRIDGING_ENABLED").hasMacroDefinition()) { > + if (!NSAPIObj->isMacroDefined("CF_IMPLICIT_BRIDGING_ENABLED")) { > CFFunctionIBCandidates.clear(); > FileId = FileID(); > return; > @@ -1483,16 +1483,14 @@ void ObjCMigrateASTConsumer::AddCFAnnota > RetEffect Ret = CE.getReturnValue(); > const char *AnnotationString = nullptr; > if (Ret.getObjKind() == RetEffect::CF) { > - if (Ret.isOwned() && > - Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition()) > + if (Ret.isOwned() && NSAPIObj->isMacroDefined("CF_RETURNS_RETAINED")) > AnnotationString = " CF_RETURNS_RETAINED"; > else if (Ret.notOwned() && > - > Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition()) > + NSAPIObj->isMacroDefined("CF_RETURNS_NOT_RETAINED")) > AnnotationString = " CF_RETURNS_NOT_RETAINED"; > } > else if (Ret.getObjKind() == RetEffect::ObjC) { > - if (Ret.isOwned() && > - Ctx.Idents.get("NS_RETURNS_RETAINED").hasMacroDefinition()) > + if (Ret.isOwned() && NSAPIObj->isMacroDefined("NS_RETURNS_RETAINED")) > AnnotationString = " NS_RETURNS_RETAINED"; > } > > @@ -1509,13 +1507,13 @@ void ObjCMigrateASTConsumer::AddCFAnnota > const ParmVarDecl *pd = *pi; > ArgEffect AE = AEArgs[i]; > if (AE == DecRef && !pd->hasAttr<CFConsumedAttr>() && > - Ctx.Idents.get("CF_CONSUMED").hasMacroDefinition()) { > + NSAPIObj->isMacroDefined("CF_CONSUMED")) { > edit::Commit commit(*Editor); > commit.insertBefore(pd->getLocation(), "CF_CONSUMED "); > Editor->commit(commit); > } > else if (AE == DecRefMsg && !pd->hasAttr<NSConsumedAttr>() && > - Ctx.Idents.get("NS_CONSUMED").hasMacroDefinition()) { > + NSAPIObj->isMacroDefined("NS_CONSUMED")) { > edit::Commit commit(*Editor); > commit.insertBefore(pd->getLocation(), "NS_CONSUMED "); > Editor->commit(commit); > @@ -1600,11 +1598,10 @@ void ObjCMigrateASTConsumer::AddCFAnnota > RetEffect Ret = CE.getReturnValue(); > const char *AnnotationString = nullptr; > if (Ret.getObjKind() == RetEffect::CF) { > - if (Ret.isOwned() && > - Ctx.Idents.get("CF_RETURNS_RETAINED").hasMacroDefinition()) > + if (Ret.isOwned() && NSAPIObj->isMacroDefined("CF_RETURNS_RETAINED")) > AnnotationString = " CF_RETURNS_RETAINED"; > else if (Ret.notOwned() && > - > Ctx.Idents.get("CF_RETURNS_NOT_RETAINED").hasMacroDefinition()) > + NSAPIObj->isMacroDefined("CF_RETURNS_NOT_RETAINED")) > AnnotationString = " CF_RETURNS_NOT_RETAINED"; > } > else if (Ret.getObjKind() == RetEffect::ObjC) { > @@ -1618,8 +1615,7 @@ void ObjCMigrateASTConsumer::AddCFAnnota > break; > > default: > - if (Ret.isOwned() && > - Ctx.Idents.get("NS_RETURNS_RETAINED").hasMacroDefinition()) > + if (Ret.isOwned() && > NSAPIObj->isMacroDefined("NS_RETURNS_RETAINED")) > AnnotationString = " NS_RETURNS_RETAINED"; > break; > } > @@ -1638,7 +1634,7 @@ void ObjCMigrateASTConsumer::AddCFAnnota > const ParmVarDecl *pd = *pi; > ArgEffect AE = AEArgs[i]; > if (AE == DecRef && !pd->hasAttr<CFConsumedAttr>() && > - Ctx.Idents.get("CF_CONSUMED").hasMacroDefinition()) { > + NSAPIObj->isMacroDefined("CF_CONSUMED")) { > edit::Commit commit(*Editor); > commit.insertBefore(pd->getLocation(), "CF_CONSUMED "); > Editor->commit(commit); > @@ -1658,12 +1654,12 @@ void ObjCMigrateASTConsumer::migrateAddM > > MethodDecl->hasAttr<NSReturnsRetainedAttr>() || > > MethodDecl->hasAttr<NSReturnsNotRetainedAttr>() || > > MethodDecl->hasAttr<NSReturnsAutoreleasedAttr>()); > - > - if (CE.getReceiver() == DecRefMsg && > + > + if (CE.getReceiver() == DecRefMsg && > !MethodDecl->hasAttr<NSConsumesSelfAttr>() && > MethodDecl->getMethodFamily() != OMF_init && > MethodDecl->getMethodFamily() != OMF_release && > - Ctx.Idents.get("NS_CONSUMES_SELF").hasMacroDefinition()) { > + NSAPIObj->isMacroDefined("NS_CONSUMES_SELF")) { > edit::Commit commit(*Editor); > commit.insertBefore(MethodDecl->getLocEnd(), " NS_CONSUMES_SELF"); > Editor->commit(commit); > @@ -1729,7 +1725,7 @@ void ObjCMigrateASTConsumer::inferDesign > const ObjCInterfaceDecl *IFace = ImplD->getClassInterface(); > if (!IFace || IFace->hasDesignatedInitializers()) > return; > - if (!Ctx.Idents.get("NS_DESIGNATED_INITIALIZER").hasMacroDefinition()) > + if (!NSAPIObj->isMacroDefined("NS_DESIGNATED_INITIALIZER")) > return; > > for (const auto *MD : ImplD->instance_methods()) { > > Modified: cfe/trunk/lib/ARCMigrate/TransAPIUses.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransAPIUses.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/TransAPIUses.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/TransAPIUses.cpp Wed Apr 29 18:20:19 2015 > @@ -95,7 +95,7 @@ public: > Pass.TA.clearDiagnostic(diag::err_unavailable, > diag::err_unavailable_message, > E->getSelectorLoc(0)); > - Pass.TA.replace(E->getSourceRange(), getNilString(Pass.Ctx)); > + Pass.TA.replace(E->getSourceRange(), getNilString(Pass)); > } > return true; > } > > Modified: cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp Wed Apr 29 > 18:20:19 2015 > @@ -145,7 +145,7 @@ public: > // when an exception is thrown. > Pass.TA.replace(RecContainer->getSourceRange(), RecRange); > std::string str = " = "; > - str += getNilString(Pass.Ctx); > + str += getNilString(Pass); > Pass.TA.insertAfterToken(RecRange.getEnd(), str); > return true; > } > > Modified: cfe/trunk/lib/ARCMigrate/TransUnusedInitDelegate.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransUnusedInitDelegate.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/TransUnusedInitDelegate.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/TransUnusedInitDelegate.cpp Wed Apr 29 18:20:19 > 2015 > @@ -58,7 +58,7 @@ public: > SourceRange ExprRange = ME->getSourceRange(); > Pass.TA.insert(ExprRange.getBegin(), "if (!(self = "); > std::string retStr = ")) return "; > - retStr += getNilString(Pass.Ctx); > + retStr += getNilString(Pass); > Pass.TA.insertAfterToken(ExprRange.getEnd(), retStr); > } > return true; > > Modified: cfe/trunk/lib/ARCMigrate/Transforms.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/Transforms.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/Transforms.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/Transforms.cpp Wed Apr 29 18:20:19 2015 > @@ -16,6 +16,7 @@ > #include "clang/Basic/SourceManager.h" > #include "clang/Basic/TargetInfo.h" > #include "clang/Lex/Lexer.h" > +#include "clang/Lex/Preprocessor.h" > #include "clang/Sema/Sema.h" > #include "clang/Sema/SemaDiagnostic.h" > #include "llvm/ADT/DenseSet.h" > @@ -212,11 +213,8 @@ bool trans::isGlobalVar(Expr *E) { > return false; > } > > -StringRef trans::getNilString(ASTContext &Ctx) { > - if (Ctx.Idents.get("nil").hasMacroDefinition()) > - return "nil"; > - else > - return "0"; > +StringRef trans::getNilString(MigrationPass &Pass) { > + return Pass.SemaRef.PP.isMacroDefined("nil") ? "nil" : "0"; > } > > namespace { > > Modified: cfe/trunk/lib/ARCMigrate/Transforms.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/Transforms.h?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/Transforms.h (original) > +++ cfe/trunk/lib/ARCMigrate/Transforms.h Wed Apr 29 18:20:19 2015 > @@ -180,7 +180,7 @@ SourceLocation findSemiAfterLocation(Sou > bool hasSideEffects(Expr *E, ASTContext &Ctx); > bool isGlobalVar(Expr *E); > /// \brief Returns "nil" or "0" if 'nil' macro is not actually defined. > -StringRef getNilString(ASTContext &Ctx); > +StringRef getNilString(MigrationPass &Pass); > > template <typename BODY_TRANS> > class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > { > > Modified: cfe/trunk/lib/AST/NSAPI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/NSAPI.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/AST/NSAPI.cpp (original) > +++ cfe/trunk/lib/AST/NSAPI.cpp Wed Apr 29 18:20:19 2015 > @@ -505,6 +505,11 @@ StringRef NSAPI::GetNSIntegralKind(QualT > return StringRef(); > } > > +bool NSAPI::isMacroDefined(StringRef Id) const { > + // FIXME: Check whether the relevant module macros are visible. > + return Ctx.Idents.get(Id).hasMacroDefinition(); > +} > + > bool NSAPI::isObjCTypedef(QualType T, > StringRef name, IdentifierInfo *&II) const { > if (!Ctx.getLangOpts().ObjC1) > > Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original) > +++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Wed Apr 29 18:20:19 2015 > @@ -1084,79 +1084,51 @@ static void checkConfigMacro(Preprocesso > // not have changed. > if (!Id->hadMacroDefinition()) > return; > + auto *LatestLocalMD = PP.getLocalMacroDirectiveHistory(Id); > > - // If this identifier does not currently have a macro definition, > - // check whether it had one on the command line. > - if (!Id->hasMacroDefinition()) { > - MacroDirective::DefInfo LatestDef = > - PP.getMacroDirectiveHistory(Id)->getDefinition(); > - for (MacroDirective::DefInfo Def = LatestDef; Def; > - Def = Def.getPreviousDefinition()) { > - FileID FID = SourceMgr.getFileID(Def.getLocation()); > - if (FID.isInvalid()) > - continue; > - > - // We only care about the predefines buffer. > - if (FID != PP.getPredefinesFileID()) > - continue; > - > - // This macro was defined on the command line, then #undef'd later. > - // Complain. > - PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) > - << true << ConfigMacro << Mod->getFullModuleName(); > - if (LatestDef.isUndefined()) > - PP.Diag(LatestDef.getUndefLocation(), > diag::note_module_def_undef_here) > - << true; > - return; > - } > - > - // Okay: no definition in the predefines buffer. > - return; > - } > - > - // This identifier has a macro definition. Check whether we had a > definition > - // on the command line. > - MacroDirective::DefInfo LatestDef = > - PP.getMacroDirectiveHistory(Id)->getDefinition(); > - MacroDirective::DefInfo PredefinedDef; > - for (MacroDirective::DefInfo Def = LatestDef; Def; > - Def = Def.getPreviousDefinition()) { > - FileID FID = SourceMgr.getFileID(Def.getLocation()); > - if (FID.isInvalid()) > - continue; > - > + // Find the macro definition from the command line. > + MacroInfo *CmdLineDefinition = nullptr; > + for (auto *MD = LatestLocalMD; MD; MD = MD->getPrevious()) { > // We only care about the predefines buffer. > - if (FID != PP.getPredefinesFileID()) > + FileID FID = SourceMgr.getFileID(MD->getLocation()); > + if (FID.isInvalid() || FID != PP.getPredefinesFileID()) > continue; > - > - PredefinedDef = Def; > + if (auto *DMD = dyn_cast<DefMacroDirective>(MD)) > + CmdLineDefinition = DMD->getMacroInfo(); > break; > } > > - // If there was no definition for this macro in the predefines buffer, > - // complain. > - if (!PredefinedDef || > - (!PredefinedDef.getLocation().isValid() && > - PredefinedDef.getUndefLocation().isValid())) { > + auto *CurrentDefinition = PP.getMacroInfo(Id); > + if (CurrentDefinition == CmdLineDefinition) { > + // Macro matches. Nothing to do. > + } else if (!CurrentDefinition) { > + // This macro was defined on the command line, then #undef'd later. > + // Complain. > + PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) > + << true << ConfigMacro << Mod->getFullModuleName(); > + auto LatestDef = LatestLocalMD->getDefinition(); > + assert(LatestDef.isUndefined() && > + "predefined macro went away with no #undef?"); > + PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here) > + << true; > + return; > + } else if (!CmdLineDefinition) { > + // There was no definition for this macro in the predefines buffer, > + // but there was a local definition. Complain. > PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) > << false << ConfigMacro << Mod->getFullModuleName(); > - PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) > + PP.Diag(CurrentDefinition->getDefinitionLoc(), > + diag::note_module_def_undef_here) > + << false; > + } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP, > + /*Syntactically=*/true)) { > + // The macro definitions differ. > + PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) > + << false << ConfigMacro << Mod->getFullModuleName(); > + PP.Diag(CurrentDefinition->getDefinitionLoc(), > + diag::note_module_def_undef_here) > << false; > - return; > } > - > - // If the current macro definition is the same as the predefined macro > - // definition, it's okay. > - if (LatestDef.getMacroInfo() == PredefinedDef.getMacroInfo() || > - > LatestDef.getMacroInfo()->isIdenticalTo(*PredefinedDef.getMacroInfo(),PP, > - /*Syntactically=*/true)) > - return; > - > - // The macro definitions differ. > - PP.Diag(ImportLoc, diag::warn_module_config_macro_undef) > - << false << ConfigMacro << Mod->getFullModuleName(); > - PP.Diag(LatestDef.getLocation(), diag::note_module_def_undef_here) > - << false; > } > > /// \brief Write a new timestamp file with the given path. > > Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original) > +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Wed Apr 29 18:20:19 > 2015 > @@ -686,9 +686,9 @@ static void DoPrintMacros(Preprocessor & > SmallVector<id_macro_pair, 128> MacrosByID; > for (Preprocessor::macro_iterator I = PP.macro_begin(), E = PP.macro_end(); > I != E; ++I) { > - if (I->first->hasMacroDefinition()) > - MacrosByID.push_back( > - id_macro_pair(I->first, I->second.getLatest()->getMacroInfo())); > + auto *MD = I->second.getLatest(); > + if (MD && MD->isDefined()) > + MacrosByID.push_back(id_macro_pair(I->first, MD->getMacroInfo())); > } > llvm::array_pod_sort(MacrosByID.begin(), MacrosByID.end(), MacroIDCompare); > > > Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original) > +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Wed Apr 29 18:20:19 2015 > @@ -18,6 +18,7 @@ > #include "clang/Lex/HeaderSearchOptions.h" > #include "clang/Lex/LexDiagnostic.h" > #include "clang/Lex/Lexer.h" > +#include "clang/Lex/Preprocessor.h" > #include "llvm/ADT/APInt.h" > #include "llvm/ADT/Hashing.h" > #include "llvm/ADT/SmallString.h" > @@ -1016,7 +1017,9 @@ void HeaderSearch::MarkFileModuleHeader( > HFI.setHeaderRole(Role); > } > > -bool HeaderSearch::ShouldEnterIncludeFile(const FileEntry *File, bool > isImport){ > +bool HeaderSearch::ShouldEnterIncludeFile(Preprocessor &PP, > + const FileEntry *File, > + bool isImport) { > ++NumIncluded; // Count # of attempted #includes. > > // Get information about this file. > @@ -1041,7 +1044,7 @@ bool HeaderSearch::ShouldEnterIncludeFil > // if the macro that guards it is defined, we know the #include has no > effect. > if (const IdentifierInfo *ControllingMacro > = FileInfo.getControllingMacro(ExternalLookup)) > - if (ControllingMacro->hasMacroDefinition()) { > + if (PP.isMacroDefined(ControllingMacro)) { > ++NumMultiIncludeFileOptzn; > return false; > } > > Modified: cfe/trunk/lib/Lex/MacroArgs.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/MacroArgs.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/MacroArgs.cpp (original) > +++ cfe/trunk/lib/Lex/MacroArgs.cpp Wed Apr 29 18:20:19 2015 > @@ -133,12 +133,11 @@ bool MacroArgs::ArgNeedsPreexpansion(con > // If there are no identifiers in the argument list, or if the identifiers > are > // known to not be macros, pre-expansion won't modify it. > for (; ArgTok->isNot(tok::eof); ++ArgTok) > - if (IdentifierInfo *II = ArgTok->getIdentifierInfo()) { > - if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled()) > + if (IdentifierInfo *II = ArgTok->getIdentifierInfo()) > + if (II->hasMacroDefinition()) > // Return true even though the macro could be a function-like macro > - // without a following '(' token. > + // without a following '(' token, or could be disabled, or not > visible. > return true; > - } > return false; > } > > > Modified: cfe/trunk/lib/Lex/PPDirectives.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/PPDirectives.cpp (original) > +++ cfe/trunk/lib/Lex/PPDirectives.cpp Wed Apr 29 18:20:19 2015 > @@ -179,11 +179,13 @@ bool Preprocessor::CheckMacroName(Token > return Diag(MacroNameTok, diag::err_defined_macro_name); > } > > - if (isDefineUndef == MU_Undef && II->hasMacroDefinition() && > - getMacroInfo(II)->isBuiltinMacro()) { > - // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4 > - // and C++ [cpp.predefined]p4], but allow it as an extension. > - Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro); > + if (isDefineUndef == MU_Undef) { > + auto *MI = getMacroInfo(II); > + if (MI && MI->isBuiltinMacro()) { > + // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4 > + // and C++ [cpp.predefined]p4], but allow it as an extension. > + Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro); > + } > } > > // If defining/undefining reserved identifier or a keyword, we need to issue > @@ -1292,7 +1294,7 @@ void Preprocessor::HandleMacroPublicDire > > IdentifierInfo *II = MacroNameTok.getIdentifierInfo(); > // Okay, we finally have a valid identifier to undef. > - MacroDirective *MD = getMacroDirective(II); > + MacroDirective *MD = getLocalMacroDirective(II); > > // If the macro is not defined, this is an error. > if (!MD) { > @@ -1319,7 +1321,7 @@ void Preprocessor::HandleMacroPrivateDir > > IdentifierInfo *II = MacroNameTok.getIdentifierInfo(); > // Okay, we finally have a valid identifier to undef. > - MacroDirective *MD = getMacroDirective(II); > + MacroDirective *MD = getLocalMacroDirective(II); > > // If the macro is not defined, this is an error. > if (!MD) { > @@ -1757,7 +1759,7 @@ void Preprocessor::HandleIncludeDirectiv > > // Ask HeaderInfo if we should enter this #include file. If not, #including > // this file will have no effect. > - if (!HeaderInfo.ShouldEnterIncludeFile(File, isImport)) { > + if (!HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport)) { > if (Callbacks) > Callbacks->FileSkipped(*File, FilenameTok, FileCharacter); > return; > @@ -2295,16 +2297,19 @@ void Preprocessor::HandleUndefDirective( > // Check to see if this is the last token on the #undef line. > CheckEndOfDirective("undef"); > > - // Okay, we finally have a valid identifier to undef. > - MacroDirective *MD = getMacroDirective(MacroNameTok.getIdentifierInfo()); > - const MacroInfo *MI = MD ? MD->getMacroInfo() : nullptr; > + // Okay, we have a valid identifier to undef. > + auto *II = MacroNameTok.getIdentifierInfo(); > > // If the callbacks want to know, tell them about the macro #undef. > // Note: no matter if the macro was defined or not. > - if (Callbacks) > + if (Callbacks) { > + // FIXME: Tell callbacks about module macros. > + MacroDirective *MD = getLocalMacroDirective(II); > Callbacks->MacroUndefined(MacroNameTok, MD); > + } > > // If the macro is not defined, this is a noop undef, just return. > + const MacroInfo *MI = getMacroInfo(II); > if (!MI) > return; > > @@ -2349,8 +2354,7 @@ void Preprocessor::HandleIfdefDirective( > CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef"); > > IdentifierInfo *MII = MacroNameTok.getIdentifierInfo(); > - MacroDirective *MD = getMacroDirective(MII); > - MacroInfo *MI = MD ? MD->getMacroInfo() : nullptr; > + MacroInfo *MI = getMacroInfo(MII); > > if (CurPPLexer->getConditionalStackDepth() == 0) { > // If the start of a top-level #ifdef and if the macro is not defined, > @@ -2369,6 +2373,8 @@ void Preprocessor::HandleIfdefDirective( > markMacroAsUsed(MI); > > if (Callbacks) { > + // FIXME: Tell callbacks about module macros. > + MacroDirective *MD = getLocalMacroDirective(MII); > if (isIfndef) > Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD); > else > > Modified: cfe/trunk/lib/Lex/PPExpressions.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPExpressions.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/PPExpressions.cpp (original) > +++ cfe/trunk/lib/Lex/PPExpressions.cpp Wed Apr 29 18:20:19 2015 > @@ -108,15 +108,13 @@ static bool EvaluateDefined(PPValue &Res > > // Otherwise, we got an identifier, is it defined to something? > IdentifierInfo *II = PeekTok.getIdentifierInfo(); > - Result.Val = II->hasMacroDefinition(); > + Preprocessor::MacroDefinition Macro = PP.getMacroDefinition(II); > + Result.Val = !!Macro; > Result.Val.setIsUnsigned(false); // Result is signed intmax_t. > > - MacroDirective *Macro = nullptr; > // If there is a macro, mark it used. > - if (Result.Val != 0 && ValueLive) { > - Macro = PP.getMacroDirective(II); > - PP.markMacroAsUsed(Macro->getMacroInfo()); > - } > + if (Result.Val != 0 && ValueLive) > + PP.markMacroAsUsed(Macro.getMacroInfo()); > > // Save macro token for callback. > Token macroToken(PeekTok); > @@ -144,10 +142,8 @@ static bool EvaluateDefined(PPValue &Res > > // Invoke the 'defined' callback. > if (PPCallbacks *Callbacks = PP.getPPCallbacks()) { > - MacroDirective *MD = Macro; > - // Pass the MacroInfo for the macro name even if the value is dead. > - if (!MD && Result.Val != 0) > - MD = PP.getMacroDirective(II); > + // FIXME: Tell callbacks about module macros. > + MacroDirective *MD = Macro.getLocalDirective(); > Callbacks->Defined(macroToken, MD, > SourceRange(beginLoc, PeekTok.getLocation())); > } > > Modified: cfe/trunk/lib/Lex/PPLexerChange.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPLexerChange.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/PPLexerChange.cpp (original) > +++ cfe/trunk/lib/Lex/PPLexerChange.cpp Wed Apr 29 18:20:19 2015 > @@ -309,7 +309,7 @@ bool Preprocessor::HandleEndOfFile(Token > } > if (const IdentifierInfo *DefinedMacro = > CurPPLexer->MIOpt.GetDefinedMacro()) { > - if (!ControllingMacro->hasMacroDefinition() && > + if (!isMacroDefined(ControllingMacro) && > DefinedMacro != ControllingMacro && > HeaderInfo.FirstTimeLexingFile(FE)) { > > > Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original) > +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Apr 29 18:20:19 2015 > @@ -34,12 +34,11 @@ > using namespace clang; > > MacroDirective * > -Preprocessor::getMacroDirectiveHistory(const IdentifierInfo *II) const { > - assert(II->hadMacroDefinition() && "Identifier has not been not a macro!"); > - > +Preprocessor::getLocalMacroDirectiveHistory(const IdentifierInfo *II) const { > + if (!II->hadMacroDefinition()) > + return nullptr; > auto Pos = Macros.find(II); > - assert(Pos != Macros.end() && "Identifier macro info is missing!"); > - return Pos->second.getLatest(); > + return Pos == Macros.end() ? nullptr : Pos->second.getLatest(); > } > > void Preprocessor::appendMacroDirective(IdentifierInfo *II, MacroDirective > *MD){ > @@ -54,7 +53,7 @@ void Preprocessor::appendMacroDirective( > > // Set up the identifier as having associated macro history. > II->setHasMacroDefinition(true); > - if (!MD->isDefined()) > + if (!MD->isDefined() && LeafModuleMacros.find(II) == > LeafModuleMacros.end()) > II->setHasMacroDefinition(false); > if (II->isFromAST() && !MD->isImported()) > II->setChangedSinceDeserialization(); > @@ -69,7 +68,7 @@ void Preprocessor::setLoadedMacroDirecti > StoredMD = MD; > // Setup the identifier as having associated macro history. > II->setHasMacroDefinition(true); > - if (!MD->isDefined()) > + if (!MD->isDefined() && LeafModuleMacros.find(II) == > LeafModuleMacros.end()) > II->setHasMacroDefinition(false); > } > > @@ -108,6 +107,8 @@ ModuleMacro *Preprocessor::addModuleMacr > > // The new macro is always a leaf macro. > LeafMacros.push_back(MM); > + // The identifier now has defined macros (that may or may not be visible). > + II->setHasMacroDefinition(true); > > New = true; > return MM; > @@ -121,7 +122,7 @@ ModuleMacro *Preprocessor::getModuleMacr > return ModuleMacros.FindNodeOrInsertPos(ID, InsertPos); > } > > -void Preprocessor::updateModuleMacroInfo(IdentifierInfo *II, > +void Preprocessor::updateModuleMacroInfo(const IdentifierInfo *II, > ModuleMacroInfo &Info) { > assert(Info.ActiveModuleMacrosGeneration != MacroVisibilityGeneration && > "don't need to update this macro name info"); > @@ -156,14 +157,20 @@ void Preprocessor::updateModuleMacroInfo > Worklist.push_back(O); > } > } > + // Our reverse postorder walk found the macros in reverse order. > + std::reverse(Info.ActiveModuleMacros.begin(), > Info.ActiveModuleMacros.end()); > > // Determine whether the macro name is ambiguous. > - Info.IsAmbiguous = false; > MacroInfo *MI = nullptr; > - bool IsSystemMacro = false; > - if (auto *DMD = dyn_cast<DefMacroDirective>(Info.MD)) { > - MI = DMD->getInfo(); > - IsSystemMacro = SourceMgr.isInSystemHeader(DMD->getLocation()); > + bool IsSystemMacro = true; > + bool IsAmbiguous = false; > + if (auto *MD = Info.MD) { > + while (MD && isa<VisibilityMacroDirective>(MD)) > + MD = MD->getPrevious(); > + if (auto *DMD = dyn_cast_or_null<DefMacroDirective>(MD)) { > + MI = DMD->getInfo(); > + IsSystemMacro &= SourceMgr.isInSystemHeader(DMD->getLocation()); > + } > } > for (auto *Active : Info.ActiveModuleMacros) { > auto *NewMI = Active->getMacroInfo(); > @@ -177,13 +184,14 @@ void Preprocessor::updateModuleMacroInfo > // > // FIXME: Remove the defined-in-system-headers check. clang's limits.h > // overrides the system limits.h's macros, so there's no conflict here. > - IsSystemMacro &= Active->getOwningModule()->IsSystem; > - if (MI && NewMI != MI && !IsSystemMacro && > - !MI->isIdenticalTo(*NewMI, *this, /*Syntactically=*/true)) { > - Info.IsAmbiguous = true; > - break; > - } > + if (MI && NewMI != MI && > + !MI->isIdenticalTo(*NewMI, *this, /*Syntactically=*/true)) > + IsAmbiguous = true; > + IsSystemMacro &= Active->getOwningModule()->IsSystem || > + SourceMgr.isInSystemHeader(NewMI->getDefinitionLoc()); > + MI = NewMI; > } > + Info.IsAmbiguous = IsAmbiguous && !IsSystemMacro; > } > > /// RegisterBuiltinMacro - Register the specified identifier in the identifier > @@ -270,10 +278,11 @@ static bool isTrivialSingleTokenExpansio > > // If the identifier is a macro, and if that macro is enabled, it may be > // expanded so it's not a trivial expansion. > - if (II->hasMacroDefinition() && PP.getMacroInfo(II)->isEnabled() && > - // Fast expanding "#define X X" is ok, because X would be disabled. > - II != MacroIdent) > - return false; > + if (auto *ExpansionMI = PP.getMacroInfo(II)) > + if (PP.getMacroInfo(II)->isEnabled() && > + // Fast expanding "#define X X" is ok, because X would be disabled. > + II != MacroIdent) > + return false; > > // If this is an object-like macro invocation, it is safe to trivially > expand > // it. > @@ -336,10 +345,8 @@ bool Preprocessor::isNextPPTokenLParen() > /// HandleMacroExpandedIdentifier - If an identifier token is read that is to > be > /// expanded as a macro, handle it and return the next token as 'Identifier'. > bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier, > - MacroDirective *MD) { > - MacroDirective::DefInfo Def = MD->getDefinition(); > - assert(Def.isValid()); > - MacroInfo *MI = Def.getMacroInfo(); > + const MacroDefinition &M) { > + MacroInfo *MI = M.getMacroInfo(); > > // If this is a macro expansion in the "#if !defined(x)" line for the file, > // then the macro could expand to different things in other contexts, we > need > @@ -348,7 +355,8 @@ bool Preprocessor::HandleMacroExpandedId > > // If this is a builtin macro, like __LINE__ or _Pragma, handle it > specially. > if (MI->isBuiltinMacro()) { > - if (Callbacks) Callbacks->MacroExpands(Identifier, MD, > + // FIXME: Tell callbacks about module macros. > + if (Callbacks) Callbacks->MacroExpands(Identifier, M.getLocalDirective(), > Identifier.getLocation(), > /*Args=*/nullptr); > ExpandBuiltinMacro(Identifier); > @@ -396,10 +404,13 @@ bool Preprocessor::HandleMacroExpandedId > // reading the function macro arguments. To ensure, in that case, that > // MacroExpands callbacks still happen in source order, queue this > // callback to have it happen after the function macro callback. > + // FIXME: Tell callbacks about module macros. > DelayedMacroExpandsCallbacks.push_back( > - MacroExpandsInfo(Identifier, MD, > ExpansionRange)); > + MacroExpandsInfo(Identifier, M.getLocalDirective(), > ExpansionRange)); > } else { > - Callbacks->MacroExpands(Identifier, MD, ExpansionRange, Args); > + // FIXME: Tell callbacks about module macros. > + Callbacks->MacroExpands(Identifier, M.getLocalDirective(), > ExpansionRange, > + Args); > if (!DelayedMacroExpandsCallbacks.empty()) { > for (unsigned i=0, e = DelayedMacroExpandsCallbacks.size(); i!=e; > ++i) { > MacroExpandsInfo &Info = DelayedMacroExpandsCallbacks[i]; > @@ -413,20 +424,16 @@ bool Preprocessor::HandleMacroExpandedId > } > > // If the macro definition is ambiguous, complain. > - if (Def.getDirective()->isAmbiguous()) { > + if (M.isAmbiguous()) { > Diag(Identifier, diag::warn_pp_ambiguous_macro) > << Identifier.getIdentifierInfo(); > Diag(MI->getDefinitionLoc(), diag::note_pp_ambiguous_macro_chosen) > << Identifier.getIdentifierInfo(); > - for (MacroDirective::DefInfo PrevDef = Def.getPreviousDefinition(); > - PrevDef && !PrevDef.isUndefined(); > - PrevDef = PrevDef.getPreviousDefinition()) { > - Diag(PrevDef.getMacroInfo()->getDefinitionLoc(), > - diag::note_pp_ambiguous_macro_other) > - << Identifier.getIdentifierInfo(); > - if (!PrevDef.getDirective()->isAmbiguous()) > - break; > - } > + M.forAllDefinitions([&](const MacroInfo *OtherMI) { > + if (OtherMI != MI) > + Diag(OtherMI->getDefinitionLoc(), > diag::note_pp_ambiguous_macro_other) > + << Identifier.getIdentifierInfo(); > + }); > } > > // If we started lexing a macro, enter the macro expansion body. > > Modified: cfe/trunk/lib/Lex/Pragma.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Pragma.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/Pragma.cpp (original) > +++ cfe/trunk/lib/Lex/Pragma.cpp Wed Apr 29 18:20:19 2015 > @@ -400,7 +400,7 @@ void Preprocessor::HandlePragmaPoison(To > if (II->isPoisoned()) continue; > > // If this is a macro identifier, emit a warning. > - if (II->hasMacroDefinition()) > + if (isMacroDefined(II)) > Diag(Tok, diag::pp_poisoning_existing_macro); > > // Finally, poison it! > @@ -590,8 +590,7 @@ void Preprocessor::HandlePragmaPopMacro( > PragmaPushMacroInfo.find(IdentInfo); > if (iter != PragmaPushMacroInfo.end()) { > // Forget the MacroInfo currently associated with IdentInfo. > - if (MacroDirective *CurrentMD = getMacroDirective(IdentInfo)) { > - MacroInfo *MI = CurrentMD->getMacroInfo(); > + if (MacroInfo *MI = getMacroInfo(IdentInfo)) { > if (MI->isWarnIfUnused()) > WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); > appendMacroDirective(IdentInfo, > AllocateUndefMacroDirective(MessageLoc)); > > Modified: cfe/trunk/lib/Lex/Preprocessor.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Lex/Preprocessor.cpp (original) > +++ cfe/trunk/lib/Lex/Preprocessor.cpp Wed Apr 29 18:20:19 2015 > @@ -73,8 +73,7 @@ Preprocessor::Preprocessor(IntrusiveRefC > ModuleImportExpectsIdentifier(false), CodeCompletionReached(0), > MainFileDir(nullptr), SkipMainFilePreamble(0, true), > CurPPLexer(nullptr), > CurDirLookup(nullptr), CurLexerKind(CLK_Lexer), CurSubmodule(nullptr), > - Callbacks(nullptr), MacroVisibilityGeneration(0), > - MacroArgCache(nullptr), Record(nullptr), > + Callbacks(nullptr), MacroArgCache(nullptr), Record(nullptr), > MIChainHead(nullptr), DeserialMIChainHead(nullptr) { > OwnsHeaderSearch = OwnsHeaders; > > @@ -108,6 +107,9 @@ Preprocessor::Preprocessor(IntrusiveRefC > > // We haven't read anything from the external source. > ReadMacrosFromExternalSource = false; > + // We might already have some macros from an imported module (via a PCH or > + // preamble) if modules is enabled. > + MacroVisibilityGeneration = LangOpts.Modules ? 1 : 0; > > // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. > // This gets unpoisoned where it is allowed. > @@ -623,8 +625,8 @@ bool Preprocessor::HandleIdentifier(Toke > } > > // If this is a macro to be expanded, do it. > - if (MacroDirective *MD = getMacroDirective(&II)) { > - MacroInfo *MI = MD->getMacroInfo(); > + if (MacroDefinition MD = getMacroDefinition(&II)) { > + auto *MI = MD.getMacroInfo(); > if (!DisableMacroExpansion) { > if (!Identifier.isExpandDisabled() && MI->isEnabled()) { > // C99 6.10.3p10: If the preprocessing token immediately after the > > Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original) > +++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Wed Apr 29 18:20:19 2015 > @@ -2017,7 +2017,7 @@ static void AddOrdinaryNameResults(Sema: > if (SemaRef.getLangOpts().C11) { > // _Alignof > Builder.AddResultTypeChunk("size_t"); > - if (SemaRef.getASTContext().Idents.get("alignof").hasMacroDefinition()) > + if (SemaRef.PP.isMacroDefined("alignof")) > Builder.AddTypedTextChunk("alignof"); > else > Builder.AddTypedTextChunk("_Alignof"); > @@ -2085,15 +2085,14 @@ static void AddResultTypeChunk(ASTContex > Result.getAllocator())); > } > > -static void MaybeAddSentinel(ASTContext &Context, > +static void MaybeAddSentinel(Preprocessor &PP, > const NamedDecl *FunctionOrMethod, > CodeCompletionBuilder &Result) { > if (SentinelAttr *Sentinel = FunctionOrMethod->getAttr<SentinelAttr>()) > if (Sentinel->getSentinel() == 0) { > - if (Context.getLangOpts().ObjC1 && > - Context.Idents.get("nil").hasMacroDefinition()) > + if (PP.getLangOpts().ObjC1 && PP.isMacroDefined("nil")) > Result.AddTextChunk(", nil"); > - else if (Context.Idents.get("NULL").hasMacroDefinition()) > + else if (PP.isMacroDefined("NULL")) > Result.AddTextChunk(", NULL"); > else > Result.AddTextChunk(", (void*)0"); > @@ -2117,8 +2116,7 @@ static std::string formatObjCParamQualif > return Result; > } > > -static std::string FormatFunctionParameter(ASTContext &Context, > - const PrintingPolicy &Policy, > +static std::string FormatFunctionParameter(const PrintingPolicy &Policy, > const ParmVarDecl *Param, > bool SuppressName = false, > bool SuppressBlock = false) { > @@ -2217,7 +2215,7 @@ static std::string FormatFunctionParamet > for (unsigned I = 0, N = Block.getNumParams(); I != N; ++I) { > if (I) > Params += ", "; > - Params += FormatFunctionParameter(Context, Policy, Block.getParam(I), > + Params += FormatFunctionParameter(Policy, Block.getParam(I), > /*SuppressName=*/false, > /*SuppressBlock=*/true); > > @@ -2247,7 +2245,7 @@ static std::string FormatFunctionParamet > } > > /// \brief Add function parameter chunks to the given code completion string. > -static void AddFunctionParameterChunks(ASTContext &Context, > +static void AddFunctionParameterChunks(Preprocessor &PP, > const PrintingPolicy &Policy, > const FunctionDecl *Function, > CodeCompletionBuilder &Result, > @@ -2265,7 +2263,7 @@ static void AddFunctionParameterChunks(A > Result.getCodeCompletionTUInfo()); > if (!FirstParameter) > Opt.AddChunk(CodeCompletionString::CK_Comma); > - AddFunctionParameterChunks(Context, Policy, Function, Opt, P, true); > + AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true); > Result.AddOptionalChunk(Opt.TakeString()); > break; > } > @@ -2278,9 +2276,8 @@ static void AddFunctionParameterChunks(A > InOptional = false; > > // Format the placeholder string. > - std::string PlaceholderStr = FormatFunctionParameter(Context, Policy, > - Param); > - > + std::string PlaceholderStr = FormatFunctionParameter(Policy, Param); > + > if (Function->isVariadic() && P == N - 1) > PlaceholderStr += ", ..."; > > @@ -2295,7 +2292,7 @@ static void AddFunctionParameterChunks(A > if (Proto->getNumParams() == 0) > Result.AddPlaceholderChunk("..."); > > - MaybeAddSentinel(Context, Function, Result); > + MaybeAddSentinel(PP, Function, Result); > } > } > > @@ -2575,11 +2572,7 @@ CodeCompletionResult::CreateCodeCompleti > } > > if (Kind == RK_Macro) { > - const MacroDirective *MD = PP.getMacroDirectiveHistory(Macro); > - assert(MD && "Not a macro?"); > - const MacroInfo *MI = MD->getMacroInfo(); > - assert((!MD->isDefined() || MI) && "missing MacroInfo for define"); > - > + const MacroInfo *MI = PP.getMacroInfo(Macro); > Result.AddTypedTextChunk( > > Result.getAllocator().CopyString(Macro->getName())); > > @@ -2654,7 +2647,7 @@ CodeCompletionResult::CreateCodeCompleti > Ctx, Policy); > AddTypedNameChunk(Ctx, Policy, ND, Result); > Result.AddChunk(CodeCompletionString::CK_LeftParen); > - AddFunctionParameterChunks(Ctx, Policy, Function, Result); > + AddFunctionParameterChunks(PP, Policy, Function, Result); > Result.AddChunk(CodeCompletionString::CK_RightParen); > AddFunctionTypeQualsToCompletionString(Result, Function); > return Result.TakeString(); > @@ -2708,7 +2701,7 @@ CodeCompletionResult::CreateCodeCompleti > > // Add the function parameters > Result.AddChunk(CodeCompletionString::CK_LeftParen); > - AddFunctionParameterChunks(Ctx, Policy, Function, Result); > + AddFunctionParameterChunks(PP, Policy, Function, Result); > Result.AddChunk(CodeCompletionString::CK_RightParen); > AddFunctionTypeQualsToCompletionString(Result, Function); > return Result.TakeString(); > @@ -2769,7 +2762,7 @@ CodeCompletionResult::CreateCodeCompleti > std::string Arg; > > if ((*P)->getType()->isBlockPointerType() && !DeclaringEntity) > - Arg = FormatFunctionParameter(Ctx, Policy, *P, true); > + Arg = FormatFunctionParameter(Policy, *P, true); > else { > (*P)->getType().getAsStringInternal(Arg, Policy); > Arg = "(" + formatObjCParamQualifiers((*P)->getObjCDeclQualifier()) > @@ -2800,7 +2793,7 @@ CodeCompletionResult::CreateCodeCompleti > Result.AddPlaceholderChunk(", ..."); > } > > - MaybeAddSentinel(Ctx, Method, Result); > + MaybeAddSentinel(PP, Method, Result); > } > > return Result.TakeString(); > @@ -2854,8 +2847,7 @@ static void AddOverloadParameterChunks(A > // Format the placeholder string. > std::string Placeholder; > if (Function) > - Placeholder = FormatFunctionParameter(Context, Policy, > - Function->getParamDecl(P)); > + Placeholder = FormatFunctionParameter(Policy, > Function->getParamDecl(P)); > else > Placeholder = Prototype->getParamType(P).getAsString(Policy); > > @@ -3036,8 +3028,9 @@ static void AddMacroResults(Preprocessor > for (Preprocessor::macro_iterator M = PP.macro_begin(), > MEnd = PP.macro_end(); > M != MEnd; ++M) { > - if (IncludeUndefined || M->first->hasMacroDefinition()) { > - if (MacroInfo *MI = M->second.getLatest()->getMacroInfo()) > + auto MD = PP.getMacroDefinition(M->first); > + if (IncludeUndefined || MD) { > + if (MacroInfo *MI = MD.getMacroInfo()) > if (MI->isUsedForHeaderGuard()) > continue; > > @@ -5122,7 +5115,7 @@ void Sema::CodeCompleteObjCPassingType(S > // an action, e.g., > // IBAction)<#selector#>:(id)sender > if (DS.getObjCDeclQualifier() == 0 && !IsParameter && > - Context.Idents.get("IBAction").hasMacroDefinition()) { > + PP.isMacroDefined("IBAction")) { > CodeCompletionBuilder Builder(Results.getAllocator(), > Results.getCodeCompletionTUInfo(), > CCP_CodePattern, CXAvailability_Available); > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Apr 29 18:20:19 2015 > @@ -450,12 +450,11 @@ void Sema::DiagnoseSentinelCalls(NamedDe > SourceLocation MissingNilLoc > = PP.getLocForEndOfToken(sentinelExpr->getLocEnd()); > std::string NullValue; > - if (calleeType == CT_Method && > - PP.getIdentifierInfo("nil")->hasMacroDefinition()) > + if (calleeType == CT_Method && PP.isMacroDefined("nil")) > NullValue = "nil"; > else if (getLangOpts().CPlusPlus11) > NullValue = "nullptr"; > - else if (PP.getIdentifierInfo("NULL")->hasMacroDefinition()) > + else if (PP.isMacroDefined("NULL")) > NullValue = "NULL"; > else > NullValue = "(void*) 0"; > > Modified: cfe/trunk/lib/Sema/SemaFixItUtils.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaFixItUtils.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaFixItUtils.cpp (original) > +++ cfe/trunk/lib/Sema/SemaFixItUtils.cpp Wed Apr 29 18:20:19 2015 > @@ -161,11 +161,8 @@ bool ConversionFixItGenerator::tryToFixC > } > > static bool isMacroDefined(const Sema &S, SourceLocation Loc, StringRef Name) > { > - const IdentifierInfo *II = &S.getASTContext().Idents.get(Name); > - if (!II->hadMacroDefinition()) return false; > - > - MacroDirective *Macro = S.PP.getMacroDirectiveHistory(II); > - return Macro && Macro->findDirectiveAtLoc(Loc, S.getSourceManager()); > + return > (bool)S.PP.getMacroDefinitionAtLoc(&S.getASTContext().Idents.get(Name), > + Loc); > } > > static std::string getScalarZeroExpressionForType( > > Modified: cfe/trunk/lib/Serialization/ASTReader.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReader.cpp Wed Apr 29 18:20:19 2015 > @@ -1723,22 +1723,6 @@ void ASTReader::markIdentifierUpToDate(I > IdentifierGeneration[II] = getGeneration(); > } > > -struct ASTReader::ModuleMacroInfo { > - ModuleMacro *MM; > - // FIXME: Remove this. > - ModuleFile *F; > - > - bool isDefine() const { return MM->getMacroInfo(); } > - > - ArrayRef<ModuleMacro *> getOverriddenMacros() const { > - return MM->overrides(); > - } > - > - MacroDirective *import(Preprocessor &PP, SourceLocation ImportLoc) const { > - return PP.AllocateImportedMacroDirective(MM, ImportLoc); > - } > -}; > - > void ASTReader::resolvePendingMacro(IdentifierInfo *II, > const PendingMacroInfo &PMInfo) { > ModuleFile &M = *PMInfo.M; > @@ -1806,19 +1790,7 @@ void ASTReader::resolvePendingMacro(Iden > > bool Inserted = false; > Module *Owner = getSubmodule(MMR.SubModID); > - auto *MM = PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); > - if (!Inserted) > - continue; > - > - ModuleMacroInfo MMI = { MM, &M }; > - if (Owner->NameVisibility == Module::Hidden) { > - // Macros in the owning module are hidden. Just remember this macro > to > - // install if we make this module visible. > - HiddenNamesMap[Owner].HiddenMacros.insert( > - std::make_pair(II, new (Context) ModuleMacroInfo(MMI))); > - } else { > - installImportedMacro(II, MMI, Owner); > - } > + PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); > } > } > > @@ -1870,164 +1842,6 @@ void ASTReader::resolvePendingMacro(Iden > PP.setLoadedMacroDirective(II, Latest); > } > > -/// \brief For the given macro definitions, check if they are both in system > -/// modules. > -static bool areDefinedInSystemModules(MacroInfo *PrevMI, MacroInfo *NewMI, > - Module *NewOwner, ASTReader &Reader) { > - assert(PrevMI && NewMI); > - Module *PrevOwner = nullptr; > - if (SubmoduleID PrevModID = PrevMI->getOwningModuleID()) > - PrevOwner = Reader.getSubmodule(PrevModID); > - if (PrevOwner && PrevOwner == NewOwner) > - return false; > - SourceManager &SrcMgr = Reader.getSourceManager(); > - bool PrevInSystem = (PrevOwner && PrevOwner->IsSystem) || > - SrcMgr.isInSystemHeader(PrevMI->getDefinitionLoc()); > - bool NewInSystem = (NewOwner && NewOwner->IsSystem) || > - SrcMgr.isInSystemHeader(NewMI->getDefinitionLoc()); > - return PrevInSystem && NewInSystem; > -} > - > -void ASTReader::removeOverriddenMacros(IdentifierInfo *II, > - SourceLocation ImportLoc, > - AmbiguousMacros &Ambig, > - ArrayRef<ModuleMacro *> Overrides) { > - for (ModuleMacro *Overridden : Overrides) { > - Module *Owner = Overridden->getOwningModule(); > - // If this macro is not yet visible, remove it from the hidden names > list. > - // It won't be there if we're in the middle of making the owner visible. > - auto HiddenIt = HiddenNamesMap.find(Owner); > - if (HiddenIt != HiddenNamesMap.end()) { > - HiddenNames &Hidden = HiddenIt->second; > - HiddenMacrosMap::iterator HI = Hidden.HiddenMacros.find(II); > - if (HI != Hidden.HiddenMacros.end()) { > - // Register the macro now so we don't lose it when we re-export. > - PP.appendMacroDirective(II, HI->second->import(PP, ImportLoc)); > - > - auto SubOverrides = HI->second->getOverriddenMacros(); > - Hidden.HiddenMacros.erase(HI); > - removeOverriddenMacros(II, ImportLoc, Ambig, SubOverrides); > - } > - } > - > - // If this macro is already in our list of conflicts, remove it from > there. > - Ambig.erase( > - std::remove_if(Ambig.begin(), Ambig.end(), [&](DefMacroDirective > *MD) { > - return getSubmodule(MD->getInfo()->getOwningModuleID()) == Owner; > - }), > - Ambig.end()); > - } > -} > - > -ASTReader::AmbiguousMacros * > -ASTReader::removeOverriddenMacros(IdentifierInfo *II, > - SourceLocation ImportLoc, > - ArrayRef<ModuleMacro *> Overrides) { > - MacroDirective *Prev = PP.getMacroDirective(II); > - if (!Prev && Overrides.empty()) > - return nullptr; > - > - DefMacroDirective *PrevDef = Prev ? Prev->getDefinition().getDirective() > - : nullptr; > - if (PrevDef && PrevDef->isAmbiguous()) { > - // We had a prior ambiguity. Check whether we resolve it (or make it > worse). > - AmbiguousMacros &Ambig = AmbiguousMacroDefs[II]; > - Ambig.push_back(PrevDef); > - > - removeOverriddenMacros(II, ImportLoc, Ambig, Overrides); > - > - if (!Ambig.empty()) > - return &Ambig; > - > - AmbiguousMacroDefs.erase(II); > - } else { > - // There's no ambiguity yet. Maybe we're introducing one. > - AmbiguousMacros Ambig; > - if (PrevDef) > - Ambig.push_back(PrevDef); > - > - removeOverriddenMacros(II, ImportLoc, Ambig, Overrides); > - > - if (!Ambig.empty()) { > - AmbiguousMacros &Result = AmbiguousMacroDefs[II]; > - std::swap(Result, Ambig); > - return &Result; > - } > - } > - > - // We ended up with no ambiguity. > - return nullptr; > -} > - > -void ASTReader::installImportedMacro(IdentifierInfo *II, ModuleMacroInfo > &MMI, > - Module *Owner) { > - assert(II && Owner); > - > - SourceLocation ImportLoc = Owner->MacroVisibilityLoc; > - > - AmbiguousMacros *Prev = > - removeOverriddenMacros(II, ImportLoc, MMI.getOverriddenMacros()); > - > - // Create a synthetic macro definition corresponding to the import (or null > - // if this was an undefinition of the macro). > - MacroDirective *Imported = MMI.import(PP, ImportLoc); > - DefMacroDirective *MD = dyn_cast<DefMacroDirective>(Imported); > - > - // If there's no ambiguity, just install the macro. > - if (!Prev) { > - PP.appendMacroDirective(II, Imported); > - return; > - } > - assert(!Prev->empty()); > - > - if (!MD) { > - // We imported a #undef that didn't remove all prior definitions. The > most > - // recent prior definition remains, and we install it in the place of the > - // imported directive, as if by a local #pragma pop_macro. > - MacroInfo *NewMI = Prev->back()->getInfo(); > - Prev->pop_back(); > - MD = PP.AllocateDefMacroDirective(NewMI, ImportLoc); > - > - // Install our #undef first so that we don't lose track of it. We'll > replace > - // this with whichever macro definition ends up winning. > - PP.appendMacroDirective(II, Imported); > - } > - > - // We're introducing a macro definition that creates or adds to an > ambiguity. > - // We can resolve that ambiguity if this macro is token-for-token > identical to > - // all of the existing definitions. > - MacroInfo *NewMI = MD->getInfo(); > - assert(NewMI && "macro definition with no MacroInfo?"); > - while (!Prev->empty()) { > - MacroInfo *PrevMI = Prev->back()->getInfo(); > - assert(PrevMI && "macro definition with no MacroInfo?"); > - > - // Before marking the macros as ambiguous, check if this is a case where > - // both macros are in system headers. If so, we trust that the system > - // did not get it wrong. This also handles cases where Clang's own > - // headers have a different spelling of certain system macros: > - // #define LONG_MAX __LONG_MAX__ (clang's limits.h) > - // #define LONG_MAX 0x7fffffffffffffffL (system's limits.h) > - // > - // FIXME: Remove the defined-in-system-headers check. clang's limits.h > - // overrides the system limits.h's macros, so there's no conflict here. > - if (NewMI != PrevMI && > - !PrevMI->isIdenticalTo(*NewMI, PP, /*Syntactically=*/true) && > - !areDefinedInSystemModules(PrevMI, NewMI, Owner, *this)) > - break; > - > - // The previous definition is the same as this one (or both are defined > in > - // system modules so we can assume they're equivalent); we don't need to > - // track it any more. > - Prev->pop_back(); > - } > - > - if (!Prev->empty()) > - MD->setAmbiguous(true); > - > - PP.appendMacroDirective(II, MD); > -} > - > ASTReader::InputFileInfo > ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { > // Go find this input file. > @@ -3422,7 +3236,7 @@ void ASTReader::makeNamesVisible(const H > "nothing to make visible?"); > > // FIXME: Only do this if Owner->NameVisibility == AllVisible. > - for (Decl *D : Names.HiddenDecls) { > + for (Decl *D : Names) { > bool wasHidden = D->Hidden; > D->Hidden = false; > > @@ -3432,9 +3246,6 @@ void ASTReader::makeNamesVisible(const H > } > } > } > - > - for (const auto &Macro : Names.HiddenMacros) > - installImportedMacro(Macro.first, *Macro.second, Owner); > } > > void ASTReader::makeModuleVisible(Module *Mod, > > Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Apr 29 18:20:19 2015 > @@ -474,7 +474,7 @@ void ASTDeclReader::VisitDecl(Decl *D) { > > // Note that this declaration was hidden because its owning module > is > // not yet visible. > - Reader.HiddenNamesMap[Owner].HiddenDecls.push_back(D); > + Reader.HiddenNamesMap[Owner].push_back(D); > } > } > } > @@ -1402,8 +1402,8 @@ void ASTDeclReader::MergeDefinitionData( > else { > auto SubmoduleID = MergeDD.Definition->getOwningModuleID(); > assert(SubmoduleID && "hidden definition in no module"); > - Reader.HiddenNamesMap[Reader.getSubmodule(SubmoduleID)] > - .HiddenDecls.push_back(DD.Definition); > + Reader.HiddenNamesMap[Reader.getSubmodule(SubmoduleID)].push_back( > + DD.Definition); > } > } > } > @@ -3816,7 +3816,7 @@ void ASTDeclReader::UpdateDecl(Decl *D, > if (Owner && Owner->NameVisibility != Module::AllVisible) { > // If Owner is made visible at some later point, make this declaration > // visible too. > - Reader.HiddenNamesMap[Owner].HiddenDecls.push_back(D); > + Reader.HiddenNamesMap[Owner].push_back(D); > } else { > // The declaration is now visible. > D->Hidden = false; > > Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original) > +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Apr 29 18:20:19 2015 > @@ -2050,7 +2050,7 @@ void ASTWriter::WritePreprocessor(const > // If the macro or identifier need no updates, don't write the macro > history > // for this one. > // FIXME: Chain the macro history instead of re-writing it. > - if (MD->isFromPCH() && > + if (MD && MD->isFromPCH() && > Name->isFromAST() && !Name->hasChangedSinceDeserialization()) > continue; > > > Modified: cfe/trunk/test/Index/complete-macros.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-macros.c?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/test/Index/complete-macros.c (original) > +++ cfe/trunk/test/Index/complete-macros.c Wed Apr 29 18:20:19 2015 > @@ -28,7 +28,7 @@ void test_variadic() { > // RUN: c-index-test -code-completion-at=%s:7:1 %s -I%S | FileCheck > -check-prefix=CHECK-CC0 %s > // CHECK-CC0-NOT: FOO > // RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test > -code-completion-at=%s:7:1 %s -I%S | FileCheck -check-prefix=CHECK-CC1 %s > -// CHECK-CC1: macro definition:{TypedText FOO}{LeftParen (}{Placeholder > Arg1}{Comma , }{Placeholder Arg2}{RightParen )} > +// CHECK-CC1: macro definition:{TypedText FOO} (70) > // RUN: c-index-test -code-completion-at=%s:13:13 %s -I%S | FileCheck > -check-prefix=CHECK-CC2 %s > // RUN: c-index-test -code-completion-at=%s:14:8 %s -I%S | FileCheck > -check-prefix=CHECK-CC2 %s > // RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test > -code-completion-at=%s:14:8 %s -I%S | FileCheck -check-prefix=CHECK-CC2 %s > > Modified: cfe/trunk/test/Modules/macros.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macros.c?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/test/Modules/macros.c (original) > +++ cfe/trunk/test/Modules/macros.c Wed Apr 29 18:20:19 2015 > @@ -13,6 +13,7 @@ > // expected-note@Inputs/macros_right.h:12{{expanding this definition of > 'LEFT_RIGHT_DIFFERENT'}} > // expected-note@Inputs/macros_right.h:13{{expanding this definition of > 'LEFT_RIGHT_DIFFERENT2'}} > // expected-note@Inputs/macros_left.h:14{{other definition of > 'LEFT_RIGHT_DIFFERENT'}} > +// expected-note@Inputs/macros_left.h:11{{other definition of > 'LEFT_RIGHT_DIFFERENT2'}} > > @import macros; > > > Modified: cfe/trunk/tools/libclang/CIndex.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=236176&r1=236175&r2=236176&view=diff > ============================================================================== > --- cfe/trunk/tools/libclang/CIndex.cpp (original) > +++ cfe/trunk/tools/libclang/CIndex.cpp Wed Apr 29 18:20:19 2015 > @@ -7144,7 +7144,7 @@ MacroInfo *cxindex::getMacroInfo(const I > > 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()) > { > @@ -7201,7 +7201,7 @@ MacroDefinition *cxindex::checkForMacroI > 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; > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
