Hi, Exception support requires implementing: - the opcodes like throw, start_handler, endfinally - the functions in exceptions-<ARCH>.c - mono_arch_emit_exceptions ().
As usual, the best documentation is the code of the other backends, but there is some documentation in mono/docs/exception-handling.txt. I suggest going throu the tests in exceptions.cs in the order they are in the file, and trying to implement the support needed by them. LMF handling can be done at a later stage since it is only needed by some later tests. Zoltan On 5/4/06, Sergey Tikhonov <[EMAIL PROTECTED]> wrote:
Hello Zoltan, >Either you should emit code to move from R0 to ins->dreg, or (better), modify >your cpu-alpha.md file and the register allocator macros in >mini-alpha.h to force >the local register allocator to allways allocate the dreg of the call >instruction to >R0. This way the reg allocator will emit the move instruction if it is >neccesary. > >Here is what a call instruction looks like in cpu-pentium.md: > >call: dest:a clob:c len:17 > >And the corresponding macro (only an example): >#define MONO_ARCH_INST_FIXED_REG(desc) ((desc == 'a') ? X86_EAX : -1) > > > >>Using different options triggered some interesting code I had to >>implement. My question is what is the difference between local and global >>registers? As I undertood the local registers could be used temporary in >>basic blocks, the global registers are used during optimizations. >>Can I define all my local registers as global ones? It seems that they >>couldn't mixed. >> >> > >Global registers are used during global register allocation. They should be >distinct from the set of local registers. mono_arch_get_global_int_regs () >returns the list of registers that should be used for global allocation. These >registers are usually the 'callee-saved' registers defined by the platform ABI. >The global register allocator will set cfg->used_int_regs if needed. I suggest >returning an empty list from get_global_int_regs () until all tests are running, >so you have a large set of regression tests which you can use to debug the >inevitable problems which will arose when some variables are allocated to >global registers. > > After some hacking I was able to run "Hello world" program. :) It still crashes somewhere at final stage of program rundown, but surely it did a lot before that. :) Now I have to implement "hardest" part - handling of exceptions. I need some hints here. :) - Of couse I am getting segfaults. For now I return -1 in mono_arch_find_jit_info. It seems to work in most cases - I am getting stack trace. But I guess there is not enough information to do correct unwinding and the VM segfaults again and goes to the loop of segfaults. If you could shed light here - it would be great. - Do I have to implement LMF handling to do correct unwinding? I don't have any LMF frames right now (it seems that I would have to save a lot of information in stack). - I don't have implemented any of throw, finally, call_handler - program exceptions. What are the requirements to implement it in general? Thank you, -- Sergey Tikhonov Solvo Ltd. Saint-Petersburg, Russia [EMAIL PROTECTED]
_______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list