static void print_ident(Parser* p, SsaVar* var)
{
+// printf("%ld\n", var->symid);
+// fflush(stdout);
Symbol* s = symbol_getbyid(p, var->symid);
assert(s);
assert(s->name);
}
else if (expr->code == CALL)
{
- print_ident(p, &(SSA_VAR(expr)));
+ printf(" ");
+ if (SSA_TYPE(expr) != &VoidType)
+ {
+ print_ident(p, &(SSA_VAR(expr)));
+ printf(" = ");
+ }
+ printf("call ");
+ emit_type(SSA_TYPE(expr));
+ printf(" ");
+ print_ident(p, &(SSA_LVAR(expr)));
+ printf("(");
+ size_t nargs = expr->right->value.args.nv;
+ SsaNode** args = expr->right->value.args.v;
+ for (size_t i = 0; args && i < nargs; i++)
+ {
+ assert(args[i]);
+ emit_type(SSA_TYPE(args[i]));
+// printf(" ");
+ print_oparg(p, args[i]);
+ if (i+1 < nargs)
+ {
+ printf(", ");
+ }
+ }
+ printf(")");
+ puts("");
+fflush(stdout);
// printf(" ret ");
// emit_type(SSA_TYPE(expr));
#!/bin/sh
-CCCMD="gcc -g -Wall -Wextra -Werror --std=c99 -Iinc/ -fsanitize=undefined"
+CCCMD="clang -g -Wall -Wextra -Werror --std=c99 -Iinc/ -fsanitize=undefined,memory"
TEST_BACKEND=backend/test
# Update tag database and print todos
grep -rh TODO src/*.* backend/*/*.* | sed -E -e 's/ *\/\/ *//' -e 's/ *\/\* *(.*) *\*\//\1/'
# Now build and test it
- $CCCMD -D CERISE_TESTS -o cerisec-test src/*.c backend/test/*.c \
-&& $CCCMD -o cerisec src/*.c "backend/ssa"/*.c \
-&& ./cerisec-test \
-&& (./cerisec tests/Module.m | tee test.l) \
-&& llc test.l
+ $CCCMD -o cerisec src/*.c "backend/ssa"/*.c \
+&& ./cerisec tests/Module.m
+#&& $CCCMD -D CERISE_TESTS -o cerisec-test src/*.c backend/test/*.c \
+#&& ./cerisec-test \
+#&& (./cerisec tests/Module.m | tee test.l) \
+#&& llc test.l
rm -f Module
} args;
} SsaValue;
-//typedef struct SsaNode {
-// struct SsaNode* next;
-// unsigned int code : 25;
-// unsigned int mode : 4;
-// unsigned int loaded : 1;
-// unsigned int lconst : 1;
-// unsigned int rconst : 1;
-// Type* ret_type;
-// Type* left_type;
-// Type* right_type;
-// SsaVar dest;
-// SsaValue left;
-// SsaValue right;
-//} SsaNode;
-
typedef struct SsaNode {
struct SsaNode* next;
unsigned int code : 25;
SsaNode* call = ssa_node(CALL, MODE_CTRL);
call->type = func->type->base;
call->left = func;
+ call->right = ssa_node(ARGS, MODE_VAR);
return call;
}
void ssa_call_add(Parser* p, SsaNode* call, SsaNode* arg)
{
+ SsaNode* arglist = call->right;
loadmem(p, arg);
- call->value.args.nv++;
- call->value.args.v = realloc(call->value.args.v, call->value.args.nv);
- call->value.args.v[call->value.args.nv - 1] = arg;
+ arglist->value.args.nv++;
+ arglist->value.args.v = realloc(arglist->value.args.v, arglist->value.args.nv * sizeof(SsaNode*));
+ assert(arglist->value.args.v);
+ arglist->value.args.v[arglist->value.args.nv - 1] = arg;
}
static SsaNode* binop(Parser* p, int op, SsaNode* left, SsaNode* right)
Symbol* symbol_getbyid(Parser* p, size_t id)
{
+ assert(id < p->nsyms);
return &(p->syms[id]);
}
return a + b;
end
-
procedure TestFunctionCalls()
begin
TestReturnVoid();