Changes in directory llvm/lib/CodeGen:
DwarfWriter.cpp updated: 1.143 -> 1.144 --- Log message: Emit function debug frames in one atom. This will prevent us from generating incorrect assembler in case of both debug information & exception information presented. --- Diffs of the changes: (+41 -27) DwarfWriter.cpp | 68 +++++++++++++++++++++++++++++++++----------------------- 1 files changed, 41 insertions(+), 27 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.143 llvm/lib/CodeGen/DwarfWriter.cpp:1.144 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.143 Sun May 13 10:42:26 2007 +++ llvm/lib/CodeGen/DwarfWriter.cpp Sun May 13 12:30:11 2007 @@ -1110,6 +1110,16 @@ /// bool shouldEmit; + struct FunctionDebugFrameInfo { + unsigned Number; + std::vector<MachineMove> Moves; + + FunctionDebugFrameInfo(unsigned Num, const std::vector<MachineMove> &M): + Number(Num), Moves(M) { }; + }; + + std::vector<FunctionDebugFrameInfo> DebugFrames; + public: /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. @@ -1957,7 +1967,7 @@ // Dwarf sections base addresses. if (TAI->doesDwarfRequireFrameSection()) { Asm->SwitchToDataSection(TAI->getDwarfFrameSection()); - EmitLabel("section_frame", 0); + EmitLabel("section_debug_frame", 0); } Asm->SwitchToDataSection(TAI->getDwarfInfoSection()); EmitLabel("section_info", 0); @@ -1982,9 +1992,6 @@ EmitLabel("text_begin", 0); Asm->SwitchToDataSection(TAI->getDataSection()); EmitLabel("data_begin", 0); - - // Emit common frame information. - EmitInitialDebugFrame(); } /// EmitDIE - Recusively Emits a debug information entry. @@ -2321,9 +2328,9 @@ Asm->EOL(); } - /// EmitInitialDebugFrame - Emit common frame info into a debug frame section. + /// EmitCommonDebugFrame - Emit common frame info into a debug frame section. /// - void EmitInitialDebugFrame() { + void EmitCommonDebugFrame() { if (!TAI->doesDwarfRequireFrameSection()) return; @@ -2335,12 +2342,12 @@ // Start the dwarf frame section. Asm->SwitchToDataSection(TAI->getDwarfFrameSection()); - EmitLabel("frame_common", 0); - EmitDifference("frame_common_end", 0, - "frame_common_begin", 0, true); + EmitLabel("debug_frame_common", 0); + EmitDifference("debug_frame_common_end", 0, + "debug_frame_common_begin", 0, true); Asm->EOL("Length of Common Information Entry"); - EmitLabel("frame_common_begin", 0); + EmitLabel("debug_frame_common_begin", 0); Asm->EmitInt32((int)DW_CIE_ID); Asm->EOL("CIE Identifier Tag"); Asm->EmitInt8(DW_CIE_VERSION); @@ -2360,41 +2367,40 @@ EmitFrameMoves(NULL, 0, Moves); Asm->EmitAlignment(2); - EmitLabel("frame_common_end", 0); + EmitLabel("debug_frame_common_end", 0); Asm->EOL(); } /// EmitFunctionDebugFrame - Emit per function frame info into a debug frame /// section. - void EmitFunctionDebugFrame() { + void EmitFunctionDebugFrame(const FunctionDebugFrameInfo &DebugFrameInfo) { if (!TAI->doesDwarfRequireFrameSection()) return; // Start the dwarf frame section. Asm->SwitchToDataSection(TAI->getDwarfFrameSection()); - EmitDifference("frame_end", SubprogramCount, - "frame_begin", SubprogramCount, true); + EmitDifference("debug_frame_end", DebugFrameInfo.Number, + "debug_frame_begin", DebugFrameInfo.Number, true); Asm->EOL("Length of Frame Information Entry"); - EmitLabel("frame_begin", SubprogramCount); + EmitLabel("debug_frame_begin", DebugFrameInfo.Number); - EmitSectionOffset("frame_common", "section_frame", 0, 0, true, false); + EmitSectionOffset("debug_frame_common", "section_debug_frame", + 0, 0, true, false); Asm->EOL("FDE CIE offset"); - EmitReference("func_begin", SubprogramCount); + EmitReference("func_begin", DebugFrameInfo.Number); Asm->EOL("FDE initial location"); - EmitDifference("func_end", SubprogramCount, - "func_begin", SubprogramCount); + EmitDifference("func_end", DebugFrameInfo.Number, + "func_begin", DebugFrameInfo.Number); Asm->EOL("FDE address range"); - std::vector<MachineMove> &Moves = MMI->getFrameMoves(); - - EmitFrameMoves("func_begin", SubprogramCount, Moves); + EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves); Asm->EmitAlignment(2); - EmitLabel("frame_end", SubprogramCount); + EmitLabel("debug_frame_end", DebugFrameInfo.Number); Asm->EOL(); } @@ -2636,7 +2642,15 @@ Asm->SwitchToTextSection(SectionMap[i].c_str()); EmitLabel("section_end", i); } - + + // Emit common frame information. + EmitCommonDebugFrame(); + + // Emit function debug frame information + for (std::vector<FunctionDebugFrameInfo>::iterator I = DebugFrames.begin(), + E = DebugFrames.end(); I != E; ++I) + EmitFunctionDebugFrame(*I); + // Compute DIE offsets and sizes. SizeAndOffsets(); @@ -2705,9 +2719,9 @@ // Construct scopes for subprogram. ConstructRootScope(MMI->getRootScope()); - - // Emit function frame information. - EmitFunctionDebugFrame(); + + DebugFrames.push_back(FunctionDebugFrameInfo(SubprogramCount, + MMI->getFrameMoves())); } }; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits