llvm-project/lld/test/COFF/unwind.test

215 lines
7.5 KiB
Plaintext
Raw Normal View History

# RUN: yaml2obj < %s > %t.obj
#
# RUN: lld-link /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=HEADER %s
# RUN: llvm-objdump -unwind-info %t.exe | FileCheck -check-prefix=UNWIND %s
#
# RUN: lld-link /merge:.pdata=.rdata /out:%t.exe /entry:main %t.obj
# RUN: llvm-readobj -file-headers -sections %t.exe | FileCheck -check-prefix=HEADER-MERGE %s
#
# HEADER: ExceptionTableRVA: 0x3000
#
# FIXME: llvm-readobj currently does not understand files with .pdata merged
# into .rdata. But we can at least check that the section headers look correct.
#
COFF: Use (name, output characteristics) as a key when grouping input sections into output sections. This is what link.exe does and lets us avoid needing to worry about merging output characteristics while adding input sections to output sections. With this change we can't process /merge in the same way as before because sections with different output characteristics can still be merged into one another. So this change moves the processing of /merge to just before we assign addresses. In the case where there are multiple output sections with the same name, link.exe only merges the first section with the source name into the first section with the target name, and we do the same. At the same time I also implemented transitive merging (which means that /merge:.c=.b /merge:.b=.a merges both .c and .b into .a). This isn't quite enough though because link.exe has a special case for .CRT in 32-bit mode: it processes sections whose output characteristics are DATA | R | W as though the output characteristics were DATA | R (so that they get merged into things like constructor lists in the expected way). Chromium has a few such sections, and it turns out that those sections were causing the problem that resulted in r318699 (merge .xdata into .rdata) being reverted: because of the previous permission merging semantics, the .CRT sections were causing the entire .rdata section to become writable, which caused the SEH runtime to crash because it apparently requires .xdata to be read-only. This change also implements the same special case. This should unblock being able to merge .xdata into .rdata by default, as well as .bss into .data, both of which will be done in followups. Differential Revision: https://reviews.llvm.org/D45801 llvm-svn: 330479
2018-04-21 05:10:33 +08:00
# HEADER-MERGE: ExceptionTableRVA: 0x2004
# HEADER-MERGE-NEXT: ExceptionTableSize: 0x30
# HEADER-MERGE: Name: .rdata
# HEADER-MERGE-NEXT: VirtualSize: 0x78
# HEADER-MERGE-NEXT: VirtualAddress: 0x2000
#
# UNWIND: Function Table:
# UNWIND: Start Address: 0x1000
# UNWIND: End Address: 0x101b
# UNWIND: Unwind Info Address: 0x2004
# UNWIND: Version: 1
# UNWIND: Flags: 1 UNW_ExceptionHandler
# UNWIND: Size of prolog: 18
# UNWIND: Number of Codes: 8
# UNWIND: Frame register: RBX
# UNWIND: Frame offset: 0
# UNWIND: Unwind Codes:
# UNWIND: 0x12: UOP_SetFPReg
# UNWIND: 0x0f: UOP_PushNonVol RBX
# UNWIND: 0x0e: UOP_SaveXMM128 XMM8 [0x0000]
# UNWIND: 0x09: UOP_SaveNonVol RSI [0x0010]
# UNWIND: 0x04: UOP_AllocSmall 24
# UNWIND: 0x00: UOP_PushMachFrame w/o error code
# UNWIND: Function Table:
# UNWIND: Start Address: 0x1012
# UNWIND: End Address: 0x1012
# UNWIND: Unwind Info Address: 0x2020
# UNWIND: Version: 1
# UNWIND: Flags: 4 UNW_ChainInfo
# UNWIND: Size of prolog: 0
# UNWIND: Number of Codes: 0
# UNWIND: No frame pointer used
# UNWIND: Function Table:
# UNWIND: Start Address: 0x101b
# UNWIND: End Address: 0x101c
# UNWIND: Unwind Info Address: 0x2030
# UNWIND: Version: 1
# UNWIND: Flags: 0
# UNWIND: Size of prolog: 0
# UNWIND: Number of Codes: 0
# UNWIND: No frame pointer used
# UNWIND: Function Table:
# UNWIND: Start Address: 0x101c
# UNWIND: End Address: 0x1039
# UNWIND: Unwind Info Address: 0x2038
# UNWIND: Version: 1
# UNWIND: Flags: 0
# UNWIND: Size of prolog: 14
# UNWIND: Number of Codes: 6
# UNWIND: No frame pointer used
# UNWIND: Unwind Codes:
# UNWIND: 0x0e: UOP_AllocLarge 8454128
# UNWIND: 0x07: UOP_AllocLarge 8190
# UNWIND: 0x00: UOP_PushMachFrame w/o error code
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: 4883EC184889742410440F110424534889E3488D235B4883C418C3C34881ECF0FF00004881ECF0FF80004881C4F0FF80004881C4F0FF0000C3
- Name: .xdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: 0912080312030F300E880000096402000422001A000000000000000021000000000000001B000000000000000100000000000000010E06000E11F0FF80000701FE1F001A
Relocations:
- VirtualAddress: 20
SymbolName: __C_specific_handler
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 32
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 36
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 40
SymbolName: .xdata
Type: IMAGE_REL_AMD64_ADDR32NB
- Name: .pdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: 000000001B0000000000000012000000120000001C00000000000000010000002C000000000000001D00000034000000
Relocations:
- VirtualAddress: 0
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 4
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 8
SymbolName: .xdata
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 12
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 16
SymbolName: func
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 20
SymbolName: .xdata
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 24
SymbolName: smallFunc
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 28
SymbolName: smallFunc
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 32
SymbolName: .xdata
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 36
SymbolName: allocFunc
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 40
SymbolName: allocFunc
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 44
SymbolName: .xdata
Type: IMAGE_REL_AMD64_ADDR32NB
- Name: .rdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: 00000000
symbols:
- Name: .text
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 57
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 1
- Name: .xdata
Value: 0
SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 68
NumberOfRelocations: 4
NumberOfLinenumbers: 0
CheckSum: 0
Number: 2
- Name: .pdata
Value: 0
SectionNumber: 3
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 48
NumberOfRelocations: 12
NumberOfLinenumbers: 0
CheckSum: 0
Number: 3
- Name: func
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: __C_specific_handler
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: smallFunc
Value: 27
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: allocFunc
Value: 28
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: main
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: __C_specific_handler
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...