[llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineModuleInfo.cpp

Anton Korobeynikov asl at math.spbu.ru
Sun May 13 08:42:49 PDT 2007



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






More information about the llvm-commits mailing list