Changes in directory llvm/lib/CodeGen:
AsmPrinter.cpp updated: 1.58 -> 1.59 ELFWriter.cpp updated: 1.17 -> 1.18 MachineCodeEmitter.cpp updated: 1.25 -> 1.26 MachineFunction.cpp updated: 1.87 -> 1.88 MachineInstr.cpp updated: 1.110 -> 1.111 --- Log message: JumpTable support! What this represents is working asm and jit support for x86 and ppc for 100% dense switch statements when relocations are non-PIC. This support will be extended and enhanced in the coming days to support PIC, and less dense forms of jump tables. --- Diffs of the changes: (+96 -3) AsmPrinter.cpp | 38 ++++++++++++++++++++++++++++++++++++++ ELFWriter.cpp | 5 ++++- MachineCodeEmitter.cpp | 14 ++++++++++++-- MachineFunction.cpp | 36 ++++++++++++++++++++++++++++++++++++ MachineInstr.cpp | 6 ++++++ 5 files changed, 96 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.58 llvm/lib/CodeGen/AsmPrinter.cpp:1.59 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.58 Tue Mar 7 16:00:35 2006 +++ llvm/lib/CodeGen/AsmPrinter.cpp Sat Apr 22 13:53:45 2006 @@ -17,6 +17,7 @@ #include "llvm/Constants.h" #include "llvm/Module.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/Support/Mangler.h" #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetMachine.h" @@ -46,6 +47,7 @@ AlignmentIsInBytes(true), SwitchToSectionDirective("\t.section\t"), ConstantPoolSection("\t.section .rodata\n"), + JumpTableSection("\t.section .rodata\n"), StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"), StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"), LCOMMDirective(0), @@ -127,6 +129,33 @@ } } +/// EmitJumpTableInfo - Print assembly representations of the jump tables used +/// by the current function to the current output stream. +/// +void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI) { + const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); + if (JT.empty()) return; + const TargetData &TD = TM.getTargetData(); + + // FIXME: someday we need to handle PIC jump tables + assert((TM.getRelocationModel() == Reloc::Static || + TM.getRelocationModel() == Reloc::DynamicNoPIC) && + "Unhandled relocation model emitting jump table information!"); + + SwitchSection(JumpTableSection, 0); + EmitAlignment(Log2_32(TD.getPointerAlignment())); + for (unsigned i = 0, e = JT.size(); i != e; ++i) { + O << PrivateGlobalPrefix << "JTI" << getFunctionNumber() << '_' << i + << ":\n"; + const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; + for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { + O << Data32bitsDirective << ' '; + printBasicBlockLabel(JTBBs[ii]); + O << '\n'; + } + } +} + /// EmitSpecialLLVMGlobal - Check to see if the specified global is a /// special global used by LLVM. If so, emit it and return true, otherwise /// do nothing and return false. @@ -654,3 +683,12 @@ // Target doesn't support this yet! return true; } + +/// printBasicBlockLabel - This method prints the label for the specified +/// MachineBasicBlock +void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB) const { + O << PrivateGlobalPrefix << "LBB" + << Mang->getValueName(MBB->getParent()->getFunction()) + << "_" << MBB->getNumber() << '\t' << CommentString + << MBB->getBasicBlock()->getName(); +} Index: llvm/lib/CodeGen/ELFWriter.cpp diff -u llvm/lib/CodeGen/ELFWriter.cpp:1.17 llvm/lib/CodeGen/ELFWriter.cpp:1.18 --- llvm/lib/CodeGen/ELFWriter.cpp:1.17 Wed Dec 28 00:29:02 2005 +++ llvm/lib/CodeGen/ELFWriter.cpp Sat Apr 22 13:53:45 2006 @@ -84,7 +84,10 @@ assert(0 && "CP not implementated yet!"); return 0; } - + virtual uint64_t getJumpTableEntryAddress(unsigned Index) { + assert(0 && "JT not implementated yet!"); + return 0; + } virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) { assert(0 && "Globals not implemented yet!"); return 0; Index: llvm/lib/CodeGen/MachineCodeEmitter.cpp diff -u llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.25 llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.26 --- llvm/lib/CodeGen/MachineCodeEmitter.cpp:1.25 Tue Dec 27 20:44:35 2005 +++ llvm/lib/CodeGen/MachineCodeEmitter.cpp Sat Apr 22 13:53:45 2006 @@ -56,6 +56,7 @@ { return 0; } uint64_t getConstantPoolEntryAddress(unsigned Num) { return 0; } + uint64_t getJumpTableEntryAddress(unsigned Num) { return 0; } uint64_t getCurrentPCValue() { return 0; } uint64_t getCurrentPCOffset() { return 0; } }; @@ -97,7 +98,14 @@ void emitConstantPool(MachineConstantPool *MCP) { MCE.emitConstantPool(MCP); } - + void initJumpTableInfo(MachineJumpTableInfo *MJTI) { + MCE.initJumpTableInfo(MJTI); + } + void emitJumpTableInfo(MachineJumpTableInfo *MJTI, + std::map<MachineBasicBlock*,uint64_t> &MBBM) { + MCE.emitJumpTableInfo(MJTI, MBBM); + } + void startFunctionStub(unsigned StubSize) { MCE.startFunctionStub(StubSize); } @@ -146,7 +154,9 @@ uint64_t getConstantPoolEntryAddress(unsigned Num) { return MCE.getConstantPoolEntryAddress(Num); } - + uint64_t getJumpTableEntryAddress(unsigned Num) { + return MCE.getJumpTableEntryAddress(Num); + } virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) { return MCE.allocateGlobal(size, alignment); } Index: llvm/lib/CodeGen/MachineFunction.cpp diff -u llvm/lib/CodeGen/MachineFunction.cpp:1.87 llvm/lib/CodeGen/MachineFunction.cpp:1.88 --- llvm/lib/CodeGen/MachineFunction.cpp:1.87 Mon Apr 3 16:39:03 2006 +++ llvm/lib/CodeGen/MachineFunction.cpp Sat Apr 22 13:53:45 2006 @@ -18,6 +18,7 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetFrameInfo.h" @@ -113,6 +114,7 @@ MFInfo = 0; FrameInfo = new MachineFrameInfo(); ConstantPool = new MachineConstantPool(TM.getTargetData()); + JumpTableInfo = new MachineJumpTableInfo(TM.getTargetData()); BasicBlocks.Parent = this; } @@ -122,6 +124,7 @@ delete MFInfo; delete FrameInfo; delete ConstantPool; + delete JumpTableInfo; delete[] UsedPhysRegs; } @@ -132,6 +135,9 @@ // Print Frame Information getFrameInfo()->print(*this, OS); + + // Print JumpTable Information + getJumpTableInfo()->print(OS); // Print Constant Pool getConstantPool()->print(OS); @@ -334,6 +340,36 @@ //===----------------------------------------------------------------------===// +// MachineJumpTableInfo implementation +//===----------------------------------------------------------------------===// + +/// getJumpTableIndex - Create a new jump table entry in the jump table info +/// or return an existing one. +/// +unsigned MachineJumpTableInfo::getJumpTableIndex( + std::vector<MachineBasicBlock*> &DestBBs) { + for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) + if (JumpTables[i].MBBs == DestBBs) + return i; + + JumpTables.push_back(MachineJumpTableEntry(DestBBs)); + return JumpTables.size()-1; +} + + +void MachineJumpTableInfo::print(std::ostream &OS) const { + // FIXME: this is lame, maybe we could print out the MBB numbers or something + // like {1, 2, 4, 5, 3, 0} + for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) { + OS << " <jt #" << i << "> has " << JumpTables[i].MBBs.size() + << " entries\n"; + } +} + +void MachineJumpTableInfo::dump() const { print(std::cerr); } + + +//===----------------------------------------------------------------------===// // MachineConstantPool implementation //===----------------------------------------------------------------------===// Index: llvm/lib/CodeGen/MachineInstr.cpp diff -u llvm/lib/CodeGen/MachineInstr.cpp:1.110 llvm/lib/CodeGen/MachineInstr.cpp:1.111 --- llvm/lib/CodeGen/MachineInstr.cpp:1.110 Thu Apr 20 13:32:41 2006 +++ llvm/lib/CodeGen/MachineInstr.cpp Sat Apr 22 13:53:45 2006 @@ -238,6 +238,9 @@ case MachineOperand::MO_ConstantPoolIndex: OS << "<cp#" << MO.getConstantPoolIndex() << ">"; break; + case MachineOperand::MO_JumpTableIndex: + OS << "<jt#" << MO.getJumpTableIndex() << ">"; + break; case MachineOperand::MO_GlobalAddress: OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); if (MO.getOffset()) OS << "+" << MO.getOffset(); @@ -377,6 +380,9 @@ case MachineOperand::MO_ConstantPoolIndex: OS << "<cp#" << MO.getConstantPoolIndex() << ">"; break; + case MachineOperand::MO_JumpTableIndex: + OS << "<jt#" << MO.getJumpTableIndex() << ">"; + break; case MachineOperand::MO_GlobalAddress: OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; break; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits