diff options
author | Adrian Thurston <thurston@complang.org> | 2016-02-19 16:12:41 +0100 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2016-02-19 16:12:41 +0100 |
commit | 6dd6b970b79e89b165cfc86e30e127fecfe1212f (patch) | |
tree | 78c632f2d90eada3ab2dcf4499d6a0d1722fab8c /src | |
parent | 78ab04bcdc09256e11b0723932eba3e8c1d5c247 (diff) | |
download | colm-6dd6b970b79e89b165cfc86e30e127fecfe1212f.tar.gz |
host adapters now have unique names are are accessed with func pointers
This eliminates symbol collisions present when linking multiple colm programs
into the same executable.
Diffstat (limited to 'src')
-rw-r--r-- | src/bytecode.c | 4 | ||||
-rw-r--r-- | src/commit.c | 2 | ||||
-rw-r--r-- | src/compiler.cc | 11 | ||||
-rw-r--r-- | src/consinit.cc | 17 | ||||
-rw-r--r-- | src/pdabuild.cc | 36 | ||||
-rw-r--r-- | src/pdacodegen.cc | 18 | ||||
-rw-r--r-- | src/pdarun.c | 6 | ||||
-rw-r--r-- | src/pdarun.h | 9 | ||||
-rw-r--r-- | src/program.c | 2 | ||||
-rw-r--r-- | src/program.h | 6 | ||||
-rw-r--r-- | src/reduce.cc | 20 |
11 files changed, 81 insertions, 50 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index a9c33efb..b0f0b249 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -37,8 +37,6 @@ typedef struct colm_struct struct_t; -tree_t **host_call( program_t *prg, long code, tree_t **sp ); - #define TRUE_VAL 1 #define FALSE_VAL 0 @@ -3379,7 +3377,7 @@ again: debug( prg, REALM_BYTECODE, "IN_HOST %hd\n", func_id ); - sp = host_call( prg, func_id, sp ); + sp = prg->rtd->host_call( prg, func_id, sp ); break; } case IN_CALL_WV: { diff --git a/src/commit.c b/src/commit.c index c1c4d205..fbb07170 100644 --- a/src/commit.c +++ b/src/commit.c @@ -105,7 +105,7 @@ void commit_reduce( program_t *prg, tree_t **root, struct pda_run *pda_run ) while ( sp != root ) { pt = vm_pop_ptree(); - commit_reduce_forward( prg, sp, pda_run, pt ); + prg->rtd->commit_reduce_forward( prg, sp, pda_run, pt ); pt->child = 0; pt->flags |= PF_COMMITTED; diff --git a/src/compiler.cc b/src/compiler.cc index 20e48038..5a33ed31 100644 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -1102,7 +1102,7 @@ void Compiler::writeHostCall() } *outStream << - "tree_t **host_call( program_t *prg, long code, tree_t **sp )\n" + "tree_t **" << objectName << "_host_call( program_t *prg, long code, tree_t **sp )\n" "{\n" " value_t rtn = 0;\n" " switch ( code ) {\n"; @@ -1111,8 +1111,8 @@ void Compiler::writeHostCall() *outStream << " case " << hc->funcId << ": {\n"; - int pos = 0; - for ( ParameterList::Iter p = *hc->paramList; p.lte(); p++, pos++ ) { + int pos = hc->paramList->length() - 1; + for ( ParameterList::Iter p = *hc->paramList; p.lte(); p++, pos-- ) { *outStream << " value_t p" << pos << " = vm_pop_value();\n"; } @@ -1154,10 +1154,9 @@ void Compiler::generateOutput( long activeRealm, bool includeCommit ) /* Write the runtime data. */ pdaGen->writeRuntimeData( runtimeData, pdaTables ); - if ( hostAdapters ) - writeHostCall(); + writeHostCall(); - if ( hostAdapters && includeCommit ) + if ( includeCommit ) writeCommitStub(); if ( !gblLibrary ) diff --git a/src/consinit.cc b/src/consinit.cc index 6b0e45b4..61b84f8b 100644 --- a/src/consinit.cc +++ b/src/consinit.cc @@ -31,23 +31,6 @@ #include "input.h" #include "consinit.h" -extern "C" tree_t **host_call( program_t *prg, long code, tree_t **sp ) -{ - return 0; -} - -extern "C" void commit_reduce_forward( program_t *prg, tree_t **root, - struct pda_run *pda_run, parse_tree_t *pt ) -{ - commit_clear_parse_tree( prg, root, pda_run, pt->child ); -} - -extern "C" long commit_union_sz( int reducer ) { return 0; } - -extern "C" void init_need() {} -extern "C" int reducer_need_tok( program_t *prg, struct pda_run *, int id ) { return 3; } -extern "C" int reducer_need_ign( program_t *prg, struct pda_run * ) { return 3; } - using std::cout; using std::cerr; using std::endl; diff --git a/src/pdabuild.cc b/src/pdabuild.cc index a7a82df8..9ba17f43 100644 --- a/src/pdabuild.cc +++ b/src/pdabuild.cc @@ -44,6 +44,36 @@ using std::cout; char startDefName[] = "start"; +extern "C" tree_t **internal_host_call( program_t *prg, long code, tree_t **sp ) +{ + return 0; +} + +extern "C" void internal_commit_reduce_forward( program_t *prg, tree_t **root, + struct pda_run *pda_run, parse_tree_t *pt ) +{ + commit_clear_parse_tree( prg, root, pda_run, pt->child ); +} + +extern "C" long internal_commit_union_sz( int reducer ) +{ + return 0; +} + +extern "C" void internal_init_need() +{ +} + +extern "C" int internal_reducer_need_tok( program_t *prg, struct pda_run *, int id ) +{ + return 3; +} + +extern "C" int internal_reducer_need_ign( program_t *prg, struct pda_run * ) +{ + return 3; +} + /* Count the transitions in the fsm by walking the state list. */ int countTransitions( PdaGraph *fsm ) { @@ -1687,6 +1717,12 @@ void Compiler::makeRuntimeData() runtimeData->init_bindings = &internalInitBindings; runtimeData->pop_binding = &internalPopBinding; + runtimeData->host_call = &internal_host_call; + runtimeData->commit_reduce_forward = &internal_commit_reduce_forward; + runtimeData->commit_union_sz = &internal_commit_union_sz; + runtimeData->init_need = &internal_init_need; + runtimeData->reducer_need_tok = &internal_reducer_need_tok; + runtimeData->reducer_need_ign = &internal_reducer_need_ign; } /* Borrow alg->state for mapsTo. */ diff --git a/src/pdacodegen.cc b/src/pdacodegen.cc index 3a8eca04..c052cc99 100644 --- a/src/pdacodegen.cc +++ b/src/pdacodegen.cc @@ -445,6 +445,18 @@ void PdaCodeGen::writeRuntimeData( colm_sections *runtimeData, struct pda_tables out << "};\n\n"; out << + "tree_t **" << objectName << "_host_call( program_t *prg, long code, tree_t **sp );\n" + "void " << objectName << "_commit_reduce_forward( program_t *prg, tree_t **root,\n" + " struct pda_run *pda_run, parse_tree_t *pt );\n" + "long " << objectName << "_commit_union_sz( int reducer );\n" + "void " << objectName << "_init_need();\n" + "int " << objectName << "_reducer_need_tok( program_t *prg, " + "struct pda_run *pda_run, int id );\n" + "int " << objectName << "_reducer_need_ign( program_t *prg, " + "struct pda_run *pda_run );\n" + "\n"; + + out << "struct colm_sections " << objectName << " = \n" "{\n" " " << lelInfo() << ",\n" @@ -505,6 +517,12 @@ void PdaCodeGen::writeRuntimeData( colm_sections *runtimeData, struct pda_tables " &sendNamedLangEl,\n" " &initBindings,\n" " &popBinding,\n" + " &" << objectName << "_host_call,\n" + " &" << objectName << "_commit_reduce_forward,\n" + " &" << objectName << "_commit_union_sz,\n" + " &" << objectName << "_init_need,\n" + " &" << objectName << "_reducer_need_tok,\n" + " &" << objectName << "_reducer_need_ign,\n" "};\n" "\n"; } diff --git a/src/pdarun.c b/src/pdarun.c index 91a0e8df..682a0ed3 100644 --- a/src/pdarun.c +++ b/src/pdarun.c @@ -877,7 +877,7 @@ static head_t *peek_match( program_t *prg, struct pda_run *pda_run, struct strea static void send_ignore( program_t *prg, tree_t **sp, struct pda_run *pda_run, struct stream_impl *is, long id ) { - if ( reducer_need_ign( prg, pda_run ) == RN_NONE ) { + if ( prg->rtd->reducer_need_ign( prg, pda_run ) == RN_NONE ) { consume_match( prg, sp, pda_run, is ); } else { @@ -905,7 +905,7 @@ static void send_token( program_t *prg, tree_t **sp, /* Make the token data. */ head_t *tokdata = 0; - int rn = reducer_need_tok( prg, pda_run, id ); + int rn = prg->rtd->reducer_need_tok( prg, pda_run, id ); switch ( rn ) { case RN_NONE: @@ -1314,7 +1314,7 @@ void colm_pda_init( program_t *prg, struct pda_run *pda_run, struct pda_tables * if ( reducer ) { init_pool_alloc( &pda_run->local_pool, sizeof(parse_tree_t) + - commit_union_sz(reducer) ); + prg->rtd->commit_union_sz(reducer) ); pda_run->parse_tree_pool = &pda_run->local_pool; } else { diff --git a/src/pdarun.h b/src/pdarun.h index 1beb28d1..9ea7a0ac 100644 --- a/src/pdarun.h +++ b/src/pdarun.h @@ -458,15 +458,6 @@ void commit_clear_parse_tree( program_t *prg, tree_t **sp, void commit_reduce( program_t *prg, tree_t **root, struct pda_run *pda_run ); -/* Supplied by generated code. */ -void commit_reduce_forward( program_t *prg, tree_t **root, - struct pda_run *pda_run, parse_tree_t *pt ); - -long commit_union_sz( int reducer ); -void init_need(); -int reducer_need_tok( program_t *prg, struct pda_run *pda_run, int id ); -int reducer_need_ign( program_t *prg, struct pda_run *pda_run ); - #ifdef __cplusplus } #endif diff --git a/src/program.c b/src/program.c index e09f7aa2..d2f9b200 100644 --- a/src/program.c +++ b/src/program.c @@ -194,7 +194,7 @@ program_t *colm_new_program( struct colm_sections *rtd ) /* Allocate the VM stack. */ vm_init( prg ); - init_need(); + rtd->init_need(); return prg; } diff --git a/src/program.h b/src/program.h index d39b4f4a..f3e63e4a 100644 --- a/src/program.h +++ b/src/program.h @@ -100,7 +100,13 @@ struct colm_sections void (*init_bindings)( struct pda_run *pda_run ); void (*pop_binding)( struct pda_run *pda_run, parse_tree_t *tree ); + tree_t **(*host_call)( program_t *prg, long code, tree_t **sp ); + + void (*commit_reduce_forward)( program_t *prg, tree_t **root, struct pda_run *pda_run, parse_tree_t *pt ); + long (*commit_union_sz)( int reducer ); void (*init_need)(); + int (*reducer_need_tok)( program_t *prg, struct pda_run *pda_run, int id ); + int (*reducer_need_ign)( program_t *prg, struct pda_run *pda_run ); }; struct heap_list diff --git a/src/reduce.cc b/src/reduce.cc index bf842f76..5c7acd45 100644 --- a/src/reduce.cc +++ b/src/reduce.cc @@ -43,17 +43,17 @@ void Compiler::writeCommitStub() { *outStream << - "void commit_reduce_forward( program_t *prg, tree_t **root,\n" + "void " << objectName << "_commit_reduce_forward( program_t *prg, tree_t **root,\n" " struct pda_run *pda_run, parse_tree_t *pt )\n" "{\n" " commit_clear_parse_tree( prg, root, pda_run, pt->child );\n" "}\n" "\n" - "long commit_union_sz( int reducer ) { return 0; }\n" - "void init_need() {}\n" - "int reducer_need_tok( program_t *prg, " + "long " << objectName << "_commit_union_sz( int reducer ) { return 0; }\n" + "void " << objectName << "_init_need() {}\n" + "int " << objectName << "_reducer_need_tok( program_t *prg, " "struct pda_run *pda_run, int id ) { return COLM_RN_BOTH; }\n" - "int reducer_need_ign( program_t *prg, " + "int " << objectName << "_reducer_need_ign( program_t *prg, " "struct pda_run *pda_run ) { return COLM_RN_BOTH; }\n" "\n"; ; @@ -346,7 +346,7 @@ void Compiler::writeNeeds() "\n"; *outStream << - "extern \"C\" void init_need()\n" + "extern \"C\" void " << objectName << "_init_need()\n" "{\n"; for ( ReductionVect::Iter r = rootNamespace->reductions; r.lte(); r++ ) { @@ -374,7 +374,7 @@ void Compiler::writeNeeds() "}\n"; *outStream << - "extern \"C\" int reducer_need_tok( program_t *prg, " + "extern \"C\" int " << objectName << "_reducer_need_tok( program_t *prg, " "struct pda_run *pda_run, int id )\n" "{\n" " if ( pda_run->reducer > 0 ) {\n" @@ -386,7 +386,7 @@ void Compiler::writeNeeds() " return COLM_RN_BOTH;\n" "}\n" "\n" - "extern \"C\" int reducer_need_ign( program_t *prg, struct pda_run *pda_run )\n" + "extern \"C\" int " << objectName << "_reducer_need_ign( program_t *prg, struct pda_run *pda_run )\n" "{\n" // Using this requires finding a solution for backtracking push back. //" if ( pda_run->reducer > 0 )\n" @@ -453,14 +453,14 @@ void Compiler::writeCommit() "\n"; *outStream << - "long commit_union_sz( int reducer )\n" + "extern \"C\" long " << objectName << "_commit_union_sz( int reducer )\n" "{\n" " return sizeof( commit_reduce_union );\n" "}\n"; *outStream << "\n" - "void commit_reduce_forward( program_t *prg, tree_t **root,\n" + "extern \"C\" void " << objectName << "_commit_reduce_forward( program_t *prg, tree_t **root,\n" " struct pda_run *pda_run, parse_tree_t *pt )\n" "{\n" " switch ( pda_run->reducer ) {\n"; |