Fix EDKT148.
authorqouyang <qouyang@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 5 Aug 2006 11:14:33 +0000 (11:14 +0000)
committerqouyang <qouyang@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 5 Aug 2006 11:14:33 +0000 (11:14 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1190 6f19259b-4bc3-4df7-8a09-765794883524

Tools/Source/GenBuild/org/tianocore/build/autogen/AutoGen.java

index d8249dd..51d1a44 100644 (file)
@@ -98,6 +98,21 @@ public class AutoGen {
     // area and it's dependence on library instance surface are.\r
     //\r
     private List<PackageIdentification> mDepPkgList = new LinkedList<PackageIdentification>();\r
+\r
+       //\r
+       //  For non library module, add its library instance's construct and destructor to \r
+       //  list.\r
+       //  \r
+       private List<String> libConstructList = new ArrayList<String>();\r
+       private List<String> libDestructList = new ArrayList<String>();\r
+\r
+       //\r
+       // List to store SetVirtalAddressMapCallBack, ExitBootServiceCallBack  \r
+       // \r
+       private List<String> setVirtalAddList = new ArrayList<String>();\r
+       private List<String> exitBootServiceList = new ArrayList<String>();\r
+\r
+       \r
        /**\r
         * Construct function\r
         * \r
@@ -204,6 +219,7 @@ public class AutoGen {
        void moduleGenAutogen() throws BuildException {\r
 \r
                try {\r
+                       collectLibInstanceInfo();\r
                        moduleGenAutogenC();\r
                        moduleGenAutogenH();\r
                } catch (Exception e) {\r
@@ -1074,10 +1090,10 @@ public class AutoGen {
                 }\r
                 fileBuffer.append("}\r\n\r\n");\r
 \r
-                fileBuffer.append("VOID\n");\r
-                fileBuffer.append("EFIAPI\n");\r
+                fileBuffer.append("VOID\r\n");\r
+                fileBuffer.append("EFIAPI\r\n");\r
                 fileBuffer.append("ExitDriver (\r\n");\r
-                fileBuffer.append("  IN EFI_STATUS  Status\n");\r
+                fileBuffer.append("  IN EFI_STATUS  Status\r\n");\r
                 fileBuffer.append("  )\r\n\r\n");\r
                 fileBuffer.append("{\r\n");\r
                 if (entryPointCount <= 1) {\r
@@ -1333,128 +1349,17 @@ public class AutoGen {
         * @throws BuildException\r
         */\r
        void LibInstanceToAutogenC(StringBuffer fileBuffer) throws BuildException {\r
-               int index;\r
-\r
-               String moduleType = SurfaceAreaQuery.getModuleType();\r
-               List<String> libConstructList = new ArrayList<String>();\r
-               List<String> libDestructList = new ArrayList<String>();\r
-\r
-               String libConstructName = null;\r
-               String libDestructName = null;\r
-               ModuleIdentification[] libraryIdList = SurfaceAreaQuery\r
-                               .getLibraryInstance(this.arch);\r
-\r
                try {\r
-                       if (libraryIdList != null) {\r
-                               //\r
-                               // Reorder library instance sequence.\r
-                               //\r
-                               AutogenLibOrder libOrder = new AutogenLibOrder(libraryIdList,\r
-                                               this.arch);\r
-                               List<ModuleIdentification> orderList = libOrder\r
-                                               .orderLibInstance();\r
-\r
-                               if (orderList != null) {\r
-                                       //\r
-                                       // Process library instance one by one.\r
-                                       //\r
-                                       for (int i = 0; i < orderList.size(); i++) {\r
-\r
-                                               //\r
-                                               // Get library instance basename.\r
-                                               //\r
-                                               ModuleIdentification libInstanceId = orderList.get(i);\r
-\r
-                                               //\r
-                                               // Get override map\r
-                                               //\r
-                                                \r
-                                               Map<String, XmlObject> libDoc = GlobalData.getDoc(\r
-                                                               libInstanceId, this.arch);\r
-                                               SurfaceAreaQuery.push(libDoc);\r
-\r
-                                               //\r
-                                               // Get <PPis>, <Protocols>, <Guids> list of this library\r
-                                               // instance.\r
-                                               //\r
-                                               String[] ppiList = SurfaceAreaQuery.getPpiArray(this.arch);\r
-                                               String[] ppiNotifyList = SurfaceAreaQuery\r
-                                                               .getPpiNotifyArray(this.arch);\r
-                                               String[] protocolList = SurfaceAreaQuery\r
-                                                               .getProtocolArray(this.arch);\r
-                                               String[] protocolNotifyList = SurfaceAreaQuery\r
-                                                               .getProtocolNotifyArray(this.arch);\r
-                                               String[] guidList = SurfaceAreaQuery\r
-                                                               .getGuidEntryArray(this.arch);\r
-                        PackageIdentification[] pkgList = SurfaceAreaQuery.getDependencePkg(this.arch);\r
-\r
-                                               //\r
-                                               // Add those ppi, protocol, guid in global ppi,\r
-                                               // protocol, guid\r
-                                               // list.\r
-                                               //\r
-                                               for (index = 0; index < ppiList.length; index++) {\r
-                                                       this.mPpiList.add(ppiList[index]);\r
-                                               }\r
-\r
-                                               for (index = 0; index < ppiNotifyList.length; index++) {\r
-                                                       this.mPpiList.add(ppiNotifyList[index]);\r
-                                               }\r
-\r
-                                               for (index = 0; index < protocolList.length; index++) {\r
-                                                       this.mProtocolList.add(protocolList[index]);\r
-                                               }\r
-\r
-                                               for (index = 0; index < protocolNotifyList.length; index++) {\r
-                                                       this.mProtocolList.add(protocolNotifyList[index]);\r
-                                               }\r
-\r
-                                               for (index = 0; index < guidList.length; index++) {\r
-                                                       this.mGuidList.add(guidList[index]);\r
-                                               }\r
-                        for (index = 0; index < pkgList.length; index++){\r
-                            if (!this.mDepPkgList.contains(pkgList[index])){\r
-                                this.mDepPkgList.add(pkgList[index]);\r
-                            }\r
-                        }\r
-\r
-                                               //\r
-                                               // If not yet parse this library instance's constructor\r
-                                               // element,parse it.\r
-                                               //\r
-                                               libConstructName = SurfaceAreaQuery\r
-                                                               .getLibConstructorName();\r
-                                               libDestructName = SurfaceAreaQuery\r
-                                                               .getLibDestructorName();\r
-\r
-                                               SurfaceAreaQuery.pop();\r
-                                               //\r
-                                               // Add dependent library instance constructor function.\r
-                                               //\r
-                                               if (libConstructName != null) {\r
-                                                       libConstructList.add(libConstructName);\r
-                                               }\r
-                                               //\r
-                                               // Add dependent library instance destructor fuction.\r
-                                               //\r
-                                               if (libDestructName != null) {\r
-                                                       libDestructList.add(libDestructName);\r
-                                               }\r
-                                       }\r
-\r
-                               }\r
-\r
-                               //\r
-                               // Add library constructor to AutoGen.c\r
-                               //\r
-                               LibConstructorToAutogenC(libConstructList, moduleType,\r
-                                               fileBuffer/* autogenC */);\r
-                               //\r
-                               // Add library destructor to AutoGen.c\r
-                               //\r
-                               LibDestructorToAutogenC(libDestructList, moduleType, fileBuffer/* autogenC */);\r
-                       }\r
-\r
+            String moduleType = this.moduleId.getModuleType();\r
+                   //\r
+                       // Add library constructor to AutoGen.c\r
+                       //\r
+                       LibConstructorToAutogenC(libConstructList, moduleType,\r
+                               fileBuffer/* autogenC */);\r
+                       //\r
+                       // Add library destructor to AutoGen.c\r
+                       //\r
+                       LibDestructorToAutogenC(libDestructList, moduleType, fileBuffer/* autogenC */);\r
                } catch (Exception e) {\r
                        throw new BuildException(e.getMessage());\r
                }\r
@@ -1867,15 +1772,12 @@ public class AutoGen {
         */\r
        void ExternCallBackToAutoGenC(StringBuffer fileBuffer)\r
                        throws BuildException {\r
-               String[] setVirtualList = SurfaceAreaQuery\r
-                               .getSetVirtualAddressMapCallBackArray();\r
-               String[] exitBootList = SurfaceAreaQuery\r
-                               .getExitBootServicesCallBackArray();\r
-               String moduleType = SurfaceAreaQuery.getModuleType();\r
+               EdkLog.log(EdkLog.EDK_INFO, "Begin changing set to array!");\r
+               String moduleType = this.moduleId.getModuleType();\r
                boolean UefiOrDxeModule = false;\r
                int Count = 0;\r
                int i;\r
-\r
+        EdkLog.log(EdkLog.EDK_INFO, "HEHE!!");\r
                switch (CommonDefinition.getModuleType(moduleType)) {\r
                case CommonDefinition.ModuleTypeDxeDriver:\r
                case CommonDefinition.ModuleTypeDxeRuntimeDriver:\r
@@ -1895,9 +1797,9 @@ public class AutoGen {
                        // set count to the number of valid entries\r
                        //\r
                        Count = 0;\r
-                       if (setVirtualList != null) {\r
-                               for (i = 0; i < setVirtualList.length; i++) {\r
-                                       if (setVirtualList[i].equalsIgnoreCase("")) {\r
+                       if (this.setVirtalAddList != null) {\r
+                               for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
+                                       if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
                                                break;\r
                                        }\r
                                }\r
@@ -1911,7 +1813,7 @@ public class AutoGen {
                        break;\r
                }\r
 \r
-               if (setVirtualList == null) {\r
+               if (this.setVirtalAddList == null || this.setVirtalAddList.size() == 0) {\r
                        if (UefiOrDxeModule) {\r
                                //\r
                                // No data so make a NULL list\r
@@ -1925,13 +1827,13 @@ public class AutoGen {
                        //\r
                        // Write SetVirtualAddressMap function definition.\r
                        //\r
-                       for (i = 0; i < setVirtualList.length; i++) {\r
-                               if (setVirtualList[i].equalsIgnoreCase("")) {\r
+                       for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
+                               if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
                                        break;\r
                                }\r
                                fileBuffer.append("VOID\r\n");\r
                                fileBuffer.append("EFIAPI\r\n");\r
-                               fileBuffer.append(setVirtualList[i]);\r
+                               fileBuffer.append(this.setVirtalAddList.get(i));\r
                                fileBuffer.append(" (\r\n");\r
                                fileBuffer.append("  IN EFI_EVENT  Event,\r\n");\r
                                fileBuffer.append("  IN VOID       *Context\r\n");\r
@@ -1943,8 +1845,8 @@ public class AutoGen {
                        //\r
                        fileBuffer\r
                                        .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverSetVirtualAddressMapEvent[] = {");\r
-                       for (i = 0; i < setVirtualList.length; i++) {\r
-                               if (setVirtualList[i].equalsIgnoreCase("")) {\r
+                       for (i = 0; i < this.setVirtalAddList.size(); i++) {\r
+                               if (this.setVirtalAddList.get(i).equalsIgnoreCase("")) {\r
                                        break;\r
                                }\r
 \r
@@ -1954,7 +1856,7 @@ public class AutoGen {
                                        fileBuffer.append(",\r\n  ");\r
                                }\r
 \r
-                               fileBuffer.append(setVirtualList[i]);\r
+                               fileBuffer.append(this.setVirtalAddList.get(i));\r
                        }\r
                        //\r
                        //  If module is not DXE_DRIVER, DXE_RUNTIME_DIRVER, UEFI_DRIVER\r
@@ -1979,9 +1881,9 @@ public class AutoGen {
                        // set count to the number of valid entries.\r
                        //\r
                        Count = 0;\r
-                       if (exitBootList != null) {\r
-                               for (i = 0; i < exitBootList.length; i++) {\r
-                                       if (exitBootList[i].equalsIgnoreCase("")) {\r
+                       if (this.exitBootServiceList != null) {\r
+                               for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
+                                       if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
                                                break;\r
                                        }\r
                                }\r
@@ -1991,7 +1893,7 @@ public class AutoGen {
                        fileBuffer.append(";\r\n\r\n");\r
                }\r
 \r
-               if (exitBootList == null) {\r
+               if (this.exitBootServiceList == null || this.exitBootServiceList.size() == 0) {\r
                        if (UefiOrDxeModule) {\r
                                //\r
                                // No data so make a NULL list.\r
@@ -2005,14 +1907,14 @@ public class AutoGen {
                        //\r
                        // Write DriverExitBootServices function definition.\r
                        //\r
-                       for (i = 0; i < exitBootList.length; i++) {\r
-                               if (exitBootList[i].equalsIgnoreCase("")) {\r
+                       for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
+                               if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
                                        break;\r
                                }\r
 \r
                                fileBuffer.append("VOID\r\n");\r
                                fileBuffer.append("EFIAPI\r\n");\r
-                               fileBuffer.append(exitBootList[i]);\r
+                               fileBuffer.append(this.exitBootServiceList.get(i));\r
                                fileBuffer.append(" (\r\n");\r
                                fileBuffer.append("  IN EFI_EVENT  Event,\r\n");\r
                                fileBuffer.append("  IN VOID       *Context\r\n");\r
@@ -2024,8 +1926,8 @@ public class AutoGen {
                        //\r
                        fileBuffer\r
                                        .append("\r\nGLOBAL_REMOVE_IF_UNREFERENCED const EFI_EVENT_NOTIFY _gDriverExitBootServicesEvent[] = {");\r
-                       for (i = 0; i < exitBootList.length; i++) {\r
-                               if (exitBootList[i].equalsIgnoreCase("")) {\r
+                       for (i = 0; i < this.exitBootServiceList.size(); i++) {\r
+                               if (this.exitBootServiceList.get(i).equalsIgnoreCase("")) {\r
                                        break;\r
                                }\r
 \r
@@ -2034,7 +1936,7 @@ public class AutoGen {
                                } else {\r
                                        fileBuffer.append(",\r\n  ");\r
                                }\r
-                               fileBuffer.append(exitBootList[i]);\r
+                               fileBuffer.append(this.exitBootServiceList.get(i));\r
                        }\r
                        if (!UefiOrDxeModule) {\r
                                fileBuffer.append(",\r\n  NULL");\r
@@ -2071,4 +1973,144 @@ public class AutoGen {
             }\r
                }\r
     }\r
-}
\ No newline at end of file
+    \r
+    /**\r
+    *This function first order the library instances, then collect\r
+    *library instance 's PPI, Protocol, GUID,\r
+    *SetVirtalAddressMapCallBack, ExitBootServiceCallBack, and\r
+    *Destructor, Constructor.\r
+    *\r
+       **/\r
+       private void collectLibInstanceInfo(){\r
+               int index;\r
+\r
+               String moduleType = SurfaceAreaQuery.getModuleType();\r
+               String libConstructName = null;\r
+               String libDestructName = null;\r
+               String[] setVirtuals = null;\r
+               String[] exitBoots = null;\r
+\r
+               ModuleIdentification[] libraryIdList = SurfaceAreaQuery\r
+                               .getLibraryInstance(this.arch);\r
+               try {\r
+                       if (libraryIdList != null) {\r
+                               //\r
+                               // Reorder library instance sequence.\r
+                               //\r
+                               AutogenLibOrder libOrder = new AutogenLibOrder(libraryIdList,\r
+                                               this.arch);\r
+                               List<ModuleIdentification> orderList = libOrder\r
+                                               .orderLibInstance();\r
+\r
+                               if (orderList != null) {\r
+                                       //\r
+                                       // Process library instance one by one.\r
+                                       //\r
+                                       for (int i = 0; i < orderList.size(); i++) {\r
+\r
+                                               //\r
+                                               // Get library instance basename.\r
+                                               //\r
+                                               ModuleIdentification libInstanceId = orderList.get(i);\r
+\r
+                                               //\r
+                                               // Get override map\r
+                                               //\r
+\r
+                                               Map<String, XmlObject> libDoc = GlobalData.getDoc(\r
+                                                               libInstanceId, this.arch);\r
+                                               SurfaceAreaQuery.push(libDoc);\r
+                                               //\r
+                                               // Get <PPis>, <Protocols>, <Guids> list of this library\r
+                                               // instance.\r
+                                               //\r
+                                               String[] ppiList = SurfaceAreaQuery.getPpiArray(this.arch);\r
+                                               String[] ppiNotifyList = SurfaceAreaQuery\r
+                                                               .getPpiNotifyArray(this.arch);\r
+                                               String[] protocolList = SurfaceAreaQuery\r
+                                                               .getProtocolArray(this.arch);\r
+                                               String[] protocolNotifyList = SurfaceAreaQuery\r
+                                                               .getProtocolNotifyArray(this.arch);\r
+                                               String[] guidList = SurfaceAreaQuery\r
+                                                               .getGuidEntryArray(this.arch);\r
+                                               PackageIdentification[] pkgList = SurfaceAreaQuery.getDependencePkg(this.arch);\r
+\r
+                                               //\r
+                                               // Add those ppi, protocol, guid in global ppi,\r
+                                               // protocol, guid\r
+                                               // list.\r
+                                               //\r
+                                               for (index = 0; index < ppiList.length; index++) {\r
+                                                       this.mPpiList.add(ppiList[index]);\r
+                                               }\r
+\r
+                                               for (index = 0; index < ppiNotifyList.length; index++) {\r
+                                                       this.mPpiList.add(ppiNotifyList[index]);\r
+                                               }\r
+\r
+                                               for (index = 0; index < protocolList.length; index++) {\r
+                                                       this.mProtocolList.add(protocolList[index]);\r
+                                               }\r
+\r
+                                               for (index = 0; index < protocolNotifyList.length; index++) {\r
+                                                       this.mProtocolList.add(protocolNotifyList[index]);\r
+                                               }\r
+\r
+                                               for (index = 0; index < guidList.length; index++) {\r
+                                                       this.mGuidList.add(guidList[index]);\r
+                                               }\r
+                                               for (index = 0; index < pkgList.length; index++){\r
+                                                       if (!this.mDepPkgList.contains(pkgList[index])){\r
+                                                               this.mDepPkgList.add(pkgList[index]);\r
+                                                       }\r
+                                               }\r
+\r
+                                               //\r
+                                               // If not yet parse this library instance's constructor\r
+                                               // element,parse it.\r
+                                               //\r
+                                               libConstructName = SurfaceAreaQuery\r
+                                                               .getLibConstructorName();\r
+                                               libDestructName = SurfaceAreaQuery\r
+                                                               .getLibDestructorName();\r
+\r
+                                               //\r
+                                               // Collect SetVirtualAddressMapCallBack and \r
+                                               // ExitBootServiceCallBack.\r
+                                               // \r
+                        setVirtuals = SurfaceAreaQuery.getSetVirtualAddressMapCallBackArray();\r
+                        exitBoots = SurfaceAreaQuery.getExitBootServicesCallBackArray();\r
+                        if (setVirtuals != null) {\r
+                            for (int j = 0; j < setVirtuals.length; j++) {\r
+                                                           this.setVirtalAddList.add(setVirtuals[j]);\r
+                                                   }\r
+                                               }\r
+                                               if (exitBoots != null) {\r
+                                                       for (int k = 0; k < exitBoots.length; k++) {\r
+                                                           this.exitBootServiceList.add(exitBoots[k]);\r
+                                                   }\r
+                                               }\r
+                                               SurfaceAreaQuery.pop();\r
+                                               //\r
+                                               // Add dependent library instance constructor function.\r
+                                               //\r
+                                               if (libConstructName != null) {\r
+                                                       this.libConstructList.add(libConstructName);\r
+                                               }\r
+                                               //\r
+                                               // Add dependent library instance destructor fuction.\r
+                                               //\r
+                                               if (libDestructName != null) {\r
+                                                       this.libDestructList.add(libDestructName);\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                       }\r
+\r
+       }catch (Exception e){\r
+       System.out.println(e.getMessage());\r
+       System.out.println("Collect library instance failed!");\r
+}\r
+}\r
+}\r