]> 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
-        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
-                            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
-                                LabelOffset = LabelOffset + 1\r
+                                ItemSize = 1\r
+                                ValueType = TAB_UINT8\r
                             elif Item.startswith(TAB_UINT16):\r
-                                LabelOffset = LabelOffset + 2\r
+                                ItemSize = 2\r
+                                ValueType = TAB_UINT16\r
                             elif Item.startswith(TAB_UINT32):\r
-                                LabelOffset = LabelOffset + 4\r
+                                ItemSize = 4\r
+                                ValueType = TAB_UINT32\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
+                                ItemSize = 0\r
+                                ValueType = TAB_UINT8\r
+                            Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)\r
+                            if ItemSize == 0:\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
-                                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
-                                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
-                                    ItemSize = 1\r
-                                    ValueType = TAB_UINT8\r
+                                    LabelOffset = LabelOffset + 1\r
                                 elif Item.startswith(TAB_UINT16):\r
-                                    ItemSize = 2\r
-                                    ValueType = TAB_UINT16\r
+                                    LabelOffset = LabelOffset + 2\r
                                 elif Item.startswith(TAB_UINT32):\r
-                                    ItemSize = 4\r
-                                    ValueType = TAB_UINT32\r
+                                    LabelOffset = LabelOffset + 4\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
-                                    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
-                                    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
-        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
index 61ba79241fb6c1b703f91741e33788ef49cf0561..2354f392f21d0b73cbfc9395a89a648ba08b5f60 100644 (file)
@@ -1297,6 +1297,8 @@ def ParseDevPathValue (Value):
     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
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.DatumType = DatumType\r
+        self._DatumType = DatumType\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._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
@@ -183,23 +240,27 @@ class StructurePcd(PcdClassObject):
     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
-    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 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
@@ -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.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
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
+    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
@@ -373,6 +388,8 @@ class DecBuildData(PackageBuildClassObject):
             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
@@ -385,7 +402,8 @@ class DecBuildData(PackageBuildClassObject):
                     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
@@ -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
-        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
-                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
-        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
index 22cbbb119a5a0f7d87bdabbc194a63ca2a3dbfb1..080e3140136d680db73fbb4c65febe21cacba348 100644 (file)
@@ -42,6 +42,7 @@ import subprocess
 from Common.Misc import SaveFileOnChange\r
 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
 from collections import OrderedDict, defaultdict\r
+from .BuildClassObject import ArrayIndex\r
 \r
 PcdValueInitName = 'PcdValueInit'\r
 \r
@@ -912,25 +913,26 @@ class DscBuildData(PlatformBuildClassObject):
                                 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
         if ValueList[Index]:\r
             DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
-            try:\r
-                ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
-            except BadExpression as Value:\r
-                EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
-                                ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
-                                TokenSpaceGuid, PcdCName, ValueList[Index]))\r
-            except EvaluationException as Excpt:\r
-                if hasattr(Excpt, 'Pcd'):\r
-                    if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
-                                        " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
-                                        " of the DSC file" % Excpt.Pcd,\r
-                                        File=self.MetaFile, Line=LineNo)\r
+            if "{CODE(" not in ValueList[Index]:\r
+                try:\r
+                    ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
+                except BadExpression as Value:\r
+                    EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
+                                    ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
+                                    TokenSpaceGuid, PcdCName, ValueList[Index]))\r
+                except EvaluationException as Excpt:\r
+                    if hasattr(Excpt, 'Pcd'):\r
+                        if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
+                                            " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
+                                            " of the DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
+                        else:\r
+                            EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                                            File=self.MetaFile, Line=LineNo)\r
                     else:\r
-                        EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
+                        EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
                                         File=self.MetaFile, Line=LineNo)\r
-                else:\r
-                    EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
-                                    File=self.MetaFile, Line=LineNo)\r
 \r
         if ValueList[Index]:\r
             Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
@@ -1395,6 +1397,26 @@ class DscBuildData(PlatformBuildClassObject):
                         self.Pcds[Name, Guid].DefaultValue = Value\r
         return AllPcds\r
 \r
+    def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
+        TokenSpaceCName = PcdCName = DimensionAttr = Field = ""\r
+        if "." in NamePart1:\r
+            TokenSpaceCName, TempPcdCName = NamePart1.split(".")\r
+            if "[" in TempPcdCName:\r
+                PcdCName = TempPcdCName[:TempPcdCName.index("[")]\r
+                DimensionAttr = TempPcdCName[TempPcdCName.index("["):]\r
+            else:\r
+                PcdCName = TempPcdCName\r
+            Field = NamePart2\r
+        else:\r
+            TokenSpaceCName = NamePart1\r
+            if "[" in NamePart2:\r
+                PcdCName = NamePart2[:NamePart2.index("[")]\r
+                DimensionAttr = NamePart2[NamePart2.index("["):]\r
+            else:\r
+                PcdCName = NamePart2\r
+\r
+        return TokenSpaceCName,PcdCName,DimensionAttr,Field\r
+\r
     def UpdateStructuredPcds(self, TypeList, AllPcds):\r
 \r
         DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
@@ -1424,9 +1446,19 @@ class DscBuildData(PlatformBuildClassObject):
             SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
             if SkuName not in SkuIds:\r
                 continue\r
+            TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
+            pcd_in_dec = self._DecPcds.get((PCName,TCName), None)\r
+            if pcd_in_dec is None:\r
+                EdkLogger.error('build', PARSER_ERROR,\r
+                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                            File=self.MetaFile, Line = Dummy5)\r
+            if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):\r
+                if not isinstance (pcd_in_dec, StructurePcd):\r
+                    EdkLogger.error('build', PARSER_ERROR,\r
+                                "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
+                                File=self.MetaFile, Line = Dummy5)\r
 \r
-            if SkuName in SkuIds and "." in TokenSpaceGuid:\r
-                S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
+                S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
 \r
         # handle pcd value override\r
         StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
@@ -1434,27 +1466,19 @@ class DscBuildData(PlatformBuildClassObject):
         for str_pcd in StrPcdSet:\r
             str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
             str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
-            if not isinstance (str_pcd_dec, StructurePcd):\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
-            if str_pcd_dec:\r
-                str_pcd_obj_str = StructurePcd()\r
-                str_pcd_obj_str.copy(str_pcd_dec)\r
-                if str_pcd_obj:\r
-                    str_pcd_obj_str.copy(str_pcd_obj)\r
-                    if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                    else:\r
-                        str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
-                for str_pcd_data in StrPcdSet[str_pcd]:\r
-                    if str_pcd_data[3] in SkuIds:\r
-                        str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])\r
-                S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
-            else:\r
-                EdkLogger.error('build', PARSER_ERROR,\r
-                            "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
-                            File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
+            str_pcd_obj_str = StructurePcd()\r
+            str_pcd_obj_str.copy(str_pcd_dec)\r
+            if str_pcd_obj:\r
+                str_pcd_obj_str.copy(str_pcd_obj)\r
+                if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+                else:\r
+                    str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
+            for str_pcd_data in StrPcdSet[str_pcd]:\r
+                if str_pcd_data[4] in SkuIds:\r
+                    str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
+            S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
+\r
         # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
         for Pcd in self.DecPcds:\r
             if isinstance(self._DecPcds[Pcd], StructurePcd):\r
@@ -1590,9 +1614,10 @@ class DscBuildData(PlatformBuildClassObject):
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
-                PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
-            PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
+            if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
+                if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
+                    PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
+                PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
 \r
         for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
@@ -1688,7 +1713,20 @@ class DscBuildData(PlatformBuildClassObject):
     def GenerateSizeFunction(self, Pcd):\r
         CApp = "// Default Value in Dec \n"\r
         CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
-        for FieldList in [Pcd.DefaultValues]:\r
+        if Pcd.IsArray():\r
+            if (len(Pcd.Capacity) == 1 and Pcd.Capacity[0] != '0') or (len(Pcd.Capacity) >1 and reduce(lambda x,y:int(x)*int(y), Pcd.Capacity)) > 0:\r
+                CApp += "  *Size = (sizeof (%s) * (%s) > *Size) ? sizeof (%s) * (%s): *Size; \n" % (Pcd.BaseDatumType, "*".join(Pcd.Capacity),Pcd.BaseDatumType, "*".join(Pcd.Capacity))\r
+            if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                CApp += "  *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
+            for skuname in Pcd.SkuInfoList:\r
+                skuobj = Pcd.SkuInfoList[skuname]\r
+                if skuobj.VariableName:\r
+                    for defaultstore in skuobj.DefaultStoreDict:\r
+                        CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
+                else:\r
+                    CApp += "  *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
+        for index in Pcd.DefaultValues:\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
@@ -1718,31 +1756,32 @@ class DscBuildData(PlatformBuildClassObject):
                 continue\r
             for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
                 CApp = CApp + "// SkuName: %s,  DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
-                for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
-                    if not FieldList:\r
-                        continue\r
-                    for FieldName in FieldList:\r
-                        FieldName = "." + FieldName\r
-                        IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
-                        if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
-                            try:\r
-                                Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
-                            except BadExpression:\r
-                                EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
-                                                (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
-                            Value, ValueSize = ParseFieldValue(Value)\r
-                            CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
-                        else:\r
-                            NewFieldName = ''\r
-                            FieldName_ori = FieldName.strip('.')\r
-                            while '[' in  FieldName:\r
-                                NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
-                                ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
-                                FieldName = FieldName.split(']', 1)[1]\r
-                            FieldName = NewFieldName + FieldName\r
-                            while '[' in FieldName:\r
-                                FieldName = FieldName.rsplit('[', 1)[0]\r
-                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
+                for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
+                    for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
+                        if not FieldList:\r
+                            continue\r
+                        for FieldName in FieldList:\r
+                            FieldName = "." + FieldName\r
+                            IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
+                            if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
+                                try:\r
+                                    Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
+                                except BadExpression:\r
+                                    EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
+                                                    (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
+                                Value, ValueSize = ParseFieldValue(Value)\r
+                                CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
+                            else:\r
+                                NewFieldName = ''\r
+                                FieldName_ori = FieldName.strip('.')\r
+                                while '[' in  FieldName:\r
+                                    NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
+                                    ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
+                                    FieldName = FieldName.split(']', 1)[1]\r
+                                FieldName = NewFieldName + FieldName\r
+                                while '[' in FieldName:\r
+                                    FieldName = FieldName.rsplit('[', 1)[0]\r
+                                    CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
         if Pcd.PcdFieldValueFromFdf:\r
             CApp = CApp + "// From fdf \n"\r
         for FieldName in Pcd.PcdFieldValueFromFdf:\r
@@ -1791,19 +1830,64 @@ class DscBuildData(PlatformBuildClassObject):
                 while '[' in FieldName:\r
                     FieldName = FieldName.rsplit('[', 1)[0]\r
                     CApp = CApp + '  __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
-        CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
+        if Pcd.GetPcdMaxSize():\r
+            CApp = CApp + "  *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
     @staticmethod\r
     def GenerateSizeStatments(Pcd):\r
-        CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
+        if Pcd.IsArray():\r
+            r_datatype = [Pcd.BaseDatumType]\r
+            for dem in Pcd.Capacity:\r
+                if dem == '0':\r
+                    r_datatype.append("[1]")\r
+                else:\r
+                    r_datatype.append("[" + dem + "]")\r
+            CApp = '  Size = sizeof(%s);\n' % ("".join(r_datatype))\r
+        else:\r
+            CApp = '  Size = sizeof(%s);\n' % (Pcd.DatumType)\r
         CApp = CApp + '  Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
         return CApp\r
 \r
+    def GetIndicator(self,index,FieldName,Pcd):\r
+        def cleanupindex(indexstr):\r
+            return indexstr.strip("[").strip("]").strip()\r
+        index_elements = ArrayIndex.findall(index)\r
+        pcd_capacity = Pcd.Capacity\r
+        if index:\r
+            indicator = "(Pcd"\r
+            if len(pcd_capacity)>2:\r
+                for i in xrange(0,len(index_elements)):\r
+                    index_ele = index_elements[i]\r
+                    index_num = index_ele.strip("[").strip("]").strip()\r
+                    if i == len(index_elements) -2:\r
+                        indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))\r
+                        break\r
+                    else:\r
+                        indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))\r
+            elif len(pcd_capacity) == 2:\r
+                indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())\r
+            elif len(pcd_capacity) == 1:\r
+                index_ele = index_elements[0]\r
+                index_num = index_ele.strip("[").strip("]").strip()\r
+                indicator += " + %s)" % (index_num)\r
+        else:\r
+            indicator = "Pcd"\r
+        if FieldName:\r
+            indicator += "->" + FieldName\r
+        return indicator\r
+\r
+    def GetStarNum(self,Pcd):\r
+        if not Pcd.IsArray():\r
+            return 1\r
+        elif Pcd.IsSimpleTypeArray():\r
+            return len(Pcd.Capacity)\r
+        else:\r
+            return len(Pcd.Capacity) + 1\r
     def GenerateDefaultValueAssignFunction(self, Pcd):\r
         CApp = "// Default value in Dec \n"\r
-        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
         DefaultValueFromDec = Pcd.DefaultValueFromDec\r
@@ -1822,9 +1906,13 @@ class DscBuildData(PlatformBuildClassObject):
         #\r
         # Use memcpy() to copy value into field\r
         #\r
-            CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
-            CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-        for FieldList in [Pcd.DefaultValues]:\r
+            if "{CODE(" in Pcd.DefaultValueFromDec:\r
+                CApp = CApp + '  memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            else:\r
+                CApp = CApp + '  Value     = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
+                CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+        for index in Pcd.DefaultValues:\r
+            FieldList = Pcd.DefaultValues[index]\r
             if not FieldList:\r
                 continue\r
             for FieldName in FieldList:\r
@@ -1840,8 +1928,10 @@ class DscBuildData(PlatformBuildClassObject):
                     Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
                 except Exception:\r
                     EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
+\r
+                indicator = self.GetIndicator(index, FieldName,Pcd)\r
                 if isinstance(Value, str):\r
-                    CApp = CApp + '  Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                    CApp = CApp + '  %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                 elif IsArray:\r
                     #\r
                     # Use memcpy() to copy value into field\r
@@ -1850,14 +1940,16 @@ class DscBuildData(PlatformBuildClassObject):
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                    CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
+\r
                 else:\r
                     if '[' in FieldName and ']' in FieldName:\r
                         Index = int(FieldName.split('[')[1].split(']')[0])\r
                         CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
                     if ValueSize > 4:\r
-                        CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     else:\r
-                        CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                        CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1868,7 +1960,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
         CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
-        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -1881,40 +1973,60 @@ class DscBuildData(PlatformBuildClassObject):
                 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
         else:\r
             pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
-        for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
-            if not FieldList:\r
-                continue\r
-            if pcddefaultvalue and FieldList == pcddefaultvalue:\r
-                IsArray = IsFieldValueAnArray(FieldList)\r
-                if IsArray:\r
+\r
+        if pcddefaultvalue:\r
+            FieldList = pcddefaultvalue\r
+            IsArray = IsFieldValueAnArray(FieldList)\r
+            if IsArray:\r
+                if "{CODE(" not in FieldList:\r
                     try:\r
                         FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
                     except BadExpression:\r
                         EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
                                         (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
-                Value, ValueSize = ParseFieldValue (FieldList)\r
+            Value, ValueSize = ParseFieldValue (FieldList)\r
 \r
-                if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
-                    if isinstance(Value, str):\r
+            if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
-                    elif IsArray:\r
-                    #\r
-                    # Use memcpy() to copy value into field\r
-                    #\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    if Pcd.IsArray():\r
+                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
                         CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
-                else:\r
-                    if isinstance(Value, str):\r
+            else:\r
+                if isinstance(Value, str):\r
+                    if "{CODE(" in Value:\r
+                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
-                    elif IsArray:\r
-                    #\r
-                    # Use memcpy() to copy value into field\r
-                    #\r
+                elif IsArray:\r
+                #\r
+                # Use memcpy() to copy value into field\r
+                #\r
+                    if Pcd.IsArray():\r
+                        CApp = CApp + '  memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
+                    else:\r
                         CApp = CApp + '  Value     = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
                         CApp = CApp + '  memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
+\r
+        inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
+        if not inheritvalue:\r
+            inheritvalue = []\r
+        for index in inheritvalue:\r
+            FieldList = inheritvalue[index]\r
+            if not FieldList:\r
                 continue\r
             if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
                 for FieldName in FieldList:\r
+                    indicator = self.GetIndicator(index, FieldName,Pcd)\r
                     IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
                     if IsArray:\r
                         try:\r
@@ -1932,18 +2044,19 @@ class DscBuildData(PlatformBuildClassObject):
                     #\r
                     # Use memcpy() to copy value into field\r
                     #\r
-                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                        CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                         CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
+                        CApp = CApp + '  memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
                     else:\r
                         if '[' in FieldName and ']' in FieldName:\r
                             Index = int(FieldName.split('[')[1].split(']')[0])\r
                             CApp = CApp + '  __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
                         if ValueSize > 4:\r
-                            CApp = CApp + '  Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                         else:\r
-                            CApp = CApp + '  Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
+                            CApp = CApp + '  %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
         CApp = CApp + "}\n"\r
         return CApp\r
 \r
@@ -1954,7 +2067,7 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     def GenerateCommandLineValue(self, Pcd):\r
         CApp = "// Value in CommandLine\n"\r
-        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -2001,7 +2114,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
@@ -2022,7 +2135,7 @@ class DscBuildData(PlatformBuildClassObject):
         return CApp\r
     def GenerateFdfValue(self,Pcd):\r
         CApp = "// Value in Fdf\n"\r
-        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
+        CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
         CApp = CApp + '  UINT32  FieldSize;\n'\r
         CApp = CApp + '  CHAR8   *Value;\n'\r
 \r
@@ -2069,7 +2182,7 @@ class DscBuildData(PlatformBuildClassObject):
                 #\r
                 # Use memcpy() to copy value into field\r
                 #\r
-                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
+                    CApp = CApp + '  FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
                     CApp = CApp + '  Value     = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
                     CApp = CApp + '  memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
@@ -2090,7 +2203,7 @@ class DscBuildData(PlatformBuildClassObject):
         return CApp\r
 \r
     def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
-        OverrideValues = {DefaultStore:""}\r
+        OverrideValues = {DefaultStore:{}}\r
         if Pcd.SkuOverrideValues:\r
             OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
         if not OverrideValues:\r
@@ -2106,16 +2219,14 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '  CHAR8   *Value;\n'\r
             CApp = CApp + '  UINT32  OriginalSize;\n'\r
             CApp = CApp + '  VOID    *OriginalPcd;\n'\r
-            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
+            CApp = CApp + '  %s      *Pcd;  // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
+\r
             CApp = CApp + '\n'\r
 \r
-            if SkuName in Pcd.SkuInfoList:\r
-                DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue  else Pcd.SkuInfoList[SkuName].DefaultValue)\r
-            else:\r
-                DefaultValue = Pcd.DefaultValue\r
-            PcdDefaultValue = StringToArray(DefaultValue.strip())\r
+            PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
 \r
-            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
+            InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)\r
 \r
             #\r
             # Get current PCD value and size\r
@@ -2138,7 +2249,7 @@ class DscBuildData(PlatformBuildClassObject):
             # Always keep that larger one as the current size\r
             #\r
             CApp = CApp + '  Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
-            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
+            CApp = CApp + '  Pcd     = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
             CApp = CApp + '  memset (Pcd, 0, Size);\n'\r
 \r
             #\r
@@ -2167,7 +2278,7 @@ class DscBuildData(PlatformBuildClassObject):
             #\r
             # Set new PCD value and size\r
             #\r
-            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
+            CApp = CApp + '  PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
 \r
             #\r
             # Free PCD\r
@@ -2176,6 +2287,39 @@ class DscBuildData(PlatformBuildClassObject):
             CApp = CApp + '}\n'\r
             CApp = CApp + '\n'\r
         return InitByteValue, CApp\r
+\r
+    def GenerateArrayAssignment(self, Pcd):\r
+        CApp = ""\r
+        if not Pcd:\r
+            return CApp\r
+        if not Pcd.IsArray():\r
+            return CApp\r
+        Demesion = ""\r
+        for d in Pcd.Capacity:\r
+            if d == "0":\r
+                Demesion += "[]"\r
+            else:\r
+                Demesion += "["+d+"]"\r
+\r
+        Value = Pcd.DefaultValueFromDec\r
+        if "{CODE(" in Pcd.DefaultValueFromDec:\r
+            realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+            CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
+\r
+        for skuname in Pcd.SkuInfoList:\r
+            skuinfo = Pcd.SkuInfoList[skuname]\r
+            if skuinfo.VariableName:\r
+                for defaultstore in skuinfo.DefaultStoreDict:\r
+                    Value = skuinfo[defaultstore]\r
+                    if "{CODE(" in Value:\r
+                        realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                        CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
+            else:\r
+                Value = skuinfo.DefaultValue\r
+                if "{CODE(" in Value:\r
+                    realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
+                    CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
+        return CApp\r
     def SkuOverrideValuesEmpty(self,OverrideValues):\r
         if not OverrideValues:\r
             return True\r
@@ -2215,6 +2359,8 @@ class DscBuildData(PlatformBuildClassObject):
                     IncludeFiles.add(IncludeFile)\r
                     CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
         CApp = CApp + '\n'\r
+        for Pcd in StructuredPcds.values():\r
+            CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
         for PcdName in StructuredPcds:\r
             Pcd = StructuredPcds[PcdName]\r
             CApp = CApp + self.GenerateSizeFunction(Pcd)\r
@@ -2395,6 +2541,8 @@ class DscBuildData(PlatformBuildClassObject):
                         FileLine = FileInfo [1].split (')')[0]\r
                     else:\r
                         FileInfo = Message.strip().split(':')\r
+                        if len(FileInfo) < 2:\r
+                            continue\r
                         FileName = FileInfo [0]\r
                         FileLine = FileInfo [1]\r
                     if FileLine.isdigit():\r
@@ -2478,7 +2626,7 @@ class DscBuildData(PlatformBuildClassObject):
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
@@ -2651,7 +2799,7 @@ class DscBuildData(PlatformBuildClassObject):
             if DefaultStore not in DefaultStoresDefine:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
 \r
@@ -2814,7 +2962,7 @@ class DscBuildData(PlatformBuildClassObject):
             if SkuName not in AvailableSkuIdSet:\r
                 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
                                             File=self.MetaFile, Line=Dummy5)\r
-            if "." not in TokenSpaceGuid:\r
+            if "." not in TokenSpaceGuid and "[" not in PcdCName:\r
                 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
             PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
 \r
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
+CODEPattern = re.compile(r"{CODE\([a-fA-F0-9Xx\{\},\s]*\)}")\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
+        self._PcdCodeValue = ""\r
+        self._PcdDataTypeCODE = False\r
+        self._CurrentPcdName = ""\r
+\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
+\r
+        Content = self.ProcessMultipleLineCODEValue(Content)\r
+\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 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
@@ -1149,7 +1192,28 @@ class DscParser(MetaFileParser):
     #\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
+        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
@@ -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
+    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
@@ -1945,9 +2020,16 @@ class DecParser(MetaFileParser):
                     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
-                    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