X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FMachineModuleInfo.cpp;h=9943fa9967693d7f7a4e22294c1cdc958a5b1b9f;hb=ee888132754c709de8d2e2c5ef85531a15ed44f2;hp=ab664ac8cbbde82d4a0974bfadd4323668ee3d2d;hpb=3e15bf33e024b9df9e89351a165acfdb1dde51ed;p=oota-llvm.git diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index ab664ac8cbb..9943fa99676 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -30,7 +30,7 @@ using namespace llvm::dwarf; namespace { RegisterPass X("machinemoduleinfo", "Module Information"); } -const char MachineModuleInfo::ID = 0; +char MachineModuleInfo::ID = 0; //===----------------------------------------------------------------------===// @@ -1323,7 +1323,7 @@ Constant *DISerializer::getString(const std::string &String) { // Otherwise create and return a new string global. GlobalVariable *StrGV = new GlobalVariable(ConstStr->getType(), true, GlobalVariable::InternalLinkage, - ConstStr, "str", M); + ConstStr, ".str", M); StrGV->setSection("llvm.metadata"); // Convert to generic string pointer. Slot = ConstantExpr::getBitCast(StrGV, getStrPtrType()); @@ -1364,6 +1364,12 @@ GlobalVariable *DISerializer::Serialize(DebugInfoDesc *DD) { return GV; } +/// addDescriptor - Directly connect DD with existing GV. +void DISerializer::addDescriptor(DebugInfoDesc *DD, + GlobalVariable *GV) { + DescGlobals[DD] = GV; +} + //===----------------------------------------------------------------------===// /// Verify - Return true if the GlobalVariable appears to be a valid @@ -1475,7 +1481,13 @@ MachineModuleInfo::MachineModuleInfo() , RootScope(NULL) , FrameMoves() , LandingPads() -{} +, Personalities() +, CallsEHReturn(0) +, CallsUnwindInit(0) +{ + // Always emit "no personality" info + Personalities.push_back(NULL); +} MachineModuleInfo::~MachineModuleInfo() { } @@ -1517,6 +1529,10 @@ void MachineModuleInfo::EndFunction() { // Clean up exception info. LandingPads.clear(); TypeInfos.clear(); + FilterIds.clear(); + FilterEnds.clear(); + CallsEHReturn = 0; + CallsUnwindInit = 0; } /// getDescFor - Convert a Value to a debug information descriptor. @@ -1669,8 +1685,8 @@ LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, unsigned BeginLabel, unsigned EndLabel) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); - if (!LP.BeginLabel) LP.BeginLabel = BeginLabel; - LP.EndLabel = EndLabel; + LP.BeginLabels.push_back(BeginLabel); + LP.EndLabels.push_back(EndLabel); } /// addLandingPad - Provide the label of a try LandingPad block. @@ -1688,6 +1704,12 @@ void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, Function *Personality) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); LP.Personality = Personality; + + for (unsigned i = 0; i < Personalities.size(); ++i) + if (Personalities[i] == Personality) + return; + + Personalities.push_back(Personality); } /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. @@ -1698,12 +1720,23 @@ void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, for (unsigned N = TyInfo.size(); N; --N) LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); } - -/// setIsFilterLandingPad - Indicates that the landing pad is a throw filter. + +/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. /// -void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) { +void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, + std::vector &TyInfo) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); - LP.IsFilter = true; + std::vector IdsInFilter (TyInfo.size()); + for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) + IdsInFilter[I] = getTypeIDFor(TyInfo[I]); + LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); +} + +/// addCleanup - Add a cleanup action for a landing pad. +/// +void MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { + LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); + LP.TypeIds.push_back(0); } /// TidyLandingPads - Remap landing pad labels and remove any deleted landing @@ -1711,17 +1744,43 @@ void MachineModuleInfo::setIsFilterLandingPad(MachineBasicBlock *LandingPad) { 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) { + + // Special case: we *should* emit LPs with null LP MBB. This indicates + // "rethrow" case. + if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { LandingPads.erase(LandingPads.begin() + i); continue; } - + + for (unsigned j=0; j != LandingPads[i].BeginLabels.size(); ) { + unsigned BeginLabel = MappedLabel(LandingPad.BeginLabels[j]); + unsigned EndLabel = MappedLabel(LandingPad.EndLabels[j]); + + + if (!BeginLabel || !EndLabel) { + LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); + LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); + continue; + } + + LandingPad.BeginLabels[j] = BeginLabel; + LandingPad.EndLabels[j] = EndLabel; + ++j; + } + + // Remove landing pads with no try-ranges. + if (!LandingPads[i].BeginLabels.size()) { + LandingPads.erase(LandingPads.begin() + i); + continue; + } + + // If there is no landing pad, ensure that the list of typeids is empty. + // If the only typeid is a cleanup, this is the same as having no typeids. + if (!LandingPad.LandingPadBlock || + (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) + LandingPad.TypeIds.clear(); + ++i; } } @@ -1736,12 +1795,65 @@ unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { return TypeInfos.size(); } -/// getLandingPadInfos - Return a reference to the landing pad info for the -/// current function. +/// getFilterIDFor - Return the filter id for the specified typeinfos. This is +/// function wide. +int MachineModuleInfo::getFilterIDFor(std::vector &TyIds) { + // If the new filter coincides with the tail of an existing filter, then + // re-use the existing filter. Folding filters more than this requires + // re-ordering filters and/or their elements - probably not worth it. + for (std::vector::iterator I = FilterEnds.begin(), + E = FilterEnds.end(); I != E; ++I) { + unsigned i = *I, j = TyIds.size(); + + while (i && j) + if (FilterIds[--i] != TyIds[--j]) + goto try_next; + + if (!j) + // The new filter coincides with range [i, end) of the existing filter. + return -(1 + i); + +try_next:; + } + + // Add the new filter. + int FilterID = -(1 + FilterIds.size()); + FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); + for (unsigned I = 0, N = TyIds.size(); I != N; ++I) + FilterIds.push_back(TyIds[I]); + FilterEnds.push_back(FilterIds.size()); + FilterIds.push_back(0); // terminator + return FilterID; +} + +/// getPersonality - Return the personality function for the current function. Function *MachineModuleInfo::getPersonality() const { + // FIXME: Until PR1414 will be fixed, we're using 1 personality function per + // function return !LandingPads.empty() ? LandingPads[0].Personality : NULL; } +/// getPersonalityIndex - Return unique index for current personality +/// function. NULL personality function should always get zero index. +unsigned MachineModuleInfo::getPersonalityIndex() const { + const Function* Personality = NULL; + + // Scan landing pads. If there is at least one non-NULL personality - use it. + for (unsigned i = 0; i != LandingPads.size(); ++i) + if (LandingPads[i].Personality) { + Personality = LandingPads[i].Personality; + break; + } + + for (unsigned i = 0; i < Personalities.size(); ++i) { + if (Personalities[i] == Personality) + return i; + } + + // This should never happen + assert(0 && "Personality function should be set!"); + return 0; +} //===----------------------------------------------------------------------===// /// DebugLabelFolding pass - This pass prunes out redundant labels. This allows @@ -1751,14 +1863,14 @@ Function *MachineModuleInfo::getPersonality() const { namespace llvm { struct DebugLabelFolder : public MachineFunctionPass { - static const char ID; + static char ID; DebugLabelFolder() : MachineFunctionPass((intptr_t)&ID) {} virtual bool runOnMachineFunction(MachineFunction &MF); virtual const char *getPassName() const { return "Label Folder"; } }; -const char DebugLabelFolder::ID = 0; +char DebugLabelFolder::ID = 0; bool DebugLabelFolder::runOnMachineFunction(MachineFunction &MF) { // Get machine module info.