]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/pcd/entity/MemoryDatabaseManager.java
Support putting unreference DYNAMIC_EX PCD into Pcd runtime database.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / entity / MemoryDatabaseManager.java
index 6f4f8949ef06a7bc3bb78b5b2057ac21c2ddc428..2e29106323e22d13798b59462021160ccb14029d 100644 (file)
@@ -15,17 +15,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 package org.tianocore.build.pcd.entity;\r
 \r
-import java.io.BufferedWriter;\r
-import java.io.File;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
 import java.util.ArrayList;\r
 import java.util.HashMap;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.UUID;\r
 \r
-import org.tianocore.build.autogen.CommonDefinition;\r
-import org.tianocore.build.pcd.action.ActionMessage;\r
+import org.tianocore.build.pcd.exception.EntityException;\r
 \r
 /** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
 **/\r
@@ -34,11 +30,22 @@ public class MemoryDatabaseManager {
     ///  Memory database. The string "cName + SpaceNameGuid" is primary key.\r
     ///  memory database is in global scope, and it will be used for others PCD tools.\r
     ///\r
-    private static Map<String, Token>  memoryDatabase = null;\r
+    private static Map<String, Token>  memoryDatabase       = null;\r
+\r
     ///\r
-    /// The log file name for dumping memory database.\r
+    /// Before build a module, the used libary will be build firstly, the PCD of these\r
+    /// libarry is inheritted by the module, so stored module's PCD information as PCD\r
+    /// context of building libary.\r
+    /// \r
+    public static List<UsageInstance> UsageInstanceContext = null;\r
     ///\r
-    private static String              logFileName    = null;\r
+    /// \r
+    /// \r
+    public static String CurrentModuleName                 = null;\r
+    public static String PcdPeimHString       = "";\r
+    public static String PcdPeimCString       = "";\r
+    public static String PcdDxeHString        = "";\r
+    public static String PcdDxeCString        = "";\r
 \r
     /**\r
       Constructure function\r
@@ -52,22 +59,6 @@ public class MemoryDatabaseManager {
         }\r
     }\r
 \r
-    /**\r
-      Get the log file name.\r
-    **/\r
-    public String getLogFileName() {\r
-        return logFileName;\r
-    }\r
-\r
-    /**\r
-      Set parameter log file name.\r
-  \r
-      @param fileName log file name parameter.\r
-    **/\r
-    public void setLogFileName(String fileName) {\r
-        logFileName = fileName;\r
-    }\r
-\r
     /**\r
       Judege whether token exists in memory database\r
       \r
@@ -136,17 +127,127 @@ public class MemoryDatabaseManager {
     }\r
 \r
     /**\r
-      Get all PCD record for a module according to module's name.\r
+       Get record array only contains DYNAMIC or DYNAMIC_EX type PCD.\r
+       \r
+       @return ArrayList\r
+     */\r
+    private ArrayList getDynamicRecordArray() {\r
+        Token[]     tokenArray  =   getRecordArray();\r
+        int         index       =   0;\r
+        ArrayList<Token>   al   =   new ArrayList<Token>();\r
+\r
+        for (index = 0; index < tokenArray.length; index++) {\r
+            if (tokenArray[index].isDynamicPCD) {\r
+                al.add(tokenArray[index]);\r
+            }\r
+        }\r
+\r
+        return al;\r
+    }\r
+\r
+\r
+    /**\r
+      Get the token record array contained all PCD token referenced by PEI phase.\r
+          The output array is sorted based on descending order of the size of alignment for each feilds.\r
+\r
+      @return the token record array contained all PCD token referenced in PEI phase.\r
+     * @throws EntityException \r
+    **/\r
+    public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) \r
+        throws EntityException {\r
+        int                     usageInstanceIndex  =   0;\r
+        int                     index               =   0;\r
+        ArrayList               tokenArrayList      =   getDynamicRecordArray();\r
+        Object[]                usageInstanceArray  =   null;\r
+        UsageInstance           usageInstance       =   null;\r
+\r
+        //pei = new ArrayList<Token>();\r
+        //dxe = new ArrayList<Token>();\r
+\r
+        for (index = 0; index < tokenArrayList.size(); index++) {\r
+            boolean found   =   false;\r
+            Token       token = (Token) tokenArrayList.get(index);\r
+            if (token.consumers != null) {\r
+                usageInstanceArray = token.consumers.entrySet().toArray();\r
+                for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
+                    usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
+                    if (usageInstance.isPeiPhaseComponent()) {\r
+                        pei.add(token);\r
+                        found = true;\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+\r
+            //\r
+            // If no PEI components reference the PCD entry, \r
+            // we check if it is referenced in DXE driver. \r
+            //\r
+            if (!found) {\r
+                if (token.consumers != null) {\r
+                    usageInstanceArray = token.consumers.entrySet().toArray();\r
+                    for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
+                        usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
+                        if (usageInstance.isDxePhaseComponent()) {\r
+                            dxe.add(token);\r
+                            found = true;\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+                \r
+                if (!found) {\r
+                    if (token.isDynamicPCD && token.consumers.size() == 0) {\r
+                        dxe.add(token);\r
+                    } else {\r
+                        //\r
+                        // We only support Dynamice(EX) type for PEI and DXE phase.\r
+                        // If it is not referenced in either PEI or DXE, throw exception now.\r
+                        //\r
+                        throw new EntityException("Dynamic(EX) PCD Entries are referenced in module that is not in PEI phase nor in DXE phase.");\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+      Get all PCD record for a module according to module's name, module's GUID,\r
+      package name, package GUID, arch, version information.\r
      \r
       @param moduleName  the name of module.\r
       \r
       @return  all usage instance for this module in memory database.\r
     **/\r
-    public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName) {\r
+    public List<UsageInstance> getUsageInstanceArrayByModuleName(String moduleName,\r
+                                                                 UUID   moduleGuid,\r
+                                                                 String packageName,\r
+                                                                 UUID   packageGuid,\r
+                                                                 String arch,\r
+                                                                 String version) {\r
+\r
+        String primaryKey = UsageInstance.getPrimaryKey(moduleName, \r
+                                                        moduleGuid,\r
+                                                        packageName,\r
+                                                        packageGuid,\r
+                                                        arch,\r
+                                                        version);\r
+\r
+        return getUsageInstanceArrayByKeyString(primaryKey);\r
+    }\r
+\r
+    /**\r
+       Get all PCD token for a usage instance according to primary key.\r
+       \r
+       @param primaryKey    the primary key of usage instance.\r
+       \r
+       @return List<UsageInstance>\r
+     */\r
+    public List<UsageInstance> getUsageInstanceArrayByKeyString(String primaryKey) {\r
         Token[]               tokenArray          = null;\r
         int                   recordIndex         = 0; \r
-        int                   usageInstanceIndex  = 0;\r
-        List<UsageInstance>   usageInstanceArray  = null;\r
         UsageInstance         usageInstance       = null;\r
         List<UsageInstance>   returnArray         = new ArrayList<UsageInstance>();\r
 \r
@@ -156,31 +257,14 @@ public class MemoryDatabaseManager {
         // Loop to find all PCD record related to current module\r
         //\r
         for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
-            if (tokenArray[recordIndex].producers != null) {\r
-                usageInstanceArray = tokenArray[recordIndex].producers;\r
-                for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
-                    usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
-                    if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
-                        returnArray.add(usageInstance);\r
-                    }\r
-                }\r
-            }\r
-\r
-            if (tokenArray[recordIndex].consumers != null) {\r
-                usageInstanceArray = tokenArray[recordIndex].consumers;\r
-                for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
-                    usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
-                    if (usageInstance.moduleName.equalsIgnoreCase(moduleName)) {\r
-                        returnArray.add(usageInstance);\r
-                    }\r
+            if (tokenArray[recordIndex].consumers.size() != 0) {\r
+                usageInstance = tokenArray[recordIndex].consumers.get(primaryKey);\r
+                if (usageInstance != null) {\r
+                    returnArray.add(usageInstance);\r
                 }\r
             }\r
         }\r
 \r
-        if (returnArray.size() == 0) {\r
-            ActionMessage.warning(this, "Can *not* find any usage instance for " + moduleName + " !");\r
-        }\r
-\r
         return returnArray;\r
     }\r
 \r
@@ -195,112 +279,31 @@ public class MemoryDatabaseManager {
         int                       usageIndex    = 0;\r
         int                       moduleIndex   = 0;\r
         Token[]                   tokenArray    = null;\r
+        Object[]                  usageInstanceArray = null;\r
         List<String>              moduleNames   = new ArrayList<String>();\r
         UsageInstance             usageInstance = null;\r
         boolean                   bFound        = false;\r
 \r
-        tokenArray = this.getRecordArray();\r
-        //\r
-        // Find all producer usage instance for retrieving module's name\r
-        //\r
-        for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
-            for (usageIndex = 0; usageIndex < tokenArray[indexToken].producers.size(); usageIndex ++) {\r
-                usageInstance = tokenArray[indexToken].producers.get(usageIndex);\r
-                bFound        = false;\r
-                for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
-                    if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
-                        bFound = true;\r
-                        break;\r
-                    }\r
-                }\r
-                if (!bFound) {\r
-                    moduleNames.add(usageInstance.moduleName);\r
-                }\r
-            }\r
-        }\r
-\r
+        tokenArray = getRecordArray();\r
         //\r
         // Find all consumer usage instance for retrieving module's name\r
         //\r
         for (indexToken = 0; indexToken < getDBSize(); indexToken ++) {\r
+            usageInstanceArray = tokenArray[indexToken].consumers.entrySet().toArray();\r
             for (usageIndex = 0; usageIndex < tokenArray[indexToken].consumers.size(); usageIndex ++) {\r
-                usageInstance = tokenArray[indexToken].consumers.get(usageIndex);\r
+                usageInstance = (UsageInstance)((Map.Entry)usageInstanceArray[usageIndex]).getValue();\r
                 bFound        = false;\r
                 for (moduleIndex = 0; moduleIndex < moduleNames.size(); moduleIndex ++) {\r
-                    if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.moduleName)) {\r
+                    if (moduleNames.get(moduleIndex).equalsIgnoreCase(usageInstance.getPrimaryKey())) {\r
                         bFound = true;\r
                         break;\r
                     }\r
                 }\r
                 if (!bFound) {\r
-                    moduleNames.add(usageInstance.moduleName);\r
+                    moduleNames.add(usageInstance.getPrimaryKey());\r
                 }\r
             }\r
         }\r
         return moduleNames;\r
     }\r
-\r
-    /**\r
-      Dump all PCD record into file for reviewing.\r
-    **/\r
-    public void DumpAllRecords() {\r
-        BufferedWriter    bWriter           = null;\r
-        Object[]          tokenArray        = null;\r
-        Map.Entry         entry             = null;\r
-        Token             token             = null;\r
-        int               index             = 0;\r
-        int               usageIndex        = 0;\r
-        UsageInstance     usageInstance     = null;\r
-        String            inheritString     = null;\r
-        String            componentTypeName = null;\r
-\r
-        try {\r
-            bWriter = new BufferedWriter(new FileWriter(new File(logFileName)));\r
-            tokenArray = memoryDatabase.entrySet().toArray();\r
-            for (index = 0; index < memoryDatabase.size(); index ++) {\r
-                entry =(Map.Entry) tokenArray [index];\r
-                token =(Token) entry.getValue();\r
-                bWriter.write("****** token [" + Integer.toString(index) + "] ******\r\n");\r
-                bWriter.write(" cName:" + token.cName + "\r\n");\r
-                for (usageIndex = 0; usageIndex < token.producers.size(); usageIndex ++) {\r
-                    usageInstance     =(UsageInstance)token.producers.get(usageIndex);\r
-                    componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
-\r
-                    if (usageInstance.isInherit) {\r
-                        inheritString = "Inherit";\r
-                    } else {\r
-                        inheritString = "";\r
-                    }\r
-                    bWriter.write(String.format("   (Producer)#%d: %s:%s  Package:%s  %s\r\n",\r
-                                                usageIndex,\r
-                                                componentTypeName,\r
-                                                usageInstance.moduleName,\r
-                                                usageInstance.packageName,\r
-                                                inheritString\r
-                                               )\r
-                                 );\r
-                }\r
-                for (usageIndex = 0; usageIndex < token.consumers.size(); usageIndex ++) {\r
-                    usageInstance     =(UsageInstance)token.consumers.get(usageIndex);\r
-                    componentTypeName = CommonDefinition.getComponentTypeString(usageInstance.componentType);\r
-                    if (usageInstance.isInherit) {\r
-                        inheritString = "Inherit";\r
-                    } else {\r
-                        inheritString = "";\r
-                    }\r
-                    bWriter.write(String.format("   (Consumer)#%d: %s:%s  Package:%s  %s\r\n",\r
-                                                usageIndex,\r
-                                                componentTypeName,\r
-                                                usageInstance.moduleName,\r
-                                                usageInstance.packageName,\r
-                                                inheritString\r
-                                               )\r
-                                 );\r
-                }\r
-            }\r
-            bWriter.close();\r
-        } catch (IOException exp) {\r
-            ActionMessage.warning(this, "Failed to open database log file: " + logFileName);\r
-        }\r
-    }\r
 }\r