aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Writer/Writer.cpp
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2007-04-25 14:27:10 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2007-04-25 14:27:10 +0000
commit8b0a8c84da2030ee8f4440d5b60a8033de691222 (patch)
tree7b780ed0cf12403faeac0e65fb16bca29fda5dbf /lib/Bytecode/Writer/Writer.cpp
parent24a3cc4c83e5edb25fadf7b8979a26b4451795c6 (diff)
Implement aliases. This fixes PR1017 and it's dependent bugs. CFE part
will follow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36435 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Writer/Writer.cpp')
-rw-r--r--lib/Bytecode/Writer/Writer.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp
index 12724dd6be..7295239fdd 100644
--- a/lib/Bytecode/Writer/Writer.cpp
+++ b/lib/Bytecode/Writer/Writer.cpp
@@ -1088,9 +1088,34 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) {
output_vbr((unsigned)SectionNames.size());
for (unsigned i = 0, e = SectionNames.size(); i != e; ++i)
output(SectionNames[i]);
-
+
// Output the inline asm string.
output(M->getModuleInlineAsm());
+
+ // Output aliases
+ for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
+ I != E; ++I) {
+ unsigned Slot = Table.getTypeSlot(I->getType());
+ assert(((Slot << 2) >> 2) == Slot && "Slot # too big!");
+ unsigned aliasLinkage = 0;
+ switch (I->getLinkage()) {
+ case GlobalValue::ExternalLinkage:
+ aliasLinkage = 0;
+ break;
+ case GlobalValue::InternalLinkage:
+ aliasLinkage = 1;
+ break;
+ case GlobalValue::WeakLinkage:
+ aliasLinkage = 2;
+ break;
+ default:
+ assert(0 && "Invalid alias linkage");
+ }
+ output_vbr((Slot << 2) | aliasLinkage);
+ output_vbr(Table.getTypeSlot(I->getAliasee()->getType()));
+ output_vbr(Table.getSlot(I->getAliasee()));
+ }
+ output_typeid(Table.getTypeSlot(Type::VoidTy));
}
void BytecodeWriter::outputInstructions(const Function *F) {