From 94a24aeb60607978c353917af7238180008f0d5b Mon Sep 17 00:00:00 2001 From: hyl <563807243@qq.com> Date: Fri, 27 Aug 2021 10:47:00 +0800 Subject: [PATCH 1/3] add builtin cg --- compiler/codegen.c | 72 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/compiler/codegen.c b/compiler/codegen.c index f399e2a..363e12c 100644 --- a/compiler/codegen.c +++ b/compiler/codegen.c @@ -1,6 +1,7 @@ #include "summoner.h" #include #include +#include "error.h" #include "../include/SVM_code.h" extern OpcodeInfo svm_opcode_info[]; @@ -126,6 +127,60 @@ add_global_variable(Compiler *compiler, SVM_Executable *exe) } // TODO: derive type: FUNCTION_DERIVE/ARRAY_DERIVE } +static void +generate_builtin_code(OpcodeBuf *ob, const char *ops) +{ + + if(!strcmp("sha3", ops)) { + ob->code[ob->size] = OP_SHA3; + ob->size++; + } else if(!strcmp("sha256", ops)) { + ob->code[ob->size] = OP_SHA256; + ob->size++; + } else if(!strcmp("abs", ops)) { + ob->code[ob->size] = OP_ABS; + ob->size++; + } else if(!strcmp("min", ops)) { + ob->code[ob->size] = OP_MIN; + ob->size++; + } else if(!strcmp("max", ops)) { + ob->code[ob->size] = OP_MAX; + ob->size++; + } else if(!strcmp("check_tx_sig", ops)) { + ob->code[ob->size] = OP_TXSIGHASH; + ob->size++; + + ob->code[ob->size] = OP_SWAP; + ob->size++; + + ob->code[ob->size] = OP_CHECKSIG; + ob->size++; + } else if(!strcmp("check_msg_sig", ops)) { + ob->code[ob->size] = OP_CHECKSIG; + ob->size++; + } else if(!strcmp("below", ops)) { + ob->code[ob->size] = OP_BLOCKHEIGHT; + ob->size++; + + ob->code[ob->size] = OP_GREATERTHAN; + ob->size++; + } else if(!strcmp("above", ops)) { + ob->code[ob->size] = OP_BLOCKHEIGHT; + ob->size++; + + ob->code[ob->size] = OP_LESSTHAN; + ob->size++; + } else if(!strcmp("lock", ops)) { + ob->code[ob->size] = OP_CHECKOUTPUT; + ob->size++; + + ob->code[ob->size] = OP_VERIFY; + ob->size++; + } else if(!strcmp("verify", ops)) { + ob->code[ob->size] = OP_VERIFY; + ob->size++; + } +} static void generate_code(OpcodeBuf *ob, SVM_Opcode code, ...) @@ -331,6 +386,7 @@ generate_initializer(SVM_Executable *exe, Block *current_block, Declaration *decl_stmt, OpcodeBuf *ob) { + generate_pop_to_identifier(decl_stmt, ob); } static void @@ -385,6 +441,9 @@ generate_identifier_expression(SVM_Executable *exe, Block *block, break; case STRUCT_DEFINITION: break; + case IDENTIFIER_EXPRESSION: + generate_pop_to_lvalue(exe, block, expr, ob); + break; default: printf("bad default. kind..%d", expr->kind); exit(1); @@ -409,8 +468,17 @@ generate_function_call_expression(SVM_Executable *exe, Block *block, FuncCallExpression *fce = expr->u.func_call_expression; generate_push_argument(exe, block, fce->argument_list, ob); generate_expression(exe, block, fce->argument_list->expr, ob); - // which op for func call? - // generate_code(ob, code); + + BuiltinFun *builtin_fun = expr->u.func_call_expression + ->function->u.identifier->u.builtin_func; + if (builtin_fun == NULL) { + compile_error(expr->line_number, + FUNCTION_NOT_FOUND_ERR, + STRING_MESSAGE_ARGUMENT, "name", + expr->u.identifier->name, + MESSAGE_ARGUMENT_END); + } + generate_builtin_code(ob, builtin_fun->name); } static void From 16e82ed46c53e1856cf9cd6949bb211fbbd1bfeb Mon Sep 17 00:00:00 2001 From: hyl <563807243@qq.com> Date: Fri, 27 Aug 2021 11:31:29 +0800 Subject: [PATCH 2/3] fix builtin ops array --- builtin/builtin.c | 35 ++++++++++++++++++++--------- compiler/codegen.c | 54 ++++----------------------------------------- compiler/summoner.h | 4 +++- 3 files changed, 31 insertions(+), 62 deletions(-) diff --git a/builtin/builtin.c b/builtin/builtin.c index 2e66ffb..b0cb579 100644 --- a/builtin/builtin.c +++ b/builtin/builtin.c @@ -1,5 +1,6 @@ #include #include "../include/share.h" +#include "../include/SVM_code.h" #include "../compiler/summoner.h" static BasicType sha3_params[] = {HEX_TYPE}; @@ -14,18 +15,30 @@ static BasicType above_params[] = {INT_TYPE, BOOLEAN_TYPE}; static BasicType lock_params[] = {AMOUNT_TYPE, ASSET_TYPE, HEX_TYPE, HEX_TYPE}; static BasicType verify_params[] = {BOOLEAN_TYPE}; +static SVM_Opcode sha3_ops[] = {OP_SHA3}; +static SVM_Opcode sha256_ops[] = {OP_SHA256}; +static SVM_Opcode abs_ops[] = {OP_ABS}; +static SVM_Opcode min_ops[] = {OP_MIN}; +static SVM_Opcode max_ops[] = {OP_MAX}; +static SVM_Opcode check_tx_sig_ops[] = {OP_TXSIGHASH, OP_SWAP, OP_CHECKSIG}; +static SVM_Opcode check_msg_sig_ops[] = {OP_CHECKSIG}; +static SVM_Opcode below_ops[] = {OP_BLOCKHEIGHT, OP_GREATERTHAN}; +static SVM_Opcode above_ops[] = {OP_BLOCKHEIGHT, OP_LESSTHAN}; +static SVM_Opcode lock_ops[] = {OP_CHECKOUTPUT, OP_VERIFY}; +static SVM_Opcode verify_ops[] = {OP_VERIFY}; + BuiltinFun builtin_func_list[] = { - {"sha3", sha3_params, ARRAY_SIZE(sha3_params), HASH_TYPE, "SHA3"}, - {"sha256", sha256_params, ARRAY_SIZE(sha256_params), HASH_TYPE, "SHA256"}, - {"abs", abs_params, ARRAY_SIZE(abs_params), INT_TYPE, "ABS"}, - {"min", min_params, ARRAY_SIZE(min_params), INT_TYPE, "MIN"}, - {"max", max_params, ARRAY_SIZE(max_params), INT_TYPE, "MAX"}, - {"check_tx_sig", check_tx_sig_params, ARRAY_SIZE(check_tx_sig_params), BOOLEAN_TYPE, "TXSIGHASH SWAP CHECKSIG"}, - {"check_msg_sig", check_msg_sig_params, ARRAY_SIZE(check_msg_sig_params), BOOLEAN_TYPE, "CHECKSIG"}, - {"below", below_params, ARRAY_SIZE(below_params), BOOLEAN_TYPE, "BLOCKHEIGHT GREATERTHAN"}, - {"above", above_params, ARRAY_SIZE(above_params), BOOLEAN_TYPE, "BLOCKHEIGHT LESSTHAN"}, - {"lock", lock_params, ARRAY_SIZE(lock_params), VOID_TYPE, ""}, - {"verify", verify_params, ARRAY_SIZE(verify_params), VOID_TYPE, "VERIFY"}, + {"sha3", sha3_params, ARRAY_SIZE(sha3_params), HASH_TYPE, sha3_ops, ARRAY_SIZE(sha3_ops)}, + {"sha256", sha256_params, ARRAY_SIZE(sha256_params), HASH_TYPE, sha256_ops, ARRAY_SIZE(sha256_ops)}, + {"abs", abs_params, ARRAY_SIZE(abs_params), INT_TYPE, abs_ops, ARRAY_SIZE(abs_ops)}, + {"min", min_params, ARRAY_SIZE(min_params), INT_TYPE, min_ops, ARRAY_SIZE(min_ops)}, + {"max", max_params, ARRAY_SIZE(max_params), INT_TYPE, max_ops, ARRAY_SIZE(max_ops)}, + {"check_tx_sig", check_tx_sig_params, ARRAY_SIZE(check_tx_sig_params), BOOLEAN_TYPE, check_tx_sig_ops, ARRAY_SIZE(check_tx_sig_ops)}, + {"check_msg_sig", check_msg_sig_params, ARRAY_SIZE(check_msg_sig_params), BOOLEAN_TYPE, check_msg_sig_ops, ARRAY_SIZE(check_msg_sig_ops)}, + {"below", below_params, ARRAY_SIZE(below_params), BOOLEAN_TYPE, below_ops, ARRAY_SIZE(below_ops)}, + {"above", above_params, ARRAY_SIZE(above_params), BOOLEAN_TYPE, above_ops, ARRAY_SIZE(above_ops)}, + {"lock", lock_params, ARRAY_SIZE(lock_params), VOID_TYPE, lock_ops, ARRAY_SIZE(lock_ops)}, + {"verify", verify_params, ARRAY_SIZE(verify_params), VOID_TYPE, verify_ops, ARRAY_SIZE(verify_ops)}, }; BuiltinFun *search_builtin_function(char *name) diff --git a/compiler/codegen.c b/compiler/codegen.c index 363e12c..040ed57 100644 --- a/compiler/codegen.c +++ b/compiler/codegen.c @@ -128,56 +128,10 @@ add_global_variable(Compiler *compiler, SVM_Executable *exe) // TODO: derive type: FUNCTION_DERIVE/ARRAY_DERIVE } static void -generate_builtin_code(OpcodeBuf *ob, const char *ops) +generate_builtin_code(OpcodeBuf *ob, SVM_Opcode *ops, int op_cnt) { - - if(!strcmp("sha3", ops)) { - ob->code[ob->size] = OP_SHA3; - ob->size++; - } else if(!strcmp("sha256", ops)) { - ob->code[ob->size] = OP_SHA256; - ob->size++; - } else if(!strcmp("abs", ops)) { - ob->code[ob->size] = OP_ABS; - ob->size++; - } else if(!strcmp("min", ops)) { - ob->code[ob->size] = OP_MIN; - ob->size++; - } else if(!strcmp("max", ops)) { - ob->code[ob->size] = OP_MAX; - ob->size++; - } else if(!strcmp("check_tx_sig", ops)) { - ob->code[ob->size] = OP_TXSIGHASH; - ob->size++; - - ob->code[ob->size] = OP_SWAP; - ob->size++; - - ob->code[ob->size] = OP_CHECKSIG; - ob->size++; - } else if(!strcmp("check_msg_sig", ops)) { - ob->code[ob->size] = OP_CHECKSIG; - ob->size++; - } else if(!strcmp("below", ops)) { - ob->code[ob->size] = OP_BLOCKHEIGHT; - ob->size++; - - ob->code[ob->size] = OP_GREATERTHAN; - ob->size++; - } else if(!strcmp("above", ops)) { - ob->code[ob->size] = OP_BLOCKHEIGHT; - ob->size++; - - ob->code[ob->size] = OP_LESSTHAN; - ob->size++; - } else if(!strcmp("lock", ops)) { - ob->code[ob->size] = OP_CHECKOUTPUT; - ob->size++; - - ob->code[ob->size] = OP_VERIFY; - ob->size++; - } else if(!strcmp("verify", ops)) { - ob->code[ob->size] = OP_VERIFY; + for(int i = 0; i< op_cnt; i++) { + ob->code[ob->size] = ops[i]; ob->size++; } } @@ -478,7 +432,7 @@ generate_function_call_expression(SVM_Executable *exe, Block *block, expr->u.identifier->name, MESSAGE_ARGUMENT_END); } - generate_builtin_code(ob, builtin_fun->name); + generate_builtin_code(ob, builtin_fun->op_codes, builtin_fun->ops_count); } static void diff --git a/compiler/summoner.h b/compiler/summoner.h index 9945ee1..2c0cd89 100644 --- a/compiler/summoner.h +++ b/compiler/summoner.h @@ -3,6 +3,7 @@ #include #include +#include "../include/SVM_code.h" typedef enum { @@ -100,7 +101,8 @@ typedef struct BuiltinFun BasicType *parameters; int parameter_count; BasicType return_type; - const char *op_codes; + SVM_Opcode *op_codes; + int ops_count; } BuiltinFun; typedef struct IdentifierExpression From 7e26a8fe7a632cad9231a8ad5940bcd93dd52bed Mon Sep 17 00:00:00 2001 From: hyl <563807243@qq.com> Date: Fri, 27 Aug 2021 12:44:20 +0800 Subject: [PATCH 3/3] fix comments --- compiler/codegen.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/compiler/codegen.c b/compiler/codegen.c index 040ed57..9c87478 100644 --- a/compiler/codegen.c +++ b/compiler/codegen.c @@ -1,7 +1,6 @@ #include "summoner.h" #include #include -#include "error.h" #include "../include/SVM_code.h" extern OpcodeInfo svm_opcode_info[]; @@ -425,13 +424,6 @@ generate_function_call_expression(SVM_Executable *exe, Block *block, BuiltinFun *builtin_fun = expr->u.func_call_expression ->function->u.identifier->u.builtin_func; - if (builtin_fun == NULL) { - compile_error(expr->line_number, - FUNCTION_NOT_FOUND_ERR, - STRING_MESSAGE_ARGUMENT, "name", - expr->u.identifier->name, - MESSAGE_ARGUMENT_END); - } generate_builtin_code(ob, builtin_fun->op_codes, builtin_fun->ops_count); }