Revert: Fix alignment of unwind data.

llvm-svn: 185790
This commit is contained in:
Kai Nacke 2013-07-08 04:45:05 +00:00
parent 0a4e1f586c
commit 07bad44e9b
4 changed files with 7 additions and 238 deletions

View File

@ -159,11 +159,11 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) {
MCContext &context = streamer.getContext(); MCContext &context = streamer.getContext();
streamer.EmitValueToAlignment(4); streamer.EmitValueToAlignment(4);
// Upper 3 bits are the version number (currently 1).
uint8_t flags = 0x01;
info->Symbol = context.CreateTempSymbol(); info->Symbol = context.CreateTempSymbol();
streamer.EmitLabel(info->Symbol); streamer.EmitLabel(info->Symbol);
// Upper 3 bits are the version number (currently 1).
uint8_t flags = 0x01;
if (info->ChainedParent) if (info->ChainedParent)
flags |= Win64EH::UNW_ChainInfo << 3; flags |= Win64EH::UNW_ChainInfo << 3;
else { else {
@ -199,14 +199,6 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) {
EmitUnwindCode(streamer, info->Begin, inst); 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)) if (flags & (Win64EH::UNW_ChainInfo << 3))
EmitRuntimeFunction(streamer, info->ChainedParent); EmitRuntimeFunction(streamer, info->ChainedParent);
else if (flags & else if (flags &
@ -214,11 +206,14 @@ static void EmitUnwindInfo(MCStreamer &streamer, MCWin64EHUnwindInfo *info) {
streamer.EmitValue(MCSymbolRefExpr::Create(info->ExceptionHandler, streamer.EmitValue(MCSymbolRefExpr::Create(info->ExceptionHandler,
MCSymbolRefExpr::VK_COFF_IMGREL32, MCSymbolRefExpr::VK_COFF_IMGREL32,
context), 4); context), 4);
else if (numCodes == 0) { else if (numCodes < 2) {
// The minimum size of an UNWIND_INFO struct is 8 bytes. If we're not // 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 // 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. // than 2 slots used in the unwind code array, we have to pad to 8 bytes.
streamer.EmitIntValue(0, 4); if (numCodes == 1)
streamer.EmitIntValue(0, 2);
else
streamer.EmitIntValue(0, 4);
} }
} }

View File

@ -1,65 +0,0 @@
// This test checks the alignment and padding of the unwind info.
// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -sd -sr -u | FileCheck %s
// CHECK: Sections [
// CHECK: Section {
// CHECK: Name: .xdata
// CHECK: RawDataSize: 8
// CHECK: RelocationCount: 0
// CHECK: Characteristics [
// CHECK-NEXT: ALIGN_4BYTES
// CHECK-NEXT: CNT_INITIALIZED_DATA
// CHECK-NEXT: MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: 01000000 00000000
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK: Section {
// CHECK: Name: .pdata
// CHECK: RawDataSize: 12
// CHECK: RelocationCount: 3
// CHECK: Characteristics [
// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES
// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
// CHECK-NEXT: IMAGE_SCN_MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: [[BeginDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB smallFunc
// CHECK-NEXT: [[EndDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB smallFunc
// CHECK-NEXT: [[UnwindDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB .xdata
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: 00000000 01000000 00000000
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK: UnwindInformation [
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: StartAddress: smallFunc {{(\+0x[A-F0-9]+ )?}}([[BeginDisp]])
// CHECK-NEXT: EndAddress: smallFunc {{(\+0x[A-F0-9]+ )?}}([[EndDisp]])
// CHECK-NEXT: UnwindInfoAddress: .xdata {{(\+0x[A-F0-9]+ )?}}([[UnwindDisp]])
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 1
// CHECK-NEXT: Flags [
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 0
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 0
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Generate the minimal unwind info.
// It contains only the version set to 1. All other bytes are 0.
.globl smallFunc
.def smallFunc; .scl 2; .type 32; .endef
.seh_proc smallFunc
smallFunc:
ret
.seh_endproc

View File

@ -1,78 +0,0 @@
// This test checks the alignment and padding of the unwind info.
// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -sd -sr -u | FileCheck %s
// CHECK: Sections [
// CHECK: Section {
// CHECK: Name: .xdata
// CHECK: RawDataSize: 16
// CHECK: RelocationCount: 1
// CHECK: Characteristics [
// CHECK-NEXT: ALIGN_4BYTES
// CHECK-NEXT: CNT_INITIALIZED_DATA
// CHECK-NEXT: MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: [[HandlerDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB __C_specific_handler
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: 09000100 04220000 00000000 BEBAFECA
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK-NEXT: Section {
// CHECK: Name: .pdata
// CHECK: RawDataSize: 12
// CHECK: RelocationCount: 3
// CHECK: Characteristics [
// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES
// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
// CHECK-NEXT: IMAGE_SCN_MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: [[BeginDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
// CHECK-NEXT: [[EndDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
// CHECK-NEXT: [[UnwindDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB .xdata
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: FCFFFFFF 05000000 00000000
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK: UnwindInformation [
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: StartAddress: func {{(\+0x[A-F0-9]+ )?}}([[BeginDisp]])
// CHECK-NEXT: EndAddress: func {{(\+0x[A-F0-9]+ )?}}([[EndDisp]])
// CHECK-NEXT: UnwindInfoAddress: .xdata {{(\+0x[A-F0-9]+ )?}}([[UnwindDisp]])
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 1
// CHECK-NEXT: Flags [
// CHECK-NEXT: ExceptionHandler
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 0
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 1
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x04: ALLOC_SMALL size=24
// CHECK-NEXT: ]
// CHECK-NEXT: Handler: __C_specific_handler ([[HandlerDisp]])
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Generates only one unwind code.
// Requires padding of the unwind code array.
.globl func
.def func; .scl 2; .type 32; .endef
.seh_proc func
subq $24, %rsp
.seh_stackalloc 24
.seh_handler __C_specific_handler, @except
.seh_handlerdata
.long 0xcafebabe
.text
.seh_endprologue
func:
addq $24, %rsp
ret
.seh_endproc

View File

@ -1,83 +0,0 @@
// This test checks the alignment and padding of the unwind info.
// RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -sd -sr -u | FileCheck %s
// CHECK: Sections [
// CHECK: Section {
// CHECK: Name: .xdata
// CHECK: RawDataSize: 16
// CHECK: RelocationCount: 1
// CHECK: Characteristics [
// CHECK-NEXT: ALIGN_4BYTES
// CHECK-NEXT: CNT_INITIALIZED_DATA
// CHECK-NEXT: MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: [[HandlerDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB __C_specific_handler
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: 19000200 04D002C0 00000000 BEBAFECA
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK-NEXT: Section {
// CHECK: Name: .pdata
// CHECK: RawDataSize: 12
// CHECK: RelocationCount: 3
// CHECK: Characteristics [
// CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES
// CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA
// CHECK-NEXT: IMAGE_SCN_MEM_READ
// CHECK-NEXT: ]
// CHECK: Relocations [
// CHECK-NEXT: [[BeginDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
// CHECK-NEXT: [[EndDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB func
// CHECK-NEXT: [[UnwindDisp:0x[A-F0-9]+]] IMAGE_REL_AMD64_ADDR32NB .xdata
// CHECK-NEXT: ]
// CHECK: SectionData (
// CHECK-NEXT: 0000: FCFFFFFF 05000000 00000000
// CHECK-NEXT: )
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK: UnwindInformation [
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: StartAddress: func {{(\+0x[A-F0-9]+ )?}}([[BeginDisp]])
// CHECK-NEXT: EndAddress: func {{(\+0x[A-F0-9]+ )?}}([[EndDisp]])
// CHECK-NEXT: UnwindInfoAddress: .xdata {{(\+0x[A-F0-9]+ )?}}([[UnwindDisp]])
// CHECK-NEXT: UnwindInfo {
// CHECK-NEXT: Version: 1
// CHECK-NEXT: Flags [
// CHECK-NEXT: ExceptionHandler
// CHECK-NEXT: TerminateHandler
// CHECK-NEXT: ]
// CHECK-NEXT: PrologSize: 0
// CHECK-NEXT: FrameRegister: -
// CHECK-NEXT: FrameOffset: -
// CHECK-NEXT: UnwindCodeCount: 2
// CHECK-NEXT: UnwindCodes [
// CHECK-NEXT: 0x04: PUSH_NONVOL reg=R13
// CHECK-NEXT: 0x02: PUSH_NONVOL reg=R12
// CHECK-NEXT: ]
// CHECK-NEXT: Handler: __C_specific_handler ([[HandlerDisp]])
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Generates two unwind codes.
// Requires no padding of the unwind code array.
.globl func
.def func; .scl 2; .type 32; .endef
.seh_proc func
push %r12
.seh_pushreg 12
push %r13
.seh_pushreg 13
.seh_handler __C_specific_handler, @except, @unwind
.seh_handlerdata
.long 0xcafebabe
.text
.seh_endprologue
func:
pop %r13
pop %r12
ret
.seh_endproc