mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 18:24:00 +00:00
add support for new linkage types
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9228 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -434,14 +434,24 @@ void BytecodeParser::ParseModuleGlobalInfo(const unsigned char *&Buf,
|
|||||||
GlobalValue::LinkageTypes Linkage;
|
GlobalValue::LinkageTypes Linkage;
|
||||||
|
|
||||||
if (!hasInternalMarkerOnly) {
|
if (!hasInternalMarkerOnly) {
|
||||||
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
unsigned LinkageID;
|
||||||
// bit2,3 = Linkage, bit4+ = slot#
|
if (hasExtendedLinkageSpecs) {
|
||||||
SlotNo = VarType >> 4;
|
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
||||||
switch ((VarType >> 2) & 3) {
|
// bit2,3,4 = Linkage, bit4+ = slot#
|
||||||
|
SlotNo = VarType >> 5;
|
||||||
|
LinkageID = (VarType >> 2) & 7;
|
||||||
|
} else {
|
||||||
|
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
||||||
|
// bit2,3 = Linkage, bit4+ = slot#
|
||||||
|
SlotNo = VarType >> 4;
|
||||||
|
LinkageID = (VarType >> 2) & 3;
|
||||||
|
}
|
||||||
|
switch (LinkageID) {
|
||||||
case 0: Linkage = GlobalValue::ExternalLinkage; break;
|
case 0: Linkage = GlobalValue::ExternalLinkage; break;
|
||||||
case 1: Linkage = GlobalValue::WeakLinkage; break;
|
case 1: Linkage = GlobalValue::WeakLinkage; break;
|
||||||
case 2: Linkage = GlobalValue::AppendingLinkage; break;
|
case 2: Linkage = GlobalValue::AppendingLinkage; break;
|
||||||
case 3: Linkage = GlobalValue::InternalLinkage; break;
|
case 3: Linkage = GlobalValue::InternalLinkage; break;
|
||||||
|
case 4: Linkage = GlobalValue::LinkOnceLinkage; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
// VarType Fields: bit0 = isConstant, bit1 = hasInitializer,
|
||||||
|
@ -162,10 +162,10 @@ static unsigned getEncodedLinkage(const GlobalValue *GV) {
|
|||||||
switch (GV->getLinkage()) {
|
switch (GV->getLinkage()) {
|
||||||
default: assert(0 && "Invalid linkage!");
|
default: assert(0 && "Invalid linkage!");
|
||||||
case GlobalValue::ExternalLinkage: return 0;
|
case GlobalValue::ExternalLinkage: return 0;
|
||||||
case GlobalValue::LinkOnceLinkage: return 1;
|
|
||||||
case GlobalValue::WeakLinkage: return 1;
|
case GlobalValue::WeakLinkage: return 1;
|
||||||
case GlobalValue::AppendingLinkage: return 2;
|
case GlobalValue::AppendingLinkage: return 2;
|
||||||
case GlobalValue::InternalLinkage: return 3;
|
case GlobalValue::InternalLinkage: return 3;
|
||||||
|
case GlobalValue::LinkOnceLinkage: return 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,9 +177,9 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
|
|||||||
int Slot = Table.getSlot(I->getType());
|
int Slot = Table.getSlot(I->getType());
|
||||||
assert(Slot != -1 && "Module global vars is broken!");
|
assert(Slot != -1 && "Module global vars is broken!");
|
||||||
|
|
||||||
// Fields: bit0 = isConstant, bit1 = hasInitializer, bit2,3=Linkage,
|
// Fields: bit0 = isConstant, bit1 = hasInitializer, bit2-4=Linkage,
|
||||||
// bit4+ = Slot # for type
|
// bit5+ = Slot # for type
|
||||||
unsigned oSlot = ((unsigned)Slot << 4) | (getEncodedLinkage(I) << 2) |
|
unsigned oSlot = ((unsigned)Slot << 5) | (getEncodedLinkage(I) << 2) |
|
||||||
(I->hasInitializer() << 1) | I->isConstant();
|
(I->hasInitializer() << 1) | I->isConstant();
|
||||||
output_vbr(oSlot, Out);
|
output_vbr(oSlot, Out);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user