This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to prevent OT 8 from generating an LJMP

If Optimize 8 (Reuse Common Entry Code) detects void MyFunc() as the last statement within void OuterFunc() (for example), it will produce an LJMP to MyFunc() rather than an LCALL. (see examples)

Nice optimization, but MyFunc() is part of a library written in assembly and by design reuqires a call rather than a jump. I tried surrounding its prototype with a #pragma OT (7), but that doesn't work. Surrounding OuterFunc() with the OT (7) pragma works, but that's a bit cumbersome and runs the risk of someone forgetting to do it.

void OuterFunc( void )
{
   MyFunc();   // Compiler generates LJMP.  Not good :o(
}


#pragma OT (7)
void OuterFunc( void )
{
   MyFunc();   // Compiler now generates the necessary
               // LCALL, but programmers WILL forget to use
               // this construct and will blow the whistle
               // when their software bombs.
}
#pragma OT (8)

0