\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
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:
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;
}
} 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;
#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
#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 */
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)
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)
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:
-# 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
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
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
# 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
#\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
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
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
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
\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
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
# 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
#\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