> compile NEMU
ysyx_22040000 李心杨 Linux calcite 6.1.69 #1-NixOS SMP PREEMPT_DYNAMIC Wed Dec 20 16:00:29 UTC 2023 x86_64 GNU/Linux 10:08:10 up 1 day 10:24, 2 users, load average: 0.92, 0.71, 0.58
This commit is contained in:
parent
d20ea706e8
commit
bbdc49b229
1 changed files with 104 additions and 63 deletions
|
@ -1,27 +1,26 @@
|
|||
#include "sys/types.h"
|
||||
#include "unistd.h"
|
||||
#include <check.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <addrexp.h>
|
||||
#include <addrexp_lex.h>
|
||||
#include <assert.h>
|
||||
#include <check.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
char buf[65536] = {}, ref_buf[65536] = {};
|
||||
static char code_buf[65536 + 128] = {}; // a little larger than `buf`
|
||||
const int buf_start_pos = 0;
|
||||
char *buf_ptr = buf + buf_start_pos, *ref_buf_ptr = ref_buf;
|
||||
static char *code_format =
|
||||
"#include <stdio.h>\n"
|
||||
"#include <stdint.h>\n"
|
||||
"int main() { "
|
||||
" uint32_t result = %s; "
|
||||
" printf(\"%%u\", result); "
|
||||
" return 0; "
|
||||
"}";
|
||||
|
||||
static char *code_format = "#include <stdio.h>\n"
|
||||
"#include <stdint.h>\n"
|
||||
"int main() { "
|
||||
" uint32_t result = %s; "
|
||||
" printf(\"%%u\", result); "
|
||||
" return 0; "
|
||||
"}";
|
||||
|
||||
void gen(char c) {
|
||||
*(buf_ptr++) = c;
|
||||
|
@ -31,7 +30,7 @@ void gen(char c) {
|
|||
void gen_num(void) {
|
||||
uint32_t num = rand();
|
||||
int len = 0, ref_len = 0;
|
||||
switch(rand() % 3) {
|
||||
switch (rand() % 3) {
|
||||
case 0:
|
||||
len = snprintf(buf_ptr, 100, "%u", num);
|
||||
ref_len = snprintf(ref_buf_ptr, 100, "%uU", num);
|
||||
|
@ -44,18 +43,27 @@ void gen_num(void) {
|
|||
len = snprintf(buf_ptr, 100, "%d", num);
|
||||
ref_len = snprintf(ref_buf_ptr, 100, "%d", num);
|
||||
break;
|
||||
default: assert(0);
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
buf_ptr += len;
|
||||
ref_buf_ptr += ref_len;
|
||||
}
|
||||
|
||||
void gen_rand_op(void) {
|
||||
switch(rand() % 4) {
|
||||
case 0: gen('+'); break;
|
||||
case 1: gen('-'); break;
|
||||
case 2: gen('*'); break;
|
||||
case 3: gen('/'); break;
|
||||
switch (rand() % 4) {
|
||||
case 0:
|
||||
gen('+');
|
||||
break;
|
||||
case 1:
|
||||
gen('-');
|
||||
break;
|
||||
case 2:
|
||||
gen('*');
|
||||
break;
|
||||
case 3:
|
||||
gen('/');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,9 +73,21 @@ void gen_rand_expr(void) {
|
|||
choice = 0;
|
||||
}
|
||||
switch (choice) {
|
||||
case 0: gen_num(); break;
|
||||
case 1: gen('('); gen_rand_expr(); gen(')'); break;
|
||||
default: gen_rand_expr(); gen(' '); gen_rand_op(); gen(' '); gen_rand_expr(); break;
|
||||
case 0:
|
||||
gen_num();
|
||||
break;
|
||||
case 1:
|
||||
gen('(');
|
||||
gen_rand_expr();
|
||||
gen(')');
|
||||
break;
|
||||
default:
|
||||
gen_rand_expr();
|
||||
gen(' ');
|
||||
gen_rand_op();
|
||||
gen(' ');
|
||||
gen_rand_expr();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,8 +102,9 @@ START_TEST(test_expr_random_100) {
|
|||
fputs(code_buf, fp);
|
||||
fclose(fp);
|
||||
|
||||
int ret = system("gcc /tmp/.code.c -Werror=div-by-zero -o /tmp/.expr 2>/dev/null");
|
||||
if(ret == 256) {
|
||||
int ret =
|
||||
system("gcc /tmp/.code.c -Werror=div-by-zero -o /tmp/.expr 2>/dev/null");
|
||||
if (ret == 256) {
|
||||
// Probably devide by zero. Skip
|
||||
goto clean_up;
|
||||
}
|
||||
|
@ -96,27 +117,46 @@ START_TEST(test_expr_random_100) {
|
|||
ret = fscanf(fp, "%u", &reference);
|
||||
ck_assert(ret == 1);
|
||||
pclose(fp);
|
||||
// fprintf(stderr, "\n\tbuf = %s\n\taddr = %u, reference = %u", buf, addr, reference);
|
||||
// fprintf(stderr, "\n\tbuf = %s\n\taddr = %u, reference = %u", buf, addr,
|
||||
// reference);
|
||||
|
||||
yy_scan_string(buf + buf_start_pos);
|
||||
uint32_t addr;
|
||||
ck_assert(!yyparse(&addr));
|
||||
yylex_destroy();
|
||||
|
||||
ck_assert_msg(addr == reference, "\n\tbuf = %s\n\taddr = %u, reference = %u\n", buf, addr, reference);
|
||||
ck_assert_msg(addr == reference,
|
||||
"\n\tbuf = %s\n\t(addr = %u) != (reference = %u)\n", buf, addr,
|
||||
reference);
|
||||
|
||||
clean_up:
|
||||
while(buf_ptr != buf + buf_start_pos) {
|
||||
while (buf_ptr != buf + buf_start_pos) {
|
||||
*(--buf_ptr) = '\0';
|
||||
}
|
||||
while(ref_buf_ptr != ref_buf) {
|
||||
while (ref_buf_ptr != ref_buf) {
|
||||
*(--ref_buf_ptr) = '\0';
|
||||
}
|
||||
} END_TEST
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_test2) {
|
||||
;
|
||||
} END_TEST
|
||||
struct {
|
||||
const char *expr;
|
||||
uint32_t reference;
|
||||
} exprs[] = {
|
||||
{"-1", 0xFFFFFFFFU},
|
||||
{"--1", 0x1},
|
||||
};
|
||||
START_TEST(test_expr_negative_operand) {
|
||||
yy_scan_string(exprs[_i].expr);
|
||||
uint32_t addr;
|
||||
ck_assert(!yyparse(&addr));
|
||||
yylex_destroy();
|
||||
|
||||
ck_assert_msg(addr == exprs[_i].reference,
|
||||
"\n\texpr = %s\n\t(addr = %u) != (reference = %u)\n", exprs[_i].expr,
|
||||
addr, exprs[_i].reference);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
Suite *expr_suite(void) {
|
||||
Suite *s;
|
||||
|
@ -126,7 +166,8 @@ Suite *expr_suite(void) {
|
|||
tc_core = tcase_create("Core");
|
||||
|
||||
tcase_add_loop_test(tc_core, test_expr_random_100, 0, 100);
|
||||
tcase_add_test(tc_core, test_test2);
|
||||
tcase_add_loop_test(tc_core, test_expr_negative_operand, 0,
|
||||
sizeof(exprs) / sizeof(exprs[0]));
|
||||
suite_add_tcase(s, tc_core);
|
||||
|
||||
return s;
|
||||
|
|
Loading…
Reference in a new issue