| # REQUIRES: x86, shell |
| # UNSUPPORTED: system-windows |
| # RUN: rm -rf %t; split-file %s %t |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/no-debug.s -o %t/no-debug.o |
| ## Set modtimes of the files for deterministic test output. |
| # RUN: env TZ=UTC touch -t "197001010000.16" %t/test.o |
| # RUN: env TZ=UTC touch -t "197001010000.32" %t/foo.o |
| # RUN: llvm-ar rcsU %t/foo.a %t/foo.o |
| |
| # RUN: %lld -lSystem %t/test.o %t/foo.o %t/no-debug.o -o %t/test |
| # RUN: (llvm-objdump --section-headers %t/test; dsymutil -s %t/test) | \ |
| # RUN: FileCheck %s -DDIR=%t -DFOO_PATH=%t/foo.o |
| |
| ## Check that we emit the right modtime even when the object file is in an |
| ## archive. |
| # RUN: %lld -lSystem %t/test.o %t/foo.a %t/no-debug.o -o %t/test |
| # RUN: (llvm-objdump --section-headers %t/test; dsymutil -s %t/test) | \ |
| # RUN: FileCheck %s -DDIR=%t -DFOO_PATH=%t/foo.a\(foo.o\) |
| |
| ## Check that we emit absolute paths to the object files in our OSO entries |
| ## even if our inputs are relative paths. |
| # RUN: cd %t && %lld -lSystem test.o foo.o no-debug.o -o test |
| # RUN: (llvm-objdump --section-headers %t/test; dsymutil -s %t/test) | \ |
| # RUN: FileCheck %s -DDIR=%t -DFOO_PATH=%t/foo.o |
| |
| # RUN: cd %t && %lld -lSystem test.o foo.a no-debug.o -o %t/test |
| # RUN: (llvm-objdump --section-headers %t/test; dsymutil -s %t/test) | \ |
| # RUN: FileCheck %s -DDIR=%t -DFOO_PATH=%t/foo.a\(foo.o\) |
| |
| # CHECK: Sections: |
| # CHECK-NEXT: Idx Name |
| # CHECK-NEXT: [[#TEXT_ID:]] __text |
| # CHECK-NEXT: [[#DATA_ID:]] __data |
| # CHECK-NEXT: [[#MORE_DATA_ID:]] more_data |
| # CHECK-NEXT: [[#COMM_ID:]] __common |
| # CHECK-NEXT: [[#MORE_TEXT_ID:]] more_text |
| |
| # CHECK: (N_SO ) 00 0000 0000000000000000 '/tmp/test.cpp' |
| # CHECK-NEXT: (N_OSO ) 03 0001 0000000000000010 '[[DIR]]/test.o' |
| # CHECK-NEXT: (N_STSYM ) [[#%.2d,MORE_DATA_ID + 1]] 0000 [[#%.16x,STATIC:]] '_static_var' |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,MAIN:]] '_main' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000006{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,BAR:]] '_bar' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000000{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,BAR2:]] '_bar2' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000001{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,BAZ:]] '_baz' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000000{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,BAZ2:]] '_baz2' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000002{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,QUX:]] '_qux' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000003{{$}} |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,QUUX:]] '_quux' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000004{{$}} |
| # CHECK-NEXT: (N_GSYM ) [[#%.2d,DATA_ID + 1]] 0000 [[#%.16x,GLOB:]] '_global_var' |
| # CHECK-NEXT: (N_GSYM ) [[#%.2d,COMM_ID + 1]] 0000 [[#%.16x,ZERO:]] '_zero' |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,MORE_TEXT_ID + 1]] 0000 [[#%.16x,FUN:]] '_fun' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000001{{$}} |
| # CHECK-NEXT: (N_SO ) 01 0000 0000000000000000{{$}} |
| # CHECK-NEXT: (N_SO ) 00 0000 0000000000000000 '/foo.cpp' |
| # CHECK-NEXT: (N_OSO ) 03 0001 0000000000000020 '[[FOO_PATH]]' |
| # CHECK-NEXT: (N_FUN ) [[#%.2d,TEXT_ID + 1]] 0000 [[#%.16x,FOO:]] '_foo' |
| # CHECK-NEXT: (N_FUN ) 00 0000 0000000000000001{{$}} |
| # CHECK-NEXT: (N_SO ) 01 0000 0000000000000000{{$}} |
| # CHECK-DAG: ( SECT ) [[#%.2d,MORE_DATA_ID + 1]] 0000 [[#STATIC]] '_static_var' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#MAIN]] '_main' |
| # CHECK-DAG: ( ABS EXT) 00 0000 {{[0-9af]+}} '_abs' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#FOO]] '_foo' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#BAR]] '_bar' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#BAR2]] '_bar2' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#BAZ]] '_baz' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#BAZ2]] '_baz2' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#QUX]] '_qux' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 [[#QUUX]] '_quux' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,DATA_ID + 1]] 0000 [[#GLOB]] '_global_var' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,COMM_ID + 1]] 0000 [[#ZERO]] '_zero' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,MORE_TEXT_ID + 1]] 0000 [[#FUN]] '_fun' |
| # CHECK-DAG: ( SECT EXT) [[#%.2d,TEXT_ID + 1]] 0000 {{[0-9a-f]+}} '_no_debug' |
| # CHECK-DAG: ( {{.*}}) {{[0-9]+}} 0000 {{[0-9a-f]+}} '__mh_execute_header' |
| # CHECK-EMPTY: |
| |
| ## Check that we don't attempt to emit rebase opcodes for the debug sections |
| ## when building a PIE (since we have filtered the sections out). |
| # RUN: %lld -lSystem -pie %t/test.o %t/foo.a %t/no-debug.o -o %t/test |
| # RUN: llvm-objdump --macho --rebase %t/test | FileCheck %s --check-prefix=PIE |
| # PIE: Rebase table: |
| # PIE-NEXT: segment section address type |
| # PIE-EMPTY: |
| |
| #--- test.s |
| |
| ## Make sure we don't create STABS entries for absolute symbols. |
| .globl _abs |
| _abs = 0x123 |
| |
| .section __DATA, __data |
| .globl _global_var |
| _global_var: |
| .quad 123 |
| |
| .section __DATA, more_data |
| _static_var: |
| .quad 123 |
| |
| .globl _zero |
| .zerofill __DATA,__common,_zero,4,2 |
| |
| .text |
| .globl _main, _bar, _bar2, _baz, _baz2, _qux, _quux |
| .alt_entry _baz |
| .alt_entry _qux |
| |
| _bar: |
| _bar2: |
| .space 1 |
| |
| _baz: |
| _baz2: |
| .space 2 |
| |
| _main: |
| Lfunc_begin0: |
| callq _foo |
| retq |
| Lfunc_end0: |
| |
| _qux: |
| .space 3 |
| |
| _quux: |
| .space 4 |
| |
| .section __DWARF,__debug_str,regular,debug |
| .asciz "test.cpp" ## string offset=0 |
| .asciz "/tmp" ## string offset=9 |
| .section __DWARF,__debug_abbrev,regular,debug |
| Lsection_abbrev: |
| .byte 1 ## Abbreviation Code |
| .byte 17 ## DW_TAG_compile_unit |
| .byte 1 ## DW_CHILDREN_yes |
| .byte 3 ## DW_AT_name |
| .byte 14 ## DW_FORM_strp |
| .byte 27 ## DW_AT_comp_dir |
| .byte 14 ## DW_FORM_strp |
| .byte 17 ## DW_AT_low_pc |
| .byte 1 ## DW_FORM_addr |
| .byte 18 ## DW_AT_high_pc |
| .byte 6 ## DW_FORM_data4 |
| .byte 0 ## EOM(1) |
| .section __DWARF,__debug_info,regular,debug |
| .set Lset0, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit |
| .long Lset0 |
| Ldebug_info_start0: |
| .short 4 ## DWARF version number |
| .set Lset1, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section |
| .long Lset1 |
| .byte 8 ## Address Size (in bytes) |
| .byte 1 ## Abbrev [1] 0xb:0x48 DW_TAG_compile_unit |
| .long 0 ## DW_AT_name |
| .long 9 ## DW_AT_comp_dir |
| .quad Lfunc_begin0 ## DW_AT_low_pc |
| .set Lset3, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc |
| .long Lset3 |
| .byte 0 ## End Of Children Mark |
| Ldebug_info_end0: |
| .subsections_via_symbols |
| .section __DWARF,__debug_line,regular,debug |
| |
| .section OTHER,more_text,regular,pure_instructions |
| .globl _fun |
| _fun: |
| ret |
| |
| #--- foo.s |
| .text |
| .globl _foo |
| _foo: |
| Lfunc_begin0: |
| retq |
| Lfunc_end0: |
| |
| .section __DWARF,__debug_str,regular,debug |
| .asciz "foo.cpp" ## string offset=0 |
| .asciz "" ## string offset=8 |
| .section __DWARF,__debug_abbrev,regular,debug |
| Lsection_abbrev: |
| .byte 1 ## Abbreviation Code |
| .byte 17 ## DW_TAG_compile_unit |
| .byte 1 ## DW_CHILDREN_yes |
| .byte 3 ## DW_AT_name |
| .byte 14 ## DW_FORM_strp |
| .byte 27 ## DW_AT_comp_dir |
| .byte 14 ## DW_FORM_strp |
| .byte 17 ## DW_AT_low_pc |
| .byte 1 ## DW_FORM_addr |
| .byte 18 ## DW_AT_high_pc |
| .byte 6 ## DW_FORM_data4 |
| .byte 0 ## EOM(1) |
| .section __DWARF,__debug_info,regular,debug |
| .set Lset0, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit |
| .long Lset0 |
| Ldebug_info_start0: |
| .short 4 ## DWARF version number |
| .set Lset1, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section |
| .long Lset1 |
| .byte 8 ## Address Size (in bytes) |
| .byte 1 ## Abbrev [1] 0xb:0x48 DW_TAG_compile_unit |
| .long 0 ## DW_AT_name |
| .long 8 ## DW_AT_comp_dir |
| .quad Lfunc_begin0 ## DW_AT_low_pc |
| .set Lset3, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc |
| .long Lset3 |
| .byte 0 ## End Of Children Mark |
| Ldebug_info_end0: |
| .subsections_via_symbols |
| .section __DWARF,__debug_line,regular,debug |
| |
| .section __DWARF,__debug_aranges,regular,debug |
| ltmp1: |
| .byte 0 |
| |
| #--- no-debug.s |
| ## This file has no debug info. |
| .text |
| .globl _no_debug |
| _no_debug: |
| ret |