Update clang to r339409b.
Change-Id: Ied8a188bb072c40035320acedc86164b66d920af
diff --git a/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h b/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
index fdf3d4b..778907b 100644
--- a/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
+++ b/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
@@ -23,6 +23,7 @@
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/TinyPtrVector.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/Allocator.h"
@@ -99,6 +100,22 @@
}
};
+inline const char *getHotnessName(CalleeInfo::HotnessType HT) {
+ switch (HT) {
+ case CalleeInfo::HotnessType::Unknown:
+ return "unknown";
+ case CalleeInfo::HotnessType::Cold:
+ return "cold";
+ case CalleeInfo::HotnessType::None:
+ return "none";
+ case CalleeInfo::HotnessType::Hot:
+ return "hot";
+ case CalleeInfo::HotnessType::Critical:
+ return "critical";
+ }
+ llvm_unreachable("invalid hotness");
+}
+
class GlobalValueSummary;
using GlobalValueSummaryList = std::vector<std::unique_ptr<GlobalValueSummary>>;
@@ -737,6 +754,11 @@
/// a particular module, and provide efficient access to their summary.
using GVSummaryMapTy = DenseMap<GlobalValue::GUID, GlobalValueSummary *>;
+/// Map of a type GUID to type id string and summary (multimap used
+/// in case of GUID conflicts).
+using TypeIdSummaryMapTy =
+ std::multimap<GlobalValue::GUID, std::pair<std::string, TypeIdSummary>>;
+
/// Class to hold module path string table and global value map,
/// and encapsulate methods for operating on them.
class ModuleSummaryIndex {
@@ -748,9 +770,9 @@
/// Holds strings for combined index, mapping to the corresponding module ID.
ModulePathStringTableTy ModulePathStringTable;
- /// Mapping from type identifiers to summary information for that type
- /// identifier.
- std::map<std::string, TypeIdSummary> TypeIdMap;
+ /// Mapping from type identifier GUIDs to type identifier and its summary
+ /// information.
+ TypeIdSummaryMapTy TypeIdMap;
/// Mapping from original ID to GUID. If original ID can map to multiple
/// GUIDs, it will be mapped to 0.
@@ -1063,23 +1085,29 @@
return ModulePathStringTable.count(M.getModuleIdentifier());
}
- const std::map<std::string, TypeIdSummary> &typeIds() const {
- return TypeIdMap;
- }
+ const TypeIdSummaryMapTy &typeIds() const { return TypeIdMap; }
- /// This accessor should only be used when exporting because it can mutate the
- /// map.
+ /// Return an existing or new TypeIdSummary entry for \p TypeId.
+ /// This accessor can mutate the map and therefore should not be used in
+ /// the ThinLTO backends.
TypeIdSummary &getOrInsertTypeIdSummary(StringRef TypeId) {
- return TypeIdMap[TypeId];
+ auto TidIter = TypeIdMap.equal_range(GlobalValue::getGUID(TypeId));
+ for (auto It = TidIter.first; It != TidIter.second; ++It)
+ if (It->second.first == TypeId)
+ return It->second.second;
+ auto It = TypeIdMap.insert(
+ {GlobalValue::getGUID(TypeId), {TypeId, TypeIdSummary()}});
+ return It->second.second;
}
/// This returns either a pointer to the type id summary (if present in the
/// summary map) or null (if not present). This may be used when importing.
const TypeIdSummary *getTypeIdSummary(StringRef TypeId) const {
- auto I = TypeIdMap.find(TypeId);
- if (I == TypeIdMap.end())
- return nullptr;
- return &I->second;
+ auto TidIter = TypeIdMap.equal_range(GlobalValue::getGUID(TypeId));
+ for (auto It = TidIter.first; It != TidIter.second; ++It)
+ if (It->second.first == TypeId)
+ return &It->second.second;
+ return nullptr;
}
/// Collect for the given module the list of functions it defines