diff --git a/llvm/lib/Bytecode/Reader/Reader.cpp b/llvm/lib/Bytecode/Reader/Reader.cpp index e8e1afd52e80..29d0a71b5892 100644 --- a/llvm/lib/Bytecode/Reader/Reader.cpp +++ b/llvm/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/llvm/lib/Bytecode/Writer/Writer.cpp b/llvm/lib/Bytecode/Writer/Writer.cpp index 413fd293dbd7..1e6d63a0f1e5 100644 --- a/llvm/lib/Bytecode/Writer/Writer.cpp +++ b/llvm/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()) {