]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Enable the flag to treat dynamic pcd as dynamicEx
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 748452623fd36c96e179edeaf1d64b5cdd88dc27..4d5b1ad4d90a1f241d1dc7e255c01e79363a9008 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 - 2020, 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
@@ -25,25 +19,43 @@ from Common.Misc import *
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\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 Common.TargetTxtClassObject import TargetTxtDict\r
+from Common.ToolDefClassObject import ToolDefDict\r
 from .MetaDataTable import *\r
 from .MetaFileTable import *\r
 from .MetaFileParser import *\r
 \r
 from .WorkspaceCommon import GetDeclaredPcd\r
 from Common.Misc import AnalyzeDscPcd\r
 from .MetaDataTable import *\r
 from .MetaFileTable import *\r
 from .MetaFileParser import *\r
 \r
 from .WorkspaceCommon import GetDeclaredPcd\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
 PcdValueInitName = 'PcdValueInit'\r
+PcdValueCommonName = 'PcdValueCommon'\r
 \r
 PcdMainCHeader = '''\r
 /**\r
 \r
 PcdMainCHeader = '''\r
 /**\r
@@ -80,19 +92,22 @@ WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
 LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
 PcdMakefileEnd = '''\r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
 LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
 PcdMakefileEnd = '''\r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
-\r
-LIBS = $(LIB_PATH)\Common.lib\r
-\r
 !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
@@ -131,8 +146,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
@@ -158,20 +179,6 @@ def GetDependencyList(FileStack, SearchPathList):
     return DependencyList\r
 \r
 class DscBuildData(PlatformBuildClassObject):\r
     return DependencyList\r
 \r
 class DscBuildData(PlatformBuildClassObject):\r
-    # dict used to convert PCD type in database to string used by build tool\r
-    _PCD_TYPE_STRING_ = {\r
-        MODEL_PCD_FIXED_AT_BUILD        :   TAB_PCDS_FIXED_AT_BUILD,\r
-        MODEL_PCD_PATCHABLE_IN_MODULE   :   TAB_PCDS_PATCHABLE_IN_MODULE,\r
-        MODEL_PCD_FEATURE_FLAG          :   TAB_PCDS_FEATURE_FLAG,\r
-        MODEL_PCD_DYNAMIC               :   TAB_PCDS_DYNAMIC,\r
-        MODEL_PCD_DYNAMIC_DEFAULT       :   TAB_PCDS_DYNAMIC,\r
-        MODEL_PCD_DYNAMIC_HII           :   TAB_PCDS_DYNAMIC_HII,\r
-        MODEL_PCD_DYNAMIC_VPD           :   TAB_PCDS_DYNAMIC_VPD,\r
-        MODEL_PCD_DYNAMIC_EX            :   TAB_PCDS_DYNAMIC_EX,\r
-        MODEL_PCD_DYNAMIC_EX_DEFAULT    :   TAB_PCDS_DYNAMIC_EX,\r
-        MODEL_PCD_DYNAMIC_EX_HII        :   TAB_PCDS_DYNAMIC_EX_HII,\r
-        MODEL_PCD_DYNAMIC_EX_VPD        :   TAB_PCDS_DYNAMIC_EX_VPD,\r
-    }\r
 \r
     # dict used to convert part of [Defines] to members of DscBuildData directly\r
     _PROPERTY_ = {\r
 \r
     # dict used to convert part of [Defines] to members of DscBuildData directly\r
     _PROPERTY_ = {\r
@@ -218,10 +225,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
+        self.UpdatePcdTypeDict()\r
     @property\r
     def OutputPath(self):\r
         if os.getenv("WORKSPACE"):\r
     @property\r
     def OutputPath(self):\r
         if os.getenv("WORKSPACE"):\r
@@ -273,44 +280,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
+    @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
@@ -404,13 +397,17 @@ class DscBuildData(PlatformBuildClassObject):
                 except:\r
                     EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
                 self._VpdToolGuid = Record[2]\r
                 except:\r
                     EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
                 self._VpdToolGuid = Record[2]\r
+            elif Name == TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX:\r
+                if TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX not in gCommandLineDefines:\r
+                    gCommandLineDefines[TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX] = Record[2].strip()\r
             elif Name in self:\r
                 self[Name] = Record[2]\r
         # set _Header to non-None in order to avoid database re-querying\r
         self._Header = 'DUMMY'\r
 \r
     ## Retrieve platform name\r
             elif Name in self:\r
                 self[Name] = Record[2]\r
         # set _Header to non-None in order to avoid database re-querying\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
@@ -418,8 +415,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
@@ -428,7 +430,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
@@ -437,7 +440,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
@@ -446,7 +450,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
@@ -455,7 +460,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
@@ -464,7 +470,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
@@ -472,14 +479,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
@@ -488,7 +498,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
@@ -497,10 +508,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
@@ -508,7 +521,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
@@ -516,7 +530,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
@@ -525,7 +540,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
@@ -534,7 +550,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
@@ -543,7 +560,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
@@ -552,7 +570,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
@@ -561,7 +580,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
@@ -591,7 +611,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
@@ -600,15 +621,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
@@ -617,7 +641,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
@@ -631,8 +656,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
@@ -668,18 +693,47 @@ 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
+\r
+    ## Retrieve packages this Platform depends on\r
+    @cached_property\r
+    def Packages(self):\r
+        RetVal = set()\r
+        RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]\r
+        Macros = self._Macros\r
+        for Record in RecordList:\r
+            File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            # check the file validation\r
+            ErrorCode, ErrorInfo = File.Validate('.dec')\r
+            if ErrorCode != 0:\r
+                LineNo = Record[-1]\r
+                EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
+            # parse this package now. we need it to get protocol/ppi/guid value\r
+            RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])\r
+        return RetVal\r
+\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
@@ -689,14 +743,11 @@ 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
 \r
+            ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
-\r
+            Module.Guid = ModuleBuildData.Guid\r
             # get module private library instance\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
             for Record in RecordList:\r
             # get module private library instance\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
             for Record in RecordList:\r
@@ -717,7 +768,7 @@ class DscBuildData(PlatformBuildClassObject):
                 Module.LibraryClasses[LibraryClass] = LibraryPath\r
                 if LibraryPath not in self.LibraryInstances:\r
                     self.LibraryInstances.append(LibraryPath)\r
                 Module.LibraryClasses[LibraryClass] = LibraryPath\r
                 if LibraryPath not in self.LibraryInstances:\r
                     self.LibraryInstances.append(LibraryPath)\r
-\r
+            S_PcdSet = []\r
             # get module private PCD setting\r
             for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
                          MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
             # get module private PCD setting\r
             for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
                          MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
@@ -731,20 +782,31 @@ class DscBuildData(PlatformBuildClassObject):
                     else:\r
                         MaxDatumSize = ''\r
                     TypeString = self._PCD_TYPE_STRING_[Type]\r
                     else:\r
                         MaxDatumSize = ''\r
                     TypeString = self._PCD_TYPE_STRING_[Type]\r
-                    Pcd = PcdClassObject(\r
-                            PcdCName,\r
-                            TokenSpaceGuid,\r
-                            TypeString,\r
-                            '',\r
-                            DefaultValue,\r
-                            '',\r
-                            MaxDatumSize,\r
-                            {},\r
-                            False,\r
-                            None\r
-                            )\r
-                    Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
 \r
 \r
+                    TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+\r
+                    if ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                        S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                        DefaultValue = ''\r
+                    if ( PCName,TCName) not in Module.Pcds:\r
+                        Pcd = PcdClassObject(\r
+                                PCName,\r
+                                TCName,\r
+                                TypeString,\r
+                                '',\r
+                                DefaultValue,\r
+                                '',\r
+                                MaxDatumSize,\r
+                                {},\r
+                                False,\r
+                                None,\r
+                                IsDsc=True)\r
+                        Module.Pcds[PCName, TCName] = Pcd\r
+\r
+            Module.StrPcdSet = S_PcdSet\r
+            for TCName,PCName, _,_,_,_,_,_ in S_PcdSet:\r
+                if (PCName,TCName) in Module.Pcds:\r
+                    Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5\r
             # get module private build options\r
             RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
             for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
             # get module private build options\r
             RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
             for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
@@ -755,26 +817,28 @@ 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
                                     File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
                 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
                 ModuleFile.Arch = self._Arch\r
             if RecordList:\r
                 if len(RecordList) != 1:\r
                     EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
                                     File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
                 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
                 ModuleFile.Arch = self._Arch\r
-\r
+                Module.Guid = RecordList[0][2]\r
+                for item in Module.StrPcdSet:\r
+                    item[4] = RecordList[0][2]\r
             self._Modules[ModuleFile] = Module\r
         return self._Modules\r
 \r
     ## Retrieve all possible library instances used in this platform\r
             self._Modules[ModuleFile] = Module\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
@@ -817,8 +881,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
@@ -840,7 +902,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
@@ -853,13 +915,14 @@ class DscBuildData(PlatformBuildClassObject):
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
-\r
+            if self.Packages:\r
+                PkgSet.update(self.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
             self._GuidDict.update(GlobalData.gPlatformPcds)\r
 \r
         if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
             EdkLogger.error('build', PARSER_ERROR,\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
             self._GuidDict.update(GlobalData.gPlatformPcds)\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
@@ -872,25 +935,26 @@ 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
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
@@ -899,8 +963,12 @@ class DscBuildData(PlatformBuildClassObject):
                                 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\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
                                 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\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
-                    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
@@ -922,6 +990,7 @@ class DscBuildData(PlatformBuildClassObject):
                 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
                 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
+\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
@@ -931,7 +1000,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
@@ -1025,13 +1094,33 @@ 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
-                for BuildData in self._Bdb._CACHE_.values():\r
-                    if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
-                        continue\r
+        if GlobalData.BuildOptionPcd:\r
+            inf_objs = [item for item in self._Bdb._CACHE_.values() if item.Arch == self.Arch and item.MetaFile.Ext.lower() == '.inf']\r
+            for pcd in GlobalData.BuildOptionPcd:\r
+                (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
+                for BuildData in inf_objs:\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
                     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
@@ -1039,7 +1128,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
@@ -1050,7 +1139,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
@@ -1062,7 +1151,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
@@ -1080,6 +1169,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
@@ -1089,7 +1180,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
@@ -1102,7 +1193,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
@@ -1127,7 +1219,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
@@ -1148,7 +1241,27 @@ class DscBuildData(PlatformBuildClassObject):
                         if ' ' + Option not in self._BuildOptions[CurKey]:\r
                             self._BuildOptions[CurKey] += ' ' + Option\r
         return self._BuildOptions\r
                         if ' ' + Option not in self._BuildOptions[CurKey]:\r
                             self._BuildOptions[CurKey] += ' ' + Option\r
         return self._BuildOptions\r
+    def GetBuildOptionsByPkg(self, Module, ModuleType):\r
 \r
 \r
+        local_pkg = os.path.split(Module.LocalPkg())[0]\r
+        if self._ModuleTypeOptions is None:\r
+            self._ModuleTypeOptions = OrderedDict()\r
+        if ModuleType not in self._ModuleTypeOptions:\r
+            options = OrderedDict()\r
+            self._ModuleTypeOptions[ ModuleType] = options\r
+            RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
+            for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
+                if Dummy2 not in (TAB_COMMON,local_pkg.upper(),"EDKII"):\r
+                    continue\r
+                Type = Dummy3\r
+                if Type.upper() == ModuleType.upper():\r
+                    Key = (ToolChainFamily, ToolChain)\r
+                    if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
+                        options[Key] = Option\r
+                    else:\r
+                        if ' ' + Option not in options[Key]:\r
+                            options[Key] += ' ' + Option\r
+        return self._ModuleTypeOptions[ModuleType]\r
     def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
         if self._ModuleTypeOptions is None:\r
             self._ModuleTypeOptions = OrderedDict()\r
     def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
         if self._ModuleTypeOptions is None:\r
             self._ModuleTypeOptions = OrderedDict()\r
@@ -1226,7 +1339,6 @@ 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
-\r
     def OverrideByCommOverAll(self,AllPcds):\r
         def CheckStructureInComm(commpcds):\r
             if not commpcds:\r
     def OverrideByCommOverAll(self,AllPcds):\r
         def CheckStructureInComm(commpcds):\r
             if not commpcds:\r
@@ -1234,12 +1346,17 @@ class DscBuildData(PlatformBuildClassObject):
             if len(commpcds[0]) == 5:\r
                 return True\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
@@ -1270,9 +1387,14 @@ 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.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
-                        self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\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
+                    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
 \r
     def OverrideByFdfOverAll(self,AllPcds):\r
         return AllPcds\r
 \r
     def OverrideByFdfOverAll(self,AllPcds):\r
@@ -1314,10 +1436,30 @@ class DscBuildData(PlatformBuildClassObject):
                     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
                     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
+                        self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
+                        self._Pcds[Name, Guid].DefaultValue = Value\r
         return AllPcds\r
 \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
@@ -1329,9 +1471,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
@@ -1346,37 +1489,52 @@ 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
-\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
-\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
+                S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+        ModuleScopeOverallValue = {}\r
+        for m in self.Modules.values():\r
+            mguid = m.Guid\r
+            if m.StrPcdSet:\r
+                S_PcdSet.extend(m.StrPcdSet)\r
+                mguid = m.StrPcdSet[0][4]\r
+            for (PCName,TCName) in m.StrPcdOverallValue:\r
+                Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)]\r
+                ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo\r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             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
+                elif GlobalData.gGuidPattern.match(str_pcd_data[4]):\r
+                    str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), 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
+                    PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName))\r
+                    for module_guid in PcdComponentValue:\r
+                        str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid]\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
             if isinstance(self._DecPcds[Pcd], StructurePcd):\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 isinstance(self._DecPcds[Pcd], StructurePcd):\r
@@ -1392,7 +1550,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
@@ -1405,9 +1564,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
@@ -1425,11 +1587,14 @@ 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
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
+\r
+        # Create a tool to caculate structure pcd value\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
+\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
                 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
         if Str_Pcd_Values:\r
             for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
                 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
@@ -1447,6 +1612,14 @@ class DscBuildData(PlatformBuildClassObject):
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                     if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
                         str_pcd_obj.DefaultValue = PcdValue\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                     if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
                         str_pcd_obj.DefaultValue = PcdValue\r
+                    else:\r
+                        #Module Scope Structure Pcd\r
+                        moduleguid = skuname.replace("S","-")\r
+                        if GlobalData.gGuidPattern.match(moduleguid):\r
+                            for component in self.Modules.values():\r
+                                if component.Guid == moduleguid:\r
+                                    component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue\r
+\r
                 else:\r
                     if skuname not in str_pcd_obj.SkuInfoList:\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
                 else:\r
                     if skuname not in str_pcd_obj.SkuInfoList:\r
                         nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
@@ -1472,8 +1645,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
@@ -1483,8 +1657,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
@@ -1500,8 +1695,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
@@ -1512,11 +1707,11 @@ 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
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
             if Setting is None:\r
                 continue\r
@@ -1529,20 +1724,21 @@ class DscBuildData(PlatformBuildClassObject):
                     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
                     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
-                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
@@ -1556,13 +1752,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
@@ -1574,7 +1776,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
@@ -1591,7 +1796,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(errors='ignore'), Result[1].decode(errors='ignore')\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
 \r
     @staticmethod\r
     def IntToCString(Value, ValueSize):\r
@@ -1606,12 +1811,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
@@ -1619,53 +1859,58 @@ 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
         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
+            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
             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
@@ -1673,23 +1918,24 @@ 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.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[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.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[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.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[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.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
             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
                 while '[' in FieldName:\r
                     FieldName = FieldName.rsplit('[', 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("."), ArrayIndex + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][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
@@ -1697,35 +1943,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
@@ -1734,19 +2070,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
@@ -1758,20 +2113,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
@@ -1780,56 +2141,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
@@ -1846,14 +2284,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
@@ -1864,7 +2306,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
@@ -1873,7 +2315,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
@@ -1892,7 +2334,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
@@ -1911,10 +2353,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
@@ -1922,13 +2368,82 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
+    def GenerateModuleScopeValue(self, Pcd):\r
+        CApp = "// Value in Dsc Module scope \n"\r
+        for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+\r
+            CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType)\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None))\r
+\r
+            if pcddefaultvalue:\r
+                IsArray = _IsFieldValueAnArray(pcddefaultvalue)\r
+                if IsArray:\r
+                    try:\r
+                        FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True)\r
+                    except BadExpression:\r
+                        EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" %\r
+                                        (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList))\r
+                Value, ValueSize = ParseFieldValue (FieldList)\r
+\r
+                if isinstance(Value, str):\r
+                    CApp = CApp + '  Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo)\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    CApp = CApp + '  Value     = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo)\r
+                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+\r
+            PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid)\r
+            for index in PcdFiledValue:\r
+                FieldList = PcdFiledValue[index]\r
+                if not FieldList:\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 %d 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 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
     @staticmethod\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.DatumType)\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
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -1937,7 +2452,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
@@ -1956,7 +2471,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
@@ -1975,10 +2490,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
@@ -1991,10 +2510,91 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = '  Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
         CApp = '  Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    @staticmethod\r
+    def GenerateModuleValueStatement(module_guid, Pcd):\r
+        CApp = "  Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid)\r
+        return CApp\r
+    def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd,  InitByteValue, CApp):\r
+        for module_guid in Pcd.PcdFiledValueFromDscComponent:\r
+            CApp = CApp + 'void\n'\r
+            CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  void\n'\r
+            CApp = CApp + '  )\n'\r
+            CApp = CApp + '{\n'\r
+            CApp = CApp + '  UINT32  Size;\n'\r
+            CApp = CApp + '  UINT32  FieldSize;\n'\r
+            CApp = CApp + '  CHAR8   *Value;\n'\r
+            CApp = CApp + '  UINT32  OriginalSize;\n'\r
+            CApp = CApp + '  VOID    *OriginalPcd;\n'\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '\n'\r
+\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
+            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+            #\r
+            # Get current PCD value and size\r
+            #\r
+            CApp = CApp + '  OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Determine the size of the PCD.  For simple structures, sizeof(TYPE) provides\r
+            # the correct value.  For structures with a flexible array member, the flexible\r
+            # array member is detected, and the size is based on the highest index used with\r
+            # the flexible array member.  The flexible array member must be the last field\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,SkuName,TAB_DEFAULT_STORES_DEFAULT)\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
+            # Must handle cases where current value is smaller, larger, or same size\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.BaseDatumType,)\r
+            CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
+\r
+            #\r
+            # Copy current PCD value into allocated buffer.\r
+            #\r
+            CApp = CApp + '  memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
+\r
+            #\r
+            # Assign field values in PCD\r
+            #\r
+            CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
+\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.GenerateModuleValueStatement(module_guid,Pcd)\r
+            CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
+            CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
+\r
+            #\r
+            # Set new PCD value and size\r
+            #\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+\r
+            #\r
+            # Free PCD\r
+            #\r
+            CApp = CApp + '  free (Pcd);\n'\r
+            CApp = CApp + '}\n'\r
+            CApp = CApp + '\n'\r
+        return InitByteValue,CApp\r
+\r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\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
@@ -2006,14 +2606,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
@@ -2030,7 +2628,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
@@ -2038,7 +2639,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
@@ -2067,7 +2668,7 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Set new PCD value and size\r
             #\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
@@ -2077,6 +2678,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
@@ -2095,13 +2757,25 @@ 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 PcdName in StructuredPcds:\r
+        for Pcd in StructuredPcds.values():\r
+            CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
+        for PcdName in sorted(StructuredPcds.keys()):\r
             Pcd = StructuredPcds[PcdName]\r
             Pcd = StructuredPcds[PcdName]\r
+\r
+            #create void void Cal_tocken_cname_Size functions\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
+\r
+            #create void Assign_ functions\r
+\r
+            # From DEC\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+            # From Fdf\r
             CApp = CApp + self.GenerateFdfValue(Pcd)\r
             CApp = CApp + self.GenerateFdfValue(Pcd)\r
+            # From CommandLine\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
+\r
+            # From Dsc Global setting\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
@@ -2110,9 +2784,15 @@ 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
+\r
+            # From Dsc module scope setting\r
+            CApp = CApp + self.GenerateModuleScopeValue(Pcd)\r
+\r
+            #create Initialize_ functions\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
                         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
+                InitByteValue, CApp =  self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in Pcd.SkuOverrideValues:\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in Pcd.SkuOverrideValues:\r
@@ -2127,11 +2807,13 @@ 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
                 CApp = CApp + '  Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+                for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
+                    CApp += "  Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\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
@@ -2144,16 +2826,17 @@ class DscBuildData(PlatformBuildClassObject):
         CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
         SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
 \r
         CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
         SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
 \r
+        # start generating makefile\r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\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 %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + '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
-                      'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
+            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \\r
+                      'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +='\r
 \r
         IncSearchList = []\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
@@ -2176,6 +2859,22 @@ class DscBuildData(PlatformBuildClassObject):
             for pkg in PcdDependDEC:\r
                 if pkg in PlatformInc:\r
                     for inc in PlatformInc[pkg]:\r
             for pkg in PcdDependDEC:\r
                 if pkg in PlatformInc:\r
                     for inc in PlatformInc[pkg]:\r
+                        #\r
+                        # Get list of files in potential -I include path\r
+                        #\r
+                        FileList = os.listdir (str(inc))\r
+                        #\r
+                        # Skip -I include path if one of the include files required\r
+                        # by PcdValueInit.c are present in the include paths from\r
+                        # the DEC file.  PcdValueInit.c must use the standard include\r
+                        # files from the host compiler.\r
+                        #\r
+                        if 'stdio.h' in FileList:\r
+                          continue\r
+                        if 'stdlib.h' in FileList:\r
+                          continue\r
+                        if 'string.h' in FileList:\r
+                          continue\r
                         MakeApp += '-I'  + str(inc) + ' '\r
                         IncSearchList.append(inc)\r
         MakeApp = MakeApp + '\n'\r
                         MakeApp += '-I'  + str(inc) + ' '\r
                         IncSearchList.append(inc)\r
         MakeApp = MakeApp + '\n'\r
@@ -2183,7 +2882,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
@@ -2193,38 +2892,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
@@ -2234,26 +2931,36 @@ class DscBuildData(PlatformBuildClassObject):
                     IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
                     break\r
         SearchPathList = []\r
                     IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
                     break\r
         SearchPathList = []\r
-        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Include")))\r
-        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Common")))\r
+        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Include")))\r
+        SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Common")))\r
         SearchPathList.extend(str(item) for item in IncSearchList)\r
         IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
         for include_file in IncFileList:\r
             MakeApp += "$(OBJECTS) : %s\n" % include_file\r
         SearchPathList.extend(str(item) for item in IncSearchList)\r
         IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
         for include_file in IncFileList:\r
             MakeApp += "$(OBJECTS) : %s\n" % include_file\r
+        if sys.platform == "win32":\r
+            PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source\C\Common\PcdValueCommon.c"))\r
+            MakeApp = MakeApp + '%s\PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
+            MakeApp = MakeApp + '\tcopy /y %s $@\n' % (PcdValueCommonPath)\r
+        else:\r
+            PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source/C/Common/PcdValueCommon.c"))\r
+            MakeApp = MakeApp + '%s/PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
+            MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % (PcdValueCommonPath, self.OutputPath)\r
         MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
         MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
         SaveFileOnChange(MakeFileName, MakeApp, False)\r
 \r
         MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
         MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
         SaveFileOnChange(MakeFileName, MakeApp, False)\r
 \r
+        # start generating input file\r
         InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
 \r
         InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\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
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
 \r
 \r
+        #start building the structure pcd value tool\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
@@ -2263,6 +2970,8 @@ 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
+        EdkLogger.verbose ('%s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         if returncode != 0:\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         if returncode != 0:\r
@@ -2272,14 +2981,21 @@ class DscBuildData(PlatformBuildClassObject):
             File.close()\r
             for Message in Messages:\r
                 if " error" in Message or "warning" in Message:\r
             File.close()\r
             for Message in Messages:\r
                 if " error" in Message or "warning" in Message:\r
-                    FileInfo = Message.strip().split('(')\r
-                    if len (FileInfo) > 1:\r
-                        FileName = FileInfo [0]\r
-                        FileLine = FileInfo [1].split (')')[0]\r
-                    else:\r
-                        FileInfo = Message.strip().split(':')\r
-                        FileName = FileInfo [0]\r
-                        FileLine = FileInfo [1]\r
+                    try:\r
+                        FileInfo = Message.strip().split('(')\r
+                        if len (FileInfo) > 1:\r
+                            FileName = FileInfo [0]\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
+                    except:\r
+                        continue\r
+                    if "PcdValueInit.c" not in FileName:\r
+                        continue\r
                     if FileLine.isdigit():\r
                         error_line = FileData[int (FileLine) - 1]\r
                         if r"//" in error_line:\r
                     if FileLine.isdigit():\r
                         error_line = FileData[int (FileLine) - 1]\r
                         if r"//" in error_line:\r
@@ -2305,14 +3021,17 @@ class DscBuildData(PlatformBuildClassObject):
             if MessageGroup:\r
                 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
             else:\r
             if MessageGroup:\r
                 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
             else:\r
-                EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
+                EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
 \r
 \r
-        if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
-            Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
+        #start executing the structure pcd value tool\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
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
+            EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, StdErr))\r
             if returncode != 0:\r
             if returncode != 0:\r
-                EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
+                EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr))\r
 \r
 \r
+        #start update structure pcd final value\r
         File = open (OutputValueFile, 'r')\r
         FileBuffer = File.readlines()\r
         File.close()\r
         File = open (OutputValueFile, 'r')\r
         FileBuffer = File.readlines()\r
         File.close()\r
@@ -2361,7 +3080,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
@@ -2403,11 +3122,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
@@ -2424,7 +3149,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
@@ -2455,28 +3180,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
@@ -2492,7 +3203,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
@@ -2503,7 +3214,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
@@ -2517,12 +3228,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
@@ -2534,19 +3246,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 index,(PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4) in enumerate(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
@@ -2596,7 +3311,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
@@ -2604,17 +3319,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'] = index\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
@@ -2625,6 +3347,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
@@ -2654,7 +3377,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
@@ -2697,7 +3420,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
@@ -2743,12 +3466,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
@@ -2756,6 +3484,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
@@ -2765,8 +3494,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
@@ -2783,24 +3521,24 @@ 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
+        TargetObj = TargetTxtDict()\r
+        TargetTxt = TargetObj.Target\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
         BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
         if os.path.isfile(BuildConfigurationFile) == True:\r
-            TargetTxt      = TargetTxtClassObject()\r
-            TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
             ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
             if ToolDefinitionFile == '':\r
                 ToolDefinitionFile = "tools_def.txt"\r
                 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\r
             ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
             if ToolDefinitionFile == '':\r
                 ToolDefinitionFile = "tools_def.txt"\r
                 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\r
-                ToolDef        = ToolDefClassObject()\r
-                ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
-                ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
+                ToolDefObj = ToolDefDict((os.path.join(os.getenv("WORKSPACE"), "Conf")))\r
+                ToolDefinition = ToolDefObj.ToolDef.ToolsDefTxtDatabase\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
                 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
@@ -2818,6 +3556,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
@@ -2831,36 +3570,8 @@ class DscBuildData(PlatformBuildClassObject):
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
                     continue\r
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
+            if self.Packages:\r
+                PkgSet.update(self.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\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)\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