dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnet ChangeLog engine/jitc_delegate.c engine/ji...


From: Klaus Treichel
Subject: [dotgnu-pnet-commits] pnet ChangeLog engine/jitc_delegate.c engine/ji...
Date: Sun, 04 Jun 2006 15:56:51 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    pnet
Changes by:     Klaus Treichel <ktreichel>      06/06/04 15:56:51

Modified files:
        .              : ChangeLog 
        engine         : jitc_delegate.c jitc_obj.c jitc_ptr.c 

Log message:
        È6-06-04  Klaus Treichel  <address@hidden>
        
                * engine/jitc_delegate.c: Fix a dumb bug in 
_ILJitDelegateInvokeCodeGen.
        
                * engine/jitc_obj.c: Add support for RVA static fields and 
pinvoke static
                fields. Replace jit_insn_add_relative with jit_insn_add.
        
                * engine/jitc_ptr.c: Replace jit_insn_add_relative with 
jit_insn_add.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3320&r2=1.3321
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_delegate.c?cvsroot=dotgnu-pnet&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_obj.c?cvsroot=dotgnu-pnet&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/pnet/engine/jitc_ptr.c?cvsroot=dotgnu-pnet&r1=1.10&r2=1.11

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3320
retrieving revision 1.3321
diff -u -b -r1.3320 -r1.3321
--- ChangeLog   3 Jun 2006 11:00:40 -0000       1.3320
+++ ChangeLog   4 Jun 2006 15:56:51 -0000       1.3321
@@ -1,3 +1,12 @@
+2006-06-04  Klaus Treichel  <address@hidden>
+
+       * engine/jitc_delegate.c: Fix a dumb bug in _ILJitDelegateInvokeCodeGen.
+
+       * engine/jitc_obj.c: Add support for RVA static fields and pinvoke 
static
+       fields. Replace jit_insn_add_relative with jit_insn_add.
+
+       * engine/jitc_ptr.c: Replace jit_insn_add_relative with jit_insn_add.
+
 2006-06-03  Klaus Treichel  <address@hidden>
 
        * engine/jitc.c: Use the on demand compilers for DelegateBeginInvoke and

Index: engine/jitc_delegate.c
===================================================================
RCS file: /sources/dotgnu-pnet/pnet/engine/jitc_delegate.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- engine/jitc_delegate.c      3 Jun 2006 11:00:40 -0000       1.3
+++ engine/jitc_delegate.c      4 Jun 2006 15:56:51 -0000       1.4
@@ -311,7 +311,6 @@
 {
        ILType *returnType = ILTypeGetParam(endInvokeSignature, 0); /* 0 == 
return type */
 
-
        returnType = ILTypeGetEnumType(returnType);
 
        if(ILType_IsPrimitive(returnType) || ILType_IsValueType(returnType))
@@ -322,8 +321,12 @@
                {
                        return 0;
                }
+
+               if(jitType != _IL_JIT_TYPE_VOID)
+               {
                jit_insn_return_ptr(func, returnObject, jitType);
        }
+       }
        else if (ILType_IsClass(returnType))
        {
                jit_insn_return(func, returnObject);
@@ -414,7 +417,7 @@
        jit_insn_label(func, &noTarget);
 #ifdef IL_JIT_THREAD_IN_SIGNATURE
        types[0] = jit_type_get_param(signature, 0);
-       args[0] = thread;
+       invokeArgs[0] = thread;
 #endif
        for(current = 0; current < argCount; ++current)
        {

Index: engine/jitc_obj.c
===================================================================
RCS file: /sources/dotgnu-pnet/pnet/engine/jitc_obj.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- engine/jitc_obj.c   3 Jun 2006 11:00:40 -0000       1.18
+++ engine/jitc_obj.c   4 Jun 2006 15:56:51 -0000       1.19
@@ -59,6 +59,79 @@
                                                                                
                (jit_nint)classStaticData);
 }
 
+#ifdef IL_CONFIG_PINVOKE
+
+/*
+ * Get the address of a PInvoke-imported field.
+ */
+static ILJitValue _ILJitGetPInvokeFieldAddress(ILJitFunction func,
+                                                                               
           ILField *field,
+                                                                               
           ILPInvoke *pinvoke)
+{
+       char *name;
+       void *handle;
+       void *symbol;
+       const char *symbolName;
+       ILJitValue ptr;
+
+       /* Resolve the module */
+       name = ILPInvokeResolveModule(pinvoke);
+       if(!name)
+       {
+               ptr = jit_value_create_nint_constant(func, _IL_JIT_TYPE_VPTR, 
0);
+               jit_insn_check_null(func, ptr);
+               return ptr;
+       }
+
+       /* Load the module into memory */
+       handle = ILDynLibraryOpen(name);
+       ILFree(name);
+       if(!handle)
+       {
+               ptr = jit_value_create_nint_constant(func, _IL_JIT_TYPE_VPTR, 
0);
+               jit_insn_check_null(func, ptr);
+               return ptr;
+       }
+
+       /* Resolve the symbol and resolve its address */
+       symbolName = ILPInvoke_Alias(pinvoke);
+       if(!symbolName)
+       {
+               symbolName = ILField_Name(field);
+       }
+       symbol = ILDynLibraryGetSymbol(handle, symbolName);
+
+       /* Check if the symbol could be resolved. */
+       if(!symbol)
+       {
+               ptr = jit_value_create_nint_constant(func, _IL_JIT_TYPE_VPTR, 
0);
+               jit_insn_check_null(func, ptr);
+               return ptr;
+       }
+       ptr = jit_value_create_nint_constant(func,
+                                                                               
 _IL_JIT_TYPE_VPTR,
+                                                                               
 (jit_nint)symbol);
+       return ptr;
+}
+
+#endif /* IL_CONFIG_PINVOKE */
+
+/*
+ * Get a ILJitValue with the address of a RVA static field.
+ */
+static ILJitValue _ILJitGetRVAAddress(ILJitFunction func,
+                                                                         
ILField *field)
+{
+       ILFieldRVA *fieldRVA = ILFieldRVAGetFromOwner(field);
+       ILUInt32 rva = ILFieldRVAGetRVA(fieldRVA);
+       /* Eventually the address should be computed on runtime. */
+       void *ptr = ILImageMapAddress(ILProgramItem_Image(field), rva);
+
+       return jit_value_create_nint_constant(func,
+                                                                               
  _IL_JIT_TYPE_VPTR,
+                                                                               
  (jit_nint)ptr);
+}
+
 /*
  * Get an ILJitValue with a pointer to the thread static slot.
  */
@@ -125,13 +198,17 @@
 static ILJitValue _ILJitLoadFieldAddress(ILJITCoder *coder, ILJitValue base,
                                                                                
 ILUInt32 offset, int mayBeNull)
 {
+       ILJitValue jitOffset = 
jit_value_create_nint_constant(coder->jitFunction,
+                                                                               
                                  _IL_JIT_TYPE_UINT32,
+                                                                               
                                  (jit_nint)offset);
+
        if(mayBeNull)
        {
                _ILJitCheckNull(coder, base);
        }
        if(offset != 0)
        {
-               return jit_insn_add_relative(coder->jitFunction, base, offset);
+               return jit_insn_add(coder->jitFunction, base, jitOffset);
        }
        else
        {
@@ -294,6 +371,34 @@
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
 
+#ifdef IL_CONFIG_PINVOKE
+       ILPInvoke *pinvoke;
+       if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+          (pinvoke = ILPInvokeFindField(field)) != 0)
+       {
+               /* Field that is imported via PInvoke */
+               ILJitValue ptr = 
_ILJitGetPInvokeFieldAddress(jitCoder->jitFunction,
+                                                                               
                          field,
+                                                                               
                          pinvoke);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "LoadStaticPinvokeField: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+               jitCoder->jitStack[jitCoder->stackTop] =
+                               _ILJitLoadField(jitCoder, ptr, fieldType, 0, 0);
+       }
+       else
+#endif
+       if((field->member.attributes & IL_META_FIELDDEF_HAS_FIELD_RVA) == 0)
+       {
        /* Output a call to the static constructor */
        _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
 
@@ -336,6 +441,25 @@
                jitCoder->jitStack[jitCoder->stackTop] =
                        _ILJitLoadField(jitCoder, ptr, fieldType, 0, 0);
        }
+       }
+       else
+       {
+               ILJitValue ptr = _ILJitGetRVAAddress(jitCoder->jitFunction, 
field);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "LoadRVAStaticField: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+                       jitCoder->jitStack[jitCoder->stackTop] =
+                               _ILJitLoadField(jitCoder, ptr, fieldType, 0, 0);
+       }
        JITC_ADJUST(jitCoder, 1);
 }
 
@@ -367,9 +491,41 @@
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
 
+#ifdef IL_CONFIG_PINVOKE
+       ILPInvoke *pinvoke;
+       if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+          (pinvoke = ILPInvokeFindField(field)) != 0)
+       {
+               /* Field that is imported via PInvoke */
+               ILJitValue ptr = 
_ILJitGetPInvokeFieldAddress(jitCoder->jitFunction,
+                                                                               
                          field,
+                                                                               
                          pinvoke);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "LoadStaticPivokeFieldAddr: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+                       jitCoder->jitStack[jitCoder->stackTop] =
+                               _ILJitLoadFieldAddress(jitCoder, ptr, 0, 0);
+
+               JITC_ADJUST(jitCoder, 1);
+               return;
+       }
+#endif
+
        /* Output a call to the static constructor */
        _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
 
+       /* Regular or RVA field? */
+       if((field->member.attributes & IL_META_FIELDDEF_HAS_FIELD_RVA) == 0)
+       {
        /* Regular or thread-static field? */
        if(!ILFieldIsThreadStatic(field))
        {
@@ -409,6 +565,25 @@
                jitCoder->jitStack[jitCoder->stackTop] =
                        _ILJitLoadFieldAddress(jitCoder, ptr, 0, 0);
        }
+       }
+       else
+       {
+               ILJitValue ptr = _ILJitGetRVAAddress(jitCoder->jitFunction, 
field);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "LoadRVAStaticFieldAddr: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+                       jitCoder->jitStack[jitCoder->stackTop] =
+                               _ILJitLoadFieldAddress(jitCoder, ptr, 0, 0);
+       }
        JITC_ADJUST(jitCoder, 1);
 }
 
@@ -441,10 +616,39 @@
 {
        ILJITCoder *jitCoder = _ILCoderToILJITCoder(coder);
        ILJitValue value = jitCoder->jitStack[jitCoder->stackTop - 1];
+#ifdef IL_CONFIG_PINVOKE
+       ILPInvoke *pinvoke;
+#endif
 
        /* Output a call to the static constructor */
        _ILJitCallStaticConstructor(jitCoder, ILField_Owner(field), 1);
 
+#ifdef IL_CONFIG_PINVOKE
+       if((field->member.attributes & IL_META_FIELDDEF_PINVOKE_IMPL) != 0 &&
+          (pinvoke = ILPInvokeFindField(field)) != 0)
+       {
+               /* Field that is imported via PInvoke */
+               ILJitValue ptr = 
_ILJitGetPInvokeFieldAddress(jitCoder->jitFunction,
+                                                                               
                          field,
+                                                                               
                          pinvoke);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "StoreStaticPinvokeField: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+                       _ILJitStoreField(jitCoder, ptr, value, fieldType, 0, 0);
+       }
+       else
+#endif
+       if((field->member.attributes & IL_META_FIELDDEF_HAS_FIELD_RVA) == 0)
+       {
        /* Regular or thread-static field? */
        if(!ILFieldIsThreadStatic(field))
        {
@@ -482,6 +686,24 @@
        #endif
                _ILJitStoreField(jitCoder, ptr, value, fieldType, 0, 0);
        }
+       }
+       else
+       {
+               ILJitValue ptr = _ILJitGetRVAAddress(jitCoder->jitFunction, 
field);
+
+               #if !defined(IL_CONFIG_REDUCE_CODE) && 
!defined(IL_WITHOUT_TOOLS)
+                       if (jitCoder->flags & IL_CODER_FLAG_STATS)
+                       {
+                               ILMutexLock(globalTraceMutex);
+                               fprintf(stdout,
+                                       "StoreRVAStaticField: %s.%s\n", 
+                                       ILClass_Name(ILField_Owner(field)),
+                                       ILField_Name(field));
+                               ILMutexUnlock(globalTraceMutex);
+                       }
+               #endif
+                       _ILJitStoreField(jitCoder, ptr, value, fieldType, 0, 0);
+       }
        JITC_ADJUST(jitCoder, -1);
 }
 

Index: engine/jitc_ptr.c
===================================================================
RCS file: /sources/dotgnu-pnet/pnet/engine/jitc_ptr.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- engine/jitc_ptr.c   1 May 2006 17:30:50 -0000       1.10
+++ engine/jitc_ptr.c   4 Jun 2006 15:56:51 -0000       1.11
@@ -25,7 +25,11 @@
  */
 static ILJitValue GetArrayBase(ILJITCoder *coder, ILJitValue array)
 {
-       return jit_insn_add_relative(coder->jitFunction, array, 
sizeof(System_Array));
+       ILJitValue baseOffset = 
jit_value_create_nint_constant(coder->jitFunction,
+                                                                               
                                   _IL_JIT_TYPE_UINT32,
+                                                                               
                                   (jit_nint)(sizeof(System_Array)));
+
+       return jit_insn_add(coder->jitFunction, array, baseOffset);
 }
 
 /*




reply via email to

[Prev in Thread] Current Thread [Next in Thread]