llvm/llvm/test/tools/dsymutil/basic-linking.test

RUN: dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 | FileCheck %s
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-lto.macho.x86_64 | FileCheck %s --check-prefix=CHECK-LTO
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefix=CHECK-ARCHIVE
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 %p/Inputs/basic-lto.macho.x86_64 %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefixes=CHECK,CHECK-LTO,CHECK-ARCHIVE
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p -D %p/Inputs %p/Inputs/basic-relink.macho.arm64.dylib | FileCheck %s --check-prefix=CHECK-RELINK
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p -D %p/Inputs %p/Inputs/two-level-relink.macho.arm64.dylib | FileCheck %s --check-prefix=CHECK-RELINK-TWO
RUN: dsymutil -no-output -verbose -oso-prepend-path=%p -build-variant-suffix=_debug -D WrongPath -D %p/Inputs %p/Inputs/variant-relink.macho.arm64.dylib | FileCheck %s --check-prefix=CHECK-RELINK-VARIANT

RUN: dsymutil --linker parallel -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 | FileCheck %s
RUN: dsymutil --linker parallel -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-lto.macho.x86_64 | FileCheck %s --check-prefix=CHECK-LTO
RUN: dsymutil --linker parallel -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefix=CHECK-ARCHIVE
RUN: dsymutil --linker parallel -no-output -verbose -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 %p/Inputs/basic-lto.macho.x86_64 %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefixes=CHECK,CHECK-LTO,CHECK-ARCHIVE

This test check the basic Dwarf linking process through the debug dumps.

================================= Simple link ================================
CHECK: DEBUG MAP OBJECT: {{.*}}basic1.macho.x86_64.o
CHECK: Input compilation unit:
CHECK-NEXT: TAG_compile_unit
CHECK-NOT: TAG
CHECK: AT_name {{.*}}basic1.c

CHECK: DEBUG MAP OBJECT: {{.*}}basic2.macho.x86_64.o
CHECK: Input compilation unit:
CHECK-NEXT: TAG_compile_unit
CHECK-NOT: TAG
CHECK: AT_name {{.*}}basic2.c

CHECK: DEBUG MAP OBJECT: {{.*}}basic3.macho.x86_64.o
CHECK: Input compilation unit:
CHECK-NEXT: TAG_compile_unit
CHECK-NOT: TAG
CHECK: AT_name {{.*}}basic3.c

CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _main	0x0000000000000000 => 0x0000000100000ea0
CHECK-NEXT: Keeping subprogram DIE:
CHECK-NEXT: DW_TAG_subprogram
CHECK-NEXT:   DW_AT_name{{.*}}"main"

CHECK: Found valid debug map entry: _private_int 	0x0000000000000560 => 0x0000000100001008
CHECK-NEXT: Keeping variable DIE:
CHECK-NEXT: DW_TAG_variable
CHECK-NEXT:   DW_AT_name {{.*}}"private_int"
CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _baz	0x0000000000000310 => 0x0000000100001000
CHECK-NEXT: Keeping variable DIE:
CHECK-NEXT: DW_TAG_variable
CHECK-NEXT:   DW_AT_name {{.*}}"baz"
CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _foo	0x0000000000000020 => 0x0000000100000ed0
CHECK-NEXT: Keeping subprogram DIE:
CHECK-NEXT: DW_TAG_subprogram
CHECK-NEXT:   DW_AT_name {{.*}}"foo"
CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _inc	0x0000000000000070 => 0x0000000100000f20
CHECK-NEXT: Keeping subprogram DIE:
CHECK-NEXT: DW_TAG_subprogram
CHECK-NEXT:   DW_AT_name {{.*}}"inc"

CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _val	0xffffffffffffffff => 0x0000000100001004
CHECK-NEXT: Keeping variable DIE:
CHECK-NEXT: DW_TAG_variable
CHECK-NEXT:   DW_AT_name {{.*}}"val"
CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _bar	0x0000000000000020 => 0x0000000100000f40
CHECK-NEXT: Keeping subprogram DIE:
CHECK-NEXT: DW_TAG_subprogram
CHECK-NEXT:   DW_AT_name {{.*}}"bar"
CHECK-NOT: Found valid debug map entry
CHECK: Found valid debug map entry: _inc	0x0000000000000070 => 0x0000000100000f90
CHECK-NEXT: Keeping subprogram DIE:
CHECK-NEXT: DW_TAG_subprogram
CHECK-NEXT:   DW_AT_name {{.*}}"inc")


================================= LTO link ================================
CHECK-LTO: DEBUG MAP OBJECT: {{.*}}basic-lto.macho.x86_64.o
CHECK-LTO: Input compilation unit:
CHECK-LTO-NEXT: TAG_compile_unit
CHECK-LTO-NOT: TAG
CHECK-LTO: AT_name {{.*}}basic1.c
CHECK-LTO: Input compilation unit:
CHECK-LTO-NEXT: TAG_compile_unit
CHECK-LTO-NOT: TAG
CHECK-LTO: AT_name {{.*}}basic2.c
CHECK-LTO: Input compilation unit:
CHECK-LTO-NEXT: TAG_compile_unit
CHECK-LTO-NOT: TAG
CHECK-LTO: AT_name {{.*}}basic3.c

CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _main	0x0000000000000000 => 0x0000000100000f40
CHECK-LTO-NEXT: Keeping subprogram DIE:
CHECK-LTO-NEXT: DW_TAG_subprogram
CHECK-LTO-NEXT:   DW_AT_name {{.*}}"main"
CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _private_int 	0x00000000000008e8 => 0x0000000100001008
CHECK-LTO-NEXT: Keeping variable DIE:
CHECK-LTO-NEXT: DW_TAG_variable
CHECK-LTO-NEXT:   DW_AT_name {{.*}}"private_int"
CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _baz	0x0000000000000658 => 0x0000000100001000
CHECK-LTO-NEXT: Keeping variable DIE:
CHECK-LTO-NEXT: DW_TAG_variable
CHECK-LTO-NEXT:   DW_AT_name {{.*}} "baz"
CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _foo	0x0000000000000010 => 0x0000000100000f50
CHECK-LTO-NEXT: Keeping subprogram DIE:
CHECK-LTO-NEXT: DW_TAG_subprogram
CHECK-LTO-NEXT:   DW_AT_name {{.*}}"foo"
CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _val	0x00000000000008ec => 0x0000000100001004
CHECK-LTO-NEXT: Keeping variable DIE:
CHECK-LTO-NEXT: DW_TAG_variable
CHECK-LTO-NEXT:   DW_AT_name {{.*}}"val"
CHECK-LTO-NOT: Found valid debug map entry
CHECK-LTO: Found valid debug map entry: _bar	0x0000000000000050 => 0x0000000100000f90
CHECK-LTO-NEXT: Keeping subprogram DIE:
CHECK-LTO-NEXT: DW_TAG_subprogram
CHECK-LTO-NEXT:   DW_AT_name {{.*}}"bar"


================================= Archive link ================================
CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}basic1.macho.x86_64.o
CHECK-ARCHIVE: Input compilation unit:
CHECK-ARCHIVE-NEXT: TAG_compile_unit
CHECK-ARCHIVE-NOT: TAG
CHECK-ARCHIVE: AT_name {{.*}}basic1.c

CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}libbasic.a(basic2.macho.x86_64.o)
CHECK-ARCHIVE: Input compilation unit:
CHECK-ARCHIVE-NEXT: TAG_compile_unit
CHECK-ARCHIVE-NOT: TAG
CHECK-ARCHIVE: AT_name {{.*}}basic2.c

CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}libbasic.a(basic3.macho.x86_64.o)
CHECK-ARCHIVE: Input compilation unit:
CHECK-ARCHIVE-NEXT: TAG_compile_unit
CHECK-ARCHIVE-NOT: TAG
CHECK-ARCHIVE: AT_name {{.*}}basic3.c

CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _main	0x0000000000000000 => 0x0000000100000ea0
CHECK-ARCHIVE-NEXT: Keeping subprogram DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_subprogram
CHECK-ARCHIVE-NEXT:   DW_AT_name{{.*}}"main"

CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _private_int	0x0000000000000560 => 0x0000000100001004
CHECK-ARCHIVE-NEXT: Keeping variable DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_variable
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"private_int"
CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _baz	0x0000000000000310 => 0x0000000100001000
CHECK-ARCHIVE-NEXT: Keeping variable DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_variable
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"baz"
CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _foo	0x0000000000000020 => 0x0000000100000ed0
CHECK-ARCHIVE-NEXT: Keeping subprogram DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_subprogram
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"foo"
CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _inc	0x0000000000000070 => 0x0000000100000f20
CHECK-ARCHIVE-NEXT: Keeping subprogram DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_subprogram
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"inc"

CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _val	0xffffffffffffffff => 0x0000000100001008
CHECK-ARCHIVE-NEXT: Keeping variable DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_variable
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"val"
CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _bar	0x0000000000000020 => 0x0000000100000f40
CHECK-ARCHIVE-NEXT: Keeping subprogram DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_subprogram
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"bar"
CHECK-ARCHIVE-NOT: Found valid debug map entry
CHECK-ARCHIVE: Found valid debug map entry: _inc	0x0000000000000070 => 0x0000000100000f90
CHECK-ARCHIVE-NEXT: Keeping subprogram DIE:
CHECK-ARCHIVE-NEXT: DW_TAG_subprogram
CHECK-ARCHIVE-NEXT:   DW_AT_name {{.*}}"inc")


================================= Simple relink ================================
CHECK-RELINK: DEBUG MAP OBJECT: {{.*}}basic-relink.macho.arm64.o
CHECK-RELINK: Input compilation unit:
CHECK-RELINK-NEXT: TAG_compile_unit
CHECK-RELINK-NOT: TAG
CHECK-RELINK: AT_name {{.*}}basic-relink.macho.arm64.c

CHECK-RELINK: DEBUG MAP OBJECT: {{.*}}foo-relink.dylib
CHECK-RELINK: Input compilation unit:
CHECK-RELINK-NEXT: TAG_compile_unit
CHECK-RELINK-NOT: TAG
CHECK-RELINK: AT_name {{.*}}foo-relink.c

CHECK-RELINK: Input compilation unit:
CHECK-RELINK-NEXT: TAG_compile_unit
CHECK-RELINK-NOT: TAG
CHECK-RELINK: AT_name {{.*}}altfoo-relink.c

CHECK-RELINK: DEBUG MAP OBJECT: {{.*}}bar-relink.dylib
CHECK-RELINK: Input compilation unit:
CHECK-RELINK-NEXT: TAG_compile_unit
CHECK-RELINK-NOT: TAG
CHECK-RELINK: AT_name {{.*}}bar-relink.c

CHECK-RELINK-NOT: Found valid debug map entry
CHECK-RELINK: Found valid debug map entry: _display	0x0000000000000000 => 0x0000000000003f10
CHECK-RELINK-NEXT: Keeping subprogram DIE:
CHECK-RELINK-NEXT: DW_TAG_subprogram
CHECK-RELINK:   DW_AT_name{{.*}}"display"

CHECK-RELINK: Found valid debug map entry: _foo	0x0000000000003f54 => 0x0000000000003f2c
CHECK-RELINK-NEXT: Keeping subprogram DIE:
CHECK-RELINK-NEXT: DW_TAG_subprogram
CHECK-RELINK:   DW_AT_name {{.*}}"foo"

CHECK-RELINK-NOT: Found valid debug map entry
CHECK-RELINK: Found valid debug map entry: _foo_unused	0x0000000000003f74 => 0x0000000000003f4c
CHECK-RELINK-NEXT: Keeping subprogram DIE:
CHECK-RELINK-NEXT: DW_TAG_subprogram
CHECK-RELINK:   DW_AT_name {{.*}}"foo_unused"

CHECK-RELINK-NOT: Found valid debug map entry
CHECK-RELINK: Found valid debug map entry: _altfoo	0x0000000000003f7c => 0x0000000000003f54
CHECK-RELINK-NEXT: Keeping subprogram DIE:
CHECK-RELINK-NEXT: DW_TAG_subprogram
CHECK-RELINK:   DW_AT_name {{.*}}"altfoo"

CHECK-RELINK-NOT: Found valid debug map entry
CHECK-RELINK: Found valid debug map entry: _baz	0x0000000000004000 => 0x0000000000008000
CHECK-RELINK-NEXT: Keeping variable DIE:
CHECK-RELINK-NEXT: DW_TAG_variable
CHECK-RELINK-NEXT:   DW_AT_name {{.*}}"baz"

CHECK-RELINK-NOT: Found valid debug map entry
CHECK-RELINK: Found valid debug map entry: _bar	0x0000000000003fa0 => 0x0000000000003f78
CHECK-RELINK-NEXT: Keeping subprogram DIE:
CHECK-RELINK-NEXT: DW_TAG_subprogram
CHECK-RELINK:   DW_AT_name {{.*}}"bar"

================================= Two level relink ================================
CHECK-RELINK-TWO: DEBUG MAP OBJECT: {{.*}}proxy-relink.dylib
CHECK-RELINK-TWO: Input compilation unit:
CHECK-RELINK-TWO-NEXT: TAG_compile_unit
CHECK-RELINK-TWO-NOT: TAG
CHECK-RELINK-TWO: AT_name {{.*}}two-level-relink.macho.arm64.c

CHECK-RELINK-TWO: Input compilation unit:
CHECK-RELINK-TWO-NEXT: TAG_compile_unit
CHECK-RELINK-TWO-NOT: TAG
CHECK-RELINK-TWO: AT_name {{.*}}bar-relink.c
CHECK-RELINK-TWO: DW_AT_APPLE_origin {{.*}}/path/to/bar-relink.dylib

CHECK-RELINK-TWO: Input compilation unit:
CHECK-RELINK-TWO-NEXT: TAG_compile_unit
CHECK-RELINK-TWO-NOT: TAG
CHECK-RELINK-TWO: AT_name {{.*}}foo-relink.c
CHECK-RELINK-TWO: DW_AT_APPLE_origin {{.*}}/path/to/foo-relink.dylib

CHECK-RELINK-TWO: Input compilation unit:
CHECK-RELINK-TWO-NEXT: TAG_compile_unit
CHECK-RELINK-TWO-NOT: TAG
CHECK-RELINK-TWO: AT_name {{.*}}altfoo-relink.c
CHECK-RELINK-TWO: DW_AT_APPLE_origin {{.*}}/path/to/foo-relink.dylib

CHECK-RELINK-TWO-NOT: Found valid debug map entry
CHECK-RELINK-TWO: Found valid debug map entry: _display	0x0000000000003f1c => 0x0000000000003f1c
CHECK-RELINK-TWO-NEXT: Keeping subprogram DIE:
CHECK-RELINK-TWO-NEXT: DW_TAG_subprogram
CHECK-RELINK-TWO:   DW_AT_name{{.*}}"display"

CHECK-RELINK-TWO-NOT: Found valid debug map entry
CHECK-RELINK-TWO: Found valid debug map entry: _baz	0x0000000000008000 => 0x0000000000008000
CHECK-RELINK-TWO-NEXT: Keeping variable DIE:
CHECK-RELINK-TWO-NEXT: DW_TAG_variable
CHECK-RELINK-TWO-NEXT:   DW_AT_name {{.*}}"baz"

CHECK-RELINK-TWO-NOT: Found valid debug map entry
CHECK-RELINK-TWO: Found valid debug map entry: _bar	0x0000000000003f38 => 0x0000000000003f38
CHECK-RELINK-TWO-NEXT: Keeping subprogram DIE:
CHECK-RELINK-TWO-NEXT: DW_TAG_subprogram
CHECK-RELINK-TWO:   DW_AT_name {{.*}}"bar"

CHECK-RELINK-TWO: Found valid debug map entry: _foo	0x0000000000003f40 => 0x0000000000003f40
CHECK-RELINK-TWO-NEXT: Keeping subprogram DIE:
CHECK-RELINK-TWO-NEXT: DW_TAG_subprogram
CHECK-RELINK-TWO:   DW_AT_name {{.*}}"foo"

CHECK-RELINK-TWO-NOT: Found valid debug map entry
CHECK-RELINK-TWO: Found valid debug map entry: _altfoo	0x0000000000003f64 => 0x0000000000003f64
CHECK-RELINK-TWO-NEXT: Keeping subprogram DIE:
CHECK-RELINK-TWO-NEXT: DW_TAG_subprogram
CHECK-RELINK-TWO:   DW_AT_name {{.*}}"altfoo"

================================= Build variants relink ================================
CHECK-RELINK-VARIANT: DEBUG MAP OBJECT: {{.*}}basic-relink.macho.arm64.o
CHECK-RELINK-VARIANT: DEBUG MAP OBJECT: {{.*}}foo-relink-variant_debug.dylib
CHECK-RELINK-VARIANT: DEBUG MAP OBJECT: {{.*}}bar-relink-variant.dylib