Skip to content

Commit dc6bf28

Browse files
committed
[CN-Test-Gen] Control backtracks from size splits
1 parent eb595be commit dc6bf28

File tree

9 files changed

+54
-2
lines changed

9 files changed

+54
-2
lines changed

backend/cn/bin/main.ml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ let run_tests
450450
allowed_depth_failures
451451
max_generator_size
452452
random_size_splits
453+
allowed_size_split_backtracks
453454
sized_null
454455
coverage
455456
disable_passes
@@ -520,6 +521,7 @@ let run_tests
520521
allowed_depth_failures;
521522
max_generator_size;
522523
random_size_splits;
524+
allowed_size_split_backtracks;
523525
sized_null;
524526
coverage;
525527
disable_passes
@@ -1007,6 +1009,17 @@ module Testing_flags = struct
10071009
Arg.(value & flag & info [ "random-size-splits" ] ~doc)
10081010

10091011

1012+
let allowed_size_split_backtracks =
1013+
let doc =
1014+
"Set the maximum attempts to split up a generator's size (between recursive calls) \
1015+
before backtracking further, during input generation"
1016+
in
1017+
Arg.(
1018+
value
1019+
& opt (some int) TestGeneration.default_cfg.allowed_size_split_backtracks
1020+
& info [ "allowed-size-split-backtracks" ] ~doc)
1021+
1022+
10101023
let sized_null =
10111024
let doc =
10121025
"Scale the likelihood of [NULL] proportionally for a desired size (1/n for size n)"
@@ -1070,6 +1083,7 @@ let testing_cmd =
10701083
$ Testing_flags.allowed_depth_failures
10711084
$ Testing_flags.max_generator_size
10721085
$ Testing_flags.random_size_splits
1086+
$ Testing_flags.allowed_size_split_backtracks
10731087
$ Testing_flags.sized_null
10741088
$ Testing_flags.coverage
10751089
$ Testing_flags.disable_passes

backend/cn/lib/testGeneration/specTests.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,13 @@ let compile_script ~(output_dir : string) ~(test_file : string) : Pp.document =
475475
|> Option.map (fun allowed_depth_failures ->
476476
[ "--allowed-depth-failures"; string_of_int allowed_depth_failures ])
477477
|> Option.to_list
478+
|> List.flatten)
479+
@ (Config.has_allowed_size_split_backtracks ()
480+
|> Option.map (fun allowed_size_split_backtracks ->
481+
[ "--allowed-size-split-backtracks";
482+
string_of_int allowed_size_split_backtracks
483+
])
484+
|> Option.to_list
478485
|> List.flatten))
479486
in
480487
cmd

backend/cn/lib/testGeneration/testGenConfig.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type t =
1515
allowed_depth_failures : int option;
1616
max_generator_size : int option;
1717
random_size_splits : bool;
18+
allowed_size_split_backtracks : int option;
1819
sized_null : bool;
1920
coverage : bool;
2021
disable_passes : string list
@@ -35,6 +36,7 @@ let default =
3536
allowed_depth_failures = None;
3637
max_generator_size = None;
3738
random_size_splits = false;
39+
allowed_size_split_backtracks = None;
3840
sized_null = false;
3941
coverage = false;
4042
disable_passes = []
@@ -73,6 +75,8 @@ let has_max_generator_size () = !instance.max_generator_size
7375

7476
let is_random_size_splits () = !instance.random_size_splits
7577

78+
let has_allowed_size_split_backtracks () = !instance.allowed_size_split_backtracks
79+
7680
let is_sized_null () = !instance.sized_null
7781

7882
let is_coverage () = !instance.coverage

backend/cn/lib/testGeneration/testGenConfig.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type t =
1515
allowed_depth_failures : int option;
1616
max_generator_size : int option;
1717
random_size_splits : bool;
18+
allowed_size_split_backtracks : int option;
1819
sized_null : bool;
1920
coverage : bool;
2021
disable_passes : string list
@@ -52,6 +53,8 @@ val has_max_generator_size : unit -> int option
5253

5354
val is_random_size_splits : unit -> bool
5455

56+
val has_allowed_size_split_backtracks : unit -> int option
57+
5558
val is_sized_null : unit -> bool
5659

5760
val is_coverage : unit -> bool

runtime/libcn/include/cn-testing/dsl.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@
240240
urn_free(tmp##_urn); \
241241

242242
#define CN_GEN_SPLIT_BEGIN(tmp, size, ...) \
243+
int tmp##_backtracks = cn_gen_get_size_split_backtracks_allowed(); \
243244
alloc_checkpoint tmp##_checkpoint = alloc_save_checkpoint(); \
244245
void *tmp##_alloc_checkpoint = cn_gen_alloc_save(); \
245246
void *tmp##_ownership_checkpoint = cn_gen_ownership_save(); \
@@ -254,7 +255,7 @@
254255
#define CN_GEN_SPLIT_END(ty, tmp, size, last_var, ...) \
255256
if (count >= size) { \
256257
cn_gen_backtrack_depth_exceeded(); \
257-
char* toAdd[] = { __VA_ARGS__, NULL }; \
258+
char* toAdd[] = { __VA_ARGS__ }; \
258259
cn_gen_backtrack_relevant_add_many(toAdd); \
259260
goto cn_label_##last_var##_backtrack; \
260261
} \
@@ -275,6 +276,12 @@
275276
cn_gen_alloc_restore(tmp##_alloc_checkpoint); \
276277
cn_gen_ownership_restore(tmp##_ownership_checkpoint); \
277278
if (cn_gen_backtrack_relevant_contains(#tmp)) { \
279+
char* toAdd[] = { __VA_ARGS__ }; \
280+
cn_gen_backtrack_relevant_add_many(toAdd); \
281+
if (tmp##_backtracks <= 0) { \
282+
goto cn_label_##last_var##_backtrack; \
283+
} \
284+
tmp##_backtracks--; \
278285
cn_gen_backtrack_reset(); \
279286
goto cn_label_##tmp##_gen; \
280287
} else { \

runtime/libcn/include/cn-testing/size.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@ void cn_gen_decrement_depth();
1515

1616
void cn_gen_set_depth_failures_allowed(uint16_t allowed);
1717
uint16_t cn_gen_get_depth_failures_allowed();
18+
19+
void cn_gen_set_size_split_backtracks_allowed(uint16_t allowed);
20+
uint16_t cn_gen_get_size_split_backtracks_allowed();

runtime/libcn/src/cn-testing/size.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,13 @@ void cn_gen_set_depth_failures_allowed(uint16_t allowed) {
5252
uint16_t cn_gen_get_depth_failures_allowed() {
5353
return depth_failures_allowed;
5454
}
55+
56+
static uint16_t size_split_backtracks_allowed = 0;
57+
58+
void cn_gen_set_size_split_backtracks_allowed(uint16_t allowed) {
59+
size_split_backtracks_allowed = allowed;
60+
}
61+
62+
uint16_t cn_gen_get_size_split_backtracks_allowed() {
63+
return size_split_backtracks_allowed;
64+
}

runtime/libcn/src/cn-testing/test.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ int cn_test_main(int argc, char* argv[]) {
105105
cn_gen_set_depth_failures_allowed(strtoul(argv[i + 1], NULL, 10));
106106
i++;
107107
}
108+
else if (strcmp("--allowed-size-split-backtracks", arg) == 0) {
109+
cn_gen_set_size_split_backtracks_allowed(strtoul(argv[i + 1], NULL, 10));
110+
i++;
111+
}
108112
}
109113

110114
if (interactive) {

tests/run-cn-test-gen.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function separator() {
2727
printf '\n\n'
2828
}
2929

30-
CONFIGS=("--coverage" "--sized-null" "--random-size-splits")
30+
CONFIGS=("--coverage" "--sized-null" "--random-size-splits" "--random-size-splits --allowed-size-split-backtracks=10")
3131

3232
# For each configuration
3333
for CONFIG in ${CONFIGS[@]}; do

0 commit comments

Comments
 (0)