diff options
Diffstat (limited to 'include/llvm/CodeGen/MachineModuleInfo.h')
| -rw-r--r-- | include/llvm/CodeGen/MachineModuleInfo.h | 344 |
1 files changed, 84 insertions, 260 deletions
diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index 77571124a1b8..182d23ef3c90 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -35,62 +35,38 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Analysis/EHPersonalities.h" #include "llvm/IR/DebugLoc.h" -#include "llvm/IR/Metadata.h" #include "llvm/IR/ValueHandle.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MachineLocation.h" #include "llvm/Pass.h" #include "llvm/Support/DataTypes.h" -#include "llvm/Support/Dwarf.h" namespace llvm { //===----------------------------------------------------------------------===// // Forward declarations. +class BlockAddress; +class CallInst; class Constant; class GlobalVariable; -class BlockAddress; +class LandingPadInst; class MDNode; class MMIAddrLabelMap; class MachineBasicBlock; class MachineFunction; +class MachineFunctionInitializer; class Module; class PointerType; class StructType; -struct SEHHandler { - // Filter or finally function. Null indicates a catch-all. - const Function *FilterOrFinally; - - // Address of block to recover at. Null for a finally handler. - const BlockAddress *RecoverBA; -}; - //===----------------------------------------------------------------------===// -/// LandingPadInfo - This structure is used to retain landing pad info for -/// the current function. +/// This class can be derived from and used by targets to hold private +/// target-specific information for each Module. Objects of type are +/// accessed/created with MMI::getInfo and destroyed when the MachineModuleInfo +/// is destroyed. /// -struct LandingPadInfo { - MachineBasicBlock *LandingPadBlock; // Landing pad block. - SmallVector<MCSymbol *, 1> BeginLabels; // Labels prior to invoke. - SmallVector<MCSymbol *, 1> EndLabels; // Labels after invoke. - SmallVector<SEHHandler, 1> SEHHandlers; // SEH handlers active at this lpad. - MCSymbol *LandingPadLabel; // Label at beginning of landing pad. - std::vector<int> TypeIds; // List of type ids (filters negative). - - explicit LandingPadInfo(MachineBasicBlock *MBB) - : LandingPadBlock(MBB), LandingPadLabel(nullptr) {} -}; - -//===----------------------------------------------------------------------===// -/// MachineModuleInfoImpl - This class can be derived from and used by targets -/// to hold private target-specific information for each Module. Objects of -/// type are accessed/created with MMI::getInfo and destroyed when the -/// MachineModuleInfo is destroyed. -/// class MachineModuleInfoImpl { public: typedef PointerIntPair<MCSymbol*, 1, bool> StubValueTy; @@ -104,127 +80,99 @@ protected: }; //===----------------------------------------------------------------------===// -/// MachineModuleInfo - This class contains meta information specific to a -/// module. Queries can be made by different debugging and exception handling -/// schemes and reformated for specific use. +/// This class contains meta information specific to a module. Queries can be +/// made by different debugging and exception handling schemes and reformated +/// for specific use. /// class MachineModuleInfo : public ImmutablePass { - /// Context - This is the MCContext used for the entire code generator. + const TargetMachine &TM; + + /// This is the MCContext used for the entire code generator. MCContext Context; - /// TheModule - This is the LLVM Module being worked on. + /// This is the LLVM Module being worked on. const Module *TheModule; - /// ObjFileMMI - This is the object-file-format-specific implementation of + /// This is the object-file-format-specific implementation of /// MachineModuleInfoImpl, which lets targets accumulate whatever info they /// want. MachineModuleInfoImpl *ObjFileMMI; - /// List of moves done by a function's prolog. Used to construct frame maps - /// by debug and exception handling consumers. - std::vector<MCCFIInstruction> FrameInstructions; - - /// LandingPads - List of LandingPadInfo describing the landing pad - /// information in the current function. - std::vector<LandingPadInfo> LandingPads; - - /// LPadToCallSiteMap - Map a landing pad's EH symbol to the call site - /// indexes. - DenseMap<MCSymbol*, SmallVector<unsigned, 4> > LPadToCallSiteMap; + /// \name Exception Handling + /// \{ - /// CallSiteMap - Map of invoke call site index values to associated begin - /// EH_LABEL for the current function. - DenseMap<MCSymbol*, unsigned> CallSiteMap; + /// Vector of all personality functions ever seen. Used to emit common EH + /// frames. + std::vector<const Function *> Personalities; - /// CurCallSite - The current call site index being processed, if any. 0 if - /// none. + /// The current call site index being processed, if any. 0 if none. unsigned CurCallSite; - /// TypeInfos - List of C++ TypeInfo used in the current function. - std::vector<const GlobalValue *> TypeInfos; - - /// FilterIds - List of typeids encoding filters used in the current function. - std::vector<unsigned> FilterIds; - - /// FilterEnds - List of the indices in FilterIds corresponding to filter - /// terminators. - std::vector<unsigned> FilterEnds; - - /// Personalities - Vector of all personality functions ever seen. Used to - /// emit common EH frames. - std::vector<const Function *> Personalities; + /// \} - /// AddrLabelSymbols - This map keeps track of which symbol is being used for - /// the specified basic block's address of label. + /// This map keeps track of which symbol is being used for the specified + /// basic block's address of label. MMIAddrLabelMap *AddrLabelSymbols; - bool CallsEHReturn; - bool CallsUnwindInit; - bool HasEHFunclets; - // TODO: Ideally, what we'd like is to have a switch that allows emitting // synchronous (precise at call-sites only) CFA into .eh_frame. However, // even under this switch, we'd like .debug_frame to be precise when using. // -g. At this moment, there's no way to specify that some CFI directives // go into .eh_frame only, while others go into .debug_frame only. - /// DbgInfoAvailable - True if debugging information is available - /// in this module. + /// True if debugging information is available in this module. bool DbgInfoAvailable; - /// UsesVAFloatArgument - True if this module calls VarArg function with - /// floating-point arguments. This is used to emit an undefined reference - /// to _fltused on Windows targets. + /// True if this module calls VarArg function with floating-point arguments. + /// This is used to emit an undefined reference to _fltused on Windows + /// targets. bool UsesVAFloatArgument; - /// UsesMorestackAddr - True if the module calls the __morestack function - /// indirectly, as is required under the large code model on x86. This is used - /// to emit a definition of a symbol, __morestack_addr, containing the - /// address. See comments in lib/Target/X86/X86FrameLowering.cpp for more - /// details. + /// True if the module calls the __morestack function indirectly, as is + /// required under the large code model on x86. This is used to emit + /// a definition of a symbol, __morestack_addr, containing the address. See + /// comments in lib/Target/X86/X86FrameLowering.cpp for more details. bool UsesMorestackAddr; - EHPersonality PersonalityTypeCache; + MachineFunctionInitializer *MFInitializer; + /// Maps IR Functions to their corresponding MachineFunctions. + DenseMap<const Function*, std::unique_ptr<MachineFunction>> MachineFunctions; + /// Next unique number available for a MachineFunction. + unsigned NextFnNum = 0; + const Function *LastRequest = nullptr; ///< Used for shortcut/cache. + MachineFunction *LastResult = nullptr; ///< Used for shortcut/cache. public: static char ID; // Pass identification, replacement for typeid - struct VariableDbgInfo { - const DILocalVariable *Var; - const DIExpression *Expr; - unsigned Slot; - const DILocation *Loc; - - VariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, - unsigned Slot, const DILocation *Loc) - : Var(Var), Expr(Expr), Slot(Slot), Loc(Loc) {} - }; - typedef SmallVector<VariableDbgInfo, 4> VariableDbgInfoMapTy; - VariableDbgInfoMapTy VariableDbgInfos; - - MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL. - // Real constructor. - MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI, - const MCObjectFileInfo *MOFI); + explicit MachineModuleInfo(const TargetMachine *TM = nullptr); ~MachineModuleInfo() override; // Initialization and Finalization bool doInitialization(Module &) override; bool doFinalization(Module &) override; - /// EndFunction - Discard function meta information. - /// - void EndFunction(); - const MCContext &getContext() const { return Context; } MCContext &getContext() { return Context; } void setModule(const Module *M) { TheModule = M; } const Module *getModule() const { return TheModule; } - /// getInfo - Keep track of various per-function pieces of information for - /// backends that would like to do so. - /// + void setMachineFunctionInitializer(MachineFunctionInitializer *MFInit) { + MFInitializer = MFInit; + } + + /// Returns the MachineFunction constructed for the IR function \p F. + /// Creates a new MachineFunction and runs the MachineFunctionInitializer + /// if none exists yet. + MachineFunction &getMachineFunction(const Function &F); + + /// Delete the MachineFunction \p MF and reset the link in the IR Function to + /// Machine Function map. + void deleteMachineFunctionFor(Function &F); + + /// Keep track of various per-function pieces of information for backends + /// that would like to do so. template<typename Ty> Ty &getObjFileInfo() { if (ObjFileMMI == nullptr) @@ -237,20 +185,10 @@ public: return const_cast<MachineModuleInfo*>(this)->getObjFileInfo<Ty>(); } - /// hasDebugInfo - Returns true if valid debug info is present. - /// + /// Returns true if valid debug info is present. bool hasDebugInfo() const { return DbgInfoAvailable; } void setDebugInfoAvailability(bool avail) { DbgInfoAvailable = avail; } - bool callsEHReturn() const { return CallsEHReturn; } - void setCallsEHReturn(bool b) { CallsEHReturn = b; } - - bool callsUnwindInit() const { return CallsUnwindInit; } - void setCallsUnwindInit(bool b) { CallsUnwindInit = b; } - - bool hasEHFunclets() const { return HasEHFunclets; } - void setHasEHFunclets(bool V) { HasEHFunclets = V; } - bool usesVAFloatArgument() const { return UsesVAFloatArgument; } @@ -267,166 +205,52 @@ public: UsesMorestackAddr = b; } - /// \brief Returns a reference to a list of cfi instructions in the current - /// function's prologue. Used to construct frame maps for debug and exception - /// handling comsumers. - const std::vector<MCCFIInstruction> &getFrameInstructions() const { - return FrameInstructions; - } - - unsigned LLVM_ATTRIBUTE_UNUSED_RESULT - addFrameInst(const MCCFIInstruction &Inst) { - FrameInstructions.push_back(Inst); - return FrameInstructions.size() - 1; - } - - /// getAddrLabelSymbol - Return the symbol to be used for the specified basic - /// block when its address is taken. This cannot be its normal LBB label - /// because the block may be accessed outside its containing function. + /// Return the symbol to be used for the specified basic block when its + /// address is taken. This cannot be its normal LBB label because the block + /// may be accessed outside its containing function. MCSymbol *getAddrLabelSymbol(const BasicBlock *BB) { return getAddrLabelSymbolToEmit(BB).front(); } - /// getAddrLabelSymbolToEmit - Return the symbol to be used for the specified - /// basic block when its address is taken. If other blocks were RAUW'd to - /// this one, we may have to emit them as well, return the whole set. + /// Return the symbol to be used for the specified basic block when its + /// address is taken. If other blocks were RAUW'd to this one, we may have + /// to emit them as well, return the whole set. ArrayRef<MCSymbol *> getAddrLabelSymbolToEmit(const BasicBlock *BB); - /// takeDeletedSymbolsForFunction - If the specified function has had any - /// references to address-taken blocks generated, but the block got deleted, - /// return the symbol now so we can emit it. This prevents emitting a - /// reference to a symbol that has no definition. + /// If the specified function has had any references to address-taken blocks + /// generated, but the block got deleted, return the symbol now so we can + /// emit it. This prevents emitting a reference to a symbol that has no + /// definition. void takeDeletedSymbolsForFunction(const Function *F, std::vector<MCSymbol*> &Result); + /// \name Exception Handling + /// \{ - //===- EH ---------------------------------------------------------------===// - - /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the - /// specified MachineBasicBlock. - LandingPadInfo &getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad); - - /// addInvoke - Provide the begin and end labels of an invoke style call and - /// associate it with a try landing pad block. - void addInvoke(MachineBasicBlock *LandingPad, - MCSymbol *BeginLabel, MCSymbol *EndLabel); + /// Set the call site currently being processed. + void setCurrentCallSite(unsigned Site) { CurCallSite = Site; } - /// addLandingPad - Add a new panding pad. Returns the label ID for the - /// landing pad entry. - MCSymbol *addLandingPad(MachineBasicBlock *LandingPad); + /// Get the call site currently being processed, if any. return zero if + /// none. + unsigned getCurrentCallSite() { return CurCallSite; } - /// addPersonality - Provide the personality function for the exception - /// information. + /// Provide the personality function for the exception information. void addPersonality(const Function *Personality); - /// getPersonalities - Return array of personality functions ever seen. + /// Return array of personality functions ever seen. const std::vector<const Function *>& getPersonalities() const { return Personalities; } + /// \} +}; // End class MachineModuleInfo - /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. - /// - void addCatchTypeInfo(MachineBasicBlock *LandingPad, - ArrayRef<const GlobalValue *> TyInfo); - - /// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. - /// - void addFilterTypeInfo(MachineBasicBlock *LandingPad, - ArrayRef<const GlobalValue *> TyInfo); - - /// addCleanup - Add a cleanup action for a landing pad. - /// - void addCleanup(MachineBasicBlock *LandingPad); - - void addSEHCatchHandler(MachineBasicBlock *LandingPad, const Function *Filter, - const BlockAddress *RecoverLabel); - - void addSEHCleanupHandler(MachineBasicBlock *LandingPad, - const Function *Cleanup); - - /// getTypeIDFor - Return the type id for the specified typeinfo. This is - /// function wide. - unsigned getTypeIDFor(const GlobalValue *TI); - - /// getFilterIDFor - Return the id of the filter encoded by TyIds. This is - /// function wide. - int getFilterIDFor(std::vector<unsigned> &TyIds); - - /// TidyLandingPads - Remap landing pad labels and remove any deleted landing - /// pads. - void TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap = nullptr); - - /// getLandingPads - Return a reference to the landing pad info for the - /// current function. - const std::vector<LandingPadInfo> &getLandingPads() const { - return LandingPads; - } - - /// setCallSiteLandingPad - Map the landing pad's EH symbol to the call - /// site indexes. - void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites); - - /// getCallSiteLandingPad - Get the call site indexes for a landing pad EH - /// symbol. - SmallVectorImpl<unsigned> &getCallSiteLandingPad(MCSymbol *Sym) { - assert(hasCallSiteLandingPad(Sym) && - "missing call site number for landing pad!"); - return LPadToCallSiteMap[Sym]; - } - - /// hasCallSiteLandingPad - Return true if the landing pad Eh symbol has an - /// associated call site. - bool hasCallSiteLandingPad(MCSymbol *Sym) { - return !LPadToCallSiteMap[Sym].empty(); - } - - /// setCallSiteBeginLabel - Map the begin label for a call site. - void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site) { - CallSiteMap[BeginLabel] = Site; - } - - /// getCallSiteBeginLabel - Get the call site number for a begin label. - unsigned getCallSiteBeginLabel(MCSymbol *BeginLabel) { - assert(hasCallSiteBeginLabel(BeginLabel) && - "Missing call site number for EH_LABEL!"); - return CallSiteMap[BeginLabel]; - } - - /// hasCallSiteBeginLabel - Return true if the begin label has a call site - /// number associated with it. - bool hasCallSiteBeginLabel(MCSymbol *BeginLabel) { - return CallSiteMap[BeginLabel] != 0; - } - - /// setCurrentCallSite - Set the call site currently being processed. - void setCurrentCallSite(unsigned Site) { CurCallSite = Site; } - - /// getCurrentCallSite - Get the call site currently being processed, if any. - /// return zero if none. - unsigned getCurrentCallSite() { return CurCallSite; } - - /// getTypeInfos - Return a reference to the C++ typeinfo for the current - /// function. - const std::vector<const GlobalValue *> &getTypeInfos() const { - return TypeInfos; - } - - /// getFilterIds - Return a reference to the typeids encoding filters used in - /// the current function. - const std::vector<unsigned> &getFilterIds() const { - return FilterIds; - } - - /// setVariableDbgInfo - Collect information used to emit debugging - /// information of a variable. - void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, - unsigned Slot, const DILocation *Loc) { - VariableDbgInfos.emplace_back(Var, Expr, Slot, Loc); - } - - VariableDbgInfoMapTy &getVariableDbgInfo() { return VariableDbgInfos; } +//===- MMI building helpers -----------------------------------------------===// -}; // End class MachineModuleInfo +/// Determine if any floating-point values are being passed to this variadic +/// function, and set the MachineModuleInfo's usesVAFloatArgument flag if so. +/// This flag is used to emit an undefined reference to _fltused on Windows, +/// which will link in MSVCRT's floating-point support. +void computeUsesVAFloatArgument(const CallInst &I, MachineModuleInfo &MMI); } // End llvm namespace |
