Changes in directory llvm/include/llvm/CodeGen:
MachineJumpTableInfo.h added (r1.1) AsmPrinter.h updated: 1.31 -> 1.32 MachineCodeEmitter.h updated: 1.28 -> 1.29 MachineFunction.h updated: 1.58 -> 1.59 MachineInstr.h updated: 1.167 -> 1.168 ScheduleDAG.h updated: 1.22 -> 1.23 SelectionDAG.h updated: 1.100 -> 1.101 SelectionDAGISel.h updated: 1.12 -> 1.13 SelectionDAGNodes.h updated: 1.129 -> 1.130 --- 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: (+181 -4) AsmPrinter.h | 14 +++++++++ MachineCodeEmitter.h | 18 ++++++++++++ MachineFunction.h | 10 ++++++ MachineInstr.h | 18 +++++++++++- MachineJumpTableInfo.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ ScheduleDAG.h | 1 SelectionDAG.h | 5 ++- SelectionDAGISel.h | 20 ++++++++++++- SelectionDAGNodes.h | 26 ++++++++++++++++- 9 files changed, 181 insertions(+), 4 deletions(-) Index: llvm/include/llvm/CodeGen/MachineJumpTableInfo.h diff -c /dev/null llvm/include/llvm/CodeGen/MachineJumpTableInfo.h:1.1 *** /dev/null Sat Apr 22 13:53:55 2006 --- llvm/include/llvm/CodeGen/MachineJumpTableInfo.h Sat Apr 22 13:53:45 2006 *************** *** 0 **** --- 1,73 ---- + //===-- CodeGen/MachineJumpTableInfo.h - Abstract Jump Tables --*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Nate Begeman and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // The MachineJumpTableInfo class keeps track of jump tables referenced by + // lowered switch instructions in the MachineFunction. + // + // Instructions reference the address of these jump tables through the use of + // MO_JumpTableIndex values. When emitting assembly or machine code, these + // virtual address references are converted to refer to the address of the + // function jump tables. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_CODEGEN_MACHINEJUMPTABLEINFO_H + #define LLVM_CODEGEN_MACHINEJUMPTABLEINFO_H + + #include "llvm/Target/TargetData.h" + #include <vector> + #include <iosfwd> + + namespace llvm { + + class MachineBasicBlock; + + /// MachineJumpTableEntry - One jump table in the jump table info. + /// + struct MachineJumpTableEntry { + /// MBBs - The vector of basic blocks from which to create the jump table. + std::vector<MachineBasicBlock*> MBBs; + + MachineJumpTableEntry(std::vector<MachineBasicBlock*> &M) : MBBs(M) {} + }; + + class MachineJumpTableInfo { + const TargetData &TD; + std::vector<MachineJumpTableEntry> JumpTables; + public: + MachineJumpTableInfo(const TargetData &td) : TD(td) {} + + /// getJumpTableIndex - Create a new jump table or return an existing one. + /// + unsigned getJumpTableIndex(std::vector<MachineBasicBlock*> &DestBBs); + + /// isEmpty - Return true if there are no jump tables. + /// + bool isEmpty() const { return JumpTables.empty(); } + + const std::vector<MachineJumpTableEntry> &getJumpTables() const { + return JumpTables; + } + + unsigned getEntrySize() const { return TD.getPointerSize(); } + unsigned getAlignment() const { return TD.getPointerAlignment(); } + + /// print - Used by the MachineFunction printer to print information about + /// jump tables. Implemented in MachineFunction.cpp + /// + void print(std::ostream &OS) const; + + /// dump - Call print(std::cerr) to be called from the debugger. + /// + void dump() const; + }; + + } // End llvm namespace + + #endif Index: llvm/include/llvm/CodeGen/AsmPrinter.h diff -u llvm/include/llvm/CodeGen/AsmPrinter.h:1.31 llvm/include/llvm/CodeGen/AsmPrinter.h:1.32 --- llvm/include/llvm/CodeGen/AsmPrinter.h:1.31 Fri Feb 24 14:21:12 2006 +++ llvm/include/llvm/CodeGen/AsmPrinter.h Sat Apr 22 13:53:45 2006 @@ -140,6 +140,10 @@ /// before emitting the constant pool for a function. const char *ConstantPoolSection; // Defaults to "\t.section .rodata\n" + /// JumpTableSection - This is the section that we SwitchToSection right + /// before emitting the jump tables for a function. + const char *JumpTableSection; // Defaults to "\t.section .rodata\n" + /// StaticCtorsSection - This is the directive that is emitted to switch to /// a section to emit the static constructor list. /// Defaults to "\t.section .ctors,\"aw\",@progbits". @@ -231,6 +235,11 @@ /// void EmitConstantPool(MachineConstantPool *MCP); + /// EmitJumpTableInfo - Print assembly representations of the jump tables + /// used by the current function to the current output stream. + /// + void EmitJumpTableInfo(MachineJumpTableInfo *MJTI); + /// 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. @@ -257,6 +266,11 @@ /// printInlineAsm - This method formats and prints the specified machine /// instruction that is an inline asm. void printInlineAsm(const MachineInstr *MI) const; + + /// printBasicBlockLabel - This method prints the label for the specified + /// MachineBasicBlock + virtual void printBasicBlockLabel(const MachineBasicBlock *MBB) const; + private: void EmitXXStructorList(Constant *List); Index: llvm/include/llvm/CodeGen/MachineCodeEmitter.h diff -u llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.28 llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.29 --- llvm/include/llvm/CodeGen/MachineCodeEmitter.h:1.28 Thu Jul 28 13:13:59 2005 +++ llvm/include/llvm/CodeGen/MachineCodeEmitter.h Sat Apr 22 13:53:45 2006 @@ -18,11 +18,13 @@ #define LLVM_CODEGEN_MACHINECODEEMITTER_H #include "llvm/Support/DataTypes.h" +#include <map> namespace llvm { class MachineBasicBlock; class MachineConstantPool; +class MachineJumpTableInfo; class MachineFunction; class MachineRelocation; class Value; @@ -47,6 +49,17 @@ /// for the function. virtual void emitConstantPool(MachineConstantPool *MCP) {} + /// initJumpTableInfo - This callback is invoked by the JIT to allocate the + /// necessary memory to hold the jump tables. + virtual void initJumpTableInfo(MachineJumpTableInfo *MJTI) {} + + /// emitJumpTableInfo - This callback is invoked to output the jump tables + /// for the function. In addition to a pointer to the MachineJumpTableInfo, + /// this function also takes a map of MBBs to addresses, so that the final + /// addresses of the MBBs can be written to the jump tables. + virtual void emitJumpTableInfo(MachineJumpTableInfo *MJTI, + std::map<MachineBasicBlock*,uint64_t> &MBBM) {} + /// startFunctionStub - This callback is invoked when the JIT needs the /// address of a function that has not been code generated yet. The StubSize /// specifies the total size required by the stub. Stubs are not allowed to @@ -94,6 +107,11 @@ // virtual uint64_t getConstantPoolEntryAddress(unsigned Index) = 0; + // getJumpTablelEntryAddress - Return the address of the jump table with index + // 'Index' in the function that last called initJumpTableInfo. + // + virtual uint64_t getJumpTableEntryAddress(unsigned Index) = 0; + // allocateGlobal - Allocate some space for a global variable. virtual unsigned char* allocateGlobal(unsigned size, unsigned alignment) = 0; Index: llvm/include/llvm/CodeGen/MachineFunction.h diff -u llvm/include/llvm/CodeGen/MachineFunction.h:1.58 llvm/include/llvm/CodeGen/MachineFunction.h:1.59 --- llvm/include/llvm/CodeGen/MachineFunction.h:1.58 Mon Apr 10 20:09:25 2006 +++ llvm/include/llvm/CodeGen/MachineFunction.h Sat Apr 22 13:53:45 2006 @@ -29,6 +29,7 @@ class SSARegMap; class MachineFrameInfo; class MachineConstantPool; +class MachineJumpTableInfo; // ilist_traits template <> @@ -93,6 +94,9 @@ // Keep track of constants which are spilled to memory MachineConstantPool *ConstantPool; + + // Keep track of jump tables for switch instructions + MachineJumpTableInfo *JumpTableInfo; // Function-level unique numbering for MachineBasicBlocks. When a // MachineBasicBlock is inserted into a MachineFunction is it automatically @@ -138,6 +142,12 @@ /// MachineFrameInfo *getFrameInfo() const { return FrameInfo; } + /// getJumpTableInfo - Return the jump table info object for the current + /// function. This object contains information about jump tables for switch + /// instructions in the current function. + /// + MachineJumpTableInfo *getJumpTableInfo() const { return JumpTableInfo; } + /// getConstantPool - Return the constant pool object for the current /// function. /// Index: llvm/include/llvm/CodeGen/MachineInstr.h diff -u llvm/include/llvm/CodeGen/MachineInstr.h:1.167 llvm/include/llvm/CodeGen/MachineInstr.h:1.168 --- llvm/include/llvm/CodeGen/MachineInstr.h:1.167 Thu Apr 20 13:09:13 2006 +++ llvm/include/llvm/CodeGen/MachineInstr.h Sat Apr 22 13:53:45 2006 @@ -105,6 +105,7 @@ MO_MachineBasicBlock, // MachineBasicBlock reference MO_FrameIndex, // Abstract Stack Frame Index MO_ConstantPoolIndex, // Address of indexed Constant in Constant Pool + MO_JumpTableIndex, // Address of indexed Jump Table for switch MO_ExternalSymbol, // Name of external global symbol MO_GlobalAddress // Address of a global value }; @@ -242,6 +243,7 @@ } bool isFrameIndex() const { return opType == MO_FrameIndex; } bool isConstantPoolIndex() const { return opType == MO_ConstantPoolIndex; } + bool isJumpTableIndex() const { return opType == MO_JumpTableIndex; } bool isGlobalAddress() const { return opType == MO_GlobalAddress; } bool isExternalSymbol() const { return opType == MO_ExternalSymbol; } @@ -285,6 +287,10 @@ assert(isConstantPoolIndex() && "Wrong MachineOperand accessor"); return (unsigned)contents.immedVal; } + unsigned getJumpTableIndex() const { + assert(isJumpTableIndex() && "Wrong MachineOperand accessor"); + return (unsigned)contents.immedVal; + } GlobalValue *getGlobal() const { assert(isGlobalAddress() && "Wrong MachineOperand accessor"); return (GlobalValue*)contents.value; @@ -348,7 +354,8 @@ } void setOffset(int Offset) { - assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) && + assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex() || + isJumpTableIndex()) && "Wrong MachineOperand accessor"); extra.offset = Offset; } @@ -611,6 +618,15 @@ operands.push_back(MachineOperand(I, MachineOperand::MO_ConstantPoolIndex)); } + /// addJumpTableIndexOperand - Add a jump table object index to the + /// instruction. + /// + void addJumpTableIndexOperand(unsigned I) { + assert(!OperandsComplete() && + "Trying to add an operand to a machine instr that is already done!"); + operands.push_back(MachineOperand(I, MachineOperand::MO_JumpTableIndex)); + } + void addGlobalAddressOperand(GlobalValue *GV, bool isPCRelative, int Offset) { assert(!OperandsComplete() && "Trying to add an operand to a machine instr that is already done!"); Index: llvm/include/llvm/CodeGen/ScheduleDAG.h diff -u llvm/include/llvm/CodeGen/ScheduleDAG.h:1.22 llvm/include/llvm/CodeGen/ScheduleDAG.h:1.23 --- llvm/include/llvm/CodeGen/ScheduleDAG.h:1.22 Fri Mar 10 01:51:12 2006 +++ llvm/include/llvm/CodeGen/ScheduleDAG.h Sat Apr 22 13:53:45 2006 @@ -100,6 +100,7 @@ if (isa<BasicBlockSDNode>(Node)) return true; if (isa<FrameIndexSDNode>(Node)) return true; if (isa<ConstantPoolSDNode>(Node)) return true; + if (isa<JumpTableSDNode>(Node)) return true; if (isa<ExternalSymbolSDNode>(Node)) return true; return false; } Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.100 llvm/include/llvm/CodeGen/SelectionDAG.h:1.101 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.100 Sat Feb 25 03:52:55 2006 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Sat Apr 22 13:53:45 2006 @@ -120,6 +120,8 @@ int offset = 0); SDOperand getFrameIndex(int FI, MVT::ValueType VT); SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT); + SDOperand getJumpTable(int JTI, MVT::ValueType VT); + SDOperand getTargetJumpTable(int JTI, MVT::ValueType VT); SDOperand getConstantPool(Constant *C, MVT::ValueType VT, unsigned Alignment=0, int offset = 0); SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT, @@ -468,7 +470,8 @@ std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstants; std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> ConstantFPs; std::map<std::pair<uint64_t, MVT::ValueType>, SDNode*> TargetConstantFPs; - std::map<int, SDNode*> FrameIndices, TargetFrameIndices; + std::map<int, SDNode*> FrameIndices, TargetFrameIndices, JumpTableIndices, + TargetJumpTableIndices; std::map<std::pair<Constant *, std::pair<int, unsigned> >, SDNode*> ConstantPoolIndices; std::map<std::pair<Constant *, Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.12 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.13 --- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.12 Sun Mar 26 19:32:24 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGISel.h Sat Apr 22 13:53:45 2006 @@ -18,6 +18,7 @@ #include "llvm/Pass.h" #include "llvm/Constant.h" #include "llvm/CodeGen/SelectionDAGNodes.h" +#include <set> namespace llvm { class SelectionDAG; @@ -40,7 +41,7 @@ SelectionDAG *CurDAG; MachineBasicBlock *BB; - SelectionDAGISel(TargetLowering &tli) : TLI(tli) {} + SelectionDAGISel(TargetLowering &tli) : TLI(tli), JT(0,0,0) {} virtual void getAnalysisUsage(AnalysisUsage &AU) const; @@ -87,6 +88,20 @@ // ThisBB - the blcok into which to emit the code for the setcc and branches MachineBasicBlock *ThisBB; }; + struct JumpTable { + JumpTable(unsigned R, unsigned J, MachineBasicBlock *me) : Reg(R), JTI(J), + MBB(me) {} + // Reg - the virtual register containing the index of the jump table entry + // to jump to. + unsigned Reg; + // JTI - the JumpTableIndex for this jump table in the function. + unsigned JTI; + // MBB - the MBB into which to emit the code for the indirect jump. + MachineBasicBlock *MBB; + // SuccMBBs - a vector of unique successor MBBs used for updating CFG info + // and PHI nodes. + std::set<MachineBasicBlock*> SuccMBBs; + }; protected: /// Pick a safe ordering and emit instructions for each target node in the @@ -114,6 +129,9 @@ /// SwitchCases - Vector of CaseBlock structures used to communicate /// SwitchInst code generation information. std::vector<CaseBlock> SwitchCases; + + /// JT - Record which holds necessary information for emitting a jump table + JumpTable JT; }; } Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.129 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.130 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.129 Wed Apr 12 11:44:15 2006 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Sat Apr 22 13:53:45 2006 @@ -65,7 +65,7 @@ // Various leaf nodes. STRING, BasicBlock, VALUETYPE, CONDCODE, Register, Constant, ConstantFP, - GlobalAddress, FrameIndex, ConstantPool, ExternalSymbol, + GlobalAddress, FrameIndex, JumpTable, ConstantPool, ExternalSymbol, // TargetConstant* - Like Constant*, but the DAG does not do any folding or // simplification of the constant. @@ -77,6 +77,7 @@ // dag, turning into a GlobalAddress operand. TargetGlobalAddress, TargetFrameIndex, + TargetJumpTable, TargetConstantPool, TargetExternalSymbol, @@ -388,6 +389,11 @@ // operand, the second is the MBB to branch to. BR, + // BRIND - Indirect branch. The first operand is the chain, the second + // is the value to branch to, which must be of the same type as the target's + // pointer type. + BRIND, + // BRCOND - Conditional branch. The first operand is the chain, // the second is the condition, the third is the block to branch // to if the condition is true. @@ -1165,6 +1171,24 @@ } }; +class JumpTableSDNode : public SDNode { + int JTI; +protected: + friend class SelectionDAG; + JumpTableSDNode(int jti, MVT::ValueType VT, bool isTarg) + : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, VT), + JTI(jti) {} +public: + + int getIndex() const { return JTI; } + + static bool classof(const JumpTableSDNode *) { return true; } + static bool classof(const SDNode *N) { + return N->getOpcode() == ISD::JumpTable || + N->getOpcode() == ISD::TargetJumpTable; + } +}; + class ConstantPoolSDNode : public SDNode { Constant *C; int Offset; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits