+ SourcePcdDict = {'DynamicEx':[], 'PatchableInModule':[],'Dynamic':[],'FixedAtBuild':[]}\r
+ BinaryPcdDict = {'DynamicEx':[], 'PatchableInModule':[]}\r
+ SourcePcdDict_Keys = SourcePcdDict.keys()\r
+ BinaryPcdDict_Keys = BinaryPcdDict.keys()\r
+\r
+ # generate the SourcePcdDict and BinaryPcdDict\r
+ for BuildData in PGen.BuildDatabase._CACHE_.values():\r
+ if BuildData.Arch != Arch:\r
+ continue\r
+ if BuildData.MetaFile.Ext == '.inf':\r
+ for key in BuildData.Pcds:\r
+ if BuildData.Pcds[key].Pending:\r
+ if key in Platform.Pcds:\r
+ PcdInPlatform = Platform.Pcds[key]\r
+ if PcdInPlatform.Type not in [None, '']:\r
+ BuildData.Pcds[key].Type = PcdInPlatform.Type\r
+\r
+ if BuildData.MetaFile in Platform.Modules:\r
+ PlatformModule = Platform.Modules[str(BuildData.MetaFile)]\r
+ if key in PlatformModule.Pcds:\r
+ PcdInPlatform = PlatformModule.Pcds[key]\r
+ if PcdInPlatform.Type not in [None, '']:\r
+ BuildData.Pcds[key].Type = PcdInPlatform.Type\r
+\r
+ if 'DynamicEx' in BuildData.Pcds[key].Type:\r
+ if BuildData.IsBinaryModule:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in BinaryPcdDict['DynamicEx']:\r
+ BinaryPcdDict['DynamicEx'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+ else:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in SourcePcdDict['DynamicEx']:\r
+ SourcePcdDict['DynamicEx'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+\r
+ elif 'PatchableInModule' in BuildData.Pcds[key].Type:\r
+ if BuildData.MetaFile.Ext == '.inf':\r
+ if BuildData.IsBinaryModule:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in BinaryPcdDict['PatchableInModule']:\r
+ BinaryPcdDict['PatchableInModule'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+ else:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in SourcePcdDict['PatchableInModule']:\r
+ SourcePcdDict['PatchableInModule'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+\r
+ elif 'Dynamic' in BuildData.Pcds[key].Type:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in SourcePcdDict['Dynamic']:\r
+ SourcePcdDict['Dynamic'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+ elif 'FixedAtBuild' in BuildData.Pcds[key].Type:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) not in SourcePcdDict['FixedAtBuild']:\r
+ SourcePcdDict['FixedAtBuild'].append((BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName))\r
+ else:\r
+ pass\r
+\r
+ #\r
+ # intersection the BinaryPCD for Mixed PCD\r
+ #\r
+ for i in BinaryPcdDict_Keys:\r
+ for j in BinaryPcdDict_Keys:\r
+ if i != j:\r
+ IntersectionList = list(set(BinaryPcdDict[i]).intersection(set(BinaryPcdDict[j])))\r
+ for item in IntersectionList:\r
+ NewPcd1 = (item[0] + '_' + i, item[1])\r
+ NewPcd2 = (item[0] + '_' + j, item[1])\r
+ if item not in GlobalData.MixedPcd:\r
+ GlobalData.MixedPcd[item] = [NewPcd1, NewPcd2]\r
+ else:\r
+ if NewPcd1 not in GlobalData.MixedPcd[item]:\r
+ GlobalData.MixedPcd[item].append(NewPcd1)\r
+ if NewPcd2 not in GlobalData.MixedPcd[item]:\r
+ GlobalData.MixedPcd[item].append(NewPcd2)\r
+ else:\r
+ pass\r
+\r
+ #\r
+ # intersection the SourcePCD and BinaryPCD for Mixed PCD\r
+ #\r
+ for i in SourcePcdDict_Keys:\r
+ for j in BinaryPcdDict_Keys:\r
+ if i != j:\r
+ IntersectionList = list(set(SourcePcdDict[i]).intersection(set(BinaryPcdDict[j])))\r
+ for item in IntersectionList:\r
+ NewPcd1 = (item[0] + '_' + i, item[1])\r
+ NewPcd2 = (item[0] + '_' + j, item[1])\r
+ if item not in GlobalData.MixedPcd:\r
+ GlobalData.MixedPcd[item] = [NewPcd1, NewPcd2]\r
+ else:\r
+ if NewPcd1 not in GlobalData.MixedPcd[item]:\r
+ GlobalData.MixedPcd[item].append(NewPcd1)\r
+ if NewPcd2 not in GlobalData.MixedPcd[item]:\r
+ GlobalData.MixedPcd[item].append(NewPcd2)\r
+ else:\r
+ pass\r
+\r
+ for BuildData in PGen.BuildDatabase._CACHE_.values():\r
+ if BuildData.Arch != Arch:\r
+ continue\r
+ for key in BuildData.Pcds:\r
+ for SinglePcd in GlobalData.MixedPcd:\r
+ if (BuildData.Pcds[key].TokenCName, BuildData.Pcds[key].TokenSpaceGuidCName) == SinglePcd:\r
+ for item in GlobalData.MixedPcd[SinglePcd]:\r
+ Pcd_Type = item[0].split('_')[-1]\r
+ if (Pcd_Type == BuildData.Pcds[key].Type) or (Pcd_Type == TAB_PCDS_DYNAMIC_EX and BuildData.Pcds[key].Type in GenC.gDynamicExPcd) or \\r
+ (Pcd_Type == TAB_PCDS_DYNAMIC and BuildData.Pcds[key].Type in GenC.gDynamicPcd):\r
+ Value = BuildData.Pcds[key]\r
+ Value.TokenCName = BuildData.Pcds[key].TokenCName + '_' + Pcd_Type\r
+ if len(key) == 2:\r
+ newkey = (Value.TokenCName, key[1])\r
+ elif len(key) == 3:\r
+ newkey = (Value.TokenCName, key[1], key[2])\r
+ del BuildData.Pcds[key]\r
+ BuildData.Pcds[newkey] = Value\r
+ break\r
+ else:\r
+ pass\r
+ break\r
+ else:\r
+ pass\r
+\r
+ # handle the mixed pcd in FDF file\r
+ for key in PcdSet:\r
+ if key in GlobalData.MixedPcd:\r
+ Value = PcdSet[key]\r
+ del PcdSet[key]\r
+ for item in GlobalData.MixedPcd[key]:\r
+ PcdSet[item] = Value\r
+\r