]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools:fix Ecc tool issue for check StructPcd
authorFan, ZhijuX <zhijux.fan@intel.com>
Fri, 17 Jan 2020 01:09:53 +0000 (09:09 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 12 Feb 2020 09:26:22 +0000 (09:26 +0000)
BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=2142

gAdvancedFeaturePkgTokenSpaceGuid.PcdSmbiosType0BiosInformation|
{0x0}|SMBIOS_TABLE_TYPE0|0x80010000 {
    <HeaderFiles>
      IndustryStandard/SmBios.h
    <Packages>
      MdePkg/MdePkg.dec
      AdvancedFeaturePkg/AdvancedFeaturePkg.dec
  }

If there's a PcdStructHF or PcdStructPKGs in StructPcd,
EccTool report error,IndexError: list index out of range

This patch is going to fix this issue

Cc: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py

index 15765654552378fa7fc9224870130bf4ab2e66de..9c27c8e16a052a9f527bc30ebb97660297163fd7 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse meta files\r
 #\r
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.<BR>\r
 # SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
@@ -13,7 +13,7 @@ import Common.LongFilePathOs as os
 import re\r
 import time\r
 import copy\r
-\r
+from hashlib import md5\r
 import Common.EdkLogger as EdkLogger\r
 import Common.GlobalData as GlobalData\r
 import Ecc.EccGlobalData as EccGlobalData\r
@@ -1498,6 +1498,10 @@ class DecParser(MetaFileParser):
         self.TblFile = EccGlobalData.gDb.TblFile\r
         self.FileID = -1\r
 \r
+        self._CurrentStructurePcdName = ""\r
+        self._include_flag = False\r
+        self._package_flag = False\r
+\r
     ## Parser starter\r
     def Start(self):\r
         Content = ''\r
@@ -1692,6 +1696,62 @@ class DecParser(MetaFileParser):
                             File=self.MetaFile, Line=self._LineIndex+1)\r
             self._ValueList[0] = ''\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
+    def StructPcdParser(self):\r
+        self._ValueList[0] = self._CurrentStructurePcdName\r
+\r
+        if "|" not in self._CurrentLine:\r
+            if "<HeaderFiles>" == self._CurrentLine:\r
+                self._include_flag = True\r
+                self._package_flag = False\r
+                self._ValueList = None\r
+                return\r
+            if "<Packages>" == self._CurrentLine:\r
+                self._package_flag = True\r
+                self._ValueList = None\r
+                self._include_flag = False\r
+                return\r
+\r
+            if self._include_flag:\r
+                self._ValueList[1] = "<HeaderFiles>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
+                self._ValueList[2] = self._CurrentLine\r
+            if self._package_flag and "}" != self._CurrentLine:\r
+                self._ValueList[1] = "<Packages>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
+                self._ValueList[2] = self._CurrentLine\r
+            if self._CurrentLine == "}":\r
+                self._package_flag = False\r
+                self._include_flag = False\r
+                self._ValueList = None\r
+        else:\r
+            PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)\r
+            PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT))\r
+            if len(PcdNames) == 2:\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 " % (\r
+                    self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),\r
+                                    File=self.MetaFile, Line=self._LineIndex + 1)\r
+                self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])\r
+                self._ValueList[2] = PcdTockens[1]\r
+\r
     ## PCD sections parser\r
     #\r
     #   [PcdsFixedAtBuild]\r
@@ -1702,6 +1762,9 @@ class DecParser(MetaFileParser):
     #\r
     @ParseMacro\r
     def _PcdParser(self):\r
+        if self._CurrentStructurePcdName:\r
+            self.StructPcdParser()\r
+            return\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
         # check PCD information\r
@@ -1759,6 +1822,10 @@ class DecParser(MetaFileParser):
         if not IsValid:\r
             EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine,\r
                             File=self.MetaFile, Line=self._LineIndex+1)\r
+        if Cause == "StructurePcd":\r
+            self._CurrentStructurePcdName = TAB_SPLIT.join(self._ValueList[0:2])\r
+            self._ValueList[0] = self._CurrentStructurePcdName\r
+            self._ValueList[1] = ValueList[1].strip()\r
 \r
         if EccGlobalData.gConfig.UniCheckPCDInfo == '1' or EccGlobalData.gConfig.UniCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             # check Description, Prompt information\r