]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenC.py
BaseTools: Fix generating array's size is incorrect in AutoGen.c
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
index 89a3e56be3f9e0b2351cd1f56175051bc28cd20f..6192e86753c32129ae75aea9aa79bc7339b3cc2a 100644 (file)
@@ -863,31 +863,6 @@ def DynExPcdTokenNumberMapping(Info, AutoGenH):
                                     % (RealTokenCName, RealTokenCName, RealTokenCName, RealTokenCName))\r
                 TokenCNameList.add(TokenCName)\r
 \r
-def GetPcdSize(Pcd):\r
-    if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
-        Value = Pcd.DefaultValue\r
-        if Value in [None, '']:\r
-            return 1\r
-        elif Value[0] == 'L':\r
-            return (len(Value) - 2) * 2\r
-        elif Value[0] == '{':\r
-            return len(Value.split(','))\r
-        else:\r
-            return len(Value) - 1\r
-    if Pcd.DatumType == TAB_UINT64:\r
-        return 8\r
-    if Pcd.DatumType == TAB_UINT32:\r
-        return 4\r
-    if Pcd.DatumType == TAB_UINT16:\r
-        return 2\r
-    if Pcd.DatumType == TAB_UINT8:\r
-        return 1\r
-    if Pcd.DatumType == 'BOOLEAN':\r
-        return 1\r
-    else:\r
-        return Pcd.MaxDatumSize\r
-\r
-\r
 ## Create code for module PCDs\r
 #\r
 #   @param      Info        The ModuleAutoGen object\r
@@ -1082,7 +1057,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 if not Value.endswith('U'):\r
                     Value += 'U'\r
         if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
-            if Pcd.MaxDatumSize is None or Pcd.MaxDatumSize == '':\r
+            if not Pcd.MaxDatumSize:\r
                 EdkLogger.error("build", AUTOGEN_ERROR,\r
                                 "Unknown [MaxDatumSize] of PCD [%s.%s]" % (Pcd.TokenSpaceGuidCName, TokenCName),\r
                                 ExtraData="[%s]" % str(Info))\r
@@ -1090,11 +1065,13 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             ArraySize = int(Pcd.MaxDatumSize, 0)\r
             if Value[0] == '{':\r
                 Type = '(VOID *)'\r
+                ValueSize = len(Value.split(','))\r
             else:\r
                 if Value[0] == 'L':\r
                     Unicode = True\r
                 Value = Value.lstrip('L')   #.strip('"')\r
                 Value = eval(Value)         # translate escape character\r
+                ValueSize = len(Value) + 1\r
                 NewValue = '{'\r
                 for Index in range(0,len(Value)):\r
                     if Unicode:\r
@@ -1102,18 +1079,17 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                     else:\r
                         NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ', '\r
                 if Unicode:\r
-                    ArraySize = ArraySize / 2;\r
-\r
-                if ArraySize < (len(Value) + 1):\r
-                    if Pcd.MaxSizeUserSet:\r
-                        EdkLogger.error("build", AUTOGEN_ERROR,\r
-                                    "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, TokenCName),\r
-                                    ExtraData="[%s]" % str(Info))\r
-                    else:\r
-                        ArraySize = GetPcdSize(Pcd)\r
-                        if Unicode:\r
-                            ArraySize = ArraySize / 2\r
+                    ArraySize = ArraySize / 2\r
                 Value = NewValue + '0 }'\r
+            if ArraySize < ValueSize:\r
+                if Pcd.MaxSizeUserSet:\r
+                    EdkLogger.error("build", AUTOGEN_ERROR,\r
+                                "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, TokenCName),\r
+                                ExtraData="[%s]" % str(Info))\r
+                else:\r
+                    ArraySize = Pcd.GetPcdSize()\r
+                    if Unicode:\r
+                        ArraySize = ArraySize / 2\r
             Array = '[%d]' % ArraySize\r
         #\r
         # skip casting for fixed at build since it breaks ARM assembly.\r
@@ -1150,7 +1126,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))\r
             AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))\r
                 \r
-            PcdDataSize = GetPcdSize(Pcd)\r
+            PcdDataSize = Pcd.GetPcdSize()\r
             if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD:\r
                 AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
                 AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
@@ -1167,14 +1143,14 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             AutoGenH.Append('extern volatile %s  %s  %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
             AutoGenH.Append('#define %s  %s%s\n' % (GetModeName, Type, PcdVariableName))\r
             \r
-            PcdDataSize = GetPcdSize(Pcd)\r
+            PcdDataSize = Pcd.GetPcdSize()\r
             AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
             \r
             AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
             AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
             AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))\r
         else:\r
-            PcdDataSize = GetPcdSize(Pcd)\r
+            PcdDataSize = Pcd.GetPcdSize()\r
             AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
             AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
             \r
@@ -1333,7 +1309,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
         else:\r
             AutoGenH.Append('extern volatile  %s  %s%s;\n' % (DatumType, PcdVariableName, Array))\r
         AutoGenH.Append('#define %s  %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))\r
-        PcdDataSize = GetPcdSize(Pcd)\r
+        PcdDataSize = Pcd.GetPcdSize()\r
         if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))\r
@@ -1367,7 +1343,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 AutoGenH.Append('#define _PCD_VALUE_%s %s%s\n' %(TokenCName, Type, PcdVariableName))\r
             else:\r
                 AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue))\r
-        PcdDataSize = GetPcdSize(Pcd)\r
+        PcdDataSize = Pcd.GetPcdSize()\r
         if PcdItemType == TAB_PCDS_FIXED_AT_BUILD:\r
             if Pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
                 if ConstFixedPcd:\r