Index: clang/include/clang/Basic/SourceLocation.h =================================================================== --- clang/include/clang/Basic/SourceLocation.h +++ clang/include/clang/Basic/SourceLocation.h @@ -175,6 +175,10 @@ End.isFileID(); } + unsigned getHashValue() const { + return ID * 37U; + } + void print(raw_ostream &OS, const SourceManager &SM) const; std::string printToString(const SourceManager &SM) const; void dump(const SourceManager &SM) const; @@ -463,6 +467,28 @@ } }; + /// Define DenseMapInfo so that SourceLocation's can be used as keys in + /// DenseMap and DenseSet. This trait class is eqivalent to + /// DenseMapInfo which uses SourceLocation::ID is used as a key. + template <> + struct DenseMapInfo { + static clang::SourceLocation getEmptyKey() { + return clang::SourceLocation::getFromRawEncoding(~0U); + } + + static clang::SourceLocation getTombstoneKey() { + return clang::SourceLocation::getFromRawEncoding(~0U - 1); + } + + static unsigned getHashValue(clang::SourceLocation Loc) { + return Loc.getHashValue(); + } + + static bool isEqual(clang::SourceLocation LHS, clang::SourceLocation RHS) { + return LHS == RHS; + } + }; + // Teach SmallPtrSet how to handle SourceLocation. template<> struct PointerLikeTypeTraits { Index: clang/include/clang/Edit/EditedSource.h =================================================================== --- clang/include/clang/Edit/EditedSource.h +++ clang/include/clang/Edit/EditedSource.h @@ -62,7 +62,7 @@ } }; - llvm::DenseMap> ExpansionToArgMap; + llvm::DenseMap> ExpansionToArgMap; SmallVector, 2> CurrCommitMacroArgExps; Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -11711,7 +11711,7 @@ static unsigned getHashValue(const FunctionDeclAndLoc &FDL) { return hash_combine(FDBaseInfo::getHashValue(FDL.FD), - FDL.Loc.getRawEncoding()); + FDL.Loc.getHashValue()); } static bool isEqual(const FunctionDeclAndLoc &LHS, Index: clang/include/clang/Tooling/Syntax/Tokens.h =================================================================== --- clang/include/clang/Tooling/Syntax/Tokens.h +++ clang/include/clang/Tooling/Syntax/Tokens.h @@ -348,7 +348,7 @@ /// the stack) and not when they end (when we pop a macro from the stack). /// To workaround this limitation, we rely on source location information /// stored in this map. - using PPExpansions = llvm::DenseMap; + using PPExpansions = llvm::DenseMap; class Builder; class CollectPPExpansions; Index: clang/lib/ARCMigrate/TransGCAttrs.cpp =================================================================== --- clang/lib/ARCMigrate/TransGCAttrs.cpp +++ clang/lib/ARCMigrate/TransGCAttrs.cpp @@ -88,8 +88,8 @@ return false; SourceLocation Loc = OwnershipAttr->getLocation(); - unsigned RawLoc = Loc.getRawEncoding(); - if (MigrateCtx.AttrSet.count(RawLoc)) + SourceLocation OrigLoc = Loc; + if (MigrateCtx.AttrSet.count(OrigLoc)) return true; ASTContext &Ctx = MigrateCtx.Pass.Ctx; @@ -105,7 +105,7 @@ else return false; - MigrateCtx.AttrSet.insert(RawLoc); + MigrateCtx.AttrSet.insert(OrigLoc); MigrateCtx.GCAttrs.push_back(MigrationContext::GCAttrOccurrence()); MigrationContext::GCAttrOccurrence &Attr = MigrateCtx.GCAttrs.back(); @@ -204,7 +204,7 @@ if (!canApplyWeak(MigrateCtx.Pass.Ctx, Attr.ModifiedType, /*AllowOnUnknownClass=*/true)) { Transaction Trans(TA); - if (!MigrateCtx.RemovedAttrSet.count(Attr.Loc.getRawEncoding())) + if (!MigrateCtx.RemovedAttrSet.count(Attr.Loc)) TA.replaceText(Attr.Loc, "__weak", "__unsafe_unretained"); TA.clearDiagnostic(diag::err_arc_weak_no_runtime, diag::err_arc_unsupported_weak_class, @@ -263,7 +263,7 @@ if (GCAttrsCollector::hasObjCImpl( cast(IndProps.front()->getDeclContext()))) { if (hasWeak) - MigrateCtx.AtPropsWeak.insert(AtLoc.getRawEncoding()); + MigrateCtx.AtPropsWeak.insert(AtLoc); } else { StringRef toAttr = "strong"; @@ -290,14 +290,14 @@ TA.clearDiagnostic(diag::err_objc_property_attr_mutually_exclusive, AtLoc); TA.clearDiagnostic(diag::err_arc_inconsistent_property_ownership, ATLs[i].second->getLocation()); - MigrateCtx.RemovedAttrSet.insert(Loc.getRawEncoding()); + MigrateCtx.RemovedAttrSet.insert(Loc); } } static void checkAllProps(MigrationContext &MigrateCtx, std::vector &AllProps) { typedef llvm::TinyPtrVector IndivPropsTy; - llvm::DenseMap AtProps; + llvm::DenseMap AtProps; for (unsigned i = 0, e = AllProps.size(); i != e; ++i) { ObjCPropertyDecl *PD = AllProps[i]; @@ -307,14 +307,12 @@ SourceLocation AtLoc = PD->getAtLoc(); if (AtLoc.isInvalid()) continue; - unsigned RawAt = AtLoc.getRawEncoding(); - AtProps[RawAt].push_back(PD); + AtProps[AtLoc].push_back(PD); } } - for (llvm::DenseMap::iterator - I = AtProps.begin(), E = AtProps.end(); I != E; ++I) { - SourceLocation AtLoc = SourceLocation::getFromRawEncoding(I->first); + for (auto I = AtProps.begin(), E = AtProps.end(); I != E; ++I) { + SourceLocation AtLoc = I->first; IndivPropsTy &IndProps = I->second; checkAllAtProps(MigrateCtx, AtLoc, IndProps); } Index: clang/lib/ARCMigrate/TransProperties.cpp =================================================================== --- clang/lib/ARCMigrate/TransProperties.cpp +++ clang/lib/ARCMigrate/TransProperties.cpp @@ -65,7 +65,7 @@ }; typedef SmallVector PropsTy; - typedef std::map AtPropDeclsTy; + typedef std::map AtPropDeclsTy; AtPropDeclsTy AtProps; llvm::DenseMap ActionOnProp; @@ -76,13 +76,13 @@ static void collectProperties(ObjCContainerDecl *D, AtPropDeclsTy &AtProps, AtPropDeclsTy *PrevAtProps = nullptr) { for (auto *Prop : D->instance_properties()) { - if (Prop->getAtLoc().isInvalid()) + SourceLocation Loc = Prop->getAtLoc(); + if (Loc.isInvalid()) continue; - unsigned RawLoc = Prop->getAtLoc().getRawEncoding(); if (PrevAtProps) - if (PrevAtProps->find(RawLoc) != PrevAtProps->end()) + if (PrevAtProps->find(Loc) != PrevAtProps->end()) continue; - PropsTy &props = AtProps[RawLoc]; + PropsTy &props = AtProps[Loc]; props.push_back(Prop); } } @@ -113,8 +113,7 @@ ObjCIvarDecl *ivarD = implD->getPropertyIvarDecl(); if (!ivarD || ivarD->isInvalidDecl()) continue; - unsigned rawAtLoc = propD->getAtLoc().getRawEncoding(); - AtPropDeclsTy::iterator findAtLoc = AtProps.find(rawAtLoc); + AtPropDeclsTy::iterator findAtLoc = AtProps.find(propD->getAtLoc()); if (findAtLoc == AtProps.end()) continue; @@ -130,7 +129,7 @@ for (AtPropDeclsTy::iterator I = AtProps.begin(), E = AtProps.end(); I != E; ++I) { - SourceLocation atLoc = SourceLocation::getFromRawEncoding(I->first); + SourceLocation atLoc = I->first; PropsTy &props = I->second; if (!getPropertyType(props)->isObjCRetainableType()) continue; @@ -335,7 +334,7 @@ return false; if (props.empty()) return false; - return MigrateCtx.AtPropsWeak.count(atLoc.getRawEncoding()); + return MigrateCtx.AtPropsWeak.count(atLoc); } bool isUserDeclared(ObjCIvarDecl *ivarD) const { Index: clang/lib/ARCMigrate/Transforms.h =================================================================== --- clang/lib/ARCMigrate/Transforms.h +++ clang/lib/ARCMigrate/Transforms.h @@ -93,12 +93,12 @@ bool FullyMigratable; }; std::vector GCAttrs; - llvm::DenseSet AttrSet; - llvm::DenseSet RemovedAttrSet; + llvm::DenseSet AttrSet; + llvm::DenseSet RemovedAttrSet; /// Set of raw '@' locations for 'assign' properties group that contain /// GC __weak. - llvm::DenseSet AtPropsWeak; + llvm::DenseSet AtPropsWeak; explicit MigrationContext(MigrationPass &pass) : Pass(pass) {} ~MigrationContext(); Index: clang/lib/CodeGen/CGOpenMPRuntime.h =================================================================== --- clang/lib/CodeGen/CGOpenMPRuntime.h +++ clang/lib/CodeGen/CGOpenMPRuntime.h @@ -329,7 +329,7 @@ QualType IdentQTy; llvm::StructType *IdentTy = nullptr; /// Map for SourceLocation and OpenMP runtime library debug locations. - typedef llvm::DenseMap OpenMPDebugLocMapTy; + typedef llvm::DenseMap OpenMPDebugLocMapTy; OpenMPDebugLocMapTy OpenMPDebugLocMap; /// The type for a microtask which gets passed to __kmpc_fork_call(). /// Original representation is: Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp =================================================================== --- clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1662,7 +1662,7 @@ LValue PSource = CGF.EmitLValueForField(Base, *std::next(Fields, IdentField_PSource)); - llvm::Value *OMPDebugLoc = OpenMPDebugLocMap.lookup(Loc.getRawEncoding()); + llvm::Value *OMPDebugLoc = OpenMPDebugLocMap.lookup(Loc); if (OMPDebugLoc == nullptr) { SmallString<128> Buffer2; llvm::raw_svector_ostream OS2(Buffer2); @@ -1673,7 +1673,7 @@ OS2 << FD->getQualifiedNameAsString(); OS2 << ";" << PLoc.getLine() << ";" << PLoc.getColumn() << ";;"; OMPDebugLoc = CGF.Builder.CreateGlobalStringPtr(OS2.str()); - OpenMPDebugLocMap[Loc.getRawEncoding()] = OMPDebugLoc; + OpenMPDebugLocMap[Loc] = OMPDebugLoc; } // *psource = ";;;;;;"; CGF.EmitStoreOfScalar(OMPDebugLoc, PSource); Index: clang/lib/Edit/EditedSource.cpp =================================================================== --- clang/lib/Edit/EditedSource.cpp +++ clang/lib/Edit/EditedSource.cpp @@ -59,7 +59,7 @@ SourceLocation ExpLoc; MacroArgUse ArgUse; std::tie(ExpLoc, ArgUse) = ExpArg; - auto &ArgUses = ExpansionToArgMap[ExpLoc.getRawEncoding()]; + auto &ArgUses = ExpansionToArgMap[ExpLoc]; if (llvm::find(ArgUses, ArgUse) == ArgUses.end()) ArgUses.push_back(ArgUse); } @@ -82,7 +82,7 @@ SourceLocation ExpLoc; MacroArgUse ArgUse; deconstructMacroArgLoc(OrigLoc, ExpLoc, ArgUse); - auto I = ExpansionToArgMap.find(ExpLoc.getRawEncoding()); + auto I = ExpansionToArgMap.find(ExpLoc); if (I != ExpansionToArgMap.end() && find_if(I->second, [&](const MacroArgUse &U) { return ArgUse.Identifier == U.Identifier && Index: clang/lib/Frontend/Rewrite/InclusionRewriter.cpp =================================================================== --- clang/lib/Frontend/Rewrite/InclusionRewriter.cpp +++ clang/lib/Frontend/Rewrite/InclusionRewriter.cpp @@ -44,13 +44,13 @@ bool ShowLineMarkers; ///< Show #line markers. bool UseLineDirectives; ///< Use of line directives or line markers. /// Tracks where inclusions that change the file are found. - std::map FileIncludes; + std::map FileIncludes; /// Tracks where inclusions that import modules are found. - std::map ModuleIncludes; + std::map ModuleIncludes; /// Tracks where inclusions that enter modules (in a module build) are found. - std::map ModuleEntryIncludes; + std::map ModuleEntryIncludes; /// Tracks where #if and #elif directives get evaluated and whether to true. - std::map IfConditions; + std::map IfConditions; /// Used transitively for building up the FileIncludes mapping over the /// various \c PPCallbacks callbacks. SourceLocation LastInclusionLocation; @@ -65,7 +65,7 @@ void detectMainFileEOL(); void handleModuleBegin(Token &Tok) { assert(Tok.getKind() == tok::annot_module_begin); - ModuleEntryIncludes.insert({Tok.getLocation().getRawEncoding(), + ModuleEntryIncludes.insert({Tok.getLocation(), (Module *)Tok.getAnnotationValue()}); } private: @@ -164,7 +164,7 @@ return; FileID Id = FullSourceLoc(Loc, SM).getFileID(); auto P = FileIncludes.insert( - std::make_pair(LastInclusionLocation.getRawEncoding(), + std::make_pair(LastInclusionLocation, IncludedFile(Id, NewFileType, PP.GetCurDirLookup()))); (void)P; assert(P.second && "Unexpected revisitation of the same include directive"); @@ -199,8 +199,7 @@ const Module *Imported, SrcMgr::CharacteristicKind FileType){ if (Imported) { - auto P = ModuleIncludes.insert( - std::make_pair(HashLoc.getRawEncoding(), Imported)); + auto P = ModuleIncludes.insert(std::make_pair(HashLoc, Imported)); (void)P; assert(P.second && "Unexpected revisitation of the same include directive"); } else @@ -209,8 +208,7 @@ void InclusionRewriter::If(SourceLocation Loc, SourceRange ConditionRange, ConditionValueKind ConditionValue) { - auto P = IfConditions.insert( - std::make_pair(Loc.getRawEncoding(), ConditionValue == CVK_True)); + auto P = IfConditions.insert(std::make_pair(Loc, ConditionValue == CVK_True)); (void)P; assert(P.second && "Unexpected revisitation of the same if directive"); } @@ -218,8 +216,7 @@ void InclusionRewriter::Elif(SourceLocation Loc, SourceRange ConditionRange, ConditionValueKind ConditionValue, SourceLocation IfLoc) { - auto P = IfConditions.insert( - std::make_pair(Loc.getRawEncoding(), ConditionValue == CVK_True)); + auto P = IfConditions.insert(std::make_pair(Loc, ConditionValue == CVK_True)); (void)P; assert(P.second && "Unexpected revisitation of the same elif directive"); } @@ -228,7 +225,7 @@ /// an inclusion directive) in the map of inclusion information, FileChanges. const InclusionRewriter::IncludedFile * InclusionRewriter::FindIncludeAtLocation(SourceLocation Loc) const { - const auto I = FileIncludes.find(Loc.getRawEncoding()); + const auto I = FileIncludes.find(Loc); if (I != FileIncludes.end()) return &I->second; return nullptr; @@ -238,7 +235,7 @@ /// an inclusion directive) in the map of module inclusion information. const Module * InclusionRewriter::FindModuleAtLocation(SourceLocation Loc) const { - const auto I = ModuleIncludes.find(Loc.getRawEncoding()); + const auto I = ModuleIncludes.find(Loc); if (I != ModuleIncludes.end()) return I->second; return nullptr; @@ -248,14 +245,14 @@ /// an inclusion directive) in the map of module entry information. const Module * InclusionRewriter::FindEnteredModule(SourceLocation Loc) const { - const auto I = ModuleEntryIncludes.find(Loc.getRawEncoding()); + const auto I = ModuleEntryIncludes.find(Loc); if (I != ModuleEntryIncludes.end()) return I->second; return nullptr; } bool InclusionRewriter::IsIfAtLocationTrue(SourceLocation Loc) const { - const auto I = IfConditions.find(Loc.getRawEncoding()); + const auto I = IfConditions.find(Loc); if (I != IfConditions.end()) return I->second; return false; Index: clang/lib/Tooling/Syntax/Tokens.cpp =================================================================== --- clang/lib/Tooling/Syntax/Tokens.cpp +++ clang/lib/Tooling/Syntax/Tokens.cpp @@ -297,7 +297,7 @@ Collector->PP.getSourceManager().isBeforeInTranslationUnit( Range.getBegin(), LastExpansionEnd))) return; - Collector->Expansions[Range.getBegin().getRawEncoding()] = Range.getEnd(); + Collector->Expansions[Range.getBegin()] = Range.getEnd(); LastExpansionEnd = Range.getEnd(); } // FIXME: handle directives like #pragma, #include, etc. @@ -524,7 +524,7 @@ auto L = File.SpelledTokens[NextSpelled].location(); if (Offset <= SM.getFileOffset(L)) return llvm::None; // reached the offset we are looking for. - auto Mapping = CollectedExpansions.find(L.getRawEncoding()); + auto Mapping = CollectedExpansions.find(L); if (Mapping != CollectedExpansions.end()) return Mapping->second; // found a mapping before the offset. }