X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BaseTools%2FSource%2FPython%2FAutoGen%2FGenC.py;h=6706629722fcc7581054059becaa7cd39baf498d;hp=3b17ec18950618982a23d6f1691d1ddedbb5a780;hb=128d435f5e572733ab2649c4494f5d4f786b6f6b;hpb=f7b31aa540435f43f5c60e7bde456c272b31f7ee diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 3b17ec1895..6706629722 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -813,7 +813,7 @@ def DynExPcdTokenNumberMapping(Info, AutoGenH): # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file. # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter. # Use the Guid pointer to see if it matches any of the token space GUIDs. - TokenCNameList = [] + TokenCNameList = set() for TokenCName in ExTokenCNameList: if TokenCName in TokenCNameList: continue @@ -836,9 +836,9 @@ def DynExPcdTokenNumberMapping(Info, AutoGenH): % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, RealTokenCName)) if Index == Count: AutoGenH.Append('0 \\\n )\n') - TokenCNameList.append(TokenCName) + TokenCNameList.add(TokenCName) - TokenCNameList = [] + TokenCNameList = set() for TokenCName in ExTokenCNameList: if TokenCName in TokenCNameList: continue @@ -868,7 +868,7 @@ def DynExPcdTokenNumberMapping(Info, AutoGenH): # COMPAREGUID() will only be used if the Guid passed in is local to the module. AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr) __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr) \n' % (RealTokenCName, RealTokenCName, RealTokenCName, RealTokenCName)) - TokenCNameList.append(TokenCName) + TokenCNameList.add(TokenCName) def GetPcdSize(Pcd): if Pcd.DatumType not in _NumericDataTypesList: @@ -962,19 +962,22 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): SetModeStatusName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_S_' + TokenCName if Pcd.DatumType in gDatumSizeStringDatabaseH else '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH['VOID*'] + '_S_' + TokenCName GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + TokenCName - PcdExCNameList = [] if Pcd.Type in gDynamicExPcd: if Info.IsLibrary: PcdList = Info.LibraryPcdList else: PcdList = Info.ModulePcdList + PcdExCNameTest = 0 for PcdModule in PcdList: - if PcdModule.Type in gDynamicExPcd: - PcdExCNameList.append(PcdModule.TokenCName) + if PcdModule.Type in gDynamicExPcd and Pcd.TokenCName == PcdModule.TokenCName: + PcdExCNameTest += 1 + # get out early once we found > 1... + if PcdExCNameTest > 1: + break # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd. # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build. # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. - if PcdExCNameList.count(Pcd.TokenCName) > 1: + if PcdExCNameTest > 1: AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) @@ -996,14 +999,14 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): AutoGenH.Append('#define %s(Value) LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) AutoGenH.Append('#define %s(Value) LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) elif Pcd.Type in gDynamicPcd: - PcdList = [] - PcdCNameList = [] - PcdList.extend(Info.LibraryPcdList) - PcdList.extend(Info.ModulePcdList) - for PcdModule in PcdList: - if PcdModule.Type in gDynamicPcd: - PcdCNameList.append(PcdModule.TokenCName) - if PcdCNameList.count(Pcd.TokenCName) > 1: + PcdCNameTest = 0 + for PcdModule in Info.LibraryPcdList + Info.ModulePcdList: + if PcdModule.Type in gDynamicPcd and Pcd.TokenCName == PcdModule.TokenCName: + PcdCNameTest += 1 + # get out early once we found > 1... + if PcdCNameTest > 1: + break + if PcdCNameTest > 1: EdkLogger.error("build", AUTOGEN_ERROR, "More than one Dynamic Pcds [%s] are different Guids but same CName. They need to be changed to DynamicEx type to avoid the confliction.\n" % (TokenCName), ExtraData="[%s]" % str(Info.MetaFile.Path)) else: AutoGenH.Append('#define %s LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName)) @@ -1109,9 +1112,14 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd): ArraySize = ArraySize / 2; if ArraySize < (len(Value) + 1): - EdkLogger.error("build", AUTOGEN_ERROR, + if Pcd.MaxSizeUserSet: + EdkLogger.error("build", AUTOGEN_ERROR, "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, TokenCName), ExtraData="[%s]" % str(Info)) + else: + ArraySize = GetPcdSize(Pcd) + if Unicode: + ArraySize = ArraySize / 2 Value = NewValue + '0 }' Array = '[%d]' % ArraySize # @@ -1260,7 +1268,6 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): Type = '(VOID *)' Array = '[]' PcdItemType = Pcd.Type - PcdExCNameList = [] if PcdItemType in gDynamicExPcd: PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + TokenCName AutoGenH.Append('\n#define %s %dU\n' % (PcdExTokenName, TokenNumber)) @@ -1269,13 +1276,17 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd): PcdList = Info.LibraryPcdList else: PcdList = Info.ModulePcdList + PcdExCNameTest = 0 for PcdModule in PcdList: - if PcdModule.Type in gDynamicExPcd: - PcdExCNameList.append(PcdModule.TokenCName) + if PcdModule.Type in gDynamicExPcd and Pcd.TokenCName == PcdModule.TokenCName: + PcdExCNameTest += 1 + # get out early once we found > 1... + if PcdExCNameTest > 1: + break # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd. # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build. # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build. - if PcdExCNameList.count(Pcd.TokenCName) > 1: + if PcdExCNameTest > 1: AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n') AutoGenH.Append('// #define %s %s\n' % (PcdTokenName, PcdExTokenName)) AutoGenH.Append('// #define %s LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName)) @@ -1529,7 +1540,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): } if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE', 'MM_CORE_STANDALONE']: - if Info.SourceFileList <> None and Info.SourceFileList <> []: + if Info.SourceFileList: if NumEntryPoints != 1: EdkLogger.error( "build", @@ -1691,7 +1702,7 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH): AutoGenH.Append("\n// Definition of SkuId Array\n") AutoGenH.Append("extern UINT64 _gPcd_SkuId_Array[];\n") # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found - if TokenSpaceList <> []: + if TokenSpaceList: AutoGenH.Append("\n// Definition of PCD Token Space GUIDs used in this module\n\n") if Info.ModuleType in ["USER_DEFINED", "BASE"]: GuidType = "GUID"