diff options
author | Kai Nacke <kai.nacke@redstar.de> | 2013-09-15 18:01:09 +0000 |
---|---|---|
committer | Kai Nacke <kai.nacke@redstar.de> | 2013-09-15 18:01:09 +0000 |
commit | c29a720b362790746ca899a0b44fa35a1b399a42 (patch) | |
tree | dc2f569d37248d1a7fdf9583205a97c1a6e880bc /lib | |
parent | 7185bdd88302a67618b2edf51c499d647e5ff492 (diff) | |
download | external_llvm-c29a720b362790746ca899a0b44fa35a1b399a42.zip external_llvm-c29a720b362790746ca899a0b44fa35a1b399a42.tar.gz external_llvm-c29a720b362790746ca899a0b44fa35a1b399a42.tar.bz2 |
Fix alignment of unwind data.
For alignment purposes, the instruction array will always have an even
number of entries, with the final entry potentially unused (in which
case the array will be one longer than indicated by the count of unwind
codes field).
Reviewed by Anton Korobeynikov, Charles Davis and Nico Rieck.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190767 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/MC/MCWin64EH.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/MC/MCWin64EH.cpp b/lib/MC/MCWin64EH.cpp index c3d568b..b8b07d3 100644 --- a/lib/MC/MCWin64EH.cpp +++ b/lib/MC/MCWin64EH.cpp @@ -159,11 +159,11 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) { MCContext &context = streamer.getContext(); streamer.EmitValueToAlignment(4); - // Upper 3 bits are the version number (currently 1). - uint8_t flags = 0x01; info->Symbol = context.CreateTempSymbol(); streamer.EmitLabel(info->Symbol); + // Upper 3 bits are the version number (currently 1). + uint8_t flags = 0x01; if (info->ChainedParent) flags |= Win64EH::UNW_ChainInfo << 3; else { @@ -199,6 +199,14 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) { EmitUnwindCode(streamer, info->Begin, inst); } + // For alignment purposes, the instruction array will always have an even + // number of entries, with the final entry potentially unused (in which case + // the array will be one longer than indicated by the count of unwind codes + // field). + if (numCodes & 1) { + streamer.EmitIntValue(0, 2); + } + if (flags & (Win64EH::UNW_ChainInfo << 3)) EmitRuntimeFunction(streamer, info->ChainedParent); else if (flags & @@ -206,14 +214,11 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) { streamer.EmitValue(MCSymbolRefExpr::Create(info->ExceptionHandler, MCSymbolRefExpr::VK_COFF_IMGREL32, context), 4); - else if (numCodes < 2) { + else if (numCodes == 0) { // The minimum size of an UNWIND_INFO struct is 8 bytes. If we're not // a chained unwind info, if there is no handler, and if there are fewer // than 2 slots used in the unwind code array, we have to pad to 8 bytes. - if (numCodes == 1) - streamer.EmitIntValue(0, 2); - else - streamer.EmitIntValue(0, 4); + streamer.EmitIntValue(0, 4); } } |