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).
68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
#ifndef UTILS_H
|
|
#define UTILS_H
|
|
|
|
inline void break_optimization(void *arg) {
|
|
__asm__ __volatile__("" : : "r" (arg) : "memory");
|
|
}
|
|
|
|
// Tests will instantiate this class to pad out bit sets to test out the
|
|
// various ways we can represent the bit set (32-bit inline, 64-bit inline,
|
|
// memory). Instantiating this class will trigger the instantiation of I
|
|
// templates with I virtual tables for classes deriving from T, I-2 of which
|
|
// will be of size sizeof(void*) * 5, 1 of which will be of size sizeof(void*)
|
|
// * 3, and 1 of which will be of size sizeof(void*) * 9. (Under the MS ABI
|
|
// each virtual table will be sizeof(void*) bytes smaller). Each category
|
|
// of virtual tables is aligned to a different power of 2, precluding the
|
|
// all-ones optimization. As a result, the bit vector for the base class will
|
|
// need to contain at least I*2 entries to accommodate all the derived virtual
|
|
// tables.
|
|
template <typename T, unsigned I>
|
|
struct Deriver : T {
|
|
Deriver() {
|
|
break_optimization(new Deriver<T, I-1>);
|
|
}
|
|
virtual void f() {}
|
|
virtual void g() {}
|
|
virtual void h() {}
|
|
};
|
|
|
|
template <typename T>
|
|
struct Deriver<T, 0> : T {
|
|
virtual void f() {}
|
|
void g() {}
|
|
};
|
|
|
|
template <typename T>
|
|
struct Deriver<T, 1> : T {
|
|
Deriver() {
|
|
break_optimization(new Deriver<T, 0>);
|
|
}
|
|
virtual void f() {}
|
|
virtual void g() {}
|
|
virtual void h() {}
|
|
virtual void i() {}
|
|
virtual void j() {}
|
|
virtual void k() {}
|
|
virtual void l() {}
|
|
};
|
|
|
|
// Instantiate enough classes to force CFI checks for type T to use bit
|
|
// vectors of size 32 (if B32 defined), 64 (if B64 defined) or >64 (if BM
|
|
// defined).
|
|
template <typename T>
|
|
void create_derivers() {
|
|
#ifdef B32
|
|
break_optimization(new Deriver<T, 10>);
|
|
#endif
|
|
|
|
#ifdef B64
|
|
break_optimization(new Deriver<T, 25>);
|
|
#endif
|
|
|
|
#ifdef BM
|
|
break_optimization(new Deriver<T, 40>);
|
|
#endif
|
|
}
|
|
|
|
#endif
|