* [PATCH] BaseTools: Unused StructurePcd value is not requried to be calculated.
@ 2018-09-17 6:51 Zhaozh1x
0 siblings, 0 replies; only message in thread
From: Zhaozh1x @ 2018-09-17 6:51 UTC (permalink / raw)
To: edk2-devel; +Cc: Zhaozh1x, Liming Gao, Yonghong Zhu, Bob Feng
Now, BaseTools always calculates StructurePcd value only if it
is declared in DEC file. In fact, it only needs to calculate
StructurePcd value only when this PCD is used by any module.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: ZhiqiangX Zhao <zhiqiangx.zhao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
---
BaseTools/Source/Python/Workspace/DscBuildData.py | 44 +++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/BaseTools/Source/Python/Workspace/DscBuildData.py b/BaseTools/Source/Python/Workspace/DscBuildData.py
index 88ba415c5a..a0322b9a26 100644
--- a/BaseTools/Source/Python/Workspace/DscBuildData.py
+++ b/BaseTools/Source/Python/Workspace/DscBuildData.py
@@ -222,6 +222,7 @@ class DscBuildData(PlatformBuildClassObject):
self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""
self.DefaultStores = None
self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)
+ self.UsedStructurePcd = None
@property
def OutputPath(self):
if os.getenv("WORKSPACE"):
@@ -275,6 +276,7 @@ class DscBuildData(PlatformBuildClassObject):
self._VpdToolGuid = None
self.__Macros = None
self.DefaultStores = None
+ self.UsedStructurePcd = None
## handle Override Path of Module
@@ -1357,6 +1359,7 @@ class DscBuildData(PlatformBuildClassObject):
# handle pcd value override
StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)
S_pcd_set = OrderedDict()
+ DscPcd = []
for str_pcd in StrPcdSet:
str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)
str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)
@@ -1377,6 +1380,7 @@ class DscBuildData(PlatformBuildClassObject):
if str_pcd_data[3] in SkuIds:
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])
S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str
+ DscPcd.append((str_pcd[1], str_pcd[0]))
else:
EdkLogger.error('build', PARSER_ERROR,
"Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),
@@ -1395,6 +1399,8 @@ class DscBuildData(PlatformBuildClassObject):
else:
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}
S_pcd_set[Pcd] = str_pcd_obj_str
+ #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.
+ self.FilterStrcturePcd(DscPcd, S_pcd_set)
if S_pcd_set:
GlobalData.gStructurePcd[self.Arch] = S_pcd_set
for stru_pcd in S_pcd_set.values():
@@ -1490,6 +1496,44 @@ class DscBuildData(PlatformBuildClassObject):
map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])
return Pcds
+ #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.
+ def FilterStrcturePcd(self, DscPcd, S_pcd_set):
+ if not self.UsedStructurePcd:
+ DscModulePcd = []
+ for ModuleFile in self._Modules:
+ ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
+ for key in ModuleData.Pcds.keys():
+ if isinstance(self._DecPcds.get(key, None), StructurePcd):
+ DscModulePcd.append(key)
+ FdfPcd = []
+ FdfModulePcd = []
+ FdfInfList = []
+ if GlobalData.gFdfParser:
+ FdfInfList = GlobalData.gFdfParser.Profile.InfList
+ fdfpcd = GlobalData.gFdfParser.Profile.PcdDict
+ fdfpcdlocation = GlobalData.gFdfParser.Profile.PcdLocalDict
+ for Name, Guid, Field in fdfpcd.keys() + fdfpcdlocation.keys():
+ if isinstance(self._DecPcds.get((Name, Guid), None), StructurePcd):
+ FdfPcd.append((Name, Guid))
+ for Inf in FdfInfList:
+ ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)
+ if ModuleFile in self._Modules:
+ continue
+ ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
+ for key in ModuleData.Pcds.keys():
+ if isinstance(self._DecPcds.get(key, None), StructurePcd):
+ FdfModulePcd.append(key)
+ CommandPcd = []
+ if GlobalData.BuildOptionPcd:
+ for pcdTuple in GlobalData.BuildOptionPcd:
+ TokenSpaceGuid, Token, Field = pcdTuple[0], pcdTuple[1], pcdTuple[2]
+ if isinstance(self._DecPcds.get((Token, TokenSpaceGuid), None), StructurePcd):
+ CommandPcd.append((Token, TokenSpaceGuid))
+ self.UsedStructurePcd = set(DscPcd + DscModulePcd + FdfPcd + FdfModulePcd + CommandPcd)
+ for (Token, TokenSpaceGuid) in S_pcd_set:
+ if (Token, TokenSpaceGuid) not in self.UsedStructurePcd:
+ del S_pcd_set[(Token, TokenSpaceGuid)]
+
## Retrieve non-dynamic PCD settings
#
# @param Type PCD type
--
2.14.1.windows.1
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2018-09-17 6:51 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-17 6:51 [PATCH] BaseTools: Unused StructurePcd value is not requried to be calculated Zhaozh1x
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox