Skip to content

Commit

Permalink
fix for external c calls return values in cpp runtime
Browse files Browse the repository at this point in the history
  • Loading branch information
niklwors committed Jun 18, 2015
1 parent 0af6530 commit b0dc6e7
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -2550,7 +2550,7 @@ case SIMCODE(modelInfo=MODELINFO(__), makefileParams=MAKEFILE_PARAMS(__), simula
# /LIBPATH: - Directories where libs can be found
#LDFLAGS=/MDd /link /DLL /NOENTRY /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)" OMCppSystem.lib OMCppMath.lib
#LDSYSTEMFLAGS=/MD /Debug /link /DLL /NOENTRY /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)" OMCppSystem.lib OMCppModelicaUtilities.lib OMCppMath.lib OMCppOMCFactory.lib
LDSYSTEMFLAGS= /link /DLL /NOENTRY /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)" OMCppSystem.lib OMCppModelicaUtilities.lib OMCppMath.lib OMCppOMCFactory_static.lib <%timeMeasureLink%>
LDSYSTEMFLAGS= /link /DLL /NOENTRY /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)" OMCppSystem.lib OMCppModelicaUtilities.lib OMCppMath.lib OMCppDataExchange_static.lib OMCppOMCFactory_static.lib <%timeMeasureLink%>
#LDMAINFLAGS=/MD /Debug /link /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" OMCppOMCFactory.lib /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)"
LDMAINFLAGS=/link /LIBPATH:"<%makefileParams.omhome%>/lib/<%getTriple()%>/omc/cpp/msvc" OMCppOMCFactory_static.lib OMCppModelicaUtilities.lib <%timeMeasureLink%> /LIBPATH:"<%makefileParams.omhome%>/bin" /LIBPATH:"$(BOOST_LIBS)"
# /MDd link with MSVCRTD.LIB debug lib
Expand Down Expand Up @@ -4162,9 +4162,6 @@ case efn as EXTERNAL_FUNCTION(extArgs=extArgs) then
//(outVars |> var hasindex i1 fromindex 0 =>
varOutput(fn, var,0, &varDeclsOutput, &outVarInits, &outVarCopy, &outVarAssign, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
// ;separator="\n"; empty /* increase the counter! */



else
(List.restOrEmpty(outVars) |> var hasindex i1 fromindex 1 => varOutputTuple(fn, var, i1, &varDeclsvOutputTuple, &outVarInits, &outVarCopy, &outVarAssign, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
;separator="\n"; empty /* increase the counter! */
Expand All @@ -4188,10 +4185,12 @@ case efn as EXTERNAL_FUNCTION(extArgs=extArgs) then
;separator="\n"; empty /* increase the counter! */)
end match
let functionBodyExternalFunctionreturn = match outVarAssign1
case "" then << <%if retVar then 'output = <%retVar%>;' %> >>
case "" then << <%if retVar then 'output = <%retVar%>;' else '/*no output*/' %> >>
else outVarAssign1




let fnBody = <<
void /*<%retType%>*/ Functions::<%fname%>(<%funArgs |> var => funArgDefinition(var,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) ;separator=", "%><%if funArgs then if outVars then "," else ""%> <%if retVar then '<%retType%>& output' %>)/*function2*/
{
Expand All @@ -4211,10 +4210,9 @@ case efn as EXTERNAL_FUNCTION(extArgs=extArgs) then
<%outVarInits%>
/* functionBodyExternalFunction: callPart */
<%callPart%>
/*output assign*/
<%outputAssign%>
/* functionBodyExternalFunction: return */
<%functionBodyExternalFunctionreturn%>

<%outVarAssign%>

}
>>
<<
Expand Down Expand Up @@ -4243,6 +4241,13 @@ case efn as EXTERNAL_FUNCTION(extArgs=extArgs) then
>>
end functionBodyExternalFunction;

template funArgName(Variable var)
::=
let &auxFunction = buffer ""
match var
case VARIABLE(__) then contextCref2(name,contextFunction)
case FUNCTION_PTR(__) then '_' + name
end funArgName;

template writeOutVar(Variable var, Integer index)
"Generates code for writing a variable to outVar."
Expand Down Expand Up @@ -4376,20 +4381,23 @@ case EXTERNAL_FUNCTION(__) then
'<%contextCref2(c,contextFunction)%> ='// '<%extVarName2(c)%> = '
else
""



<<
<%varDecs%>
<%match extReturn case SIMEXTARG(__) then extFunCallVardecl(extReturn, &varDecls /*BUFD*/)%>
<%dynamicCheck%>
/*test0*/
<%returnAssign%><%extName%>(<%args%>);
/*test1*/
<%extArgs |> arg => extFunCallVarcopy(arg,fname,useTuple, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) ;separator="\n"%>
>>
/*test1*/
// <%extArgs |> arg => extFunCallVarcopy(arg,fname,useTuple, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation) ;separator="\n"%>
/*test2*/
<%match extReturn case SIMEXTARG(__) then extFunCallVarcopy(extReturn,fname,useTuple, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
//<%match extReturn case SIMEXTARG(__) then extFunCallVarcopy(extReturn,fname,useTuple, simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>
/*test3*/
>>
end extFunCallC;

end extFunCallC;
template extFunCallVarcopy(SimExtArg arg, String fnName,Boolean useTuple, SimCode simCode ,Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation)
"Helper to extFunCall."
::=
Expand Down Expand Up @@ -4698,19 +4706,19 @@ case var as VARIABLE(ty = T_STRING(__)) then
>>
""
else
let &varAssign += 'output /*_<%fname%> */= <%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
let &varAssign += /*_<%fname%> */'output = <%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
""
case var as VARIABLE(__) then
let marker = '<%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>'
let &varInits += '/* varOutput varInits(<%marker%>) */ <%\n%>'
//let &varAssign += '// varOutput varAssign(<%marker%>) <%\n%>'

if instDims then
let &varAssign += '/*_<%fname%>*/ output.assign(<%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>);<%\n%>'
let &varAssign += /*_<%fname%>*/'output.assign(<%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>);<%\n%>'
//let &varAssign += '<%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
""
else
let &varAssign += 'output /*_<%fname%>*/ = <%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
let &varAssign += /*_<%fname%>*/ 'output = <%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
//let &varAssign += '<%contextCref(var.name,contextFunction,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)%>;<%\n%>'
""
case var as FUNCTION_PTR(__) then
Expand Down

0 comments on commit b0dc6e7

Please sign in to comment.