BaseTools: Fix the bug for VOID* pcd max size from component section
authorYonghong Zhu <yonghong.zhu@intel.com>
Sat, 17 Mar 2018 07:25:32 +0000 (15:25 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Tue, 10 Apr 2018 05:58:14 +0000 (13:58 +0800)
When the Pcd defined in components section, its value's size is larger
than the value's size in [pcd] section, it cause build error, because
original code use the size get in [pcd] section as max size.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/AutoGen/AutoGen.py
BaseTools/Source/Python/AutoGen/GenC.py
BaseTools/Source/Python/AutoGen/GenPcdDb.py
BaseTools/Source/Python/Workspace/BuildClassObject.py

index 5940e88682edf3486abe0feabb9ba64fe3cce897..dfc5b10569204621fc1010fd754f1b8afdb48bed 100644 (file)
@@ -2354,6 +2354,7 @@ class PlatformAutoGen(AutoGen):
 \r
             if FromPcd.MaxDatumSize:\r
                 ToPcd.MaxDatumSize = FromPcd.MaxDatumSize\r
+                ToPcd.MaxSizeUserSet = FromPcd.MaxDatumSize\r
             if FromPcd.DefaultValue:\r
                 ToPcd.DefaultValue = FromPcd.DefaultValue\r
             if FromPcd.TokenValue:\r
@@ -2456,6 +2457,7 @@ class PlatformAutoGen(AutoGen):
         for Name, Guid in Pcds:\r
             Pcd = Pcds[Name, Guid]\r
             if Pcd.DatumType == "VOID*" and Pcd.MaxDatumSize in ['', None]:\r
+                Pcd.MaxSizeUserSet = None\r
                 Value = Pcd.DefaultValue\r
                 if Value in [None, '']:\r
                     Pcd.MaxDatumSize = '1'\r
@@ -4157,9 +4159,12 @@ class ModuleAutoGen(AutoGen):
                             Padding = Padding * 2\r
                             ArraySize = ArraySize / 2\r
                         if ArraySize < (len(PcdValue) + 1):\r
-                            EdkLogger.error("build", AUTOGEN_ERROR,\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
                                             )\r
+                            else:\r
+                                ArraySize = len(PcdValue) + 1\r
                         if ArraySize > len(PcdValue) + 1:\r
                             NewValue = NewValue + Padding * (ArraySize - len(PcdValue) - 1)\r
                         PcdValue = NewValue + Padding.strip().rstrip(',') + '}'\r
@@ -4167,9 +4172,12 @@ class ModuleAutoGen(AutoGen):
                         PcdValue = PcdValue.rstrip('}') + ', 0x00' * (ArraySize - len(PcdValue.split(',')))\r
                         PcdValue += '}'\r
                     else:\r
-                        EdkLogger.error("build", AUTOGEN_ERROR,\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
                                         )\r
+                        else:\r
+                            ArraySize = len(PcdValue) + 1\r
                 PcdItem = '%s.%s|%s|0x%X' % \\r
                     (Pcd.TokenSpaceGuidCName, TokenCName, PcdValue, PatchPcd[1])\r
                 PcdComments = ''\r
index 3b17ec18950618982a23d6f1691d1ddedbb5a780..58da9e6b1784a9573997d5814bc715ec768632d7 100644 (file)
@@ -1109,9 +1109,14 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                     ArraySize = ArraySize / 2;\r
 \r
                 if ArraySize < (len(Value) + 1):\r
-                    EdkLogger.error("build", AUTOGEN_ERROR,\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
                 Value = NewValue + '0 }'\r
             Array = '[%d]' % ArraySize\r
         #\r
index a2c4fb39ec85b13000ff30757e992ea52370bbdb..e415cae2905480b5a4b217151b04e6ad191cc741 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Routines for generating Pcd Database\r
 #\r
-# Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -1390,9 +1390,12 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, DynamicPcdList, Phase):
                     if Pcd.MaxDatumSize != '':\r
                         MaxDatumSize = int(Pcd.MaxDatumSize, 0)\r
                         if MaxDatumSize < Size:\r
-                            EdkLogger.error("build", AUTOGEN_ERROR,\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, Pcd.TokenCName),\r
                                             ExtraData="[%s]" % str(Platform))\r
+                            else:\r
+                                MaxDatumSize = Size\r
                     else:\r
                         MaxDatumSize = Size\r
                     StringTabLen = MaxDatumSize\r
index e95a8fd24b946d92b7d5b4d730f50a391e3f667a..226277a4513075995a3a34f6b3798c4ff8726985 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define each component of the build database\r
 #\r
-# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -55,6 +55,7 @@ class PcdClassObject(object):
         self.DefaultValue = Value\r
         self.TokenValue = Token\r
         self.MaxDatumSize = MaxDatumSize\r
+        self.MaxSizeUserSet = None\r
         self.SkuInfoList = SkuInfoList\r
         self.Phase = "DXE"\r
         self.Pending = False\r