From ae8cf7ca98d825d30a181f7269d02d49e9d872b1 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Sun, 24 Apr 2016 05:31:43 +0000 Subject: [PATCH] Add "hasSection" flag in the Summary Reviewers: tejohnson Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D19405 From: Mehdi Amini llvm-svn: 267329 --- include/llvm/IR/ModuleSummaryIndex.h | 12 ++++++++++-- lib/Bitcode/Reader/BitcodeReader.cpp | 4 +++- lib/Bitcode/Writer/BitcodeWriter.cpp | 10 ++++++++-- test/Bitcode/thinlto-summary-section.ll | 11 +++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 test/Bitcode/thinlto-summary-section.ll diff --git a/include/llvm/IR/ModuleSummaryIndex.h b/include/llvm/IR/ModuleSummaryIndex.h index 406a599cc64..ccb2a253a3b 100644 --- a/include/llvm/IR/ModuleSummaryIndex.h +++ b/include/llvm/IR/ModuleSummaryIndex.h @@ -103,9 +103,14 @@ public: /// 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 @@ public: /// 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); } diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 0e29c0e77d7..b8db3e8feea 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -745,7 +745,9 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, // 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) { diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index d642dd4be23..fcce553cd1d 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -789,8 +789,14 @@ static unsigned getEncodedLinkage(const GlobalValue &GV) { // 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; } diff --git a/test/Bitcode/thinlto-summary-section.ll b/test/Bitcode/thinlto-summary-section.ll new file mode 100644 index 00000000000..82b6a109118 --- /dev/null +++ b/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: