Mercurial > repos > rhope
diff cbackend.rhope @ 186:ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Oct 2011 00:10:02 -0700 |
parents | c6ba9fe45910 |
children |
line wrap: on
line diff
--- a/cbackend.rhope Wed Jul 27 21:32:40 2011 -0700 +++ b/cbackend.rhope Fri Oct 07 00:10:02 2011 -0700 @@ -600,6 +600,7 @@ + Do AddRef@C Function[func,psource,pdest:out] { source <- [psource]Make Op[func] @@ -698,13 +699,13 @@ { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append["->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]] + out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv("]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]] } Set Global@C Function[func,store,var,src:out] { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - cell pointer <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore] + cell pointer <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")"] out <- [[[[func]Add Statement[[["tmp = copy_object("]Append[[cell pointer]Append["->local_data"]]]Append[")"]] ]Add Statement[ [[[["((mutt_"]Append[estore]]Append[" *)tmp)->gs_"]]Append[Escape Rhope Name[var, [func]Escape Pattern >>]]]Append[[" = "]Append[[src]Make Op[func]]] ] ]Add Statement[[cell pointer]Append["->local_data = tmp"]] @@ -951,9 +952,9 @@ { [[func]Inputs >>]Find[=[op,?]] { - out <- [["my_cdata->params["]Append[String[~]]]Append[" ]"] + out <- [["my_params("]Append[String[~]]]Append[")"] }{ - out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]] + out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]]]Append[")"] } }{ out <- Escape Rhope Name[op,[func]Escape Pattern >>] @@ -964,7 +965,7 @@ { If[[[func]Convention >>] = ["rhope"]] { - out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]] + out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]]]Append[")"] }{ out <- Escape Rhope Name[name,[func]Escape Pattern >>] } @@ -1002,21 +1003,21 @@ Discard Outputs@C Function[func,first to discard:out] { out <- [[[[[func - ]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < cdata->num_params; ++idx)"]] + ]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < numresults; ++idx)"]] ]Add Raw Line["{"] - ]Add Raw Line[" if (cdata->params[idx])"] - ]Add Raw Line[" release_ref(cdata->params[idx]);"] + ]Add Raw Line[" if (result(idx))"] + ]Add Raw Line[" release_ref(result(idx));"] ]Add Raw Line["}"] } Result Reference@C Function[func,output:out] { - out <- [["cdata->params["]Append[String[output]]]Append["]"] + out <- [["result("]Append[String[output]]]Append[")"] } Checked Result Reference@C Function[func,output:out] { - out <- [[[["("]Append[String[output]]]Append[" < cdata->num_params ? cdata->params["]]Append[String[output]]]Append["] : NULL)"] + out <- [[[["("]Append[String[output]]]Append[" < numresults ? result("]]Append[String[output]]]Append[") : NULL)"] } @@ -1036,7 +1037,7 @@ _Set Outputs C[string,inputname,inputnum,func:out] { - out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append[")\n"]] + out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append["))\n"]] } Set Outputs@C Function[func:out] @@ -1055,15 +1056,15 @@ } _Output Defs C[string,varname,index,func:out] { - out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[" "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[";\n"] + out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[", "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[")"] } _Var Defs C[string,type,varname,p:out] { - out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[type,p]] ]]Append[[" "]Append[Escape Rhope Name[varname,p]]]]Append[";\n"] + out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[type,p]] ]]Append[[", "]Append[Escape Rhope Name[varname,p]]]]Append[")"] } _Global Cell Defs C[func,p,string,store:out] { - out <- [string]Append[ [["\ttrans_cell *gs_"]Append[Escape Rhope Name[store,p]]]Append[";\n"] ] + out <- [string]Append[ [[" lvar(trans_cell *, gs_"]Append[Escape Rhope Name[store,p]]]Append[")"] ] } @@ -1073,7 +1074,22 @@ { If[ [[[func]Convention >>] = ["rhope"]] And [[ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]] ] { - localtype <- [[[Fold[_Global Cell Defs C[func,[func]Escape Pattern >>,?], Fold[_Output Defs C[?, ?, ?, func], Fold[_Var Defs C[?,?,?,[func]Escape Pattern >>],"typedef struct {\n", [func]Variables >>], [func]Outputs >>], [func]Uses >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[";\n"] + ename <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>] + localtype <- [ + [ + [ + Fold[ + _Global Cell Defs C[func,[func]Escape Pattern >>,?], + Fold[ + _Output Defs C[?, ?, ?, func], + Fold[ + _Var Defs C[?,?,?,[func]Escape Pattern >>], + ["#define ldec_"]Append[ename], + [func]Variables >>], + [func]Outputs >>], + [func]Uses >>] + ]Append["\nLocalsType(ldec_"]]Append[ename] + ]Append[ [[", "]Append[ename]]Append[")\n"] ] }{ localtype <- "" } @@ -1147,7 +1163,7 @@ Find Trans Cell@C Function[func,text,store:out] { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - out <- [text]Append[ [[[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append[[[" = find_obj_cell(ct->transaction, gs_"]Append[estore]]Append[");\n"]] ] + out <- [text]Append[ [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[[[") = find_obj_cell(cur_transaction, gs_"]Append[estore]]Append[");\n"]] ] } Text@C Function[func:out] @@ -1177,10 +1193,12 @@ } If[ [ [[[[func]Variables >>]Length]+[[[func]Outputs >>]Length]]+[[[func]Uses >>]Length] ] = [0] ] { - out <- [[[[[[[[[ [type]Append["NoLocals("] + out <- [[[[[[[[[[[ [type]Append["NoLocals("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ String[[[func]Inputs >>]Length] ] + ]Append[",\n\tNumOutputs "] + ]Append[ String[[[func]Outputs >>]Length] ] ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] @@ -1193,18 +1211,20 @@ begin trans <- [[[["\tbegin_transaction(ct, "]Append[ String[[[func]Uses >>]Length] ]]Append[", "]]Append[ [Map[Map[[func]Uses >>, Escape Rhope Name[?, [func]Escape Pattern >>]], ["gs_"]Append[?]]]Join[", "] ]]Append[");\n"] init trans <- [[Fold[Find Trans Cell[func,?], begin trans, [func]Uses >>] ]Append[[["transretry_"]Append[fname]]Append[":\n"]] - ]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { add_ref(cdata->params[idx]); }\n"] + ]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { add_ref(my_params(idx)); }\n"] ] //TODO: Figure out whether this is a readonly or write transaction commit trans <- [[["\tif(!commit_transaction(ct, 0)) { prep_retry(ct); goto transretry_"]Append[fname]]Append["; }\n"] - ]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { release_ref(cdata->params[idx]); }\n"] + ]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { release_ref(my_params(idx)); }\n"] ] }{ init trans <- "" commit trans <- "" } - out <- [[[[[[[[[[[[ [type]Append["("] + out <- [[[[[[[[[[[[[[ [type]Append["("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ String[[[func]Inputs >>]Length] ] + ]Append[",\n\tNumOutputs "] + ]Append[ String[[[func]Outputs >>]Length] ] ]Append[")\n\n"] ]Append[param check] ]Append[init trans] @@ -1519,11 +1539,11 @@ _Dispatch Enum Sub[text, num, name:out] { out <- [[[[[text - ]Append["\tRES_"] + ]Append["\tResEnum("] ]Append[String[num]] - ]Append["_"] + ]Append[", "] ]Append[name] - ]Append[",\n"] + ]Append[")\n"] } _Dispatch Enum[text,func,raw name:out] @@ -1547,7 +1567,7 @@ { out <- [[[[["typedef enum {\n" ]Append[Fold[_Dispatch Enum[?], - [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tRES_1_Pause,\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tRES_1_RunSP_Bytecode,\n"], + [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tResEnum(1, Pause)\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tResEnum(1, RunSP_Bytecode)\n"], [program]Functions >>]] ]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"] ]Append["#define DispatchEntries \\\n"] @@ -1575,7 +1595,13 @@ { out <- text }{ - out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]] + If[[[func]Name >>]Contains["@"]] + { + deftype <- "\tMethodDef(" + }{ + deftype <- "\tFuncDef(" + } + out <- [text]Append[[[deftype]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]] } } @@ -1673,14 +1699,7 @@ #include \"array.c\" #include \"worker.c\" -int main(int argc, char **argv) -{ - blueprint * bp; - int numret; - int idx; - object * inout[3]; - register_builtin_types(); - register_type_byid(TYPE_MUTABLEGLOBAL, sizeof(mutable_object)-sizeof(object), NULL, NULL, NULL);\n\n"] +#include \"main_start.c\" \n\n"] ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] ]Append[Fold[_Global Type Inits C[?, ?, p], "", [program]Global Stores >>]] ]Append[Fold[_Set Consts C Program[?, ?, ?, [program]Type Registry >>], "", constants]] @@ -1688,40 +1707,16 @@ ]Append[Fold[_Global Store Inits C[?, ?, [program]Type Registry >>], "", [program]Global Stores >>]] ]Append[Fold[Init Type Names[?, ?, ?, [program]Type Registry >>], "", [[program]Type Registry >>]Lookup >>]] ]Append[" - rhope(FUNC_List, inout, 0, 1); - for (idx = 0; idx < argc; ++idx) - { - inout[1] = make_String(argv[idx]); - rhope(FUNC_Append, inout, 2, 2); - } - numret = rhope(FUNC_Main, inout, 1, 1); -#ifdef ENABLE_LEAK_DETECTION\n"] +#include \"main_mid.c\" + +#ifdef ENABLE_LEAK_DETECTION\n\n"] ]Append[Fold[_Consts C Release[?, ?, ?, p], "", constants]] ]Append[ " print_mem_info(manager); print_live_object_types(manager); #endif //ENABLE_LEAK_DETECTION - -#ifdef ENABLE_PROFILING - for (idx = 0; idx < END; ++idx) - { - if(profile_counts[idx]) - printf(\"Func: %d\tCount: %llu\tTime: %llu\tAvg: %f\tSelf: %llu\tAvg: %f\tNested Count: %llu\\n\", idx, profile_counts[idx], profile_totals[idx], ((double)profile_totals[idx])/((double)profile_counts[idx]), profile_selftotals[idx], ((double)profile_selftotals[idx])/((double)profile_counts[idx]), profile_nestedcounts[idx]); - } -#endif - if (!numret) - return 0; - if (numret < 0) - return numret; - if (get_blueprint(inout[0])->type_id == TYPE_INT32) - return ((t_Int32 *)inout[0])->Num; - - rhope(FUNC_If, inout, 1, 2); - if (inout[0]) - return 0; - return 1; -}\n\n"] +#include \"main_end.c\"\n\n"] }