]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Replace PCD type strings with predefined constant
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 1ca8109b4864f11a7294ac7d60eb24a26336eac0..49bf5df632484a86dae652650c15af9350a1279a 100644 (file)
@@ -39,15 +39,9 @@ import Common.GlobalData as GlobalData
 import subprocess\r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
-from collections import OrderedDict\r
+from collections import OrderedDict,defaultdict\r
 \r
-#\r
-# Treat CHAR16 as a synonym for UINT16.  CHAR16 support is required for VFR C structs\r
-#\r
 PcdValueInitName = 'PcdValueInit'\r
-PcdSupportedBaseTypes = ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']\r
-PcdSupportedBaseTypeWidth = {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}\r
-PcdUnsupportedBaseTypes = ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']\r
 \r
 PcdMainCHeader = '''\r
 /**\r
@@ -95,6 +89,8 @@ MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
 LIBS = -lCommon\r
 '''\r
 \r
+variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
+\r
 ## regular expressions for finding decimal and hex numbers\r
 Pattern = re.compile('^[1-9]\d*|0$')\r
 HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
@@ -162,17 +158,17 @@ def GetDependencyList(FileStack,SearchPathList):
 class DscBuildData(PlatformBuildClassObject):\r
     # dict used to convert PCD type in database to string used by build tool\r
     _PCD_TYPE_STRING_ = {\r
-        MODEL_PCD_FIXED_AT_BUILD        :   "FixedAtBuild",\r
-        MODEL_PCD_PATCHABLE_IN_MODULE   :   "PatchableInModule",\r
-        MODEL_PCD_FEATURE_FLAG          :   "FeatureFlag",\r
-        MODEL_PCD_DYNAMIC               :   "Dynamic",\r
-        MODEL_PCD_DYNAMIC_DEFAULT       :   "Dynamic",\r
-        MODEL_PCD_DYNAMIC_HII           :   "DynamicHii",\r
-        MODEL_PCD_DYNAMIC_VPD           :   "DynamicVpd",\r
-        MODEL_PCD_DYNAMIC_EX            :   "DynamicEx",\r
-        MODEL_PCD_DYNAMIC_EX_DEFAULT    :   "DynamicEx",\r
-        MODEL_PCD_DYNAMIC_EX_HII        :   "DynamicExHii",\r
-        MODEL_PCD_DYNAMIC_EX_VPD        :   "DynamicExVpd",\r
+        MODEL_PCD_FIXED_AT_BUILD        :   TAB_PCDS_FIXED_AT_BUILD,\r
+        MODEL_PCD_PATCHABLE_IN_MODULE   :   TAB_PCDS_PATCHABLE_IN_MODULE,\r
+        MODEL_PCD_FEATURE_FLAG          :   TAB_PCDS_FEATURE_FLAG,\r
+        MODEL_PCD_DYNAMIC               :   TAB_PCDS_DYNAMIC,\r
+        MODEL_PCD_DYNAMIC_DEFAULT       :   TAB_PCDS_DYNAMIC,\r
+        MODEL_PCD_DYNAMIC_HII           :   TAB_PCDS_DYNAMIC_HII,\r
+        MODEL_PCD_DYNAMIC_VPD           :   TAB_PCDS_DYNAMIC_VPD,\r
+        MODEL_PCD_DYNAMIC_EX            :   TAB_PCDS_DYNAMIC_EX,\r
+        MODEL_PCD_DYNAMIC_EX_DEFAULT    :   TAB_PCDS_DYNAMIC_EX,\r
+        MODEL_PCD_DYNAMIC_EX_HII        :   TAB_PCDS_DYNAMIC_EX_HII,\r
+        MODEL_PCD_DYNAMIC_EX_VPD        :   TAB_PCDS_DYNAMIC_EX_VPD,\r
     }\r
 \r
     # dict used to convert part of [Defines] to members of DscBuildData directly\r
@@ -1057,7 +1053,7 @@ class DscBuildData(PlatformBuildClassObject):
             TokenCName += '.' + FieldName\r
         if PcdValue.startswith('H'):\r
             if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
-                PcdDatumType = 'VOID*'\r
+                PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 return PcdValue\r
@@ -1068,7 +1064,7 @@ class DscBuildData(PlatformBuildClassObject):
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
             if FieldName and IsFieldValueAnArray(PcdValue):\r
-                PcdDatumType = 'VOID*'\r
+                PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 return PcdValue\r
@@ -1080,7 +1076,7 @@ class DscBuildData(PlatformBuildClassObject):
         elif PcdValue.startswith('L'):\r
             PcdValue = 'L"' + PcdValue[1:] + '"'\r
             if FieldName and IsFieldValueAnArray(PcdValue):\r
-                PcdDatumType = 'VOID*'\r
+                PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 return PcdValue\r
@@ -1095,7 +1091,7 @@ class DscBuildData(PlatformBuildClassObject):
             if PcdValue.upper() == 'TRUE':\r
                 PcdValue = str(1)\r
             if not FieldName:\r
-                if PcdDatumType not in ['UINT8','UINT16','UINT32','UINT64','BOOLEAN']:\r
+                if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
                     PcdValue = '"' + PcdValue + '"'\r
             else:\r
                 IsArray = False\r
@@ -1107,7 +1103,7 @@ class DscBuildData(PlatformBuildClassObject):
                 except:\r
                     PcdValue = '"' + PcdValue + '"'\r
                 if IsFieldValueAnArray(PcdValue):\r
-                    PcdDatumType = 'VOID*'\r
+                    PcdDatumType = TAB_VOID\r
                     IsArray = True\r
                 if not IsArray:\r
                     return PcdValue\r
@@ -1185,11 +1181,10 @@ class DscBuildData(PlatformBuildClassObject):
                             options[Key] += ' ' + Option\r
         return self._ModuleTypeOptions[Edk, ModuleType]\r
 \r
-    def GetStructurePcdInfo(self, PcdSet):\r
-        structure_pcd_data = {}\r
+    @staticmethod\r
+    def GetStructurePcdInfo(PcdSet):\r
+        structure_pcd_data = defaultdict(list)\r
         for item in PcdSet:\r
-            if (item[0],item[1]) not in structure_pcd_data:\r
-                structure_pcd_data[(item[0],item[1])] = []\r
             structure_pcd_data[(item[0],item[1])].append(item)\r
 \r
         return structure_pcd_data\r
@@ -1200,7 +1195,7 @@ class DscBuildData(PlatformBuildClassObject):
         for item in GlobalData.BuildOptionPcd:\r
             if len(item) == 5 and (item[1],item[0]) in StruPcds:\r
                 StructurePcdInCom[(item[0],item[1],item[2] )] = (item[3],item[4])\r
-        GlobalPcds = set([(item[0],item[1]) for item in StructurePcdInCom.keys()])\r
+        GlobalPcds = {(item[0],item[1]) for item in StructurePcdInCom}\r
         for Pcd in StruPcds.values():\r
             if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
                 continue\r
@@ -1246,7 +1241,7 @@ class DscBuildData(PlatformBuildClassObject):
                             for defaultstore in SkuInfo.DefaultStoreDict:\r
                                 SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
                     if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
-                        if Pcd.DatumType == "VOID*":\r
+                        if Pcd.DatumType == TAB_VOID:\r
                             if not Pcd.MaxDatumSize:\r
                                 Pcd.MaxDatumSize = '0'\r
                             CurrentSize = int(Pcd.MaxDatumSize,16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
@@ -1276,7 +1271,7 @@ class DscBuildData(PlatformBuildClassObject):
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
         SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
         SkuIds.update({TAB_DEFAULT:0})\r
-        DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
+        DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
 \r
         S_PcdSet = []\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -1296,7 +1291,7 @@ class DscBuildData(PlatformBuildClassObject):
                 S_PcdSet.append([ TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]])\r
 \r
         # handle pcd value override\r
-        StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
+        StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
@@ -1542,25 +1537,19 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     @staticmethod\r
     def GetPcdMaxSize(Pcd):\r
+        if Pcd.DatumType in TAB_PCD_NUMERIC_TYPES:\r
+            return MAX_SIZE_TYPE[Pcd.DatumType]\r
+\r
         MaxSize = int(Pcd.MaxDatumSize,10) if Pcd.MaxDatumSize else 0\r
-        if Pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
-            if Pcd.PcdValueFromComm:\r
-                if Pcd.PcdValueFromComm.startswith("{") and Pcd.PcdValueFromComm.endswith("}"):\r
-                    MaxSize = max([len(Pcd.PcdValueFromComm.split(",")),MaxSize])\r
-                elif Pcd.PcdValueFromComm.startswith("\"") or Pcd.PcdValueFromComm.startswith("\'"):\r
-                    MaxSize = max([len(Pcd.PcdValueFromComm)-2+1,MaxSize])\r
-                elif Pcd.PcdValueFromComm.startswith("L\""):\r
-                    MaxSize = max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize])\r
-                else:\r
-                    MaxSize = max([len(Pcd.PcdValueFromComm),MaxSize])\r
-        elif Pcd.DatumType not in ['BOOLEAN','UINT8']:\r
-            MaxSize = 1\r
-        elif Pcd.DatumType  == 'UINT16':\r
-            MaxSize = 2\r
-        elif Pcd.DatumType  == 'UINT32':\r
-            MaxSize = 4\r
-        elif Pcd.DatumType  == 'UINT64':\r
-            MaxSize = 8\r
+        if Pcd.PcdValueFromComm:\r
+            if Pcd.PcdValueFromComm.startswith("{") and Pcd.PcdValueFromComm.endswith("}"):\r
+                return max([len(Pcd.PcdValueFromComm.split(",")),MaxSize])\r
+            elif Pcd.PcdValueFromComm.startswith("\"") or Pcd.PcdValueFromComm.startswith("\'"):\r
+                return max([len(Pcd.PcdValueFromComm)-2+1,MaxSize])\r
+            elif Pcd.PcdValueFromComm.startswith("L\""):\r
+                return max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize])\r
+            else:\r
+                return max([len(Pcd.PcdValueFromComm),MaxSize])\r
         return MaxSize\r
 \r
     def GenerateSizeFunction(self,Pcd):\r
@@ -1574,7 +1563,7 @@ class DscBuildData(PlatformBuildClassObject):
                 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                     try:\r
-                        Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
+                        Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
                     except BadExpression:\r
                         EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                         (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
@@ -1604,7 +1593,7 @@ class DscBuildData(PlatformBuildClassObject):
                         IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
                         if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
                             try:\r
-                                Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
+                                Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
                             except BadExpression:\r
                                 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                                 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
@@ -1628,7 +1617,7 @@ class DscBuildData(PlatformBuildClassObject):
             IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
             if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
                 try:\r
-                    Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
+                    Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
                 except BadExpression:\r
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                     (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
@@ -1664,7 +1653,7 @@ class DscBuildData(PlatformBuildClassObject):
         IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
         if IsArray:\r
             try:\r
-                DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
+                DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
             except BadExpression:\r
                 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
                                 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
@@ -1685,7 +1674,7 @@ class DscBuildData(PlatformBuildClassObject):
                 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
-                        FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+                        FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                     except BadExpression:\r
                         EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                         (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1],FieldList[FieldName][2]))\r
@@ -1738,7 +1727,7 @@ class DscBuildData(PlatformBuildClassObject):
                 IsArray = IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
-                        FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
+                        FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                     except BadExpression:\r
                         EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
                                         (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
@@ -1768,7 +1757,7 @@ class DscBuildData(PlatformBuildClassObject):
                     IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
-                            FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+                            FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                         except BadExpression:\r
                             EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                             (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
@@ -1812,7 +1801,7 @@ class DscBuildData(PlatformBuildClassObject):
                 IsArray = IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
-                        FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
+                        FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                     except BadExpression:\r
                         EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
                                         (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
@@ -1831,7 +1820,7 @@ class DscBuildData(PlatformBuildClassObject):
                 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
-                        FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+                        FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                     except BadExpression:\r
                         EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
                                         (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
@@ -1958,13 +1947,11 @@ class DscBuildData(PlatformBuildClassObject):
         InitByteValue = ""\r
         CApp = PcdMainCHeader\r
 \r
-        Includes = {}\r
         IncludeFiles = set()\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
             for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
-                if IncludeFile not in Includes:\r
-                    Includes[IncludeFile] = True\r
+                if IncludeFile not in IncludeFiles:\r
                     IncludeFiles.add(IncludeFile)\r
                     CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
         CApp = CApp + '\n'\r
@@ -2338,7 +2325,7 @@ class DscBuildData(PlatformBuildClassObject):
         Pcds = {}\r
         DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
         SkuIds = {skuname:skuid for skuname,skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
-        DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
+        DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict])\r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
             PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
             self.CopyDscRawValue(PcdObj)\r
@@ -2427,7 +2414,7 @@ class DscBuildData(PlatformBuildClassObject):
             if VariableOffset.isdigit():\r
                 if int(VariableOffset, 10) > 0xFFFF:\r
                     ExceedMax = True\r
-            elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):\r
+            elif variablePattern.match(VariableOffset):\r
                 if int(VariableOffset, 16) > 0xFFFF:\r
                     ExceedMax = True\r
             # For Offset written in "A.B"\r
@@ -2503,7 +2490,7 @@ class DscBuildData(PlatformBuildClassObject):
                 MaxSize = int(pcd.MaxDatumSize, 0)\r
             else:\r
                 MaxSize = 0\r
-            if pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
+            if pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
                 for (_, skuobj) in pcd.SkuInfoList.items():\r
                     datalen = 0\r
                     skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r