]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Modify autogen code for DynamicEx type PCD.
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 20 Jun 2006 17:10:21 +0000 (17:10 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 20 Jun 2006 17:10:21 +0000 (17:10 +0000)
1) Roll back PcdSetEx/PcdGetEx macro, module developer must input the token space guid explicitly, because in a module maybe two PCD with same CName and token number but in different token space guid.
2) Modify the generated value for _PCD_MODE_xxx for DynamicEx PCD. This macro will be mapped to PcdLibSetEx/PcdLibGetEx directly, and the parameter of token space guid is auto generated.
3) For token space guid array variable autogened, only one copy will be exists in a module's autogen C file for different PCD which are in same token space guid.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@575 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Library/PcdLib.h
Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Tools/Source/GenBuild/org/tianocore/build/pcd/entity/UsageInstance.java

index 2cc0dbb4b61750b0020b3ecb78e97ba0ce211dde..c4e5502a0d065fff9c328aabd7a5c2430fa1dfb3 100644 (file)
@@ -77,12 +77,12 @@ Module Name: PcdLib.h
 //\r
 // Dynamic Ex is to support binary distribution\r
 //\r
-#define PcdGetEx8(TokenName)     LibPcdGetEx8 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx16(TokenName)    LibPcdGetEx16 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx32(TokenName)    LibPcdGetEx32 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetEx64(TokenName)    LibPcdGetEx64 (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetExPtr(TokenName)   LibPcdGetExPtr (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
-#define PcdGetExBool(TokenName)  LibPcdGetExBool (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx8(Guid, TokenName)     LibPcdGetEx8 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx16(Guid, TokenName)    LibPcdGetEx16 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx32(Guid, TokenName)    LibPcdGetEx32 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetEx64(Guid, TokenName)    LibPcdGetEx64 (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetExPtr(Guid, TokenName)   LibPcdGetExPtr (Guid, _PCD_TOKEN_##TokenName)\r
+#define PcdGetExBool(Guid, TokenName)  LibPcdGetExBool (Guid, _PCD_TOKEN_##TokenName)\r
 \r
 \r
 //\r
@@ -99,12 +99,12 @@ Module Name: PcdLib.h
 //\r
 // Dynamic Set Ex\r
 //\r
-#define PcdSetEx8(TokenName, Value)      LibPcdSetEx8   (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx16(TokenName, Value)     LibPcdSetEx16  (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx32(TokenName, Value)     LibPcdSetEx32  (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetEx64(TokenName, Value)     LibPcdSetEx64  (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
-#define PcdSetExPtr(TokenName, SizeOfBuffer, Buffer)    LibPcdSetExPtr (&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, SizeOfBuffer, Buffer)\r
-#define PcdSetExBool(TokenName, Value)   LibPcdSetExBool(&_gPcd_DynamicEx_TokenSpaceGuid_##TokenName, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx8(Guid, TokenName, Value)      LibPcdSetEx8   (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx16(Guid, TokenName, Value)     LibPcdSetEx16  (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx32(Guid, TokenName, Value)     LibPcdSetEx32  (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetEx64(Guid, TokenName, Value)     LibPcdSetEx64  (Guid, _PCD_TOKEN_##TokenName, Value)\r
+#define PcdSetExPtr(Guid, TokenName, SizeOfBuffer, Buffer)    LibPcdSetExPtr (Guid, _PCD_TOKEN_##TokenName, SizeOfBuffer, Buffer)\r
+#define PcdSetExBool(Guid, TokenName, Value)   LibPcdSetExBool(Guid, _PCD_TOKEN_##TokenName, Value)\r
 \r
 \r
 /**\r
index 796aff62c3ef1350d3d1fd2528847ed13ad5ab0d..dd33b540c1ffd3b70144ab50c9b4be5bff656450 100644 (file)
@@ -17,11 +17,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 package org.tianocore.build.pcd.action;\r
 \r
 import java.io.File;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
 import java.util.UUID;\r
-import java.util.ArrayList;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
 \r
 import org.apache.xmlbeans.XmlObject;\r
 import org.tianocore.build.global.GlobalData;\r
@@ -252,6 +254,10 @@ public class PCDAutoGenAction extends BuildAction {
     {\r
         int                   index, index2;\r
         List<UsageInstance>   usageInstanceArray, usageContext;\r
+        String[]              guidStringArray = null;\r
+        String                guidStringCName = null;\r
+        String                guidString      = null;\r
+        UsageInstance         usageInstance   = null;\r
 \r
         if (!isBuildUsedLibrary) {\r
             usageInstanceArray  = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
@@ -295,7 +301,6 @@ public class PCDAutoGenAction extends BuildAction {
             }\r
         }\r
 \r
-\r
         if(usageInstanceArray.size() != 0) {\r
             //\r
             // Add "#include 'PcdLib.h'" for Header file\r
@@ -303,16 +308,63 @@ public class PCDAutoGenAction extends BuildAction {
             hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
         }\r
 \r
+        //\r
+        // Generate all PCD entry for a module.\r
+        // \r
         for(index = 0; index < usageInstanceArray.size(); index ++) {\r
             ActionMessage.debug(this,\r
                                 "Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + \r
                                 "]: " + usageInstanceArray.get(index).parentToken.cName);\r
             try {\r
-                usageInstanceArray.get(index).generateAutoGen(isBuildUsedLibrary);\r
-                hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";\r
-                cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";\r
+                usageInstance = usageInstanceArray.get(index);\r
+                //\r
+                // Before generate any PCD information into autogen.h/autogen.c for a module,\r
+                // generate TokenSpaceGuid array variable firstly. For every dynamicEx type\r
+                // PCD in this module the token, they are all reference to TokenSpaceGuid \r
+                // array.\r
+                // \r
+                if (usageInstanceArray.get(index).modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+                    guidStringArray = usageInstance.parentToken.tokenSpaceName.toString().split("-");\r
+                    guidStringCName = "_gPcd_TokenSpaceGuid_" + \r
+                                      usageInstance.parentToken.tokenSpaceName.toString().replaceAll("-", "_");\r
+                    guidString      = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
+                                                    guidStringArray[0],\r
+                                                    guidStringArray[1],\r
+                                                    guidStringArray[2],\r
+                                                    (guidStringArray[3].substring(0, 2)),\r
+                                                    (guidStringArray[3].substring(2, 4)),\r
+                                                    (guidStringArray[4].substring(0, 2)),\r
+                                                    (guidStringArray[4].substring(2, 4)),\r
+                                                    (guidStringArray[4].substring(4, 6)),\r
+                                                    (guidStringArray[4].substring(6, 8)),\r
+                                                    (guidStringArray[4].substring(8, 10)),\r
+                                                    (guidStringArray[4].substring(10, 12)));\r
+                    if (!isBuildUsedLibrary) {\r
+                        Pattern pattern = Pattern.compile("(" + guidStringCName + ")+?");\r
+                        Matcher matcher = pattern.matcher(cAutoGenString + " ");\r
+                        //\r
+                        // Find whether this guid array variable has been generated into autogen.c\r
+                        // For different DyanmicEx pcd token who use same token space guid, the token space\r
+                        // guid array should be only generated once.\r
+                        // \r
+                        if (!matcher.find()) {\r
+                            cAutoGenString += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n",\r
+                                                            guidStringCName,\r
+                                                            guidString);\r
+                        }\r
+                    }\r
+                }\r
+\r
+                usageInstance.generateAutoGen(isBuildUsedLibrary);\r
+                //\r
+                // For every PCD entry for this module(usage instance), autogen string would\r
+                // be appand.\r
+                // \r
+                hAutoGenString += usageInstance.getHAutogenStr() + "\r\n";\r
+                cAutoGenString += usageInstance.getCAutogenStr();\r
+\r
             } catch(EntityException exp) {\r
-                throw new BuildActionException(exp.getMessage());\r
+                throw new BuildActionException("[PCD Autogen Error]: " + exp.getMessage());\r
             }\r
         }\r
 \r
@@ -343,8 +395,8 @@ public class PCDAutoGenAction extends BuildAction {
     **/\r
     public static void main(String argv[]) {\r
 \r
-        String WorkSpace = "M:/ForPcd/edk2";\r
-        String logFilePath = WorkSpace  + "/MdePkg/MdePkg.fpd";\r
+        String WorkSpace = "M:/tianocore/edk2";\r
+        String logFilePath = WorkSpace  + "/EdkNt32Pkg/Nt32.fpd";\r
         String[] nameArray = null;\r
 \r
         //\r
@@ -366,11 +418,11 @@ public class PCDAutoGenAction extends BuildAction {
         //\r
         // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
         //\r
-        PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",\r
-                                                              null,\r
+        PCDAutoGenAction autogenAction = new PCDAutoGenAction("MonoStatusCode",\r
                                                               null,\r
                                                               null,\r
                                                               null,\r
+                                                              "IA32",\r
                                                               null,\r
                                                               false,\r
                                                               nameArray);\r
@@ -379,10 +431,5 @@ public class PCDAutoGenAction extends BuildAction {
         System.out.println(autogenAction.OutputH());\r
         System.out.println("WQWQWQWQWQ");\r
         System.out.println(autogenAction.OutputC());\r
-\r
-\r
-        System.out.println (autogenAction.hAutoGenString);\r
-        System.out.println (autogenAction.cAutoGenString);\r
-\r
     }\r
 }\r
index 1a843968dfc44f62eeef3402f6ca581209605d30..cfbdb1e14960a27df4ca1ff17db7ac5d4fca79dc 100644 (file)
@@ -201,8 +201,7 @@ public class UsageInstance {
      */\r
     public void generateAutoGen(boolean isBuildUsedLibrary) \r
     throws EntityException {\r
-        String guidStringArray[] = null;\r
-        String guidString        = null;\r
+        String  guidStringCName  = null;\r
         boolean isByteArray      = false;\r
         String  printDatum       = null;\r
 \r
@@ -210,8 +209,6 @@ public class UsageInstance {
         cAutogenStr = "";\r
 \r
         if (this.modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
-            hAutogenStr += String.format("#define _PCD_LOCAL_TOKEN_%s   0x%016x\r\n", \r
-                                         parentToken.cName, parentToken.tokenNumber);\r
             hAutogenStr += String.format("#define _PCD_TOKEN_%s   0x%016x\r\n", \r
                                          parentToken.cName, parentToken.dynamicExTokenNumber);\r
         } else {\r
@@ -340,23 +337,12 @@ public class UsageInstance {
                                          parentToken.cName);\r
             break;\r
         case DYNAMIC_EX:\r
-            guidStringArray = parentToken.tokenSpaceName.toString().split("-");\r
-            guidString      = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
-                                            guidStringArray[0],\r
-                                            guidStringArray[1],\r
-                                            guidStringArray[2],\r
-                                            (guidStringArray[3].substring(0, 2)),\r
-                                            (guidStringArray[3].substring(2, 4)),\r
-                                            (guidStringArray[4].substring(0, 2)),\r
-                                            (guidStringArray[4].substring(2, 4)),\r
-                                            (guidStringArray[4].substring(4, 6)),\r
-                                            (guidStringArray[4].substring(6, 8)),\r
-                                            (guidStringArray[4].substring(8, 10)),\r
-                                            (guidStringArray[4].substring(10, 12)));\r
+            guidStringCName = "_gPcd_TokenSpaceGuid_" +\r
+                              parentToken.tokenSpaceName.toString().replaceAll("-", "_");\r
                                             \r
-            hAutogenStr += String.format("extern EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s;\r\n",\r
+            hAutogenStr += String.format("extern const EFI_GUID *_gPcd_DynamicEx_TokenSpaceGuid_%s;\r\n",\r
                                          parentToken.cName);\r
-            hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_LOCAL_TOKEN_%s)\r\n",\r
+            hAutogenStr += String.format("#define _PCD_MODE_%s_%s LibPcdGetEx%s(_gPcd_DynamicEx_TokenSpaceGuid_%s, _PCD_TOKEN_%s)\r\n",\r
                                          Token.GetAutogenDefinedatumTypeString(parentToken.datumType),\r
                                          parentToken.cName,\r
                                          Token.getAutogenLibrarydatumTypeString(parentToken.datumType),\r
@@ -364,9 +350,9 @@ public class UsageInstance {
                                          parentToken.cName);\r
 \r
             if (!isBuildUsedLibrary) {\r
-                cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID _gPcd_DynamicEx_TokenSpaceGuid_%s = %s;\r\n",\r
+                cAutogenStr += String.format("GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID *_gPcd_DynamicEx_TokenSpaceGuid_%s = &%s;\r\n",\r
                                              parentToken.cName,\r
-                                             guidString);\r
+                                             guidStringCName);\r
             }\r
             break;\r
         }\r