Add .gitignore.
[mono.git] / docs / mini-porting.txt
index acca411cdbb9e68b72e1ec2dde5e5382c8f22d4e..e629aff8df7561521a97aaff691886575f060763 100644 (file)
        *) mono_arch_instrument_epilog ()
                Functions needed to implement the profiling interface.
        
        *) mono_arch_instrument_epilog ()
                Functions needed to implement the profiling interface.
        
+* Testing the port
+
+    The JIT has a set of regression tests in *.cs files inside the
+    mini directory.
+
+    The usual method of testing a port is by compiling these tests on
+    another machine with a working runtime by typing 'make rcheck',
+    then copying TestDriver.dll and *.exe to the mini directory. The
+    tests can be run by typing:
+
+       ./mono --regression <exe file name>
+
+    The suggested order for working through these tests is the
+    following:
+
+       - basic.exe
+       - basic-long.exe
+       - basic-float.exe
+       - basic-calls.exe
+       - objects.exe
+       - arrays.exe
+       - exceptions.exe
+       - iltests.exe
+       - generics.exe  
        
 * Writing regression tests
 
        
 * Writing regression tests
 
        at this point, so the only parts which require changing are
        the arch dependent files.
 
        at this point, so the only parts which require changing are
        the arch dependent files.
 
-
-
-       
+* Function descriptors
+
+       Some ABIs, like those for IA64 and PPC64, don't use direct
+       function pointers, but so called function descriptors.  A
+       function descriptor is a short data structure which contains
+       at least a pointer to the code of the function and a pointer
+       to a GOT/TOC, which needs to be loaded into a specific
+       register prior to jumping to the function.  Global variables
+       and large constants are accessed through that register.
+
+       Mono does not need function descriptors for the JITted code,
+       but we need to handle them when calling unmanaged code and we
+       need to create them when passing managed code to unmanaged
+       code.
+
+       mono_create_ftnptr() creates a function descriptor for a piece
+       of generated code within a specific domain.
+
+       mono_get_addr_from_ftnptr() returns the pointer to the native
+       code in a function descriptor.  Never use this function to
+       generate a jump to a function without loading the GOT/TOC
+       register unless the function descriptor was created by
+       mono_create_ftnptr().
+
+       See the sources for IA64 and PPC64 on when to create and when
+       to dereference function descriptors.  On PPC64 function
+       descriptors for various generated helper functions (in
+       exceptions-ppc.c and tramp-ppc.c) are generated in front of
+       the code they refer to (see ppc_create_pre_code_ftnptr()).  On
+       IA64 they are created separately.
+
+* Emulated opcodes
+
+       Mini has code for emulating quite a few opcodes, most notably
+       operations on longs, int/float conversions and atomic
+       operations.  If an architecture wishes such an opcode to be
+       emulated, mini produces icalls instead of those opcodes.  This
+       should only be considered when the operation cannot be
+       implemented efficiently and thus the overhead occured by the
+       icall is not relatively large.  Emulation of operations is
+       controlled by #defines in the arch header, but the naming is
+       not consistent.  They usually start with MONO_ARCH_EMULATE_,
+       MONO_ARCH_NO_EMULATE_ and MONO_ARCH_HAVE_.
+
+* Generic code sharing
+
+       Generic code sharing is optional.  See the file
+       "generic-sharing" for information on how to support it on an
+       architecture.