Skip to content

Commit

Permalink
Generate LLVM bytecode of libraries for use with emscripten
Browse files Browse the repository at this point in the history
- Use make -C SimulationRuntime/c emcc && make


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@17357 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Sep 24, 2013
1 parent eea2544 commit ec7bcf9
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 15 deletions.
3 changes: 3 additions & 0 deletions Compiler/runtime/config.unix.h.in
Expand Up @@ -45,8 +45,11 @@
#define CONFIG_REVISION "@SOURCE_REVISION@"
#define CONFIG_WITH_OPENMP @CONFIG_WITH_OPENMP@

/* Skip compiling against some stuff for the JavaScript runtime */
#if !defined(OMC_EMCC)
@WITH_SUNDIALS@
@WITH_IPOPT@
@WITH_HWLOC@
#endif

#define CONFIG_SYSTEMLIBS mk_cons(mk_scon("-lomcruntime"),mk_cons(mk_scon("-lexpat"),mk_cons(mk_scon("-lsqlite3"),mk_cons(mk_scon(CONFIG_LPSOLVE55),mk_cons(mk_scon(CONFIG_CORBALIBS),mk_nil())))))
2 changes: 1 addition & 1 deletion Makefile.common
Expand Up @@ -29,7 +29,7 @@ FMILIB_SHARED = ON
mkbuilddirs:
if [ "$(EXE)" = ".app" ]; then mkdir -p $(builddir_app); fi
mkdir -p $(builddir_bin)
mkdir -p $(builddir_lib)/omc
mkdir -p $(builddir_lib)/omc/emcc
mkdir -p $(builddir_lib)/python
mkdir -p $(builddir_lib)/python/omniORB
mkdir -p $(builddir_inc)
Expand Down
31 changes: 21 additions & 10 deletions SimulationRuntime/c/Makefile.common
Expand Up @@ -78,6 +78,7 @@ RUNTIME_HEADERS_FMU = \

all : install

all_objs : $(ALL_OBJS)

#recompile all if a header changes!
$(ALL_OBJS) : $(ALL_HEADERS)
Expand All @@ -93,6 +94,10 @@ libSimulationRuntimeC.so: $(ALL_OBJS)
@rm -f $@
$(CC) -shared -o $@ $(ALL_OBJS)

libSimulationRuntimeC.bc: $(ALL_OBJS)
@rm -f $@
$(CC) -o $@ $(ALL_OBJS)

libOpenModelicaRuntimeC.a: $(BASE_OBJS)
@# You have to remove the old archive first or it may contain old objects
@rm -f $@
Expand All @@ -112,33 +117,37 @@ libOpenModelicaFMIRuntimeC.so: $(FMIOBJSPATH)
@rm -f $@
$(CC) -shared -o $@ $(FMIOBJSPATH)

$(METAOBJSPATH):%.o: %.c $(METAHFILESPATH) $(COMMON_HEADERS)
$(METAOBJSPATH):%$(OBJ_EXT): %.c $(METAHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $< -I$(METAPATH) -I$(UTILPATH)

meta/meta_modelica_catch.o: meta/meta_modelica_catch.c
meta/meta_modelica_catch$(OBJ_EXT): meta/meta_modelica_catch.c
$(CC) -c $(CFLAGS) -o $@ $< -g

$(UTILOBJSPATH):%.o: %.c $(UTILHFILESPATH) $(COMMON_HEADERS)
$(UTILOBJSPATH):%$(OBJ_EXT): %.c $(UTILHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $< -I$(UTILPATH) -I$(METAPATH)

$(MATHOBJSPATH):%.o: %.c $(MATHHFILESPATH) $(COMMON_HEADERS)
$(MATHOBJSPATH):%$(OBJ_EXT): %.c $(MATHHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) $(FPMATHFORTRAN) -o $@ $< -I$(MATHPATH) -I$(UTILPATH)

$(SOLVEROBJSPATH):%.o: %.c $(SOLVERHFILESPATH) $(RESULTSHFILESPATH) $(INITIALIZATIONHFILESPATH) $(OPTIMIZATIONHFILESPATH) $(COMMON_HEADERS)
$(SOLVEROBJSPATH):%$(OBJ_EXT): %.c $(SOLVERHFILESPATH) $(RESULTSHFILESPATH) $(INITIALIZATIONHFILESPATH) $(OPTIMIZATIONHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $< -I$(SOLVERPATH) -I$(INITIALIZATIONPATH) -I$(OPTIMIZATIONPATH) -I$(RESULTSPATH) -I$(SIMPATH) -I$(MATHPATH) -I$(UTILPATH)

$(INITIALIZATIONOBJSPATH):%.o: %.c $(SOLVERHFILESPATH) $(INITIALIZATIONHFILESPATH) $(COMMON_HEADERS)
$(INITIALIZATIONOBJSPATH):%$(OBJ_EXT): %.c $(SOLVERHFILESPATH) $(INITIALIZATIONHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $< -I$(SOLVERPATH) -I$(INITIALIZATIONPATH) -I$(SIMPATH) -I$(MATHPATH) -I$(UTILPATH)

$(RESULTSOBJSPATH):%.o: $(RESULTSFILESPATH) $(COMMON_HEADERS)
$(RESULTSOBJSPATH):%$(OBJ_EXT): %.cpp $(RESULTSFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $<

$(SIMOBJSPATH):%.o: %.cpp linearization/linearize.cpp $(SIMHFILESPATH) $(COMMON_HEADERS)
$(SIMOBJSPATH):%$(OBJ_EXT): %.cpp linearization/linearize.cpp $(SIMHFILESPATH) $(COMMON_HEADERS)
$(CXX) -c $(CXXFLAGS) -o $@ $< -I$(SIMPATH) -I$(UTILPATH) -I$(MATHPATH) -I$(RESULTSPATH) -I$(SOLVERPATH) -I$(INITIALIZATIONPATH) -Ilinearization/

$(SIMOBJSPATHC):%.o: %.c $(SIMHFILESPATH) $(COMMON_HEADERS)
$(SIMOBJSPATHC):%$(OBJ_EXT): %.c $(SIMHFILESPATH) $(COMMON_HEADERS)
@echo Deps: $(SIMHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $< -I$(SIMPATH) -I$(UTILPATH) -I$(MATHPATH) -I$(RESULTSPATH) -I$(SOLVERPATH) -I$(INITIALIZATIONPATH) -Ilinearization/

$(OPTIMIZATIONOBJSPATH):%$(OBJ_EXT): %.c $(OPTIMIZATIONHFILESPATH) $(COMMON_HEADERS)
$(CC) -c $(CFLAGS) -o $@ $<

ifeq ($(LIBF2C),)
simulation/libf2c/libf2c.a:
else
Expand All @@ -151,6 +160,8 @@ install: $(LIBSIMULATION) $(LIBRUNTIME) $(LIBFMIRUNTIME) simulation/libf2c/libf2
cp -p $(LIBSIMULATION) $(LIBRUNTIME) $(LIBFMIRUNTIME) \
../interactive/libinteractive.a $(builddir_lib)
test -z "$(LIBF2C)" || cp simulation/libf2c/libf2c.* $(builddir_lib)/
test ! -f libSimulationRuntimeC.bc || cp libSimulationRuntimeC.bc $(builddir_lib)/emcc/libSimulationRuntimeC.so
test ! -f simulation/libf2c/libf2c.bc || cp simulation/libf2c/libf2c.bc $(builddir_lib)/emcc/libf2c.so
# copy interactive sample client
cp $(INTERACTIVECLIENT) $(builddir_bin)
# copy header files
Expand All @@ -166,7 +177,7 @@ install: $(LIBSIMULATION) $(LIBRUNTIME) $(LIBFMIRUNTIME) simulation/libf2c/libf2
$(MAKE) -C util/java_interface -f $(LIBMAKEFILE) install-nomodelica

clean:
rm -f $(ALL_PATHS_CLEAN_OBJS) fmi/*.o *.a optimization/*/*.o
rm -f $(ALL_PATHS_CLEAN_OBJS) fmi/*.o *.a optimization/*/*.o $(TARGET)/*/*.o
$(MAKE) -C simulation/libf2c -f ${LIBMAKEFILE} clean
(! test -f $(EXTERNALCBUILDDIR)/Makefile) || make -C $(EXTERNALCBUILDDIR) clean
(! test -f $(EXTERNALCBUILDDIR)/Makefile) || make -C $(EXTERNALCBUILDDIR) distclean
9 changes: 8 additions & 1 deletion SimulationRuntime/c/Makefile.in
Expand Up @@ -19,7 +19,6 @@ FPMATHFORTRAN = @FPMATHFORTRAN@
LIBMAKEFILE = Makefile
INTERACTIVELIBS = "-lpthread"
INTERACTIVECLIENT = "../interactive/SampleClient/interactiveclient"
LIBSENDDATA = @LIBSENDDATA@
QMAKE=@QMAKE@
CONFIG_H=$(top_builddir)/Compiler/runtime/config.h $(top_builddir)/Compiler/runtime/config.unix.h
# Use f2c from the OS itself... If so, don't include the f2c headers from OpenModelica
Expand All @@ -32,10 +31,18 @@ endif
LIBSIMULATION=@LIBSIMULATION@
LIBRUNTIME=@LIBRUNTIME@
LIBFMIRUNTIME=@LIBFMIRUNTIME@
OBJ_EXT = .o

REGEN = Makefile.in

include Makefile.common

Makefile: Makefile.in
cd $(top_builddir); ./config.status

emcc: Makefile
cp -u /usr/include/expat*.h
emmake $(MAKE) OBJ_EXT=.bc CC=emcc CXX=emcc CFLAGS="$(CFLAGS) -DOMC_EMCC -DNO_INTERACTIVE_DEPENDENCY -I./simulation/libf2c/" libSimulationRuntimeC.bc
emmake $(MAKE) -C simulation/libf2c OBJ_EXT=.bc CC=emcc CXX=emcc libf2c.bc
emcc-clean: Makefile
$(MAKE) OBJ_EXT=.bc clean
4 changes: 2 additions & 2 deletions SimulationRuntime/c/meta/dtoa.c
Expand Up @@ -535,7 +535,7 @@ BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflc

#define Kmax 7

static char *dtoa(double d, int mode, int ndigits,
static char *omc_dtoa(double d, int mode, int ndigits,
int *decpt, int *sign, char **rve);

struct
Expand Down Expand Up @@ -1547,7 +1547,7 @@ freedtoa(char *s)
*/

static char *
dtoa
omc_dtoa
#ifdef KR_headers
(dd, mode, ndigits, decpt, sign, rve)
double dd; int mode, ndigits, *decpt, *sign; char **rve;
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/meta/realString.c
Expand Up @@ -96,7 +96,7 @@ static void* dtostr(double d)
return "NaN";
#endif
*expbuf = 0;
cporig = dtoa(d,1,prec,&expt,&signflag,&dtoaend);
cporig = omc_dtoa(d,1,prec,&expt,&signflag,&dtoaend);
cp = cporig;
ndig = dtoaend - cp;
/*
Expand Down
Expand Up @@ -30,6 +30,8 @@

#include "simulation_result.h"

extern "C" {

static void sim_result_doNothing(simulation_result* self, DATA *data)
{
/* Do nothing */
Expand All @@ -45,3 +47,5 @@ simulation_result sim_result = {
sim_result_doNothing, /* writeParam */
sim_result_doNothing, /* free */
};

}
Expand Up @@ -47,6 +47,7 @@
#include <string.h>
#include <time.h>

extern "C" {

void csv_emit(simulation_result *self, DATA *data)
{
Expand Down Expand Up @@ -147,3 +148,5 @@ void csv_free(simulation_result *self, DATA *data)
fclose(fout);
rt_accumulate(SIM_TIMER_OUTPUT);
}

}
Expand Up @@ -47,6 +47,8 @@
#include <string.h>
#include <time.h>

extern "C" {

typedef struct plt_data {
double* simulationResultData;
long currentPos;
Expand Down Expand Up @@ -350,3 +352,5 @@ void plt_free(simulation_result *self,DATA *data)
self->storage = NULL;
rt_accumulate(SIM_TIMER_OUTPUT);
}

}
4 changes: 4 additions & 0 deletions SimulationRuntime/c/simulation/simulation_runtime.cpp
Expand Up @@ -344,6 +344,10 @@ void initializeOutputFilter(MODEL_DATA *modelData, modelica_string variableFilte
if(0 == strcmp(filter, ".*")) // This matches all variables, so we don't need to do anything
return;

#if defined(OMC_EMCC)
/* We do not have libregex in javascript */
return;
#endif
rc = regcomp(&myregex, filter, flags);
if(rc)
{
Expand Down

0 comments on commit ec7bcf9

Please sign in to comment.