mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
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
This commit is contained in:
parent
9eb52a5c29
commit
6b25242a4b
@ -318,7 +318,12 @@ void BytecodeParser::materializeFunction(Function* F) {
|
|||||||
throw std::string("ParseFunction: Error reading from buffer.");
|
throw std::string("ParseFunction: Error reading from buffer.");
|
||||||
if (LinkageType & ~0x3)
|
if (LinkageType & ~0x3)
|
||||||
throw std::string("Invalid linkage type for Function.");
|
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 {
|
} else {
|
||||||
// We used to only support two linkage models: internal and external
|
// We used to only support two linkage models: internal and external
|
||||||
unsigned isInternal;
|
unsigned isInternal;
|
||||||
@ -436,7 +441,12 @@ void BytecodeParser::ParseModuleGlobalInfo(const unsigned char *&Buf,
|
|||||||
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
||||||
// bit2,3 = Linkage, bit4+ = slot#
|
// bit2,3 = Linkage, bit4+ = slot#
|
||||||
SlotNo = VarType >> 4;
|
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 {
|
} else {
|
||||||
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
||||||
// bit2 = isInternal, bit3+ = slot#
|
// bit2 = isInternal, bit3+ = slot#
|
||||||
|
@ -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) {
|
void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
|
||||||
BytecodeBlock ModuleInfoBlock(BytecodeFormat::ModuleGlobalInfo, Out);
|
BytecodeBlock ModuleInfoBlock(BytecodeFormat::ModuleGlobalInfo, Out);
|
||||||
|
|
||||||
@ -168,7 +179,7 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
|
|||||||
|
|
||||||
// Fields: bit0 = isConstant, bit1 = hasInitializer, bit2,3=Linkage,
|
// Fields: bit0 = isConstant, bit1 = hasInitializer, bit2,3=Linkage,
|
||||||
// bit4+ = Slot # for type
|
// 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();
|
(I->hasInitializer() << 1) | I->isConstant();
|
||||||
output_vbr(oSlot, Out);
|
output_vbr(oSlot, Out);
|
||||||
|
|
||||||
@ -195,7 +206,7 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
|
|||||||
|
|
||||||
void BytecodeWriter::outputFunction(const Function *F) {
|
void BytecodeWriter::outputFunction(const Function *F) {
|
||||||
BytecodeBlock FunctionBlock(BytecodeFormat::Function, Out);
|
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...
|
// Only output the constant pool and other goodies if needed...
|
||||||
if (!F->isExternal()) {
|
if (!F->isExternal()) {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user