brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.5 KiB · 2e51ec2 Raw
361 lines · plain
1## In this test we check how the unwind information is dumped with the use of --unwind.2 3## First, check that both llvm-readobj and llvm-readelf are able to dump a valid unwind information.4## Check that the output is the same for these tools.5## The memory size of the PT_GNU_EH_FRAME equals its file size and they both are equal to 0x3c.6## 0x3c is the size of the .eh_frame_hdr section.7# RUN: yaml2obj --docnum=1 %s -DMEMSIZE=0x3c -DFILESIZE=0x3c -o %t1.valid8# RUN: llvm-readobj --unwind %t1.valid | FileCheck %s9# RUN: llvm-readelf --sections --unwind %t1.valid | FileCheck %s --check-prefixes=SIZE,CHECK10 11## Validate the size of the .eh_frame_hdr section.12# SIZE: [Nr] Name          Type     Address          Off    Size13# SIZE: [ 2] .eh_frame_hdr PROGBITS 00000000004013c0 0000bc 00003c14 15# CHECK:      EHFrameHeader {16# CHECK-NEXT:  Address: 0x4013c017# CHECK-NEXT:  Offset: 0xbc18# CHECK-NEXT:  Size: 0x3c19# CHECK-NEXT:  Corresponding Section: .eh_frame_hdr20# CHECK-NEXT:  Header {21# CHECK-NEXT:    version: 122# CHECK-NEXT:    eh_frame_ptr_enc: 0x1b23# CHECK-NEXT:    fde_count_enc: 0x324# CHECK-NEXT:    table_enc: 0x3b25# CHECK-NEXT:    eh_frame_ptr: 0x40140026# CHECK-NEXT:    fde_count: 627# CHECK-NEXT:    entry 0 {28# CHECK-NEXT:      initial_location: 0x4004a029# CHECK-NEXT:      address: 0x40144830# CHECK-NEXT:    }31# CHECK-NEXT:    entry 1 {32# CHECK-NEXT:      initial_location: 0x4004d033# CHECK-NEXT:      address: 0x40141834# CHECK-NEXT:    }35# CHECK-NEXT:    entry 2 {36# CHECK-NEXT:      initial_location: 0x4005b637# CHECK-NEXT:      address: 0x40147038# CHECK-NEXT:    }39# CHECK-NEXT:    entry 3 {40# CHECK-NEXT:      initial_location: 0x4005d041# CHECK-NEXT:      address: 0x40149042# CHECK-NEXT:    }43# CHECK-NEXT:    entry 4 {44# CHECK-NEXT:      initial_location: 0x40125045# CHECK-NEXT:      address: 0x4014c046# CHECK-NEXT:    }47# CHECK-NEXT:    entry 5 {48# CHECK-NEXT:      initial_location: 0x4012c049# CHECK-NEXT:      address: 0x4014f050# CHECK-NEXT:    }51# CHECK-NEXT:  }52# CHECK-NEXT:}53 54# CHECK:      .eh_frame section at offset 0xf8 address 0x401400:55# CHECK-NEXT:  [0x401400] CIE length=2056# CHECK-NEXT:    version: 157# CHECK-NEXT:    augmentation: zR58# CHECK-NEXT:    code_alignment_factor: 159# CHECK-NEXT:    data_alignment_factor: -860# CHECK-NEXT:    return_address_register: 1661 62# CHECK:         Program:63# CHECK-NEXT:      DW_CFA_def_cfa: reg7 +864# CHECK-NEXT:      DW_CFA_offset: reg16 -865# CHECK-NEXT:      DW_CFA_undefined: reg1666 67# CHECK:       [0x401418] FDE length=20 cie=[0x401400]68# CHECK-NEXT:    initial_location: 0x4004d069# CHECK-NEXT:    address_range: 0x2a (end : 0x4004fa)70 71# CHECK:         Program:72# CHECK-NEXT:      DW_CFA_nop:73# CHECK-NEXT:      DW_CFA_nop:74# CHECK-NEXT:      DW_CFA_nop:75# CHECK-NEXT:      DW_CFA_nop:76# CHECK-NEXT:      DW_CFA_nop:77# CHECK-NEXT:      DW_CFA_nop:78# CHECK-NEXT:      DW_CFA_nop:79 80# CHECK:       [0x401430] CIE length=2081# CHECK-NEXT:    version: 182# CHECK-NEXT:    augmentation: zR83# CHECK-NEXT:    code_alignment_factor: 184# CHECK-NEXT:    data_alignment_factor: -885# CHECK-NEXT:    return_address_register: 1686 87# CHECK:         Program:88# CHECK-NEXT:      DW_CFA_def_cfa: reg7 +889# CHECK-NEXT:      DW_CFA_offset: reg16 -890# CHECK-NEXT:      DW_CFA_nop:91# CHECK-NEXT:      DW_CFA_nop:92 93# CHECK:       [0x401448] FDE length=36 cie=[0x401430]94# CHECK-NEXT:    initial_location: 0x4004a095# CHECK-NEXT:    address_range: 0x20 (end : 0x4004c0)96 97# CHECK:         Program:98# CHECK-NEXT:      DW_CFA_def_cfa_offset: +1699# CHECK-NEXT:      DW_CFA_advance_loc: 6 to 0x4004a6100# CHECK-NEXT:      DW_CFA_def_cfa_offset: +24101# CHECK-NEXT:      DW_CFA_advance_loc: 10 to 0x4004b0102# CHECK-NEXT:      DW_CFA_def_cfa_expression: DW_OP_breg7 +8, DW_OP_breg16 +0, DW_OP_lit15, DW_OP_and, DW_OP_lit11, DW_OP_ge, DW_OP_lit3, DW_OP_shl, DW_OP_plus103# CHECK-NEXT:      DW_CFA_nop:104# CHECK-NEXT:      DW_CFA_nop:105# CHECK-NEXT:      DW_CFA_nop:106# CHECK-NEXT:      DW_CFA_nop:107 108# CHECK:       [0x401470] FDE length=28 cie=[0x401430]109# CHECK-NEXT:    initial_location: 0x4005b6110# CHECK-NEXT:    address_range: 0x10 (end : 0x4005c6)111 112# CHECK:         Program:113# CHECK-NEXT:      DW_CFA_advance_loc: 1 to 0x4005b7114# CHECK-NEXT:      DW_CFA_def_cfa_offset: +16115# CHECK-NEXT:      DW_CFA_offset: reg6 -16116# CHECK-NEXT:      DW_CFA_advance_loc: 3 to 0x4005ba117# CHECK-NEXT:      DW_CFA_def_cfa_register: reg6118# CHECK-NEXT:      DW_CFA_advance_loc: 11 to 0x4005c5119# CHECK-NEXT:      DW_CFA_def_cfa: reg7 +8120# CHECK-NEXT:      DW_CFA_nop:121# CHECK-NEXT:      DW_CFA_nop:122# CHECK-NEXT:      DW_CFA_nop:123 124# CHECK:       [0x401490] FDE length=44 cie=[0x401430]125# CHECK-NEXT:    initial_location: 0x4005d0126# CHECK-NEXT:    address_range: 0xc7f (end : 0x40124f)127 128# CHECK:         Program:129# CHECK-NEXT:      DW_CFA_advance_loc: 5 to 0x4005d5130# CHECK-NEXT:      DW_CFA_def_cfa: reg10 +0131# CHECK-NEXT:      DW_CFA_advance_loc: 9 to 0x4005de132# CHECK-NEXT:      DW_CFA_expression: reg6 DW_OP_breg6 +0133# CHECK-NEXT:      DW_CFA_advance_loc: 5 to 0x4005e3134# CHECK-NEXT:      DW_CFA_def_cfa_expression: DW_OP_breg6 -8, DW_OP_deref135# CHECK-NEXT:      DW_CFA_advance_loc2: 3174 to 0x401249136# CHECK-NEXT:      DW_CFA_def_cfa: reg10 +0137# CHECK-NEXT:      DW_CFA_advance_loc: 5 to 0x40124e138# CHECK-NEXT:      DW_CFA_def_cfa: reg7 +8139# CHECK-NEXT:      DW_CFA_nop:140# CHECK-NEXT:      DW_CFA_nop:141# CHECK-NEXT:      DW_CFA_nop:142# CHECK-NEXT:      DW_CFA_nop:143 144# CHECK:       [0x4014c0] FDE length=44 cie=[0x401430]145# CHECK-NEXT:    initial_location: 0x401250146# CHECK-NEXT:    address_range: 0x66 (end : 0x4012b6)147 148# CHECK:         Program:149# CHECK-NEXT:      DW_CFA_advance_loc: 1 to 0x401251150# CHECK-NEXT:      DW_CFA_def_cfa_offset: +16151# CHECK-NEXT:      DW_CFA_offset: reg6 -16152# CHECK-NEXT:      DW_CFA_advance_loc: 3 to 0x401254153# CHECK-NEXT:      DW_CFA_def_cfa_register: reg6154# CHECK-NEXT:      DW_CFA_advance_loc: 2 to 0x401256155# CHECK-NEXT:      DW_CFA_offset: reg15 -24156# CHECK-NEXT:      DW_CFA_advance_loc: 5 to 0x40125b157# CHECK-NEXT:      DW_CFA_offset: reg14 -32158# CHECK-NEXT:      DW_CFA_advance_loc: 7 to 0x401262159# CHECK-NEXT:      DW_CFA_offset: reg13 -40160# CHECK-NEXT:      DW_CFA_offset: reg12 -48161# CHECK-NEXT:      DW_CFA_advance_loc: 8 to 0x40126a162# CHECK-NEXT:      DW_CFA_offset: reg3 -56163# CHECK-NEXT:      DW_CFA_advance_loc1: 75 to 0x4012b5164# CHECK-NEXT:      DW_CFA_def_cfa: reg7 +8165# CHECK-NEXT:      DW_CFA_nop:166# CHECK-NEXT:      DW_CFA_nop:167# CHECK-NEXT:      DW_CFA_nop:168# CHECK-NEXT:      DW_CFA_nop:169 170# CHECK:       [0x4014f0] FDE length=20 cie=[0x401430]171# CHECK-NEXT:    initial_location: 0x4012c0172# CHECK-NEXT:    address_range: 0x1 (end : 0x4012c1)173 174# CHECK:         Program:175# CHECK-NEXT:      DW_CFA_nop:176# CHECK-NEXT:      DW_CFA_nop:177# CHECK-NEXT:      DW_CFA_nop:178# CHECK-NEXT:      DW_CFA_nop:179# CHECK-NEXT:      DW_CFA_nop:180# CHECK-NEXT:      DW_CFA_nop:181# CHECK-NEXT:      DW_CFA_nop:182 183--- !ELF184FileHeader:185  Class:           ELFCLASS64186  Data:            ELFDATA2LSB187  Type:            ET_EXEC188  Machine:         EM_X86_64189  Entry:           0x0000000000400000190Sections:191  - Name:            .text192    Type:            SHT_PROGBITS193    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]194    Address:         0x0000000000400000195    AddressAlign:    16196    Content:         50C704240020400031C05AC3197  - Name:            .eh_frame_hdr198    Type:            SHT_PROGBITS199    Flags:           [ SHF_ALLOC ]200    Address:         0x00000000004013c0201    AddressAlign:    4202    Content:         011B033B3C00000006000000E0F0FFFF8800000010F1FFFF58000000F6F1FFFFB000000010F2FFFFD000000090FEFFFF0001000000FFFFFF30010000203  - Name:            .eh_frame204    Type:            SHT_PROGBITS205    Flags:           [ SHF_ALLOC ]206    Address:         0x0000000000401400207    AddressAlign:    8208    Content:         1400000000000000017A5200017810011B0C070890010710140000001C000000B0F0FFFF2A00000000000000000000001400000000000000017A5200017810011B0C070890010000240000001C00000050F0FFFF20000000000E10460E184A0F0B770880003F1A3B2A332422000000001C000000440000003EF1FFFF1000000000410E108602430D064B0C07080000002C0000006400000038F1FFFF7F0C000000450C0A00491006027600450F0376780603660C0C0A00450C070800000000002C0000009400000088FDFFFF6600000000410E108602430D06428F03458E04478D058C06488307024B0C07080000000014000000C4000000C8FDFFFF01000000000000000000000000000000209Symbols:210  - Name:            myfunc211    Type:            STT_FUNC212    Section:         .text213    Value:           0x0000000000400000214    Binding:         STB_GLOBAL215ProgramHeaders:216  - Type:     PT_LOAD217    Flags:    [ PF_X, PF_R ]218    VAddr:    0x00400000219    PAddr:    0x00400000220    FirstSec: .text221    LastSec:  .text222  - Type:     PT_GNU_EH_FRAME223    Flags:    [ PF_X, PF_R ]224    VAddr:    0x004013C0225    PAddr:    0x004013C0226    MemSize:  [[MEMSIZE]]227    FileSize: [[FILESIZE]]228    FirstSec: .eh_frame_hdr229    LastSec:  .eh_frame_hdr230 231## Document we report a error when the memory size of the PT_GNU_EH_FRAME does not match its file size.232## TODO: we want to report a warning and continue dumping instead.233# RUN: yaml2obj --docnum=1 %s -DMEMSIZE=0x3b -DFILESIZE=0x3c -o %t1.size.mismatch234# RUN: not llvm-readobj --unwind %t1.size.mismatch 2>&1 | \235# RUN:   FileCheck -DFILE=%t1.size.mismatch %s --check-prefix=SIZE-MISMATCH236# RUN: not llvm-readelf --unwind %t1.size.mismatch 2>&1 | \237# RUN:   FileCheck -DFILE=%t1.size.mismatch %s --check-prefix=SIZE-MISMATCH238 239# SIZE-MISMATCH: error: '[[FILE]]': p_memsz does not match p_filesz for GNU_EH_FRAME240 241## Check we partially dump the unwind information when the PT_GNU_EH_FRAME segment242## points to truncated data.243# RUN: yaml2obj --docnum=1 %s -DMEMSIZE=0x1 -DFILESIZE=0x1 -o %t1.truncated244# RUN: not llvm-readobj --unwind %t1.truncated 2>&1 | FileCheck -DFILE=%t1.truncated %s --check-prefix=TRUNCATED245# RUN: not llvm-readelf --unwind %t1.truncated 2>&1 | FileCheck -DFILE=%t1.truncated %s --check-prefix=TRUNCATED246 247# TRUNCATED:      EHFrameHeader {248# TRUNCATED-NEXT:   Address: 0x4013c0249# TRUNCATED-NEXT:   Offset: 0xbc250# TRUNCATED-NEXT:   Size: 0x1251# TRUNCATED-NEXT:   Corresponding Section: .eh_frame_hdr252# TRUNCATED-NEXT:   Header {253# TRUNCATED-NEXT:     version: 1254# TRUNCATED-NEXT:     eh_frame_ptr_enc: 0x0255# TRUNCATED-NEXT: error: '[[FILE]]': unexpected encoding eh_frame_ptr_enc256 257## Check we report an error when the tool is unable to parse .eh_frame section.258# RUN: yaml2obj --docnum=2 %s -o %t2.exe259# RUN: not llvm-readobj --unwind %t2.exe 2>&1 | FileCheck %s -DFILE=%t2.exe --check-prefix=NO-CIE-ERR260 261# NO-CIE-ERR:      .eh_frame section at offset 0x40 address 0x0:262# NO-CIE-ERR-NEXT: error: '[[FILE]]': parsing FDE data at 0x0 failed due to missing CIE263# NO-CIE-ERR-NOT:  {{.}}264 265--- !ELF266FileHeader:267  Class:   ELFCLASS64268  Data:    ELFDATA2LSB269  Type:    ET_REL270  Machine: EM_X86_64271Sections:272  - Name: .eh_frame273    Type: SHT_X86_64_UNWIND274## The content is generated from the following code. It has no CIE.275## See the DebugInfoX86/eh-frame-cie-id.s test case for more history.276## .section .eh_frame,"a",@unwind277## .long .Lend - .LCIEptr  # Length278## .LCIEptr:279##   .long 0xffffffff # CIE pointer280##   .quad 0x1111abcd # Initial location281##   .quad 0x00010000 # Address range282## .Lend:283    Content: 14000000FFFFFFFFCDAB1111000000000000010000000000284 285## Check we report a error when the .eh_frame section contains truncated data.286# RUN: yaml2obj --docnum=3 %s -o %t3.exe287# RUN: not llvm-readobj --unwind %t3.exe 2>&1 | FileCheck %s -DFILE=%t3.exe --check-prefix=TRUNCATED-ERR288 289# TRUNCATED-ERR:      .eh_frame section at offset 0x34 address 0x0:290# TRUNCATED-ERR-NEXT: error: '[[FILE]]': unexpected end of data at offset 0x4291 292--- !ELF293FileHeader:294  Class: ELFCLASS32295  Data:  ELFDATA2LSB296  Type:  ET_EXEC297Sections:298  - Name:    .eh_frame299    Type:    SHT_PROGBITS300## Length is set to 0xFF, though the actual section length is 4.301    Content: "FF000000"302 303## Check we report an error when we can't read the content of the .eh_frame section.304 305## Case A: test we report an error when the p_offset of the PT_GNU_EH_FRAME306##         is invalid (goes past the end of the file).307 308# RUN: yaml2obj --docnum=4 %s -o %t4 -DOFFSET=0xffff0000 -DSIZE=0x1 -DBITS=32309# RUN: not llvm-readobj --unwind %t4 2>&1 \310# RUN:   | FileCheck %s -DFILE=%t4 --check-prefix=BROKEN-CONTENT -DOFFSET=0xffff0000 -DSIZE=0x1311 312# RUN: yaml2obj --docnum=4 %s -o %t5 -DOFFSET=0x1 -DSIZE=0xffff0000 -DBITS=32313# RUN: not llvm-readobj --unwind %t5 2>&1 \314# RUN:   | FileCheck %s -DFILE=%t5 --check-prefix=BROKEN-CONTENT -DOFFSET=0x1 -DSIZE=0xffff0000315 316# BROKEN-CONTENT:      EHFrameHeader {317# BROKEN-CONTENT-NEXT:   Address: 0x0318# BROKEN-CONTENT-NEXT:   Offset:  [[OFFSET]]319# BROKEN-CONTENT-NEXT:   Size:    [[SIZE]]320# BROKEN-CONTENT-NEXT:   Corresponding Section:321# BROKEN-CONTENT-NEXT: error: '[[FILE]]': program header  [index 0] has a p_offset ([[OFFSET]]) + p_filesz ([[SIZE]]) that is greater than the file size (0xe0)322 323--- !ELF324FileHeader:325  Class: ELFCLASS[[BITS]]326  Data:  ELFDATA2LSB327  Type:  ET_EXEC328ProgramHeaders:329  - Type:     PT_GNU_EH_FRAME330    MemSize:  [[SIZE]]331    FileSize: [[SIZE]]332    Offset:   [[OFFSET]]333 334## Case B: test we report an error when the file size of the PT_GNU_EH_FRAME335##         is invalid (goes past the end of the file).336# RUN: yaml2obj --docnum=4 %s -o %t6 -DOFFSET=0x100 -DSIZE=0xffff0000 -DBITS=32337# RUN: not llvm-readobj --unwind %t6 2>&1 \338# RUN:   | FileCheck %s -DFILE=%t6 --check-prefix=BROKEN-CONTENT -DOFFSET=0x100 -DSIZE=0xffff0000339 340## Case C: test we report an error when the offset + the file size of the PT_GNU_EH_FRAME is so large a341##         value that it overflows the platform address size type.342 343# RUN: yaml2obj --docnum=4 %s -o %t7 -DOFFSET=0x1 -DSIZE=0xffffffff -DBITS=32344# RUN: not llvm-readobj --unwind %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=BROKEN-CONTENT2 -DOFFSET=0x1 -DSIZE=0xffffffff345 346# RUN: yaml2obj --docnum=4 %s -o %t8 -DOFFSET=0xffffffff -DSIZE=0x1 -DBITS=32347# RUN: not llvm-readobj --unwind %t8 2>&1 | FileCheck %s -DFILE=%t8 --check-prefix=BROKEN-CONTENT2 -DOFFSET=0xffffffff -DSIZE=0x1348 349# RUN: yaml2obj --docnum=4 %s -o %t9 -DOFFSET=0x1 -DSIZE=0xffffffffffffffff -DBITS=64350# RUN: not llvm-readelf --unwind %t9 2>&1 | FileCheck %s -DFILE=%t9 --check-prefix=BROKEN-CONTENT2 -DOFFSET=0x1 -DSIZE=0xffffffffffffffff351 352# RUN: yaml2obj --docnum=4 %s -o %t10 -DOFFSET=0xffffffffffffffff -DSIZE=0x1 -DBITS=64353# RUN: not llvm-readelf --unwind %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=BROKEN-CONTENT2 -DOFFSET=0xffffffffffffffff -DSIZE=0x1354 355# BROKEN-CONTENT2:      EHFrameHeader {356# BROKEN-CONTENT2-NEXT:   Address: 0x0357# BROKEN-CONTENT2-NEXT:   Offset: [[OFFSET]]358# BROKEN-CONTENT2-NEXT:   Size:   [[SIZE]]359# BROKEN-CONTENT2-NEXT:   Corresponding Section:360# BROKEN-CONTENT2-NEXT: error: '[[FILE]]': program header [index 0] has a p_offset ([[OFFSET]]) + p_filesz ([[SIZE]]) that cannot be represented361