summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/ModuleSummaryIndex.h12
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp4
-rw-r--r--llvm/lib/Bitcode/Writer/BitcodeWriter.cpp10
-rw-r--r--llvm/test/Bitcode/thinlto-summary-section.ll11
4 files changed, 32 insertions, 5 deletions
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h
index 406a599cc64..ccb2a253a3b 100644
--- a/llvm/include/llvm/IR/ModuleSummaryIndex.h
+++ b/llvm/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/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 0e29c0e77d7..b8db3e8feea 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/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/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index d642dd4be23..fcce553cd1d 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/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/llvm/test/Bitcode/thinlto-summary-section.ll b/llvm/test/Bitcode/thinlto-summary-section.ll
new file mode 100644
index 00000000000..82b6a109118
--- /dev/null
+++ b/llvm/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: <PERMODULE {{.*}} op1=16
+; COMBINED-DAG: <COMBINED {{.*}} op1=16
+define void @functionWithSection() section "some_section" {
+ ret void
+}
OpenPOWER on IntegriCloud