Changes in directory llvm/lib/CodeGen:
MachineModuleInfo.cpp updated: 1.3 -> 1.4 --- Log message: Add structures used for collecting eh information. --- Diffs of the changes: (+94 -0) MachineModuleInfo.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 94 insertions(+) Index: llvm/lib/CodeGen/MachineModuleInfo.cpp diff -u llvm/lib/CodeGen/MachineModuleInfo.cpp:1.3 llvm/lib/CodeGen/MachineModuleInfo.cpp:1.4 --- llvm/lib/CodeGen/MachineModuleInfo.cpp:1.3 Thu Feb 1 10:31:34 2007 +++ llvm/lib/CodeGen/MachineModuleInfo.cpp Wed Feb 21 16:38:31 2007 @@ -1472,6 +1472,7 @@ , ScopeMap() , RootScope(NULL) , FrameMoves() +, LandingPads() {} MachineModuleInfo::~MachineModuleInfo() { @@ -1510,6 +1511,10 @@ // Clean up frame info. FrameMoves.clear(); + + // Clean up exception info. + LandingPads.clear(); + TypeInfos.clear(); } /// getDescFor - Convert a Value to a debug information descriptor. @@ -1640,6 +1645,95 @@ return Slot; } +//===-EH-------------------------------------------------------------------===// + +/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the +/// specified MachineBasicBlock. +LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo + (MachineBasicBlock *LandingPad) { + unsigned N = LandingPads.size(); + for (unsigned i = 0; i < N; ++i) { + LandingPadInfo &UI = LandingPads[i]; + if (UI.LandingPadBlock == LandingPad) + return UI; + } + + LandingPads.push_back(LandingPadInfo(LandingPad)); + return LandingPads[N]; +} + +/// addInvoke - Provide the begin and end labels of an invoke style call and +/// associate it with a try landing pad block. +void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, + unsigned BeginLabel, unsigned EndLabel) { + LandingPadInfo &UI = getOrCreateLandingPadInfo(LandingPad); + if (!UI.BeginLabel) UI.BeginLabel = BeginLabel; + UI.EndLabel = EndLabel; +} + +/// addLandingPad - Provide the label of a try LandingPad block. +/// +unsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { + unsigned LandingPadLabel = NextLabelID(); + LandingPadInfo &UI = getOrCreateLandingPadInfo(LandingPad); + UI.LandingPadLabel = LandingPadLabel; + return LandingPadLabel; +} + +/// addPersonality - Provide the personality function for the exception +/// information. +void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, + Function *Personality) { + LandingPadInfo &UI = getOrCreateLandingPadInfo(LandingPad); + UI.Personality = Personality; +} + +/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. +/// +void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, + std::vector<GlobalVariable *> &TyInfo) { + LandingPadInfo &UI = getOrCreateLandingPadInfo(LandingPad); + for (unsigned N = TyInfo.size(); N; --N) + UI.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); +} + +/// TidyLandingPads - Remap landing pad labels and remove any deleted landing +/// pads. +void MachineModuleInfo::TidyLandingPads() { + for (unsigned i = 0; i != LandingPads.size(); ) { + LandingPadInfo &LandingPad = LandingPads[i]; + LandingPad.BeginLabel = MappedLabel(LandingPad.BeginLabel); + LandingPad.EndLabel = MappedLabel(LandingPad.EndLabel); + LandingPad.LandingPadLabel = MappedLabel(LandingPad.LandingPadLabel); + + if (!LandingPad.BeginLabel || + !LandingPad.EndLabel || + !LandingPad.LandingPadLabel) { + LandingPads.erase(LandingPads.begin() + i); + continue; + } + + ++i; + } +} + +/// getTypeIDFor - Return the type id for the specified typeinfo. This is +/// function wide. +unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { + for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) + if (TypeInfos[i] == TI) return i + 1; + + TypeInfos.push_back(TI); + return TypeInfos.size(); +} + +/// getLandingPadInfos - Return a reference to the landing pad info for the +/// current function. +Function *MachineModuleInfo::getPersonality() const { + return !LandingPads.empty() ? LandingPads[0].Personality : NULL; +} + + //===----------------------------------------------------------------------===// /// DebugLabelFolding pass - This pass prunes out redundant labels. This allows /// a info consumer to determine if the range of two labels is empty, by seeing _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits