better handling of for name
[cacao.git] / jit / parseRT.c
index 6b5b618fc0444ceda411cf181478f046e70666c0..b6512b89f9c656bcfddb8f355ca2981143fd35eb 100644 (file)
 
    Authors: Carolyn Oates
 
-   $Id: parseRT.c 903 2004-01-22 23:00:32Z carolyn $
+   $Id: parseRT.c 911 2004-02-04 11:42:41Z carolyn $
+
+Changes:
+opcode put into functions
+changed class_findmethod class_fetchmethod
 
 */
 
 
 #include "parseRT.h"
+
  
 /*------------ global variables -----------------------------------------*/
 #define MAXCALLGRAPH 5000
 
 #include "parseRTflags.h"
 
+
+bool NATIVE = false;  // Dez version chasing Native problems
+
+int callgraphAddedBy[MAXCALLGRAPH];   // add comment
+
 int methRT = 0;
 int methRTlast = -1;
 int methRTmax = MAXCALLGRAPH;
 methodinfo **callgraph;
 /*methodinfo *callgraph[MAXCALLGRAPH];*/ 
-
+       
  
 int methXTA = 0;            
 int methXTAlast = -1;
@@ -54,10 +64,13 @@ methodinfo **XTAcallgraph;
 static bool nativecallcompdone=0 ;
 
 static bool firstCall= true;
+static bool parse1 = true;
 static bool AfterMain = false;
 static FILE *rtMissed;   /* Methods missed during RTA parse of Main  */
 /*   so easier to build dynmanic calls file */
+static FILE *appldynm;  /* Methods dynamically loaded by application */
 
+static utf *utf_OBJECT;   /*  utf_new_char("Object"); */
 static utf *utf_MAIN;   /*  utf_new_char("main"); */
 static utf *INIT    ;   /*  utf_new_char("<init>"); */
 static utf *CLINIT  ;   /*  utf_new_char("<clinit>"); */
@@ -93,7 +106,7 @@ bool rtaSubUsed(classinfo *class, methodinfo *meth) {
 
        for (subs=class->sub; subs != NULL; subs = subs->nextsub) {
                if (subs->classUsed == USED) {
-                       if (class_findmethod(class, meth->name, meth->descriptor) == NULL)
+                       if (class_findmethod_w(class, meth->name, meth->descriptor,"rtaSubUsed") == NULL)
                                return false;
                        else    
                                return true;
@@ -201,7 +214,7 @@ void rtaMarkSubs(classinfo *class, methodinfo *topmethod) {
 /*   with the same method name                                                   */
 /*                                                                               */
 /*-------------------------------------------------------------------------------*/
-void addMarkedMethods(classinfo *ci) {
+void rtaAddMarkedMethods(classinfo *ci) {
        int ii,jj,mm;
 
        /* add marked methods to callgraph */ 
@@ -214,7 +227,8 @@ void addMarkedMethods(classinfo *ci) {
                        ADDTOCALLGRAPH(mi)  
                        }
                else {
-       
+// from Dez                         if (NATIVE == true) { printf("NOT MARKED: "); method_display(mi);}
+
                        for (jj=0; jj < ci -> interfacescount; jj++) {
                                classinfo *ici = ci -> interfaces [jj];
                                /*  use resolve method....!!!! */
@@ -253,8 +267,8 @@ xtainfo *xtainfoInit(methodinfo *m)
        m->xta->calls         = NULL;
        m->xta->calledBy      = NULL;
 
-       m->xta->marked        = NULL;
-       /*m ->xta->markedBy     = NULL */
+       m->xta->marked        = NULL; /* comment out*/
+       m ->xta->markedBy     = NULL; 
        m->xta->fldsUsed      = NULL;
        /*m ->xta->interfaceCalls    = NULL*/
        m->xta->chgdSinceLastParse = false;
@@ -443,8 +457,13 @@ void xtaAddCallEdges(methodinfo *mi, s4 monoPoly) {
        if (mi->xta->XTAmethodUsed  != USED) {  /* if static method not in callgraph */
                mi->xta->XTAmethodUsed = USED;
                if (!(mi->flags & ACC_ABSTRACT)) { 
-                       XTAcallgraph[++methXTAlast] = mi;
-                                               XTAPRINTcallgraph2 
+                       if (mi->methodUsed != USED) {
+                               XTAcallgraph[++methXTAlast] = mi;
+                               mi->methodUsed = USED;
+                                        /*RTprint*/ if (pClassHeir >= 1) {
+                                                XTAPRINTcallgraph2
+                                                }
+                                }
                        }
 
                }
@@ -474,10 +493,10 @@ bool xtaSubUsed(classinfo *class, methodinfo *meth, classSetNode *subtypesUsedSe
        for (subs=class->sub; subs != NULL; subs = subs->nextsub) {
                /* if class used */
                if (inSet(subtypesUsedSet,subs)) {
-                       if (class_findmethod(class, meth->name, meth->descriptor) == NULL) 
+                       if (class_findmethod_w(class, meth->name, meth->descriptor, "xtaSubUsed") == NULL) 
                                return false;
                        else    {
-                               if (class_findmethod(subs, meth->name, meth->descriptor) == NULL) 
+                               if (class_findmethod_w(subs, meth->name, meth->descriptor, "xtaSubUsed") == NULL) 
                                        return true;
                                }
                }
@@ -503,13 +522,12 @@ void xtaMarkMethod(classinfo *class, methodinfo *topmethod, classSetNode *subtyp
        submeth = class_resolvemethod(class, name, descriptor);
 
        /***/
-               printf(" def: "); utf_display(submeth->class->name);fflush(stdout);
-               method_display(submeth);
+                printf(" def: "); utf_display(submeth->class->name); printf("\n");fflush(stdout);
        /****/
 
        /* Basic checks */
        if (submeth == NULL)
-        panic("parse XTA: Method not found in class hierarchy");
+               panic("parse XTA: Method not found in class hierarchy");
        if (submeth->xta == NULL) 
                submeth->xta = xtainfoInit(submeth);
 
@@ -521,18 +539,22 @@ void xtaMarkMethod(classinfo *class, methodinfo *topmethod, classSetNode *subtyp
 
         /*--- Method defined in class -----------------------------*/
                if (inSet(subtypesUsedSet,submeth->class)) {
-printf("in set submeth->class:"); utf_display(submeth->class->name);
                        xtaAddCallEdges(submeth,POLY);  
                }
                else    {
                        if (subtypesUsedSet != NULL) {  
                                if (xtaSubUsed (class,submeth,subtypesUsedSet)) {
-printf("xtaSubUsed "); 
                                        xtaAddCallEdges(submeth,POLY);
+                                       return; //Dez
                                }
-                       }
-                       else    {
-                               rt_method->xta->marked = add2MethSet(rt_method->xta->marked, submeth);
+                        submeth->xta->markedBy = add2MethSet(submeth->xta->markedBy,rt_method);
+                                /****
+                                        printf("\t(defd) Added to MarkBy Set\n"); fflush(stdout);
+                                        utf_display(submeth->class->name); printf("."); fflush(stdout);
+                                        method_display(submeth);
+                                        printMethodSet(submeth->xta->markedBy);
+                                ****/
+
                        }
                }
        }
@@ -540,8 +562,14 @@ printf("xtaSubUsed ");
         /*--- Method NOT defined in class -----------------------------*/
                if (!(inSet(subtypesUsedSet,submeth->class) )){  /* class with method def     is not used */
                        if (!(inSet(subtypesUsedSet,class) )) { /* class currently resolving is not used */ 
-                               rt_method->xta->marked = add2MethSet(rt_method->xta->marked, submeth);
-                               /*printf("Added to marked Set: "); fflush(stdout);printMethodSet(rt_method->xta->marked);*/
+                                submeth->xta->markedBy = add2MethSet(submeth->xta->markedBy,rt_method);
+                                submeth->xta->markedBy = add2MethSet(submeth->xta->markedBy,rt_method);
+                                /****
+                                        printf("\t(^^defd) Added to MarkBy Set\n"); fflush(stdout);
+                                        utf_display(submeth->class->name); printf("."); fflush(stdout);
+                                        method_display(submeth);
+                                        printMethodSet(submeth->xta->markedBy);
+                                ****/
                        }
                }
                if ( (inSet(subtypesUsedSet,submeth->class))  /* class with method def     is used */
@@ -568,11 +596,58 @@ void xtaMarkSubs(classinfo *class, methodinfo *topmethod, classSetNode *subtypes
                }
 }
 
+/*-------------------------------------------------------------------------------*/
+/* Add Marked methods for input class ci                                         */
+/* Add methods with the same name and descriptor as implemented interfaces       */
+/*   with the same method name                                                   */
+/*                                                                               */
+/*-------------------------------------------------------------------------------*/
+void xtaAddMarkedMethods(classinfo *ci) {
+        int ii,jj,mm;
+
+        /* add marked methods to callgraph */
+        for (ii=0; ii<ci->methodscount; ii++) {
+                methodinfo *mi = &(ci->methods[ii]);
+          if (mi->xta != NULL) {
+                if (mi->xta->markedBy != NULL) {
+                        methSetNode *mcnode;
+                        for (mcnode = mi->xta->markedBy->head; mcnode  != NULL; mcnode  = mcnode ->nextmethRef) {
+                                methodinfo *mc = mcnode->methRef;
+                                if (pWhenMarked >= 1) {
+                                        printf("ADDED a method that was MARKED\n");
+                                        }
+                                xtaAddCallEdges(mi,POLY);
+                                }
+                        }
+                {
+                        for (jj=0; jj < ci -> interfacescount; jj++) {
+                                classinfo *ici = ci -> interfaces [jj];
+                                /*  use resolve method....!!!! */
+                                if (ici -> classUsed != NOTUSED) {
+                                        for (mm=0; mm< ici->methodscount; mm++) {
+                                                methodinfo *imi = &(ici->methods[mm]);
+                                                if (imi->xta != NULL) {
+                                                if      ((imi->xta->XTAmethodUsed == USED)
+                                                           &&    ( (imi->name == mi->name)
+                                                           &&      (imi->descriptor == mi->descriptor))) {
+                                                        if (pWhenMarked >= 1)
+                                                                printf("ADDED a method that was used by an interface\n");
+                                                        xtaAddCallEdges(mi,POLY);
+                                                        }
+                                                        }
+                                                }
+                                        }
+                                }
+                        }
+                  }
+                }
+}
+
 /*-------------------------------------------------------------------------------*/
 /* Both RTA and XTA */
 /*-------------------------------------------------------------------------------*/
 
-int addClassInit(classinfo *ci) {
+int addClassInit(classinfo *ci, bool clinits, bool finalizes, bool addmark) {
        /* CHANGE to a kind of table look-up for a list of class/methods (currently 3)
         */
 
@@ -583,80 +658,79 @@ int addClassInit(classinfo *ci) {
        int m, m1=-1, m2=-1, mf=-1;
        methodinfo *mi;
 
-       for  (m=0; m < ci->methodscount; m++) {
-               /*<clnit> class init method */
-               if (ci->methods[m].name == CLINIT) {
-                       m1=m;
-               }
-               /* Special case: System class has an extra initializer method */
-               if        ((utf_java_lang_system == ci->name) 
-                          && (utf_initializeSystemClass == ci->methods[m].name)) {
-                       m2=m;  
-        }
-
-               /* Finalize methods */
-               if    ((ci->methods[m].name == FINALIZE) 
-                          && (ci->name != utf_java_lang_Object)) {
-                       mf=m;  
-        }
-
-    }
-
-       if (m1 >= 0) { /* No <clinit>  available - ignore */  
+       if (clinits) { /* No <clinit>  available - ignore */  
 
                /* Get clinit methodinfo ptr */
-               mi = class_fetchmethod (ci,ci->methods[m1].name , NULL); 
-
-               /*--- RTA ---*/
-               if ( mi->methodUsed != USED) {
-                       mi->class->classUsed = PARTUSED;  
-                       ADDTOCALLGRAPH(mi)  
+               if ((mi = class_resolvemethod(ci,CLINIT, EMPTY_DESC)) !=NULL) {
+                       if (mi->class != ci) {
+                               printf("WARNING:::::<clinit> method not found in class requested: ");
+                               utf_display(ci->name); printf(" found in:"); utf_display(mi->class->name);
+                               printf("\n");
+                               }
+                       /*--- RTA ---*/
+                       if ( mi->methodUsed != USED) {
+                               mi->class->classUsed = PARTUSED;  
+                               ADDTOCALLGRAPH(mi)  
                                }
 
-               /*--- XTA ---*/
-               if ((XTAOPTbypass) || (opt_xta)) {
-                       xtaAddCallEdges(mi,MONO); 
+                       /*--- XTA ---*/
+                       if ((XTAOPTbypass) || (opt_xta)) {
+                               xtaAddCallEdges(mi,MONO); 
+                               }
+                       }
+               else    {
+                       printf("class=");utf_display(ci->name);
+                       printf(" super="); 
+                       if (ci->super != NULL)
+                               utf_display(ci->super->name);
+                       else
+                               printf("NULL");
+                       if ( (ci->super->name != utf_OBJECT) && (ci->name != utf_OBJECT)  )
+                               panic("<clinit> method not found");
+                       }
                }
 
-       }
-
-       if (mf >= 0) {   
+       if (finalizes) {   
 
                /* Get finalize methodinfo ptr */
-               mi = class_fetchmethod (ci,ci->methods[mf].name , NULL); 
-
-               /*--- RTA ---*/
-               if ( mi->methodUsed != USED) {
-                       mi->class->classUsed = PARTUSED;  
-                       ADDTOCALLGRAPH(mi)  
+               if ( (mi = class_findmethod (ci,FINALIZE, EMPTY_DESC)) != NULL) { 
+                       /*--- RTA ---*/
+                       if ( mi->methodUsed != USED) {
+                               mi->class->classUsed = PARTUSED;  
+                               ADDTOCALLGRAPH(mi)  
                                }
 
-               /*--- XTA ---*/
-               if ((XTAOPTbypass) || (opt_xta)) {
-                       xtaAddCallEdges(mi,MONO); 
+                       /*--- XTA ---*/
+                       if ((XTAOPTbypass) || (opt_xta)) {
+                               xtaAddCallEdges(mi,MONO); 
+                               }
+                       }
                }
-       }
 
        /*Special Case for System class init:  
        add java/lang/initializeSystemClass to callgraph */
-       if (m2 >= 0) {
+       if (class->name == utf_initializeSystemClass) {
                /* Get clinit methodinfo ptr */
-               mi = class_fetchmethod (ci,ci->methods[m2].name , NULL); 
-
-               /*--- RTA ---*/
-               if ( mi->methodUsed != USED) {
-                       mi->class->classUsed = PARTUSED;
-                       ADDTOCALLGRAPH(mi)  
+               if ((mi = class_findmethod (ci,utf_initializeSystemClass, EMPTY_DESC)) != NULL) {
+                       /*--- RTA ---*/
+                       if ( mi->methodUsed != USED) {
+                               mi->class->classUsed = PARTUSED;
+                               ADDTOCALLGRAPH(mi)  
                                }
 
-               /*--- XTA ---*/
-               if ((XTAOPTbypass) || (opt_xta)) {
-                       xtaAddCallEdges(mi,MONO);
+                       /*--- XTA ---*/
+                       if ((XTAOPTbypass) || (opt_xta)) {
+                               xtaAddCallEdges(mi,MONO);
+                               }
+                       }
+               }
+       if (addmark) {
+               /* add marked methods to callgraph */ 
+               if ((XTAOPTbypass) || (opt_xta))
+                       xtaAddMarkedMethods(ci);
+               else
+                       rtaAddMarkedMethods(ci);
                }
-       }
-
-       /* add marked methods to callgraph */ 
-       addMarkedMethods(ci); 
                
        return m;
 } 
@@ -804,21 +878,27 @@ printf("==%i==%i\n",ici->methodscount,mm);
                                                /* Mark this method used in the (used) implementing class &its subclasses */
                                                printf("xMAY ADD methods that was used by an interface\n"); fflush(stdout);
                                                }
-printf("calledBy set ="); fflush(stdout);
-printMethodSet(imi->xta->calledBy);
+                                        if (pWhenMarked >= 1) {
+                                                printf("calledBy set ="); fflush(stdout);
+                                                printMethodSet(imi->xta->calledBy);
+                                                }
                                if (imi->xta->calledBy != NULL) { 
                                        /* for each calledBy method */
                                        for (   mCalledBy = imi->xta->calledBy->head; 
                                                mCalledBy != NULL; 
                                                mCalledBy = mCalledBy->nextmethRef) {
+                                               if (pWhenMarked >= 1) {
                                                                printf("xtaMarkSubs(");
                                                                utf_display(ci->name); printf("."); fflush(stdout);
                                                                method_display(imi);
                                                                printf("mCalledBy method class set BEFORE\n"); fflush(stdout);
                                                                printSet(mCalledBy->methRef->xta->XTAclassSet->head);
+                                               }
                                                xtaMarkSubs(ci,imi,mCalledBy->methRef->xta->XTAclassSet->head);
+                                                       if (pWhenMarked >= 1) {
                                                                printf("mCalledBy method class set AFTER \n"); fflush(stdout);
                                                                printSet(mCalledBy->methRef->xta->XTAclassSet->head);
+                                                       }
                                                }
                                        }
                                }
@@ -843,7 +923,9 @@ void xtaMarkInterfaceSubs(methodinfo *mi) {
                }
 
        /* add interface class to list kept in Object */
-printf("Marking Interface Method: "); fflush(stdout);
+                               if (pWhenMarked >= 1) {
+                                       printf("Marking Interface Method: "); fflush(stdout);
+                                       }
        xtaAddCallEdges(mi,POLY);       
 
        subs =  mi->class->impldBy; 
@@ -867,9 +949,11 @@ printf("Marking Interface Method: "); fflush(stdout);
                                                intersectSubtypesWithSet
                                                        (subs->classType, rt_method->xta->XTAclassSet->head);
 
+                                                       if (pWhenMarked >= 1) {
                                                                /*RTAprint*/ printf(" \nXTA subtypesUsedSet: ");
                                                                /*RTAprint*/ fflush(stdout);
                                                                /*RTAprint*/ printSet(subtypesUsedSet);
+                                                       }
                                xtaMarkSubs(subs->classType, mi, subtypesUsedSet);
                                }
                        }
@@ -877,28 +961,6 @@ printf("Marking Interface Method: "); fflush(stdout);
                }
 }
 /*-------------------------------------------------------------------------------*/
-void xxxtaMarkInterfaceSubs(methodinfo *mCalled) {
-       classSetNode * Si;
-       
-       /* for every class that implements the interface of the method called */
-       for (Si = mCalled->class->impldBy; Si != NULL; Si = Si->nextClass) {
-               /* add all definitions of this method for this interface */
-               methodinfo *submeth;
-               classSetNode *subtypesUsedSet = NULL;
-
-               submeth = class_findmethod(Si->classType, mCalled->name, mCalled->descriptor); 
-               if (submeth == NULL) { /* search up the heir - ignore for now!!! */
-                       submeth = class_resolvemethod(Si->classType, mCalled->name, mCalled->descriptor);
-                        }
-
-               if (rt_method->xta->XTAclassSet != NULL)
-                       subtypesUsedSet = intersectSubtypesWithSet(Si->classType, rt_method->xta->XTAclassSet->head);
-                               
-                               printf(" \nXTA subtypesUsedSet: "); fflush(stdout);
-                               printSet(subtypesUsedSet);
-                       xtaMarkSubs(Si->classType, submeth, subtypesUsedSet);   
-       }
-}
 
 /*-------------------------------------------------------------------------------*/
 bool xtaAddFldClassTypeInfo(fieldinfo *fi) {
@@ -1155,6 +1217,186 @@ void  xtaMethodCalls_and_sendReturnType()
        }
 }
 
+/*-------------------------------------------------------------------------------*/
+/* -- Processes STATIC  & PRIVATE methods
+
+/* -- called for INVOKESTATIC, INVOKESPECIAL - PRIVATE and
+/*    STATIC / PRIVATE methods used by NATIVE methods
+/*-------------------------------------------------------------------------------*/
+
+// Dez Version but gives too many Missed
+void invokestatic2( methodinfo *mi) {
+
+mi->class->classUsed = PARTUSED;
+/*-- RTA --*/
+addClassInit(mi->class, true, true, true);
+                RTAPRINT04invokestatic1
+
+if (opt_rt) {
+        ADDTOCALLGRAPH(mi)
+        } /* end RTA */
+
+/*-- XTA --*/
+if ((XTAOPTbypass) || (opt_xta)) {
+        mi->class->classUsed = PARTUSED;
+        rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,mi->class);
+        xtaAddCallEdges(mi,MONO);
+        } /* end XTA */
+}
+
+
+
+//// from just RTA version before Dez changes
+void invokestatic(methodinfo *mi){
+               RTAPRINT04invokestatic1
+if (mi->class->classUsed == NOTUSED) {
+       mi->class->classUsed = USED;
+                       RTAPRINT05invokestatic2
+       }
+       addClassInit(mi->class,true, true, true);
+
+       if (opt_rt) {
+               ADDTOCALLGRAPH(mi)  
+               } /* end RTA */
+       /*-- XTA --*/
+       if ((XTAOPTbypass) || (opt_xta)) {
+               xtaAddCallEdges(mi,MONO); 
+       } /* end XTA */
+}
+
+
+/*-------------------------------------------------------------------------------*/
+/* -- Processes <INIT> methods
+
+/* -- called for INVOKESPECIAL - <init> and
+/*    <init> methods used by NATIVE methods
+/*-------------------------------------------------------------------------------*/
+
+void initMethods(methodinfo *mi) {
+
+classinfo  *ci = mi->class;
+
+/* new class so add marked methods */
+if (opt_rt) {
+       if (( mi->methodUsed != USED) || (mi->class->classUsed == PARTUSED))  {
+               /*--- process NORMAL <init> method ---------------------------------------------*/
+               if ( mi->methodUsed != USED) {
+                       /* Normal <init> 
+                       - mark class as USED and <init> to callgraph */
+
+                       /*-- RTA --*/
+//     addClassInit(mi->class,true, true, false);
+                       ci->classUsed = USED;
+                       rtaAddMarkedMethods(ci);  /* add to callgraph marked methods */
+                                       RTAPRINT06Binvoke_spec_init
+                       rtaAddUsedInterfaceMethods(ci); 
+                       ADDTOCALLGRAPH(mi)  
+                       }
+               }       
+       }
+
+/*-- XTA --*/
+if ((XTAOPTbypass) || (opt_xta)) { 
+       if (mi->xta == NULL) {
+               mi->xta = xtainfoInit(mi);
+               }
+       if ((mi->xta->XTAmethodUsed != USED) || (mi->class->classUsed == PARTUSED)) {
+               ci->classUsed = USED;
+               rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,ci ); 
+               xtaAddMarkedMethods(ci);  /* add to callgraph marked methods */
+               xtaAddUsedInterfaceMethods(ci); 
+               xtaAddCallEdges(mi,MONO);
+                       RTAPRINT06CXTAinvoke_spec_init1
+               } /* end XTA */
+       }
+}
+
+/*-------------------------------------------------------------------------------*/
+/* -- Processes VIRTUAL methods
+
+/* -- called for INVOKEVIRTUAL and 
+/*    virtual methods used by NATIVE methods 
+/*-------------------------------------------------------------------------------*/
+
+void invokevirtual(methodinfo *mi) {
+
+/*--- RTA ---*/
+                       RTAPRINT07invoke_spec_virt2
+mi->class->classUsed = USED;  // Should this be later?
+
+if ((mi->flags & ACC_STATIC)  || (mi->flags & ACC_PRIVATE)  || (mi->flags & ACC_FINAL) ) {
+        invokestatic(mi);
+        return;
+        }
+
+
+mi->monoPoly = POLY;
+
+if (opt_rt) { 
+       rtaMarkSubs(mi->class,mi); 
+       }
+
+/*--- XTA ---*/
+if ((XTAOPTbypass) || (opt_xta)) { 
+       classSetNode *subtypesUsedSet = NULL;
+       if (rt_method->xta->XTAclassSet != NULL)
+       subtypesUsedSet = 
+               intersectSubtypesWithSet(mi->class, rt_method->xta->XTAclassSet->head);
+       else
+               subtypesUsedSet = addElement(subtypesUsedSet, rt_method->class);
+       /*****/ 
+       printf(" \nXTA subtypesUsedSet: "); fflush(stdout);
+       printSet(subtypesUsedSet);
+       /*****/
+       xtaMarkSubs(mi->class, mi, subtypesUsedSet);   
+       } /* end XTA */
+}
+
+
+/*-------------------------------------------------------------------------------*/
+void invokeinterface( methodinfo *mi ) {       
+                                               /*RTAprint*/ if (pWhenMarked >= 1) {
+                                               /*RTAprint*/ printf("\t");fflush(stdout);
+                                               /*RTAprint*/ utf_display(mi->class->name); printf(".");fflush(stdout);
+                                               /*RTAprint*/ method_display(mi); fflush(stdout); 
+                                               /*RTAprint*/ }
+
+if (mi->flags & ACC_STATIC)
+       panic ("Static/Nonstatic mismatch calling static method");
+                                               RTAPRINT08AinvokeInterface0
+/*--- RTA ---*/
+if (opt_rt) {
+       rtaMarkInterfaceSubs(mi);
+       }
+/*--- XTA ---*/
+if ((XTAOPTbypass2) || (opt_xta)) {
+       xtaMarkInterfaceSubs(mi);
+       }
+}
+
+/*-------------------------------------------------------------------------------*/
+void newClasses(classinfo *ci) {
+                                       if (pWhenMarked >= 1) {
+                                               printf("\tclass=");fflush(stdout);
+                                               utf_display(ci->name); fflush(stdout);
+                                               printf("=\n");fflush(stdout);
+                                               }
+/*--- RTA ---*/
+if (ci->classUsed != USED) {
+                                       RTAPRINT10new
+       ci->classUsed = USED;    /* add to heirarchy    */
+       /* Add this class to the implemented by list of the abstract interface */
+       rtaAddUsedInterfaceMethods(ci);
+       addClassInit(ci, true, true, false);
+       } 
+/*--- XTA ---*/
+if ((XTAOPTbypass) || (opt_xta))
+       {
+       xtaAddUsedInterfaceMethods(ci);
+       rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,ci ); /*XTA*/
+                                               RTAPRINT10newXTA
+       }
+}
 
 /*-------------------------------------------------------------------------------*/
 static void parseRT()
@@ -1276,7 +1518,7 @@ static void parseRT()
 
                                /*--- RTA ---*/
                                 /* class with field - marked in addClassinit */
-                               addClassInit(fr->class);
+                               addClassInit(fr->class, true, true, false);
 
                                /*--- XTA ---*/
                                if   ((XTAOPTbypass) || (opt_xta))
@@ -1303,7 +1545,7 @@ static void parseRT()
 
                                /*--- RTA ---*/
                                        /* class with field - marked in addClassinit */
-                               addClassInit(fr->class);
+                               addClassInit(fr->class,true, true, true);
 
                                /*--- XTA ---*/
                                if  ((XTAOPTbypass) || (opt_xta) ) 
@@ -1330,20 +1572,7 @@ static void parseRT()
                                mr = class_getconstant (rt_class, i, CONSTANT_Methodref);
                                mi = class_fetchmethod (mr->class, mr->name, mr->descriptor);
                                /*-- RTA --*/
-                                                       RTAPRINT04invokestatic1
-                               if (mi->class->classUsed == NOTUSED) {
-                                       mi->class->classUsed = USED;
-                                               RTAPRINT05invokestatic2
-                                       }
-                               addClassInit(mi->class);
-       
-                               if (opt_rt) {
-                                       ADDTOCALLGRAPH(mi)  
-                               } /* end RTA */
-                               /*-- XTA --*/
-                               if ((XTAOPTbypass) || (opt_xta)) {
-                                       xtaAddCallEdges(mi,MONO); 
-                               } /* end XTA */
+                               invokestatic(mi);
                        }
                        break;
 
@@ -1352,63 +1581,21 @@ static void parseRT()
                        {
                        constant_FMIref *mr;
                        methodinfo *mi;
-                       classinfo  *ci;
                                
                        mr = class_getconstant (rt_class, i, CONSTANT_Methodref);
                        mi = class_fetchmethod (mr->class, mr->name, mr->descriptor);
-                       ci = mi->class;
                                                RTAPRINT06invoke_spec_virt1
                        /*--- PRIVATE Method -----------------------------------------------------*/ 
                        if (mi->name        != INIT) {     /* if method called is PRIVATE */ 
                                                        RTAPRINT07invoke_spec_virt2
                                                        RTAPRINT04invokestatic1
-                               /*-- RTA --*/   /* was just markSubs(mi); */
-                               if (opt_rt) {
-                                       ADDTOCALLGRAPH(mi)  
-                                       }
-
-                               /*--- XTA ---*/
-                               if ((XTAOPTbypass) || (opt_xta)) {
-                                       xtaAddCallEdges(mi,MONO);
-                                       } /* end XTA */
+                               invokestatic(mi);
                                }
 
                        else    {
                                /*--- Test for super <init> which is: <init> calling its super class <init> -*/
-
-                               /* new class so add marked methods */
-                               if (opt_rt) {
-                                       if (( mi->methodUsed != USED) || (mi->class->classUsed == PARTUSED))  {
-                               /*--- process NORMAL <init> method ---------------------------------------------*/
-                                               if ( mi->methodUsed != USED) {
-                                                       /* Normal <init> 
-                                                       - mark class as USED and <init> to callgraph */
-                               
-                                                       /*-- RTA --*/
-                                                       ci->classUsed = USED;
-                                                       addMarkedMethods(ci);  /* add to callgraph marked methods */
-                                                                               RTAPRINT06Binvoke_spec_init
-                                                       rtaAddUsedInterfaceMethods(ci); 
-                                                       ADDTOCALLGRAPH(mi)  
-                                                       }
-                                               }       
-                                       }
-
-                               /*-- XTA --*/
-                               if ((XTAOPTbypass) || (opt_xta)) { 
-                                       if (mi->xta == NULL) {
-                                               mi->xta = xtainfoInit(mi);
-                                               }
-                                       if ((mi->xta->XTAmethodUsed != USED) || (mi->class->classUsed == PARTUSED)) {
-                                               ci->classUsed = USED;
-                                               rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,ci ); 
-                                               xtaAddUsedInterfaceMethods(ci); 
-                                               xtaAddCallEdges(mi,MONO);
-                                                       RTAPRINT06CXTAinvoke_spec_init1
-                                               } /* end XTA */
-                                       }
+                               initMethods(mi);
                                }
-
                        }                                                
                        break;
 
@@ -1422,27 +1609,7 @@ static void parseRT()
                        mr = class_getconstant (rt_class, i, CONSTANT_Methodref);
                        mi = class_fetchmethod (mr->class, mr->name, mr->descriptor);
 
-                       /*--- RTA ---*/
-                                       RTAPRINT07invoke_spec_virt2
-                       mi->monoPoly = POLY;
-                       if (opt_rt) { 
-                               rtaMarkSubs(mi->class,mi); 
-                               }
-
-                       /*--- XTA ---*/
-                       if ((XTAOPTbypass) || (opt_xta)) { 
-                               classSetNode *subtypesUsedSet = NULL;
-                               if (rt_method->xta->XTAclassSet != NULL)
-                                       subtypesUsedSet = 
-                                               intersectSubtypesWithSet(mi->class, rt_method->xta->XTAclassSet->head);
-                               else
-                                       subtypesUsedSet = addElement(subtypesUsedSet, rt_method->class);
-                                       /*****/ 
-                                                       printf(" \nXTA subtypesUsedSet: "); fflush(stdout);
-                                                       printSet(subtypesUsedSet);
-                                       /*****/
-                                       xtaMarkSubs(mi->class, mi, subtypesUsedSet);   
-                               } /* end XTA */
+                       invokevirtual(mi);
                        }
                        break;
 
@@ -1454,24 +1621,7 @@ static void parseRT()
 
                        mr = class_getconstant (rt_class, i, CONSTANT_InterfaceMethodref);
                        mi = class_fetchmethod (mr->class, mr->name, mr->descriptor);
-                       
-                                               /*RTAprint*/ if (pWhenMarked >= 1) {
-                                               /*RTAprint*/ printf("\t");fflush(stdout);
-                                               /*RTAprint*/ utf_display(mr->class->name); printf(".");fflush(stdout);
-                                               /*RTAprint*/ method_display(mi); fflush(stdout); 
-                                               /*RTAprint*/ }
-
-                       if (mi->flags & ACC_STATIC)
-                               panic ("Static/Nonstatic mismatch calling static method");
-                                                       RTAPRINT08AinvokeInterface0
-                       /*--- RTA ---*/
-                       if (opt_rt) {
-                               rtaMarkInterfaceSubs(mi);
-                               }
-                       /*--- XTA ---*/
-                       if ((XTAOPTbypass2) || (opt_xta)) {
-                               xtaMarkInterfaceSubs(mi);
-                               }
+                       invokeinterface(mi);
                        }
                        break;
 
@@ -1483,26 +1633,7 @@ static void parseRT()
                                classinfo *ci;
 
                                ci = class_getconstant (rt_class, i, CONSTANT_Class); 
-                                       if (pWhenMarked >= 1) {
-                                               printf("\tclass=");fflush(stdout);
-                                               utf_display(ci->name); fflush(stdout);
-                                               printf("=\n");fflush(stdout);
-                                               }
-                               /*--- RTA ---*/
-                               if (ci->classUsed != USED) {
-                                       RTAPRINT10new
-                                               ci->classUsed = USED;    /* add to heirarchy    */
-                                       /* Add this class to the implemented by list of the abstract interface */
-                                       rtaAddUsedInterfaceMethods(ci);
-                                       addClassInit(ci);
-                                       } 
-                               /*--- XTA ---*/
-                               if ((XTAOPTbypass) || (opt_xta))
-                                       {
-                                       xtaAddUsedInterfaceMethods(ci);
-                                       rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,ci ); /*XTA*/
-                                               RTAPRINT10newXTA
-                                       }
+                               newClasses(ci);
                        }
                        break;
 
@@ -1533,19 +1664,27 @@ void   findMarkNativeUsedMeth (utf * c1, utf* m1, utf* d1) {
 
        class = class_get(c1);
        if (class == NULL)  {
-               return;    /*Note: Since NativeCalls is for mult programs some may not be loaded - that's ok */
+               utf_display(c1);
+               printf("  WARNING: CLASS used by NATIVE method is NULL so loaded\n");
+               loader_load_sysclass(NULL, c1); 
+               class = class_get(c1);
+               if (class == NULL)  {
+                       panic("CLASS used by NATIVE method is NULL and loading didn't help\n");
+                       return;    /*Note: Since NativeCalls is for mult programs some may not be loaded - that's ok */
+                       }
        }
 
        if (class->classUsed == NOTUSED) {
+printf("NATIVE_MARKED CLASS USED "); utf_display(class->name); printf("\n");
                class->classUsed = USED; /* MARK CLASS USED */
                /* add marked methods to callgraph */ 
-               addMarkedMethods(class);
+               rtaAddMarkedMethods(class);
        }
 
-       meth = class_findmethod (class, m1, d1);
+       meth = class_findmethod_w (class, m1, d1,"findMarkNativeUsedMeth");
        if (meth == NULL) {
                utf_display(class->name);printf(".");utf_display(m1);printf(" ");utf_display(d1);
-               printf("WARNING from parseRT:  Method given is used by Native method call, but NOT FOUND\n");
+               panic("WARNING from parseRT:  Method given is used by Native method call, but NOT FOUND\n");
        }
        else
                rtaMarkSubs(class,meth);
@@ -1561,7 +1700,7 @@ void   findMarkNativeUsedClass (utf * c) {
        class->classUsed = USED;
 
        /* add marked methods to callgraph */
-       addMarkedMethods(class);
+       rtaAddMarkedMethods(class);
 }
 
 
@@ -1583,7 +1722,7 @@ void markNativeMethodsRT(utf *rt_class, utf* rt_method, utf* rt_descriptor) {
                                         && (rt_descriptor == nativeCompCalls[i].methods[j].descriptor)) {
 
                                        found=true;
-
+printf("#%i#\n",nativeCompCalls[i].callCnt[j]);
                                        /* mark methods and classes used by this native class.method */
                                        for (k=0; k < nativeCompCalls[i].callCnt[j]; k++) {
                                                if (nativeCompCalls[i].methods[j].methodCalls[k].methodname != NULL) {
@@ -1616,6 +1755,56 @@ void markNativeMethodsRT(utf *rt_class, utf* rt_method, utf* rt_descriptor) {
 }
 
 
+
+/*-------------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------------------*/
+/* still need to look at field sets in 2nd pass and clinit .....  */
+void XTA_jit_parse2(methodinfo *m)
+{
+int methRT; /* local */
+       if (XTAdebug >= 1) 
+               printf("\n\nStarting Round 2 XTA !!!!!!!!!!!!!!\n");
+
+       /* for each method in XTA worklist = callgraph (use RTA for now) */
+       methRT=0;
+       //while (methRT <= methRTlast) {
+       while (methRT <= methXTAlast) {
+               rt_method      = XTAcallgraph[methRT];
+               rt_class       = rt_method->class;
+               rt_descriptor  = rt_method->descriptor;
+               rt_jcodelength = rt_method->jcodelength;
+               rt_jcode       = rt_method->jcode;
+
+               if (! (  (rt_method->flags & ACC_NATIVE  )
+                                ||   (rt_method->flags & ACC_ABSTRACT) ) ) {
+                       if (XTAdebug >= 1) {
+                               printf("\n!!!!! XTA Round 2 Parse of #%i:",methRT);fflush(stdout);
+                               utf_display(rt_class->name); printf("."); fflush(stdout);
+                               method_display(rt_method);
+                       }
+                       /*   if XTA type set changed since last parse */
+                       if (rt_method->xta->chgdSinceLastParse) {
+
+                               /*     get types from methods it is calledBy */
+                               xtaPassAllCalledByParams ();
+
+                               /* Pass parameter types to methods it calls and  send the return type those called by  */
+                               xtaMethodCalls_and_sendReturnType();
+                       }
+               }
+               methRT++;
+       }
+       if (XTAdebug >= 1) {
+
+               printf("\n\nEND_OF Round 2 XTA !!!!!!!!!!!!!!\n");
+               printXTACallgraph ();
+       }
+       
+       RTAPRINT14CallgraphLast  /*was >=2 */
+               RTAPRINT15HeirarchyiLast /*was >= 2 */
+               }
+
+
 /*-------------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------------*/
 void mainRTAparseInit (methodinfo *m )
@@ -1629,6 +1818,7 @@ void mainRTAparseInit (methodinfo *m )
                firstCall=false;
 
                /* Frequently used utf strings */
+               utf_OBJECT = utf_new_char("java/lang/Object");
                utf_MAIN  = utf_new_char("main");
                INIT      = utf_new_char("<init>");
                CLINIT    = utf_new_char("<clinit>");
@@ -1694,63 +1884,13 @@ void mainRTAparseInit (methodinfo *m )
 
 /*-------------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------------*/
-/* still need to look at field sets in 2nd pass and clinit .....  */
-void XTA_jit_parse2(methodinfo *m)
-{
-int methRT; /* local */
-       if (XTAdebug >= 1) 
-               printf("\n\nStarting Round 2 XTA !!!!!!!!!!!!!!\n");
-
-       /* for each method in XTA worklist = callgraph (use RTA for now) */
-       methRT=0;
-       //while (methRT <= methRTlast) {
-       while (methRT <= methXTAlast) {
-               rt_method      = XTAcallgraph[methRT];
-               rt_class       = rt_method->class;
-               rt_descriptor  = rt_method->descriptor;
-               rt_jcodelength = rt_method->jcodelength;
-               rt_jcode       = rt_method->jcode;
-
-               if (! (  (rt_method->flags & ACC_NATIVE  )
-                                ||   (rt_method->flags & ACC_ABSTRACT) ) ) {
-                       if (XTAdebug >= 1) {
-                               printf("\n!!!!! XTA Round 2 Parse of #%i:",methRT);fflush(stdout);
-                               utf_display(rt_class->name); printf("."); fflush(stdout);
-                               method_display(rt_method);
-                       }
-                       /*   if XTA type set changed since last parse */
-                       if (rt_method->xta->chgdSinceLastParse) {
-
-                               /*     get types from methods it is calledBy */
-                               xtaPassAllCalledByParams ();
-
-                               /* Pass parameter types to methods it calls and  send the return type those called by  */
-                               xtaMethodCalls_and_sendReturnType();
-                       }
-               }
-               methRT++;
-       }
-       if (XTAdebug >= 1) {
-
-               printf("\n\nEND_OF Round 2 XTA !!!!!!!!!!!!!!\n");
-               printXTACallgraph ();
-       }
-       
-       RTAPRINT14CallgraphLast  /*was >=2 */
-               RTAPRINT15HeirarchyiLast /*was >= 2 */
-               }
-
-
-/*-------------------------------------------------------------------------------*/
-
-void RT_jit_parse(methodinfo *m)
-{
 
-/*-- RTA -- *******************************************************/
-    if (opt_rt) 
-       {
+void RTparseCGWorklist (methodinfo *m) {  
+printf("IIIIIIIIIIIIIIIIIIIIn RTparseCGWorklist\n"); fflush(stdout);
        if (m->methodUsed == USED) return;
-       mainRTAparseInit (m);
+       if ((firstCall) || (parse1) || (m->name == utf_MAIN))
+               mainRTAparseInit (m);
+       parse1= false;
        m->methodUsed = USED;
 
        /* initialise parameter type descriptor */
@@ -1766,7 +1906,7 @@ void RT_jit_parse(methodinfo *m)
                        }
                        /* add marked methods to callgraph */
                        RTAPRINT11addedtoCallgraph2
-               addMarkedMethods(ci);
+               rtaAddMarkedMethods(ci);
                } /* if */
 
        /*---- RTA call graph worklist -----***/
@@ -1781,6 +1921,7 @@ void RT_jit_parse(methodinfo *m)
                                 ||   (rt_method->flags & ACC_ABSTRACT) ) ) {
                        parseRT();
                        }
+               //if (true == false) {   // At moment nativecalls.h is not current and neither helps nor hinders
                else    {
                                RTAPRINT12bAbstractNative
                        if (rt_method->flags & ACC_NATIVE ) {
@@ -1799,19 +1940,141 @@ void RT_jit_parse(methodinfo *m)
 
        if (m->class->classUsed == NOTUSED)
                m->class->classUsed = USED; /* say Main's class has a method used ??*/ 
+}
 
-       if (m->name == utf_MAIN) { /*-- MAIN specific -- */
 
+/*-------------------------------------------------------------------------------*/
+/*--------------------------------------------------------*/
+int getdymline(char *line, int max, FILE *inFP) {
+if (fgets(line, max, inFP) == NULL)
+  return 0;
+else {
+  return strlen((const char *)line);
+  }
+}
+
+/*-------------------------------------------------------------------------------*/
+
+methodinfo *getApplicationDynamics ( ) {
+char line[512]="";
+char *classname;
+char *methname ;
+char *desc;
+int rc;
+
+classinfo  *class;
+methodinfo *mi;
+
+if ( (appldynm = fopen("appldynm", "r")) == NULL) {
+       printf("parseRT - appldynm file: no appldynm file - ok if nothing in rtMissed after Main\n");
+       return NULL;
+}
+
+if ( getdymline(line,512,appldynm) != 0)
+       {
+       printf("line=%s\n",line); fflush(stdout);
+
+       classname = strtok(line," \n");
+       methname  = strtok(NULL," \n");
+       if (methname == NULL) {  /* if no meth */
+               panic("parseRT - dynamic loaded class/method/desc in appldynm has no method");
+               }
+       desc = strtok(NULL," \n");
+       if (desc == NULL) {  /* if no desc */
+               panic("parseRT - dynamic loaded class/method/desc in appldynm has no descriptor");
+               }
+       printf("appldynm class=%s meth=%s desc=%s\n",classname, methname,desc); fflush(stdout);
+
+        class = class_get(utf_new_char(classname));
+       if (class == NULL) {
+               class = loader_load_sysclass(NULL,  utf_new_char(classname));   
+               }
+       mi = class_fetchmethod(class,utf_new_char(methname), utf_new_char(desc)) ;
+       printf("+++++--3--+++++\t");
+       RTparseCGWorklist (mi) ;  
+
+       }
+
+fclose(appldynm);
+return NULL;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+void RT_jit_parse(methodinfo *m)
+{
+classinfo  *class;
+methodinfo * mi;
+classinfo *topclass;
+
+/*-- RTA -- *******************************************************/
+    if (opt_rt) 
+       {
+       /*---- java/lang/Object.<clinit> ----*/
+ if ((firstCall == false) || (true == false))  
+       {
+       parse1 = true;
+       if (m->methodUsed == USED) return;
+       printf("MMMMMMMMMMMMMMMMMMMMMMMMMMMMissed\n"); fflush(stdout);
+       RTparseCGWorklist (m) ;  
                                         /*RTAprint*/ if (pCallgraph >= 1) {
                                         /*RTAprint*/    printCallgraph ();}
-                                        /*RTprint*/ if (pClassHeir >= 1) {
-                                        /*RTprint*/     printRThierarchyInfo(m);
-                                        /*RTprint*/     }
+                                        /*RTprint*/ //if (pClassHeir >= 1) {
+                                        /*RTprint*/ //    printRThierarchyInfo(m);
+                                        /*RTprint*/ //    }
                                         /*RTprint*/     /**printObjectClassHeirarchyAll( );**/
                                                fflush(stdout);
-               /** MFREE(callgraph,methodinfo*,MAXCALLGRAPH);  causes stack overflow **/
-               }
-       } /*  end opt_rt */
+       printf("END MMMMMMMMMMMMMMMMMMMMMMMMMMMMissed\n"); fflush(stdout);
+       return;
+       }
+ else
+       {
+       parse1 = true;
+       printf("SSSSSSSSSSSSSSSSSSSSSStatic Analysis \n"); fflush(stdout);
+       printf("+++++--1--+++++\t");
+       RTparseCGWorklist (m) ;  
+
+        class = class_get(utf_new_char("java/lang/Thread"));
+       mi = class_fetchmethod(class,clinit_name(),clinit_desc()) ;
+       printf("+++++--2--+++++\t");
+       RTparseCGWorklist (mi) ;  
+
+        class = class_get(utf_new_char("java/lang/ThreadGroup"));
+       mi = class_fetchmethod(class,clinit_name(),clinit_desc()) ;
+       printf("+++++--3--+++++\t");
+       RTparseCGWorklist (mi) ;  
+
+
+        class = class_get(utf_new_char("java/lang/Throwable"));
+       mi = class_fetchmethod(class,clinit_name(),clinit_desc()) ;
+       printf("+++++--4--+++++\t");
+       RTparseCGWorklist (mi) ;  
+
+       printf("mainString=%s=\n",mainString);fflush(stdout);
+       class = loader_load_sysclass(NULL,  utf_new_char(mainString));  
+       mi = class_fetchmethod( class,
+                               utf_new_char("main"),
+                               utf_new_char("([Ljava/lang/String;)V")
+                               );
+       printf("+++++--5--+++++\t");
+       RTparseCGWorklist (mi) ;  
+
+       printf("+++++--6--+++++\t");
+       getApplicationDynamics();
+
+printf("-+-+-+-+-+-+-+-+-+-+-33"); fflush(stdout);
+
+                                        /*RTAprint*/ if (pCallgraph >= 1) {
+                                        /*RTAprint*/    printCallgraph ();}
+                                        /*RTprint*/ //if (pClassHeir >= 1) {
+                                        /*RTprint*/ //    printRThierarchyInfo(m);
+                                        /*RTprint*/ //    }
+                                        /*RTprint*/     /**printObjectClassHeirarchyAll( );**/
+                                               fflush(stdout);
+printf("-+-+-+-+-+-+-+-+-+-+-44"); fflush(stdout);
+       /** MFREE(callgraph,methodinfo*,MAXCALLGRAPH);  causes stack overflow **/
+       }
+     } /*  end opt_rt */
 
 /*-- XTA -- *******************************************************/
        if ((XTAOPTbypass) || (opt_xta)) {