]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Enable Pcd Array support.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
index 22cbbb119a5a0f7d87bdabbc194a63ca2a3dbfb1..080e3140136d680db73fbb4c65febe21cacba348 100644 (file)
@@ -42,6 +42,7 @@ import subprocess
 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
 PcdValueInitName = 'PcdValueInit'\r
 \r
@@ -912,25 +913,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
@@ -1395,6 +1397,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
@@ -1424,9 +1446,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
@@ -1434,27 +1466,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
@@ -1590,9 +1614,10 @@ 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
-                PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
-            PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
+            if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
+                if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
+                    PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
+                PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
 \r
         for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
@@ -1688,7 +1713,20 @@ 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 (len(Pcd.Capacity) == 1 and Pcd.Capacity[0] != '0') or (len(Pcd.Capacity) >1 and reduce(lambda x,y:int(x)*int(y), Pcd.Capacity)) > 0:\r
+                CApp += "  *Size = (sizeof (%s) * (%s) > *Size) ? sizeof (%s) * (%s): *Size; \n" % (Pcd.BaseDatumType, "*".join(Pcd.Capacity),Pcd.BaseDatumType, "*".join(Pcd.Capacity))\r
+            if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                CApp += "  *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
+            for skuname in Pcd.SkuInfoList:\r
+                skuobj = Pcd.SkuInfoList[skuname]\r
+                if skuobj.VariableName:\r
+                    for defaultstore in skuobj.DefaultStoreDict:\r
+                        CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+                else:\r
+                    CApp += "  *Size = (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
+        for index in Pcd.DefaultValues:\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
@@ -1718,31 +1756,32 @@ 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
+                                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
         if Pcd.PcdFieldValueFromFdf:\r
             CApp = CApp + "// From fdf \n"\r
         for FieldName in Pcd.PcdFieldValueFromFdf:\r
@@ -1791,19 +1830,64 @@ class DscBuildData(PlatformBuildClassObject):
                 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, 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
+        if Pcd.IsArray():\r
+            r_datatype = [Pcd.BaseDatumType]\r
+            for dem in Pcd.Capacity:\r
+                if dem == '0':\r
+                    r_datatype.append("[1]")\r
+                else:\r
+                    r_datatype.append("[" + dem + "]")\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 xrange(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
@@ -1822,9 +1906,13 @@ class DscBuildData(PlatformBuildClassObject):
         #\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
+        for index in Pcd.DefaultValues:\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
@@ -1840,8 +1928,10 @@ 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
+\r
+                indicator = self.GetIndicator(index, FieldName,Pcd)\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
+                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 elif IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
@@ -1850,14 +1940,16 @@ class DscBuildData(PlatformBuildClassObject):
                     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
+\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
@@ -1868,7 +1960,7 @@ class DscBuildData(PlatformBuildClassObject):
 \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
@@ -1881,40 +1973,60 @@ class DscBuildData(PlatformBuildClassObject):
                 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
         else:\r
             pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\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
+        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():\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():\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
+                    indicator = self.GetIndicator(index, FieldName,Pcd)\r
                     IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
@@ -1932,18 +2044,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
@@ -1954,7 +2067,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
@@ -2001,7 +2114,7 @@ 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
@@ -2022,7 +2135,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
@@ -2069,7 +2182,7 @@ 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
@@ -2090,7 +2203,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
@@ -2106,16 +2219,14 @@ 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
+            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)\r
 \r
             #\r
             # Get current PCD value and size\r
@@ -2138,7 +2249,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
@@ -2167,7 +2278,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
@@ -2176,6 +2287,39 @@ 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
+            if d == "0":\r
+                Demesion += "[]"\r
+            else:\r
+                Demesion += "["+d+"]"\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
+        for skuname in Pcd.SkuInfoList:\r
+            skuinfo = Pcd.SkuInfoList[skuname]\r
+            if skuinfo.VariableName:\r
+                for defaultstore in skuinfo.DefaultStoreDict:\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
+                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
+        return CApp\r
     def SkuOverrideValuesEmpty(self,OverrideValues):\r
         if not OverrideValues:\r
             return True\r
@@ -2215,6 +2359,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
@@ -2395,6 +2541,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
@@ -2478,7 +2626,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
@@ -2651,7 +2799,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
@@ -2814,7 +2962,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