]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools:Updata the output encoding of the Popen function
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 9e7b8a18c28bd5bfa1ca6cef2914320f554d5575..620e48fa7f5945d1c829f701e3aac0469d0379e4 100644 (file)
@@ -1,15 +1,9 @@
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ## Platform build information from DSC file\r
 #\r
 \r
 ## Platform build information from DSC file\r
 # into PlatformBuildClassObject form for easier use for AutoGen.\r
 #\r
 from __future__ import print_function\r
 # into PlatformBuildClassObject form for easier use for AutoGen.\r
 #\r
 from __future__ import print_function\r
+from __future__ import absolute_import\r
 from Common.StringUtils import *\r
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
 from Common.StringUtils import *\r
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
-from Common.TargetTxtClassObject import *\r
-from Common.ToolDefClassObject import *\r
-from MetaDataTable import *\r
-from MetaFileTable import *\r
-from MetaFileParser import *\r
+from Common.TargetTxtClassObject import TargetTxtClassObject\r
+from Common.ToolDefClassObject import ToolDefClassObject\r
+from .MetaDataTable import *\r
+from .MetaFileTable import *\r
+from .MetaFileParser import *\r
 \r
 \r
-from WorkspaceCommon import GetDeclaredPcd\r
+from .WorkspaceCommon import GetDeclaredPcd\r
 from Common.Misc import AnalyzeDscPcd\r
 from Common.Misc import AnalyzeDscPcd\r
-from Common.Misc import ProcessDuplicatedInf\r
+from Common.Misc import ProcessDuplicatedInf,RemoveCComments,ArrayIndex\r
 import re\r
 from Common.Parsing import IsValidWord\r
 from Common.VariableAttributes import VariableAttributes\r
 import Common.GlobalData as GlobalData\r
 import subprocess\r
 import re\r
 from Common.Parsing import IsValidWord\r
 from Common.VariableAttributes import VariableAttributes\r
 import Common.GlobalData as GlobalData\r
 import subprocess\r
+from functools import reduce\r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 from collections import OrderedDict, defaultdict\r
 \r
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 from collections import OrderedDict, defaultdict\r
 \r
+def _IsFieldValueAnArray (Value):\r
+    Value = Value.strip()\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
+        return True\r
+    if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    if Value[0] == '{' and Value[-1] == '}':\r
+        return True\r
+    if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    return False\r
+\r
 PcdValueInitName = 'PcdValueInit'\r
 \r
 PcdMainCHeader = '''\r
 PcdValueInitName = 'PcdValueInit'\r
 \r
 PcdMainCHeader = '''\r
@@ -85,13 +97,19 @@ LIBS = $(LIB_PATH)\Common.lib
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
+AppTarget = '''\r
+all: $(APPFILE)\r
+$(APPFILE): $(OBJECTS)\r
+%s\r
+'''\r
+\r
 PcdGccMakefile = '''\r
 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
 LIBS = -lCommon\r
 '''\r
 \r
 variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
 PcdGccMakefile = '''\r
 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
 LIBS = -lCommon\r
 '''\r
 \r
 variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
-\r
+SkuIdPattern = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$')\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
 ## 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
@@ -130,8 +148,14 @@ def GetDependencyList(FileStack, SearchPathList):
             if len(FileContent) == 0:\r
                 continue\r
 \r
             if len(FileContent) == 0:\r
                 continue\r
 \r
-            if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
-                FileContent = unicode(FileContent, "utf-16")\r
+            try:\r
+                if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
+                    FileContent = FileContent.decode('utf-16')\r
+                else:\r
+                    FileContent = FileContent.decode()\r
+            except:\r
+                # The file is not txt file. for example .mcb file\r
+                continue\r
             IncludedFileList = gIncludePattern.findall(FileContent)\r
 \r
             for Inc in IncludedFileList:\r
             IncludedFileList = gIncludePattern.findall(FileContent)\r
 \r
             for Inc in IncludedFileList:\r
@@ -217,10 +241,10 @@ class DscBuildData(PlatformBuildClassObject):
         self._Toolchain = Toolchain\r
         self._ToolChainFamily = None\r
         self._Clear()\r
         self._Toolchain = Toolchain\r
         self._ToolChainFamily = None\r
         self._Clear()\r
-        self._HandleOverridePath()\r
         self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
         self.DefaultStores = None\r
         self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
         self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
         self.DefaultStores = None\r
         self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
+\r
     @property\r
     def OutputPath(self):\r
         if os.getenv("WORKSPACE"):\r
     @property\r
     def OutputPath(self):\r
         if os.getenv("WORKSPACE"):\r
@@ -272,59 +296,30 @@ class DscBuildData(PlatformBuildClassObject):
         self._RFCLanguages      = None\r
         self._ISOLanguages      = None\r
         self._VpdToolGuid       = None\r
         self._RFCLanguages      = None\r
         self._ISOLanguages      = None\r
         self._VpdToolGuid       = None\r
-        self.__Macros           = None\r
+        self._MacroDict         = None\r
         self.DefaultStores      = None\r
 \r
         self.DefaultStores      = None\r
 \r
-\r
-    ## handle Override Path of Module\r
-    def _HandleOverridePath(self):\r
-        RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
-        for Record in RecordList:\r
-            ModuleId = Record[6]\r
-            LineNo = Record[7]\r
-            ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)\r
-            RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]\r
-            if RecordList != []:\r
-                SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0]))\r
-\r
-                # Check if the source override path exists\r
-                if not os.path.isdir(SourceOverridePath):\r
-                    EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo)\r
-\r
-                # Add to GlobalData Variables\r
-                GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath\r
-\r
     ## Get current effective macros\r
     ## Get current effective macros\r
-    def _GetMacros(self):\r
-        if self.__Macros is None:\r
-            self.__Macros = {}\r
-            self.__Macros.update(GlobalData.gPlatformDefines)\r
-            self.__Macros.update(GlobalData.gGlobalDefines)\r
-            self.__Macros.update(GlobalData.gCommandLineDefines)\r
-        return self.__Macros\r
+    @property\r
+    def _Macros(self):\r
+        if self._MacroDict is None:\r
+            self._MacroDict = {}\r
+            self._MacroDict.update(GlobalData.gPlatformDefines)\r
+            self._MacroDict.update(GlobalData.gGlobalDefines)\r
+            self._MacroDict.update(GlobalData.gCommandLineDefines)\r
+        return self._MacroDict\r
 \r
     ## Get architecture\r
 \r
     ## Get architecture\r
-    def _GetArch(self):\r
+    @property\r
+    def Arch(self):\r
         return self._Arch\r
         return self._Arch\r
-\r
-    ## Set architecture\r
-    #\r
-    #   Changing the default ARCH to another may affect all other information\r
-    # because all information in a platform may be ARCH-related. That's\r
-    # why we need to clear all internal used members, in order to cause all\r
-    # information to be re-retrieved.\r
-    #\r
-    #   @param  Value   The value of ARCH\r
-    #\r
-    def _SetArch(self, Value):\r
-        if self._Arch == Value:\r
-            return\r
-        self._Arch = Value\r
-        self._Clear()\r
+    @property\r
+    def Dir(self):\r
+        return self.MetaFile.Dir\r
 \r
     ## Retrieve all information in [Defines] section\r
     #\r
 \r
     ## Retrieve all information in [Defines] section\r
     #\r
-    #   (Retriving all [Defines] information in one-shot is just to save time.)\r
+    #   (Retrieving all [Defines] information in one-shot is just to save time.)\r
     #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
     #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
@@ -424,7 +419,8 @@ class DscBuildData(PlatformBuildClassObject):
         self._Header = 'DUMMY'\r
 \r
     ## Retrieve platform name\r
         self._Header = 'DUMMY'\r
 \r
     ## Retrieve platform name\r
-    def _GetPlatformName(self):\r
+    @property\r
+    def PlatformName(self):\r
         if self._PlatformName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._PlatformName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -432,8 +428,13 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
         return self._PlatformName\r
 \r
                 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
         return self._PlatformName\r
 \r
+    @property\r
+    def Platform(self):\r
+        return self.PlatformName\r
+\r
     ## Retrieve file guid\r
     ## Retrieve file guid\r
-    def _GetFileGuid(self):\r
+    @property\r
+    def Guid(self):\r
         if self._Guid is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._Guid is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -442,7 +443,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Guid\r
 \r
     ## Retrieve platform version\r
         return self._Guid\r
 \r
     ## Retrieve platform version\r
-    def _GetVersion(self):\r
+    @property\r
+    def Version(self):\r
         if self._Version is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._Version is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -451,7 +453,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Version\r
 \r
     ## Retrieve platform description file version\r
         return self._Version\r
 \r
     ## Retrieve platform description file version\r
-    def _GetDscSpec(self):\r
+    @property\r
+    def DscSpecification(self):\r
         if self._DscSpecification is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._DscSpecification is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -460,7 +463,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._DscSpecification\r
 \r
     ## Retrieve OUTPUT_DIRECTORY\r
         return self._DscSpecification\r
 \r
     ## Retrieve OUTPUT_DIRECTORY\r
-    def _GetOutpuDir(self):\r
+    @property\r
+    def OutputDirectory(self):\r
         if self._OutputDirectory is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._OutputDirectory is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -469,7 +473,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._OutputDirectory\r
 \r
     ## Retrieve SUPPORTED_ARCHITECTURES\r
         return self._OutputDirectory\r
 \r
     ## Retrieve SUPPORTED_ARCHITECTURES\r
-    def _GetSupArch(self):\r
+    @property\r
+    def SupArchList(self):\r
         if self._SupArchList is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._SupArchList is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -478,7 +483,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._SupArchList\r
 \r
     ## Retrieve BUILD_TARGETS\r
         return self._SupArchList\r
 \r
     ## Retrieve BUILD_TARGETS\r
-    def _GetBuildTarget(self):\r
+    @property\r
+    def BuildTargets(self):\r
         if self._BuildTargets is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._BuildTargets is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -486,14 +492,17 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
         return self._BuildTargets\r
 \r
                 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
         return self._BuildTargets\r
 \r
-    def _GetPcdInfoFlag(self):\r
+    @property\r
+    def PcdInfoFlag(self):\r
         if self._PcdInfoFlag is None or self._PcdInfoFlag.upper() == 'FALSE':\r
             return False\r
         elif self._PcdInfoFlag.upper() == 'TRUE':\r
             return True\r
         else:\r
             return False\r
         if self._PcdInfoFlag is None or self._PcdInfoFlag.upper() == 'FALSE':\r
             return False\r
         elif self._PcdInfoFlag.upper() == 'TRUE':\r
             return True\r
         else:\r
             return False\r
-    def _GetVarCheckFlag(self):\r
+\r
+    @property\r
+    def VarCheckFlag(self):\r
         if self._VarCheckFlag is None or self._VarCheckFlag.upper() == 'FALSE':\r
             return False\r
         elif self._VarCheckFlag.upper() == 'TRUE':\r
         if self._VarCheckFlag is None or self._VarCheckFlag.upper() == 'FALSE':\r
             return False\r
         elif self._VarCheckFlag.upper() == 'TRUE':\r
@@ -502,7 +511,8 @@ class DscBuildData(PlatformBuildClassObject):
             return False\r
 \r
     # # Retrieve SKUID_IDENTIFIER\r
             return False\r
 \r
     # # Retrieve SKUID_IDENTIFIER\r
-    def _GetSkuName(self):\r
+    @property\r
+    def SkuName(self):\r
         if self._SkuName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._SkuName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -511,10 +521,12 @@ class DscBuildData(PlatformBuildClassObject):
         return self._SkuName\r
 \r
     ## Override SKUID_IDENTIFIER\r
         return self._SkuName\r
 \r
     ## Override SKUID_IDENTIFIER\r
-    def _SetSkuName(self, Value):\r
+    @SkuName.setter\r
+    def SkuName(self, Value):\r
         self._SkuName = Value\r
 \r
         self._SkuName = Value\r
 \r
-    def _GetFdfFile(self):\r
+    @property\r
+    def FlashDefinition(self):\r
         if self._FlashDefinition is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._FlashDefinition is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -522,7 +534,8 @@ class DscBuildData(PlatformBuildClassObject):
                 self._FlashDefinition = ''\r
         return self._FlashDefinition\r
 \r
                 self._FlashDefinition = ''\r
         return self._FlashDefinition\r
 \r
-    def _GetPrebuild(self):\r
+    @property\r
+    def Prebuild(self):\r
         if self._Prebuild is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._Prebuild is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -530,7 +543,8 @@ class DscBuildData(PlatformBuildClassObject):
                 self._Prebuild = ''\r
         return self._Prebuild\r
 \r
                 self._Prebuild = ''\r
         return self._Prebuild\r
 \r
-    def _GetPostbuild(self):\r
+    @property\r
+    def Postbuild(self):\r
         if self._Postbuild is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._Postbuild is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -539,7 +553,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Postbuild\r
 \r
     ## Retrieve FLASH_DEFINITION\r
         return self._Postbuild\r
 \r
     ## Retrieve FLASH_DEFINITION\r
-    def _GetBuildNumber(self):\r
+    @property\r
+    def BuildNumber(self):\r
         if self._BuildNumber is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._BuildNumber is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -548,7 +563,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._BuildNumber\r
 \r
     ## Retrieve MAKEFILE_NAME\r
         return self._BuildNumber\r
 \r
     ## Retrieve MAKEFILE_NAME\r
-    def _GetMakefileName(self):\r
+    @property\r
+    def MakefileName(self):\r
         if self._MakefileName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._MakefileName is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -557,7 +573,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._MakefileName\r
 \r
     ## Retrieve BsBaseAddress\r
         return self._MakefileName\r
 \r
     ## Retrieve BsBaseAddress\r
-    def _GetBsBaseAddress(self):\r
+    @property\r
+    def BsBaseAddress(self):\r
         if self._BsBaseAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._BsBaseAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -566,7 +583,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._BsBaseAddress\r
 \r
     ## Retrieve RtBaseAddress\r
         return self._BsBaseAddress\r
 \r
     ## Retrieve RtBaseAddress\r
-    def _GetRtBaseAddress(self):\r
+    @property\r
+    def RtBaseAddress(self):\r
         if self._RtBaseAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._RtBaseAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -575,7 +593,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._RtBaseAddress\r
 \r
     ## Retrieve the top address for the load fix address\r
         return self._RtBaseAddress\r
 \r
     ## Retrieve the top address for the load fix address\r
-    def _GetLoadFixAddress(self):\r
+    @property\r
+    def LoadFixAddress(self):\r
         if self._LoadFixAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._LoadFixAddress is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -605,7 +624,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._LoadFixAddress\r
 \r
     ## Retrieve RFCLanguage filter\r
         return self._LoadFixAddress\r
 \r
     ## Retrieve RFCLanguage filter\r
-    def _GetRFCLanguages(self):\r
+    @property\r
+    def RFCLanguages(self):\r
         if self._RFCLanguages is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._RFCLanguages is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -614,15 +634,18 @@ class DscBuildData(PlatformBuildClassObject):
         return self._RFCLanguages\r
 \r
     ## Retrieve ISOLanguage filter\r
         return self._RFCLanguages\r
 \r
     ## Retrieve ISOLanguage filter\r
-    def _GetISOLanguages(self):\r
+    @property\r
+    def ISOLanguages(self):\r
         if self._ISOLanguages is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
             if self._ISOLanguages is None:\r
                 self._ISOLanguages = []\r
         return self._ISOLanguages\r
         if self._ISOLanguages is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
             if self._ISOLanguages is None:\r
                 self._ISOLanguages = []\r
         return self._ISOLanguages\r
+\r
     ## Retrieve the GUID string for VPD tool\r
     ## Retrieve the GUID string for VPD tool\r
-    def _GetVpdToolGuid(self):\r
+    @property\r
+    def VpdToolGuid(self):\r
         if self._VpdToolGuid is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
         if self._VpdToolGuid is None:\r
             if self._Header is None:\r
                 self._GetHeaderInfo()\r
@@ -631,7 +654,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._VpdToolGuid\r
 \r
     ## Retrieve [SkuIds] section information\r
         return self._VpdToolGuid\r
 \r
     ## Retrieve [SkuIds] section information\r
-    def _GetSkuIds(self):\r
+    @property\r
+    def SkuIds(self):\r
         if self._SkuIds is None:\r
             self._SkuIds = OrderedDict()\r
             RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
         if self._SkuIds is None:\r
             self._SkuIds = OrderedDict()\r
             RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
@@ -645,8 +669,8 @@ class DscBuildData(PlatformBuildClassObject):
                 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
                     EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
                                     File=self.MetaFile, Line=Record[-1])\r
                 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
                     EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
                                     File=self.MetaFile, Line=Record[-1])\r
-                if not IsValidWord(Record[1]):\r
-                    EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",\r
+                if not SkuIdPattern.match(Record[1]) or (Record[2] and not SkuIdPattern.match(Record[2])):\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z_)(a-zA-Z0-9_)*'",\r
                                     File=self.MetaFile, Line=Record[-1])\r
                 self._SkuIds[Record[1].upper()] = (str(DscBuildData.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
             if TAB_DEFAULT not in self._SkuIds:\r
                                     File=self.MetaFile, Line=Record[-1])\r
                 self._SkuIds[Record[1].upper()] = (str(DscBuildData.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
             if TAB_DEFAULT not in self._SkuIds:\r
@@ -682,18 +706,29 @@ class DscBuildData(PlatformBuildClassObject):
             GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
         return self.DefaultStores\r
 \r
             GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
         return self.DefaultStores\r
 \r
+    def OverrideDuplicateModule(self):\r
+        RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
+        Macros = self._Macros\r
+        Components = {}\r
+        for Record in RecordList:\r
+            ModuleId = Record[6]\r
+            file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
+            file_guid_str = file_guid[0][2] if file_guid else "NULL"\r
+            ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            if self._Arch != TAB_ARCH_COMMON and (file_guid_str,str(ModuleFile)) in Components:\r
+                self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
+            Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
+        self._RawData._PostProcessed = False\r
     ## Retrieve [Components] section information\r
     ## Retrieve [Components] section information\r
-    def _GetModules(self):\r
+    @property\r
+    def Modules(self):\r
         if self._Modules is not None:\r
             return self._Modules\r
         if self._Modules is not None:\r
             return self._Modules\r
-\r
+        self.OverrideDuplicateModule()\r
         self._Modules = OrderedDict()\r
         RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
         Macros = self._Macros\r
         self._Modules = OrderedDict()\r
         RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
         Macros = self._Macros\r
-        Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
         for Record in RecordList:\r
         for Record in RecordList:\r
-            DuplicatedFile = False\r
-\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[6]\r
             LineNo = Record[7]\r
             ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             ModuleId = Record[6]\r
             LineNo = Record[7]\r
@@ -703,10 +738,6 @@ class DscBuildData(PlatformBuildClassObject):
             if ErrorCode != 0:\r
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
             if ErrorCode != 0:\r
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
-            # Check duplication\r
-            # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
-            if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:\r
-                DuplicatedFile = True\r
 \r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
 \r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
@@ -769,8 +800,6 @@ class DscBuildData(PlatformBuildClassObject):
                     Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
 \r
             RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
                     Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
 \r
             RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
-            if DuplicatedFile and not RecordList:\r
-                EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
             if RecordList:\r
                 if len(RecordList) != 1:\r
                     EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
             if RecordList:\r
                 if len(RecordList) != 1:\r
                     EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
@@ -782,13 +811,15 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Modules\r
 \r
     ## Retrieve all possible library instances used in this platform\r
         return self._Modules\r
 \r
     ## Retrieve all possible library instances used in this platform\r
-    def _GetLibraryInstances(self):\r
+    @property\r
+    def LibraryInstances(self):\r
         if self._LibraryInstances is None:\r
         if self._LibraryInstances is None:\r
-            self._GetLibraryClasses()\r
+            self.LibraryClasses\r
         return self._LibraryInstances\r
 \r
     ## Retrieve [LibraryClasses] information\r
         return self._LibraryInstances\r
 \r
     ## Retrieve [LibraryClasses] information\r
-    def _GetLibraryClasses(self):\r
+    @property\r
+    def LibraryClasses(self):\r
         if self._LibraryClasses is None:\r
             self._LibraryInstances = []\r
             #\r
         if self._LibraryClasses is None:\r
             self._LibraryInstances = []\r
             #\r
@@ -831,8 +862,6 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
 \r
                         continue\r
                     self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
 \r
-            # for Edk style library instances, which are listed in different section\r
-            Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
             for Record in RecordList:\r
                 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
             for Record in RecordList:\r
                 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
@@ -854,7 +883,7 @@ class DscBuildData(PlatformBuildClassObject):
         return self._LibraryClasses\r
 \r
     def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
         return self._LibraryClasses\r
 \r
     def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
-        if self._DecPcds is None:\r
+        if not self._DecPcds:\r
 \r
             FdfInfList = []\r
             if GlobalData.gFdfParser:\r
 \r
             FdfInfList = []\r
             if GlobalData.gFdfParser:\r
@@ -873,7 +902,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
             EdkLogger.error('build', PARSER_ERROR,\r
 \r
         if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
             EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
+                            "Pcd (%s.%s) defined in DSC is not declared in DEC files referenced in INF files in FDF. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
                             File=self.MetaFile, Line=LineNo)\r
         ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
         if not IsValid:\r
                             File=self.MetaFile, Line=LineNo)\r
         ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
         if not IsValid:\r
@@ -886,35 +915,40 @@ class DscBuildData(PlatformBuildClassObject):
                                 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
         if ValueList[Index]:\r
             DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
                                 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
         if ValueList[Index]:\r
             DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
-            try:\r
-                ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
-            except BadExpression as Value:\r
-                EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
-                                TokenSpaceGuid, PcdCName, ValueList[Index]))\r
-            except EvaluationException as Excpt:\r
-                if hasattr(Excpt, 'Pcd'):\r
-                    if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
-                                        " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
-                                        " of the DSC file" % Excpt.Pcd,\r
-                                        File=self.MetaFile, Line=LineNo)\r
+            if "{CODE(" not in ValueList[Index]:\r
+                try:\r
+                    ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
+                except BadExpression as Value:\r
+                    EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
+                                    TokenSpaceGuid, PcdCName, ValueList[Index]))\r
+                except EvaluationException as Excpt:\r
+                    if hasattr(Excpt, 'Pcd'):\r
+                        if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+                                            " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+                                            " of the DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
+                        else:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
                     else:\r
                     else:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
                                         File=self.MetaFile, Line=LineNo)\r
                                         File=self.MetaFile, Line=LineNo)\r
-                else:\r
-                    EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
-                                    File=self.MetaFile, Line=LineNo)\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
             if not Valid:\r
                 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
             if not Valid:\r
                 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
-            if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
+            if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE):\r
                 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
                 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
-                    EdkLogger.error('build', FORMAT_INVALID, "Pcd datumtype used in DSC file is not the same as its declaration in DEC file.", File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
+                    DecPcd = self._DecPcds[PcdCName, TokenSpaceGuid]\r
+                    EdkLogger.error('build', FORMAT_INVALID,\r
+                                    "Pcd datumtype used in DSC file is not the same as its declaration. DatumType:%s"%DecPcd.DatumType,\r
+                                    File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="Dsc:%s.%s|%s\n    Dec:%s.%s|%s|%s|%s" % (TokenSpaceGuid, PcdCName, Setting, TokenSpaceGuid, \\r
+                                    PcdCName, DecPcd.DefaultValue, DecPcd.DatumType, DecPcd.TokenValue))\r
         if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
             if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
                 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
         if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
             if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
                 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
@@ -927,15 +961,16 @@ class DscBuildData(PlatformBuildClassObject):
             for pcdname in Pcds:\r
                 pcd = Pcds[pcdname]\r
                 Pcds[pcdname].SkuInfoList = {TAB_DEFAULT:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
             for pcdname in Pcds:\r
                 pcd = Pcds[pcdname]\r
                 Pcds[pcdname].SkuInfoList = {TAB_DEFAULT:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
-                if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
+                if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
                     Pcds[pcdname].SkuOverrideValues = {TAB_DEFAULT:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
         else:\r
             for pcdname in Pcds:\r
                 pcd = Pcds[pcdname]\r
                 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
                     Pcds[pcdname].SkuOverrideValues = {TAB_DEFAULT:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
         else:\r
             for pcdname in Pcds:\r
                 pcd = Pcds[pcdname]\r
                 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
-                if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
+                if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
                     Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
         return Pcds\r
                     Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
         return Pcds\r
+\r
     def CompleteHiiPcdsDefaultStores(self, Pcds):\r
         HiiPcd = [Pcds[pcd] for pcd in Pcds if Pcds[pcd].Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]]\r
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
     def CompleteHiiPcdsDefaultStores(self, Pcds):\r
         HiiPcd = [Pcds[pcd] for pcd in Pcds if Pcds[pcd].Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]]\r
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
@@ -945,7 +980,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
                     PcdDefaultStoreSet = set(defaultstorename  for defaultstorename in skuobj.DefaultStoreDict)\r
                     mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
                 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
                     PcdDefaultStoreSet = set(defaultstorename  for defaultstorename in skuobj.DefaultStoreDict)\r
                     mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
-                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = skuobj.DefaultStoreDict[mindefaultstorename]\r
         return Pcds\r
 \r
     def RecoverCommandLinePcd(self):\r
         return Pcds\r
 \r
     def RecoverCommandLinePcd(self):\r
@@ -964,7 +999,7 @@ class DscBuildData(PlatformBuildClassObject):
     def __ParsePcdFromCommandLine(self):\r
         if GlobalData.BuildOptionPcd:\r
             for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
     def __ParsePcdFromCommandLine(self):\r
         if GlobalData.BuildOptionPcd:\r
             for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
-                if type(pcd) is tuple:\r
+                if isinstance(pcd, tuple):\r
                     continue\r
                 (pcdname, pcdvalue) = pcd.split('=')\r
                 if not pcdvalue:\r
                     continue\r
                 (pcdname, pcdvalue) = pcd.split('=')\r
                 if not pcdvalue:\r
@@ -1039,13 +1074,36 @@ class DscBuildData(PlatformBuildClassObject):
                         EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
                         EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
+        if GlobalData.BuildOptionPcd:\r
+            for pcd in GlobalData.BuildOptionPcd:\r
+                (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
                 for BuildData in self._Bdb._CACHE_.values():\r
                 for BuildData in self._Bdb._CACHE_.values():\r
+                    if BuildData.Arch != self.Arch:\r
+                        continue\r
                     if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
                         continue\r
                     for key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
                             PcdItem.DefaultValue = pcdvalue\r
                     if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
                         continue\r
                     for key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
                             PcdItem.DefaultValue = pcdvalue\r
+                            PcdItem.PcdValueFromComm = pcdvalue\r
+        #In command line, the latter full assign value in commandLine should override the former field assign value.\r
+        #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
+        delete_assign = []\r
+        field_assign = {}\r
+        if GlobalData.BuildOptionPcd:\r
+            for pcdTuple in GlobalData.BuildOptionPcd:\r
+                TokenSpaceGuid, Token, Field = pcdTuple[0], pcdTuple[1], pcdTuple[2]\r
+                if Field:\r
+                    if (TokenSpaceGuid, Token) not in field_assign:\r
+                        field_assign[TokenSpaceGuid, Token] = []\r
+                    field_assign[TokenSpaceGuid, Token].append(pcdTuple)\r
+                else:\r
+                    if (TokenSpaceGuid, Token) in field_assign:\r
+                        delete_assign.extend(field_assign[TokenSpaceGuid, Token])\r
+                        field_assign[TokenSpaceGuid, Token] = []\r
+            for item in delete_assign:\r
+                GlobalData.BuildOptionPcd.remove(item)\r
 \r
     @staticmethod\r
     def HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
 \r
     @staticmethod\r
     def HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
@@ -1053,7 +1111,7 @@ class DscBuildData(PlatformBuildClassObject):
             IsArray = False\r
             TokenCName += '.' + FieldName\r
         if PcdValue.startswith('H'):\r
             IsArray = False\r
             TokenCName += '.' + FieldName\r
         if PcdValue.startswith('H'):\r
-            if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue[1:]):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1064,7 +1122,7 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
                 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s",  %s' %\r
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
-            if FieldName and IsFieldValueAnArray(PcdValue):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1076,7 +1134,7 @@ class DscBuildData(PlatformBuildClassObject):
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith('L'):\r
             PcdValue = 'L"' + PcdValue[1:] + '"'\r
                                 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
         elif PcdValue.startswith('L'):\r
             PcdValue = 'L"' + PcdValue[1:] + '"'\r
-            if FieldName and IsFieldValueAnArray(PcdValue):\r
+            if FieldName and _IsFieldValueAnArray(PcdValue):\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
                 PcdDatumType = TAB_VOID\r
                 IsArray = True\r
             if FieldName and not IsArray:\r
@@ -1094,6 +1152,8 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldName:\r
                 if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
                     PcdValue = '"' + PcdValue + '"'\r
             if not FieldName:\r
                 if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
                     PcdValue = '"' + PcdValue + '"'\r
+                elif not PcdValue.isdigit() and not PcdValue.upper().startswith('0X'):\r
+                    PcdValue = '"' + PcdValue + '"'\r
             else:\r
                 IsArray = False\r
                 Base = 10\r
             else:\r
                 IsArray = False\r
                 Base = 10\r
@@ -1103,7 +1163,7 @@ class DscBuildData(PlatformBuildClassObject):
                     Num = int(PcdValue, Base)\r
                 except:\r
                     PcdValue = '"' + PcdValue + '"'\r
                     Num = int(PcdValue, Base)\r
                 except:\r
                     PcdValue = '"' + PcdValue + '"'\r
-                if IsFieldValueAnArray(PcdValue):\r
+                if _IsFieldValueAnArray(PcdValue):\r
                     PcdDatumType = TAB_VOID\r
                     IsArray = True\r
                 if not IsArray:\r
                     PcdDatumType = TAB_VOID\r
                     IsArray = True\r
                 if not IsArray:\r
@@ -1116,7 +1176,8 @@ class DscBuildData(PlatformBuildClassObject):
         return PcdValue\r
 \r
     ## Retrieve all PCD settings in platform\r
         return PcdValue\r
 \r
     ## Retrieve all PCD settings in platform\r
-    def _GetPcds(self):\r
+    @property\r
+    def Pcds(self):\r
         if self._Pcds is None:\r
             self._Pcds = OrderedDict()\r
             self.__ParsePcdFromCommandLine()\r
         if self._Pcds is None:\r
             self._Pcds = OrderedDict()\r
             self.__ParsePcdFromCommandLine()\r
@@ -1131,7 +1192,8 @@ class DscBuildData(PlatformBuildClassObject):
             self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
 \r
             self._Pcds = self.CompletePcdValues(self._Pcds)\r
             self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
 \r
             self._Pcds = self.CompletePcdValues(self._Pcds)\r
-            self._Pcds = self.OverrideByFdfCommOverAll(self._Pcds)\r
+            self._Pcds = self.OverrideByFdfOverAll(self._Pcds)\r
+            self._Pcds = self.OverrideByCommOverAll(self._Pcds)\r
             self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
             self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
             self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
             self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
             self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
             self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
@@ -1140,7 +1202,8 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Pcds\r
 \r
     ## Retrieve [BuildOptions]\r
         return self._Pcds\r
 \r
     ## Retrieve [BuildOptions]\r
-    def _GetBuildOptions(self):\r
+    @property\r
+    def BuildOptions(self):\r
         if self._BuildOptions is None:\r
             self._BuildOptions = OrderedDict()\r
             #\r
         if self._BuildOptions is None:\r
             self._BuildOptions = OrderedDict()\r
             #\r
@@ -1191,7 +1254,34 @@ class DscBuildData(PlatformBuildClassObject):
         return structure_pcd_data\r
 \r
     @staticmethod\r
         return structure_pcd_data\r
 \r
     @staticmethod\r
-    def OverrideByFdfComm(StruPcds):\r
+    def OverrideByFdf(StruPcds,workspace):\r
+        if GlobalData.gFdfParser is None:\r
+            return StruPcds\r
+        StructurePcdInFdf = OrderedDict()\r
+        fdfpcd = GlobalData.gFdfParser.Profile.PcdDict\r
+        fdfpcdlocation = GlobalData.gFdfParser.Profile.PcdLocalDict\r
+        for item in fdfpcd :\r
+            if len(item[2]) and (item[0],item[1]) in StruPcds:\r
+                StructurePcdInFdf[(item[1],item[0],item[2] )] = fdfpcd[item]\r
+        GlobalPcds = {(item[0],item[1]) for item in StructurePcdInFdf}\r
+        for Pcd in StruPcds.values():\r
+            if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
+                continue\r
+            FieldValues = OrderedDict()\r
+            for item in StructurePcdInFdf:\r
+                if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]:\r
+                    FieldValues[item[2]] = StructurePcdInFdf[item]\r
+            for field in FieldValues:\r
+                if field not in Pcd.PcdFieldValueFromFdf:\r
+                    Pcd.PcdFieldValueFromFdf[field] = ["","",""]\r
+                Pcd.PcdFieldValueFromFdf[field][0] = FieldValues[field]\r
+                Pcd.PcdFieldValueFromFdf[field][1] = os.path.relpath(fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][0],workspace)\r
+                Pcd.PcdFieldValueFromFdf[field][2] = fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][1]\r
+\r
+        return StruPcds\r
+\r
+    @staticmethod\r
+    def OverrideByComm(StruPcds):\r
         StructurePcdInCom = OrderedDict()\r
         for item in GlobalData.BuildOptionPcd:\r
             if len(item) == 5 and (item[1], item[0]) in StruPcds:\r
         StructurePcdInCom = OrderedDict()\r
         for item in GlobalData.BuildOptionPcd:\r
             if len(item) == 5 and (item[1], item[0]) in StruPcds:\r
@@ -1212,19 +1302,24 @@ class DscBuildData(PlatformBuildClassObject):
                 Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]\r
         return StruPcds\r
 \r
                 Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]\r
         return StruPcds\r
 \r
-    def OverrideByFdfCommOverAll(self, AllPcds):\r
+    def OverrideByCommOverAll(self,AllPcds):\r
         def CheckStructureInComm(commpcds):\r
             if not commpcds:\r
                 return False\r
             if len(commpcds[0]) == 5:\r
                 return True\r
             return False\r
         def CheckStructureInComm(commpcds):\r
             if not commpcds:\r
                 return False\r
             if len(commpcds[0]) == 5:\r
                 return True\r
             return False\r
-\r
+        NoFiledValues = OrderedDict()\r
         if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
         if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
-            StructurePcdInCom = {(item[0], item[1], item[2] ):(item[3], item[4]) for item in GlobalData.BuildOptionPcd } if GlobalData.BuildOptionPcd else {}\r
-            NoFiledValues = {(item[0], item[1]):StructurePcdInCom[item] for item in StructurePcdInCom if not item[2]}\r
+            StructurePcdInCom = OrderedDict()\r
+            for item in GlobalData.BuildOptionPcd:\r
+                StructurePcdInCom[(item[0], item[1], item[2] )] = (item[3], item[4])\r
+            for item in StructurePcdInCom:\r
+                if not item[2]:\r
+                    NoFiledValues[(item[0], item[1])] = StructurePcdInCom[item]\r
         else:\r
         else:\r
-            NoFiledValues = {(item[0], item[1]):[item[2]] for item in GlobalData.BuildOptionPcd}\r
+            for item in GlobalData.BuildOptionPcd:\r
+                NoFiledValues[(item[0], item[1])] = [item[2]]\r
         for Guid, Name in NoFiledValues:\r
             if (Name, Guid) in AllPcds:\r
                 Pcd = AllPcds.get((Name, Guid))\r
         for Guid, Name in NoFiledValues:\r
             if (Name, Guid) in AllPcds:\r
                 Pcd = AllPcds.get((Name, Guid))\r
@@ -1255,10 +1350,79 @@ class DscBuildData(PlatformBuildClassObject):
                     PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
                     PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
-                                        self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
                         self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
                         self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
                         self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
                         self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
+                    if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
+                        self.Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
         return AllPcds\r
         return AllPcds\r
+\r
+    def OverrideByFdfOverAll(self,AllPcds):\r
+\r
+        if GlobalData.gFdfParser is None:\r
+            return AllPcds\r
+        NoFiledValues = GlobalData.gFdfParser.Profile.PcdDict\r
+        for Name,Guid,Field in NoFiledValues:\r
+            if len(Field):\r
+                continue\r
+            Value = NoFiledValues[(Name,Guid,Field)]\r
+            if (Name,Guid) in AllPcds:\r
+                Pcd = AllPcds.get((Name,Guid))\r
+                if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), None),StructurePcd):\r
+                    self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = Value\r
+                else:\r
+                    Pcd.PcdValueFromComm = Value\r
+                    Pcd.DefaultValue = Value\r
+                    for sku in Pcd.SkuInfoList:\r
+                        SkuInfo = Pcd.SkuInfoList[sku]\r
+                        if SkuInfo.DefaultValue:\r
+                            SkuInfo.DefaultValue = Value\r
+                        else:\r
+                            SkuInfo.HiiDefaultValue = Value\r
+                            for defaultstore in SkuInfo.DefaultStoreDict:\r
+                                SkuInfo.DefaultStoreDict[defaultstore] = Value\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 == 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
+                            OptionSize = len((StringToArray(Pcd.PcdValueFromComm)).split(","))\r
+                            MaxSize = max(CurrentSize, OptionSize)\r
+                            Pcd.MaxDatumSize = str(MaxSize)\r
+            else:\r
+                PcdInDec = self.DecPcds.get((Name,Guid))\r
+                if PcdInDec:\r
+                    PcdInDec.PcdValueFromFdf = Value\r
+                    if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
+                                        self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
+                        self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
+                        self.Pcds[Name, Guid].DefaultValue = Value\r
+        return AllPcds\r
+\r
+    def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
+        TokenSpaceCName = PcdCName = DimensionAttr = Field = ""\r
+        if "." in NamePart1:\r
+            TokenSpaceCName, TempPcdCName = NamePart1.split(".")\r
+            if "[" in TempPcdCName:\r
+                PcdCName = TempPcdCName[:TempPcdCName.index("[")]\r
+                DimensionAttr = TempPcdCName[TempPcdCName.index("["):]\r
+            else:\r
+                PcdCName = TempPcdCName\r
+            Field = NamePart2\r
+        else:\r
+            TokenSpaceCName = NamePart1\r
+            if "[" in NamePart2:\r
+                PcdCName = NamePart2[:NamePart2.index("[")]\r
+                DimensionAttr = NamePart2[NamePart2.index("["):]\r
+            else:\r
+                PcdCName = NamePart2\r
+\r
+        return TokenSpaceCName,PcdCName,DimensionAttr,Field\r
+\r
     def UpdateStructuredPcds(self, TypeList, AllPcds):\r
 \r
         DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
     def UpdateStructuredPcds(self, TypeList, AllPcds):\r
 \r
         DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
@@ -1270,9 +1434,10 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         Pcds = AllPcds\r
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
 \r
         Pcds = AllPcds\r
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
-        SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
-        SkuIds.update({TAB_DEFAULT:0})\r
+        SkuIds = self.SkuIds\r
+        self.SkuIdMgr.AvailableSkuIdSet.update({TAB_DEFAULT:0})\r
         DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
         DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
+        DefaultStores.add(TAB_DEFAULT_STORES_DEFAULT)\r
 \r
         S_PcdSet = []\r
         # Find out all possible PCD candidates for self._Arch\r
 \r
         S_PcdSet = []\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -1287,9 +1452,19 @@ class DscBuildData(PlatformBuildClassObject):
             SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
             if SkuName not in SkuIds:\r
                 continue\r
             SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
             if SkuName not in SkuIds:\r
                 continue\r
+            TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+            pcd_in_dec = self._DecPcds.get((PCName,TCName), None)\r
+            if pcd_in_dec is None:\r
+                EdkLogger.error('build', PARSER_ERROR,\r
+                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                            File=self.MetaFile, Line = Dummy5)\r
+            if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                if not isinstance (pcd_in_dec, StructurePcd):\r
+                    EdkLogger.error('build', PARSER_ERROR,\r
+                                "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                                File=self.MetaFile, Line = Dummy5)\r
 \r
 \r
-            if SkuName in SkuIds and "." in TokenSpaceGuid:\r
-                S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
 \r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
 \r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
@@ -1297,30 +1472,22 @@ class DscBuildData(PlatformBuildClassObject):
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
-            if not isinstance (str_pcd_dec, StructurePcd):\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
-            if str_pcd_dec:\r
-                str_pcd_obj_str = StructurePcd()\r
-                str_pcd_obj_str.copy(str_pcd_dec)\r
-                if str_pcd_obj:\r
-                    str_pcd_obj_str.copy(str_pcd_obj)\r
-                    if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                    else:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                for str_pcd_data in StrPcdSet[str_pcd]:\r
-                    if str_pcd_data[3] in SkuIds:\r
-                        str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])\r
-                S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
-            else:\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
+            str_pcd_obj_str = StructurePcd()\r
+            str_pcd_obj_str.copy(str_pcd_dec)\r
+            if str_pcd_obj:\r
+                str_pcd_obj_str.copy(str_pcd_obj)\r
+                if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                else:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+            for str_pcd_data in StrPcdSet[str_pcd]:\r
+                if str_pcd_data[4] in SkuIds:\r
+                    str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+            S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
+\r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
         for Pcd in self.DecPcds:\r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
         for Pcd in self.DecPcds:\r
-            if type (self._DecPcds[Pcd]) is StructurePcd:\r
+            if isinstance(self._DecPcds[Pcd], StructurePcd):\r
                 if Pcd not in S_pcd_set:\r
                     str_pcd_obj_str = StructurePcd()\r
                     str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
                 if Pcd not in S_pcd_set:\r
                     str_pcd_obj_str = StructurePcd()\r
                     str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
@@ -1333,7 +1500,8 @@ class DscBuildData(PlatformBuildClassObject):
                             str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
         if S_pcd_set:\r
                             str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
         if S_pcd_set:\r
-            GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
+            GlobalData.gStructurePcd[self.Arch] = S_pcd_set.copy()\r
+        self.FilterStrcturePcd(S_pcd_set)\r
         for stru_pcd in S_pcd_set.values():\r
             for skuid in SkuIds:\r
                 if skuid in stru_pcd.SkuOverrideValues:\r
         for stru_pcd in S_pcd_set.values():\r
             for skuid in SkuIds:\r
                 if skuid in stru_pcd.SkuOverrideValues:\r
@@ -1346,9 +1514,12 @@ class DscBuildData(PlatformBuildClassObject):
                             NoDefault = True\r
                             break\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
                             NoDefault = True\r
                             break\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
-                    stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})\r
+                    stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {}) #{TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})\r
                     if not NoDefault:\r
                         stru_pcd.ValueChain.add((skuid, ''))\r
                     if not NoDefault:\r
                         stru_pcd.ValueChain.add((skuid, ''))\r
+                if 'DEFAULT' in stru_pcd.SkuOverrideValues and not GlobalData.gPcdSkuOverrides.get((stru_pcd.TokenCName, stru_pcd.TokenSpaceGuidCName)):\r
+                    GlobalData.gPcdSkuOverrides.update(\r
+                        {(stru_pcd.TokenCName, stru_pcd.TokenSpaceGuidCName): {'DEFAULT':stru_pcd.SkuOverrideValues['DEFAULT']}})\r
             if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
                 for skuid in SkuIds:\r
                     nextskuid = skuid\r
             if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
                 for skuid in SkuIds:\r
                     nextskuid = skuid\r
@@ -1366,9 +1537,10 @@ class DscBuildData(PlatformBuildClassObject):
 \r
                     for defaultstoreid in DefaultStores:\r
                         if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
 \r
                     for defaultstoreid in DefaultStores:\r
                         if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
-                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
+                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
-        S_pcd_set = DscBuildData.OverrideByFdfComm(S_pcd_set)\r
+        S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
+        S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
@@ -1412,8 +1584,9 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             for str_pcd_obj in S_pcd_set.values():\r
 \r
 \r
             for str_pcd_obj in S_pcd_set.values():\r
 \r
-                str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
+                str_pcd_obj.MaxDatumSize = DscBuildData.GetStructurePcdMaxSize(str_pcd_obj)\r
                 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
                 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
+                Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True\r
 \r
             for pcdkey in Pcds:\r
                 pcd = Pcds[pcdkey]\r
 \r
             for pcdkey in Pcds:\r
                 pcd = Pcds[pcdkey]\r
@@ -1423,8 +1596,29 @@ class DscBuildData(PlatformBuildClassObject):
                 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                     del pcd.SkuInfoList[TAB_COMMON]\r
 \r
                 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                     del pcd.SkuInfoList[TAB_COMMON]\r
 \r
-        map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
+        list(map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType]))\r
         return Pcds\r
         return Pcds\r
+    @cached_property\r
+    def PlatformUsedPcds(self):\r
+        FdfInfList = []\r
+        if GlobalData.gFdfParser:\r
+            FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
+        FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
+        AllModulePcds = set()\r
+        ModuleSet = set(list(self._Modules.keys()) + FdfModuleList)\r
+        for ModuleFile in ModuleSet:\r
+            ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
+            AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
+        for ModuleFile in self.LibraryInstances:\r
+            ModuleData = self._Bdb.CreateBuildObject(ModuleFile, self._Arch, self._Target, self._Toolchain)\r
+            AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
+        return AllModulePcds\r
+\r
+    #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.\r
+    def FilterStrcturePcd(self, S_pcd_set):\r
+        UnusedStruPcds = set(S_pcd_set.keys()) - self.PlatformUsedPcds\r
+        for (Token, TokenSpaceGuid) in UnusedStruPcds:\r
+            del S_pcd_set[(Token, TokenSpaceGuid)]\r
 \r
     ## Retrieve non-dynamic PCD settings\r
     #\r
 \r
     ## Retrieve non-dynamic PCD settings\r
     #\r
@@ -1440,8 +1634,8 @@ class DscBuildData(PlatformBuildClassObject):
         #\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
 \r
         #\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
 \r
-        PcdDict = tdict(True, 3)\r
-        PcdSet = set()\r
+        PcdDict = tdict(True, 4)\r
+        PcdList = []\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
         PcdValueDict = OrderedDict()\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
         PcdValueDict = OrderedDict()\r
@@ -1452,30 +1646,38 @@ class DscBuildData(PlatformBuildClassObject):
                 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
                 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
-                if "." not in TokenSpaceGuid:\r
-                    PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
+                if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
+                    PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
                 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
 \r
                 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
 \r
-        for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
+        for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
             if Setting is None:\r
                 continue\r
             PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
             if Setting is None:\r
                 continue\r
             PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            if MaxDatumSize:\r
+                if int(MaxDatumSize, 0) > 0xFFFF:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
+                if int(MaxDatumSize, 0) < 0:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
             if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
             if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
-                PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
+                PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize,Dummy4)\r
             else:\r
             else:\r
-                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
-\r
-        for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
-            PcdValue = None\r
-            DatumType = None\r
-            MaxDatumSize = None\r
-            if TAB_COMMON in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_COMMON]\r
-            if TAB_DEFAULT in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_DEFAULT]\r
+                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize,Dummy4)}\r
+\r
+        for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
             if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
             if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
+                PcdValue, DatumType, MaxDatumSize,_ = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
+            elif TAB_DEFAULT in PcdSetting:\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_DEFAULT]\r
+            elif TAB_COMMON in PcdSetting:\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_COMMON]\r
+            else:\r
+                PcdValue = None\r
+                DatumType = None\r
+                MaxDatumSize = None\r
 \r
             Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
 \r
             Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
                                                 PcdCName,\r
@@ -1489,13 +1691,19 @@ class DscBuildData(PlatformBuildClassObject):
                                                 False,\r
                                                 None,\r
                                                 IsDsc=True)\r
                                                 False,\r
                                                 None,\r
                                                 IsDsc=True)\r
-\r
-\r
+            for SkuName in PcdValueDict[PcdCName, TokenSpaceGuid]:\r
+                Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
+                if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+                    Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                    Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Settings[3])\r
         return Pcds\r
 \r
         return Pcds\r
 \r
-    def GetStructurePcdMaxSize(self, str_pcd):\r
+    @staticmethod\r
+    def GetStructurePcdMaxSize(str_pcd):\r
         pcd_default_value = str_pcd.DefaultValue\r
         pcd_default_value = str_pcd.DefaultValue\r
-        sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
+        sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
         sku_values.append(pcd_default_value)\r
 \r
         def get_length(value):\r
         sku_values.append(pcd_default_value)\r
 \r
         def get_length(value):\r
@@ -1507,7 +1715,10 @@ class DscBuildData(PlatformBuildClassObject):
                     return len(Value[2:-1])\r
                 if Value[0] == '"' and Value[-1] == '"':\r
                     return len(Value) - 2\r
                     return len(Value[2:-1])\r
                 if Value[0] == '"' and Value[-1] == '"':\r
                     return len(Value) - 2\r
-                if Value[0] == '{' and Value[-1] == '}':\r
+                if Value.strip().startswith("{CODE("):\r
+                    tmpValue = RemoveCComments(Value)\r
+                    return len(tmpValue.split(","))\r
+                if (Value[0] == '{' and Value[-1] == '}'):\r
                     return len(Value.split(","))\r
                 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
                     return  len(list(Value[2:-1]))\r
                     return len(Value.split(","))\r
                 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
                     return  len(list(Value[2:-1]))\r
@@ -1524,7 +1735,7 @@ class DscBuildData(PlatformBuildClassObject):
         except:\r
             EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
         Result = Process.communicate()\r
         except:\r
             EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
         Result = Process.communicate()\r
-        return Process.returncode, Result[0], Result[1]\r
+        return Process.returncode, Result[0].decode(), Result[1].decode()\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
@@ -1539,12 +1750,47 @@ class DscBuildData(PlatformBuildClassObject):
     def GenerateSizeFunction(self, Pcd):\r
         CApp = "// Default Value in Dec \n"\r
         CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
     def GenerateSizeFunction(self, Pcd):\r
         CApp = "// Default Value in Dec \n"\r
         CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
-        for FieldList in [Pcd.DefaultValues]:\r
+\r
+        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+            CApp += "  *Size = (sizeof (%s) > *Size ? sizeof (%s) : *Size);\n" % (Pcd.DatumType,Pcd.DatumType)\r
+        else:\r
+            if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                CApp += "  *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
+            if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+                for skuname in Pcd.SkuInfoList:\r
+                    skuobj = Pcd.SkuInfoList[skuname]\r
+                    if skuobj.VariableName:\r
+                        for defaultstore in skuobj.DefaultStoreDict:\r
+                            pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,defaultstore)\r
+                            if pcddef:\r
+                                if "{CODE(" in pcddef:\r
+                                    CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+                                else:\r
+                                    CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
+                    else:\r
+                        pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+                        if pcddef:\r
+                            if  "{CODE(" in pcddef:\r
+                                CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+                            else:\r
+                                CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
+            else:\r
+                pcddef = self.GetPcdDscRawDefaultValue(Pcd,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
+                if pcddef:\r
+                    if "{CODE(" in pcddef:\r
+                        CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
+                    else:\r
+                        CApp += "  *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
+        ActualCap = []\r
+        for index in Pcd.DefaultValues:\r
+            if index:\r
+                ActualCap.append(index)\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
                 FieldName = "." + FieldName\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
                 FieldName = "." + FieldName\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                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], TAB_VOID, self._GuidDict)(True)\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], TAB_VOID, self._GuidDict)(True)\r
@@ -1552,53 +1798,83 @@ class DscBuildData(PlatformBuildClassObject):
                         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
                     Value, ValueSize = ParseFieldValue(Value)\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
                     Value, ValueSize = ParseFieldValue(Value)\r
-                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                    if not Pcd.IsArray():\r
+                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));  // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
                 else:\r
                     NewFieldName = ''\r
                     FieldName_ori = FieldName.strip('.')\r
                     while '[' in  FieldName:\r
                         NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
                 else:\r
                     NewFieldName = ''\r
                     FieldName_ori = FieldName.strip('.')\r
                     while '[' in  FieldName:\r
                         NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                        ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                        Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                         FieldName = FieldName.split(']', 1)[1]\r
                     FieldName = NewFieldName + FieldName\r
                         FieldName = FieldName.split(']', 1)[1]\r
                     FieldName = NewFieldName + FieldName\r
-                    while '[' in FieldName:\r
+                    while '[' in FieldName and not Pcd.IsArray():\r
                         FieldName = FieldName.rsplit('[', 1)[0]\r
                         FieldName = FieldName.rsplit('[', 1)[0]\r
-                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+                        CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         for skuname in Pcd.SkuOverrideValues:\r
             if skuname == TAB_COMMON:\r
                 continue\r
             for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
         for skuname in Pcd.SkuOverrideValues:\r
             if skuname == TAB_COMMON:\r
                 continue\r
             for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
-                for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
-                    if not FieldList:\r
-                        continue\r
-                    for FieldName in FieldList:\r
-                        FieldName = "." + FieldName\r
-                        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], 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
-                            Value, ValueSize = ParseFieldValue(Value)\r
-                            CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
-                        else:\r
-                            NewFieldName = ''\r
-                            FieldName_ori = FieldName.strip('.')\r
-                            while '[' in  FieldName:\r
-                                NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                                ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
-                                FieldName = FieldName.split(']', 1)[1]\r
-                            FieldName = NewFieldName + FieldName\r
-                            while '[' in FieldName:\r
-                                FieldName = FieldName.rsplit('[', 1)[0]\r
-                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+                for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
+                    if index:\r
+                        ActualCap.append(index)\r
+                    for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
+                        if not FieldList:\r
+                            continue\r
+                        for FieldName in FieldList:\r
+                            FieldName = "." + FieldName\r
+                            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], 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
+                                Value, ValueSize = ParseFieldValue(Value)\r
+                                if not Pcd.IsArray():\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                            else:\r
+                                NewFieldName = ''\r
+                                FieldName_ori = FieldName.strip('.')\r
+                                while '[' in  FieldName:\r
+                                    NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+                                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                                    FieldName = FieldName.split(']', 1)[1]\r
+                                FieldName = NewFieldName + FieldName\r
+                                while '[' in FieldName and not Pcd.IsArray():\r
+                                    FieldName = FieldName.rsplit('[', 1)[0]\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+        if Pcd.PcdFieldValueFromFdf:\r
+            CApp = CApp + "// From fdf \n"\r
+        for FieldName in Pcd.PcdFieldValueFromFdf:\r
+            FieldName = "." + FieldName\r
+            IsArray = _IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
+            if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].endswith('}')):\r
+                try:\r
+                    Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[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.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))\r
+                Value, ValueSize = ParseFieldValue(Value)\r
+                if not Pcd.IsArray():\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);\r
+            else:\r
+                NewFieldName = ''\r
+                FieldName_ori = FieldName.strip('.')\r
+                while '[' in  FieldName:\r
+                    NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                    FieldName = FieldName.split(']', 1)[1]\r
+                FieldName = NewFieldName + FieldName\r
+                while '[' in FieldName:\r
+                    FieldName = FieldName.rsplit('[', 1)[0]\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0])\r
         if Pcd.PcdFieldValueFromComm:\r
             CApp = CApp + "// From Command Line \n"\r
         for FieldName in Pcd.PcdFieldValueFromComm:\r
             FieldName = "." + FieldName\r
         if Pcd.PcdFieldValueFromComm:\r
             CApp = CApp + "// From Command Line \n"\r
         for FieldName in Pcd.PcdFieldValueFromComm:\r
             FieldName = "." + FieldName\r
-            IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
+            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], TAB_VOID, self._GuidDict)(True)\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], TAB_VOID, self._GuidDict)(True)\r
@@ -1606,35 +1882,125 @@ class DscBuildData(PlatformBuildClassObject):
                     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
                 Value, ValueSize = ParseFieldValue(Value)\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
                 Value, ValueSize = ParseFieldValue(Value)\r
-                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
+                if not Pcd.IsArray():\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
             else:\r
                 NewFieldName = ''\r
                 FieldName_ori = FieldName.strip('.')\r
                 while '[' in  FieldName:\r
                     NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
             else:\r
                 NewFieldName = ''\r
                 FieldName_ori = FieldName.strip('.')\r
                 while '[' in  FieldName:\r
                     NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                    Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
                     FieldName = FieldName.split(']', 1)[1]\r
                 FieldName = NewFieldName + FieldName\r
                     FieldName = FieldName.split(']', 1)[1]\r
                 FieldName = NewFieldName + FieldName\r
-                while '[' in FieldName:\r
+                while '[' in FieldName and not Pcd.IsArray():\r
                     FieldName = FieldName.rsplit('[', 1)[0]\r
                     FieldName = FieldName.rsplit('[', 1)[0]\r
-                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
-        CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
+        if Pcd.GetPcdMaxSize():\r
+            CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+        ArraySizeByAssign = self.CalculateActualCap(ActualCap)\r
+        if ArraySizeByAssign > 1:\r
+            CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); \n" % (ArraySizeByAssign, ArraySizeByAssign)\r
         CApp = CApp + "}\n"\r
         return CApp\r
         CApp = CApp + "}\n"\r
         return CApp\r
+    def CalculateActualCap(self,ActualCap):\r
+        if not ActualCap:\r
+            return 1\r
+        maxsize = 1\r
+        for item in ActualCap:\r
+            index_elements = ArrayIndex.findall(item)\r
+            rt = 1\r
+            for index_e in index_elements:\r
+                index_num = index_e.lstrip("[").rstrip("]").strip()\r
+                if not index_num:\r
+                    # Not support flexiable pcd array assignment\r
+                    return 1\r
+                index_num = int(index_num,16) if index_num.startswith(("0x","0X")) else int(index_num)\r
+                rt = rt * (index_num+1)\r
+            if rt  >maxsize:\r
+                maxsize = rt\r
+\r
+        return maxsize\r
 \r
     @staticmethod\r
 \r
     @staticmethod\r
-    def GenerateSizeStatments(Pcd):\r
-        CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+    def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
+        if Pcd.IsArray():\r
+            r_datatype = [Pcd.BaseDatumType]\r
+            lastoneisEmpty = False\r
+            for dem in Pcd.Capacity:\r
+                if lastoneisEmpty:\r
+                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s.  " %\r
+                                        (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName))))\r
+                if dem == '0' or dem == "-1":\r
+                    r_datatype.append("[1]")\r
+                    lastoneisEmpty = True\r
+                else:\r
+                    r_datatype.append("[" + dem + "]")\r
+\r
+            if Pcd.Type in [MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_HII]:\r
+                PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultStoreDict.get(defaultstorename)\r
+            elif Pcd.Type in [MODEL_PCD_DYNAMIC_EX_DEFAULT,MODEL_PCD_DYNAMIC_VPD,MODEL_PCD_DYNAMIC_DEFAULT,MODEL_PCD_DYNAMIC_EX_VPD]:\r
+                PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultValue\r
+            else:\r
+                PcdDefValue = Pcd.DefaultValue\r
+            if lastoneisEmpty:\r
+                if "{CODE(" not in PcdDefValue:\r
+                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+                    sizeof = "sizeof(%s)" % Pcd.BaseDatumType\r
+                    CApp = '  int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\r
+                    CApp += '  Size = ArraySize * sizeof(%s); \n' % Pcd.BaseDatumType\r
+                else:\r
+                    CApp = "  Size = 0;\n"\r
+            else:\r
+                CApp = '  Size = sizeof(%s);\n' % ("".join(r_datatype) )\r
+        else:\r
+            CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
         CApp = CApp + '  Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
         CApp = CApp + '  Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    def GetIndicator(self,index,FieldName,Pcd):\r
+        def cleanupindex(indexstr):\r
+            return indexstr.strip("[").strip("]").strip()\r
+        index_elements = ArrayIndex.findall(index)\r
+        pcd_capacity = Pcd.Capacity\r
+        if index:\r
+            indicator = "(Pcd"\r
+            if len(pcd_capacity)>2:\r
+                for i in range(0,len(index_elements)):\r
+                    index_ele = index_elements[i]\r
+                    index_num = index_ele.strip("[").strip("]").strip()\r
+                    if i == len(index_elements) -2:\r
+                        indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))\r
+                        break\r
+                    else:\r
+                        indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))\r
+            elif len(pcd_capacity) == 2:\r
+                indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())\r
+            elif len(pcd_capacity) == 1:\r
+                index_ele = index_elements[0]\r
+                index_num = index_ele.strip("[").strip("]").strip()\r
+                indicator += " + %s)" % (index_num)\r
+        else:\r
+            indicator = "Pcd"\r
+        if FieldName:\r
+            indicator += "->" + FieldName\r
+        return indicator\r
+\r
+    def GetStarNum(self,Pcd):\r
+        if not Pcd.IsArray():\r
+            return 1\r
+        elif Pcd.IsSimpleTypeArray():\r
+            return len(Pcd.Capacity)\r
+        else:\r
+            return len(Pcd.Capacity) + 1\r
     def GenerateDefaultValueAssignFunction(self, Pcd):\r
         CApp = "// Default value in Dec \n"\r
     def GenerateDefaultValueAssignFunction(self, Pcd):\r
         CApp = "// Default value in Dec \n"\r
-        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
+        CApp = CApp + ' UINT32 PcdArraySize;\n'\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
-        IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
+        IsArray = _IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
         if IsArray:\r
             try:\r
                 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
         if IsArray:\r
             try:\r
                 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
@@ -1643,19 +2009,38 @@ class DscBuildData(PlatformBuildClassObject):
                                 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
         DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
         Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
                                 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
         DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
         Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
-        if isinstance(Value, str):\r
+        if IsArray:\r
+            #\r
+            # Use memcpy() to copy value into field\r
+            #\r
+            if Pcd.IsArray():\r
+                pcdarraysize = Pcd.PcdArraySize()\r
+                if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                    if Pcd.Capacity[-1] != "-1":\r
+                        CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_INIT_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From  %s Line %s \n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
+                    CApp = CApp + ' PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                    CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                else:\r
+                    if Pcd.Capacity[-1] != "-1":\r
+                        CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From %s Line %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
+                    CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                    CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
+            else:\r
+                if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                    CApp = CApp + '  PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                    CApp = CApp + '  memcpy (Pcd, &%s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                else:\r
+                    CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+        elif isinstance(Value, str):\r
             CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
             CApp = CApp + '  Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
-        elif IsArray:\r
-        #\r
-        # Use memcpy() to copy value into field\r
-        #\r
-            CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
-            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-        for FieldList in [Pcd.DefaultValues]:\r
+        for index in Pcd.DefaultValues:\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1667,20 +2052,26 @@ class DscBuildData(PlatformBuildClassObject):
                     Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
                 except Exception:\r
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
                     Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
                 except Exception:\r
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                if isinstance(Value, str):\r
-                    CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                elif IsArray:\r
+\r
+                indicator = self.GetIndicator(index, FieldName,Pcd)\r
+                if IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                    CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                    CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
+                elif isinstance(Value, str):\r
+                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 else:\r
                 else:\r
+                    if '[' in FieldName and ']' in FieldName:\r
+                        Index = int(FieldName.split('[')[1].split(']')[0])\r
+                        CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
                     if ValueSize > 4:\r
                     if ValueSize > 4:\r
-                        CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
                     else:\r
-                        CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1689,56 +2080,133 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
         CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    def GetPcdDscRawDefaultValue(self,Pcd, SkuName,DefaultStoreName):\r
+        if Pcd.Type in PCD_DYNAMIC_TYPE_SET or Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
+            else:\r
+                pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
+        else:\r
+            pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
+\r
+        return pcddefaultvalue\r
+    def GetPcdDscRawValueInfo(self,Pcd, SkuName,DefaultStoreName):\r
+        DscValueInfo = Pcd.DscRawValueInfo.get(SkuName, {}).get(DefaultStoreName)\r
+        if DscValueInfo:\r
+            dscfilepath,lineno = DscValueInfo\r
+        else:\r
+            dscfilepath = self.MetaFile.File\r
+            lineno = ""\r
+        return dscfilepath,lineno\r
+\r
     def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
         CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
     def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
         CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
-        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
+        CApp = CApp + ' UINT32 PcdArraySize;\n'\r
 \r
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
         inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
 \r
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
         inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
-        if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-            pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
+        dscfilepath,lineno = self.GetPcdDscRawValueInfo(Pcd, SkuName, DefaultStoreName)\r
+        if lineno:\r
+            valuefrom = "%s Line %s" % (dscfilepath,str(lineno))\r
         else:\r
         else:\r
-            if not Pcd.DscRawValue:\r
-                # handle the case that structure pcd is not appear in DSC\r
-                self.CopyDscRawValue(Pcd)\r
-            pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
-        for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
-            if not FieldList:\r
-                continue\r
-            if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
-                if IsArray:\r
+            valuefrom = dscfilepath\r
+\r
+        pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
+        if pcddefaultvalue:\r
+            FieldList = pcddefaultvalue\r
+            IsArray = _IsFieldValueAnArray(FieldList)\r
+            if IsArray:\r
+                if "{CODE(" not in FieldList:\r
                     try:\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
                     try:\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
-                Value, ValueSize = ParseFieldValue (FieldList)\r
+            Value, ValueSize = ParseFieldValue (FieldList)\r
 \r
 \r
-                if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-                    if isinstance(Value, str):\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                            pcdarraysize = Pcd.PcdArraySize()\r
+                            CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType, valuefrom)\r
+                        CApp = CApp+ ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                    elif IsArray:\r
+                elif IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
-                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                        CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-                else:\r
-                    if isinstance(Value, str):\r
+                    if Pcd.IsArray():\r
+                        pcdarraysize = Pcd.PcdArraySize()\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                            CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
+                    else:\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            CApp = CApp + '  PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
+                            CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+            else:\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                            pcdarraysize = Pcd.PcdArraySize()\r
+                            CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                        CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n '% (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
-                    elif IsArray:\r
+                elif IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
-                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
-                        CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+                    if Pcd.IsArray():\r
+                        pcdarraysize = Pcd.PcdArraySize()\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                            CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            if Pcd.Capacity[-1] != "-1":\r
+                                CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From  %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
+                            CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                            CApp = CApp + '  memcpy (Pcd, Value, PcdArraySize);\n'\r
+                    else:\r
+                        if "{CODE(" in pcddefaultvalue:\r
+                            CApp = CApp + '  PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
+                            CApp = CApp + '  memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                        else:\r
+                            CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
+                            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+        inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
+        if not inheritvalue:\r
+            inheritvalue = []\r
+        for index in inheritvalue:\r
+            FieldList = inheritvalue[index]\r
+            if not FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
-                    IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    indicator = self.GetIndicator(index, FieldName,Pcd)\r
+                    IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
                             FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                     if IsArray:\r
                         try:\r
                             FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1755,14 +2223,18 @@ class DscBuildData(PlatformBuildClassObject):
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
-                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                         CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                        CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                        CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
                     else:\r
                     else:\r
+                        if '[' in FieldName and ']' in FieldName:\r
+                            Index = int(FieldName.split('[')[1].split(']')[0])\r
+                            CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
                         if ValueSize > 4:\r
                         if ValueSize > 4:\r
-                            CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         else:\r
                         else:\r
-                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1773,7 +2245,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
-        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -1782,7 +2254,7 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
             if not FieldList:\r
                 continue\r
             if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
+                IsArray = _IsFieldValueAnArray(FieldList)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                 if IsArray:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
@@ -1801,7 +2273,7 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
             for FieldName in FieldList:\r
                     CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
             for FieldName in FieldList:\r
-                IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
                 if IsArray:\r
                     try:\r
                         FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1820,10 +2292,14 @@ class DscBuildData(PlatformBuildClassObject):
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
                 else:\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
                 else:\r
+                    if '[' in FieldName and ']' in FieldName:\r
+                        Index = int(FieldName.split('[')[1].split(']')[0])\r
+                        CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
                     if ValueSize > 4:\r
                         CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
                     if ValueSize > 4:\r
                         CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
@@ -1835,11 +2311,81 @@ class DscBuildData(PlatformBuildClassObject):
     def GenerateCommandLineValueStatement(Pcd):\r
         CApp = '  Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
     def GenerateCommandLineValueStatement(Pcd):\r
         CApp = '  Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
+    def GenerateFdfValue(self,Pcd):\r
+        CApp = "// Value in Fdf\n"\r
+        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
+        CApp = CApp + '  UINT32  FieldSize;\n'\r
+        CApp = CApp + '  CHAR8   *Value;\n'\r
+\r
+        pcddefaultvalue = Pcd.PcdValueFromFdf\r
+        for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromFdf]:\r
+            if not FieldList:\r
+                continue\r
+            if pcddefaultvalue and FieldList == pcddefaultvalue:\r
+                IsArray = _IsFieldValueAnArray(FieldList)\r
+                if IsArray:\r
+                    try:\r
+                        FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
+                    except BadExpression:\r
+                        EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Fdf: %s" %\r
+                                        (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
+                Value, ValueSize = ParseFieldValue (FieldList)\r
+\r
+                if isinstance(Value, str):\r
+                    CApp = CApp + '  Pcd = %s; // From Fdf \n' % (Value)\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    CApp = CApp + '  Value     = %s; // From Fdf .\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
+                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+                continue\r
+            for FieldName in FieldList:\r
+                IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
+                if IsArray:\r
+                    try:\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
+                    except:\r
+                        print("error")\r
+                try:\r
+                    Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                except Exception:\r
+                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                if isinstance(Value, str):\r
+                    CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
+                    CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                else:\r
+                    if '[' in FieldName and ']' in FieldName:\r
+                        Index = int(FieldName.split('[')[1].split(']')[0])\r
+                        CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
+                    if ValueSize > 4:\r
+                        CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    else:\r
+                        CApp = CApp + '  Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+        CApp = CApp + "}\n"\r
+        return CApp\r
+\r
+    @staticmethod\r
+    def GenerateFdfValueStatement(Pcd):\r
+        CApp = '  Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+        return CApp\r
 \r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
 \r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
-        OverrideValues = {DefaultStore:""}\r
+        OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
             OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
         if Pcd.SkuOverrideValues:\r
             OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
+        if not OverrideValues:\r
+            OverrideValues = {TAB_DEFAULT_STORES_DEFAULT:Pcd.DefaultValues}\r
         for DefaultStoreName in OverrideValues:\r
             CApp = CApp + 'void\n'\r
             CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         for DefaultStoreName in OverrideValues:\r
             CApp = CApp + 'void\n'\r
             CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
@@ -1851,14 +2397,12 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '  CHAR8   *Value;\n'\r
             CApp = CApp + '  UINT32  OriginalSize;\n'\r
             CApp = CApp + '  VOID    *OriginalPcd;\n'\r
             CApp = CApp + '  CHAR8   *Value;\n'\r
             CApp = CApp + '  UINT32  OriginalSize;\n'\r
             CApp = CApp + '  VOID    *OriginalPcd;\n'\r
-            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
             CApp = CApp + '\n'\r
 \r
             CApp = CApp + '\n'\r
 \r
-            if SkuName in Pcd.SkuInfoList:\r
-                DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue  else Pcd.SkuInfoList[SkuName].DefaultValue)\r
-            else:\r
-                DefaultValue = Pcd.DefaultValue\r
-            PcdDefaultValue = StringToArray(DefaultValue.strip())\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
 \r
             InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
 \r
 \r
             InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
 \r
@@ -1875,7 +2419,10 @@ class DscBuildData(PlatformBuildClassObject):
             # in a structure.  The size formula for this case is:\r
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
             # in a structure.  The size formula for this case is:\r
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
-            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd)\r
+            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,DefaultStoreName)\r
+            if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
+                CApp = CApp + '  OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
+                CApp = CApp + '  Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
@@ -1883,7 +2430,7 @@ class DscBuildData(PlatformBuildClassObject):
             # Always keep that larger one as the current size\r
             #\r
             CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
             # Always keep that larger one as the current size\r
             #\r
             CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
-            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
@@ -1907,11 +2454,12 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
                 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
             else:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
                 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
+            CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
             CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
             #\r
             # Set new PCD value and size\r
             #\r
             CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
             #\r
             # Set new PCD value and size\r
             #\r
-            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
 \r
             #\r
             # Free PCD\r
 \r
             #\r
             # Free PCD\r
@@ -1921,6 +2469,67 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '\n'\r
         return InitByteValue, CApp\r
 \r
             CApp = CApp + '\n'\r
         return InitByteValue, CApp\r
 \r
+    def GenerateArrayAssignment(self, Pcd):\r
+        CApp = ""\r
+        if not Pcd:\r
+            return CApp\r
+        Demesion = ""\r
+        for d in Pcd.Capacity:\r
+            Demesion += "[]"\r
+\r
+        Value = Pcd.DefaultValueFromDec\r
+        if "{CODE(" in Pcd.DefaultValueFromDec:\r
+            realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+            CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+        if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+            for skuname in Pcd.SkuInfoList:\r
+                skuinfo = Pcd.SkuInfoList[skuname]\r
+                if skuinfo.VariableName:\r
+                    for defaultstore in skuinfo.DefaultStoreDict:\r
+                        pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, defaultstore)\r
+                        if pcddscrawdefaultvalue:\r
+                            Value = skuinfo.DefaultStoreDict[defaultstore]\r
+                            if "{CODE(" in Value:\r
+                                realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                                CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
+                else:\r
+                    pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, TAB_DEFAULT_STORES_DEFAULT)\r
+                    if pcddscrawdefaultvalue:\r
+                        Value = skuinfo.DefaultValue\r
+                        if "{CODE(" in Value:\r
+                            realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                            CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
+        else:\r
+            pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
+            if pcddscrawdefaultvalue:\r
+                if "{CODE(" in Pcd.DefaultValue:\r
+                    realvalue = Pcd.DefaultValue.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                    CApp += "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+        return CApp\r
+\r
+    def SkuOverrideValuesEmpty(self,OverrideValues):\r
+        if not OverrideValues:\r
+            return True\r
+        for key in OverrideValues:\r
+            if OverrideValues[key]:\r
+                return False\r
+        return True\r
+\r
+    def ParseCCFlags(self, ccflag):\r
+        ccflags = set()\r
+        ccflaglist = ccflag.split(" ")\r
+        i = 0\r
+        while i < len(ccflaglist):\r
+            item = ccflaglist[i].strip()\r
+            if item in (r"/D", r"/U","-D","-U"):\r
+                ccflags.add(" ".join((ccflaglist[i],ccflaglist[i+1])))\r
+                i = i+1\r
+            elif item.startswith((r"/D", r"/U","-D","-U")):\r
+                ccflags.add(item)\r
+            i +=1\r
+        return ccflags\r
     def GenerateByteArrayValue (self, StructuredPcds):\r
         #\r
         # Generate/Compile/Run C application to determine if there are any flexible array members\r
     def GenerateByteArrayValue (self, StructuredPcds):\r
         #\r
         # Generate/Compile/Run C application to determine if there are any flexible array members\r
@@ -1939,12 +2548,15 @@ class DscBuildData(PlatformBuildClassObject):
                     IncludeFiles.add(IncludeFile)\r
                     CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
         CApp = CApp + '\n'\r
                     IncludeFiles.add(IncludeFile)\r
                     CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
         CApp = CApp + '\n'\r
+        for Pcd in StructuredPcds.values():\r
+            CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+            CApp = CApp + self.GenerateFdfValue(Pcd)\r
             CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
             CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
-            if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
+            if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
             else:\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
             else:\r
@@ -1953,7 +2565,7 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
-            if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
+            if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
             else:\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
             else:\r
@@ -1970,11 +2582,11 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '  )\n'\r
         CApp = CApp + '{\n'\r
         for Pcd in StructuredPcds.values():\r
         CApp = CApp + '  )\n'\r
         CApp = CApp + '{\n'\r
         for Pcd in StructuredPcds.values():\r
-            if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
+            if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
-                    if SkuName not in Pcd.SkuOverrideValues:\r
+                    if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
                         continue\r
                     for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
                         CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
@@ -1989,14 +2601,14 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
 \r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
+            MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
         else:\r
             MakeApp = MakeApp + PcdGccMakefile\r
         else:\r
             MakeApp = MakeApp + PcdGccMakefile\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
+            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
                       'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
 \r
         IncSearchList = []\r
                       'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
 \r
         IncSearchList = []\r
-        PlatformInc = {}\r
+        PlatformInc = OrderedDict()\r
         for Cache in self._Bdb._CACHE_.values():\r
             if Cache.MetaFile.Ext.lower() != '.dec':\r
                 continue\r
         for Cache in self._Bdb._CACHE_.values():\r
             if Cache.MetaFile.Ext.lower() != '.dec':\r
                 continue\r
@@ -2026,7 +2638,7 @@ class DscBuildData(PlatformBuildClassObject):
         CC_FLAGS = LinuxCFLAGS\r
         if sys.platform == "win32":\r
             CC_FLAGS = WindowsCFLAGS\r
         CC_FLAGS = LinuxCFLAGS\r
         if sys.platform == "win32":\r
             CC_FLAGS = WindowsCFLAGS\r
-        BuildOptions = {}\r
+        BuildOptions = OrderedDict()\r
         for Options in self.BuildOptions:\r
             if Options[2] != EDKII_NAME:\r
                 continue\r
         for Options in self.BuildOptions:\r
             if Options[2] != EDKII_NAME:\r
                 continue\r
@@ -2036,38 +2648,36 @@ class DscBuildData(PlatformBuildClassObject):
             Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
             if Tool != 'CC':\r
                 continue\r
             Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
             if Tool != 'CC':\r
                 continue\r
+            if Attr != "FLAGS":\r
+                continue\r
+            if Target == TAB_STAR or Target == self._Target:\r
+                if Tag == TAB_STAR or Tag == self._Toolchain:\r
+                    if 'COMMON' not in BuildOptions:\r
+                        BuildOptions['COMMON'] = set()\r
+                    if Arch == TAB_STAR:\r
+                        BuildOptions['COMMON']|= self.ParseCCFlags(self.BuildOptions[Options])\r
+                    if Arch in self.SupArchList:\r
+                        if Arch not in BuildOptions:\r
+                            BuildOptions[Arch] = set()\r
+                        BuildOptions[Arch] |= self.ParseCCFlags(self.BuildOptions[Options])\r
 \r
 \r
-            if Target == "*" or Target == self._Target:\r
-                if Tag == "*" or Tag == self._Toolchain:\r
-                    if Arch == "*" or Arch == self.Arch:\r
-                        if Tool not in BuildOptions:\r
-                            BuildOptions[Tool] = {}\r
-                        if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
-                            BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
-                        else:\r
-                            # append options for the same tool except PATH\r
-                            if Attr != 'PATH':\r
-                                BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
-                            else:\r
-                                BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
         if BuildOptions:\r
         if BuildOptions:\r
-            for Tool in BuildOptions:\r
-                for Attr in BuildOptions[Tool]:\r
-                    if Attr == "FLAGS":\r
-                        Value = BuildOptions[Tool][Attr]\r
-                        ValueList = Value.split()\r
-                        if ValueList:\r
-                            for Id, Item in enumerate(ValueList):\r
-                                if Item in ['-D', '/D', '-U', '/U']:\r
-                                    CC_FLAGS += ' ' + Item\r
-                                    if Id + 1 < len(ValueList):\r
-                                        CC_FLAGS += ' ' + ValueList[Id + 1]\r
-                                elif Item.startswith(('-D', '/D', '-U', '/U')):\r
-                                    CC_FLAGS += ' ' + Item\r
+            ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
+            if len(ArchBuildOptions.keys()) == 1:\r
+                BuildOptions['COMMON'] |= (list(ArchBuildOptions.values())[0])\r
+            elif len(ArchBuildOptions.keys()) > 1:\r
+                CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
+                BuildOptions['COMMON'] |= CommonBuildOptions\r
+            ValueList = [item for item in BuildOptions['COMMON'] if item.startswith((r"/U","-U"))]\r
+            ValueList.extend([item for item in BuildOptions['COMMON'] if item.startswith((r"/D", "-D"))])\r
+            CC_FLAGS += " ".join(ValueList)\r
         MakeApp += CC_FLAGS\r
 \r
         if sys.platform == "win32":\r
             MakeApp = MakeApp + PcdMakefileEnd\r
         MakeApp += CC_FLAGS\r
 \r
         if sys.platform == "win32":\r
             MakeApp = MakeApp + PcdMakefileEnd\r
+            MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
+        else:\r
+            MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
         MakeApp = MakeApp + '\n'\r
         IncludeFileFullPaths = []\r
         for includefile in IncludeFiles:\r
         MakeApp = MakeApp + '\n'\r
         IncludeFileFullPaths = []\r
         for includefile in IncludeFiles:\r
@@ -2091,12 +2701,11 @@ class DscBuildData(PlatformBuildClassObject):
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
 \r
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
 \r
-        PcdValueInitExe = PcdValueInitName\r
+        Dest_PcdValueInitExe = PcdValueInitName\r
         if not sys.platform == "win32":\r
         if not sys.platform == "win32":\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
         else:\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
-\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
@@ -2106,9 +2715,10 @@ class DscBuildData(PlatformBuildClassObject):
             MakeCommand = 'make -f %s' % (MakeFileName)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
             MakeCommand = 'make -f %s' % (MakeFileName)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
+\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
-        if returncode <>0:\r
+        if returncode != 0:\r
             CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
             File = open (CAppBaseFileName + '.c', 'r')\r
             FileData = File.readlines()\r
             CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
             File = open (CAppBaseFileName + '.c', 'r')\r
             FileData = File.readlines()\r
@@ -2121,6 +2731,8 @@ class DscBuildData(PlatformBuildClassObject):
                         FileLine = FileInfo [1].split (')')[0]\r
                     else:\r
                         FileInfo = Message.strip().split(':')\r
                         FileLine = FileInfo [1].split (')')[0]\r
                     else:\r
                         FileInfo = Message.strip().split(':')\r
+                        if len(FileInfo) < 2:\r
+                            continue\r
                         FileName = FileInfo [0]\r
                         FileLine = FileInfo [1]\r
                     if FileLine.isdigit():\r
                         FileName = FileInfo [0]\r
                         FileLine = FileInfo [1]\r
                     if FileLine.isdigit():\r
@@ -2150,8 +2762,8 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
 \r
             else:\r
                 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
 \r
-        if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
-            Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
+        if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
+            Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
             if returncode != 0:\r
                 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
             if returncode != 0:\r
                 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
@@ -2204,7 +2816,7 @@ class DscBuildData(PlatformBuildClassObject):
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
@@ -2216,6 +2828,13 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
 \r
             PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
                 continue\r
 \r
             PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            if MaxDatumSize:\r
+                if int(MaxDatumSize, 0) > 0xFFFF:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
+                if int(MaxDatumSize, 0) < 0:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
             SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
             if (PcdCName, TokenSpaceGuid) in Pcds:\r
                 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
             SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
             if (PcdCName, TokenSpaceGuid) in Pcds:\r
                 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
@@ -2239,11 +2858,17 @@ class DscBuildData(PlatformBuildClassObject):
                                                     PcdValue,\r
                                                     '',\r
                                                     MaxDatumSize,\r
                                                     PcdValue,\r
                                                     '',\r
                                                     MaxDatumSize,\r
-                                                    {SkuName : SkuInfo},\r
+                                                    OrderedDict({SkuName : SkuInfo}),\r
                                                     False,\r
                                                     None,\r
                                                     IsDsc=True)\r
 \r
                                                     False,\r
                                                     None,\r
                                                     IsDsc=True)\r
 \r
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
+\r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             # Only fix the value while no value provided in DSC file.\r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             # Only fix the value while no value provided in DSC file.\r
@@ -2260,7 +2885,7 @@ class DscBuildData(PlatformBuildClassObject):
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
 \r
         return Pcds\r
 \r
 \r
         return Pcds\r
 \r
@@ -2291,28 +2916,14 @@ class DscBuildData(PlatformBuildClassObject):
         else:\r
             return False\r
 \r
         else:\r
             return False\r
 \r
-    def CopyDscRawValue(self, Pcd):\r
-        if Pcd.DscRawValue is None:\r
-            Pcd.DscRawValue = dict()\r
-        if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
-            if self.SkuIdMgr.SystemSkuId not in Pcd.DscRawValue:\r
-                Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
-            Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = Pcd.DefaultValue\r
-        for skuname in Pcd.SkuInfoList:\r
-            Pcd.DscRawValue[skuname] = {}\r
-            if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                for defaultstore in Pcd.SkuInfoList[skuname].DefaultStoreDict:\r
-                    Pcd.DscRawValue[skuname][defaultstore] = Pcd.SkuInfoList[skuname].DefaultStoreDict[defaultstore]\r
-            else:\r
-                Pcd.DscRawValue[skuname][TAB_DEFAULT_STORES_DEFAULT] = Pcd.SkuInfoList[skuname].DefaultValue\r
     def CompletePcdValues(self, PcdSet):\r
     def CompletePcdValues(self, PcdSet):\r
-        Pcds = {}\r
+        Pcds = OrderedDict()\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)\r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
             PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\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)\r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
             PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
-            self.CopyDscRawValue(PcdObj)\r
+\r
             if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
             if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
@@ -2328,7 +2939,7 @@ class DscBuildData(PlatformBuildClassObject):
                     mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
                     for defaultstorename in DefaultStores:\r
                         if defaultstorename not in skuobj.DefaultStoreDict:\r
                     mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
                     for defaultstorename in DefaultStores:\r
                         if defaultstorename not in skuobj.DefaultStoreDict:\r
-                            skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                            skuobj.DefaultStoreDict[defaultstorename] = skuobj.DefaultStoreDict[mindefaultstorename]\r
                     skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
             for skuname, skuid in SkuIds.items():\r
                 if skuname not in PcdObj.SkuInfoList:\r
                     skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
             for skuname, skuid in SkuIds.items():\r
                 if skuname not in PcdObj.SkuInfoList:\r
@@ -2339,7 +2950,7 @@ class DscBuildData(PlatformBuildClassObject):
                     PcdObj.SkuInfoList[skuname].SkuId = skuid\r
                     PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
             if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
                     PcdObj.SkuInfoList[skuname].SkuId = skuid\r
                     PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
             if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
+                PcdObj.DefaultValue = list(PcdObj.SkuInfoList.values())[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
             Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
         return Pcds\r
     ## Retrieve dynamic HII PCD settings\r
             Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
         return Pcds\r
     ## Retrieve dynamic HII PCD settings\r
@@ -2353,12 +2964,13 @@ class DscBuildData(PlatformBuildClassObject):
         VariableAttrs = {}\r
 \r
         Pcds = OrderedDict()\r
         VariableAttrs = {}\r
 \r
         Pcds = OrderedDict()\r
+        UserDefinedDefaultStores = []\r
         #\r
         # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH and SKU\r
         #\r
         PcdDict = tdict(True, 5)\r
         #\r
         # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH and SKU\r
         #\r
         PcdDict = tdict(True, 5)\r
-        PcdSet = set()\r
+        PcdList = []\r
         RecordList = self._RawData[Type, self._Arch]\r
         # Find out all possible PCD candidates for self._Arch\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
         RecordList = self._RawData[Type, self._Arch]\r
         # Find out all possible PCD candidates for self._Arch\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
@@ -2370,19 +2982,22 @@ class DscBuildData(PlatformBuildClassObject):
             DefaultStore = DefaultStore.upper()\r
             if DefaultStore == TAB_COMMON:\r
                 DefaultStore = TAB_DEFAULT_STORES_DEFAULT\r
             DefaultStore = DefaultStore.upper()\r
             if DefaultStore == TAB_COMMON:\r
                 DefaultStore = TAB_DEFAULT_STORES_DEFAULT\r
+            else:\r
+                #The end user define [DefaultStores] and [SKUID_IDENTIFIER.Menufacturing] in DSC\r
+                UserDefinedDefaultStores.append((PcdCName, TokenSpaceGuid))\r
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if DefaultStore not in DefaultStoresDefine:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if DefaultStore not in DefaultStoresDefine:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
-                PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5) not in PcdList:\r
+                PcdList.append((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
 \r
 \r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
 \r
 \r
         # Remove redundant PCD candidates, per the ARCH and SKU\r
-        for PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4 in PcdSet:\r
+        for PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4 in PcdList:\r
 \r
             Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
             if Setting is None:\r
 \r
             Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
             if Setting is None:\r
@@ -2432,7 +3047,7 @@ class DscBuildData(PlatformBuildClassObject):
                     pcdObject.SkuInfoList[SkuName] = SkuInfo\r
             else:\r
                 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
                     pcdObject.SkuInfoList[SkuName] = SkuInfo\r
             else:\r
                 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
-                Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
+                PcdClassObj = PcdClassObject(\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
                                                 self._PCD_TYPE_STRING_[Type],\r
                                                 PcdCName,\r
                                                 TokenSpaceGuid,\r
                                                 self._PCD_TYPE_STRING_[Type],\r
@@ -2440,17 +3055,24 @@ class DscBuildData(PlatformBuildClassObject):
                                                 DefaultValue,\r
                                                 '',\r
                                                 '',\r
                                                 DefaultValue,\r
                                                 '',\r
                                                 '',\r
-                                                {SkuName : SkuInfo},\r
+                                                OrderedDict({SkuName : SkuInfo}),\r
                                                 False,\r
                                                 None,\r
                                                 pcdDecObject.validateranges,\r
                                                 pcdDecObject.validlists,\r
                                                 pcdDecObject.expressions,\r
                                                 IsDsc=True)\r
                                                 False,\r
                                                 None,\r
                                                 pcdDecObject.validateranges,\r
                                                 pcdDecObject.validlists,\r
                                                 pcdDecObject.expressions,\r
                                                 IsDsc=True)\r
-\r
-\r
+                if (PcdCName, TokenSpaceGuid) in UserDefinedDefaultStores:\r
+                    PcdClassObj.UserDefinedDefaultStoresFlag = True\r
+                Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
+\r
+                Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = int(Dummy4)\r
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][DefaultStore] = (self.MetaFile.File,Dummy4)\r
         for pcd in Pcds.values():\r
         for pcd in Pcds.values():\r
-            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
@@ -2461,6 +3083,7 @@ class DscBuildData(PlatformBuildClassObject):
                         sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
                     pcd.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
                         sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
                     pcd.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
+                SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
@@ -2490,7 +3113,7 @@ class DscBuildData(PlatformBuildClassObject):
             invalidpcd = ",".join(invalidhii)\r
             EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
 \r
             invalidpcd = ",".join(invalidhii)\r
             EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
 \r
         return Pcds\r
 \r
 \r
         return Pcds\r
 \r
@@ -2533,7 +3156,7 @@ class DscBuildData(PlatformBuildClassObject):
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
@@ -2549,6 +3172,13 @@ class DscBuildData(PlatformBuildClassObject):
             # until the DEC parser has been called.\r
             #\r
             VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
             # until the DEC parser has been called.\r
             #\r
             VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
+            if MaxDatumSize:\r
+                if int(MaxDatumSize, 0) > 0xFFFF:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
+                if int(MaxDatumSize, 0) < 0:\r
+                    EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
+                                    File=self.MetaFile, Line=Dummy4)\r
             SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
             if (PcdCName, TokenSpaceGuid) in Pcds:\r
                 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
             SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
             if (PcdCName, TokenSpaceGuid) in Pcds:\r
                 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
@@ -2572,12 +3202,17 @@ class DscBuildData(PlatformBuildClassObject):
                                                 InitialValue,\r
                                                 '',\r
                                                 MaxDatumSize,\r
                                                 InitialValue,\r
                                                 '',\r
                                                 MaxDatumSize,\r
-                                                {SkuName : SkuInfo},\r
+                                                OrderedDict({SkuName : SkuInfo}),\r
                                                 False,\r
                                                 None,\r
                                                 IsDsc=True)\r
                                                 False,\r
                                                 None,\r
                                                 IsDsc=True)\r
+\r
+            if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
+            Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
         for pcd in Pcds.values():\r
         for pcd in Pcds.values():\r
-            SkuInfoObj = pcd.SkuInfoList.values()[0]\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
             pcd.DatumType = pcdDecObject.DatumType\r
             # Only fix the value while no value provided in DSC file.\r
@@ -2585,6 +3220,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if not sku.DefaultValue:\r
                     sku.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
                 if not sku.DefaultValue:\r
                     sku.DefaultValue = pcdDecObject.DefaultValue\r
             if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
+                SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
                 valuefromDec = pcdDecObject.DefaultValue\r
                 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
                 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
@@ -2594,8 +3230,17 @@ class DscBuildData(PlatformBuildClassObject):
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
+        #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",\r
+        #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".\r
+        for pcd in Pcds.values():\r
+            PcdValueTypeSet = set()\r
+            for sku in pcd.SkuInfoList.values():\r
+                PcdValueTypeSet.add("UnicodeString" if sku.DefaultValue.startswith(('L"',"L'")) else "OtherVOID*")\r
+            if len(PcdValueTypeSet) > 1:\r
+                for sku in pcd.SkuInfoList.values():\r
+                    sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
 \r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
         return Pcds\r
 \r
     ## Add external modules\r
         return Pcds\r
 \r
     ## Add external modules\r
@@ -2612,8 +3257,9 @@ class DscBuildData(PlatformBuildClassObject):
             Module.MetaFile = FilePath\r
             self.Modules.append(Module)\r
 \r
             Module.MetaFile = FilePath\r
             self.Modules.append(Module)\r
 \r
-    def _GetToolChainFamily(self):\r
-        self._ToolChainFamily = "MSFT"\r
+    @property\r
+    def ToolChainFamily(self):\r
+        self._ToolChainFamily = TAB_COMPILER_MSFT\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
             TargetTxt      = TargetTxtClassObject()\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
             TargetTxt      = TargetTxtClassObject()\r
@@ -2629,7 +3275,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
                    or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
                    or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
                 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
                    or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
                    or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
-                    self._ToolChainFamily = "MSFT"\r
+                    self._ToolChainFamily = TAB_COMPILER_MSFT\r
                 else:\r
                     self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
         return self._ToolChainFamily\r
                 else:\r
                     self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
         return self._ToolChainFamily\r
@@ -2647,6 +3293,7 @@ class DscBuildData(PlatformBuildClassObject):
         if (Name, Guid) not in self.Pcds:\r
             self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
         self.Pcds[Name, Guid].DefaultValue = Value\r
         if (Name, Guid) not in self.Pcds:\r
             self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
         self.Pcds[Name, Guid].DefaultValue = Value\r
+\r
     @property\r
     def DecPcds(self):\r
         if self._DecPcds is None:\r
     @property\r
     def DecPcds(self):\r
         if self._DecPcds is None:\r
@@ -2661,35 +3308,5 @@ class DscBuildData(PlatformBuildClassObject):
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
+            self._GuidDict.update(GlobalData.gPlatformPcds)\r
         return self._DecPcds\r
         return self._DecPcds\r
-    _Macros             = property(_GetMacros)\r
-    Arch                = property(_GetArch, _SetArch)\r
-    Platform            = property(_GetPlatformName)\r
-    PlatformName        = property(_GetPlatformName)\r
-    Guid                = property(_GetFileGuid)\r
-    Version             = property(_GetVersion)\r
-    DscSpecification    = property(_GetDscSpec)\r
-    OutputDirectory     = property(_GetOutpuDir)\r
-    SupArchList         = property(_GetSupArch)\r
-    BuildTargets        = property(_GetBuildTarget)\r
-    SkuName             = property(_GetSkuName, _SetSkuName)\r
-    PcdInfoFlag         = property(_GetPcdInfoFlag)\r
-    VarCheckFlag        = property(_GetVarCheckFlag)\r
-    FlashDefinition     = property(_GetFdfFile)\r
-    Prebuild            = property(_GetPrebuild)\r
-    Postbuild           = property(_GetPostbuild)\r
-    BuildNumber         = property(_GetBuildNumber)\r
-    MakefileName        = property(_GetMakefileName)\r
-    BsBaseAddress       = property(_GetBsBaseAddress)\r
-    RtBaseAddress       = property(_GetRtBaseAddress)\r
-    LoadFixAddress      = property(_GetLoadFixAddress)\r
-    RFCLanguages        = property(_GetRFCLanguages)\r
-    ISOLanguages        = property(_GetISOLanguages)\r
-    VpdToolGuid         = property(_GetVpdToolGuid)\r
-    SkuIds              = property(_GetSkuIds)\r
-    Modules             = property(_GetModules)\r
-    LibraryInstances    = property(_GetLibraryInstances)\r
-    LibraryClasses      = property(_GetLibraryClasses)\r
-    Pcds                = property(_GetPcds)\r
-    BuildOptions        = property(_GetBuildOptions)\r
-    ToolChainFamily     = property(_GetToolChainFamily)\r