* src/vm/jit/arm/codegen.c (codegen_emit): Use
authortwisti <none@none>
Fri, 11 May 2007 20:35:16 +0000 (20:35 +0000)
committertwisti <none@none>
Fri, 11 May 2007 20:35:16 +0000 (20:35 +0000)
CODEGEN_CRITICAL_SECTION_* macros.

* src/vm/jit/arm/linux/md-os.c (thread_restartcriticalsection):
Renamed to md_critical_section_restart.

src/vm/jit/arm/codegen.c
src/vm/jit/arm/linux/md-os.c

index 85e783daf1278159fd011071a13926a76890c2ee..acb817d7d6a8d69103491897cc8bb4f1bbbeefe2 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7823 2007-04-25 20:03:04Z twisti $
+   $Id: codegen.c 7900 2007-05-11 20:35:16Z twisti $
 
 */
 
@@ -2429,7 +2429,6 @@ bool codegen_emit(jitdata *jd)
                        break;
 
                case ICMD_CHECKCAST:  /* ..., objectref ==> ..., objectref            */
-                                     /* val.a: (classinfo*) superclass               */
 
                        if (!(iptr->flags.bits & INS_FLAG_ARRAY)) {
                                /* object type cast-check */
@@ -2446,9 +2445,9 @@ bool codegen_emit(jitdata *jd)
                                superindex = super->index;
                        }
 
-#if defined(ENABLE_THREADS)
-                       codegen_threadcritrestart(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+                               if ((super == NULL) || !(super->flags & ACC_INTERFACE))
+                                       CODEGEN_CRITICAL_SECTION_NEW;
+
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
 
                        /* if class is not resolved, check which code to call */
@@ -2530,17 +2529,17 @@ bool codegen_emit(jitdata *jd)
 
                                M_LDR_INTERN(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
                                M_DSEG_LOAD(REG_ITMP3, disp);
-#if defined(ENABLE_THREADS)
-                               codegen_threadcritstart(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+
+                               CODEGEN_CRITICAL_SECTION_START;
+
                                M_LDR_INTERN(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval));
                                M_LDR_INTERN(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, baseval));
                                M_SUB(REG_ITMP2, REG_ITMP2, REG_ITMP3);
                                M_DSEG_LOAD(REG_ITMP3, disp);
                                M_LDR_INTERN(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, diffval));
-#if defined(ENABLE_THREADS)
-                               codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+
+                               CODEGEN_CRITICAL_SECTION_END;
+
                                M_CMP(REG_ITMP2, REG_ITMP3);
                                emit_classcast_check(cd, iptr, BRANCH_UGT, 0, s1);
 
@@ -2594,7 +2593,7 @@ bool codegen_emit(jitdata *jd)
                        break;
 
                case ICMD_INSTANCEOF: /* ..., objectref ==> ..., intresult            */
-                                     /* val.a: (classinfo*) superclass               */
+
                        {
                        classinfo *super;
                        s4         superindex;
@@ -2608,11 +2607,12 @@ bool codegen_emit(jitdata *jd)
                                superindex = super->index;
                        }
 
-#if defined(ENABLE_THREADS)
-                       codegen_threadcritrestart(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+                       if ((super == NULL) || !(super->flags & ACC_INTERFACE))
+                               CODEGEN_CRITICAL_SECTION_NEW;
+
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
                        if (s1 == d) {
                                M_MOV(REG_ITMP1, s1);
                                s1 = REG_ITMP1;
@@ -2707,15 +2707,15 @@ bool codegen_emit(jitdata *jd)
 
                                M_LDR_INTERN(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
                                M_DSEG_LOAD(REG_ITMP2, disp);
-#if defined(ENABLE_THREADS)
-                               codegen_threadcritstart(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+
+                               CODEGEN_CRITICAL_SECTION_START;
+
                                M_LDR_INTERN(REG_ITMP1, REG_ITMP1, OFFSET(vftbl_t, baseval));
                                M_LDR_INTERN(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, baseval));
                                M_LDR_INTERN(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, diffval));
-#if defined(ENABLE_THREADS)
-                               codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
-#endif
+
+                               CODEGEN_CRITICAL_SECTION_END;
+
                                M_SUB(REG_ITMP1, REG_ITMP1, REG_ITMP3);
                                M_CMP(REG_ITMP1, REG_ITMP2);
                                /* If d == REG_ITMP2, then it's destroyed */
index d37c191c477d0bbc8dff8cf40da857bbf73a7099..4ed764b31f2e3ba2478642c73235faba29df7fda 100644 (file)
@@ -200,24 +200,30 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p)
 #endif
 
 
-/* thread_restartcriticalsection ***********************************************
+/* md_critical_section_restart *************************************************
 
-   TODO: document me
+   Search the critical sections tree for a matching section and set
+   the PC to the restart point, if necessary.
 
 *******************************************************************************/
 
 #if defined(ENABLE_THREADS)
-void thread_restartcriticalsection(ucontext_t *_uc)
+void md_critical_section_restart(ucontext_t *_uc)
 {
        scontext_t *_sc;
-       void       *critical;
+       u1         *pc;
+       u1         *npc;
 
        _sc = &_uc->uc_mcontext;
 
-       critical = critical_find_restart_point((void *) _sc->arm_pc);
+       pc = (u1 *) _sc->arm_pc;
+
+       npc = critical_find_restart_point(pc);
 
-       if (critical)
-               _sc->arm_pc = (ptrint) critical;
+       if (npc != NULL) {
+               log_println("md_critical_section_restart: pc=%p, npc=%p", pc, npc);
+               _sc->arm_pc = (ptrint) npc;
+       }
 }
 #endif