[llvm-commits] [llvm] r132106 - in /llvm/trunk: include/llvm/MC/MCStreamer.h lib/MC/MCStreamer.cpp test/MC/AsmParser/directive_seh.s

Charles Davis cdavis at mines.edu
Wed May 25 19:45:48 PDT 2011


Author: cdavis
Date: Wed May 25 21:45:47 2011
New Revision: 132106

URL: http://llvm.org/viewvc/llvm-project?rev=132106&view=rev
Log:
Test .seh_startchained and .seh_endchained parsing.

Rework how the MCWin64EHUnwindInfo instances are stored. Fix issues with
chained unwind areas exposed by the test that were related to this.

The ChainedParent field had the wrong address, because when the chained unwind
info was added, the addresses shifted around. Now we store the pointers to the
structures, which are now allocated from the MC heap.

Modified:
    llvm/trunk/include/llvm/MC/MCStreamer.h
    llvm/trunk/lib/MC/MCStreamer.cpp
    llvm/trunk/test/MC/AsmParser/directive_seh.s

Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=132106&r1=132105&r2=132106&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed May 25 21:45:47 2011
@@ -58,7 +58,7 @@
     MCDwarfFrameInfo *getCurrentFrameInfo();
     void EnsureValidFrame();
 
-    std::vector<MCWin64EHUnwindInfo> W64UnwindInfos;
+    std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos;
     MCWin64EHUnwindInfo *CurrentW64UnwindInfo;
     void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame);
     void EnsureValidW64UnwindInfo();
@@ -101,7 +101,7 @@
     }
 
     MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) {
-      return W64UnwindInfos[i];
+      return *W64UnwindInfos[i];
     }
 
     /// @name Assembly File Formatting.

Modified: llvm/trunk/lib/MC/MCStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=132106&r1=132105&r2=132106&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCStreamer.cpp Wed May 25 21:45:47 2011
@@ -307,8 +307,8 @@
 }
 
 void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
-  W64UnwindInfos.push_back(*Frame);
-  CurrentW64UnwindInfo = &W64UnwindInfos.back();
+  W64UnwindInfos.push_back(Frame);
+  CurrentW64UnwindInfo = W64UnwindInfos.back();
 }
 
 void MCStreamer::EnsureValidW64UnwindInfo() {
@@ -321,11 +321,11 @@
   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
   if (CurFrame && !CurFrame->End)
     report_fatal_error("Starting a function before ending the previous one!");
-  MCWin64EHUnwindInfo Frame;
-  Frame.Begin = getContext().CreateTempSymbol();
-  Frame.Function = Symbol;
-  EmitLabel(Frame.Begin);
-  setCurrentW64UnwindInfo(&Frame);
+  MCWin64EHUnwindInfo *Frame = new (getContext()) MCWin64EHUnwindInfo;
+  Frame->Begin = getContext().CreateTempSymbol();
+  Frame->Function = Symbol;
+  EmitLabel(Frame->Begin);
+  setCurrentW64UnwindInfo(Frame);
 }
 
 void MCStreamer::EmitWin64EHEndProc() {
@@ -339,13 +339,13 @@
 
 void MCStreamer::EmitWin64EHStartChained() {
   EnsureValidW64UnwindInfo();
-  MCWin64EHUnwindInfo Frame;
+  MCWin64EHUnwindInfo *Frame = new (getContext()) MCWin64EHUnwindInfo;
   MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
-  Frame.Begin = getContext().CreateTempSymbol();
-  Frame.Function = CurFrame->Function;
-  Frame.ChainedParent = CurFrame;
-  EmitLabel(Frame.Begin);
-  setCurrentW64UnwindInfo(&Frame);
+  Frame->Begin = getContext().CreateTempSymbol();
+  Frame->Function = CurFrame->Function;
+  Frame->ChainedParent = CurFrame;
+  EmitLabel(Frame->Begin);
+  setCurrentW64UnwindInfo(Frame);
 }
 
 void MCStreamer::EmitWin64EHEndChained() {

Modified: llvm/trunk/test/MC/AsmParser/directive_seh.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_seh.s?rev=132106&r1=132105&r2=132106&view=diff
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive_seh.s (original)
+++ llvm/trunk/test/MC/AsmParser/directive_seh.s Wed May 25 21:45:47 2011
@@ -35,6 +35,9 @@
     .seh_handlerdata
     .long 0
     .text
+    .seh_startchained
+    .seh_endprologue
+    .seh_endchained
     lea (%rbx), %rsp
     pop %rbx
     addq $24, %rsp





More information about the llvm-commits mailing list