Index: include/llvm/IR/ModuleSummaryIndex.h =================================================================== --- include/llvm/IR/ModuleSummaryIndex.h +++ include/llvm/IR/ModuleSummaryIndex.h @@ -103,9 +103,14 @@ /// types based on global summary-based analysis. GlobalValue::LinkageTypes Linkage : 4; + /// Indicate if the global value is located in a specific section. + unsigned HasSection : 1; + /// Convenience Constructors - explicit GVFlags(GlobalValue::LinkageTypes Linkage) : Linkage(Linkage) {} - GVFlags(const GlobalValue &GV) : Linkage(GV.getLinkage()) {} + explicit GVFlags(GlobalValue::LinkageTypes Linkage, bool HasSection) + : Linkage(Linkage), HasSection(HasSection) {} + GVFlags(const GlobalValue &GV) + : Linkage(GV.getLinkage()), HasSection(GV.hasSection()) {} }; private: @@ -152,6 +157,9 @@ /// Return linkage type recorded for this global value. GlobalValue::LinkageTypes linkage() const { return Flags.Linkage; } + /// Return true if this global value is located in a specific section. + bool hasSection() const { return Flags.HasSection; } + /// Record a reference from this global value to the global value identified /// by \p RefGUID. void addRefEdge(GlobalValue::GUID RefGUID) { RefEdgeList.push_back(RefGUID); } Index: lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- lib/Bitcode/Reader/BitcodeReader.cpp +++ lib/Bitcode/Reader/BitcodeReader.cpp @@ -706,7 +706,9 @@ // as well // auto Linkage = GlobalValue::LinkageTypes(RawFlags & 0xF); // 4 bits - return GlobalValueSummary::GVFlags(Linkage); + RawFlags = RawFlags >> 4; + auto HasSection = RawFlags & 0x1; // bool + return GlobalValueSummary::GVFlags(Linkage, HasSection); } static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val) { Index: lib/Bitcode/Writer/BitcodeWriter.cpp =================================================================== --- lib/Bitcode/Writer/BitcodeWriter.cpp +++ lib/Bitcode/Writer/BitcodeWriter.cpp @@ -536,10 +536,14 @@ // Decode the flags for GlobalValue in the summary static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) { uint64_t RawFlags = 0; + + RawFlags |= Flags.HasSection; // bool + // Linkage don't need to be remapped at that time for the summary. Any future // change to the getEncodedLinkage() function will need to be taken into // account here as well. - RawFlags |= Flags.Linkage; // 4 bits + RawFlags = (RawFlags << 4) | Flags.Linkage; // 4 bits + return RawFlags; }