Update clang to r339409.
Change-Id: I800772d2d838223be1f6b40d490c4591b937fca2
diff --git a/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h b/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
index 45f8cd7..fdf3d4b 100644
--- a/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
+++ b/linux-x64/clang/include/llvm/IR/ModuleSummaryIndex.h
@@ -25,8 +25,10 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Module.h"
+#include "llvm/Support/Allocator.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/ScaledNumber.h"
+#include "llvm/Support/StringSaver.h"
#include <algorithm>
#include <array>
#include <cassert>
@@ -47,7 +49,7 @@
} // end namespace yaml
-/// \brief Class to accumulate and hold information about a callee.
+/// Class to accumulate and hold information about a callee.
struct CalleeInfo {
enum class HotnessType : uint8_t {
Unknown = 0,
@@ -103,15 +105,17 @@
struct GlobalValueSummaryInfo {
union NameOrGV {
- NameOrGV(bool IsAnalysis) {
- if (IsAnalysis)
+ NameOrGV(bool HaveGVs) {
+ if (HaveGVs)
GV = nullptr;
else
Name = "";
}
/// The GlobalValue corresponding to this summary. This is only used in
- /// per-module summaries, when module analysis is being run.
+ /// per-module summaries and when the IR is available. E.g. when module
+ /// analysis is being run, or when parsing both the IR and the summary
+ /// from assembly.
const GlobalValue *GV;
/// Summary string representation. This StringRef points to BC module
@@ -122,7 +126,7 @@
StringRef Name;
} U;
- GlobalValueSummaryInfo(bool IsAnalysis) : U(IsAnalysis) {}
+ GlobalValueSummaryInfo(bool HaveGVs) : U(HaveGVs) {}
/// List of global value summary structures for a particular value held
/// in the GlobalValueMap. Requires a vector in the case of multiple
@@ -146,16 +150,16 @@
RefAndFlag;
ValueInfo() = default;
- ValueInfo(bool IsAnalysis, const GlobalValueSummaryMapTy::value_type *R) {
+ ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R) {
RefAndFlag.setPointer(R);
- RefAndFlag.setInt(IsAnalysis);
+ RefAndFlag.setInt(HaveGVs);
}
operator bool() const { return getRef(); }
GlobalValue::GUID getGUID() const { return getRef()->first; }
const GlobalValue *getValue() const {
- assert(isFromAnalysis());
+ assert(haveGVs());
return getRef()->second.U.GV;
}
@@ -164,11 +168,11 @@
}
StringRef name() const {
- return isFromAnalysis() ? getRef()->second.U.GV->getName()
- : getRef()->second.U.Name;
+ return haveGVs() ? getRef()->second.U.GV->getName()
+ : getRef()->second.U.Name;
}
- bool isFromAnalysis() const { return RefAndFlag.getInt(); }
+ bool haveGVs() const { return RefAndFlag.getInt(); }
const GlobalValueSummaryMapTy::value_type *getRef() const {
return RefAndFlag.getPointer();
@@ -177,16 +181,23 @@
bool isDSOLocal() const;
};
+inline raw_ostream &operator<<(raw_ostream &OS, const ValueInfo &VI) {
+ OS << VI.getGUID();
+ if (!VI.name().empty())
+ OS << " (" << VI.name() << ")";
+ return OS;
+}
+
inline bool operator==(const ValueInfo &A, const ValueInfo &B) {
assert(A.getRef() && B.getRef() &&
- "Need ValueInfo with non-null Ref to compare GUIDs");
+ "Need ValueInfo with non-null Ref for comparison");
return A.getRef() == B.getRef();
}
inline bool operator!=(const ValueInfo &A, const ValueInfo &B) {
assert(A.getRef() && B.getRef() &&
- "Need ValueInfo with non-null Ref to compare GUIDs");
- return A.getGUID() != B.getGUID();
+ "Need ValueInfo with non-null Ref for comparison");
+ return A.getRef() != B.getRef();
}
inline bool operator<(const ValueInfo &A, const ValueInfo &B) {
@@ -209,25 +220,24 @@
}
static bool isEqual(ValueInfo L, ValueInfo R) {
- // We are not supposed to mix ValueInfo(s) with different analysis flag
+ // We are not supposed to mix ValueInfo(s) with different HaveGVs flag
// in a same container.
- assert(isSpecialKey(L) || isSpecialKey(R) ||
- (L.isFromAnalysis() == R.isFromAnalysis()));
+ assert(isSpecialKey(L) || isSpecialKey(R) || (L.haveGVs() == R.haveGVs()));
return L.getRef() == R.getRef();
}
static unsigned getHashValue(ValueInfo I) { return (uintptr_t)I.getRef(); }
};
-/// \brief Function and variable summary information to aid decisions and
+/// Function and variable summary information to aid decisions and
/// implementation of importing.
class GlobalValueSummary {
public:
- /// \brief Sububclass discriminator (for dyn_cast<> et al.)
+ /// Sububclass discriminator (for dyn_cast<> et al.)
enum SummaryKind : unsigned { AliasKind, FunctionKind, GlobalVarKind };
/// Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
struct GVFlags {
- /// \brief The linkage type of the associated global value.
+ /// The linkage type of the associated global value.
///
/// One use is to flag values that have local linkage types and need to
/// have module identifier appended before placing into the combined
@@ -269,7 +279,7 @@
/// GUID includes the module level id in the hash.
GlobalValue::GUID OriginalName = 0;
- /// \brief Path of module IR containing value's definition, used to locate
+ /// Path of module IR containing value's definition, used to locate
/// module during importing.
///
/// This is only used during parsing of the combined index, or when
@@ -296,7 +306,7 @@
/// Returns the hash of the original name, it is identical to the GUID for
/// externally visible symbols, but not for local ones.
- GlobalValue::GUID getOriginalName() { return OriginalName; }
+ GlobalValue::GUID getOriginalName() const { return OriginalName; }
/// Initialize the original name hash in this summary.
void setOriginalName(GlobalValue::GUID Name) { OriginalName = Name; }
@@ -312,7 +322,7 @@
StringRef modulePath() const { return ModulePath; }
/// Get the flags for this GlobalValue (see \p struct GVFlags).
- GVFlags flags() { return Flags; }
+ GVFlags flags() const { return Flags; }
/// Return linkage type recorded for this global value.
GlobalValue::LinkageTypes linkage() const {
@@ -350,7 +360,7 @@
friend class ModuleSummaryIndex;
};
-/// \brief Alias summary information.
+/// Alias summary information.
class AliasSummary : public GlobalValueSummary {
GlobalValueSummary *AliaseeSummary;
// AliaseeGUID is only set and accessed when we are building a combined index
@@ -370,6 +380,8 @@
void setAliasee(GlobalValueSummary *Aliasee) { AliaseeSummary = Aliasee; }
void setAliaseeGUID(GlobalValue::GUID GUID) { AliaseeGUID = GUID; }
+ bool hasAliasee() const { return !!AliaseeSummary; }
+
const GlobalValueSummary &getAliasee() const {
assert(AliaseeSummary && "Unexpected missing aliasee summary");
return *AliaseeSummary;
@@ -397,13 +409,20 @@
return this;
}
-/// \brief Function summary information to aid decisions and implementation of
+/// Function summary information to aid decisions and implementation of
/// importing.
class FunctionSummary : public GlobalValueSummary {
public:
/// <CalleeValueInfo, CalleeInfo> call edge pair.
using EdgeTy = std::pair<ValueInfo, CalleeInfo>;
+ /// Types for -force-summary-edges-cold debugging option.
+ enum ForceSummaryHotnessType : unsigned {
+ FSHT_None,
+ FSHT_AllNonCritical,
+ FSHT_All
+ };
+
/// An "identifier" for a virtual function. This contains the type identifier
/// represented as a GUID and the offset from the address point to the virtual
/// function pointer, where "address point" is as defined in the Itanium ABI:
@@ -421,6 +440,26 @@
std::vector<uint64_t> Args;
};
+ /// All type identifier related information. Because these fields are
+ /// relatively uncommon we only allocate space for them if necessary.
+ struct TypeIdInfo {
+ /// List of type identifiers used by this function in llvm.type.test
+ /// intrinsics referenced by something other than an llvm.assume intrinsic,
+ /// represented as GUIDs.
+ std::vector<GlobalValue::GUID> TypeTests;
+
+ /// List of virtual calls made by this function using (respectively)
+ /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics that do
+ /// not have all constant integer arguments.
+ std::vector<VFuncId> TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
+
+ /// List of virtual calls made by this function using (respectively)
+ /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics with
+ /// all constant integer arguments.
+ std::vector<ConstVCall> TypeTestAssumeConstVCalls,
+ TypeCheckedLoadConstVCalls;
+ };
+
/// Function attribute flags. Used to track if a function accesses memory,
/// recurses or aliases.
struct FFlags {
@@ -461,25 +500,6 @@
/// List of <CalleeValueInfo, CalleeInfo> call edge pairs from this function.
std::vector<EdgeTy> CallGraphEdgeList;
- /// All type identifier related information. Because these fields are
- /// relatively uncommon we only allocate space for them if necessary.
- struct TypeIdInfo {
- /// List of type identifiers used by this function in llvm.type.test
- /// intrinsics other than by an llvm.assume intrinsic, represented as GUIDs.
- std::vector<GlobalValue::GUID> TypeTests;
-
- /// List of virtual calls made by this function using (respectively)
- /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics that do
- /// not have all constant integer arguments.
- std::vector<VFuncId> TypeTestAssumeVCalls, TypeCheckedLoadVCalls;
-
- /// List of virtual calls made by this function using (respectively)
- /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics with
- /// all constant integer arguments.
- std::vector<ConstVCall> TypeTestAssumeConstVCalls,
- TypeCheckedLoadConstVCalls;
- };
-
std::unique_ptr<TypeIdInfo> TIdInfo;
public:
@@ -509,7 +529,7 @@
}
/// Get function attribute flags.
- FFlags &fflags() { return FunFlags; }
+ FFlags fflags() const { return FunFlags; }
/// Get the instruction count recorded for this function.
unsigned instCount() const { return InstCount; }
@@ -569,6 +589,8 @@
TIdInfo->TypeTests.push_back(Guid);
}
+ const TypeIdInfo *getTypeIdInfo() const { return TIdInfo.get(); };
+
friend struct GraphTraits<ValueInfo>;
};
@@ -606,7 +628,7 @@
}
};
-/// \brief Global variable summary information to aid decisions and
+/// Global variable summary information to aid decisions and
/// implementation of importing.
///
/// Currently this doesn't add anything to the base \p GlobalValueSummary,
@@ -746,28 +768,34 @@
/// valid object file.
bool SkipModuleByDistributedBackend = false;
- /// If true then we're performing analysis of IR module, filling summary
- /// accordingly. The value of 'false' means we're reading summary from
- /// BC or YAML source. Affects the type of value stored in NameOrGV union
- bool IsAnalysis;
+ /// If true then we're performing analysis of IR module, or parsing along with
+ /// the IR from assembly. The value of 'false' means we're reading summary
+ /// from BC or YAML source. Affects the type of value stored in NameOrGV
+ /// union.
+ bool HaveGVs;
std::set<std::string> CfiFunctionDefs;
std::set<std::string> CfiFunctionDecls;
+ // Used in cases where we want to record the name of a global, but
+ // don't have the string owned elsewhere (e.g. the Strtab on a module).
+ StringSaver Saver;
+ BumpPtrAllocator Alloc;
+
// YAML I/O support.
friend yaml::MappingTraits<ModuleSummaryIndex>;
GlobalValueSummaryMapTy::value_type *
getOrInsertValuePtr(GlobalValue::GUID GUID) {
- return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo(IsAnalysis)).first;
+ return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo(HaveGVs))
+ .first;
}
public:
- // See IsAnalysis variable comment.
- ModuleSummaryIndex(bool IsPerformingAnalysis)
- : IsAnalysis(IsPerformingAnalysis) {}
+ // See HaveGVs variable comment.
+ ModuleSummaryIndex(bool HaveGVs) : HaveGVs(HaveGVs), Saver(Alloc) {}
- bool isPerformingAnalysis() const { return IsAnalysis; }
+ bool haveGVs() const { return HaveGVs; }
gvsummary_iterator begin() { return GlobalValueMap.begin(); }
const_gvsummary_iterator begin() const { return GlobalValueMap.begin(); }
@@ -820,7 +848,7 @@
if (!S.second.SummaryList.size() ||
!isa<FunctionSummary>(S.second.SummaryList.front().get()))
continue;
- discoverNodes(ValueInfo(IsAnalysis, &S), FunctionHasParent);
+ discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent);
}
std::vector<FunctionSummary::EdgeTy> Edges;
@@ -857,31 +885,42 @@
}
bool isGUIDLive(GlobalValue::GUID GUID) const;
+ /// Return a ValueInfo for the index value_type (convenient when iterating
+ /// index).
+ ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const {
+ return ValueInfo(HaveGVs, &R);
+ }
+
/// Return a ValueInfo for GUID if it exists, otherwise return ValueInfo().
ValueInfo getValueInfo(GlobalValue::GUID GUID) const {
auto I = GlobalValueMap.find(GUID);
- return ValueInfo(IsAnalysis, I == GlobalValueMap.end() ? nullptr : &*I);
+ return ValueInfo(HaveGVs, I == GlobalValueMap.end() ? nullptr : &*I);
}
/// Return a ValueInfo for \p GUID.
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID) {
- return ValueInfo(IsAnalysis, getOrInsertValuePtr(GUID));
+ return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID));
}
+ // Save a string in the Index. Use before passing Name to
+ // getOrInsertValueInfo when the string isn't owned elsewhere (e.g. on the
+ // module's Strtab).
+ StringRef saveString(std::string String) { return Saver.save(String); }
+
/// Return a ValueInfo for \p GUID setting value \p Name.
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID, StringRef Name) {
- assert(!IsAnalysis);
+ assert(!HaveGVs);
auto VP = getOrInsertValuePtr(GUID);
VP->second.U.Name = Name;
- return ValueInfo(IsAnalysis, VP);
+ return ValueInfo(HaveGVs, VP);
}
/// Return a ValueInfo for \p GV and mark it as belonging to GV.
ValueInfo getOrInsertValueInfo(const GlobalValue *GV) {
- assert(IsAnalysis);
+ assert(HaveGVs);
auto VP = getOrInsertValuePtr(GV->getGUID());
VP->second.U.GV = GV;
- return ValueInfo(IsAnalysis, VP);
+ return ValueInfo(HaveGVs, VP);
}
/// Return the GUID for \p OriginalId in the OidGuidMap.
@@ -896,6 +935,12 @@
std::set<std::string> &cfiFunctionDecls() { return CfiFunctionDecls; }
const std::set<std::string> &cfiFunctionDecls() const { return CfiFunctionDecls; }
+ /// Add a global value summary for a value.
+ void addGlobalValueSummary(const GlobalValue &GV,
+ std::unique_ptr<GlobalValueSummary> Summary) {
+ addGlobalValueSummary(getOrInsertValueInfo(&GV), std::move(Summary));
+ }
+
/// Add a global value summary for a value of the given name.
void addGlobalValueSummary(StringRef ValueName,
std::unique_ptr<GlobalValueSummary> Summary) {
@@ -947,8 +992,7 @@
GlobalValueSummary *getGlobalValueSummary(const GlobalValue &GV,
bool PerModuleIndex = true) const {
assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
- return getGlobalValueSummary(GlobalValue::getGUID(GV.getName()),
- PerModuleIndex);
+ return getGlobalValueSummary(GV.getGUID(), PerModuleIndex);
}
/// Returns the first GlobalValueSummary for \p ValueGUID, asserting that
@@ -1005,6 +1049,13 @@
return &*ModulePathStringTable.insert({ModPath, {ModId, Hash}}).first;
}
+ /// Return module entry for module with the given \p ModPath.
+ ModuleInfo *getModule(StringRef ModPath) {
+ auto It = ModulePathStringTable.find(ModPath);
+ assert(It != ModulePathStringTable.end() && "Module not registered");
+ return &*It;
+ }
+
/// Check if the given Module has any functions available for exporting
/// in the index. We consider any module present in the ModulePathStringTable
/// to have exported functions.
@@ -1031,7 +1082,7 @@
return &I->second;
}
- /// Collect for the given module the list of function it defines
+ /// Collect for the given module the list of functions it defines
/// (GUID -> Summary).
void collectDefinedFunctionsForModule(StringRef ModulePath,
GVSummaryMapTy &GVSummaryMap) const;
@@ -1041,6 +1092,12 @@
void collectDefinedGVSummariesPerModule(
StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries) const;
+ /// Print to an output stream.
+ void print(raw_ostream &OS, bool IsForDebug = false) const;
+
+ /// Dump to stderr (for debugging).
+ void dump() const;
+
/// Export summary to dot file for GraphViz.
void exportToDot(raw_ostream& OS) const;
@@ -1087,11 +1144,11 @@
static NodeRef getEntryNode(ModuleSummaryIndex *I) {
std::unique_ptr<GlobalValueSummary> Root =
make_unique<FunctionSummary>(I->calculateCallGraphRoot());
- GlobalValueSummaryInfo G(I->isPerformingAnalysis());
+ GlobalValueSummaryInfo G(I->haveGVs());
G.SummaryList.push_back(std::move(Root));
static auto P =
GlobalValueSummaryMapTy::value_type(GlobalValue::GUID(0), std::move(G));
- return ValueInfo(I->isPerformingAnalysis(), &P);
+ return ValueInfo(I->haveGVs(), &P);
}
};