MachineModuleInfo.h revision 6268d69d7386bdd4ba1db5586feedeb0b7e6ddb6
1//===-- llvm/CodeGen/MachineModuleInfo.h ------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Collect meta information for a module. This information should be in a 11// neutral form that can be used by different debugging and exception handling 12// schemes. 13// 14// The organization of information is primarily clustered around the source 15// compile units. The main exception is source line correspondence where 16// inlining may interleave code from various compile units. 17// 18// The following information can be retrieved from the MachineModuleInfo. 19// 20// -- Source directories - Directories are uniqued based on their canonical 21// string and assigned a sequential numeric ID (base 1.) 22// -- Source files - Files are also uniqued based on their name and directory 23// ID. A file ID is sequential number (base 1.) 24// -- Source line correspondence - A vector of file ID, line#, column# triples. 25// A DEBUG_LOCATION instruction is generated by the DAG Legalizer 26// corresponding to each entry in the source line list. This allows a debug 27// emitter to generate labels referenced by debug information tables. 28// 29//===----------------------------------------------------------------------===// 30 31#ifndef LLVM_CODEGEN_MACHINEMODULEINFO_H 32#define LLVM_CODEGEN_MACHINEMODULEINFO_H 33 34#include "llvm/Support/Dwarf.h" 35#include "llvm/Support/DataTypes.h" 36#include "llvm/ADT/SmallVector.h" 37#include "llvm/ADT/DenseMap.h" 38#include "llvm/ADT/UniqueVector.h" 39#include "llvm/ADT/SmallPtrSet.h" 40#include "llvm/ADT/StringMap.h" 41#include "llvm/CodeGen/MachineLocation.h" 42#include "llvm/GlobalValue.h" 43#include "llvm/Pass.h" 44 45namespace llvm { 46 47//===----------------------------------------------------------------------===// 48// Forward declarations. 49class Constant; 50class GlobalVariable; 51class MachineBasicBlock; 52class MachineFunction; 53class Module; 54class PointerType; 55class StructType; 56 57//===----------------------------------------------------------------------===// 58/// LandingPadInfo - This structure is used to retain landing pad info for 59/// the current function. 60/// 61struct LandingPadInfo { 62 MachineBasicBlock *LandingPadBlock; // Landing pad block. 63 SmallVector<unsigned, 1> BeginLabels; // Labels prior to invoke. 64 SmallVector<unsigned, 1> EndLabels; // Labels after invoke. 65 unsigned LandingPadLabel; // Label at beginning of landing pad. 66 Function *Personality; // Personality function. 67 std::vector<int> TypeIds; // List of type ids (filters negative) 68 69 explicit LandingPadInfo(MachineBasicBlock *MBB) 70 : LandingPadBlock(MBB) 71 , LandingPadLabel(0) 72 , Personality(NULL) 73 {} 74}; 75 76//===----------------------------------------------------------------------===// 77/// MachineModuleInfo - This class contains meta information specific to a 78/// module. Queries can be made by different debugging and exception handling 79/// schemes and reformated for specific use. 80/// 81class MachineModuleInfo : public ImmutablePass { 82private: 83 // LabelIDList - One entry per assigned label. Normally the entry is equal to 84 // the list index(+1). If the entry is zero then the label has been deleted. 85 // Any other value indicates the label has been deleted by is mapped to 86 // another label. 87 std::vector<unsigned> LabelIDList; 88 89 // FrameMoves - List of moves done by a function's prolog. Used to construct 90 // frame maps by debug and exception handling consumers. 91 std::vector<MachineMove> FrameMoves; 92 93 // LandingPads - List of LandingPadInfo describing the landing pad information 94 // in the current function. 95 std::vector<LandingPadInfo> LandingPads; 96 97 // TypeInfos - List of C++ TypeInfo used in the current function. 98 // 99 std::vector<GlobalVariable *> TypeInfos; 100 101 // FilterIds - List of typeids encoding filters used in the current function. 102 // 103 std::vector<unsigned> FilterIds; 104 105 // FilterEnds - List of the indices in FilterIds corresponding to filter 106 // terminators. 107 // 108 std::vector<unsigned> FilterEnds; 109 110 // Personalities - Vector of all personality functions ever seen. Used to emit 111 // common EH frames. 112 std::vector<Function *> Personalities; 113 114 // UsedFunctions - the functions in the llvm.used list in a more easily 115 // searchable format. 116 SmallPtrSet<const Function *, 32> UsedFunctions; 117 118 bool CallsEHReturn; 119 bool CallsUnwindInit; 120 121 /// DbgInfoAvailable - True if debugging information is available 122 /// in this module. 123 bool DbgInfoAvailable; 124public: 125 static char ID; // Pass identification, replacement for typeid 126 127 MachineModuleInfo(); 128 ~MachineModuleInfo(); 129 130 /// doInitialization - Initialize the state for a new module. 131 /// 132 bool doInitialization(); 133 134 /// doFinalization - Tear down the state after completion of a module. 135 /// 136 bool doFinalization(); 137 138 /// BeginFunction - Begin gathering function meta information. 139 /// 140 void BeginFunction(MachineFunction *MF); 141 142 /// EndFunction - Discard function meta information. 143 /// 144 void EndFunction(); 145 146 /// AnalyzeModule - Scan the module for global debug information. 147 /// 148 void AnalyzeModule(Module &M); 149 150 /// hasDebugInfo - Returns true if valid debug info is present. 151 /// 152 bool hasDebugInfo() const { return DbgInfoAvailable; } 153 void setDebugInfoAvailability(bool avail) { DbgInfoAvailable = true; } 154 155 bool callsEHReturn() const { return CallsEHReturn; } 156 void setCallsEHReturn(bool b) { CallsEHReturn = b; } 157 158 bool callsUnwindInit() const { return CallsUnwindInit; } 159 void setCallsUnwindInit(bool b) { CallsUnwindInit = b; } 160 161 /// NextLabelID - Return the next unique label id. 162 /// 163 unsigned NextLabelID() { 164 unsigned ID = (unsigned)LabelIDList.size() + 1; 165 LabelIDList.push_back(ID); 166 return ID; 167 } 168 169 /// RecordSourceLine - Records location information and associates it with a 170 /// label. Returns a unique label ID used to generate a label and 171 /// provide correspondence to the source line list. 172 unsigned RecordSourceLine(unsigned Line, unsigned Column, unsigned Source); 173 174 /// InvalidateLabel - Inhibit use of the specified label # from 175 /// MachineModuleInfo, for example because the code was deleted. 176 void InvalidateLabel(unsigned LabelID) { 177 // Remap to zero to indicate deletion. 178 RemapLabel(LabelID, 0); 179 } 180 181 /// RemapLabel - Indicate that a label has been merged into another. 182 /// 183 void RemapLabel(unsigned OldLabelID, unsigned NewLabelID) { 184 assert(0 < OldLabelID && OldLabelID <= LabelIDList.size() && 185 "Old label ID out of range."); 186 assert(NewLabelID <= LabelIDList.size() && 187 "New label ID out of range."); 188 LabelIDList[OldLabelID - 1] = NewLabelID; 189 } 190 191 /// MappedLabel - Find out the label's final ID. Zero indicates deletion. 192 /// ID != Mapped ID indicates that the label was folded into another label. 193 unsigned MappedLabel(unsigned LabelID) const { 194 assert(LabelID <= LabelIDList.size() && "Debug label ID out of range."); 195 return LabelID ? LabelIDList[LabelID - 1] : 0; 196 } 197 198 /// getFrameMoves - Returns a reference to a list of moves done in the current 199 /// function's prologue. Used to construct frame maps for debug and exception 200 /// handling comsumers. 201 std::vector<MachineMove> &getFrameMoves() { return FrameMoves; } 202 203 //===-EH-----------------------------------------------------------------===// 204 205 /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 206 /// specified MachineBasicBlock. 207 LandingPadInfo &getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad); 208 209 /// addInvoke - Provide the begin and end labels of an invoke style call and 210 /// associate it with a try landing pad block. 211 void addInvoke(MachineBasicBlock *LandingPad, unsigned BeginLabel, 212 unsigned EndLabel); 213 214 /// addLandingPad - Add a new panding pad. Returns the label ID for the 215 /// landing pad entry. 216 unsigned addLandingPad(MachineBasicBlock *LandingPad); 217 218 /// addPersonality - Provide the personality function for the exception 219 /// information. 220 void addPersonality(MachineBasicBlock *LandingPad, Function *Personality); 221 222 /// getPersonalityIndex - Get index of the current personality function inside 223 /// Personalitites array 224 unsigned getPersonalityIndex() const; 225 226 /// getPersonalities - Return array of personality functions ever seen. 227 const std::vector<Function *>& getPersonalities() const { 228 return Personalities; 229 } 230 231 // UsedFunctions - Return set of the functions in the llvm.used list. 232 const SmallPtrSet<const Function *, 32>& getUsedFunctions() const { 233 return UsedFunctions; 234 } 235 236 /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 237 /// 238 void addCatchTypeInfo(MachineBasicBlock *LandingPad, 239 std::vector<GlobalVariable *> &TyInfo); 240 241 /// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 242 /// 243 void addFilterTypeInfo(MachineBasicBlock *LandingPad, 244 std::vector<GlobalVariable *> &TyInfo); 245 246 /// addCleanup - Add a cleanup action for a landing pad. 247 /// 248 void addCleanup(MachineBasicBlock *LandingPad); 249 250 /// getTypeIDFor - Return the type id for the specified typeinfo. This is 251 /// function wide. 252 unsigned getTypeIDFor(GlobalVariable *TI); 253 254 /// getFilterIDFor - Return the id of the filter encoded by TyIds. This is 255 /// function wide. 256 int getFilterIDFor(std::vector<unsigned> &TyIds); 257 258 /// TidyLandingPads - Remap landing pad labels and remove any deleted landing 259 /// pads. 260 void TidyLandingPads(); 261 262 /// getLandingPads - Return a reference to the landing pad info for the 263 /// current function. 264 const std::vector<LandingPadInfo> &getLandingPads() const { 265 return LandingPads; 266 } 267 268 /// getTypeInfos - Return a reference to the C++ typeinfo for the current 269 /// function. 270 const std::vector<GlobalVariable *> &getTypeInfos() const { 271 return TypeInfos; 272 } 273 274 /// getFilterIds - Return a reference to the typeids encoding filters used in 275 /// the current function. 276 const std::vector<unsigned> &getFilterIds() const { 277 return FilterIds; 278 } 279 280 /// getPersonality - Return a personality function if available. The presence 281 /// of one is required to emit exception handling info. 282 Function *getPersonality() const; 283 284}; // End class MachineModuleInfo 285 286} // End llvm namespace 287 288#endif 289