Remove subreg index from MachineInstr's and also keep vregs as unsigned when adding...
[oota-llvm.git] / include / llvm / CodeGen / MachineJumpTableInfo.h
1 //===-- CodeGen/MachineJumpTableInfo.h - Abstract Jump Tables  --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Nate Begeman and is distributed under the
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // The MachineJumpTableInfo class keeps track of jump tables referenced by
11 // lowered switch instructions in the MachineFunction.
12 //
13 // Instructions reference the address of these jump tables through the use of 
14 // MO_JumpTableIndex values.  When emitting assembly or machine code, these 
15 // virtual address references are converted to refer to the address of the 
16 // function jump tables.
17 //
18 //===----------------------------------------------------------------------===//
19
20 #ifndef LLVM_CODEGEN_MACHINEJUMPTABLEINFO_H
21 #define LLVM_CODEGEN_MACHINEJUMPTABLEINFO_H
22
23 #include <vector>
24 #include <iosfwd>
25
26 namespace llvm {
27
28 class MachineBasicBlock;
29 class TargetData;
30
31 /// MachineJumpTableEntry - One jump table in the jump table info.
32 ///
33 struct MachineJumpTableEntry {
34   /// MBBs - The vector of basic blocks from which to create the jump table.
35   std::vector<MachineBasicBlock*> MBBs;
36   
37   explicit MachineJumpTableEntry(const std::vector<MachineBasicBlock*> &M)
38   : MBBs(M) {}
39 };
40   
41 class MachineJumpTableInfo {
42   unsigned EntrySize;
43   unsigned Alignment;
44   std::vector<MachineJumpTableEntry> JumpTables;
45 public:
46   MachineJumpTableInfo(unsigned Size, unsigned Align)
47   : EntrySize(Size), Alignment(Align) {}
48     
49   /// getJumpTableIndex - Create a new jump table or return an existing one.
50   ///
51   unsigned getJumpTableIndex(const std::vector<MachineBasicBlock*> &DestBBs);
52   
53   /// isEmpty - Return true if there are no jump tables.
54   ///
55   bool isEmpty() const { return JumpTables.empty(); }
56
57   const std::vector<MachineJumpTableEntry> &getJumpTables() const {
58     return JumpTables;
59   }
60   
61   /// RemoveJumpTable - Mark the specific index as being dead.  This will cause
62   /// it to not be emitted.
63   void RemoveJumpTable(unsigned Idx) {
64     JumpTables[Idx].MBBs.clear();
65   }
66   
67   /// ReplaceMBBInJumpTables - If Old is the target of any jump tables, update
68   /// the jump tables to branch to New instead.
69   bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New) {
70     assert(Old != New && "Not making a change?");
71     bool MadeChange = false;
72     for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
73       MachineJumpTableEntry &JTE = JumpTables[i];
74       for (unsigned j = 0, e = JTE.MBBs.size(); j != e; ++j)
75         if (JTE.MBBs[j] == Old) {
76           JTE.MBBs[j] = New;
77           MadeChange = true;
78         }
79     }
80     return MadeChange;
81   }
82   
83   /// getEntrySize - Returns the size of an individual field in a jump table. 
84   ///
85   unsigned getEntrySize() const { return EntrySize; }
86   
87   /// getAlignment - returns the target's preferred alignment for jump tables
88   unsigned getAlignment() const { return Alignment; }
89   
90   /// print - Used by the MachineFunction printer to print information about
91   /// jump tables.  Implemented in MachineFunction.cpp
92   ///
93   void print(std::ostream &OS) const;
94   void print(std::ostream *OS) const { if (OS) print(*OS); }
95
96   /// dump - Call print(std::cerr) to be called from the debugger.
97   ///
98   void dump() const;
99 };
100
101 } // End llvm namespace
102
103 #endif