mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +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. llvm-svn: 9170
This commit is contained in:
parent
06bd29b53b
commit
2d05c60bac
@ -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#
|
||||
|
@ -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()) {
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user