diff --git a/scripts/test.py b/scripts/test.py index 0ea155b..890300b 100755 --- a/scripts/test.py +++ b/scripts/test.py @@ -26,6 +26,7 @@ "./examples/lots_of_variables.c": [], "./examples/inp_arg_macro.c": [], "./examples/inp_extern.c": [], + "./examples/inp_vararg.c": [], } C_PROGRAM_NAME = "./30cc" OUTPUT_FOLDER = "tests/output" diff --git a/tests/output/inp_vararg.c_asm_output.asm b/tests/output/inp_vararg.c_asm_output.asm index 7faf1d6..f5f72f9 100644 --- a/tests/output/inp_vararg.c_asm_output.asm +++ b/tests/output/inp_vararg.c_asm_output.asm @@ -91,7 +91,7 @@ mov [rbp-33], al mov rdi, [rbp-16] mov rsi, [rbp-24] mov rdx, [rbp-32] -mov rcx, [rbp-33] +mov cl, [rbp-33] mov rax, rbp sub rax, 8 mov [rbp-41], rax diff --git a/tests/output/inp_vararg.c_lex_output.txt b/tests/output/inp_vararg.c_lex_output.txt new file mode 100644 index 0000000..8f4b549 --- /dev/null +++ b/tests/output/inp_vararg.c_lex_output.txt @@ -0,0 +1,170 @@ +TKN_VOID +TKN_STAR +TKN_ID(malloc) +TKN_L_PAREN +TKN_INT +TKN_R_PAREN +TKN_SEMICOLON +TKN_VOID +TKN_ID(printf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_SEMICOLON +TKN_VOID +TKN_ID(sprintf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_SEMICOLON +TKN_DIRECTIVE: + TKN_ID(define) + TKN_ID(PUSHARGS) + TKN_L_PAREN + TKN_R_PAREN + TKN_ASM + TKN_L_PAREN + TKN_LIT_STR(push rdi) + TKN_LIT_STR(push rsi) + TKN_LIT_STR(push rdx) + TKN_LIT_STR(push rcx) + TKN_LIT_STR(push r8) + TKN_LIT_STR(push r9) + TKN_R_PAREN + TKN_EOF +TKN_DIRECTIVE: + TKN_ID(define) + TKN_ID(SLARGS) + TKN_L_PAREN + TKN_R_PAREN + TKN_ASM + TKN_L_PAREN + TKN_LIT_STR(mov rdi, rsi) + TKN_LIT_STR(mov rsi, rdx) + TKN_LIT_STR(mov rdx, rcx) + TKN_LIT_STR(mov rcx, r8) + TKN_LIT_STR(mov r8, r9) + TKN_LIT_STR(mov r9, 0) + TKN_R_PAREN + TKN_EOF +TKN_DIRECTIVE: + TKN_ID(define) + TKN_ID(SRARGS) + TKN_L_PAREN + TKN_R_PAREN + TKN_ASM + TKN_L_PAREN + TKN_LIT_STR(mov r9, r8) + TKN_LIT_STR(mov r8, rcx) + TKN_LIT_STR(mov rcx, rdx) + TKN_LIT_STR(mov rdx, rsi) + TKN_LIT_STR(mov rsi, rdi) + TKN_LIT_STR(mov rdi, 0) + TKN_R_PAREN + TKN_EOF +TKN_DIRECTIVE: + TKN_ID(define) + TKN_ID(POPARGS) + TKN_L_PAREN + TKN_R_PAREN + TKN_ASM + TKN_L_PAREN + TKN_LIT_STR(pop r9) + TKN_LIT_STR(pop r8) + TKN_LIT_STR(pop rcx) + TKN_LIT_STR(pop rdx) + TKN_LIT_STR(pop rsi) + TKN_LIT_STR(pop rdi) + TKN_R_PAREN + TKN_EOF +TKN_CHAR +TKN_STAR +TKN_ID(cc_asprintf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_ID(inp) +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_L_BRACE +TKN_ID(SRARGS) +TKN_L_PAREN +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(PUSHARGS) +TKN_L_PAREN +TKN_R_PAREN +TKN_SEMICOLON +TKN_CHAR +TKN_STAR +TKN_ID(ret) +TKN_ASSIGN +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_R_PAREN +TKN_ID(malloc) +TKN_L_PAREN +TKN_LIT_INT(128) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(POPARGS) +TKN_L_PAREN +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(sprintf) +TKN_L_PAREN +TKN_ID(ret) +TKN_COMMA +TKN_ID(inp) +TKN_R_PAREN +TKN_SEMICOLON +TKN_RETURN +TKN_ID(ret) +TKN_SEMICOLON +TKN_R_BRACE +TKN_INT +TKN_ID(main) +TKN_L_PAREN +TKN_R_PAREN +TKN_L_BRACE +TKN_CHAR +TKN_STAR +TKN_ID(ret) +TKN_ASSIGN +TKN_ID(cc_asprintf) +TKN_L_PAREN +TKN_LIT_STR(salam %s %u%c) +TKN_COMMA +TKN_LIT_STR(donya) +TKN_COMMA +TKN_LIT_INT(123) +TKN_COMMA +TKN_LIT_CHAR(!) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(printf) +TKN_L_PAREN +TKN_LIT_STR(%s %s +) +TKN_COMMA +TKN_LIT_STR(haha) +TKN_COMMA +TKN_ID(ret) +TKN_R_PAREN +TKN_SEMICOLON +TKN_RETURN +TKN_LIT_INT(0) +TKN_SEMICOLON +TKN_R_BRACE +TKN_EOF diff --git a/tests/output/inp_vararg.c_prep_output.txt b/tests/output/inp_vararg.c_prep_output.txt new file mode 100644 index 0000000..c455d04 --- /dev/null +++ b/tests/output/inp_vararg.c_prep_output.txt @@ -0,0 +1,128 @@ +TKN_VOID +TKN_STAR +TKN_ID(malloc) +TKN_L_PAREN +TKN_INT +TKN_R_PAREN +TKN_SEMICOLON +TKN_VOID +TKN_ID(printf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_SEMICOLON +TKN_VOID +TKN_ID(sprintf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_CHAR +TKN_STAR +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_SEMICOLON +TKN_CHAR +TKN_STAR +TKN_ID(cc_asprintf) +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_ID(inp) +TKN_COMMA +TKN_DOTS +TKN_R_PAREN +TKN_L_BRACE +TKN_ASM +TKN_L_PAREN +TKN_LIT_STR(mov r9, r8) +TKN_LIT_STR(mov r8, rcx) +TKN_LIT_STR(mov rcx, rdx) +TKN_LIT_STR(mov rdx, rsi) +TKN_LIT_STR(mov rsi, rdi) +TKN_LIT_STR(mov rdi, 0) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ASM +TKN_L_PAREN +TKN_LIT_STR(push rdi) +TKN_LIT_STR(push rsi) +TKN_LIT_STR(push rdx) +TKN_LIT_STR(push rcx) +TKN_LIT_STR(push r8) +TKN_LIT_STR(push r9) +TKN_R_PAREN +TKN_SEMICOLON +TKN_CHAR +TKN_STAR +TKN_ID(ret) +TKN_ASSIGN +TKN_L_PAREN +TKN_CHAR +TKN_STAR +TKN_R_PAREN +TKN_ID(malloc) +TKN_L_PAREN +TKN_LIT_INT(128) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ASM +TKN_L_PAREN +TKN_LIT_STR(pop r9) +TKN_LIT_STR(pop r8) +TKN_LIT_STR(pop rcx) +TKN_LIT_STR(pop rdx) +TKN_LIT_STR(pop rsi) +TKN_LIT_STR(pop rdi) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(sprintf) +TKN_L_PAREN +TKN_ID(ret) +TKN_COMMA +TKN_ID(inp) +TKN_R_PAREN +TKN_SEMICOLON +TKN_RETURN +TKN_ID(ret) +TKN_SEMICOLON +TKN_R_BRACE +TKN_INT +TKN_ID(main) +TKN_L_PAREN +TKN_R_PAREN +TKN_L_BRACE +TKN_CHAR +TKN_STAR +TKN_ID(ret) +TKN_ASSIGN +TKN_ID(cc_asprintf) +TKN_L_PAREN +TKN_LIT_STR(salam %s %u%c) +TKN_COMMA +TKN_LIT_STR(donya) +TKN_COMMA +TKN_LIT_INT(123) +TKN_COMMA +TKN_LIT_CHAR(!) +TKN_R_PAREN +TKN_SEMICOLON +TKN_ID(printf) +TKN_L_PAREN +TKN_LIT_STR(%s %s +) +TKN_COMMA +TKN_LIT_STR(haha) +TKN_COMMA +TKN_ID(ret) +TKN_R_PAREN +TKN_SEMICOLON +TKN_RETURN +TKN_LIT_INT(0) +TKN_SEMICOLON +TKN_R_BRACE +TKN_EOF diff --git a/tests/output/inp_vararg.c_run_output.txt b/tests/output/inp_vararg.c_run_output.txt new file mode 100644 index 0000000..a4f3a7d --- /dev/null +++ b/tests/output/inp_vararg.c_run_output.txt @@ -0,0 +1,3 @@ +./out "" +------------- +haha salam donya 123! diff --git a/tests/output/inp_vararg.c_tree_output.txt b/tests/output/inp_vararg.c_tree_output.txt new file mode 100644 index 0000000..6ad9c35 --- /dev/null +++ b/tests/output/inp_vararg.c_tree_output.txt @@ -0,0 +1,110 @@ +Program( + FunctionDecl( + Name: + malloc + Returns: + Type(Name: (null)): + Pointer of: + TKN_VOID + Params: + Type(Name: (null)): + TKN_INT + ) + FunctionDecl( + Name: + printf + Returns: + Type(Name: (null)): + TKN_VOID + Params: + Type(Name: (null)): + Pointer of: + TKN_CHAR + ) + FunctionDecl( + Name: + sprintf + Returns: + Type(Name: (null)): + TKN_VOID + Params: + Type(Name: (null)): + Pointer of: + TKN_CHAR + Type(Name: (null)): + Pointer of: + TKN_CHAR + ) + Function( + Name: + cc_asprintf + Returns: + Type(Name: (null)): + Pointer of: + TKN_CHAR + Params: + Type(Name: inp): + Pointer of: + TKN_CHAR + Statements: + Asm: + "mov r9, r8" "mov r8, rcx" "mov rcx, rdx" "mov rdx, rsi" "mov rsi, rdi" "mov rdi, 0" Asm: + "push rdi" "push rsi" "push rdx" "push rcx" "push r8" "push r9" VarDecl(ret): + Type(Name: ret): + Pointer of: + TKN_CHAR + Value: + Cast: + Val: + FunctionCall: + Function: + Variable(malloc) + Args: + Literal(Type: 34, Value: 128) + Type: + Type(Name: (null)): + Pointer of: + TKN_CHAR + Asm: + "pop r9" "pop r8" "pop rcx" "pop rdx" "pop rsi" "pop rdi" FunctionCall: + Function: + Variable(sprintf) + Args: + Variable(ret) + Variable(inp) + Return: + Variable(ret) + ) + Function( + Name: + main + Returns: + Type(Name: (null)): + TKN_INT + Params: + Statements: + VarDecl(ret): + Type(Name: ret): + Pointer of: + TKN_CHAR + Value: + FunctionCall: + Function: + Variable(cc_asprintf) + Args: + Literal(Type: 33, Value: salam %s %u%c) + Literal(Type: 33, Value: donya) + Literal(Type: 34, Value: 123) + Literal(Type: 35) + FunctionCall: + Function: + Variable(printf) + Args: + Literal(Type: 33, Value: %s %s +) + Literal(Type: 33, Value: haha) + Variable(ret) + Return: + Literal(Type: 34, Value: 0) + ) +)