Changes in directory llvm/lib/CodeGen:
DwarfWriter.cpp updated: 1.142 -> 1.143 MachineModuleInfo.cpp updated: 1.13 -> 1.14 --- Log message: Emit multiple common EH frames for multiple (including blank) personality functions. This partly fixes PR1414: http://llvm.org/PR1414 : now we're restricted only to one personality function per eh frame, not per module. Further work on "multiple personalities" topic needs representative example. --- Diffs of the changes: (+51 -34) DwarfWriter.cpp | 42 +++++++++++++++++++++--------------------- MachineModuleInfo.cpp | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 51 insertions(+), 34 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.142 llvm/lib/CodeGen/DwarfWriter.cpp:1.143 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.142 Sat May 12 17:36:25 2007 +++ llvm/lib/CodeGen/DwarfWriter.cpp Sun May 13 10:42:26 2007 @@ -2720,13 +2720,16 @@ struct FunctionEHFrameInfo { std::string FnName; unsigned Number; + unsigned PersonalityIndex; bool hasCalls; bool hasLandingPads; std::vector<MachineMove> Moves; - FunctionEHFrameInfo(const std::string &FN, unsigned Num, bool hC, bool hL, + FunctionEHFrameInfo(const std::string &FN, unsigned Num, unsigned P, + bool hC, bool hL, const std::vector<MachineMove> &M): - FnName(FN), Number(Num), hasCalls(hC), hasLandingPads(hL), Moves(M) { }; + FnName(FN), Number(Num), PersonalityIndex(P), + hasCalls(hC), hasLandingPads(hL), Moves(M) { }; }; std::vector<FunctionEHFrameInfo> EHFrames; @@ -2737,11 +2740,7 @@ /// EmitCommonEHFrame - Emit the common eh unwind frame. /// - void EmitCommonEHFrame() { - // If there is a personality present then we need to indicate that - // in the common eh frame. - Function *Personality = MMI->getPersonality(); - + void EmitCommonEHFrame(const Function *Personality, unsigned Index) { // Size and sign of stack growth. int stackGrowth = Asm->TM.getFrameInfo()->getStackGrowthDirection() == @@ -2750,19 +2749,19 @@ // Begin eh frame section. Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection()); - O << "EH_frame:\n"; - EmitLabel("section_eh_frame", 0); + O << "EH_frame" << Index << ":\n"; + EmitLabel("section_eh_frame", Index); // Define base labels. - EmitLabel("eh_frame_common", 0); + EmitLabel("eh_frame_common", Index); // Define the eh frame length. - EmitDifference("eh_frame_common_end", 0, - "eh_frame_common_begin", 0, true); + EmitDifference("eh_frame_common_end", Index, + "eh_frame_common_begin", Index, true); Asm->EOL("Length of Common Information Entry"); // EH frame header. - EmitLabel("eh_frame_common_begin", 0); + EmitLabel("eh_frame_common_begin", Index); Asm->EmitInt32((int)0); Asm->EOL("CIE Identifier Tag"); Asm->EmitInt8(DW_CIE_VERSION); @@ -2810,7 +2809,7 @@ EmitFrameMoves(NULL, 0, Moves); Asm->EmitAlignment(2); - EmitLabel("eh_frame_common_end", 0); + EmitLabel("eh_frame_common_end", Index); Asm->EOL(); } @@ -2818,10 +2817,6 @@ /// EmitEHFrame - Emit function exception frame information. /// void EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) { - // If there is a personality present then we need to indicate that - // in the common eh frame. - Function *Personality = MMI->getPersonality(); - Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection()); // Externally visible entry into the functions eh frame info. @@ -2842,7 +2837,8 @@ EmitLabel("eh_frame_begin", EHFrameInfo.Number); EmitSectionOffset("eh_frame_begin", "section_eh_frame", - EHFrameInfo.Number, 0, true, true); + EHFrameInfo.Number, EHFrameInfo.PersonalityIndex, + true, true); Asm->EOL("FDE CIE offset"); EmitReference("eh_func_begin", EHFrameInfo.Number, true); @@ -2853,7 +2849,7 @@ // If there is a personality and landing pads then point to the language // specific data area in the exception table. - if (Personality) { + if (EHFrameInfo.PersonalityIndex) { Asm->EmitULEB128Bytes(4); Asm->EOL("Augmentation size"); @@ -3117,8 +3113,11 @@ /// content. void EndModule() { if (!shouldEmit) return; + + const std::vector<Function *> Personalities = MMI->getPersonalities(); + for (unsigned i =0; i < Personalities.size(); ++i) + EmitCommonEHFrame(Personalities[i], i); - EmitCommonEHFrame(); for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(), E = EHFrames.end(); I != E; ++I) EmitEHFrame(*I); @@ -3149,6 +3148,7 @@ // Save EH frame information EHFrames.push_back(FunctionEHFrameInfo(getAsm()->CurrentFnName, SubprogramCount, + MMI->getPersonalityIndex(), MF->getFrameInfo()->hasCalls(), !MMI->getLandingPads().empty(), MMI->getFrameMoves())); Index: llvm/lib/CodeGen/MachineModuleInfo.cpp diff -u llvm/lib/CodeGen/MachineModuleInfo.cpp:1.13 llvm/lib/CodeGen/MachineModuleInfo.cpp:1.14 --- llvm/lib/CodeGen/MachineModuleInfo.cpp:1.13 Sat May 12 17:36:25 2007 +++ llvm/lib/CodeGen/MachineModuleInfo.cpp Sun May 13 10:42:26 2007 @@ -1475,8 +1475,11 @@ , RootScope(NULL) , FrameMoves() , LandingPads() -, Personality(NULL) -{} +, Personalities() +{ + // Always emit "no personality" info + Personalities.push_back(NULL); +} MachineModuleInfo::~MachineModuleInfo() { } @@ -1686,13 +1689,15 @@ /// addPersonality - Provide the personality function for the exception /// information. void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, - Function *PersFn) { + Function *Personality) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); - LP.Personality = PersFn; + LP.Personality = Personality; - // FIXME: Until PR1414 will be fixed, we're using 1 personality function per - // module - Personality = PersFn; + 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. @@ -1753,16 +1758,28 @@ return TypeInfos.size(); } -/// getLandingPadInfos - Return a reference to the landing pad info for the -/// current function. +/// 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 - // module - - //return !LandingPads.empty() ? LandingPads[0].Personality : NULL; - return Personality; + // 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 = (!LandingPads.empty() ? + LandingPads[0].Personality : NULL); + + 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 _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits