Index: test/tools/llvm-ar/replace-update.test =================================================================== --- test/tools/llvm-ar/replace-update.test +++ test/tools/llvm-ar/replace-update.test @@ -0,0 +1,189 @@ +## Test that the replace command with "u" updates the relevant members. + +# RUN: rm -rf %t && mkdir -p %t/new/other + +# RUN: yaml2obj %s -o %t/1.o --docnum=1 +# RUN: yaml2obj %s -o %t/2.o --docnum=2 +# RUN: yaml2obj %s -o %t/3.o --docnum=3 + +# RUN: env TZ=GMT touch -t 200001020304 %t/1.o +# RUN: env TZ=GMT touch -t 200001020304 %t/2.o +# RUN: env TZ=GMT touch -t 200001020304 %t/3.o + +# RUN: yaml2obj %s -o %t/new/1.o --docnum=4 +# RUN: yaml2obj %s -o %t/new/3.o --docnum=5 + +# RUN: yaml2obj %s -o %t/new/other/1.o --docnum=6 + +# RUN: env TZ=GMT touch -t 200001020304 %t/new/other/1.o + +## Replace single member with newer file: +# RUN: llvm-ar rcU %t/single.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar ruU %t/single.a %t/new/1.o +# RUN: llvm-ar t %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE --implicit-check-not {{.}} + +# SINGLE: 1.o +# SINGLE-NEXT: 2.o +# SINGLE-NEXT: 3.o + +# RUN: llvm-nm --print-armap %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE-SYM + +# SINGLE-SYM: symbolnew1 +# SINGLE-SYM-NEXT: symbol2 +# SINGLE-SYM-NEXT: symbol3 + +## Replace new single member with older file: +# RUN: llvm-ar ruU %t/single.a %t/1.o +# RUN: llvm-ar t %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE --implicit-check-not {{.}} + +# RUN: llvm-nm --print-armap %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE-SYM + +## Replace multiple members with newer files: +# RUN: llvm-ar rcuU %t/multiple.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar ruU %t/multiple.a %t/new/1.o %t/new/3.o +# RUN: llvm-ar t %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE --implicit-check-not {{.}} + +# MULTIPLE: 1.o +# MULTIPLE-NEXT: 2.o +# MULTIPLE-NEXT: 3.o + +# RUN: llvm-nm --print-armap %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE-SYM + +# MULTIPLE-SYM: symbolnew1 +# MULTIPLE-SYM-NEXT: symbol2 +# MULTIPLE-SYM-NEXTs: symbolnew3 + +## Replace newer members with multiple older files: +# RUN: llvm-ar ruU %t/multiple.a %t/1.o %t/2.o +# RUN: llvm-ar t %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE --implicit-check-not {{.}} + +# RUN: llvm-nm --print-armap %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE-SYM + +## Replace same member with newer files: +# RUN: llvm-ar rcuU %t/same.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar ruU %t/same.a %t/new/1.o %t/new/other/1.o +# RUN: llvm-ar t %t/same.a \ +# RUN: | FileCheck %s --check-prefix=SAME -DFILE=%t/2.o --implicit-check-not {{.}} + +# SAME: 1.o +# SAME-NEXT: 2.o +# SAME-NEXT: 3.o +# SAME-NEXT: 1.o + +# RUN: llvm-nm --print-armap %t/same.a \ +# RUN: | FileCheck %s --check-prefix=SAME-SYM + +# SAME-SYM: symbolnew1 +# SAME-SYM-NEXT: symbol2 +# SAME-SYM-NEXT: symbol3 +# SAME-SYM-NEXT: symbolother1 + +## Replace multiple members with an older file and a newer file: +# RUN: llvm-ar rcuU %t/old-new.a %t/new/1.o %t/2.o %t/3.o +# RUN: llvm-ar ruU %t/old-new.a %t/1.o %t/new/3.o +# RUN: llvm-ar t %t/old-new.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE --implicit-check-not {{.}} + +# RUN: llvm-nm --print-armap %t/old-new.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE-SYM + +## Replace same member with an older file and a newer file: +# RUN: llvm-ar rcuU %t/old-new-same.a %t/new/1.o %t/2.o %t/3.o +# RUN: llvm-ar ruU %t/old-new-same.a %t/1.o %t/new/other/1.o +# RUN: llvm-ar t %t/old-new-same.a \ +# RUN: | FileCheck %s --check-prefix=SAME -DFILE=%t/2.o --implicit-check-not {{.}} + +# RUN: llvm-nm --print-armap %t/same.a \ +# RUN: | FileCheck %s --check-prefix=SAME-SYM + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol1 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol2 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol3 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolnew1 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolnew3 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolother1 + Binding: STB_GLOBAL + Section: .text Index: test/tools/llvm-ar/replace.test =================================================================== --- test/tools/llvm-ar/replace.test +++ test/tools/llvm-ar/replace.test @@ -0,0 +1,178 @@ +## Test the replace command without modifiers replaces the relevant members. + +# RUN: rm -rf %t && mkdir -p %t/new/other +# RUN: yaml2obj %s -o %t/1.o --docnum=1 +# RUN: yaml2obj %s -o %t/2.o --docnum=2 +# RUN: yaml2obj %s -o %t/3.o --docnum=3 + +# RUN: yaml2obj %s -o %t/new/1.o --docnum=4 +# RUN: yaml2obj %s -o %t/new/3.o --docnum=5 + +# RUN: yaml2obj %s -o %t/new/other/1.o --docnum=6 + +## Replace single member: +# RUN: llvm-ar rc %t/single.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar r %t/single.a %t/new/1.o +# RUN: llvm-ar t %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE --implicit-check-not {{.}} + +# SINGLE: 1.o +# SINGLE-NEXT: 2.o +# SINGLE-NEXT: 3.o + +# RUN: llvm-nm --print-armap %t/single.a \ +# RUN: | FileCheck %s --check-prefix=SINGLE-SYM + +# SINGLE-SYM: symbolnew1 +# SINGLE-SYM-NEXT: symbol2 +# SINGLE-SYM-NEXT: symbol3 + +## Replace multiple members: +# RUN: llvm-ar rc %t/multiple.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar r %t/multiple.a %t/new/1.o %t/new/3.o +# RUN: llvm-ar t %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE --implicit-check-not {{.}} + +# MULTIPLE: 1.o +# MULTIPLE-NEXT: 2.o +# MULTIPLE-NEXT: 3.o + +# RUN: llvm-nm --print-armap %t/multiple.a \ +# RUN: | FileCheck %s --check-prefix=MULTIPLE-SYM + +# MULTIPLE-SYM: symbolnew1 +# MULTIPLE-SYM-NEXT: symbol2 +# MULTIPLE-SYM-NEXT: symbolnew3 + +## Replace same member: +# RUN: llvm-ar rc %t/same.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar r %t/same.a %t/new/1.o %t/new/other/1.o +# RUN: llvm-ar t %t/same.a \ +# RUN: | FileCheck %s --check-prefix=SAME --implicit-check-not {{.}} + +# SAME: 1.o +# SAME-NEXT: 2.o +# SAME-NEXT: 3.o +# SAME-NEXT: 1.o + +# RUN: llvm-nm --print-armap %t/same.a \ +# RUN: | FileCheck %s --check-prefix=SAME-SYM + +# SAME-SYM: symbolnew1 +# SAME-SYM-NEXT: symbol2 +# SAME-SYM-NEXT: symbol3 +# SAME-SYM-NEXT: symbolother1 + +## Replace without member: +# RUN: llvm-ar rc %t/without.a %t/1.o %t/2.o %t/3.o +# RUN: llvm-ar r %t/without.a +# RUN: llvm-ar t %t/without.a \ +# RUN: | FileCheck %s --check-prefix=WITHOUT --implicit-check-not {{.}} + +# WITHOUT: 1.o +# WITHOUT-NEXT: 2.o +# WITHOUT-NEXT: 3.o + +# RUN: llvm-nm --print-armap %t/without.a \ +# RUN: | FileCheck %s --check-prefix=WITHOUT-SYM + +# WITHOUT-SYM: symbol1 +# WITHOUT-SYM-NEXT: symbol2 +# WITHOUT-SYM-NEXT: symbol3 + +## No archive: +# RUN: not llvm-ar r 2>&1 \ +# RUN: | FileCheck %s --check-prefix=NO-ARCHIVE + +# NO-ARCHIVE: error: An archive name must be specified. + +## Member does not exist: +# RUN: llvm-ar rc %t/missing.a %t/1.o %t/2.o %t/3.o +# RUN: not llvm-ar r %t/missing.a %t/missing.txt 2>&1 \ +# RUN: | FileCheck %s --check-prefix=MISSING-FILE -DFILE=%t/missing.txt + +# MISSING-FILE: error: [[FILE]]: {{[Nn]}}o such file or directory. + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol1 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol2 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbol3 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolnew1 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolnew3 + Binding: STB_GLOBAL + Section: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + - Name: symbolother1 + Binding: STB_GLOBAL + Section: .text