]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Enable Pcd Array support.
authorbob.c.feng@intel.com <bob.c.feng@intel.com>
Wed, 7 Nov 2018 09:18:34 +0000 (17:18 +0800)
committerBobCF <bob.c.feng@intel.com>
Fri, 7 Dec 2018 01:59:36 +0000 (09:59 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=1292

This patch is going to enable Array data type for PCD.

1. Support Pcd ARRAY as Structure PCD type
   including basic datatype array and structure array.
   For example:
   gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0x0}|TEST[10]|0x00010080
   gStructuredPcdPkgTokenSpaceGuid.PcdTest2|{0x0}|UINT8[10]|0x00010081
2. Support C CODE style value initialization in DEC/DSC.
   For example:
gStructuredPcdPkgTokenSpaceGuid.PcdTest|{CODE({
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
})}

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/Common/Expression.py
BaseTools/Source/Python/Common/Misc.py
BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools/Source/Python/Workspace/DecBuildData.py
BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools/Source/Python/Workspace/MetaFileParser.py

index db1310d534fb8cb9d649844f5ca7fb83cb723345..a5f085d7fb7468227a479207869124453ac4b904 100644 (file)
@@ -820,221 +820,219 @@ class ValueExpressionEx(ValueExpression):
 \r
     def __call__(self, RealValue=False, Depth=0):\r
         PcdValue = self.PcdValue\r
 \r
     def __call__(self, RealValue=False, Depth=0):\r
         PcdValue = self.PcdValue\r
-        try:\r
-            PcdValue = ValueExpression.__call__(self, RealValue, Depth)\r
-            if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")):\r
-                PcdValue, Size = ParseFieldValue(PcdValue)\r
-                PcdValueList = []\r
-                for I in range(Size):\r
-                    PcdValueList.append('0x%02X'%(PcdValue & 0xff))\r
-                    PcdValue = PcdValue >> 8\r
-                PcdValue = '{' + ','.join(PcdValueList) + '}'\r
-            elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \\r
-                      PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):\r
-                raise BadExpression\r
-        except WrnExpression as Value:\r
-            PcdValue = Value.result\r
-        except BadExpression as Value:\r
-            if self.PcdType in TAB_PCD_NUMERIC_TYPES:\r
-                PcdValue = PcdValue.strip()\r
-                if PcdValue.startswith('{') and PcdValue.endswith('}'):\r
-                    PcdValue = SplitPcdValueString(PcdValue[1:-1])\r
-                if ERR_STRING_CMP.split(':')[0] in Value.message:\r
-                    raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
-                if isinstance(PcdValue, type([])):\r
-                    TmpValue = 0\r
-                    Size = 0\r
-                    ValueType = ''\r
-                    for Item in PcdValue:\r
-                        Item = Item.strip()\r
-                        if Item.startswith(TAB_UINT8):\r
-                            ItemSize = 1\r
-                            ValueType = TAB_UINT8\r
-                        elif Item.startswith(TAB_UINT16):\r
-                            ItemSize = 2\r
-                            ValueType = TAB_UINT16\r
-                        elif Item.startswith(TAB_UINT32):\r
-                            ItemSize = 4\r
-                            ValueType = TAB_UINT32\r
-                        elif Item.startswith(TAB_UINT64):\r
-                            ItemSize = 8\r
-                            ValueType = TAB_UINT64\r
-                        elif Item[0] in {'"', "'", 'L'}:\r
-                            ItemSize = 0\r
-                            ValueType = TAB_VOID\r
-                        else:\r
-                            ItemSize = 0\r
-                            ValueType = TAB_UINT8\r
-                        Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
-\r
-                        if ItemSize == 0:\r
-                            try:\r
-                                tmpValue = int(Item, 0)\r
-                                if tmpValue > 255:\r
-                                    raise BadExpression("Byte  array number %s should less than 0xFF." % Item)\r
-                            except BadExpression as Value:\r
-                                raise BadExpression(Value)\r
-                            except ValueError:\r
-                                pass\r
-                            ItemValue, ItemSize = ParseFieldValue(Item)\r
-                        else:\r
-                            ItemValue = ParseFieldValue(Item)[0]\r
-\r
-                        if isinstance(ItemValue, type('')):\r
-                            ItemValue = int(ItemValue, 0)\r
-\r
-                        TmpValue = (ItemValue << (Size * 8)) | TmpValue\r
-                        Size = Size + ItemSize\r
-                else:\r
-                    try:\r
-                        TmpValue, Size = ParseFieldValue(PcdValue)\r
-                    except BadExpression as Value:\r
-                        raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
-                if isinstance(TmpValue, type('')):\r
-                    try:\r
-                        TmpValue = int(TmpValue)\r
-                    except:\r
-                        raise  BadExpression(Value)\r
-                else:\r
-                    PcdValue = '0x%0{}X'.format(Size) % (TmpValue)\r
-                if TmpValue < 0:\r
-                    raise  BadExpression('Type %s PCD Value is negative' % self.PcdType)\r
-                if self.PcdType == TAB_UINT8 and Size > 1:\r
-                    raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)\r
-                if self.PcdType == TAB_UINT16 and Size > 2:\r
-                    raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)\r
-                if self.PcdType == TAB_UINT32 and Size > 4:\r
-                    raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)\r
-                if self.PcdType == TAB_UINT64 and Size > 8:\r
-                    raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)\r
-            else:\r
-                try:\r
-                    TmpValue = int(PcdValue)\r
-                    TmpList = []\r
-                    if TmpValue.bit_length() == 0:\r
-                        PcdValue = '{0x00}'\r
-                    else:\r
-                        for I in range((TmpValue.bit_length() + 7) / 8):\r
-                            TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))\r
-                        PcdValue = '{' + ', '.join(TmpList) + '}'\r
-                except:\r
-                    if PcdValue.strip().startswith('{'):\r
-                        PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])\r
-                        LabelDict = {}\r
-                        NewPcdValueList = []\r
-                        LabelOffset = 0\r
-                        for Item in PcdValueList:\r
-                            # compute byte offset of every LABEL\r
-                            LabelList = _ReLabel.findall(Item)\r
-                            Item = _ReLabel.sub('', Item)\r
+        if "{CODE(" not in PcdValue:\r
+            try:\r
+                PcdValue = ValueExpression.__call__(self, RealValue, Depth)\r
+                if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")):\r
+                    PcdValue, Size = ParseFieldValue(PcdValue)\r
+                    PcdValueList = []\r
+                    for I in range(Size):\r
+                        PcdValueList.append('0x%02X'%(PcdValue & 0xff))\r
+                        PcdValue = PcdValue >> 8\r
+                    PcdValue = '{' + ','.join(PcdValueList) + '}'\r
+                elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \\r
+                          PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):\r
+                    raise BadExpression\r
+            except WrnExpression as Value:\r
+                PcdValue = Value.result\r
+            except BadExpression as Value:\r
+                if self.PcdType in TAB_PCD_NUMERIC_TYPES:\r
+                    PcdValue = PcdValue.strip()\r
+                    if PcdValue.startswith('{') and PcdValue.endswith('}'):\r
+                        PcdValue = SplitPcdValueString(PcdValue[1:-1])\r
+                    if isinstance(PcdValue, type([])):\r
+                        TmpValue = 0\r
+                        Size = 0\r
+                        ValueType = ''\r
+                        for Item in PcdValue:\r
                             Item = Item.strip()\r
                             Item = Item.strip()\r
-                            if LabelList:\r
-                                for Label in LabelList:\r
-                                    if not IsValidCName(Label):\r
-                                        raise BadExpression('%s is not a valid c variable name' % Label)\r
-                                    if Label not in LabelDict:\r
-                                        LabelDict[Label] = str(LabelOffset)\r
                             if Item.startswith(TAB_UINT8):\r
                             if Item.startswith(TAB_UINT8):\r
-                                LabelOffset = LabelOffset + 1\r
+                                ItemSize = 1\r
+                                ValueType = TAB_UINT8\r
                             elif Item.startswith(TAB_UINT16):\r
                             elif Item.startswith(TAB_UINT16):\r
-                                LabelOffset = LabelOffset + 2\r
+                                ItemSize = 2\r
+                                ValueType = TAB_UINT16\r
                             elif Item.startswith(TAB_UINT32):\r
                             elif Item.startswith(TAB_UINT32):\r
-                                LabelOffset = LabelOffset + 4\r
+                                ItemSize = 4\r
+                                ValueType = TAB_UINT32\r
                             elif Item.startswith(TAB_UINT64):\r
                             elif Item.startswith(TAB_UINT64):\r
-                                LabelOffset = LabelOffset + 8\r
+                                ItemSize = 8\r
+                                ValueType = TAB_UINT64\r
+                            elif Item[0] in {'"', "'", 'L'}:\r
+                                ItemSize = 0\r
+                                ValueType = TAB_VOID\r
                             else:\r
                             else:\r
+                                ItemSize = 0\r
+                                ValueType = TAB_UINT8\r
+                            Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+                            if ItemSize == 0:\r
                                 try:\r
                                 try:\r
-                                    ItemValue, ItemSize = ParseFieldValue(Item)\r
-                                    LabelOffset = LabelOffset + ItemSize\r
-                                except:\r
-                                    LabelOffset = LabelOffset + 1\r
-\r
-                        for Item in PcdValueList:\r
-                            # for LABEL parse\r
-                            Item = Item.strip()\r
-                            try:\r
-                                Item = _ReLabel.sub('', Item)\r
-                            except:\r
-                                pass\r
-                            try:\r
-                                OffsetList = _ReOffset.findall(Item)\r
-                            except:\r
-                                pass\r
-                            # replace each offset, except errors\r
-                            for Offset in OffsetList:\r
-                                try:\r
-                                    Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset])\r
-                                except:\r
-                                    raise BadExpression('%s not defined' % Offset)\r
-\r
-                            NewPcdValueList.append(Item)\r
-\r
-                        AllPcdValueList = []\r
-                        for Item in NewPcdValueList:\r
-                            Size = 0\r
-                            ValueStr = ''\r
-                            TokenSpaceGuidName = ''\r
-                            if Item.startswith(TAB_GUID) and Item.endswith(')'):\r
-                                try:\r
-                                    TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1)\r
-                                except:\r
+                                    tmpValue = int(Item, 0)\r
+                                    if tmpValue > 255:\r
+                                        raise BadExpression("Byte  array number %s should less than 0xFF." % Item)\r
+                                except BadExpression as Value:\r
+                                    raise BadExpression(Value)\r
+                                except ValueError:\r
                                     pass\r
                                     pass\r
-                                if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb:\r
-                                    Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')'\r
-                                elif TokenSpaceGuidName:\r
-                                    raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName)\r
-                                Item, Size = ParseFieldValue(Item)\r
-                                for Index in range(0, Size):\r
-                                    ValueStr = '0x%02X' % (int(Item) & 255)\r
-                                    Item >>= 8\r
-                                    AllPcdValueList.append(ValueStr)\r
-                                continue\r
-                            elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):\r
-                                Item, Size = ParseFieldValue(Item)\r
-                                AllPcdValueList.append(Item[1:-1])\r
-                                continue\r
+                                ItemValue, ItemSize = ParseFieldValue(Item)\r
                             else:\r
                             else:\r
-                                ValueType = ""\r
+                                ItemValue = ParseFieldValue(Item)[0]\r
+\r
+                            if isinstance(ItemValue, type('')):\r
+                                ItemValue = int(ItemValue, 0)\r
+\r
+                            TmpValue = (ItemValue << (Size * 8)) | TmpValue\r
+                            Size = Size + ItemSize\r
+                    else:\r
+                        try:\r
+                            TmpValue, Size = ParseFieldValue(PcdValue)\r
+                        except BadExpression as Value:\r
+                            raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))\r
+                    if isinstance(TmpValue, type('')):\r
+                        try:\r
+                            TmpValue = int(TmpValue)\r
+                        except:\r
+                            raise  BadExpression(Value)\r
+                    else:\r
+                        PcdValue = '0x%0{}X'.format(Size) % (TmpValue)\r
+                    if TmpValue < 0:\r
+                        raise  BadExpression('Type %s PCD Value is negative' % self.PcdType)\r
+                    if self.PcdType == TAB_UINT8 and Size > 1:\r
+                        raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)\r
+                    if self.PcdType == TAB_UINT16 and Size > 2:\r
+                        raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)\r
+                    if self.PcdType == TAB_UINT32 and Size > 4:\r
+                        raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)\r
+                    if self.PcdType == TAB_UINT64 and Size > 8:\r
+                        raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)\r
+                else:\r
+                    try:\r
+                        TmpValue = int(PcdValue)\r
+                        TmpList = []\r
+                        if TmpValue.bit_length() == 0:\r
+                            PcdValue = '{0x00}'\r
+                        else:\r
+                            for I in range((TmpValue.bit_length() + 7) / 8):\r
+                                TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))\r
+                            PcdValue = '{' + ', '.join(TmpList) + '}'\r
+                    except:\r
+                        if PcdValue.strip().startswith('{'):\r
+                            PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])\r
+                            LabelDict = {}\r
+                            NewPcdValueList = []\r
+                            LabelOffset = 0\r
+                            for Item in PcdValueList:\r
+                                # compute byte offset of every LABEL\r
+                                LabelList = _ReLabel.findall(Item)\r
+                                Item = _ReLabel.sub('', Item)\r
+                                Item = Item.strip()\r
+                                if LabelList:\r
+                                    for Label in LabelList:\r
+                                        if not IsValidCName(Label):\r
+                                            raise BadExpression('%s is not a valid c variable name' % Label)\r
+                                        if Label not in LabelDict:\r
+                                            LabelDict[Label] = str(LabelOffset)\r
                                 if Item.startswith(TAB_UINT8):\r
                                 if Item.startswith(TAB_UINT8):\r
-                                    ItemSize = 1\r
-                                    ValueType = TAB_UINT8\r
+                                    LabelOffset = LabelOffset + 1\r
                                 elif Item.startswith(TAB_UINT16):\r
                                 elif Item.startswith(TAB_UINT16):\r
-                                    ItemSize = 2\r
-                                    ValueType = TAB_UINT16\r
+                                    LabelOffset = LabelOffset + 2\r
                                 elif Item.startswith(TAB_UINT32):\r
                                 elif Item.startswith(TAB_UINT32):\r
-                                    ItemSize = 4\r
-                                    ValueType = TAB_UINT32\r
+                                    LabelOffset = LabelOffset + 4\r
                                 elif Item.startswith(TAB_UINT64):\r
                                 elif Item.startswith(TAB_UINT64):\r
-                                    ItemSize = 8\r
-                                    ValueType = TAB_UINT64\r
-                                else:\r
-                                    ItemSize = 0\r
-                                if ValueType:\r
-                                    TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+                                    LabelOffset = LabelOffset + 8\r
                                 else:\r
                                 else:\r
-                                    TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)\r
-                                Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue\r
-                                if ItemSize == 0:\r
-                                    ItemValue, ItemSize = ParseFieldValue(Item)\r
-                                    if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:\r
-                                        raise BadExpression("Byte  array number %s should less than 0xFF." % Item)\r
+                                    try:\r
+                                        ItemValue, ItemSize = ParseFieldValue(Item)\r
+                                        LabelOffset = LabelOffset + ItemSize\r
+                                    except:\r
+                                        LabelOffset = LabelOffset + 1\r
+\r
+                            for Item in PcdValueList:\r
+                                # for LABEL parse\r
+                                Item = Item.strip()\r
+                                try:\r
+                                    Item = _ReLabel.sub('', Item)\r
+                                except:\r
+                                    pass\r
+                                try:\r
+                                    OffsetList = _ReOffset.findall(Item)\r
+                                except:\r
+                                    pass\r
+                                # replace each offset, except errors\r
+                                for Offset in OffsetList:\r
+                                    try:\r
+                                        Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset])\r
+                                    except:\r
+                                        raise BadExpression('%s not defined' % Offset)\r
+\r
+                                NewPcdValueList.append(Item)\r
+\r
+                            AllPcdValueList = []\r
+                            for Item in NewPcdValueList:\r
+                                Size = 0\r
+                                ValueStr = ''\r
+                                TokenSpaceGuidName = ''\r
+                                if Item.startswith(TAB_GUID) and Item.endswith(')'):\r
+                                    try:\r
+                                        TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1)\r
+                                    except:\r
+                                        pass\r
+                                    if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb:\r
+                                        Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')'\r
+                                    elif TokenSpaceGuidName:\r
+                                        raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName)\r
+                                    Item, Size = ParseFieldValue(Item)\r
+                                    for Index in range(0, Size):\r
+                                        ValueStr = '0x%02X' % (int(Item) & 255)\r
+                                        Item >>= 8\r
+                                        AllPcdValueList.append(ValueStr)\r
+                                    continue\r
+                                elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):\r
+                                    Item, Size = ParseFieldValue(Item)\r
+                                    AllPcdValueList.append(Item[1:-1])\r
+                                    continue\r
                                 else:\r
                                 else:\r
-                                    ItemValue = ParseFieldValue(Item)[0]\r
-                                for I in range(0, ItemSize):\r
-                                    ValueStr = '0x%02X' % (int(ItemValue) & 255)\r
-                                    ItemValue >>= 8\r
-                                    AllPcdValueList.append(ValueStr)\r
-                                Size += ItemSize\r
-\r
-                        if Size > 0:\r
-                            PcdValue = '{' + ','.join(AllPcdValueList) + '}'\r
-                    else:\r
-                        raise  BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
+                                    ValueType = ""\r
+                                    if Item.startswith(TAB_UINT8):\r
+                                        ItemSize = 1\r
+                                        ValueType = TAB_UINT8\r
+                                    elif Item.startswith(TAB_UINT16):\r
+                                        ItemSize = 2\r
+                                        ValueType = TAB_UINT16\r
+                                    elif Item.startswith(TAB_UINT32):\r
+                                        ItemSize = 4\r
+                                        ValueType = TAB_UINT32\r
+                                    elif Item.startswith(TAB_UINT64):\r
+                                        ItemSize = 8\r
+                                        ValueType = TAB_UINT64\r
+                                    else:\r
+                                        ItemSize = 0\r
+                                    if ValueType:\r
+                                        TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+                                    else:\r
+                                        TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)\r
+                                    Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue\r
+                                    if ItemSize == 0:\r
+                                        ItemValue, ItemSize = ParseFieldValue(Item)\r
+                                        if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:\r
+                                            raise BadExpression("Byte  array number %s should less than 0xFF." % Item)\r
+                                    else:\r
+                                        ItemValue = ParseFieldValue(Item)[0]\r
+                                    for I in range(0, ItemSize):\r
+                                        ValueStr = '0x%02X' % (int(ItemValue) & 255)\r
+                                        ItemValue >>= 8\r
+                                        AllPcdValueList.append(ValueStr)\r
+                                    Size += ItemSize\r
+\r
+                            if Size > 0:\r
+                                PcdValue = '{' + ','.join(AllPcdValueList) + '}'\r
+                        else:\r
+                            raise  BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))\r
 \r
 \r
-        if PcdValue == 'True':\r
-            PcdValue = '1'\r
-        if PcdValue == 'False':\r
-            PcdValue = '0'\r
+            if PcdValue == 'True':\r
+                PcdValue = '1'\r
+            if PcdValue == 'False':\r
+                PcdValue = '0'\r
 \r
         if RealValue:\r
             return PcdValue\r
 \r
         if RealValue:\r
             return PcdValue\r
index 61ba79241fb6c1b703f91741e33788ef49cf0561..2354f392f21d0b73cbfc9395a89a648ba08b5f60 100644 (file)
@@ -1297,6 +1297,8 @@ def ParseDevPathValue (Value):
     return '{' + out + '}', Size\r
 \r
 def ParseFieldValue (Value):\r
     return '{' + out + '}', Size\r
 \r
 def ParseFieldValue (Value):\r
+    if "{CODE(" in Value:\r
+        return Value, len(Value.split(","))\r
     if isinstance(Value, type(0)):\r
         return Value, (Value.bit_length() + 7) / 8\r
     if not isinstance(Value, type('')):\r
     if isinstance(Value, type(0)):\r
         return Value, (Value.bit_length() + 7) / 8\r
     if not isinstance(Value, type('')):\r
index 95edc376fe6ebc2eeacca973a5a31ab60257ca47..15bb82291094937604f54a973bee8cd8c1212ba7 100644 (file)
@@ -50,7 +50,7 @@ class PcdClassObject(object):
         self.TokenSpaceGuidCName = Guid\r
         self.TokenSpaceGuidValue = GuidValue\r
         self.Type = Type\r
         self.TokenSpaceGuidCName = Guid\r
         self.TokenSpaceGuidValue = GuidValue\r
         self.Type = Type\r
-        self.DatumType = DatumType\r
+        self._DatumType = DatumType\r
         self.DefaultValue = Value\r
         self.TokenValue = Token\r
         self.MaxDatumSize = MaxDatumSize\r
         self.DefaultValue = Value\r
         self.TokenValue = Token\r
         self.MaxDatumSize = MaxDatumSize\r
@@ -72,6 +72,63 @@ class PcdClassObject(object):
         self.PcdValueFromFdf = ""\r
         self.CustomAttribute = {}\r
         self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
         self.PcdValueFromFdf = ""\r
         self.CustomAttribute = {}\r
         self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag\r
+        self._Capacity = None\r
+\r
+    @property\r
+    def Capacity(self):\r
+        self._Capacity = []\r
+        dimension = ArrayIndex.findall(self._DatumType)\r
+        for item in dimension:\r
+            maxsize = item.lstrip("[").rstrip("]").strip()\r
+            if not maxsize:\r
+                maxsize = "-1"\r
+            self._Capacity.append(maxsize)\r
+        if hasattr(self, "SkuOverrideValues"):\r
+            for sku in self.SkuOverrideValues:\r
+                for defaultstore in self.SkuOverrideValues[sku]:\r
+                    fields = self.SkuOverrideValues[sku][defaultstore]\r
+                    for demesionattr in fields:\r
+                        deme = ArrayIndex.findall(demesionattr)\r
+                        for i in range(len(deme)-1):\r
+                            if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]):\r
+                                print "error"\r
+        if hasattr(self,"DefaultValues"):\r
+            for demesionattr in self.DefaultValues:\r
+                deme = ArrayIndex.findall(demesionattr)\r
+                for i in range(len(deme)-1):\r
+                    if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]):\r
+                        print "error"\r
+        self._Capacity = [str(int(d) + 1) for d in self._Capacity]\r
+        return self._Capacity\r
+    @property\r
+    def DatumType(self):\r
+        return self._DatumType\r
+\r
+    @DatumType.setter\r
+    def DatumType(self,DataType):\r
+        self._DatumType = DataType\r
+        self._Capacity = None\r
+\r
+    @property\r
+    def BaseDatumType(self):\r
+        if self.IsArray():\r
+            return self._DatumType[:self._DatumType.index("[")]\r
+        else:\r
+            return self._DatumType\r
+    def IsArray(self):\r
+        return True if len(self.Capacity) else False\r
+\r
+    def IsAggregateDatumType(self):\r
+        if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
+            return False\r
+        if self.IsArray() or StructPattern.match(self.DatumType):\r
+            return True\r
+        return False\r
+\r
+    def IsSimpleTypeArray(self):\r
+        if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]:\r
+            return True\r
+        return False\r
 \r
     @staticmethod\r
     def GetPcdMaxSizeWorker(PcdString, MaxSize):\r
 \r
     @staticmethod\r
     def GetPcdMaxSizeWorker(PcdString, MaxSize):\r
@@ -183,23 +240,27 @@ class StructurePcd(PcdClassObject):
     def __repr__(self):\r
         return self.TypeName\r
 \r
     def __repr__(self):\r
         return self.TypeName\r
 \r
-    def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0):\r
-        if FieldName in self.DefaultValues:\r
-            del self.DefaultValues[FieldName]\r
-        self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]\r
-        return self.DefaultValues[FieldName]\r
+    def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"):\r
+        if DimensionAttr not in self.DefaultValues:\r
+            self.DefaultValues[DimensionAttr] = collections.OrderedDict()\r
+        if FieldName in self.DefaultValues[DimensionAttr]:\r
+            del self.DefaultValues[DimensionAttr][FieldName]\r
+        self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
+        return self.DefaultValues[DimensionAttr][FieldName]\r
 \r
     def SetDecDefaultValue(self, DefaultValue):\r
         self.DefaultValueFromDec = DefaultValue\r
 \r
     def SetDecDefaultValue(self, DefaultValue):\r
         self.DefaultValueFromDec = DefaultValue\r
-    def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0):\r
+    def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'):\r
         if SkuName not in self.SkuOverrideValues:\r
             self.SkuOverrideValues[SkuName] = OrderedDict()\r
         if DefaultStoreName not in self.SkuOverrideValues[SkuName]:\r
             self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()\r
         if SkuName not in self.SkuOverrideValues:\r
             self.SkuOverrideValues[SkuName] = OrderedDict()\r
         if DefaultStoreName not in self.SkuOverrideValues[SkuName]:\r
             self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()\r
-        if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]:\r
-            del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]\r
-        self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo]\r
-        return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]\r
+        if DimensionAttr not in self.SkuOverrideValues[SkuName][DefaultStoreName]:\r
+            self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = collections.OrderedDict()\r
+        if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]:\r
+            del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName][DimensionAttr]\r
+        self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]\r
+        return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]\r
 \r
     def SetPcdMode (self, PcdMode):\r
         self.PcdMode = PcdMode\r
 \r
     def SetPcdMode (self, PcdMode):\r
         self.PcdMode = PcdMode\r
@@ -209,7 +270,7 @@ class StructurePcd(PcdClassObject):
         self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName\r
         self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue\r
         self.Type = PcdObject.Type if PcdObject.Type else self.Type\r
         self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName\r
         self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue\r
         self.Type = PcdObject.Type if PcdObject.Type else self.Type\r
-        self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType\r
+        self._DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType\r
         self.DefaultValue = PcdObject.DefaultValue if  PcdObject.DefaultValue else self.DefaultValue\r
         self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue\r
         self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize\r
         self.DefaultValue = PcdObject.DefaultValue if  PcdObject.DefaultValue else self.DefaultValue\r
         self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue\r
         self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize\r
index 31ee13eca91f665b06f24e9916a252b57dcd8b2e..cc00409fee01e807288e8f8689e9826346d29e90 100644 (file)
@@ -361,6 +361,21 @@ class DecBuildData(PackageBuildClassObject):
             self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
         return self._Pcds\r
 \r
             self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))\r
         return self._Pcds\r
 \r
+    def ParsePcdName(self,TokenCName):\r
+        TokenCName = TokenCName.strip()\r
+        if TokenCName.startswith("["):\r
+            if "." in TokenCName:\r
+                Demesionattr = TokenCName[:TokenCName.index(".")]\r
+                Fields = TokenCName[TokenCName.index(".")+1:]\r
+            else:\r
+                Demesionattr = TokenCName\r
+                Fields = ""\r
+        else:\r
+            Demesionattr = ""\r
+            Fields = TokenCName\r
+\r
+        return Demesionattr,Fields\r
+\r
     def ProcessStructurePcd(self, StructurePcdRawDataSet):\r
         s_pcd_set = OrderedDict()\r
         for s_pcd, LineNo in StructurePcdRawDataSet:\r
     def ProcessStructurePcd(self, StructurePcdRawDataSet):\r
         s_pcd_set = OrderedDict()\r
         for s_pcd, LineNo in StructurePcdRawDataSet:\r
@@ -373,6 +388,8 @@ class DecBuildData(PackageBuildClassObject):
             dep_pkgs = []\r
             struct_pcd = StructurePcd()\r
             for item, LineNo in s_pcd_set[pcdname]:\r
             dep_pkgs = []\r
             struct_pcd = StructurePcd()\r
             for item, LineNo in s_pcd_set[pcdname]:\r
+                if not item.TokenCName:\r
+                    continue\r
                 if "<HeaderFiles>" in item.TokenCName:\r
                     struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue)\r
                 elif "<Packages>" in item.TokenCName:\r
                 if "<HeaderFiles>" in item.TokenCName:\r
                     struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue)\r
                 elif "<Packages>" in item.TokenCName:\r
@@ -385,7 +402,8 @@ class DecBuildData(PackageBuildClassObject):
                     struct_pcd.PkgPath = self.MetaFile.File\r
                     struct_pcd.SetDecDefaultValue(item.DefaultValue)\r
                 else:\r
                     struct_pcd.PkgPath = self.MetaFile.File\r
                     struct_pcd.SetDecDefaultValue(item.DefaultValue)\r
                 else:\r
-                    struct_pcd.AddDefaultValue(item.TokenCName, item.DefaultValue, self.MetaFile.File, LineNo)\r
+                    DemesionAttr, Fields = self.ParsePcdName(item.TokenCName)\r
+                    struct_pcd.AddDefaultValue(Fields, item.DefaultValue, self.MetaFile.File, LineNo,DemesionAttr)\r
 \r
             struct_pcd.PackageDecs = dep_pkgs\r
             str_pcd_set.append(struct_pcd)\r
 \r
             struct_pcd.PackageDecs = dep_pkgs\r
             str_pcd_set.append(struct_pcd)\r
@@ -446,15 +464,12 @@ class DecBuildData(PackageBuildClassObject):
         StructurePcds = self.ProcessStructurePcd(StrPcdSet)\r
         for pcd in StructurePcds:\r
             Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, self._PCD_TYPE_STRING_[Type]] = pcd\r
         StructurePcds = self.ProcessStructurePcd(StrPcdSet)\r
         for pcd in StructurePcds:\r
             Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, self._PCD_TYPE_STRING_[Type]] = pcd\r
-        StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*$')\r
         for pcd in Pcds.values():\r
             if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
         for pcd in Pcds.values():\r
             if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:\r
-                if StructPattern.match(pcd.DatumType) is None:\r
+                if not pcd.IsAggregateDatumType():\r
                     EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", DefinitionPosition[pcd][0], DefinitionPosition[pcd][1])\r
                     EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", DefinitionPosition[pcd][0], DefinitionPosition[pcd][1])\r
-        for struct_pcd in Pcds.values():\r
-            if isinstance(struct_pcd, StructurePcd) and not struct_pcd.StructuredPcdIncludeFile:\r
-                EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName, DefinitionPosition[struct_pcd][0], DefinitionPosition[struct_pcd][1] ))\r
-\r
+                elif not pcd.IsArray() and not pcd.StructuredPcdIncludeFile:\r
+                    EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (pcd.TokenSpaceGuidCName, pcd.TokenCName, pcd.DefinitionPosition[0], pcd.DefinitionPosition[1] ))\r
         return Pcds\r
 \r
     @property\r
         return Pcds\r
 \r
     @property\r
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 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
 \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
                                 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
         if ValueList[Index]:\r
             DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
-            try:\r
-                ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
-            except BadExpression as Value:\r
-                EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
-                                TokenSpaceGuid, PcdCName, ValueList[Index]))\r
-            except EvaluationException as Excpt:\r
-                if hasattr(Excpt, 'Pcd'):\r
-                    if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
-                                        " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
-                                        " of the DSC file" % Excpt.Pcd,\r
-                                        File=self.MetaFile, Line=LineNo)\r
+            if "{CODE(" not in ValueList[Index]:\r
+                try:\r
+                    ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
+                except BadExpression as Value:\r
+                    EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
+                                    TokenSpaceGuid, PcdCName, ValueList[Index]))\r
+                except EvaluationException as Excpt:\r
+                    if hasattr(Excpt, 'Pcd'):\r
+                        if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+                                            " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+                                            " of the DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
+                        else:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
                     else:\r
                     else:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
                                         File=self.MetaFile, Line=LineNo)\r
                                         File=self.MetaFile, Line=LineNo)\r
-                else:\r
-                    EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
-                                    File=self.MetaFile, Line=LineNo)\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
@@ -1395,6 +1397,26 @@ class DscBuildData(PlatformBuildClassObject):
                         self.Pcds[Name, Guid].DefaultValue = Value\r
         return AllPcds\r
 \r
                         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
     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
             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
 \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
 \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
         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
         # 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 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
 \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
     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
             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
                 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
         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
                 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 = 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
         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
     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
         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
         #\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
             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
                     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
                 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
                 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 + '  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
                 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
                     else:\r
-                        CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -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
 \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 + '  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
                 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
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                     except BadExpression:\r
                         EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
                                         (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
-                Value, ValueSize = ParseFieldValue (FieldList)\r
+            Value, ValueSize = ParseFieldValue (FieldList)\r
 \r
 \r
-                if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-                    if isinstance(Value, str):\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        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
                         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
                         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
                         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
                         CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                         CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+        inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
+        if not inheritvalue:\r
+            inheritvalue = []\r
+        for index in inheritvalue:\r
+            FieldList = inheritvalue[index]\r
+            if not FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
+                    indicator = self.GetIndicator(index, FieldName,Pcd)\r
                     IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\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
                     #\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 + '  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
                     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
                         else:\r
-                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1954,7 +2067,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
-        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -2001,7 +2114,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  __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 + '  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
         return CApp\r
     def GenerateFdfValue(self,Pcd):\r
         CApp = "// Value in Fdf\n"\r
-        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -2069,7 +2182,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  __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 + '  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
         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
         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 + '  CHAR8   *Value;\n'\r
             CApp = CApp + '  UINT32  OriginalSize;\n'\r
             CApp = CApp + '  VOID    *OriginalPcd;\n'\r
-            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
             CApp = CApp + '\n'\r
 \r
             CApp = CApp + '\n'\r
 \r
-            if SkuName in Pcd.SkuInfoList:\r
-                DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue  else Pcd.SkuInfoList[SkuName].DefaultValue)\r
-            else:\r
-                DefaultValue = Pcd.DefaultValue\r
-            PcdDefaultValue = StringToArray(DefaultValue.strip())\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
 \r
 \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
 \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
             # Always keep that larger one as the current size\r
             #\r
             CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
-            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
@@ -2167,7 +2278,7 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Set new PCD value and size\r
             #\r
             #\r
             # Set new PCD value and size\r
             #\r
-            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
 \r
             #\r
             # Free PCD\r
 \r
             #\r
             # Free PCD\r
@@ -2176,6 +2287,39 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '}\n'\r
             CApp = CApp + '\n'\r
         return InitByteValue, CApp\r
             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
     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
                     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
         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
                         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
                         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 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
                 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 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
                 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 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
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
index 804a4aa5cb692330c0537da0aec6367dd0a03f9a..6fde9e54f555154edb90305d91839ad01bc947ed 100644 (file)
@@ -40,6 +40,7 @@ from .MetaFileCommentParser import CheckInfComment
 ## RegEx for finding file versions\r
 hexVersionPattern = re.compile(r'0[xX][\da-f-A-F]{5,8}')\r
 decVersionPattern = re.compile(r'\d+\.\d+')\r
 ## RegEx for finding file versions\r
 hexVersionPattern = re.compile(r'0[xX][\da-f-A-F]{5,8}')\r
 decVersionPattern = re.compile(r'\d+\.\d+')\r
+CODEPattern = re.compile(r"{CODE\([a-fA-F0-9Xx\{\},\s]*\)}")\r
 \r
 ## A decorator used to parse macro definition\r
 def ParseMacro(Parser):\r
 \r
 ## A decorator used to parse macro definition\r
 def ParseMacro(Parser):\r
@@ -913,6 +914,10 @@ class DscParser(MetaFileParser):
         #\r
         self._IdMapping = {-1:-1}\r
 \r
         #\r
         self._IdMapping = {-1:-1}\r
 \r
+        self._PcdCodeValue = ""\r
+        self._PcdDataTypeCODE = False\r
+        self._CurrentPcdName = ""\r
+\r
     ## Parser starter\r
     def Start(self):\r
         Content = ''\r
     ## Parser starter\r
     def Start(self):\r
         Content = ''\r
@@ -922,6 +927,9 @@ class DscParser(MetaFileParser):
             EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
 \r
         OwnerId = {}\r
             EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)\r
 \r
         OwnerId = {}\r
+\r
+        Content = self.ProcessMultipleLineCODEValue(Content)\r
+\r
         for Index in range(0, len(Content)):\r
             Line = CleanString(Content[Index])\r
             # skip empty line\r
         for Index in range(0, len(Content)):\r
             Line = CleanString(Content[Index])\r
             # skip empty line\r
@@ -1133,6 +1141,41 @@ class DscParser(MetaFileParser):
     def _LibraryInstanceParser(self):\r
         self._ValueList[0] = self._CurrentLine\r
 \r
     def _LibraryInstanceParser(self):\r
         self._ValueList[0] = self._CurrentLine\r
 \r
+    def ProcessMultipleLineCODEValue(self,Content):\r
+        CODEBegin = False\r
+        CODELine = ""\r
+        continuelinecount = 0\r
+        newContent = []\r
+        for Index in range(0, len(Content)):\r
+            Line = Content[Index]\r
+            if CODEBegin:\r
+                CODELine = CODELine + Line\r
+                continuelinecount +=1\r
+                if ")}" in Line:\r
+                    newContent.append(CODELine)\r
+                    for _ in range(continuelinecount):\r
+                        newContent.append("")\r
+                    CODEBegin = False\r
+                    CODELine = ""\r
+                    continuelinecount = 0\r
+            else:\r
+                if not Line:\r
+                    newContent.append(Line)\r
+                    continue\r
+                if "{CODE(" not in Line:\r
+                    newContent.append(Line)\r
+                    continue\r
+                elif CODEPattern.findall(Line):\r
+                    newContent.append(Line)\r
+                    continue\r
+                else:\r
+                    CODEBegin = True\r
+                    CODELine = Line\r
+\r
+        return newContent\r
+\r
+    def _DecodeCODEData(self):\r
+        pass\r
     ## PCD sections parser\r
     #\r
     #   [PcdsFixedAtBuild]\r
     ## PCD sections parser\r
     #\r
     #   [PcdsFixedAtBuild]\r
@@ -1149,7 +1192,28 @@ class DscParser(MetaFileParser):
     #\r
     @ParseMacro\r
     def _PcdParser(self):\r
     #\r
     @ParseMacro\r
     def _PcdParser(self):\r
+        if self._PcdDataTypeCODE:\r
+            self._PcdCodeValue = self._PcdCodeValue + "\n " + self._CurrentLine\r
+            if self._CurrentLine.endswith(")}"):\r
+                self._CurrentLine = "|".join((self._CurrentPcdName, self._PcdCodeValue))\r
+                self._PcdDataTypeCODE = False\r
+                self._PcdCodeValue = ""\r
+            else:\r
+                self._ValueList = None\r
+                return\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
+        self._CurrentPcdName = TokenList[0]\r
+        if TokenList[1].strip().startswith("{CODE"):\r
+            self._PcdDataTypeCODE = True\r
+            self._PcdCodeValue = TokenList[1].strip()\r
+\r
+        if self._PcdDataTypeCODE:\r
+            if self._CurrentLine.endswith(")}"):\r
+                self._PcdDataTypeCODE = False\r
+                self._PcdCodeValue = ""\r
+            else:\r
+                self._ValueList = None\r
+                return\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
         PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
         if len(PcdNameTockens) == 2:\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
         PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
         if len(PcdNameTockens) == 2:\r
@@ -1907,6 +1971,17 @@ class DecParser(MetaFileParser):
         if self._ValueList[0] not in self._GuidDict:\r
             self._GuidDict[self._ValueList[0]] = self._ValueList[1]\r
 \r
         if self._ValueList[0] not in self._GuidDict:\r
             self._GuidDict[self._ValueList[0]] = self._ValueList[1]\r
 \r
+    def ParsePcdName(self,namelist):\r
+        if "[" in namelist[1]:\r
+            pcdname = namelist[1][:namelist[1].index("[")]\r
+            arrayindex = namelist[1][namelist[1].index("["):]\r
+            namelist[1] = pcdname\r
+            if len(namelist) == 2:\r
+                namelist.append(arrayindex)\r
+            else:\r
+                namelist[2] = ".".join((arrayindex,namelist[2]))\r
+        return namelist\r
+\r
     ## PCD sections parser\r
     #\r
     #   [PcdsFixedAtBuild]\r
     ## PCD sections parser\r
     #\r
     #   [PcdsFixedAtBuild]\r
@@ -1945,9 +2020,16 @@ class DecParser(MetaFileParser):
                     return\r
             else:\r
                 PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)\r
                     return\r
             else:\r
                 PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)\r
-                PcdNames = PcdTockens[0].split(TAB_SPLIT)\r
+                PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT))\r
                 if len(PcdNames) == 2:\r
                 if len(PcdNames) == 2:\r
-                    self._CurrentStructurePcdName = ""\r
+                    if PcdNames[1].strip().endswith("]"):\r
+                        PcdName = PcdNames[1][:PcdNames[1].index('[')]\r
+                        Index = PcdNames[1][PcdNames[1].index('['):]\r
+                        self._ValueList[0] = TAB_SPLIT.join((PcdNames[0],PcdName))\r
+                        self._ValueList[1] = Index\r
+                        self._ValueList[2] = PcdTockens[1]\r
+                    else:\r
+                        self._CurrentStructurePcdName = ""\r
                 else:\r
                     if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]):\r
                         EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),\r
                 else:\r
                     if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]):\r
                         EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),\r