feat(extraction): C deferral round 2 — 8 new preParse passes, linux kernel/+mm/ deferral 58.6%→33.9% (#1353)
Census-driven cut of the top-ranked post-R7a lever. All passes TS-side, C-only (preParseCSource), shared by both arms: - parameterized-annotation whole-blank (__free/__printf/__counted_by/ __bpf_md_ptr…; extends through a stranded field `;`) - type-keyword-arg scanner (kzalloc_obj(struct T), list_entry, multi-line continuations behind nested-paren args; bounded hand scanner, head exclusions + call-vs-declaration guard; blanks trailing stars) - static/extern CAPS-macro declaration lines at any scope; the initialized form is REWRITTEN to its expansion (name/tail keep exact offsets) - va_arg qualified-type blank; GNU named-variadic #define dots-only blank (post-restore); sandwiched notrace-family; C23 auto; multi-line iterator-macro spans (hlist_for_each_entry_rcu + lockdep arg) - word list += cacheline family (2- and 4-underscore spellings) + 10 more census-confirmed annotations Gates: five-repo parity sweeps 0 diffs (git deferral 16.1→12.2%, redis 25.3→24.1%, fmt/protobuf unchanged); linux full-tree both arms 2,049,153 nodes / 6,413,518 edges (+858/+6,585 vs R7a) with byte-identical dumps (10,446,478 lines, sha256 6dd1185b); kernel-arm parse-loop 356→306s at 2c; suite 2517 green under CODEGRAPH_KERNEL_EXPECT=1. Honesty note recorded in the docs: error recovery was already salvaging most SYMBOLS on deferred files — the graph win is relationships + phantom cleanup, and the unreleased CHANGELOG entry was rewritten off the sweep-subset framing. Also records §7a.5: post-R7a 8-core cg1212 re-run 16.4min (was 18.3min); 8c parse sits on the single-writer floor, so the <10min-on-8c gap re-ranks to the per-ref resolution path. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
2d72891b59
commit
b9d0f57a64
@@ -82,3 +82,73 @@ static void spawn_workers(void) {
|
||||
register_handler(cb_a);
|
||||
signal_connect(&cb_b);
|
||||
}
|
||||
|
||||
/* ---- deferral round 2 (the linux-idiom preParse family) --------------------
|
||||
* Every shape below used to drop the WHOLE file into error recovery (and
|
||||
* therefore defer it to wasm). Each now parses via a round-2 blank/rewrite;
|
||||
* this section pins kernel-vs-wasm parity on all of them at once. */
|
||||
|
||||
/* file-scope prefixed declaration macros — whole-line blank */
|
||||
static DEFINE_PER_CPU(struct llist_head, rstat_backlog_list);
|
||||
static DECLARE_WORK(init_free_wq, do_free_init);
|
||||
extern DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
|
||||
|
||||
/* initialized per-cpu declaration — the REWRITE (type + name survive) */
|
||||
static DEFINE_PER_CPU(struct conn, cpuhp_state) = {
|
||||
.fd = 1,
|
||||
};
|
||||
|
||||
/* type-keyword arguments — keyword (and trailing stars) blank */
|
||||
static void type_args(void *head, void *map) {
|
||||
void *opts = kzalloc_obj(struct conn);
|
||||
void *entry = list_first_entry(head,
|
||||
struct conn, fd);
|
||||
void *outer = hlist_entry_safe(rcu_dereference_raw(hlist_next_rcu(head)),
|
||||
struct conn, fd);
|
||||
use_ptr(outer, container_of(map, struct conn, fd));
|
||||
use_ptr(opts, entry);
|
||||
}
|
||||
DEFINE_PER_CPU(struct conn *, ksoftirqd);
|
||||
|
||||
/* parameterized annotations — name+args blank whole */
|
||||
static void cleanup_scope(void) {
|
||||
struct conn *token __free(kfree) = NULL;
|
||||
use_ptr(token, token);
|
||||
}
|
||||
static void __printf(1, 2) log_fmt(const char *fmt, ...);
|
||||
struct flex_tail {
|
||||
int count;
|
||||
int owners[] __counted_by(count);
|
||||
};
|
||||
|
||||
/* sandwiched lowercase annotations + C23 auto */
|
||||
static notrace void tick_do(int x) { use_val(x); }
|
||||
static nokprobe_inline void arm_probe(void) { }
|
||||
static void auto_user(void) {
|
||||
auto hb = shadowed_reader();
|
||||
use_val(hb);
|
||||
}
|
||||
|
||||
/* va_arg with a qualified type argument */
|
||||
static void drain_args(va_list ap) {
|
||||
const char *s = va_arg(ap, const char *);
|
||||
int n = va_arg(ap, int);
|
||||
use_ptr((void *)s, (void *)(long)n);
|
||||
}
|
||||
|
||||
/* multi-line statement-position iterator macro */
|
||||
static void walk_rcu(void *head) {
|
||||
hlist_for_each_entry_rcu(pos, head, hlist,
|
||||
lockdep_is_held(&probe_mutex)) {
|
||||
use_ptr(pos, head);
|
||||
}
|
||||
}
|
||||
|
||||
/* GNU named-variadic define — dots blank, body survives */
|
||||
#define verbose(env, fmt, args...) log_writer(env, fmt, ##args)
|
||||
|
||||
/* block-scope prefixed declaration macro */
|
||||
static void ratelimited_warn(void) {
|
||||
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
|
||||
use_ptr(&ratelimit, 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user