]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Misc.py
BaseTools: refactor Depex optomization
[mirror_edk2.git] / BaseTools / Source / Python / Common / Misc.py
index 60ae98c550a8e940566b8e7e17157a32991b861b..fe5a0b810166edcda6a798f1156408ba2ed7cea1 100644 (file)
@@ -42,6 +42,13 @@ import subprocess
 ## Regular expression used to find out place holders in string template\r
 gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
 \r
+## regular expressions for map file processing\r
+startPatternGeneral = re.compile("^Start[' ']+Length[' ']+Name[' ']+Class")\r
+addressPatternGeneral = re.compile("^Address[' ']+Publics by Value[' ']+Rva\+Base")\r
+valuePatternGcc = re.compile('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$')\r
+pcdPatternGcc = re.compile('^([\da-fA-Fx]+) +([\da-fA-Fx]+)')\r
+secReGeneral = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
+\r
 ## Dictionary used to store file time stamp for quick re-access\r
 gFileTimeStampCache = {}    # {file path : file time stamp}\r
 \r
@@ -84,6 +91,7 @@ def _parseForXcode(lines, efifilepath, varnames):
         if status == 1 and len(line) != 0:\r
             for varname in varnames:\r
                 if varname in line:\r
+                    # cannot pregenerate this RegEx since it uses varname from varnames.\r
                     m = re.match('^([\da-fA-FxX]+)([\s\S]*)([_]*%s)$' % varname, line)\r
                     if m is not None:\r
                         ret.append((varname, m.group(1)))\r
@@ -109,7 +117,7 @@ def _parseForGCC(lines, efifilepath, varnames):
 \r
         # status handler\r
         if status == 3:\r
-            m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line)\r
+            m = valuePatternGcc.match(line)\r
             if m is not None:\r
                 sections.append(m.groups(0))\r
             for varname in varnames:\r
@@ -122,7 +130,7 @@ def _parseForGCC(lines, efifilepath, varnames):
                     else:\r
                         Str = line[len(".data.%s" % varname):]\r
                     if Str:\r
-                        m = re.match('^([\da-fA-Fx]+) +([\da-fA-Fx]+)', Str.strip())\r
+                        m = pcdPatternGcc.match(Str.strip())\r
                         if m is not None:\r
                             varoffset.append((varname, int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0]))\r
 \r
@@ -150,22 +158,21 @@ def _parseGeneral(lines, efifilepath, varnames):
     status = 0    #0 - beginning of file; 1 - PE section definition; 2 - symbol table\r
     secs  = []    # key = section name\r
     varoffset = []\r
-    secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
     symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)\r
 \r
     for line in lines:\r
         line = line.strip()\r
-        if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line):\r
+        if startPatternGeneral.match(line):\r
             status = 1\r
             continue\r
-        if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line):\r
+        if addressPatternGeneral.match(line):\r
             status = 2\r
             continue\r
-        if re.match("^entry point at", line):\r
+        if line.startswith("entry point at"):\r
             status = 3\r
             continue        \r
         if status == 1 and len(line) != 0:\r
-            m =  secRe.match(line)\r
+            m =  secReGeneral.match(line)\r
             assert m is not None, "Fail to parse the section in map file , line is %s" % line\r
             sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)\r
             secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])\r
@@ -177,6 +184,7 @@ def _parseGeneral(lines, efifilepath, varnames):
                 sec_no     = int(sec_no,     16)\r
                 sym_offset = int(sym_offset, 16)\r
                 vir_addr   = int(vir_addr,   16)\r
+                # cannot pregenerate this RegEx since it uses varname from varnames.\r
                 m2 = re.match('^[_]*(%s)' % varname, sym_name)\r
                 if m2 is not None:\r
                     # fond a binary pcd entry in map file\r
@@ -1211,7 +1219,7 @@ class tdict:
 \r
 def IsFieldValueAnArray (Value):\r
     Value = Value.strip()\r
-    if Value.startswith('GUID') and Value.endswith(')'):\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
         return True\r
     if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
         return True\r
@@ -1308,7 +1316,7 @@ def ParseFieldValue (Value):
         if Size > 8:\r
             raise BadExpression('Value (%s) Size larger than %d' % (Value, Size))\r
         return Value, 8\r
-    if Value.startswith('GUID') and Value.endswith(')'):\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
         Value = Value.split('(', 1)[1][:-1].strip()\r
         if Value[0] == '{' and Value[-1] == '}':\r
             TmpValue = GuidStructureStringToGuidString(Value)\r
@@ -2079,20 +2087,7 @@ class SkuClass():
 # Pack a registry format GUID\r
 #\r
 def PackRegistryFormatGuid(Guid):\r
-    Guid = Guid.split('-')\r
-    return pack('=LHHBBBBBBBB',\r
-                int(Guid[0], 16),\r
-                int(Guid[1], 16),\r
-                int(Guid[2], 16),\r
-                int(Guid[3][-4:-2], 16),\r
-                int(Guid[3][-2:], 16),\r
-                int(Guid[4][-12:-10], 16),\r
-                int(Guid[4][-10:-8], 16),\r
-                int(Guid[4][-8:-6], 16),\r
-                int(Guid[4][-6:-4], 16),\r
-                int(Guid[4][-4:-2], 16),\r
-                int(Guid[4][-2:], 16)\r
-                )\r
+    return PackGUID(Guid.split('-'))\r
 \r
 ##  Get the integer value from string like "14U" or integer like 2\r
 #\r
@@ -2118,6 +2113,42 @@ def GetIntegerValue(Input):
     else:\r
         return int(String)\r
 \r
+#\r
+# Pack a GUID (registry format) list into a buffer and return it\r
+#\r
+def PackGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                int(Guid[0], 16),\r
+                int(Guid[1], 16),\r
+                int(Guid[2], 16),\r
+                int(Guid[3][-4:-2], 16),\r
+                int(Guid[3][-2:], 16),\r
+                int(Guid[4][-12:-10], 16),\r
+                int(Guid[4][-10:-8], 16),\r
+                int(Guid[4][-8:-6], 16),\r
+                int(Guid[4][-6:-4], 16),\r
+                int(Guid[4][-4:-2], 16),\r
+                int(Guid[4][-2:], 16)\r
+                )\r
+\r
+#\r
+# Pack a GUID (byte) list into a buffer and return it\r
+#\r
+def PackByteFormatGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                Guid[0],\r
+                Guid[1],\r
+                Guid[2],\r
+                Guid[3],\r
+                Guid[4],\r
+                Guid[5],\r
+                Guid[6],\r
+                Guid[7],\r
+                Guid[8],\r
+                Guid[9],\r
+                Guid[10],\r
+                )\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r