[llvm] 1c932ba - [llvm][Bitcode] Add bitcode reader/writer for DSOLocalEquivalent
Leonard Chan via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 22 10:38:54 PST 2021
Author: Leonard Chan
Date: 2021-02-22T10:37:57-08:00
New Revision: 1c932baeaafbd4c9051ed4836f320db9003f4068
URL: https://github.com/llvm/llvm-project/commit/1c932baeaafbd4c9051ed4836f320db9003f4068
DIFF: https://github.com/llvm/llvm-project/commit/1c932baeaafbd4c9051ed4836f320db9003f4068.diff
LOG: [llvm][Bitcode] Add bitcode reader/writer for DSOLocalEquivalent
This is necessary for compilation with [thin]lto.
Differential Revision: https://reviews.llvm.org/D96170
Added:
llvm/test/Bitcode/dso_local_equivalent.ll
Modified:
llvm/include/llvm/Bitcode/LLVMBitCodes.h
llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
index 5b4854d6c95e..6b24f4bdcba5 100644
--- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -375,8 +375,9 @@ enum ConstantsCodes {
CST_CODE_INLINEASM = 23, // INLINEASM: [sideeffect|alignstack|
// asmdialect,asmstr,conststr]
CST_CODE_CE_GEP_WITH_INRANGE_INDEX = 24, // [opty, flags, n x operands]
- CST_CODE_CE_UNOP = 25, // CE_UNOP: [opcode, opval]
- CST_CODE_POISON = 26, // POISON
+ CST_CODE_CE_UNOP = 25, // CE_UNOP: [opcode, opval]
+ CST_CODE_POISON = 26, // POISON
+ CST_CODE_DSO_LOCAL_EQUIVALENT = 27, // DSO_LOCAL_EQUIVALENT [gvty, gv]
};
/// CastOpcodes - These are values used in the bitcode files to encode which
diff --git a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
index e91af121ea08..a96e68279eaa 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp
@@ -218,6 +218,7 @@ static Optional<const char *> GetCodeName(unsigned CodeID, unsigned BlockID,
STRINGIFY_CODE(CST_CODE, INLINEASM)
STRINGIFY_CODE(CST_CODE, CE_SHUFVEC_EX)
STRINGIFY_CODE(CST_CODE, CE_UNOP)
+ STRINGIFY_CODE(CST_CODE, DSO_LOCAL_EQUIVALENT)
case bitc::CST_CODE_BLOCKADDRESS:
return "CST_CODE_BLOCKADDRESS";
STRINGIFY_CODE(CST_CODE, DATA)
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index f88c371b99be..fd2432981acf 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -2888,6 +2888,20 @@ Error BitcodeReader::parseConstants() {
V = BlockAddress::get(Fn, BB);
break;
}
+ case bitc::CST_CODE_DSO_LOCAL_EQUIVALENT: {
+ if (Record.size() < 2)
+ return error("Invalid record");
+ Type *GVTy = getTypeByID(Record[0]);
+ if (!GVTy)
+ return error("Invalid record");
+ GlobalValue *GV = dyn_cast_or_null<GlobalValue>(
+ ValueList.getConstantFwdRef(Record[1], GVTy));
+ if (!GV)
+ return error("Invalid record");
+
+ V = DSOLocalEquivalent::get(GV);
+ break;
+ }
}
assert(V->getType() == flattenPointerTypes(CurFullTy) &&
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index 9a4f724d6379..c555b6735195 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -2609,6 +2609,10 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
Record.push_back(VE.getTypeID(BA->getFunction()->getType()));
Record.push_back(VE.getValueID(BA->getFunction()));
Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
+ } else if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C)) {
+ Code = bitc::CST_CODE_DSO_LOCAL_EQUIVALENT;
+ Record.push_back(VE.getTypeID(Equiv->getGlobalValue()->getType()));
+ Record.push_back(VE.getValueID(Equiv->getGlobalValue()));
} else {
#ifndef NDEBUG
C->dump();
diff --git a/llvm/test/Bitcode/dso_local_equivalent.ll b/llvm/test/Bitcode/dso_local_equivalent.ll
new file mode 100644
index 000000000000..13eec78020b7
--- /dev/null
+++ b/llvm/test/Bitcode/dso_local_equivalent.ll
@@ -0,0 +1,86 @@
+; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+; RUN: verify-uselistorder < %s
+
+declare void @extern_func()
+
+define void @call_extern_func() {
+; CHECK: call void dso_local_equivalent @extern_func()
+ call void dso_local_equivalent @extern_func()
+ ret void
+}
+
+declare hidden void @hidden_func()
+declare protected void @protected_func()
+declare dso_local void @dso_local_func()
+define internal void @internal_func() {
+entry:
+ ret void
+}
+define private void @private_func() {
+entry:
+ ret void
+}
+
+; CHECK: call void dso_local_equivalent @hidden_func()
+define void @call_hidden_func() {
+ call void dso_local_equivalent @hidden_func()
+ ret void
+}
+
+define void @call_protected_func() {
+; CHECK: call void dso_local_equivalent @protected_func()
+ call void dso_local_equivalent @protected_func()
+ ret void
+}
+
+define void @call_dso_local_func() {
+; CHECK: call void dso_local_equivalent @dso_local_func()
+ call void dso_local_equivalent @dso_local_func()
+ ret void
+}
+
+define void @call_internal_func() {
+; CHECK: call void dso_local_equivalent @internal_func()
+ call void dso_local_equivalent @internal_func()
+ ret void
+}
+
+define void @aliasee_func() {
+entry:
+ ret void
+}
+
+ at alias_func = alias void (), void ()* @aliasee_func
+ at dso_local_alias_func = dso_local alias void (), void ()* @aliasee_func
+
+define void @call_alias_func() {
+; CHECK: call void dso_local_equivalent @alias_func()
+ call void dso_local_equivalent @alias_func()
+ ret void
+}
+
+define void @call_dso_local_alias_func() {
+; CHECK: call void dso_local_equivalent @dso_local_alias_func()
+ call void dso_local_equivalent @dso_local_alias_func()
+ ret void
+}
+
+ at ifunc_func = ifunc void (), i64 ()* @resolver
+ at dso_local_ifunc_func = dso_local ifunc void (), i64 ()* @resolver
+
+define internal i64 @resolver() {
+entry:
+ ret i64 0
+}
+
+define void @call_ifunc_func() {
+; CHECK: call void dso_local_equivalent @ifunc_func()
+ call void dso_local_equivalent @ifunc_func()
+ ret void
+}
+
+define void @call_dso_local_ifunc_func() {
+; CHECK: call void dso_local_equivalent @dso_local_ifunc_func()
+ call void dso_local_equivalent @dso_local_ifunc_func()
+ ret void
+}
More information about the llvm-commits
mailing list