diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2007-04-25 14:27:10 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2007-04-25 14:27:10 +0000 |
commit | 8b0a8c84da2030ee8f4440d5b60a8033de691222 (patch) | |
tree | 7b780ed0cf12403faeac0e65fb16bca29fda5dbf /lib/Bytecode/Writer/Writer.cpp | |
parent | 24a3cc4c83e5edb25fadf7b8979a26b4451795c6 (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.cpp | 27 |
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) { |