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: @@ -164,6 +169,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 @@ -725,7 +725,9 @@ // like getDecodedLinkage() above. Any future change to the linkage enum and // to getDecodedLinkage() will need to be taken into account here as above. 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 @@ -789,8 +789,14 @@ // Decode the flags for GlobalValue in the summary static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) { uint64_t RawFlags = 0; - // Emit Linkage enum. - RawFlags |= Flags.Linkage; // 4 bits + + 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 = (RawFlags << 4) | Flags.Linkage; // 4 bits + return RawFlags; } Index: test/Bitcode/thinlto-summary-section.ll =================================================================== --- /dev/null +++ test/Bitcode/thinlto-summary-section.ll @@ -0,0 +1,11 @@ +; Check the linkage types in both the per-module and combined summaries. +; RUN: opt -module-summary %s -o %t.o +; RUN: llvm-bcanalyzer -dump %t.o | FileCheck %s +; RUN: llvm-lto -thinlto -o %t2 %t.o +; RUN: llvm-bcanalyzer -dump %t2.thinlto.bc | FileCheck %s --check-prefix=COMBINED + +; CHECK: