From 636f2be673b2f43518167d8fddae56b714f19314 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Fri, 12 Mar 2010 10:54:01 +0000 Subject: Sync EDKII BaseTools to BaseTools project r1928 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10234 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/GenFw/GenFw.c | 93 +++++++++++++++++++++--- BaseTools/Source/C/GenFw/elf_common.h | 2 + BaseTools/Source/Python/AutoGen/GenMake.py | 4 +- BaseTools/Source/Python/Common/DscClassObject.py | 14 ++-- BaseTools/Source/Python/Common/FdfParserLite.py | 8 +- BaseTools/Source/Python/Common/Parsing.py | 16 ++-- BaseTools/Source/Python/GenFds/FdfParser.py | 63 ++++++++++------ BaseTools/Source/Python/build/BuildReport.py | 50 +++++++------ BaseTools/Source/Python/build/build.py | 75 +++++++++++-------- 9 files changed, 219 insertions(+), 106 deletions(-) (limited to 'BaseTools/Source') diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c index d42c88e23d..4d60814780 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -24,6 +24,8 @@ Abstract: #ifndef __GNUC__ #include #include +#include +#include #endif #include #include @@ -1034,14 +1036,20 @@ WriteSections( - (SecOffset - SecShdr->sh_addr); break; default: - Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); } } else if (Ehdr->e_machine == EM_ARM) { switch (ELF32_R_TYPE(Rel->r_info)) { case R_ARM_RBASE: // No relocation - no action required - case R_ARM_PC24: // PC-relative relocations don't require modification - case R_ARM_XPC25: // PC-relative relocations don't require modification + + // Thease are all PC-relative relocations and don't require modification + case R_ARM_PC24: + case R_ARM_XPC25: + case R_ARM_THM_PC22: + case R_ARM_THM_JUMP19: + case R_ARM_CALL: break; + case R_ARM_ABS32: case R_ARM_RABS32: // @@ -1050,7 +1058,7 @@ WriteSections( *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx]; break; default: - Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); + Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); } } } @@ -1124,7 +1132,7 @@ GetPhdrByIndex ( VOID -WriteRelocations( +WriteRelocations ( VOID ) { @@ -1164,13 +1172,18 @@ WriteRelocations( EFI_IMAGE_REL_BASED_HIGHLOW); break; default: - Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); + Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info)); } } else if (Ehdr->e_machine == EM_ARM) { switch (ELF32_R_TYPE(Rel->r_info)) { - case R_ARM_RBASE: + case R_ARM_RBASE: // No relocation - no action required + + // Thease are all PC-relative relocations and don't require modification case R_ARM_PC24: case R_ARM_XPC25: + case R_ARM_THM_PC22: + case R_ARM_THM_JUMP19: + case R_ARM_CALL: break; case R_ARM_ABS32: case R_ARM_RABS32: @@ -1180,8 +1193,9 @@ WriteRelocations( EFI_IMAGE_REL_BASED_HIGHLOW ); break; - default: - Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); + + default: + Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info)); } } else { Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine); @@ -1217,6 +1231,9 @@ WriteRelocations( case DT_RELENT: RelElementSize = Dyn->d_un.d_val; break; + + default: + break; } Dyn++; } @@ -1226,7 +1243,13 @@ WriteRelocations( for (K = 0; K < RelSize; K += RelElementSize) { - Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K); + if (DynamicSegment->p_paddr == 0) { + // This seems to be how it works on armcc???? Have the email in to find out? + Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K); + } else { + // This is how it reads in the ELF specification + Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K); + } switch (ELF32_R_TYPE (Rel->r_info)) { case R_ARM_RBASE: @@ -1242,7 +1265,8 @@ WriteRelocations( CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW); break; default: - Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName); + Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info)); + break; } } break; @@ -1993,6 +2017,9 @@ Returns: FILE *ReportFile; CHAR8 *ReportFileName; UINTN FileLen; + time_t InputFileTime; + time_t OutputFileTime; + struct stat Stat_Buf; SetUtilityName (UTILITY_NAME); @@ -2038,6 +2065,8 @@ Returns: HiiSectionHeader = NULL; NewBaseAddress = 0; NegativeAddr = FALSE; + InputFileTime = 0; + OutputFileTime = 0; if (argc == 1) { Error (NULL, 0, 1001, "Missing options", "No input options."); @@ -2434,6 +2463,14 @@ Returns: if (OutImageName != NULL) { fpOut = fopen (OutImageName, "rb"); if (fpOut != NULL) { + // + // Get Output file time stamp + // + fstat(fileno (fpOut), &Stat_Buf); + OutputFileTime = Stat_Buf.st_mtime; + // + // Get Output file data + // OutputFileLength = _filelength (fileno (fpOut)); OutputFileBuffer = malloc (OutputFileLength); if (OutputFileBuffer == NULL) { @@ -2460,6 +2497,14 @@ Returns: Error (NULL, 0, 0001, "Error opening file", mInImageName); goto Finish; } + // + // Get Iutput file time stamp + // + fstat(fileno (fpIn), &Stat_Buf); + InputFileTime = Stat_Buf.st_mtime; + // + // Get Input file data + // InputFileLength = _filelength (fileno (fpIn)); InputFileBuffer = malloc (InputFileLength); if (InputFileBuffer == NULL) { @@ -3467,6 +3512,27 @@ Returns: FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER); memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER)); VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength)); + } else { + + // + // Following codes are to fix the objcopy's issue: + // objcopy in binutil 2.50.18 will set PE image's charactices to "RELOC_STRIPPED" if image has no ".reloc" section + // It cause issue for EFI image which has no ".reloc" sections. + // Following codes will be removed when objcopy in binutil fix this problem for PE image. + // + if ((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) { + if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader; + if (Optional32->ImageBase == 0) { + PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED; + } + } else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) { + Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader; + if (Optional64->ImageBase == 0) { + PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED; + } + } + } } WriteFile: @@ -3487,7 +3553,10 @@ WriteFile: VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength); } } else { - if ((FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) { + if ((OutputFileTime < InputFileTime) || (FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) { + // + // Update File when File is changed or File is old. + // fpOut = fopen (OutImageName, "wb"); if (fpOut == NULL) { Error (NULL, 0, 0001, "Error opening output file", OutImageName); diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/GenFw/elf_common.h index 1cd3f53907..3798c95d61 100644 --- a/BaseTools/Source/C/GenFw/elf_common.h +++ b/BaseTools/Source/C/GenFw/elf_common.h @@ -597,6 +597,8 @@ typedef struct { #define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */ #define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */ #define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */ +#define R_ARM_CALL 28 +#define R_ARM_THM_JUMP19 51 #define R_ARM_GNU_VTENTRY 100 #define R_ARM_GNU_VTINHERIT 101 #define R_ARM_RSBREL32 250 diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index c5d8991e07..b58d0c641f 100644 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -1,7 +1,7 @@ ## @file # Create makefile for MS nmake and GNU make # -# Copyright (c) 2007, Intel Corporation +# Copyright (c) 2007 - 2010, Intel Corporation # All rights reserved. This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -26,7 +26,7 @@ from BuildEngine import * import Common.GlobalData as GlobalData ## Regular expression for finding header file inclusions -gIncludePattern = re.compile(r"^[ \t]*#[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<][ \t]*)([\w.\\/]+)(?:[ \t]*[\">])", re.MULTILINE|re.UNICODE) +gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<]?[ \t]*)([\w.\\/]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE) ## Regular expression for matching macro used in header file inclusion gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE) diff --git a/BaseTools/Source/Python/Common/DscClassObject.py b/BaseTools/Source/Python/Common/DscClassObject.py index 50b6cc5bce..c25580ac37 100644 --- a/BaseTools/Source/Python/Common/DscClassObject.py +++ b/BaseTools/Source/Python/Common/DscClassObject.py @@ -1,7 +1,7 @@ ## @file # This file is used to define each component of DSC file # -# Copyright (c) 2007 ~ 2008, Intel Corporation +# Copyright (c) 2007 - 2010, Intel Corporation # All rights reserved. This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -989,10 +989,14 @@ class Dsc(DscObject): # elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model): List = PreviousIf[0].split(' ') - Value1 = List[0] - Value2 = List[1] - Value3 = List[2] - Value3 = SplitString(Value3) + Value1, Value2, Value3 = '', '==', '0' + if len(List) == 3: + Value1 = List[0] + Value2 = List[1] + Value3 = List[2] + Value3 = SplitString(Value3) + if len(List) == 1: + Value1 = List[0] Model = PreviousIf[2] self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled) # diff --git a/BaseTools/Source/Python/Common/FdfParserLite.py b/BaseTools/Source/Python/Common/FdfParserLite.py index eb7b0d7514..b181e65d16 100644 --- a/BaseTools/Source/Python/Common/FdfParserLite.py +++ b/BaseTools/Source/Python/Common/FdfParserLite.py @@ -1760,8 +1760,8 @@ class FdfParser(object): if not self.__GetNextHexNumber(): raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber) + if len(self.__Token) > 18: + raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) DataString = self.__Token DataString += "," @@ -1792,8 +1792,8 @@ class FdfParser(object): if not self.__GetNextHexNumber(): raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber) + if len(self.__Token) > 18: + raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) DataString = self.__Token DataString += "," diff --git a/BaseTools/Source/Python/Common/Parsing.py b/BaseTools/Source/Python/Common/Parsing.py index 6ab91fbc33..3884b0521c 100644 --- a/BaseTools/Source/Python/Common/Parsing.py +++ b/BaseTools/Source/Python/Common/Parsing.py @@ -291,17 +291,17 @@ def QueryInfItem(Table, Model, BelongsToItem): # @retval truple() A truple structure as (Family, ToolChain, Flag) # def GetBuildOption(String, File, LineNo = -1): + (Family, ToolChain, Flag) = ('', '', '') if String.find(TAB_EQUAL_SPLIT) < 0: RaiseParserError(String, 'BuildOptions', File, '[:]=Flag', LineNo) - (Family, ToolChain, Flag) = ('', '', '') - List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1) - if List[0].find(':') > -1: - Family = List[0][ : List[0].find(':')].strip() - ToolChain = List[0][List[0].find(':') + 1 : ].strip() else: - ToolChain = List[0].strip() - Flag = List[1].strip() - + List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1) + if List[0].find(':') > -1: + Family = List[0][ : List[0].find(':')].strip() + ToolChain = List[0][List[0].find(':') + 1 : ].strip() + else: + ToolChain = List[0].strip() + Flag = List[1].strip() return (Family, ToolChain, Flag) ## Get Library Class diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 92d6ab64ba..1e87eb410e 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -1787,19 +1787,27 @@ class FdfParser: if not self.__GetNextHexNumber(): raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - - DataString = self.__Token - DataString += "," - - while self.__IsToken(","): - if not self.__GetNextHexNumber(): - raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString += self.__Token - DataString += "," + if len(self.__Token) > 18: + raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) + + # convert hex string value to byte hex string array + AllString = self.__Token + AllStrLen = len (AllString) + DataString = "" + while AllStrLen > 4: + DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + "," + AllStrLen = AllStrLen - 2 + DataString = DataString + AllString[:AllStrLen] + "," + + # byte value array + if len (self.__Token) <= 4: + while self.__IsToken(","): + if not self.__GetNextHexNumber(): + raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) + if len(self.__Token) > 4: + raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) + DataString += self.__Token + DataString += "," if not self.__IsToken( "}"): raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) @@ -1819,18 +1827,27 @@ class FdfParser: if not self.__GetNextHexNumber(): raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber) - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) + if len(self.__Token) > 18: + raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber) - DataString = self.__Token - DataString += "," + # convert hex string value to byte hex string array + AllString = self.__Token + AllStrLen = len (AllString) + DataString = "" + while AllStrLen > 4: + DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + "," + AllStrLen = AllStrLen - 2 + DataString = DataString + AllString[:AllStrLen] + "," - while self.__IsToken(","): - self.__GetNextHexNumber() - if len(self.__Token) > 4: - raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) - DataString += self.__Token - DataString += "," + # byte value array + if len (self.__Token) <= 4: + while self.__IsToken(","): + if not self.__GetNextHexNumber(): + raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber) + if len(self.__Token) > 4: + raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber) + DataString += self.__Token + DataString += "," if not self.__IsToken( "}"): raise Warning("expected '}'", self.FileName, self.CurrentLineNumber) diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py index eac21d1495..f805aae5ca 100644 --- a/BaseTools/Source/Python/build/BuildReport.py +++ b/BaseTools/Source/Python/build/BuildReport.py @@ -221,7 +221,7 @@ class LibraryReport(object): EdkIILibInfo += " C = " + LibConstructor LibDestructor = " ".join(LibraryItem[3]) if LibDestructor: - EdkIILibInfo += " D = " + LibConstructor + EdkIILibInfo += " D = " + LibDestructor LibDepex = " ".join(LibraryItem[4]) if LibDepex: EdkIILibInfo += " Depex = " + LibDepex @@ -255,7 +255,8 @@ class DepexReport(object): ModuleType = M.ModuleType if not ModuleType: ModuleType = gComponentType2ModuleType.get(M.ComponentType, "") - if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE"]: + + if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]: return for Source in M.SourceFileList: @@ -404,17 +405,18 @@ class ModuleReport(object): self.Size = 0 self.BuildTimeStamp = None self.DriverType = "" - ModuleType = M.ModuleType - if not ModuleType: - ModuleType = gComponentType2ModuleType.get(M.ComponentType, "") - # - # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER" - # - if ModuleType == "DXE_SMM_DRIVER": - PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000") - if int(PiSpec, 0) >= 0x0001000A: - ModuleType = "SMM_DRIVER" - self.DriverType = gDriverTypeMap.get(ModuleType, "") + if not M.IsLibrary: + ModuleType = M.ModuleType + if not ModuleType: + ModuleType = gComponentType2ModuleType.get(M.ComponentType, "") + # + # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER" + # + if ModuleType == "DXE_SMM_DRIVER": + PiSpec = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000") + if int(PiSpec, 0) >= 0x0001000A: + ModuleType = "SMM_DRIVER" + self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)") self.UefiSpecVersion = M.Module.Specification.get("UEFI_SPECIFICATION_VERSION", "") self.PiSpecVersion = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "") self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "") @@ -1310,9 +1312,11 @@ class PlatformReport(object): self.ModuleReportList = [] if MaList != None: + self._IsModuleBuild = True for Ma in MaList: self.ModuleReportList.append(ModuleReport(Ma, ReportType)) else: + self._IsModuleBuild = False for Pa in Wa.AutoGenObjectList: for ModuleKey in Pa.Platform.Modules: self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType)) @@ -1343,18 +1347,20 @@ class PlatformReport(object): FileWrite(File, "Build Duration: %s" % BuildDuration) FileWrite(File, "Report Content: %s" % ", ".join(ReportType)) - if "PCD" in ReportType: - self.PcdReport.GenerateReport(File, None) - - if "FLASH" in ReportType: - for FdReportListItem in self.FdReportList: - FdReportListItem.GenerateReport(File) + if not self._IsModuleBuild: + if "PCD" in ReportType: + self.PcdReport.GenerateReport(File, None) + + if "FLASH" in ReportType: + for FdReportListItem in self.FdReportList: + FdReportListItem.GenerateReport(File) for ModuleReportItem in self.ModuleReportList: ModuleReportItem.GenerateReport(File, self.PcdReport, self.PredictionReport, ReportType) - if "EXECUTION_ORDER" in ReportType: - self.PredictionReport.GenerateReport(File, None) + if not self._IsModuleBuild: + if "EXECUTION_ORDER" in ReportType: + self.PredictionReport.GenerateReport(File, None) ## BuildReport class # @@ -1422,7 +1428,7 @@ class BuildReport(object): EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False) EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc())) File.close() - + # This acts like the main() function for the script, unless it is 'import'ed into another script. if __name__ == '__main__': pass diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py index e3a3dd9f3f..6129308011 100644 --- a/BaseTools/Source/Python/build/build.py +++ b/BaseTools/Source/Python/build/build.py @@ -1090,9 +1090,10 @@ class Build(): ## Collect MAP information of all FVs # - def _CollectFvMapBuffer (self, MapBuffer, Wa): + def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList): if self.Fdf != '': # First get the XIP base address for FV map file. + GuidPattern = re.compile("[-a-fA-F0-9]+") for FvName in Wa.FdfProfile.FvDict.keys(): FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map') if not os.path.exists(FvMapBuffer): @@ -1103,7 +1104,16 @@ class Build(): FvMap.readline() FvMap.readline() FvMap.readline() - MapBuffer.write(FvMap.read()) + for Line in FvMap: + MatchGuid = GuidPattern.match(Line) + if MatchGuid != None: + # + # Replace GUID with module name + # + GuidString = MatchGuid.group() + if GuidString.upper() in ModuleList: + Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name) + MapBuffer.write('%s' % (Line)) FvMap.close() ## Collect MAP information of all modules @@ -1124,7 +1134,8 @@ class Build(): IsIpfPlatform = False if 'IPF' in self.ArchList: IsIpfPlatform = True - for Module in ModuleList: + for ModuleGuid in ModuleList: + Module = ModuleList[ModuleGuid] GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget) OutputImageFile = '' @@ -1259,7 +1270,8 @@ class Build(): # SaveFileOnChange(MapFilePath, MapBuffer.getvalue(), False) MapBuffer.close() - sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath)) + if self.LoadFixAddress != 0: + sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath)) sys.stdout.flush() ## Build active platform for different build targets and different tool chains @@ -1286,7 +1298,7 @@ class Build(): self._Build(self.Target, Wa) # Create MAP file when Load Fix Address is enabled. - if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0: + if self.Target in ["", "all", "fds"]: for Arch in self.ArchList: # # Check whether the set fix address is above 4G for 32bit image. @@ -1296,19 +1308,20 @@ class Build(): # # Get Module List # - ModuleList = [] + ModuleList = {} for Pa in Wa.AutoGenObjectList: for Ma in Pa.ModuleAutoGenList: if Ma == None: continue if not Ma.IsLibrary: - ModuleList.append (Ma) + ModuleList[Ma.Guid.upper()] = Ma MapBuffer = StringIO('') - # - # Rebase module to the preferred memory address before GenFds - # - self._CollectModuleMapBuffer(MapBuffer, ModuleList) + if self.LoadFixAddress != 0: + # + # Rebase module to the preferred memory address before GenFds + # + self._CollectModuleMapBuffer(MapBuffer, ModuleList) if self.Fdf != '': # # create FDS again for the updated EFI image @@ -1317,7 +1330,7 @@ class Build(): # # Create MAP file for all platform FVs after GenFds. # - self._CollectFvMapBuffer(MapBuffer, Wa) + self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList) # # Save MAP buffer into MAP file. # @@ -1367,7 +1380,7 @@ class Build(): ExtraData=self.ModuleFile ) # Create MAP file when Load Fix Address is enabled. - if self.LoadFixAddress != 0 and self.Target == "fds" and self.Fdf != '': + if self.Target == "fds" and self.Fdf != '': for Arch in self.ArchList: # # Check whether the set fix address is above 4G for 32bit image. @@ -1377,27 +1390,28 @@ class Build(): # # Get Module List # - ModuleList = [] + ModuleList = {} for Pa in Wa.AutoGenObjectList: for Ma in Pa.ModuleAutoGenList: if Ma == None: continue if not Ma.IsLibrary: - ModuleList.append (Ma) + ModuleList[Ma.Guid.upper()] = Ma MapBuffer = StringIO('') - # - # Rebase module to the preferred memory address before GenFds - # - self._CollectModuleMapBuffer(MapBuffer, ModuleList) - # - # create FDS again for the updated EFI image - # - self._Build("fds", Wa) + if self.LoadFixAddress != 0: + # + # Rebase module to the preferred memory address before GenFds + # + self._CollectModuleMapBuffer(MapBuffer, ModuleList) + # + # create FDS again for the updated EFI image + # + self._Build("fds", Wa) # # Create MAP file for all platform FVs after GenFds. # - self._CollectFvMapBuffer(MapBuffer, Wa) + self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList) # # Save MAP buffer into MAP file. # @@ -1483,7 +1497,7 @@ class Build(): EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule) # Create MAP file when Load Fix Address is enabled. - if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0: + if self.Target in ["", "all", "fds"]: for Arch in self.ArchList: # # Check whether the set fix address is above 4G for 32bit image. @@ -1493,30 +1507,31 @@ class Build(): # # Get Module List # - ModuleList = [] + ModuleList = {} for Pa in Wa.AutoGenObjectList: for Ma in Pa.ModuleAutoGenList: if Ma == None: continue if not Ma.IsLibrary: - ModuleList.append (Ma) + ModuleList[Ma.Guid.upper()] = Ma # # Rebase module to the preferred memory address before GenFds # MapBuffer = StringIO('') - self._CollectModuleMapBuffer(MapBuffer, ModuleList) + if self.LoadFixAddress != 0: + self._CollectModuleMapBuffer(MapBuffer, ModuleList) # Generate FD image if there's a FDF file found if self.Fdf != '' and self.Target in ["", "all", "fds"]: LaunchCommand(Wa.BuildCommand + ["fds"], Wa.MakeFileDir) # Create MAP file for all platform FV after GenFds - if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0: + if self.Target in ["", "all", "fds"]: if self.Fdf != '': # # Create MAP file for all platform FVs after GenFds. # - self._CollectFvMapBuffer(MapBuffer, Wa) + self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList) # # Save MAP buffer into MAP file. # -- cgit v1.2.3