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).
97 lines
3.8 KiB
LLVM
97 lines
3.8 KiB
LLVM
; REQUIRES: x86
|
|
; RUN: rm -rf %t; split-file %s %t
|
|
|
|
;; Split-LTO bitcode files can have the same symbol (typeinfo) twice in the
|
|
;; symbol table: First undefined in the main file, then defined in the index
|
|
;; file.
|
|
;; When used in --start-lib / --end-lib, ld64.lld creates lazy symbols
|
|
;; for all non-undefined symbols in the bitcode file.
|
|
;; In vtable.o below, the typeinfo __ZTI1S is present once as undefined and
|
|
;; once as defined. The defined version is added as a added as a LazyObject
|
|
;; symbol.
|
|
;; When vtable.o gets loaded due to the __ZN1SC1Ev ref from vtable_use.o,
|
|
;; the first __ZTI1S (undefined) used to cause vtable.o to be extracted
|
|
;; a second time, which used to cause an assert.
|
|
;; See PR59162 for details.
|
|
|
|
; RUN: opt --thinlto-bc --thinlto-split-lto-unit -o %t/vtable.o %t/vtable.ll
|
|
; RUN: opt --thinlto-bc --thinlto-split-lto-unit -o %t/vtable_use.o %t/vtable_use.ll
|
|
|
|
; RUN: %lld -lc++ --start-lib %t/vtable.o --end-lib %t/vtable_use.o -o /dev/null
|
|
|
|
;; Bitcode files created by:
|
|
; % cat vtable.cc
|
|
; struct S {
|
|
; S();
|
|
; virtual void f();
|
|
; };
|
|
; S::S() {}
|
|
; void S::f() {}
|
|
|
|
; % cat vtable_use.cc
|
|
; struct S {
|
|
; S();
|
|
; virtual void f();
|
|
; };
|
|
; int main() { S s; }
|
|
|
|
; % clang -c vtable_use.cc vtable.cc -emit-llvm -S -fno-exceptions -arch x86_64 -mmacos-version-min=11 -O1
|
|
|
|
; ...and then manually adding `, !type !8, type !9` based on `clang -S -emit-llvm -flto=thin` output,
|
|
; because splitAndWriteThinLTOBitcode() in ThinLTOBitcodeWriter.cpp only splits bitcode
|
|
; if type annotations are present. While at it, also removed unnecessary metadata.
|
|
; (NB: The first comment creates vtable.ll while the latter generates vtable.s! vtable.s
|
|
; contains a few things opt complains about, so we can't use the output of that directly.)
|
|
|
|
;--- vtable.ll
|
|
; ModuleID = 'vtable.cc'
|
|
source_filename = "vtable.cc"
|
|
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-apple-macosx11.0.0"
|
|
|
|
@_ZTV1S = unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr @_ZTI1S, ptr @_ZN1S1fEv] }, align 8
|
|
@_ZTVN10__cxxabiv117__class_type_infoE = external global ptr
|
|
@_ZTS1S = constant [3 x i8] c"1S\00", align 1
|
|
@_ZTI1S = constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS1S }, align 8, !type !0, !type !1
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind ssp willreturn memory(argmem: write) uwtable
|
|
define void @_ZN1SC2Ev(ptr nocapture noundef nonnull writeonly align 8 dereferenceable(8) %this) unnamed_addr align 2 {
|
|
entry:
|
|
store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTV1S, i64 0, i32 0, i64 2), ptr %this, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind ssp willreturn memory(argmem: write) uwtable
|
|
define void @_ZN1SC1Ev(ptr nocapture noundef nonnull writeonly align 8 dereferenceable(8) %this) unnamed_addr align 2 {
|
|
entry:
|
|
store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTV1S, i64 0, i32 0, i64 2), ptr %this, align 8
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: mustprogress nofree norecurse nosync nounwind ssp willreturn memory(none) uwtable
|
|
define void @_ZN1S1fEv(ptr nocapture nonnull align 8 %this) unnamed_addr align 2 {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
!0 = !{i64 16, !"_ZTS1S"}
|
|
!1 = !{i64 16, !"_ZTSM1SFvvE.virtual"}
|
|
|
|
;--- vtable_use.ll
|
|
; ModuleID = 'vtable_use.cc'
|
|
source_filename = "vtable_use.cc"
|
|
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-apple-macosx11.0.0"
|
|
|
|
%struct.S = type { ptr }
|
|
|
|
; Function Attrs: mustprogress noinline norecurse nounwind optnone ssp uwtable
|
|
define noundef i32 @main() {
|
|
entry:
|
|
%s = alloca %struct.S, align 8
|
|
call void @_ZN1SC1Ev(ptr noundef nonnull align 8 dereferenceable(8) %s)
|
|
ret i32 0
|
|
}
|
|
|
|
declare void @_ZN1SC1Ev(ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr
|