This is an old revision of the document!
Each ARM exception is caused by a synchronous or asynchronous event and generally causes the processor to switch its state and jump to its proper exception vector.
Exception classes and their corresponding exception methods have to be specified in the configuration. Instances of these classes are never created and therefore the object constructors are defined as synthetic and will not be translated into code.
The code generator has to create a special exception stack frame.
The ARM architecture reserves 4 bytes of memory at each exception vector. This is just enough to place a branching instruction there which causes the processor to jump to the right exception code.
Each Java exception causes a ARM supervisor call exception. The supervisor call handler receives the thrown exception as a parameter in the first parameter register R0. The code generator has to make sure that this parameter is copied into R0 during the prolog of the program exception handler. The handler does the following:
The supervisor call handler can use volatile registers freely. It further uses a few nonvolatile registers. However, these must be saved onto the stack at the start of the method and must be restored at the end.
The following steps have to be taken:
When the unwinding of a method is done, the flow of control automatically returns to handleException, because we modified the stack frame accordingly.
The figure below gives an example for the handling of exceptions.