]> 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 2c2433a95cac3e4801b041386eb4cf6444e243a8..2e29106323e22d13798b59462021160ccb14029d 100644 (file)
@@ -15,30 +15,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 package org.tianocore.build.pcd.entity;\r
 \r
 **/\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.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Comparator;\r
 import java.util.HashMap;\r
 import java.util.HashMap;\r
-import java.util.Hashtable;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.UUID;\r
 \r
 \r
-import org.tianocore.build.autogen.CommonDefinition;\r
-import org.tianocore.build.pcd.action.ActionMessage;\r
-\r
-class AlignmentSizeComp implements Comparator {\r
-    public int compare (Object a, Object b) {\r
-        Token tA = (Token) a;\r
-        Token tB = (Token) b;\r
-\r
-        return Token.getAutogendatumTypeAlignmentSize(tA.datumType) \r
-                - Token.getAutogendatumTypeAlignmentSize(tB.datumType);\r
-    }\r
-}\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
 \r
 /** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
 **/\r
@@ -47,16 +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
     ///  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
     ///\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
     ///\r
-    private static String              logFileName    = null;\r
-\r
+    /// \r
+    /// \r
+    public static String CurrentModuleName                 = null;\r
     public static String PcdPeimHString       = "";\r
     public static String PcdPeimHString       = "";\r
-               public static String PcdPeimCString                             = "";\r
-    public static String PcdDxeHString                         = "";\r
-    public static String PcdDxeCString                         = "";\r
+    public static String PcdPeimCString       = "";\r
+    public static String PcdDxeHString        = "";\r
+    public static String PcdDxeCString        = "";\r
 \r
     /**\r
       Constructure function\r
 \r
     /**\r
       Constructure function\r
@@ -70,22 +59,6 @@ public class MemoryDatabaseManager {
         }\r
     }\r
 \r
         }\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
     /**\r
       Judege whether token exists in memory database\r
       \r
@@ -153,16 +126,18 @@ public class MemoryDatabaseManager {
         return tokenArray;\r
     }\r
 \r
         return tokenArray;\r
     }\r
 \r
-\r
+    /**\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
     private ArrayList getDynamicRecordArray() {\r
         Token[]     tokenArray  =   getRecordArray();\r
         int         index       =   0;\r
-        int         count       =   0;\r
-        ArrayList   al          =   new ArrayList();\r
+        ArrayList<Token>   al   =   new ArrayList<Token>();\r
 \r
         for (index = 0; index < tokenArray.length; index++) {\r
 \r
         for (index = 0; index < tokenArray.length; index++) {\r
-            if (tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC ||\r
-                tokenArray[index].pcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+            if (tokenArray[index].isDynamicPCD) {\r
                 al.add(tokenArray[index]);\r
             }\r
         }\r
                 al.add(tokenArray[index]);\r
             }\r
         }\r
@@ -176,69 +151,103 @@ public class MemoryDatabaseManager {
           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
           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
     **/\r
-    public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) {\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
         int                     usageInstanceIndex  =   0;\r
         int                     index               =   0;\r
         ArrayList               tokenArrayList      =   getDynamicRecordArray();\r
-        List<UsageInstance>     usageInstanceArray  =   null;\r
+        Object[]                usageInstanceArray  =   null;\r
         UsageInstance           usageInstance       =   null;\r
 \r
         UsageInstance           usageInstance       =   null;\r
 \r
-                               //pei = new ArrayList<Token>();\r
-                               //dxe = new ArrayList<Token>();\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
 \r
         for (index = 0; index < tokenArrayList.size(); index++) {\r
             boolean found   =   false;\r
             Token       token = (Token) tokenArrayList.get(index);\r
-            if (token.producers != null) {\r
-                usageInstanceArray = token.producers;\r
-                for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex++) {\r
-                    usageInstance = (UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
-                    if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\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
                         pei.add(token);\r
                         found = true;\r
                         break;\r
                     }\r
                 }\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
             if (!found) {\r
                 if (token.consumers != null) {\r
-                    usageInstanceArray = token.consumers;\r
-                    for (usageInstanceIndex = 0; usageInstanceIndex < usageInstanceArray.size(); usageInstanceIndex ++) {\r
-                        usageInstance =(UsageInstance) usageInstanceArray.get(usageInstanceIndex);\r
-                        if (CommonDefinition.isPeiPhaseComponent(usageInstance.componentType)) {\r
-                            pei.add(token);\r
-                                                                                                               found = true;\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
                             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
-                                               //\r
-                                               // If no PEI components reference the PCD entry, we insert it to DXE list\r
-                                               //\r
-                                               if (!found) {\r
-                                                               dxe.add(token);\r
-                                               }\r
         }\r
 \r
         }\r
 \r
-                               return;\r
+        return;\r
     }\r
 \r
     }\r
 \r
-               /**\r
-      Get all PCD record for a module according to module's name.\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
      \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
         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
         UsageInstance         usageInstance       = null;\r
         List<UsageInstance>   returnArray         = new ArrayList<UsageInstance>();\r
 \r
@@ -248,29 +257,12 @@ public class MemoryDatabaseManager {
         // Loop to find all PCD record related to current module\r
         //\r
         for (recordIndex = 0; recordIndex < getDBSize(); recordIndex ++) {\r
         // 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
+            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
-\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
-                }\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
         return returnArray;\r
@@ -287,112 +279,31 @@ public class MemoryDatabaseManager {
         int                       usageIndex    = 0;\r
         int                       moduleIndex   = 0;\r
         Token[]                   tokenArray    = null;\r
         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
         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
         //\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
             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
                 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
                         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
         }\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
 }\r