aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-21 15:57:49 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-21 15:57:49 +0000
commit321fe74b2d40d7762175fbd3054fda00b5e70833 (patch)
treef6e5e46c0c52b514cb6d92b730ebbddff5d2b4e2
parentc21b205f93fa7bc135928ff9f4981f9062e2fd53 (diff)
downloadexternal_llvm-321fe74b2d40d7762175fbd3054fda00b5e70833.zip
external_llvm-321fe74b2d40d7762175fbd3054fda00b5e70833.tar.gz
external_llvm-321fe74b2d40d7762175fbd3054fda00b5e70833.tar.bz2
A handler for a function in the Win64 EH scheme can be both an unwind handler
and an exception handler. Handle that case. Also, add an 'Emitted' member to the MCWin64EHUnwindInfo struct. It will be needed later. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131791 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCWin64EH.h17
-rw-r--r--lib/MC/MCStreamer.cpp8
2 files changed, 15 insertions, 10 deletions
diff --git a/include/llvm/MC/MCWin64EH.h b/include/llvm/MC/MCWin64EH.h
index de1e247..a88b504 100644
--- a/include/llvm/MC/MCWin64EH.h
+++ b/include/llvm/MC/MCWin64EH.h
@@ -7,8 +7,8 @@
//
//===----------------------------------------------------------------------===//
//
-// This file contains the declaration of the MCDwarfFile to support the dwarf
-// .file directive and the .loc directive.
+// This file contains declarations to support the Win64 Exception Handling
+// scheme in MC.
//
//===----------------------------------------------------------------------===//
@@ -59,26 +59,29 @@ namespace llvm {
struct MCWin64EHUnwindInfo {
MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0),
- Function(0), PrologEnd(0), UnwindOnly(false),
- LastFrameInst(-1), ChainedParent(0),
- Instructions() {}
+ Function(0), PrologEnd(0), HandlesUnwind(false),
+ HandlesExceptions(false), LastFrameInst(-1),
+ ChainedParent(0), Instructions(), Emitted(false) {}
MCSymbol *Begin;
MCSymbol *End;
const MCSymbol *ExceptionHandler;
const MCSymbol *Function;
MCSymbol *PrologEnd;
- bool UnwindOnly;
+ bool HandlesUnwind;
+ bool HandlesExceptions;
int LastFrameInst;
MCWin64EHUnwindInfo *ChainedParent;
std::vector<MCWin64EHInstruction> Instructions;
+ bool Emitted;
};
class MCWin64EHUnwindEmitter {
public:
//
- // This emits the unwind info section (.xdata in PE/COFF).
+ // This emits the unwind info sections (.pdata and .xdata in PE/COFF).
//
static void Emit(MCStreamer &streamer);
+ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info);
};
} // end namespace llvm
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index ab7c798..1ec7688 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -362,10 +362,12 @@ void MCStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
EnsureValidW64UnwindInfo();
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
CurFrame->ExceptionHandler = Sym;
- if (Unwind)
- CurFrame->UnwindOnly = true;
- else if (!Except)
+ if (!Except && !Unwind)
report_fatal_error("Don't know what kind of handler this is!");
+ if (Unwind)
+ CurFrame->HandlesUnwind = true;
+ if (Except)
+ CurFrame->HandlesExceptions = true;
}
void MCStreamer::EmitWin64EHHandlerData() {