diff --git a/lld/test/MachO/rename.s b/lld/test/MachO/rename.s --- a/lld/test/MachO/rename.s +++ b/lld/test/MachO/rename.s @@ -1,9 +1,11 @@ # REQUIRES: x86 -# RUN: rm -fr %t -# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o -# RUN: %lld -o %t %t.o -## Check option format +# RUN: rm -rf %t; split-file %s %t + +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/main.s -o %t.o +# RUN: %lld -o %t.out %t.o + +## Check option format. # RUN: not %lld \ # RUN: -rename_section B@GUS_SEG b@gus_sect S/ASHY_SEG st*rry_sect \ # RUN: -rename_section __FROM_SECT __from_sect __TO_SECT \ @@ -26,13 +28,13 @@ # BAD2-DAG: error: invalid name for segment or section: -o # BAD2-DAG: error: {{.*}}: unhandled file type -## Check that section and segment renames happen -# RUN: %lld \ +## Check that section and segment renames happen. +# RUN: %lld -lSystem \ # RUN: -rename_section __FROM_SECT __from_sect __TO_SECT __to_sect \ # RUN: -rename_segment __FROM_SEG __TO_SEG \ # RUN: -rename_section __TEXT __cstring __RODATA __cstring \ -# RUN: -o %t %t.o -# RUN: llvm-objdump --macho --all-headers %t | FileCheck %s +# RUN: -o %t.out %t.o +# RN: llvm-otool -l %t.out | FileCheck %s # CHECK: {{^}}Section{{$}} # CHECK-NEXT: sectname __text @@ -47,6 +49,62 @@ # CHECK-NEXT: sectname __cstring # CHECK-NEXT: segname __RODATA +## Check interaction between -rename_section and -rename_segment. +## rename_segment should be applied after rename_section, so the output +## name of rename_section is renamed by rename_segment. +## (ld64 leaves an empty __TO_SECT,__to_sect in the output for the intermediate +## name, but it too writes the actual data to __SEG,__to_sect.) +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/small.s \ +# RUN: -o %t/small.o +# RUN: %lld -dylib \ +# RUN: -rename_section __FROM_SECT __from_sect __TO_SECT __to_sect \ +# RUN: -rename_segment __TO_SECT __SEG \ +# RUN: -o %t.dylib %t/small.o +# RUN: llvm-otool -l %t.dylib | FileCheck --check-prefix=SECTSEGYES %s +# RUN: %lld -dylib \ +# RUN: -rename_segment __TO_SECT __SEG \ +# RUN: -rename_section __FROM_SECT __from_sect __TO_SECT __to_sect \ +# RUN: -o %t.dylib %t/small.o +# RUN: llvm-otool -l %t.dylib | FileCheck --check-prefix=SECTSEGYES %s +# SECTSEGYES: Section +# SECTSEGYES-NEXT: sectname __text +# SECTSEGYES-NEXT: segname __TEXT +# SECTSEGYES: Section +# SECTSEGYES-NEXT: sectname __to_sect +# SECTSEGYES-NEXT: segname __SEG +## ...but rename_segment has no effect if it doesn't match the name after +## rename_section is applied. +# RUN: %lld -dylib \ +# RUN: -rename_section __FROM_SECT __from_sect __TO_SECT __to_sect \ +# RUN: -rename_segment __FROM_SECT __SEG \ +# RUN: -o %t.dylib %t/small.o +# RUN: llvm-otool -l %t.dylib | FileCheck --check-prefix=SECTSEGSOME %s +# SECTSEGSOME: Section +# SECTSEGSOME-NEXT: sectname __text +# SECTSEGSOME-NEXT: segname __TEXT +# SECTSEGSOME: Section +# SECTSEGSOME-NEXT: sectname __to_sect +# SECTSEGSOME-NEXT: segname __TO_SECT +## If rename_section would only match after rename_segment, rename_section has +## no effect. +# RUN: %lld -dylib \ +# RUN: -rename_section __SEG __from_sect __TO_SECT __to_sect \ +# RUN: -rename_segment __FROM_SECT __SEG \ +# RUN: -o %t.dylib %t/small.o +# RUN: llvm-otool -l %t.dylib | FileCheck --check-prefix=SECTSEGNO %s +# RUN: %lld -dylib \ +# RUN: -rename_segment __FROM_SECT __SEG \ +# RUN: -rename_section __SEG __from_sect __TO_SECT __to_sect \ +# RUN: -o %t.dylib %t/small.o +# RUN: llvm-otool -l %t.dylib | FileCheck --check-prefix=SECTSEGNO %s +# SECTSEGNO: Section +# SECTSEGNO-NEXT: sectname __text +# SECTSEGNO-NEXT: segname __TEXT +# SECTSEGNO: Section +# SECTSEGNO-NEXT: sectname __from_sect +# SECTSEGNO-NEXT: segname __SEG + +#--- main.s .section __FROM_SECT,__from_sect .global _from_sect _from_sect: @@ -65,3 +123,9 @@ .global _main _main: ret + +#--- small.s +.section __FROM_SECT,__from_sect +.global _from_sect +_from_sect: + .space 8