Test .seh_startchained and .seh_endchained parsing.
authorCharles Davis <cdavis@mines.edu>
Thu, 26 May 2011 02:45:47 +0000 (02:45 +0000)
committerCharles Davis <cdavis@mines.edu>
Thu, 26 May 2011 02:45:47 +0000 (02:45 +0000)
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.

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

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

index 9dd8d4b533513f7391498a4dc90a689e66412939..c05a9251dc74f056b310e39a7b5df47e745f867c 100644 (file)
@@ -58,7 +58,7 @@ namespace llvm {
     MCDwarfFrameInfo *getCurrentFrameInfo();
     void EnsureValidFrame();
 
-    std::vector<MCWin64EHUnwindInfo> W64UnwindInfos;
+    std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos;
     MCWin64EHUnwindInfo *CurrentW64UnwindInfo;
     void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame);
     void EnsureValidW64UnwindInfo();
@@ -101,7 +101,7 @@ namespace llvm {
     }
 
     MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) {
-      return W64UnwindInfos[i];
+      return *W64UnwindInfos[i];
     }
 
     /// @name Assembly File Formatting.
index 19aeaafc722cfc77863a7aad1c810e64e956eeb9..9957a76ba38b30d915841c5458a0ff15abbcb3ac 100644 (file)
@@ -307,8 +307,8 @@ void MCStreamer::EmitCFISameValue(int64_t Register) {
 }
 
 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 @@ void MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
   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::EmitWin64EHEndProc() {
 
 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() {
index d4f7625e8857ffab50d1b70ff0934fa6182a75c0..b4384daf481670aee5caf182b7e37ae152b62411 100644 (file)
@@ -35,6 +35,9 @@ func:
     .seh_handlerdata
     .long 0
     .text
+    .seh_startchained
+    .seh_endprologue
+    .seh_endchained
     lea (%rbx), %rsp
     pop %rbx
     addq $24, %rsp