More DWARF-related things cleanup:
authorAnton Korobeynikov <asl@math.spbu.ru>
Sat, 12 May 2007 22:36:25 +0000 (22:36 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sat, 12 May 2007 22:36:25 +0000 (22:36 +0000)
1. Fix PR1380
2. Apply Duncan's patch from PR1410
3. Insert workaround for "one personality function per module" as noted in PR1414
4. Emit correct debug frames for x86/linux. This partly fixes DebugInfo/2006-11-06-StackTrace.cpp: stack trace is
shown correctly, but arguments for function on top of stack are displayed incorrectly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37015 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineModuleInfo.h
lib/CodeGen/DwarfWriter.cpp
lib/CodeGen/MachineModuleInfo.cpp
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86TargetAsmInfo.cpp

index 4771a38788f654e35d6580f415d0baf908d76408..3c04c8c4898ea44a92c8b297c11beda9e7cd8864 100644 (file)
@@ -1020,6 +1020,7 @@ private:
   //
   std::vector<GlobalVariable *> TypeInfos;
 
+  Function *Personality;
 public:
   static char ID; // Pass identification, replacement for typeid
 
index 04ee9e5796289fe6a4bfd01c268448ae45b9b9de..9defab9da3104713dc3379f8368f014ed2674fb4 100644 (file)
@@ -963,7 +963,7 @@ public:
   /// EmitFrameMoves - Emit frame instructions to describe the layout of the
   /// frame.
   void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
-                                   std::vector<MachineMove> &Moves) {
+                      const std::vector<MachineMove> &Moves) {
     int stackGrowth =
         Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
           TargetFrameInfo::StackGrowsUp ?
@@ -971,7 +971,7 @@ public:
     bool IsLocal = BaseLabel && strcmp(BaseLabel, "label") == 0;
 
     for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
-      MachineMove &Move = Moves[i];
+      const MachineMove &Move = Moves[i];
       unsigned LabelID = Move.getLabelID();
       
       if (LabelID) {
@@ -2356,6 +2356,7 @@ private:
     
     std::vector<MachineMove> Moves;
     RI->getInitialFrameState(Moves);
+
     EmitFrameMoves(NULL, 0, Moves);
 
     Asm->EmitAlignment(2);
@@ -2379,7 +2380,7 @@ private:
     
     EmitLabel("frame_begin", SubprogramCount);
 
-    EmitSectionOffset("frame_common_begin", "section_frame", 0, 0, true, false);
+    EmitSectionOffset("frame_common", "section_frame", 0, 0, true, false);
     Asm->EOL("FDE CIE offset");
 
     EmitReference("func_begin", SubprogramCount);
@@ -2716,11 +2717,20 @@ public:
 class DwarfException : public Dwarf  {
 
 private:
+  struct FunctionEHFrameInfo {
+    std::string FnName;
+    unsigned Number;
+    bool hasCalls;
+    bool hasLandingPads;
+    std::vector<MachineMove> Moves;
 
-  /// didInitial - Flag to indicate if initial emission has been done.
-  ///
-  bool didInitial;
-  
+    FunctionEHFrameInfo(const std::string &FN, unsigned Num, bool hC, bool hL,
+                        const std::vector<MachineMove> &M):
+      FnName(FN), Number(Num), hasCalls(hC), hasLandingPads(hL), Moves(M) { };
+  };
+
+  std::vector<FunctionEHFrameInfo> EHFrames;
+    
   /// shouldEmit - Flag to indicate if debug information should be emitted.
   ///
   bool shouldEmit;
@@ -2728,10 +2738,6 @@ private:
   /// EmitCommonEHFrame - Emit the common eh unwind frame.
   ///
   void EmitCommonEHFrame() {
-    // Only do it once.
-    if (didInitial) return;
-    didInitial = true;
-    
     // If there is a personality present then we need to indicate that
     // in the common eh frame.
     Function *Personality = MMI->getPersonality();
@@ -2809,41 +2815,40 @@ private:
     Asm->EOL();
   }
   
-  /// EmitEHFrame - Emit initial exception information.
+  /// EmitEHFrame - Emit function exception frame information.
   ///
-  void EmitEHFrame() {
+  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();
-    MachineFrameInfo *MFI = MF->getFrameInfo();
 
     Asm->SwitchToTextSection(TAI->getDwarfEHFrameSection());
 
     // Externally visible entry into the functions eh frame info.
     if (const char *GlobalDirective = TAI->getGlobalDirective())
-      O << GlobalDirective << getAsm()->CurrentFnName << ".eh\n";
+      O << GlobalDirective << EHFrameInfo.FnName << ".eh\n";
     
     // If there are no calls then you can't unwind.
-    if (!MFI->hasCalls()) { 
-      O << getAsm()->CurrentFnName << ".eh = 0\n";
+    if (!EHFrameInfo.hasCalls) { 
+      O << EHFrameInfo.FnName << ".eh = 0\n";
     } else {
-      O << getAsm()->CurrentFnName << ".eh:\n";
+      O << EHFrameInfo.FnName << ".eh:\n";
       
       // EH frame header.
-      EmitDifference("eh_frame_end", SubprogramCount,
-                     "eh_frame_begin", SubprogramCount, true);
+      EmitDifference("eh_frame_end", EHFrameInfo.Number,
+                     "eh_frame_begin", EHFrameInfo.Number, true);
       Asm->EOL("Length of Frame Information Entry");
       
-      EmitLabel("eh_frame_begin", SubprogramCount);
+      EmitLabel("eh_frame_begin", EHFrameInfo.Number);
 
       EmitSectionOffset("eh_frame_begin", "section_eh_frame",
-                        SubprogramCount, 0, true, true);
+                        EHFrameInfo.Number, 0, true, true);
       Asm->EOL("FDE CIE offset");
 
-      EmitReference("eh_func_begin", SubprogramCount, true);
+      EmitReference("eh_func_begin", EHFrameInfo.Number, true);
       Asm->EOL("FDE initial location");
-      EmitDifference("eh_func_end", SubprogramCount,
-                     "eh_func_begin", SubprogramCount);
+      EmitDifference("eh_func_end", EHFrameInfo.Number,
+                     "eh_func_begin", EHFrameInfo.Number);
       Asm->EOL("FDE address range");
       
       // If there is a personality and landing pads then point to the language
@@ -2852,8 +2857,8 @@ private:
         Asm->EmitULEB128Bytes(4);
         Asm->EOL("Augmentation size");
         
-        if (!MMI->getLandingPads().empty()) {
-          EmitReference("exception", SubprogramCount, true);
+        if (EHFrameInfo.hasLandingPads) {
+          EmitReference("exception", EHFrameInfo.Number, true);
         } else if(TAI->getAddressSize() == 8) {
           Asm->EmitInt64((int)0);
         } else {
@@ -2867,15 +2872,14 @@ private:
       
       // Indicate locations of function specific  callee saved registers in
       // frame.
-      std::vector<MachineMove> &Moves = MMI->getFrameMoves();
-      EmitFrameMoves("eh_func_begin", SubprogramCount, Moves);
+      EmitFrameMoves("eh_func_begin", EHFrameInfo.Number, EHFrameInfo.Moves);
       
       Asm->EmitAlignment(2);
-      EmitLabel("eh_frame_end", SubprogramCount);
+      EmitLabel("eh_frame_end", EHFrameInfo.Number);
     }
     
     if (const char *UsedDirective = TAI->getUsedDirective())
-      O << UsedDirective << getAsm()->CurrentFnName << ".eh\n\n";
+      O << UsedDirective << EHFrameInfo.FnName << ".eh\n\n";
   }
   
   /// EmitExceptionTable - Emit landpads and actions.
@@ -2916,11 +2920,6 @@ private:
     const LandingPadInfo *Filter = 0;
 
     // Compute sizes for exception table.
-    unsigned SizeHeader = sizeof(int8_t) + // LPStart format
-                          sizeof(int8_t) + // TType format
-                          sizeof(int8_t) + // TType base offset (NEED ULEB128)
-                          sizeof(int8_t) + // Call site format
-                          sizeof(int8_t);  // Call-site table length
     unsigned SizeSites = 0;
     unsigned SizeActions = 0;
 
@@ -2971,19 +2970,26 @@ private:
     
     // Final tallies.
     unsigned SizeTypes = TypeInfos.size() * TAI->getAddressSize();
-    unsigned SizePreType = SizeHeader + SizeSites + SizeActions;
-    unsigned SizeAlign =  (4 - SizePreType) & 3;
-    unsigned TypeOffset = SizePreType +
-                          SizeTypes +
-                          SizeAlign - 
-                          sizeof(int8_t) - // LPStart format
-                          sizeof(int8_t) - // TType format
-                          sizeof(int8_t);  // TType base offset (NEED ULEB128)
+
+    unsigned TypeOffset = sizeof(int8_t) + // Call site format
+                          Asm->SizeULEB128(SizeSites) + // Call-site table length
+                          SizeSites + SizeActions + SizeTypes;
+
+    unsigned TotalSize = sizeof(int8_t) + // LPStart format
+                         sizeof(int8_t) + // TType format
+                         Asm->SizeULEB128(TypeOffset) + // TType base offset
+                         TypeOffset;
+
+    unsigned SizeAlign = (4 - TotalSize) & 3;
 
     // Begin the exception table.
     Asm->SwitchToDataSection(TAI->getDwarfExceptionSection());
     O << "GCC_except_table" << SubprogramCount << ":\n";
     Asm->EmitAlignment(2);
+    for (unsigned i = 0; i != SizeAlign; ++i) {
+      Asm->EmitInt8(0);
+      Asm->EOL("Padding");
+    }
     EmitLabel("exception", SubprogramCount);
 
     // Emit the header.
@@ -3053,7 +3059,6 @@ private:
     }
 
     // Emit the type ids.
-    Asm->EmitAlignment(2);
     for (unsigned M = TypeInfos.size(); M; --M) {
       GlobalVariable *GV = TypeInfos[M - 1];
       
@@ -3091,7 +3096,6 @@ public:
   //
   DwarfException(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T)
   : Dwarf(OS, A, T)
-  , didInitial(false)
   , shouldEmit(false)
   {}
   
@@ -3112,6 +3116,12 @@ public:
   /// EndModule - Emit all exception information that should come after the
   /// content.
   void EndModule() {
+    if (!shouldEmit) return;
+    
+    EmitCommonEHFrame();
+    for (std::vector<FunctionEHFrameInfo>::iterator I = EHFrames.begin(),
+           E = EHFrames.end(); I != E; ++I)
+      EmitEHFrame(*I);
   }
 
   /// BeginFunction - Gather pre-function exception information.  Assumes being 
@@ -3135,8 +3145,13 @@ public:
 
     EmitLabel("eh_func_end", SubprogramCount);
     EmitExceptionTable();
-    EmitCommonEHFrame();
-    EmitEHFrame();
+
+    // Save EH frame information
+    EHFrames.push_back(FunctionEHFrameInfo(getAsm()->CurrentFnName,
+                                           SubprogramCount,
+                                           MF->getFrameInfo()->hasCalls(),
+                                           !MMI->getLandingPads().empty(),
+                                           MMI->getFrameMoves()));
   }
 };
 
index 9d532add1a0bb8a4ab46b821f74ad525c93272fd..22172811dc88997d3fa131982501fb0506b3fcf2 100644 (file)
@@ -1475,6 +1475,7 @@ MachineModuleInfo::MachineModuleInfo()
 , RootScope(NULL)
 , FrameMoves()
 , LandingPads()
+, Personality(NULL)
 {}
 MachineModuleInfo::~MachineModuleInfo() {
 
@@ -1685,9 +1686,13 @@ unsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) {
 /// addPersonality - Provide the personality function for the exception
 /// information.
 void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad,
-                                       Function *Personality) {
+                                       Function *PersFn) {
   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);
-  LP.Personality = Personality;
+  LP.Personality = PersFn;
+
+  // FIXME: Until PR1414 will be fixed, we're using 1 personality function per
+  // module
+  Personality = PersFn;
 }
 
 /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad.
@@ -1751,7 +1756,11 @@ unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) {
 /// getLandingPadInfos - Return a reference to the landing pad info for the
 /// current function.
 Function *MachineModuleInfo::getPersonality() const {
-  return !LandingPads.empty() ? LandingPads[0].Personality : NULL;
+  // FIXME: Until PR1414 will be fixed, we're using 1 personality function per
+  // module
+
+  //return !LandingPads.empty() ? LandingPads[0].Personality : NULL;
+  return Personality;
 }
 
 
index 06d12b0a429b44e988dbea737d2752155bd7fffc..30d029f6ca12eceb2e3af138064b783fb7095137 100644 (file)
@@ -1153,11 +1153,6 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
        TargetFrameInfo::StackGrowsUp ?
        TAI->getAddressSize() : -TAI->getAddressSize());
 
-    // Add return address to move list
-    MachineLocation CSDst(StackPtr, stackGrowth);
-    MachineLocation CSSrc(getRARegister());
-    Moves.push_back(MachineMove(StartLabelId, CSDst, CSSrc));
-
     if (NumBytes) {
       // Show update of SP.
       if (hasFP(MF)) {
@@ -1282,10 +1277,18 @@ unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const {
 
 void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
                                                                          const {
-  // Initial state of the frame pointer is esp.
+  // Calculate amount of bytes used for return address storing
+  int stackGrowth = (Is64Bit ? -8 : -4);
+
+  // Initial state of the frame pointer is esp+4.
   MachineLocation Dst(MachineLocation::VirtualFP);
-  MachineLocation Src(StackPtr, 0);
+  MachineLocation Src(StackPtr, stackGrowth);
   Moves.push_back(MachineMove(0, Dst, Src));
+
+  // Add return address to move list
+  MachineLocation CSDst(StackPtr, stackGrowth);
+  MachineLocation CSSrc(getRARegister());
+  Moves.push_back(MachineMove(0, CSDst, CSSrc));
 }
 
 unsigned X86RegisterInfo::getEHExceptionRegister() const {
index 8734ecd677358be7de8b5f6eb79ab6bfb31b0afd..c55c4caa07ee997f22fcb80dc8a13c8e0e608ef3 100644 (file)
@@ -113,7 +113,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
     AbsoluteDebugSectionOffsets = true;
     AbsoluteEHSectionOffsets = false;
     SupportsDebugInformation = true;
-    DwarfRequiresFrameSection = false;
     DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"\",@progbits";
     DwarfInfoSection =    "\t.section\t.debug_info,\"\",@progbits";
     DwarfLineSection =    "\t.section\t.debug_line,\"\",@progbits";
@@ -149,7 +148,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
     AbsoluteDebugSectionOffsets = true;
     AbsoluteEHSectionOffsets = false;
     SupportsDebugInformation = true;
-    DwarfRequiresFrameSection = false;
     DwarfSectionOffsetDirective = "\t.secrel32\t";
     DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"dr\"";
     DwarfInfoSection =    "\t.section\t.debug_info,\"dr\"";