]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Fix dependency issue in PcdValueInit
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index ff41af13723435753a9e4764acd95878d8eef0d3..a599c5bb7688e0a63976fdd1a528a9dc9b9e305e 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,26 +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 TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.TargetTxtClassObject import TargetTxtDict,gDefaultTargetTxtFile\r
+from Common.ToolDefClassObject import ToolDefDict,gDefaultToolsDefFile\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,RemoveCComments\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
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 from collections import OrderedDict, defaultdict\r
-from .BuildClassObject import ArrayIndex\r
+\r
+def _IsFieldValueAnArray (Value):\r
+    Value = Value.strip()\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
+        return True\r
+    if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    if Value[0] == '{' and Value[-1] == '}':\r
+        return True\r
+    if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    return False\r
 \r
 PcdValueInitName = 'PcdValueInit'\r
 \r
 PcdValueInitName = 'PcdValueInit'\r
+PcdValueCommonName = 'PcdValueCommon'\r
 \r
 PcdMainCHeader = '''\r
 /**\r
 \r
 PcdMainCHeader = '''\r
 /**\r
@@ -81,15 +92,13 @@ 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
 AppTarget = '''\r
 all: $(APPFILE)\r
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
 AppTarget = '''\r
 all: $(APPFILE)\r
-$(APPFILE): $(OBJECTS)\r
+$(APPLICATION): $(OBJECTS)\r
+$(APPFILE): $(APPLICATION)\r
 %s\r
 '''\r
 \r
 %s\r
 '''\r
 \r
@@ -138,8 +147,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
@@ -165,20 +180,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
@@ -225,11 +226,10 @@ class DscBuildData(PlatformBuildClassObject):
         self._Toolchain = Toolchain\r
         self._ToolChainFamily = None\r
         self._Clear()\r
         self._Toolchain = Toolchain\r
         self._ToolChainFamily = None\r
         self._Clear()\r
-        self._HandleOverridePath()\r
         self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
         self.DefaultStores = None\r
         self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
         self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
         self.DefaultStores = None\r
         self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
-\r
+        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
@@ -284,24 +284,6 @@ class DscBuildData(PlatformBuildClassObject):
         self._MacroDict         = None\r
         self.DefaultStores      = None\r
 \r
         self._MacroDict         = None\r
         self.DefaultStores      = None\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
     @property\r
     def _Macros(self):\r
     ## Get current effective macros\r
     @property\r
     def _Macros(self):\r
@@ -316,10 +298,13 @@ class DscBuildData(PlatformBuildClassObject):
     @property\r
     def Arch(self):\r
         return self._Arch\r
     @property\r
     def Arch(self):\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
@@ -403,6 +388,10 @@ class DscBuildData(PlatformBuildClassObject):
                 for i in range(0, len(LanguageCodes), 3):\r
                     LanguageList.append(LanguageCodes[i:i + 3])\r
                 self._ISOLanguages = LanguageList\r
                 for i in range(0, len(LanguageCodes), 3):\r
                     LanguageList.append(LanguageCodes[i:i + 3])\r
                 self._ISOLanguages = LanguageList\r
+            elif Name == TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE:\r
+                if TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE not in gCommandLineDefines:\r
+                    gCommandLineDefines[TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE] = Record[2].strip()\r
+\r
             elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
                 #\r
                 # try to convert GUID to a real UUID value to see whether the GUID is format\r
             elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
                 #\r
                 # try to convert GUID to a real UUID value to see whether the GUID is format\r
@@ -413,6 +402,9 @@ 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
             elif Name in self:\r
                 self[Name] = Record[2]\r
         # set _Header to non-None in order to avoid database re-querying\r
@@ -706,18 +698,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
     @property\r
     def Modules(self):\r
         if self._Modules is not None:\r
             return self._Modules\r
     ## Retrieve [Components] section information\r
     @property\r
     def Modules(self):\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
         for Record in RecordList:\r
         self._Modules = OrderedDict()\r
         RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
         Macros = self._Macros\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
@@ -727,14 +748,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
@@ -755,7 +773,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
@@ -769,20 +787,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
@@ -793,15 +822,15 @@ 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
             self._Modules[ModuleFile] = Module\r
         return self._Modules\r
 \r
@@ -891,7 +920,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
-\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
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
             self._GuidDict.update(GlobalData.gPlatformPcds)\r
 \r
@@ -938,11 +968,16 @@ 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
+            GlobalData.gPlatformFinalPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
         return ValueList\r
 \r
     def _FilterPcdBySkuUsage(self, Pcds):\r
         return ValueList\r
 \r
     def _FilterPcdBySkuUsage(self, Pcds):\r
@@ -1066,13 +1101,10 @@ class DscBuildData(PlatformBuildClassObject):
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
         if GlobalData.BuildOptionPcd:\r
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \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 pcd in GlobalData.BuildOptionPcd:\r
                 (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
-                for BuildData in self._Bdb._CACHE_.values():\r
-                    if BuildData.Arch != self.Arch:\r
-                        continue\r
-                    if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
-                        continue\r
+                for 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
                     for key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
@@ -1102,7 +1134,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
@@ -1113,7 +1145,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
@@ -1125,7 +1157,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
@@ -1154,7 +1186,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
@@ -1215,7 +1247,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
@@ -1344,11 +1396,11 @@ class DscBuildData(PlatformBuildClassObject):
                                         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._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
-                        self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
-                        self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
+                        self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
+                        self._Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
                     if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
                                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
                     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
+                        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
@@ -1390,8 +1442,8 @@ 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
     def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
         return AllPcds\r
 \r
     def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
@@ -1456,7 +1508,15 @@ class DscBuildData(PlatformBuildClassObject):
                                 File=self.MetaFile, Line = Dummy5)\r
 \r
                 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
                                 File=self.MetaFile, Line = Dummy5)\r
 \r
                 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
-\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
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
         S_pcd_set = OrderedDict()\r
@@ -1474,6 +1534,11 @@ class DscBuildData(PlatformBuildClassObject):
             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
             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
             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
@@ -1490,9 +1555,9 @@ class DscBuildData(PlatformBuildClassObject):
                         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
                     S_pcd_set[Pcd] = str_pcd_obj_str\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
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
-        self.FilterStrcturePcd(S_pcd_set)\r
         if S_pcd_set:\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
@@ -1508,6 +1573,9 @@ class DscBuildData(PlatformBuildClassObject):
                     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
                     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 '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
@@ -1529,7 +1597,10 @@ class DscBuildData(PlatformBuildClassObject):
                             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
@@ -1547,6 +1618,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
@@ -1584,7 +1663,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[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
     @cached_property\r
     def PlatformUsedPcds(self):\r
         return Pcds\r
     @cached_property\r
     def PlatformUsedPcds(self):\r
@@ -1593,7 +1672,7 @@ class DscBuildData(PlatformBuildClassObject):
             FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
         FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
         AllModulePcds = set()\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(self._Modules.keys() + FdfModuleList)\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 ModuleSet:\r
             ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
             AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
@@ -1623,7 +1702,7 @@ class DscBuildData(PlatformBuildClassObject):
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
 \r
         PcdDict = tdict(True, 4)\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
 \r
         PcdDict = tdict(True, 4)\r
-        PcdSet = set()\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
@@ -1634,11 +1713,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 and "[" not in PcdCName:\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
@@ -1651,17 +1730,17 @@ 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
+                PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize,Dummy4)}\r
 \r
 \r
-        for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\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
             elif TAB_DEFAULT in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_DEFAULT]\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_DEFAULT]\r
             elif TAB_COMMON in PcdSetting:\r
             elif TAB_COMMON in PcdSetting:\r
-                PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_COMMON]\r
+                PcdValue, DatumType, MaxDatumSize,_  = PcdSetting[TAB_COMMON]\r
             else:\r
                 PcdValue = None\r
                 DatumType = None\r
             else:\r
                 PcdValue = None\r
                 DatumType = None\r
@@ -1683,7 +1762,9 @@ class DscBuildData(PlatformBuildClassObject):
                 Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
                 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                     Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\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].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
     @staticmethod\r
         return Pcds\r
 \r
     @staticmethod\r
@@ -1721,7 +1802,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
@@ -1736,30 +1817,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
-        if Pcd.IsArray():\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 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 and "{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
+                            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
                     else:\r
                         pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
-                        if pcddef and "{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
+                        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
             else:\r
                 pcddef = self.GetPcdDscRawDefaultValue(Pcd,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
-                if pcddef and "{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
+                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
         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
             FieldList = Pcd.DefaultValues[index]\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
@@ -1767,30 +1865,38 @@ 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
+        flexisbale_size_statement_cache = set()\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 index in Pcd.SkuOverrideValues[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 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
                     for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
                         if not FieldList:\r
                             continue\r
                         for FieldName in FieldList:\r
+                            fieldinfo = tuple(FieldList[FieldName])\r
+                            if fieldinfo in flexisbale_size_statement_cache:\r
+                                continue\r
+                            flexisbale_size_statement_cache.add(fieldinfo)\r
                             FieldName = "." + FieldName\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
@@ -1798,23 +1904,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('.'))), 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
         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
@@ -1822,23 +1929,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
@@ -1846,22 +1954,44 @@ 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 + '  __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
         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
     def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
 \r
     @staticmethod\r
     def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
@@ -1886,10 +2016,11 @@ class DscBuildData(PlatformBuildClassObject):
                 PcdDefValue = Pcd.DefaultValue\r
             if lastoneisEmpty:\r
                 if "{CODE(" not in PcdDefValue:\r
                 PcdDefValue = Pcd.DefaultValue\r
             if lastoneisEmpty:\r
                 if "{CODE(" not in PcdDefValue:\r
-                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))\r
-                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), "".join(r_datatype)))\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
                     sizeof = "sizeof(%s)" % Pcd.BaseDatumType\r
-                    CApp = '  Size = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\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
                 else:\r
                     CApp = "  Size = 0;\n"\r
             else:\r
@@ -1907,7 +2038,7 @@ class DscBuildData(PlatformBuildClassObject):
         if index:\r
             indicator = "(Pcd"\r
             if len(pcd_capacity)>2:\r
         if index:\r
             indicator = "(Pcd"\r
             if len(pcd_capacity)>2:\r
-                for i in xrange(0,len(index_elements)):\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
                     index_ele = index_elements[i]\r
                     index_num = index_ele.strip("[").strip("]").strip()\r
                     if i == len(index_elements) -2:\r
@@ -1939,8 +2070,9 @@ class DscBuildData(PlatformBuildClassObject):
         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 + "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 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
@@ -1949,23 +2081,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
-            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
-            if "{CODE(" in Pcd.DefaultValueFromDec:\r
-                CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\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
             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
+                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
         for index in Pcd.DefaultValues:\r
             FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
         for index in Pcd.DefaultValues:\r
             FieldList = Pcd.DefaultValues[index]\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
@@ -1979,18 +2126,16 @@ class DscBuildData(PlatformBuildClassObject):
                     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
 \r
                 indicator = self.GetIndicator(index, FieldName,Pcd)\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
 \r
                 indicator = self.GetIndicator(index, FieldName,Pcd)\r
-                if 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
-                elif IsArray:\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 + '  __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.DatumType, FieldName, ValueSize, Pcd.DatumType, 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
+                    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
                     CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
-\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
                     if '[' in FieldName and ']' in FieldName:\r
                         Index = int(FieldName.split('[')[1].split(']')[0])\r
                 else:\r
                     if '[' in FieldName and ']' in FieldName:\r
                         Index = int(FieldName.split('[')[1].split(']')[0])\r
@@ -2017,19 +2162,34 @@ class DscBuildData(PlatformBuildClassObject):
             pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
 \r
         return pcddefaultvalue\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
         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
     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.BaseDatumType)\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
+        dscfilepath,lineno = self.GetPcdDscRawValueInfo(Pcd, SkuName, DefaultStoreName)\r
+        if lineno:\r
+            valuefrom = "%s Line %s" % (dscfilepath,str(lineno))\r
+        else:\r
+            valuefrom = dscfilepath\r
 \r
         pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
         if pcddefaultvalue:\r
             FieldList = pcddefaultvalue\r
 \r
         pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
         if pcddefaultvalue:\r
             FieldList = pcddefaultvalue\r
-            IsArray = IsFieldValueAnArray(FieldList)\r
+            IsArray = _IsFieldValueAnArray(FieldList)\r
             if IsArray:\r
                 if "{CODE(" not in FieldList:\r
                     try:\r
             if IsArray:\r
                 if "{CODE(" not in FieldList:\r
                     try:\r
@@ -2042,33 +2202,71 @@ class DscBuildData(PlatformBuildClassObject):
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
                 if isinstance(Value, str):\r
                     if "{CODE(" in Value:\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
                 if isinstance(Value, str):\r
                     if "{CODE(" in Value:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\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
                 elif IsArray:\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
                 elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    if Pcd.IsArray() and "{CODE(" in pcddefaultvalue:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\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
                     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
+                        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
             else:\r
                 if isinstance(Value, str):\r
                     if "{CODE(" in Value:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\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
                 elif IsArray:\r
                     else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                 elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    if Pcd.IsArray() and "{CODE(" in pcddefaultvalue:\r
-                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\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
                     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
+                        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
 \r
         inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
         if not inheritvalue:\r
@@ -2080,7 +2278,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
                     indicator = self.GetIndicator(index, FieldName,Pcd)\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
                     indicator = self.GetIndicator(index, FieldName,Pcd)\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
@@ -2099,8 +2297,7 @@ class DscBuildData(PlatformBuildClassObject):
                     #\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
                     #\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.DatumType, FieldName, ValueSize, Pcd.DatumType, 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
+                        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
                         if '[' in FieldName and ']' in FieldName:\r
                         CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
                     else:\r
                         if '[' in FieldName and ']' in FieldName:\r
@@ -2129,7 +2326,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
@@ -2148,7 +2345,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
@@ -2169,7 +2366,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\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
                 #\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.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, 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
                     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
@@ -2182,6 +2379,75 @@ 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
     @staticmethod\r
     def GenerateCommandLineValueStatement(Pcd):\r
         CApp = '  Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
@@ -2197,7 +2463,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
@@ -2216,7 +2482,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
@@ -2237,7 +2503,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\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
                 #\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.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, 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
                     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
@@ -2255,6 +2521,85 @@ 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
         OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
         OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
@@ -2295,6 +2640,9 @@ class DscBuildData(PlatformBuildClassObject):
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
             CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,DefaultStoreName)\r
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\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
@@ -2345,8 +2693,6 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = ""\r
         if not Pcd:\r
             return CApp\r
         CApp = ""\r
         if not Pcd:\r
             return CApp\r
-        if not Pcd.IsArray():\r
-            return CApp\r
         Demesion = ""\r
         for d in Pcd.Capacity:\r
             Demesion += "[]"\r
         Demesion = ""\r
         for d in Pcd.Capacity:\r
             Demesion += "[]"\r
@@ -2363,7 +2709,7 @@ class DscBuildData(PlatformBuildClassObject):
                     for defaultstore in skuinfo.DefaultStoreDict:\r
                         pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, defaultstore)\r
                         if pcddscrawdefaultvalue:\r
                     for defaultstore in skuinfo.DefaultStoreDict:\r
                         pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, defaultstore)\r
                         if pcddscrawdefaultvalue:\r
-                            Value = skuinfo[defaultstore]\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
                             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
@@ -2424,12 +2770,22 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = CApp + '\n'\r
         for Pcd in StructuredPcds.values():\r
             CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
         CApp = CApp + '\n'\r
         for Pcd in StructuredPcds.values():\r
             CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
-        for PcdName in StructuredPcds:\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
+\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
             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
@@ -2439,9 +2795,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
+\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
             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
+                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
@@ -2458,6 +2820,8 @@ class DscBuildData(PlatformBuildClassObject):
         for Pcd in StructuredPcds.values():\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
         for Pcd in StructuredPcds.values():\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
+                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
                     if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
             else:\r
                 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
                     if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
@@ -2473,13 +2837,14 @@ 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 + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + '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 + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
-                      'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
+            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
         PlatformInc = OrderedDict()\r
 \r
         IncSearchList = []\r
         PlatformInc = OrderedDict()\r
@@ -2505,6 +2870,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
@@ -2538,11 +2919,12 @@ class DscBuildData(PlatformBuildClassObject):
         if BuildOptions:\r
             ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
             if len(ArchBuildOptions.keys()) == 1:\r
         if BuildOptions:\r
             ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
             if len(ArchBuildOptions.keys()) == 1:\r
-                BuildOptions['COMMON'] |= (ArchBuildOptions.values()[0])\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
             elif len(ArchBuildOptions.keys()) > 1:\r
                 CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
                 BuildOptions['COMMON'] |= CommonBuildOptions\r
-            ValueList = list(BuildOptions['COMMON'])\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
             CC_FLAGS += " ".join(ValueList)\r
         MakeApp += CC_FLAGS\r
 \r
@@ -2560,16 +2942,25 @@ 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
         InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
@@ -2579,6 +2970,8 @@ class DscBuildData(PlatformBuildClassObject):
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
             Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\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
@@ -2589,6 +2982,7 @@ class DscBuildData(PlatformBuildClassObject):
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
 \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
@@ -2598,16 +2992,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
-                        if len(FileInfo) < 2:\r
-                            continue\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
@@ -2633,14 +3032,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
+        #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
         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
+            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%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
@@ -2689,7 +3091,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 and "[" not in PcdCName:\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
@@ -2738,7 +3140,9 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\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].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
 \r
         for pcd in Pcds.values():\r
             pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
@@ -2756,7 +3160,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
@@ -2821,7 +3225,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
@@ -2841,7 +3245,7 @@ class DscBuildData(PlatformBuildClassObject):
         # PCD settings for certain ARCH and SKU\r
         #\r
         PcdDict = tdict(True, 5)\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
@@ -2862,13 +3266,13 @@ class DscBuildData(PlatformBuildClassObject):
             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 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 and "[" not in PcdCName:\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
@@ -2937,12 +3341,13 @@ class DscBuildData(PlatformBuildClassObject):
                     PcdClassObj.UserDefinedDefaultStoresFlag = True\r
                 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
 \r
                     PcdClassObj.UserDefinedDefaultStoresFlag = True\r
                 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
 \r
-                Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = int(Dummy4)\r
+                Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = index\r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[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][DefaultStore] = DefaultValue\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
@@ -2953,6 +3358,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
@@ -2982,7 +3388,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
@@ -3025,7 +3431,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 and "[" not in PcdCName:\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
@@ -3078,9 +3484,10 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\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].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
@@ -3088,6 +3495,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
@@ -3107,7 +3515,7 @@ class DscBuildData(PlatformBuildClassObject):
                 for sku in pcd.SkuInfoList.values():\r
                     sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
 \r
                 for sku in pcd.SkuInfoList.values():\r
                     sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\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
@@ -3127,18 +3535,16 @@ class DscBuildData(PlatformBuildClassObject):
     @property\r
     def ToolChainFamily(self):\r
         self._ToolChainFamily = TAB_COMPILER_MSFT\r
     @property\r
     def ToolChainFamily(self):\r
         self._ToolChainFamily = TAB_COMPILER_MSFT\r
-        BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
+        TargetObj = TargetTxtDict()\r
+        TargetTxt = TargetObj.Target\r
+        BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, gDefaultTargetTxtFile))\r
         if os.path.isfile(BuildConfigurationFile) == True:\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 = 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
+                ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', gDefaultToolsDefFile))\r
             if os.path.isfile(ToolDefinitionFile) == True:\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
@@ -3174,6 +3580,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._GuidDict.update(GlobalData.gPlatformPcds)\r
         return self._DecPcds\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