diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 9700bf8527..e6fc5cda3c 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -1455,10 +1455,25 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]: return + ModuleEntryPointList = [] + for Lib in Info.DependentLibraryList: + if len(Lib.ModuleEntryPointList) > 0: + if Lib.ModuleType == Info.ModuleType: + ModuleEntryPointList = ModuleEntryPointList + Lib.ModuleEntryPointList + else: + EdkLogger.error( + "build", + PREBUILD_ERROR, + "Driver's ModuleType must be consistent [%s]"%(str(Lib)), + File=str(Info.PlatformInfo), + ExtraData="consumed by [%s]" % str(Info.MetaFile) + ) + ModuleEntryPointList = ModuleEntryPointList + Info.Module.ModuleEntryPointList + # # Module Entry Points # - NumEntryPoints = len(Info.Module.ModuleEntryPointList) + NumEntryPoints = len(ModuleEntryPointList) if 'PI_SPECIFICATION_VERSION' in Info.Module.Specification: PiSpecVersion = Info.Module.Specification['PI_SPECIFICATION_VERSION'] else: @@ -1468,7 +1483,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): else: UefiSpecVersion = '0x00000000' Dict = { - 'Function' : Info.Module.ModuleEntryPointList, + 'Function' : ModuleEntryPointList, 'PiSpecVersion' : PiSpecVersion + 'U', 'UefiSpecVersion': UefiSpecVersion + 'U' } @@ -1481,7 +1496,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): AUTOGEN_ERROR, '%s must have exactly one entry point' % Info.ModuleType, File=str(Info), - ExtraData= ", ".join(Info.Module.ModuleEntryPointList) + ExtraData= ", ".join(ModuleEntryPointList) ) if Info.ModuleType == SUP_MODULE_PEI_CORE: AutoGenC.Append(gPeiCoreEntryPointString.Replace(Dict)) @@ -1535,11 +1550,18 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH): if Info.IsLibrary or Info.ModuleType in [SUP_MODULE_USER_DEFINED, SUP_MODULE_SEC]: return + + ModuleUnloadImageList = [] + for Lib in Info.DependentLibraryList: + if len(Lib.ModuleUnloadImageList) > 0: + ModuleUnloadImageList = ModuleUnloadImageList + Lib.ModuleUnloadImageList + ModuleUnloadImageList = ModuleUnloadImageList + Info.Module.ModuleUnloadImageList + # # Unload Image Handlers # - NumUnloadImage = len(Info.Module.ModuleUnloadImageList) - Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':Info.Module.ModuleUnloadImageList} + NumUnloadImage = len(ModuleUnloadImageList) + Dict = {'Count':str(NumUnloadImage) + 'U', 'Function':ModuleUnloadImageList} if NumUnloadImage < 2: AutoGenC.Append(gUefiUnloadImageString[NumUnloadImage].Replace(Dict)) else: diff --git a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py index b79280bc2e..22abda8743 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceCommon.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceCommon.py @@ -20,6 +20,8 @@ from Workspace.BuildClassObject import StructurePcd from Common.BuildToolError import RESOURCE_NOT_AVAILABLE from Common.BuildToolError import OPTION_MISSING from Common.BuildToolError import BUILD_ERROR +from Common.BuildToolError import PREBUILD_ERROR +import Common.EdkLogger as EdkLogError class OrderedListDict(OrderedDict): def __init__(self, *args, **kwargs): @@ -138,6 +140,12 @@ def GetModuleLibInstances(Module, Platform, BuildDatabase, Arch, Target, Toolcha return [] LibraryModule = BuildDatabase[LibraryPath, Arch, Target, Toolchain] + if LibraryModule.ModuleEntryPointList and LibraryModule.ModuleType != Module.ModuleType: + EdkLogError.error( + "build", PREBUILD_ERROR, + "Driver's ModuleType must be consistent [%s]" % (str(Module)), + File=str(FileName), + ExtraData="consumed by [%s]" % str(LibraryModule)) # for those forced library instance (NULL library), add a fake library class if LibraryClassName.startswith("NULL"): LibraryModule.LibraryClass.append(LibraryClassObject(LibraryClassName, [ModuleType]))