]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Improve build performance of structure PCD value generation
authorFeng, Bob C <bob.c.feng@intel.com>
Wed, 28 Feb 2018 05:59:21 +0000 (13:59 +0800)
committerLiming Gao <liming.gao@intel.com>
Wed, 28 Feb 2018 08:47:43 +0000 (16:47 +0800)
Optimized the PcdValueInit.c size by abstract the common logic in the funciton.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index 05a83e84aca58c7bf0902a8e383a8c10d6dd697d..edf2bdf4b9e6b6365d6efaf84eba67b1ba3e37c9 100644 (file)
@@ -65,6 +65,7 @@ class PcdClassObject(object):
         self.validlists = validlists\r
         self.expressions = expressions\r
         self.DscDefaultValue = None\r
+        self.DscRawValue = None\r
         if IsDsc:\r
             self.DscDefaultValue = Value\r
 \r
@@ -127,6 +128,7 @@ class StructurePcd(PcdClassObject):
         self.PcdDefineLineNo = 0\r
         self.PkgPath = ""\r
         self.DefaultValueFromDec = ""\r
+        self.ValueChain = dict()\r
     def __repr__(self):\r
         return self.TypeName\r
 \r
@@ -172,6 +174,7 @@ class StructurePcd(PcdClassObject):
         self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges\r
         self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists\r
         self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions\r
+        self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue\r
         if type(PcdObject) is StructurePcd:\r
             self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile\r
             self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs\r
@@ -184,6 +187,7 @@ class StructurePcd(PcdClassObject):
             self.StructName = PcdObject.DatumType if PcdObject.DatumType else self.StructName\r
             self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo\r
             self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath\r
+            self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain\r
 \r
 ## LibraryClassObject\r
 #\r
index 9b7e3b75c5d9e67bc010d2866645f61198b1a25d..a5089a900b255a41b1afd4185793b5783fee1e4d 100644 (file)
@@ -1332,12 +1332,15 @@ class DscBuildData(PlatformBuildClassObject):
                     continue\r
                 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
                 NoDefault = False\r
-                while nextskuid not in stru_pcd.SkuOverrideValues:\r
-                    if nextskuid == "DEFAULT":\r
-                        NoDefault = True\r
-                        break\r
-                    nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
-                stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {'STANDARD':stru_pcd.DefaultValues})\r
+                if skuid not in stru_pcd.SkuOverrideValues:\r
+                    while nextskuid not in stru_pcd.SkuOverrideValues:\r
+                        if nextskuid == "DEFAULT":\r
+                            NoDefault = True\r
+                            break\r
+                        nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
+                    stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {'STANDARD':stru_pcd.DefaultValues})\r
+                    if not NoDefault:\r
+                        stru_pcd.ValueChain[(skuid,'')]= (nextskuid,'')\r
             if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
                 for skuid in SkuIds:\r
                     nextskuid = skuid\r
@@ -1356,6 +1359,7 @@ class DscBuildData(PlatformBuildClassObject):
                     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.ValueChain[(skuid,defaultstoreid)]= (nextskuid,mindefaultstorename)\r
         S_pcd_set = self.OverrideByFdfComm(S_pcd_set)\r
         Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
         if Str_Pcd_Values:\r
@@ -1679,10 +1683,24 @@ class DscBuildData(PlatformBuildClassObject):
                         CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
                         CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+        CApp = CApp + "}\n"\r
+        return CApp\r
+    def GenerateDefaultValueAssignStatement(self,Pcd):\r
+        CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+        return CApp\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 + '  UINT32  FieldSize;\n'\r
+        CApp = CApp + '  CHAR8   *Value;\n'\r
+\r
         CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % ('DEFAULT', 'STANDARD')\r
-        inherit_OverrideValues = Pcd.SkuOverrideValues['DEFAULT']\r
-        pcddefaultvalue = Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
-        for FieldList in [pcddefaultvalue,inherit_OverrideValues.get('STANDARD')]:\r
+        inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
+        if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD'):\r
+            pcddefaultvalue = Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\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
@@ -1694,48 +1712,60 @@ class DscBuildData(PlatformBuildClassObject):
                         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
-                if isinstance(Value, str):\r
-                    CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                    CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+                if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD'):\r
+                    if isinstance(Value, str):\r
+                        CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
+                    elif IsArray:\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', 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
+                        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
+                        CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName,{}).get(DefaultStoreName))\r
+                        CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
                 continue\r
-            for FieldName in FieldList:\r
-                IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
-                if IsArray:\r
+            if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD') or (( (SkuName,'') not in Pcd.ValueChain) and ( (SkuName,DefaultStoreName) not in Pcd.ValueChain )):\r
+                for FieldName in FieldList:\r
+                    IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
+                    if IsArray:\r
+                        try:\r
+                            FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
+                        except BadExpression:\r
+                            EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                            (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
                     try:\r
-                        FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
-                    except BadExpression:\r
-                        EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                        (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                try:\r
-                    Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
-                except Exception:\r
-                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                if isinstance(Value, str):\r
-                    CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                elif IsArray:\r
-                #\r
-                # Use memcpy() to copy value into field\r
-                #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
-                    CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                    CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
-                else:\r
-                    if ValueSize > 4:\r
-                        CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
+                    except Exception:\r
+                        EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
+                    if isinstance(Value, str):\r
+                        CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    elif IsArray:\r
+                    #\r
+                    # Use memcpy() to copy value into field\r
+                    #\r
+                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                        CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
                     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
+                        if ValueSize > 4:\r
+                            CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        else:\r
+                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
-    def GenerateDefaultValueAssignStatement(self,Pcd):\r
-        CApp = '  Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+    def GenerateInitValueStatement(self,Pcd,SkuName,DefaultStoreName):\r
+        CApp = '  Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,DefaultStoreName)\r
         return CApp\r
-    def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):\r
-        OverrideValues = {DefaultStoreName:""}\r
+    def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
+        OverrideValues = {DefaultStore:""}\r
         if Pcd.SkuOverrideValues:\r
             OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
         for DefaultStoreName in OverrideValues.keys():\r
@@ -1753,7 +1783,7 @@ class DscBuildData(PlatformBuildClassObject):
             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
+                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
@@ -1793,63 +1823,18 @@ class DscBuildData(PlatformBuildClassObject):
             # Assign field values in PCD\r
             #\r
             CApp = CApp + self.GenerateDefaultValueAssignStatement(Pcd)\r
-            for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
-                if skuname == "DEFAULT":\r
-                    continue\r
-                inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
-                storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
-                for defaultstorenameitem in storeset:\r
-                    CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
-                    pcddefaultvalue = Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
-                    for FieldList in [pcddefaultvalue,inherit_OverrideValues.get(defaultstorenameitem)]:\r
-                        if not FieldList:\r
-                            continue\r
-                        if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                            IsArray = self.IsFieldValueAnArray(FieldList)\r
-                            if IsArray:\r
-                                try:\r
-                                    FieldList = ValueExpressionEx(FieldList, "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
-                            if isinstance(Value, str):\r
-                                CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                            elif IsArray:\r
-                            #\r
-                            # Use memcpy() to copy value into field\r
-                            #\r
-                                CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(skuname,{}).get(defaultstorenameitem, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                                CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-                            continue\r
-                        for FieldName in FieldList:\r
-                            IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
-                            if IsArray:\r
-                                try:\r
-                                    FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
-                                except BadExpression:\r
-                                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                                    (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                            try:\r
-                                Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
-                            except Exception:\r
-                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
-                            if isinstance(Value, str):\r
-                                CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                            elif IsArray:\r
-                            #\r
-                            # Use memcpy() to copy value into field\r
-                            #\r
-                                CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
-                                CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                                CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
-                            else:\r
-                                if ValueSize > 4:\r
-                                    CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                                else:\r
-                                    CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
-                if skuname == SkuName:\r
-                    break\r
+            if Pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
+                        self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
+                for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
+                    storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
+                    for defaultstorenameitem in storeset:\r
+                        CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
+                        CApp = CApp + self.GenerateInitValueStatement(Pcd,skuname,defaultstorenameitem)\r
+                    if skuname == SkuName:\r
+                        break\r
+            else:\r
+                CApp = CApp + "// SkuName: DEFAULT,  DefaultStoreName: STANDARD \n"\r
+                CApp = CApp + self.GenerateInitValueStatement(Pcd,"DEFAULT","STANDARD")\r
             #\r
             # Set new PCD value and size\r
             #\r
@@ -1885,6 +1870,15 @@ class DscBuildData(PlatformBuildClassObject):
             Pcd = StructuredPcds[PcdName]\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
             CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
+            if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
+                        self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
+                CApp = CApp + self.GenerateInitValueFunction(Pcd,self.SkuIdMgr.SystemSkuId, 'STANDARD')\r
+            else:\r
+                for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
+                    if SkuName not in Pcd.SkuOverrideValues:\r
+                        continue\r
+                    for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
+                        CApp = CApp + self.GenerateInitValueFunction(Pcd,SkuName,DefaultStoreName)\r
             if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
                         self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
                 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r
@@ -2201,6 +2195,16 @@ class DscBuildData(PlatformBuildClassObject):
             return True\r
         else:\r
             return False\r
+    def CopyDscRawValue(self,Pcd):\r
+        if Pcd.DscRawValue is None:\r
+            Pcd.DscRawValue = dict()\r
+        for skuname in Pcd.SkuInfoList:\r
+            Pcd.DscRawValue[skuname] = {}\r
+            if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                for defaultstore in Pcd.SkuInfoList[skuname].DefaultStoreDict:\r
+                    Pcd.DscRawValue[skuname][defaultstore] = Pcd.SkuInfoList[skuname].DefaultStoreDict[defaultstore]\r
+            else:\r
+                Pcd.DscRawValue[skuname]['STANDARD'] = Pcd.SkuInfoList[skuname].DefaultValue\r
     def CompletePcdValues(self,PcdSet):\r
         Pcds = {}\r
         DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
@@ -2216,6 +2220,7 @@ class DscBuildData(PlatformBuildClassObject):
                         self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
                 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
                 continue\r
+            self.CopyDscRawValue(PcdObj)\r
             PcdType = PcdObj.Type\r
             if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
                 for skuid in PcdObj.SkuInfoList:\r