cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
113 lines
6.7 KiB
ArmAsm
113 lines
6.7 KiB
ArmAsm
# REQUIRES: x86
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t1.o
|
|
# RUN: echo '.globl foo; foo:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t2.o
|
|
# RUN: rm -f %t2.a
|
|
# RUN: llvm-ar rcs %t2.a %t2.o
|
|
# RUN: ld.lld -shared %t2.o -o %t2.so
|
|
|
|
## A forward reference is accepted by a traditional Unix linker.
|
|
# RUN: ld.lld --fatal-warnings %t1.o %t2.a -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t1.o %t2.a -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t1.o --start-lib %t2.o --end-lib -o /dev/null
|
|
|
|
# RUN: echo 'INPUT("%t1.o" "%t2.a")' > %t1.lds
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t1.lds -o /dev/null
|
|
|
|
## A backward reference from %t1.o to %t2.a
|
|
## Warn unless the archive is excluded by --warn-backrefs-exclude
|
|
# RUN: ld.lld --fatal-warnings %t2.a %t1.o -o /dev/null
|
|
# RUN: ld.lld --warn-backrefs %t2.a %t1.o -o /dev/null 2>&1 | FileCheck %s
|
|
# RUN: ld.lld --warn-backrefs --no-warn-backrefs %t2.a %t1.o -o /dev/null 2>&1 | count 0
|
|
# RUN: ld.lld --warn-backrefs %t2.a '-(' %t1.o '-)' -o /dev/null 2>&1 | FileCheck %s
|
|
# RUN: ld.lld --warn-backrefs --warn-backrefs-exclude='*3.a' %t2.a %t1.o -o /dev/null 2>&1 | FileCheck %s
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --warn-backrefs-exclude='*2.a(*2.o)' %t2.a %t1.o -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --warn-backrefs-exclude '*2.a(*2.o)' \
|
|
# RUN: --warn-backrefs-exclude not_exist %t2.a %t1.o -o /dev/null
|
|
## Without --warn-backrefs, --warn-backrefs-exclude is ignored.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs-exclude=not_exist %t2.a %t1.o -o /dev/null
|
|
|
|
## Placing the definition and the backward reference in a group can suppress the warning.
|
|
# RUN: echo 'GROUP("%t2.a" "%t1.o")' > %t2.lds
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t2.lds -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs '-(' %t2.a %t1.o '-)' -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --start-group %t2.a %t1.o --end-group -o /dev/null
|
|
|
|
## A backward reference from %t1.o to %t2.a (added by %t3.lds).
|
|
# RUN: echo 'GROUP("%t2.a")' > %t3.lds
|
|
# RUN: ld.lld --warn-backrefs %t3.lds %t1.o -o /dev/null 2>&1 | FileCheck %s
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs '-(' %t3.lds %t1.o '-)' -o /dev/null
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --warn-backrefs-exclude='*2.a(*2.o)' -o /dev/null %t3.lds %t1.o
|
|
## If a lazy definition appears after the backward reference, don't warn.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t3.lds %t1.o %t3.lds -o /dev/null
|
|
|
|
# CHECK: warning: backward reference detected: foo in {{.*}}1.o refers to {{.*}}2.a
|
|
|
|
## A backward reference from %t1.o to %t2.o
|
|
## --warn-backrefs-exclude= applies to --start-lib covered object files.
|
|
# RUN: ld.lld --warn-backrefs --start-lib %t2.o --end-lib %t1.o -o /dev/null 2>&1 | \
|
|
# RUN: FileCheck --check-prefix=OBJECT %s
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --warn-backrefs-exclude=%/t2.o --start-lib %/t2.o --end-lib %t1.o -o /dev/null
|
|
## If a lazy definition appears after the backward reference, don't warn.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --start-lib %t2.o --end-lib %t1.o --start-lib %t2.o --end-lib -o /dev/null
|
|
|
|
# OBJECT: warning: backward reference detected: foo in {{.*}}1.o refers to {{.*}}2.o
|
|
|
|
## Back reference from an fetched --start-lib to a previous --start-lib.
|
|
# RUN: ld.lld -m elf_x86_64 -u _start --warn-backrefs --start-lib %/t2.o --end-lib \
|
|
# RUN: --start-lib %t1.o --end-lib -o /dev/null 2>&1 | FileCheck --check-prefix=OBJECT %s
|
|
## --warn-backrefs-exclude=%/t2.o can be used for a fetched --start-lib.
|
|
# RUN: ld.lld --fatal-warnings -m elf_x86_64 -u _start --warn-backrefs --warn-backrefs-exclude=%/t2.o --start-lib %/t2.o --end-lib --start-lib %t1.o --end-lib -o /dev/null
|
|
|
|
## Don't warn if the definition and the backward reference are in a group.
|
|
# RUN: echo '.globl bar; bar:' | llvm-mc -filetype=obj -triple=x86_64 - -o %t3.o
|
|
# RUN: echo '.globl foo; foo: call bar' | llvm-mc -filetype=obj -triple=x86_64 - -o %t4.o
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t1.o --start-lib %t3.o %t4.o --end-lib -o /dev/null
|
|
# RUN: rm -f %t34.a && llvm-ar rcS %t34.a %t3.o %t4.o
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t1.o %t34.a -o /dev/null
|
|
|
|
## We don't report backward references to weak symbols as they can be overridden later.
|
|
# RUN: echo '.weak foo; foo:' | llvm-mc -filetype=obj -triple=x86_64 - -o %tweak.o
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --start-lib %tweak.o --end-lib %t1.o %t2.o -o /dev/null
|
|
|
|
## Check common symbols. A common sym might later be replaced by a non-common definition.
|
|
# RUN: echo '.comm obj, 4' | llvm-mc -filetype=obj -triple=x86_64 -o %tcomm.o
|
|
# RUN: echo '.type obj,@object; .data; .globl obj; .p2align 2; obj: .long 55; .size obj, 4' | llvm-mc -filetype=obj -triple=x86_64 -o %tstrong.o
|
|
# RUN: echo '.globl foo; foo: movl obj(%rip), %eax' | llvm-mc -triple=x86_64 -filetype=obj -o %t5.o
|
|
# RUN: llvm-ar rcs %tcomm.a %tcomm.o
|
|
# RUN: llvm-ar rcs %tstrong.a %tstrong.o
|
|
# RUN: ld.lld --warn-backrefs %tcomm.a %t1.o %t5.o 2>&1 -o /dev/null | FileCheck --check-prefix=COMM %s
|
|
# RUN: ld.lld --fatal-warnings --fortran-common --warn-backrefs %tcomm.a %t1.o %t5.o %tstrong.a 2>&1 -o /dev/null
|
|
# RUN: ld.lld --warn-backrefs --no-fortran-common %tcomm.a %t1.o %t5.o %tstrong.a 2>&1 -o /dev/null | FileCheck --check-prefix=COMM %s
|
|
|
|
# COMM: ld.lld: warning: backward reference detected: obj in {{.*}}5.o refers to {{.*}}comm.a
|
|
|
|
## If a lazy definition appears after the backward reference, don't warn.
|
|
## A traditional Unix linker will resolve the reference to the later definition.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t2.a %t1.o %t2.a -o /dev/null
|
|
|
|
## lld fetches the archive while GNU ld resolves the reference to the shared definition.
|
|
## Warn because the resolution rules are different.
|
|
# RUN: ld.lld --warn-backrefs %t2.a %t1.o %t2.so -o /dev/null 2>&1 | FileCheck %s
|
|
|
|
## This is a limitation. The resolution rules are different but
|
|
## --warn-backrefs does not warn.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs %t2.a %t1.o %t2.so %t2.a -o /dev/null
|
|
|
|
## In GNU linkers, -u does not make a backward reference.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs -u foo %t2.a %t1.o -o /dev/null
|
|
|
|
## -u does not make a backward reference.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs -u foo %t2.a %t1.o -o /dev/null
|
|
|
|
## --defsym does not make a backward reference, but it does not suppress the warning due to another file.
|
|
# RUN: ld.lld --fatal-warnings --warn-backrefs --defsym=x=foo -e 0 %t2.a -o /dev/null
|
|
# RUN: ld.lld --warn-backrefs --defsym=x=foo %t2.a %t1.o -o /dev/null 2>&1 | FileCheck %s
|
|
|
|
# RUN: not ld.lld --warn-backrefs-exclude='[' 2>&1 | FileCheck --check-prefix=INVALID %s
|
|
# INVALID: error: --warn-backrefs-exclude: invalid glob pattern, unmatched '[': [
|
|
|
|
.globl _start, foo
|
|
_start:
|
|
call foo
|