]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Sync EDKII BaseTools to BaseTools project r2006.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 3 Aug 2010 03:29:17 +0000 (03:29 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 3 Aug 2010 03:29:17 +0000 (03:29 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10764 6f19259b-4bc3-4df7-8a09-765794883524

24 files changed:
BaseTools/Bin/Win32/BootSectImage.exe
BaseTools/Bin/Win32/EfiLdrImage.exe
BaseTools/Bin/Win32/EfiRom.exe
BaseTools/Bin/Win32/GenBootSector.exe
BaseTools/Bin/Win32/GenCrc32.exe
BaseTools/Bin/Win32/GenFfs.exe
BaseTools/Bin/Win32/GenFv.exe
BaseTools/Bin/Win32/GenFw.exe
BaseTools/Bin/Win32/GenPage.exe
BaseTools/Bin/Win32/GenSec.exe
BaseTools/Bin/Win32/GenVtf.exe
BaseTools/Bin/Win32/LzmaCompress.exe
BaseTools/Bin/Win32/Split.exe
BaseTools/Bin/Win32/TianoCompress.exe
BaseTools/Bin/Win32/VfrCompile.exe
BaseTools/Bin/Win32/VolInfo.exe
BaseTools/Bin/Win32/build.exe
BaseTools/Conf/build_rule.template
BaseTools/Source/C/GenFw/Elf32Convert.c
BaseTools/Source/C/GenFw/elf_common.h
BaseTools/Source/Python/AutoGen/GenC.py
BaseTools/Source/Python/AutoGen/GenMake.py
BaseTools/Source/Python/AutoGen/StrGather.py
BaseTools/Source/Python/AutoGen/UniClassObject.py

index 433d8de593f06dd22ecf2deeb0e605931931a535..0ddaa55734075c429a64f19b39379db8a96d91de 100755 (executable)
Binary files a/BaseTools/Bin/Win32/BootSectImage.exe and b/BaseTools/Bin/Win32/BootSectImage.exe differ
index ab8e438560c53cde50db425e03aa5a020b393946..d18067e721824ab1f5522bba6cf7e273ed56e1db 100755 (executable)
Binary files a/BaseTools/Bin/Win32/EfiLdrImage.exe and b/BaseTools/Bin/Win32/EfiLdrImage.exe differ
index 7c2fd61ad55643733eeef12645e6ac8e90012be1..700e3ba72b25c85e00c7e36ed8c513f4c6a844e5 100755 (executable)
Binary files a/BaseTools/Bin/Win32/EfiRom.exe and b/BaseTools/Bin/Win32/EfiRom.exe differ
index 3e37a4fa7545136c6ffef62964c8c724e5be488c..0dac396e6e028c3e3443f07ae5c7527abf5d85fd 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenBootSector.exe and b/BaseTools/Bin/Win32/GenBootSector.exe differ
index bd6ba314d24fcf616fee155568d97f4cd6a23dee..6bac0d00cd31b5a82ffd5d487e8a48e3e32f1f3c 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenCrc32.exe and b/BaseTools/Bin/Win32/GenCrc32.exe differ
index 914875176eaa2064775917570e4082d54d26b763..e7dae7a7b0ba615281b514a196693a25d1987849 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenFfs.exe and b/BaseTools/Bin/Win32/GenFfs.exe differ
index fade8eee6a90bd73be3387278f8634fa9c183840..240101306c26c94ad66fc9273ab91564b04eeac2 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenFv.exe and b/BaseTools/Bin/Win32/GenFv.exe differ
index 0130d6396b65146c097848a8b251c940960b7dd1..6ec43f4728df34a4b89dd0004d3341b650672a10 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenFw.exe and b/BaseTools/Bin/Win32/GenFw.exe differ
index 5850eede9e7d6549dbf8ba5439382f19d8e62609..8a03a51e970078305785ab7a8940ead298c7c1a9 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenPage.exe and b/BaseTools/Bin/Win32/GenPage.exe differ
index d3eb98e31df7255932839e6763908da1b86c968a..9cd22fe9e487a2a4449b8ffbe2025060228ad667 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenSec.exe and b/BaseTools/Bin/Win32/GenSec.exe differ
index 98f677a765611e974d19c053f2f9531cb54faf05..ab2b374d2848fb28782a8d17f20adccdbb6b8e04 100755 (executable)
Binary files a/BaseTools/Bin/Win32/GenVtf.exe and b/BaseTools/Bin/Win32/GenVtf.exe differ
index 34f753c890d26fca37663e1feaf97243489b102b..edca459e3f57150543b015eea46d78f3033fcc96 100755 (executable)
Binary files a/BaseTools/Bin/Win32/LzmaCompress.exe and b/BaseTools/Bin/Win32/LzmaCompress.exe differ
index b73d3d1a39100fee22690792285f4a882cadc6e8..0ff13016c34c141f8fa494f99ec86132d3363111 100755 (executable)
Binary files a/BaseTools/Bin/Win32/Split.exe and b/BaseTools/Bin/Win32/Split.exe differ
index 728af8b25f70bbfb7b6d1c9d9a8ec44e153ec211..f106424ec16e9a216ca541527c6aafd8f5667c0c 100755 (executable)
Binary files a/BaseTools/Bin/Win32/TianoCompress.exe and b/BaseTools/Bin/Win32/TianoCompress.exe differ
index 7885c5656800f03a16a7ecb45729f3d21a435e6c..daf66f23c54a84503149a64071c9e20989b93919 100755 (executable)
Binary files a/BaseTools/Bin/Win32/VfrCompile.exe and b/BaseTools/Bin/Win32/VfrCompile.exe differ
index 3a6b1e946f2458a005d91fb955c265533f61b3f8..a470075e481eddcf437a1ed6de436b7697387c64 100755 (executable)
Binary files a/BaseTools/Bin/Win32/VolInfo.exe and b/BaseTools/Bin/Win32/VolInfo.exe differ
index d73c4faeeea9d3c96152ee5a994ec5fd01482ae2..54a323996dab3f966ed6d76eea68b699006c5446 100755 (executable)
Binary files a/BaseTools/Bin/Win32/build.exe and b/BaseTools/Bin/Win32/build.exe differ
index 139289ee171b05d65f264d9cbd7fb3fb8398691f..70f510aed7b67eea405ec5bc9a86674db8a06fc9 100644 (file)
 \r
     <Command.MSFT, Command.INTEL>\r
         cd $(OUTPUT_DIR)(+)${s_dir}\r
-        "$(ASM16)" /nologo /c /omf /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj ${src}\r
+        "$(ASM16)" /nologo /c /omf $(INC) /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj ${src}\r
         "$(ASMLINK)" $(ASMLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj,${dst},,,,\r
 \r
     <Command.GCC>\r
index 9e4a9a2c9a2a55fb25ee04b99a865bf65d715427..539fdf560a4a37afbef509375c85703f539036a4 100644 (file)
@@ -632,6 +632,7 @@ WriteSections32 (
           switch (ELF32_R_TYPE(Rel->r_info)) {
           case R_ARM_RBASE:
             // No relocation - no action required
+            // break skipped
 
           case R_ARM_PC24:
           case R_ARM_XPC25:
@@ -639,6 +640,35 @@ WriteSections32 (
           case R_ARM_THM_JUMP19:
           case R_ARM_CALL:
           case R_ARM_JMP24:
+          case R_ARM_THM_JUMP24:  
+          case R_ARM_PREL31:  
+          case R_ARM_MOVW_PREL_NC:  
+          case R_ARM_MOVT_PREL:
+          case R_ARM_THM_MOVW_PREL_NC:
+          case R_ARM_THM_MOVT_PREL:
+          case R_ARM_THM_JMP6:
+          case R_ARM_THM_ALU_PREL_11_0:
+          case R_ARM_THM_PC12:
+          case R_ARM_REL32_NOI:
+          case R_ARM_ALU_PC_G0_NC:\r
+          case R_ARM_ALU_PC_G0:\r
+          case R_ARM_ALU_PC_G1_NC:\r
+          case R_ARM_ALU_PC_G1:\r
+          case R_ARM_ALU_PC_G2:\r
+          case R_ARM_LDR_PC_G1:\r
+          case R_ARM_LDR_PC_G2:\r
+          case R_ARM_LDRS_PC_G0:\r
+          case R_ARM_LDRS_PC_G1:\r
+          case R_ARM_LDRS_PC_G2:\r
+          case R_ARM_LDC_PC_G0:\r
+          case R_ARM_LDC_PC_G1:\r
+          case R_ARM_LDC_PC_G2:
+          case R_ARM_GOT_PREL:
+          case R_ARM_THM_JUMP11:
+          case R_ARM_THM_JUMP8:
+          case R_ARM_TLS_GD32:
+          case R_ARM_TLS_LDM32:
+          case R_ARM_TLS_IE32:
             // Thease are all PC-relative relocations and don't require modification
             // GCC does not seem to have the concept of a application that just needs to get relocated.
             break;
@@ -736,14 +766,45 @@ WriteRelocations32 (
             }
           } else if (mEhdr->e_machine == EM_ARM) {
             switch (ELF32_R_TYPE(Rel->r_info)) {
-            case R_ARM_RBASE: 
+            case R_ARM_RBASE:
               // No relocation - no action required
+              // break skipped
+
             case R_ARM_PC24:
             case R_ARM_XPC25:
             case R_ARM_THM_PC22:
             case R_ARM_THM_JUMP19:
             case R_ARM_CALL:
             case R_ARM_JMP24:
+            case R_ARM_THM_JUMP24:  
+            case R_ARM_PREL31:  
+            case R_ARM_MOVW_PREL_NC:  
+            case R_ARM_MOVT_PREL:
+            case R_ARM_THM_MOVW_PREL_NC:
+            case R_ARM_THM_MOVT_PREL:
+            case R_ARM_THM_JMP6:
+            case R_ARM_THM_ALU_PREL_11_0:
+            case R_ARM_THM_PC12:
+            case R_ARM_REL32_NOI:
+            case R_ARM_ALU_PC_G0_NC:\r
+            case R_ARM_ALU_PC_G0:\r
+            case R_ARM_ALU_PC_G1_NC:\r
+            case R_ARM_ALU_PC_G1:\r
+            case R_ARM_ALU_PC_G2:\r
+            case R_ARM_LDR_PC_G1:\r
+            case R_ARM_LDR_PC_G2:\r
+            case R_ARM_LDRS_PC_G0:\r
+            case R_ARM_LDRS_PC_G1:\r
+            case R_ARM_LDRS_PC_G2:\r
+            case R_ARM_LDC_PC_G0:\r
+            case R_ARM_LDC_PC_G1:\r
+            case R_ARM_LDC_PC_G2:
+            case R_ARM_GOT_PREL:
+            case R_ARM_THM_JUMP11:
+            case R_ARM_THM_JUMP8:
+            case R_ARM_TLS_GD32:
+            case R_ARM_TLS_LDM32:
+            case R_ARM_TLS_IE32:
               // Thease are all PC-relative relocations and don't require modification
               break;
 
index d53f98b679989f7d6a5583d0bbb5b897022e6977..9618d48524395cf876af7807fc2d35afa6f18362 100644 (file)
@@ -602,6 +602,38 @@ typedef struct {
 #define R_ARM_THM_MOVW_ABS_NC 47 
 #define R_ARM_THM_MOVT_ABS    48
 
+// Block of PC-relative relocations added to work around gcc putting
+// object relocations in static executables.
+#define R_ARM_THM_JUMP24        30  
+#define R_ARM_PREL31            42  
+#define R_ARM_MOVW_PREL_NC      45  
+#define R_ARM_MOVT_PREL         46
+#define R_ARM_THM_MOVW_PREL_NC  49
+#define R_ARM_THM_MOVT_PREL     50
+#define R_ARM_THM_JMP6          52
+#define R_ARM_THM_ALU_PREL_11_0 53
+#define R_ARM_THM_PC12          54
+#define R_ARM_REL32_NOI         56
+#define R_ARM_ALU_PC_G0_NC         57\r
+#define R_ARM_ALU_PC_G0                58\r
+#define R_ARM_ALU_PC_G1_NC         59\r
+#define R_ARM_ALU_PC_G1                60\r
+#define R_ARM_ALU_PC_G2         61\r
+#define R_ARM_LDR_PC_G1                62\r
+#define R_ARM_LDR_PC_G2                63\r
+#define R_ARM_LDRS_PC_G0             64\r
+#define R_ARM_LDRS_PC_G1             65\r
+#define R_ARM_LDRS_PC_G2             66\r
+#define R_ARM_LDC_PC_G0                67\r
+#define R_ARM_LDC_PC_G1                68\r
+#define R_ARM_LDC_PC_G2                69
+#define R_ARM_GOT_PREL          96
+#define R_ARM_THM_JUMP11       102
+#define R_ARM_THM_JUMP8        103
+#define R_ARM_TLS_GD32         104
+#define R_ARM_TLS_LDM32        105
+#define R_ARM_TLS_IE32         107
+
 #define R_ARM_THM_JUMP19    51
 #define        R_ARM_GNU_VTENTRY       100
 #define        R_ARM_GNU_VTINHERIT     101
@@ -612,6 +644,8 @@ typedef struct {
 #define        R_ARM_RPC24             254
 #define        R_ARM_RBASE             255
 
+
+
 /*     Name                    Value      Field        Calculation */
 #define        R_IA_64_NONE            0       /* None */
 #define        R_IA_64_IMM14           0x21    /* immediate14  S + A */
index f0f92b08658fca089829717bb1f092e473cdd7af..1db68ebec5236c94623524585155bccc5fb2704b 100644 (file)
@@ -1888,7 +1888,7 @@ def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH, UniGenCFlag, UniGenBinBuff
     else:
         ShellMode = False
 
-    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer)
+    Header, Code = GetStringFiles(Info.UnicodeFileList, SrcList, IncList, Info.IncludePathList, ['.uni', '.inf'], Info.Name, CompatibleMode, ShellMode, UniGenCFlag, UniGenBinBuffer)
     if CompatibleMode or UniGenCFlag:
         AutoGenC.Append("\n//\n//Unicode String Pack Definition\n//\n")
         AutoGenC.Append(Code)
index e3f5c2b6ecdea07ffb37ac560347e175e034ddba..2e18f6771c79e699e7fc8369073b02886f59e6c7 100644 (file)
@@ -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]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE|re.IGNORECASE)
 
 ## Regular expression for matching macro used in header file inclusion
 gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)
@@ -754,6 +754,7 @@ cleanlib:
 
                 CurrentFilePath = F.Dir
                 for Inc in IncludedFileList:
+                    Inc = Inc.strip()
                     # if there's macro used to reference header file, expand it
                     HeaderList = gMacroPattern.findall(Inc)
                     if len(HeaderList) == 1 and len(HeaderList[0]) == 2:
index 1759da72dd96ae646cc183115f0f4b7e4a757a5b..52ab439e9b0b5129d5a827fabb93532f8017834d 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -168,6 +168,8 @@ def CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):
     Str = WriteLine(Str, Line)\r
     Line = COMMENT_DEFINE_STR + ' ' + PRINTABLE_LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + PRINTABLE_LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(1, 4) + COMMENT_NOT_REFERENCED\r
     Str = WriteLine(Str, Line)\r
+\r
+    #Group the referred STRING token together. \r
     for Index in range(2, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]])):\r
         StringItem = UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]][Index]\r
         Name = StringItem.StringName\r
@@ -180,12 +182,22 @@ def CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):
                     Line = DEFINE_STR + ' ' + Name + ' ' + DecToHexStr(Token, 4)\r
                 else:\r
                     Line = DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4)\r
-            else:\r
+                Str = WriteLine(Str, Line)\r
+\r
+    #Group the unused STRING token together.\r
+    for Index in range(2, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]])):\r
+        StringItem = UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]][Index]\r
+        Name = StringItem.StringName\r
+        Token = StringItem.Token\r
+        Referenced = StringItem.Referenced\r
+        if Name != None:\r
+            Line = ''\r
+            if Referenced == False:\r
                 if (ValueStartPtr - len(DEFINE_STR + Name)) <= 0:\r
                     Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
                 else:\r
                     Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
-            Str = WriteLine(Str, Line)\r
+                Str = WriteLine(Str, Line)\r
 \r
     Str = WriteLine(Str, '')\r
     if IsCompatibleMode or UniGenCFlag:\r
@@ -506,7 +518,7 @@ def SearchString(UniObjectClass, FileList, IsCompatibleMode):
 # This function is used for UEFI2.1 spec\r
 #\r
 #\r
-def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None):\r
+def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None):\r
     Status = True\r
     ErrorMessage = ''\r
 \r
@@ -515,15 +527,15 @@ def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName,
             #\r
             # support ISO 639-2 codes in .UNI files of EDK Shell\r
             #\r
-            Uni = UniFileClassObject(UniFilList, True)\r
+            Uni = UniFileClassObject(sorted (UniFilList), True, IncludePathList)\r
         else:\r
-            Uni = UniFileClassObject(UniFilList, IsCompatibleMode)\r
+            Uni = UniFileClassObject(sorted (UniFilList), IsCompatibleMode, IncludePathList)\r
     else:\r
         EdkLogger.error("UnicodeStringGather", AUTOGEN_ERROR, 'No unicode files given')\r
 \r
     FileList = GetFileList(SourceFileList, IncludeList, SkipList)\r
 \r
-    Uni = SearchString(Uni, FileList, IsCompatibleMode)\r
+    Uni = SearchString(Uni, sorted (FileList), IsCompatibleMode)\r
 \r
     HFile = CreateHFile(BaseName, Uni, IsCompatibleMode, UniGenCFlag)\r
     CFile = None\r
index 8f929a33cba93214b65df073f4fdc0a79cc45299..76a0549a751c8d574d297ae54637895c0571a406 100644 (file)
@@ -177,18 +177,24 @@ class StringDefClassObject(object):
                repr(self.StringValue) + ' ' + \\r
                repr(self.UseOtherLangDef)\r
 \r
+    def UpdateValue(self, Value = None):\r
+        if Value != None:\r
+            self.StringValue = Value + u'\x00'        # Add a NULL at string tail\r
+            self.StringValueByteList = UniToHexList(self.StringValue)\r
+            self.Length = len(self.StringValueByteList)\r
+\r
 ## UniFileClassObject\r
 #\r
 # A structure for .uni file definition\r
 #\r
 class UniFileClassObject(object):\r
-    def __init__(self, FileList = [], IsCompatibleMode = False):\r
+    def __init__(self, FileList = [], IsCompatibleMode = False, IncludePathList = []):\r
         self.FileList = FileList\r
         self.Token = 2\r
         self.LanguageDef = []                   #[ [u'LanguageIdentifier', u'PrintableName'], ... ]\r
         self.OrderedStringList = {}             #{ u'LanguageIdentifier' : [StringDefClassObject]  }\r
         self.IsCompatibleMode = IsCompatibleMode\r
-\r
+        self.IncludePathList = IncludePathList\r
         if len(self.FileList) > 0:\r
             self.LoadUniFiles(FileList)\r
 \r
@@ -226,6 +232,21 @@ class UniFileClassObject(object):
         self.AddStringToList(u'$LANGUAGE_NAME', LangName, LangName, 0, True, Index=0)\r
         self.AddStringToList(u'$PRINTABLE_LANGUAGE_NAME', LangName, LangPrintName, 1, True, Index=1)\r
 \r
+        if not IsLangInDef:\r
+            #\r
+            # The found STRING tokens will be added into new language string list\r
+            # so that the unique STRING identifier is reserved for all languages in the package list. \r
+            #\r
+            FirstLangName = self.LanguageDef[0][0]\r
+            if LangName != FirstLangName:\r
+                for Index in range (2, len (self.OrderedStringList[FirstLangName])):\r
+                    Item = self.OrderedStringList[FirstLangName][Index]\r
+                    if Item.UseOtherLangDef != '':\r
+                        OtherLang = Item.UseOtherLangDef\r
+                    else:\r
+                        OtherLang = FirstLangName\r
+                    self.OrderedStringList[LangName].append (StringDefClassObject(Item.StringName, '', Item.Referenced, Item.Token, OtherLang))\r
+\r
         return True\r
 \r
     #\r
@@ -266,7 +287,6 @@ class UniFileClassObject(object):
         if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
             EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, ExtraData=File.Path)\r
 \r
-        Dir = File.Dir\r
         try:\r
             FileIn = codecs.open(File.Path, mode='rb', encoding='utf-16').readlines()\r
         except UnicodeError, X:\r
@@ -309,7 +329,13 @@ class UniFileClassObject(object):
 \r
             IncList = gIncludePattern.findall(Line)\r
             if len(IncList) == 1:\r
-                Lines.extend(self.PreProcess(PathClass(str(IncList[0]), Dir)))\r
+                for Dir in [File.Dir] + self.IncludePathList:\r
+                    IncFile = PathClass(str(IncList[0]), Dir)\r
+                    if os.path.isfile(IncFile.Path):\r
+                        Lines.extend(self.PreProcess(IncFile))\r
+                        break\r
+                else:\r
+                    EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, Message="Cannot find include file", ExtraData=str(IncList[0]))\r
                 continue\r
 \r
             Lines.append(Line)\r
@@ -421,15 +447,30 @@ class UniFileClassObject(object):
         if Language not in self.OrderedStringList:\r
             self.OrderedStringList[Language] = []\r
 \r
-        IsAdded = False\r
+        IsAdded = True\r
         for Item in self.OrderedStringList[Language]:\r
             if Name == Item.StringName:\r
-                IsAdded = True\r
+                IsAdded = False\r
+                if Value != None:\r
+                    Item.UpdateValue(Value)\r
+                    Item.UseOtherLangDef = ''\r
                 break\r
-        if not IsAdded:\r
+\r
+        if IsAdded:\r
             Token = len(self.OrderedStringList[Language])\r
             if Index == -1:\r
                 self.OrderedStringList[Language].append(StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
+                for LangName in self.LanguageDef:\r
+                    #\r
+                    # New STRING token will be added into all language string lists.\r
+                    # so that the unique STRING identifier is reserved for all languages in the package list. \r
+                    #\r
+                    if LangName[0] != Language:\r
+                        if UseOtherLangDef != '':\r
+                            OtherLangDef = UseOtherLangDef\r
+                        else:\r
+                            OtherLangDef = Language\r
+                        self.OrderedStringList[LangName[0]].append(StringDefClassObject(Name, '', Referenced, Token, OtherLangDef))\r
             else:\r
                 self.OrderedStringList[Language].insert(Index, StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
 \r
@@ -437,11 +478,15 @@ class UniFileClassObject(object):
     # Set the string as referenced\r
     #\r
     def SetStringReferenced(self, Name):\r
-        for Lang in self.OrderedStringList:\r
-            for Item in self.OrderedStringList[Lang]:\r
-                if Name == Item.StringName:\r
-                    Item.Referenced = True\r
-                    break\r
+        #\r
+        # String stoken are added in the same order in all language string lists.\r
+        # So, only update the status of string stoken in first language string list.\r
+        #\r
+        Lang = self.LanguageDef[0][0]\r
+        for Item in self.OrderedStringList[Lang]:\r
+            if Name == Item.StringName:\r
+                Item.Referenced = True\r
+                break\r
     #\r
     # Search the string in language definition by Name\r
     #\r
@@ -467,61 +512,36 @@ class UniFileClassObject(object):
     #\r
     def ReToken(self):\r
         #\r
-        # Search each string to find if it is defined for each language\r
-        # Use secondary language value to replace if missing in any one language\r
-        #\r
-        for IndexI in range(0, len(self.LanguageDef)):\r
-            LangKey = self.LanguageDef[IndexI][0]\r
-            for Item in self.OrderedStringList[LangKey]:\r
-                Name = Item.StringName\r
-                Value = Item.StringValue[0:-1]\r
-                Referenced = Item.Referenced\r
-                Index = self.OrderedStringList[LangKey].index(Item)\r
-                for IndexJ in range(0, len(self.LanguageDef)):\r
-                    LangFind = self.LanguageDef[IndexJ][0]\r
-                    if self.FindStringValue(Name, LangFind) == None:\r
-                        EdkLogger.debug(EdkLogger.DEBUG_5, Name)\r
-                        Token = len(self.OrderedStringList[LangFind])\r
-                        self.AddStringToList(Name, LangFind, Value, Token, Referenced, LangKey, Index)\r
-        #\r
-        # Retoken\r
+        # Retoken all language strings according to the status of string stoken in the first language string.\r
         #\r
-        # First re-token the first language\r
-        LangName = self.LanguageDef[0][0]\r
-        ReferencedStringList = []\r
-        NotReferencedStringList = []\r
-        Token = 0\r
+        FirstLangName = self.LanguageDef[0][0]\r
 \r
         #\r
-        # Order UNI token by their String Name\r
+        # Use small token for all referred string stoken.\r
         #\r
-        StringNameList = []\r
-        for Item in self.OrderedStringList[LangName]:\r
-            StringNameList.append (Item.StringName)\r
-        StringNameList.sort()\r
-\r
-        for Name in StringNameList:\r
-            Item = self.FindStringValue (Name, LangName)\r
-            if Item.Referenced == True:\r
-                Item.Token = Token\r
-                ReferencedStringList.append(Item)\r
-                Token = Token + 1\r
-            else:\r
-                NotReferencedStringList.append(Item)\r
-        self.OrderedStringList[LangName] = ReferencedStringList\r
-        for Index in range(len(NotReferencedStringList)):\r
-            NotReferencedStringList[Index].Token = Token + Index\r
-            self.OrderedStringList[LangName].append(NotReferencedStringList[Index])\r
+        RefToken = 0\r
+        for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+            FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+            if FirstLangItem.Referenced == True:\r
+                for LangNameItem in self.LanguageDef:\r
+                    LangName = LangNameItem[0]\r
+                    OtherLangItem = self.OrderedStringList[LangName][Index]\r
+                    OtherLangItem.Referenced = True\r
+                    OtherLangItem.Token = RefToken\r
+                RefToken = RefToken + 1\r
 \r
         #\r
-        # Adjust the orders of other languages\r
+        # Use big token for all unreferred string stoken.\r
         #\r
-        for IndexOfLanguage in range(1, len(self.LanguageDef)):\r
-            for OrderedString in self.OrderedStringList[LangName]:\r
-                for UnOrderedString in self.OrderedStringList[self.LanguageDef[IndexOfLanguage][0]]:\r
-                    if OrderedString.StringName == UnOrderedString.StringName:\r
-                        UnOrderedString.Token = OrderedString.Token\r
-                        break\r
+        UnRefToken = 0\r
+        for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+            FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+            if FirstLangItem.Referenced == False:\r
+                for LangNameItem in self.LanguageDef:\r
+                    LangName = LangNameItem[0]\r
+                    OtherLangItem = self.OrderedStringList[LangName][Index]\r
+                    OtherLangItem.Token = RefToken + UnRefToken\r
+                UnRefToken = UnRefToken + 1\r
 \r
     #\r
     # Show the instance itself\r