summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-16 18:28:50 +0000
committerChris Lattner <sabre@nondot.org>2003-10-16 18:28:50 +0000
commit6b25242a4ba80e8c3a8a2664eefeba9c69814012 (patch)
tree468303cb62487b68d1fc360524994071fd1f5722 /lib
parent9eb52a5c2913ebb105463e2fe7500664902a4468 (diff)
downloadllvm-6b25242a4ba80e8c3a8a2664eefeba9c69814012.tar.gz
llvm-6b25242a4ba80e8c3a8a2664eefeba9c69814012.tar.bz2
llvm-6b25242a4ba80e8c3a8a2664eefeba9c69814012.tar.xz
Add support for 'weak' linkage.
For now, we translate linkonce into weak linkage in the bytecode format because we don't have enough bits to represent it. We will rev the bytecode version soon anyways, so this will be fixed in the near future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9170 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Bytecode/Reader/Reader.cpp14
-rw-r--r--lib/Bytecode/Writer/Writer.cpp15
2 files changed, 25 insertions, 4 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index e8e1afd52e..29d0a71b58 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -318,7 +318,12 @@ void BytecodeParser::materializeFunction(Function* F) {
throw std::string("ParseFunction: Error reading from buffer.");
if (LinkageType & ~0x3)
throw std::string("Invalid linkage type for Function.");
- Linkage = (GlobalValue::LinkageTypes)LinkageType;
+ switch (LinkageType) {
+ case 0: Linkage = GlobalValue::ExternalLinkage; break;
+ case 1: Linkage = GlobalValue::WeakLinkage; break;
+ case 2: Linkage = GlobalValue::AppendingLinkage; break;
+ case 3: Linkage = GlobalValue::InternalLinkage; break;
+ }
} else {
// We used to only support two linkage models: internal and external
unsigned isInternal;
@@ -436,7 +441,12 @@ void BytecodeParser::ParseModuleGlobalInfo(const unsigned char *&Buf,
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
// bit2,3 = Linkage, bit4+ = slot#
SlotNo = VarType >> 4;
- Linkage = (GlobalValue::LinkageTypes)((VarType >> 2) & 3);
+ switch ((VarType >> 2) & 3) {
+ case 0: Linkage = GlobalValue::ExternalLinkage; break;
+ case 1: Linkage = GlobalValue::WeakLinkage; break;
+ case 2: Linkage = GlobalValue::AppendingLinkage; break;
+ case 3: Linkage = GlobalValue::InternalLinkage; break;
+ }
} else {
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
// bit2 = isInternal, bit3+ = slot#
diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp
index 413fd293db..1e6d63a0f1 100644
--- a/lib/Bytecode/Writer/Writer.cpp
+++ b/lib/Bytecode/Writer/Writer.cpp
@@ -158,6 +158,17 @@ void BytecodeWriter::outputConstants(bool isFunction) {
}
}
+static unsigned getEncodedLinkage(const GlobalValue *GV) {
+ switch (GV->getLinkage()) {
+ default: assert(0 && "Invalid linkage!");
+ case GlobalValue::ExternalLinkage: return 0;
+ case GlobalValue::LinkOnceLinkage: return 1;
+ case GlobalValue::WeakLinkage: return 1;
+ case GlobalValue::AppendingLinkage: return 2;
+ case GlobalValue::InternalLinkage: return 3;
+ }
+}
+
void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
BytecodeBlock ModuleInfoBlock(BytecodeFormat::ModuleGlobalInfo, Out);
@@ -168,7 +179,7 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
// Fields: bit0 = isConstant, bit1 = hasInitializer, bit2,3=Linkage,
// bit4+ = Slot # for type
- unsigned oSlot = ((unsigned)Slot << 4) | ((unsigned)I->getLinkage() << 2) |
+ unsigned oSlot = ((unsigned)Slot << 4) | (getEncodedLinkage(I) << 2) |
(I->hasInitializer() << 1) | I->isConstant();
output_vbr(oSlot, Out);
@@ -195,7 +206,7 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
void BytecodeWriter::outputFunction(const Function *F) {
BytecodeBlock FunctionBlock(BytecodeFormat::Function, Out);
- output_vbr((unsigned)F->getLinkage(), Out);
+ output_vbr(getEncodedLinkage(F), Out);
// Only output the constant pool and other goodies if needed...
if (!F->isExternal()) {