]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 9f99aeaa21d706e9aaf4ebbe79264d59586143e2..1fd1639ab6dd32ff5003e7f9f2cfacde8a2fb1cd 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to create a database used by build tool\r
 #\r
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 #  This class is used to retrieve information stored in database and convert them\r
 # into PlatformBuildClassObject form for easier use for AutoGen.\r
 #\r
+from __future__ import print_function\r
+from __future__ import absolute_import\r
 from Common.StringUtils import *\r
 from Common.DataType import *\r
 from Common.Misc import *\r
 from types import *\r
 from Common.Expression import *\r
 from CommonDataClass.CommonClass import SkuInfoClass\r
-from Common.TargetTxtClassObject import *\r
-from Common.ToolDefClassObject import *\r
+from Common.TargetTxtClassObject import TargetTxtClassObject\r
+from Common.ToolDefClassObject import ToolDefClassObject\r
 from .MetaDataTable import *\r
 from .MetaFileTable import *\r
 from .MetaFileParser import *\r
 \r
 from .WorkspaceCommon import GetDeclaredPcd\r
 from Common.Misc import AnalyzeDscPcd\r
-from Common.Misc import ProcessDuplicatedInf\r
+from Common.Misc import ProcessDuplicatedInf,RemoveCComments\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 .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
@@ -84,6 +104,12 @@ LIBS = $(LIB_PATH)\Common.lib
 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
 '''\r
 \r
+AppTarget = '''\r
+all: $(APPFILE)\r
+$(APPFILE): $(OBJECTS)\r
+%s\r
+'''\r
+\r
 PcdGccMakefile = '''\r
 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
 LIBS = -lCommon\r
@@ -130,11 +156,11 @@ def GetDependencyList(FileStack, SearchPathList):
                 continue\r
 \r
             if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
-                FileContent = str(FileContent, "utf-16")\r
+                FileContent = FileContent.decode('utf-16')\r
                 IncludedFileList = gIncludePattern.findall(FileContent)\r
             else:\r
                 try:\r
-                    FileContent = str(FileContent, "utf-8")\r
+                    FileContent = str(FileContent)\r
                     IncludedFileList = gIncludePattern.findall(FileContent)\r
                 except:\r
                     pass\r
@@ -317,7 +343,7 @@ class DscBuildData(PlatformBuildClassObject):
 \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
@@ -704,19 +730,29 @@ class DscBuildData(PlatformBuildClassObject):
             GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
         return self.DefaultStores\r
 \r
+    def OverrideDuplicateModule(self):\r
+        RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
+        Macros = self._Macros\r
+        Components = {}\r
+        for Record in RecordList:\r
+            ModuleId = Record[6]\r
+            file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
+            file_guid_str = file_guid[0][2] if file_guid else "NULL"\r
+            ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
+            if self._Arch != TAB_ARCH_COMMON and (file_guid_str,str(ModuleFile)) in Components:\r
+                self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
+            Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
+        self._RawData._PostProcessed = False\r
     ## Retrieve [Components] section information\r
     @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
-        Macros["EDK_SOURCE"] = GlobalData.gEcpSource\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
@@ -726,10 +762,6 @@ class DscBuildData(PlatformBuildClassObject):
             if ErrorCode != 0:\r
                 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
                                 ExtraData=ErrorInfo)\r
-            # Check duplication\r
-            # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
-            if self._Arch != TAB_ARCH_COMMON and ModuleFile in self._Modules:\r
-                DuplicatedFile = True\r
 \r
             Module = ModuleBuildClassObject()\r
             Module.MetaFile = ModuleFile\r
@@ -792,8 +824,6 @@ class DscBuildData(PlatformBuildClassObject):
                     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
@@ -856,8 +886,6 @@ class DscBuildData(PlatformBuildClassObject):
                         continue\r
                     self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
 \r
-            # for Edk style library instances, which are listed in different section\r
-            Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
             for Record in RecordList:\r
                 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
@@ -879,7 +907,7 @@ class DscBuildData(PlatformBuildClassObject):
         return self._LibraryClasses\r
 \r
     def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
-        if self._DecPcds is None:\r
+        if not self._DecPcds:\r
 \r
             FdfInfList = []\r
             if GlobalData.gFdfParser:\r
@@ -911,25 +939,26 @@ class DscBuildData(PlatformBuildClassObject):
                                 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
         if ValueList[Index]:\r
             DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
-            try:\r
-                ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
-            except BadExpression as Value:\r
-                EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
-                                TokenSpaceGuid, PcdCName, ValueList[Index]))\r
-            except EvaluationException as Excpt:\r
-                if hasattr(Excpt, 'Pcd'):\r
-                    if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
-                                        " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
-                                        " of the DSC file" % Excpt.Pcd,\r
-                                        File=self.MetaFile, Line=LineNo)\r
+            if "{CODE(" not in ValueList[Index]:\r
+                try:\r
+                    ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
+                except BadExpression as Value:\r
+                    EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
+                                    TokenSpaceGuid, PcdCName, ValueList[Index]))\r
+                except EvaluationException as Excpt:\r
+                    if hasattr(Excpt, 'Pcd'):\r
+                        if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+                                            " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+                                            " of the DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
+                        else:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
                     else:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
                                         File=self.MetaFile, Line=LineNo)\r
-                else:\r
-                    EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
-                                    File=self.MetaFile, Line=LineNo)\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
@@ -971,7 +1000,7 @@ class DscBuildData(PlatformBuildClassObject):
                 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
                     PcdDefaultStoreSet = set(defaultstorename  for defaultstorename in skuobj.DefaultStoreDict)\r
                     mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
-                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                    skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = skuobj.DefaultStoreDict[mindefaultstorename]\r
         return Pcds\r
 \r
     def RecoverCommandLinePcd(self):\r
@@ -1065,13 +1094,19 @@ class DscBuildData(PlatformBuildClassObject):
                         EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
                 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
 \r
+        if GlobalData.BuildOptionPcd:\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 key in BuildData.Pcds:\r
                         PcdItem = BuildData.Pcds[key]\r
                         if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
                             PcdItem.DefaultValue = pcdvalue\r
+                            PcdItem.PcdValueFromComm = pcdvalue\r
         #In command line, the latter full assign value in commandLine should override the former field assign value.\r
         #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
         delete_assign = []\r
@@ -1096,7 +1131,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
@@ -1107,7 +1142,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
-            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
@@ -1119,7 +1154,7 @@ class DscBuildData(PlatformBuildClassObject):
                                 (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
@@ -1137,6 +1172,8 @@ class DscBuildData(PlatformBuildClassObject):
             if not FieldName:\r
                 if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
                     PcdValue = '"' + PcdValue + '"'\r
+                elif not PcdValue.isdigit() and not PcdValue.upper().startswith('0X'):\r
+                    PcdValue = '"' + PcdValue + '"'\r
             else:\r
                 IsArray = False\r
                 Base = 10\r
@@ -1146,7 +1183,7 @@ class DscBuildData(PlatformBuildClassObject):
                     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
@@ -1386,6 +1423,26 @@ class DscBuildData(PlatformBuildClassObject):
                         self.Pcds[Name, Guid].DefaultValue = Value\r
         return AllPcds\r
 \r
+    def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
+        TokenSpaceCName = PcdCName = DimensionAttr = Field = ""\r
+        if "." in NamePart1:\r
+            TokenSpaceCName, TempPcdCName = NamePart1.split(".")\r
+            if "[" in TempPcdCName:\r
+                PcdCName = TempPcdCName[:TempPcdCName.index("[")]\r
+                DimensionAttr = TempPcdCName[TempPcdCName.index("["):]\r
+            else:\r
+                PcdCName = TempPcdCName\r
+            Field = NamePart2\r
+        else:\r
+            TokenSpaceCName = NamePart1\r
+            if "[" in NamePart2:\r
+                PcdCName = NamePart2[:NamePart2.index("[")]\r
+                DimensionAttr = NamePart2[NamePart2.index("["):]\r
+            else:\r
+                PcdCName = NamePart2\r
+\r
+        return TokenSpaceCName,PcdCName,DimensionAttr,Field\r
+\r
     def UpdateStructuredPcds(self, TypeList, AllPcds):\r
 \r
         DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
@@ -1398,7 +1455,9 @@ class DscBuildData(PlatformBuildClassObject):
         Pcds = AllPcds\r
         DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
         SkuIds = self.SkuIds\r
+        self.SkuIdMgr.AvailableSkuIdSet.update({TAB_DEFAULT:0})\r
         DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
+        DefaultStores.add(TAB_DEFAULT_STORES_DEFAULT)\r
 \r
         S_PcdSet = []\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -1413,9 +1472,19 @@ class DscBuildData(PlatformBuildClassObject):
             SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
             if SkuName not in SkuIds:\r
                 continue\r
+            TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+            pcd_in_dec = self._DecPcds.get((PCName,TCName), None)\r
+            if pcd_in_dec is None:\r
+                EdkLogger.error('build', PARSER_ERROR,\r
+                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                            File=self.MetaFile, Line = Dummy5)\r
+            if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                if not isinstance (pcd_in_dec, StructurePcd):\r
+                    EdkLogger.error('build', PARSER_ERROR,\r
+                                "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                                File=self.MetaFile, Line = Dummy5)\r
 \r
-            if SkuName in SkuIds and "." in TokenSpaceGuid:\r
-                S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
 \r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
@@ -1423,27 +1492,19 @@ class DscBuildData(PlatformBuildClassObject):
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
-            if not isinstance (str_pcd_dec, StructurePcd):\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
-            if str_pcd_dec:\r
-                str_pcd_obj_str = StructurePcd()\r
-                str_pcd_obj_str.copy(str_pcd_dec)\r
-                if str_pcd_obj:\r
-                    str_pcd_obj_str.copy(str_pcd_obj)\r
-                    if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                    else:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                for str_pcd_data in StrPcdSet[str_pcd]:\r
-                    if str_pcd_data[3] in SkuIds:\r
-                        str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])\r
-                S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
-            else:\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
+            str_pcd_obj_str = StructurePcd()\r
+            str_pcd_obj_str.copy(str_pcd_dec)\r
+            if str_pcd_obj:\r
+                str_pcd_obj_str.copy(str_pcd_obj)\r
+                if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                else:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+            for str_pcd_data in StrPcdSet[str_pcd]:\r
+                if str_pcd_data[4] in SkuIds:\r
+                    str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+            S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
+\r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
         for Pcd in self.DecPcds:\r
             if isinstance(self._DecPcds[Pcd], StructurePcd):\r
@@ -1459,7 +1520,8 @@ class DscBuildData(PlatformBuildClassObject):
                             str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
                     S_pcd_set[Pcd] = str_pcd_obj_str\r
         if S_pcd_set:\r
-            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
@@ -1492,7 +1554,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
                     for defaultstoreid in DefaultStores:\r
                         if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
-                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
+                            stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
                             stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
         S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
         S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
@@ -1539,7 +1601,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
             for str_pcd_obj in S_pcd_set.values():\r
 \r
-                str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
+                str_pcd_obj.MaxDatumSize = DscBuildData.GetStructurePcdMaxSize(str_pcd_obj)\r
                 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
                 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True\r
 \r
@@ -1551,8 +1613,29 @@ class DscBuildData(PlatformBuildClassObject):
                 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
+        FdfInfList = []\r
+        if GlobalData.gFdfParser:\r
+            FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
+        FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
+        AllModulePcds = set()\r
+        ModuleSet = set(list(self._Modules.keys()) + FdfModuleList)\r
+        for ModuleFile in ModuleSet:\r
+            ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
+            AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
+        for ModuleFile in self.LibraryInstances:\r
+            ModuleData = self._Bdb.CreateBuildObject(ModuleFile, self._Arch, self._Target, self._Toolchain)\r
+            AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
+        return AllModulePcds\r
+\r
+    #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.\r
+    def FilterStrcturePcd(self, S_pcd_set):\r
+        UnusedStruPcds = set(S_pcd_set.keys()) - self.PlatformUsedPcds\r
+        for (Token, TokenSpaceGuid) in UnusedStruPcds:\r
+            del S_pcd_set[(Token, TokenSpaceGuid)]\r
 \r
     ## Retrieve non-dynamic PCD settings\r
     #\r
@@ -1568,7 +1651,7 @@ class DscBuildData(PlatformBuildClassObject):
         #\r
         AvailableSkuIdSet = copy.copy(self.SkuIds)\r
 \r
-        PcdDict = tdict(True, 3)\r
+        PcdDict = tdict(True, 4)\r
         PcdSet = set()\r
         # Find out all possible PCD candidates for self._Arch\r
         RecordList = self._RawData[Type, self._Arch]\r
@@ -1580,7 +1663,7 @@ 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
-                if "." not in TokenSpaceGuid:\r
+                if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                     PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
                 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
 \r
@@ -1625,15 +1708,17 @@ class DscBuildData(PlatformBuildClassObject):
                                                 False,\r
                                                 None,\r
                                                 IsDsc=True)\r
-\r
-            if self.SkuIdMgr.SystemSkuId not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
-                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
-            Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
+            for SkuName in PcdValueDict[PcdCName, TokenSpaceGuid]:\r
+                Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
+                if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
+                    Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
+                Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
         return Pcds\r
 \r
-    def GetStructurePcdMaxSize(self, str_pcd):\r
+    @staticmethod\r
+    def GetStructurePcdMaxSize(str_pcd):\r
         pcd_default_value = str_pcd.DefaultValue\r
-        sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
+        sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
         sku_values.append(pcd_default_value)\r
 \r
         def get_length(value):\r
@@ -1645,7 +1730,10 @@ class DscBuildData(PlatformBuildClassObject):
                     return len(Value[2:-1])\r
                 if Value[0] == '"' and Value[-1] == '"':\r
                     return len(Value) - 2\r
-                if Value[0] == '{' and Value[-1] == '}':\r
+                if Value.strip().startswith("{CODE("):\r
+                    tmpValue = RemoveCComments(Value)\r
+                    return len(tmpValue.split(","))\r
+                if (Value[0] == '{' and Value[-1] == '}'):\r
                     return len(Value.split(","))\r
                 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
                     return  len(list(Value[2:-1]))\r
@@ -1677,12 +1765,30 @@ 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
-        for FieldList in [Pcd.DefaultValues]:\r
+        if Pcd.IsArray():\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
+                    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
+            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
+        for index in Pcd.DefaultValues:\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
@@ -1690,7 +1796,8 @@ 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
-                    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
@@ -1699,7 +1806,7 @@ class DscBuildData(PlatformBuildClassObject):
                         ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\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
                         CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         for skuname in Pcd.SkuOverrideValues:\r
@@ -1707,36 +1814,38 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
             for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
-                for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
-                    if not FieldList:\r
-                        continue\r
-                    for FieldName in FieldList:\r
-                        FieldName = "." + FieldName\r
-                        IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
-                        if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
-                            try:\r
-                                Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
-                            except BadExpression:\r
-                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                                (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
-                            Value, ValueSize = ParseFieldValue(Value)\r
-                            CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
-                        else:\r
-                            NewFieldName = ''\r
-                            FieldName_ori = FieldName.strip('.')\r
-                            while '[' in  FieldName:\r
-                                NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                                ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
-                                FieldName = FieldName.split(']', 1)[1]\r
-                            FieldName = NewFieldName + FieldName\r
-                            while '[' in FieldName:\r
-                                FieldName = FieldName.rsplit('[', 1)[0]\r
-                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+                for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
+                    for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
+                        if not FieldList:\r
+                            continue\r
+                        for FieldName in FieldList:\r
+                            FieldName = "." + FieldName\r
+                            IsArray = _IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                            if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
+                                try:\r
+                                    Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
+                                except BadExpression:\r
+                                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                                    (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
+                                Value, ValueSize = ParseFieldValue(Value)\r
+                                if not Pcd.IsArray:\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                            else:\r
+                                NewFieldName = ''\r
+                                FieldName_ori = FieldName.strip('.')\r
+                                while '[' in  FieldName:\r
+                                    NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+                                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                                    FieldName = FieldName.split(']', 1)[1]\r
+                                FieldName = NewFieldName + FieldName\r
+                                while '[' in FieldName and not Pcd.IsArray:\r
+                                    FieldName = FieldName.rsplit('[', 1)[0]\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         if Pcd.PcdFieldValueFromFdf:\r
             CApp = CApp + "// From fdf \n"\r
         for FieldName in Pcd.PcdFieldValueFromFdf:\r
             FieldName = "." + FieldName\r
-            IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
+            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
@@ -1744,7 +1853,8 @@ 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
-                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
@@ -1760,7 +1870,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
@@ -1768,7 +1878,8 @@ 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
-                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
@@ -1777,26 +1888,93 @@ class DscBuildData(PlatformBuildClassObject):
                     ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\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
                     CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
-        CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+        if Pcd.GetPcdMaxSize():\r
+            CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
     @staticmethod\r
-    def GenerateSizeStatments(Pcd):\r
-        CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+    def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
+        if Pcd.IsArray():\r
+            r_datatype = [Pcd.BaseDatumType]\r
+            lastoneisEmpty = False\r
+            for dem in Pcd.Capacity:\r
+                if lastoneisEmpty:\r
+                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s.  " %\r
+                                        (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName))))\r
+                if dem == '0' or dem == "-1":\r
+                    r_datatype.append("[1]")\r
+                    lastoneisEmpty = True\r
+                else:\r
+                    r_datatype.append("[" + dem + "]")\r
+\r
+            if Pcd.Type in [MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_HII]:\r
+                PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultStoreDict.get(defaultstorename)\r
+            elif Pcd.Type in [MODEL_PCD_DYNAMIC_EX_DEFAULT,MODEL_PCD_DYNAMIC_VPD,MODEL_PCD_DYNAMIC_DEFAULT,MODEL_PCD_DYNAMIC_EX_VPD]:\r
+                PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultValue\r
+            else:\r
+                PcdDefValue = Pcd.DefaultValue\r
+            if lastoneisEmpty:\r
+                if "{CODE(" not in PcdDefValue:\r
+                    sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+                    sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
+                    sizeof = "sizeof(%s)" % Pcd.BaseDatumType\r
+                    CApp = '  int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\r
+                    CApp += '  Size = ArraySize * sizeof(%s); \n' % Pcd.BaseDatumType\r
+                else:\r
+                    CApp = "  Size = 0;\n"\r
+            else:\r
+                CApp = '  Size = sizeof(%s);\n' % ("".join(r_datatype) )\r
+        else:\r
+            CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
         CApp = CApp + '  Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    def GetIndicator(self,index,FieldName,Pcd):\r
+        def cleanupindex(indexstr):\r
+            return indexstr.strip("[").strip("]").strip()\r
+        index_elements = ArrayIndex.findall(index)\r
+        pcd_capacity = Pcd.Capacity\r
+        if index:\r
+            indicator = "(Pcd"\r
+            if len(pcd_capacity)>2:\r
+                for i in range(0,len(index_elements)):\r
+                    index_ele = index_elements[i]\r
+                    index_num = index_ele.strip("[").strip("]").strip()\r
+                    if i == len(index_elements) -2:\r
+                        indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))\r
+                        break\r
+                    else:\r
+                        indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))\r
+            elif len(pcd_capacity) == 2:\r
+                indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())\r
+            elif len(pcd_capacity) == 1:\r
+                index_ele = index_elements[0]\r
+                index_num = index_ele.strip("[").strip("]").strip()\r
+                indicator += " + %s)" % (index_num)\r
+        else:\r
+            indicator = "Pcd"\r
+        if FieldName:\r
+            indicator += "->" + FieldName\r
+        return indicator\r
+\r
+    def GetStarNum(self,Pcd):\r
+        if not Pcd.IsArray():\r
+            return 1\r
+        elif Pcd.IsSimpleTypeArray():\r
+            return len(Pcd.Capacity)\r
+        else:\r
+            return len(Pcd.Capacity) + 1\r
     def GenerateDefaultValueAssignFunction(self, Pcd):\r
         CApp = "// Default value in Dec \n"\r
-        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         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
@@ -1805,19 +1983,23 @@ class DscBuildData(PlatformBuildClassObject):
                                 (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
+        if IsArray:\r
         #\r
         # Use memcpy() to copy value into field\r
         #\r
-            CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
-            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-        for FieldList in [Pcd.DefaultValues]:\r
+            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
+            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
-                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
@@ -1829,20 +2011,27 @@ class DscBuildData(PlatformBuildClassObject):
                     Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
                 except Exception:\r
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                if isinstance(Value, str):\r
-                    CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                elif IsArray:\r
+\r
+                indicator = self.GetIndicator(index, FieldName,Pcd)\r
+                if IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
                     CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, 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 + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
+                elif isinstance(Value, str):\r
+                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 else:\r
+                    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
+                        CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
-                        CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1851,53 +2040,80 @@ class DscBuildData(PlatformBuildClassObject):
         CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    def GetPcdDscRawDefaultValue(self,Pcd, SkuName,DefaultStoreName):\r
+        if Pcd.Type in PCD_DYNAMIC_TYPE_SET or Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
+            else:\r
+                pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
+        else:\r
+            pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
+\r
+        return pcddefaultvalue\r
     def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
         CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
-        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
         inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
-        if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-            pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
-        else:\r
-            pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
-        for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
-            if not FieldList:\r
-                continue\r
-            if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
-                if IsArray:\r
+\r
+        pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
+        if pcddefaultvalue:\r
+            FieldList = pcddefaultvalue\r
+            IsArray = _IsFieldValueAnArray(FieldList)\r
+            if IsArray:\r
+                if "{CODE(" not in FieldList:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                     except BadExpression:\r
                         EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
                                         (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
-                Value, ValueSize = ParseFieldValue (FieldList)\r
+            Value, ValueSize = ParseFieldValue (FieldList)\r
 \r
-                if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-                    if isinstance(Value, str):\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        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
+                    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
+                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
+                    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
+            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
+                    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
+                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
+                    else:\r
                         CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                         CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+        inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
+        if not inheritvalue:\r
+            inheritvalue = []\r
+        for index in inheritvalue:\r
+            FieldList = inheritvalue[index]\r
+            if not FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
-                    IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    indicator = self.GetIndicator(index, FieldName,Pcd)\r
+                    IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
                             FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
@@ -1914,14 +2130,19 @@ class DscBuildData(PlatformBuildClassObject):
                     #\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 + '  __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 + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, 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
+                            CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         else:\r
-                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1932,7 +2153,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
-        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -1941,7 +2162,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
@@ -1960,7 +2181,7 @@ class DscBuildData(PlatformBuildClassObject):
                     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
@@ -1979,10 +2200,14 @@ class DscBuildData(PlatformBuildClassObject):
                 #\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 + '  __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
                 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
@@ -1996,7 +2221,7 @@ class DscBuildData(PlatformBuildClassObject):
         return CApp\r
     def GenerateFdfValue(self,Pcd):\r
         CApp = "// Value in Fdf\n"\r
-        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -2005,7 +2230,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
@@ -2024,7 +2249,7 @@ class DscBuildData(PlatformBuildClassObject):
                     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
@@ -2043,10 +2268,14 @@ class DscBuildData(PlatformBuildClassObject):
                 #\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 + '  __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
                 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
@@ -2060,7 +2289,7 @@ class DscBuildData(PlatformBuildClassObject):
         return CApp\r
 \r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
-        OverrideValues = {DefaultStore:""}\r
+        OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
             OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
         if not OverrideValues:\r
@@ -2076,14 +2305,12 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '  CHAR8   *Value;\n'\r
             CApp = CApp + '  UINT32  OriginalSize;\n'\r
             CApp = CApp + '  VOID    *OriginalPcd;\n'\r
-            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
             CApp = CApp + '\n'\r
 \r
-            if SkuName in Pcd.SkuInfoList:\r
-                DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue  else Pcd.SkuInfoList[SkuName].DefaultValue)\r
-            else:\r
-                DefaultValue = Pcd.DefaultValue\r
-            PcdDefaultValue = StringToArray(DefaultValue.strip())\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
 \r
             InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
 \r
@@ -2100,7 +2327,7 @@ class DscBuildData(PlatformBuildClassObject):
             # in a structure.  The size formula for this case is:\r
             # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
             #\r
-            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd)\r
+            CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,DefaultStoreName)\r
 \r
             #\r
             # Allocate and zero buffer for the PCD\r
@@ -2108,7 +2335,7 @@ class DscBuildData(PlatformBuildClassObject):
             # Always keep that larger one as the current size\r
             #\r
             CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
-            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
@@ -2137,7 +2364,7 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Set new PCD value and size\r
             #\r
-            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
 \r
             #\r
             # Free PCD\r
@@ -2146,6 +2373,49 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '}\n'\r
             CApp = CApp + '\n'\r
         return InitByteValue, CApp\r
+\r
+    def GenerateArrayAssignment(self, Pcd):\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
+\r
+        Value = Pcd.DefaultValueFromDec\r
+        if "{CODE(" in Pcd.DefaultValueFromDec:\r
+            realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+            CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+        if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
+            for skuname in Pcd.SkuInfoList:\r
+                skuinfo = Pcd.SkuInfoList[skuname]\r
+                if skuinfo.VariableName:\r
+                    for defaultstore in skuinfo.DefaultStoreDict:\r
+                        pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, defaultstore)\r
+                        if pcddscrawdefaultvalue:\r
+                            Value = skuinfo[defaultstore]\r
+                            if "{CODE(" in Value:\r
+                                realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                                CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
+                else:\r
+                    pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, TAB_DEFAULT_STORES_DEFAULT)\r
+                    if pcddscrawdefaultvalue:\r
+                        Value = skuinfo.DefaultValue\r
+                        if "{CODE(" in Value:\r
+                            realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                            CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
+        else:\r
+            pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
+            if pcddscrawdefaultvalue:\r
+                if "{CODE(" in Pcd.DefaultValue:\r
+                    realvalue = Pcd.DefaultValue.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                    CApp += "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+        return CApp\r
+\r
     def SkuOverrideValuesEmpty(self,OverrideValues):\r
         if not OverrideValues:\r
             return True\r
@@ -2154,6 +2424,19 @@ class DscBuildData(PlatformBuildClassObject):
                 return False\r
         return True\r
 \r
+    def ParseCCFlags(self, ccflag):\r
+        ccflags = set()\r
+        ccflaglist = ccflag.split(" ")\r
+        i = 0\r
+        while i < len(ccflaglist):\r
+            item = ccflaglist[i].strip()\r
+            if item in (r"/D", r"/U","-D","-U"):\r
+                ccflags.add(" ".join((ccflaglist[i],ccflaglist[i+1])))\r
+                i = i+1\r
+            elif item.startswith((r"/D", r"/U","-D","-U")):\r
+                ccflags.add(item)\r
+            i +=1\r
+        return ccflags\r
     def GenerateByteArrayValue (self, StructuredPcds):\r
         #\r
         # Generate/Compile/Run C application to determine if there are any flexible array members\r
@@ -2172,6 +2455,8 @@ class DscBuildData(PlatformBuildClassObject):
                     IncludeFiles.add(IncludeFile)\r
                     CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
         CApp = CApp + '\n'\r
+        for Pcd in StructuredPcds.values():\r
+            CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
@@ -2223,10 +2508,10 @@ class DscBuildData(PlatformBuildClassObject):
 \r
         MakeApp = PcdMakefileHeader\r
         if sys.platform == "win32":\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
+            MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
         else:\r
             MakeApp = MakeApp + PcdGccMakefile\r
-            MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
+            MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
                       'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
 \r
         IncSearchList = []\r
@@ -2270,38 +2555,35 @@ class DscBuildData(PlatformBuildClassObject):
             Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
             if Tool != 'CC':\r
                 continue\r
+            if Attr != "FLAGS":\r
+                continue\r
+            if Target == TAB_STAR or Target == self._Target:\r
+                if Tag == TAB_STAR or Tag == self._Toolchain:\r
+                    if 'COMMON' not in BuildOptions:\r
+                        BuildOptions['COMMON'] = set()\r
+                    if Arch == TAB_STAR:\r
+                        BuildOptions['COMMON']|= self.ParseCCFlags(self.BuildOptions[Options])\r
+                    if Arch in self.SupArchList:\r
+                        if Arch not in BuildOptions:\r
+                            BuildOptions[Arch] = set()\r
+                        BuildOptions[Arch] |= self.ParseCCFlags(self.BuildOptions[Options])\r
 \r
-            if Target == "*" or Target == self._Target:\r
-                if Tag == "*" or Tag == self._Toolchain:\r
-                    if Arch == "*" or Arch == self.Arch:\r
-                        if Tool not in BuildOptions:\r
-                            BuildOptions[Tool] = OrderedDict()\r
-                        if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
-                            BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
-                        else:\r
-                            # append options for the same tool except PATH\r
-                            if Attr != 'PATH':\r
-                                BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
-                            else:\r
-                                BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
         if BuildOptions:\r
-            for Tool in BuildOptions:\r
-                for Attr in BuildOptions[Tool]:\r
-                    if Attr == "FLAGS":\r
-                        Value = BuildOptions[Tool][Attr]\r
-                        ValueList = Value.split()\r
-                        if ValueList:\r
-                            for Id, Item in enumerate(ValueList):\r
-                                if Item in ['-D', '/D', '-U', '/U']:\r
-                                    CC_FLAGS += ' ' + Item\r
-                                    if Id + 1 < len(ValueList):\r
-                                        CC_FLAGS += ' ' + ValueList[Id + 1]\r
-                                elif Item.startswith(('-D', '/D', '-U', '/U')):\r
-                                    CC_FLAGS += ' ' + Item\r
+            ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
+            if len(ArchBuildOptions.keys()) == 1:\r
+                BuildOptions['COMMON'] |= (list(ArchBuildOptions.values())[0])\r
+            elif len(ArchBuildOptions.keys()) > 1:\r
+                CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
+                BuildOptions['COMMON'] |= CommonBuildOptions\r
+            ValueList = list(BuildOptions['COMMON'])\r
+            CC_FLAGS += " ".join(ValueList)\r
         MakeApp += CC_FLAGS\r
 \r
         if sys.platform == "win32":\r
             MakeApp = MakeApp + PcdMakefileEnd\r
+            MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
+        else:\r
+            MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
         MakeApp = MakeApp + '\n'\r
         IncludeFileFullPaths = []\r
         for includefile in IncludeFiles:\r
@@ -2325,12 +2607,11 @@ class DscBuildData(PlatformBuildClassObject):
         OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
         SaveFileOnChange(InputValueFile, InitByteValue, False)\r
 \r
-        PcdValueInitExe = PcdValueInitName\r
+        Dest_PcdValueInitExe = PcdValueInitName\r
         if not sys.platform == "win32":\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
         else:\r
-            PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
-\r
+            Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
         Messages = ''\r
         if sys.platform == "win32":\r
             MakeCommand = 'nmake -f %s' % (MakeFileName)\r
@@ -2340,6 +2621,7 @@ class DscBuildData(PlatformBuildClassObject):
             MakeCommand = 'make -f %s' % (MakeFileName)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
             Messages = StdErr\r
+\r
         Messages = Messages.split('\n')\r
         MessageGroup = []\r
         if returncode != 0:\r
@@ -2355,6 +2637,8 @@ class DscBuildData(PlatformBuildClassObject):
                         FileLine = FileInfo [1].split (')')[0]\r
                     else:\r
                         FileInfo = Message.strip().split(':')\r
+                        if len(FileInfo) < 2:\r
+                            continue\r
                         FileName = FileInfo [0]\r
                         FileLine = FileInfo [1]\r
                     if FileLine.isdigit():\r
@@ -2384,8 +2668,8 @@ class DscBuildData(PlatformBuildClassObject):
             else:\r
                 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
 \r
-        if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
-            Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
+        if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
+            Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
             returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
             if returncode != 0:\r
                 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
@@ -2438,7 +2722,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 "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
@@ -2505,7 +2789,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
@@ -2559,7 +2843,7 @@ class DscBuildData(PlatformBuildClassObject):
                     mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
                     for defaultstorename in DefaultStores:\r
                         if defaultstorename not in skuobj.DefaultStoreDict:\r
-                            skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
+                            skuobj.DefaultStoreDict[defaultstorename] = skuobj.DefaultStoreDict[mindefaultstorename]\r
                     skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
             for skuname, skuid in SkuIds.items():\r
                 if skuname not in PcdObj.SkuInfoList:\r
@@ -2570,7 +2854,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.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
@@ -2611,7 +2895,7 @@ 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 "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
 \r
@@ -2691,7 +2975,6 @@ class DscBuildData(PlatformBuildClassObject):
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
         for pcd in Pcds.values():\r
-            SkuInfoObj = list(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
@@ -2702,6 +2985,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
+                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
@@ -2731,7 +3015,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
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
 \r
         return Pcds\r
 \r
@@ -2774,7 +3058,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 "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
@@ -2829,7 +3113,6 @@ class DscBuildData(PlatformBuildClassObject):
                 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
             Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\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
@@ -2837,6 +3120,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
+                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
@@ -2846,8 +3130,17 @@ class DscBuildData(PlatformBuildClassObject):
             elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
                 del pcd.SkuInfoList[TAB_COMMON]\r
 \r
+        #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",\r
+        #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".\r
+        for pcd in Pcds.values():\r
+            PcdValueTypeSet = set()\r
+            for sku in pcd.SkuInfoList.values():\r
+                PcdValueTypeSet.add("UnicodeString" if sku.DefaultValue.startswith(('L"',"L'")) else "OtherVOID*")\r
+            if len(PcdValueTypeSet) > 1:\r
+                for sku in pcd.SkuInfoList.values():\r
+                    sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
 \r
-        map(self.FilterSkuSettings, Pcds.values())\r
+        list(map(self.FilterSkuSettings, Pcds.values()))\r
         return Pcds\r
 \r
     ## Add external modules\r
@@ -2915,4 +3208,5 @@ class DscBuildData(PlatformBuildClassObject):
                 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
                 PkgSet.update(ModuleData.Packages)\r
             self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
+            self._GuidDict.update(GlobalData.gPlatformPcds)\r
         return self._DecPcds\r