summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2016-02-19 16:12:41 +0100
committerAdrian Thurston <thurston@complang.org>2016-02-19 16:12:41 +0100
commit6dd6b970b79e89b165cfc86e30e127fecfe1212f (patch)
tree78c632f2d90eada3ab2dcf4499d6a0d1722fab8c /src
parent78ab04bcdc09256e11b0723932eba3e8c1d5c247 (diff)
downloadcolm-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.c4
-rw-r--r--src/commit.c2
-rw-r--r--src/compiler.cc11
-rw-r--r--src/consinit.cc17
-rw-r--r--src/pdabuild.cc36
-rw-r--r--src/pdacodegen.cc18
-rw-r--r--src/pdarun.c6
-rw-r--r--src/pdarun.h9
-rw-r--r--src/program.c2
-rw-r--r--src/program.h6
-rw-r--r--src/reduce.cc20
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";