Opened 7 years ago

Closed 7 years ago

Last modified 7 years ago

#4600 closed defect (fixed)

Internal template error

Reported by: Rüdiger Franke Owned by: Adrian Pop
Priority: high Milestone: 1.13.0
Component: Susan (Templates) Version:
Keywords: Cc: Willi Braun, Martin Sjölund

Description

Enabling directional derivatives in

OpenModelica/testsuite/openmodelica/cppruntime/fmu/modelExchange/2.0/testDrumBoiler.mos

with

setCommandLineOptions("+d=-disableDirectionalDerivatives"); getErrorString();

and calling omc results in the following internal error, "which should not happen for functions called from within template code; templates preserve pure 'match'/non-failing semantics":

Error: Template error: A template call failed (a call with 3 parameters: OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so: omc_CodegenFMUCpp_translateModel). One possible reason could be that a template imported function call failed (which should not happen for functions called from within template code; templates preserve pure 'match'/non-failing semantics).
Error: Internal error SimCode: The model DrumBoilerModel could not be translated to FMU
"

Change History (11)

comment:1 by Rüdiger Franke, 7 years ago

Cc: Martin Sjölund added

comment:2 by Martin Sjölund, 7 years ago

+d=-disableDirectionalDerivatives really should have been -d=-directionalDerivatives

comment:3 by Martin Sjölund, 7 years ago

It looks like it might be the listGet in:

    <% varLst |> var as TYPES_VAR(__) hasindex i1 fromindex 2 =>
      let re = daeExp(listGet(expLst,i1), context, &preExp, &varDecls,simCode , &extraFuncs , &extraFuncsDecl,  extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
      '<%re%> = <%rec%>.<%var.name%>;'
    ; separator="\n"
    %>

comment:4 by Martin Sjölund, 7 years ago

I'm making a new flag -d=susanDebug which can generate a different MetaModelica from the Susan code, which can give a stack-trace of the point where the failure happened. You would then need to use that flag to recompile all Susan templates and then get the error at run-time:

[bt] #1 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaRuntimeC.so(mmc_setStacktraceMessages_threadData)
[bt] #2 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(StackOverflow.generateReadableMessage)
[bt] #3 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(Tpl.fakeStackOverflow)
[bt] #4...14 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.lm_1582)
[bt] #15 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.algStmtAssign)
[bt] #16 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_1571)
[bt] #17 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.algStatement)
[bt] #18...19 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.lm_1573)
[bt] #20 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.algStmtWhile)
[bt] #21 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_1571)
[bt] #22 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.algStatement)
[bt] #23...32 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.lm_697)
[bt] #33 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.funStatement)
[bt] #34 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.functionBodyRegularFunction)
[bt] #35 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_422)
[bt] #36 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_423)
[bt] #37 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.functionBody)
[bt] #38...54 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.lm_420)
[bt] #55 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.functionBodies)
[bt] #56 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_292)
[bt] #57 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.simulationFunctionsFile)
[bt] #58 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.fun_46)
[bt] #59 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenCpp.translateModel)
[bt] #60 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(CodegenFMUCpp.translateModel)
[bt] #61 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so()
[bt] #62 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(Tpl.tplCallHandleErrors)
[bt] #63 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(Tpl.tplCallWithFailError3)
[bt] #64 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(Tpl.tplNoret3)
[bt] #65 /home/marsj/OpenModelica/build/bin/../lib/x86_64-linux-gnu/omc/libOpenModelicaCompiler.so(SimCodeMain.callTargetTemplatesFMU)

Where the only foreign call in CodegenCpp.lm_1582 seems to be listGet...

comment:5 by Rüdiger Franke, 7 years ago

The error message says "a call with 3 parameters", whereas listGet has 2 arguments!?

comment:6 by Martin Sjölund, 7 years ago

It's referring to "something called by Tpl.tplNoret3"

comment:7 by Rüdiger Franke, 7 years ago

Thank you for pointing to the source of the problem in comment:3. Commit https://github.com/OpenModelica/OMCompiler/commit/32ea34faacf8f95765976c7b0b7001f51246b075 prevents the template error.

Is there really no way to automatically get a better error message if listGet exceeds the size of the list?

Regarding comment:2: What is the meaning of -d vs +d? Could I find this somewhere in the docu?

Version 0, edited 7 years ago by Rüdiger Franke (next)

in reply to:  7 comment:8 by Martin Sjölund, 7 years ago

Replying to rfranke:

Is there really no way to automatically get a better error message if listGet exceeds the size of the list?
Not the complete stack trace, just the error and the location in the template file, something like:
"CodegenCpp.tpl:13220:listGet exceeds size of list"

By design, no (there is no Error module built-in in MetaModelica; it is a user library). You could write such a function yourself though. List.getWithErrorChecking(lst, n, sourceInfo())

The current error message appears lordly and is obviously wrong:
"which should not happen for functions called from within template code; templates preserve pure 'match'/non-failing semantics"

It is obviously correct; Susan by design assumes that there are no failing functions in the code. Even if an error occurs in the code (calling error() in a template), it will produce the entire file before printing the error-message and calling fail().

Regarding comment:2: What is the meaning of -d vs +d? Could I find this somewhere in the docu?

+d is the syntax forced on us due to the RML driver; it's been deprecated ever since we switched to the bootstrapped compiler and flags starting with - were possible to write (although the compiler never warned about the old style being used).

comment:9 by Rüdiger Franke, 7 years ago

Instead of saying "should not happen" ... "by design", a less lordly error message could read:

MetaModelica is not able to produce good error messages and provide good runtime performance at the same time. Please recompile with -d=susanDebug to get more details about the template error.

comment:10 by anonymous, 7 years ago

why not introducing a general approach like for C compilers:
+g verbose debug version, enable susanDebug, etc.
+O
debug
+O1 e.g. replace/overload all [] by dangerous_get_array, etc.

Last edited 7 years ago by Francesco Casella (previous) (diff)

comment:11 by Rüdiger Franke, 7 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.