]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/GenC.py
Sync BaseTool trunk (version r2610) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / GenC.py
index 2eb920417e2d5991d4cf085e380073064e722bad..63ba2b241eec259e428565e60ff98199a4574ad3 100644 (file)
@@ -1,7 +1,7 @@
 ## @file
 # Routines for generating AutoGen.h and AutoGen.c
 #
-# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
 # 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
@@ -22,6 +22,7 @@ from Common.DataType import *
 from Common.Misc import *
 from Common.String import StringToArray
 from StrGather import *
+from GenPcdDb import CreatePcdDatabaseCode
 
 ## PCD type string
 gItemTypeStringDatabase  = {
@@ -49,252 +50,6 @@ gDatumSizeStringDatabase = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64
 gDatumSizeStringDatabaseH = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'BOOL','VOID*':'PTR'}
 gDatumSizeStringDatabaseLib = {'UINT8':'8','UINT16':'16','UINT32':'32','UINT64':'64','BOOLEAN':'Bool','VOID*':'Ptr'}
 
-## Mapping between PCD driver type and EFI phase
-gPcdPhaseMap = {
-    "PEI_PCD_DRIVER"    :   "PEI",
-    "DXE_PCD_DRIVER"    :   "DXE"
-}
-
-gPcdDatabaseCommonAutoGenH = """
-//
-// The following definition will be generated by build tool
-//
-
-//
-// Common definitions
-//
-typedef UINT8 SKU_ID;
-
-#define PCD_TYPE_SHIFT        28
-
-#define PCD_TYPE_DATA         (0x0U << PCD_TYPE_SHIFT)
-#define PCD_TYPE_HII          (0x8U << PCD_TYPE_SHIFT)
-#define PCD_TYPE_VPD          (0x4U << PCD_TYPE_SHIFT)
-#define PCD_TYPE_SKU_ENABLED  (0x2U << PCD_TYPE_SHIFT)
-#define PCD_TYPE_STRING       (0x1U << PCD_TYPE_SHIFT)
-
-#define PCD_TYPE_ALL_SET      (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING)
-
-#define PCD_DATUM_TYPE_SHIFT  24
-
-#define PCD_DATUM_TYPE_POINTER  (0x0U << PCD_DATUM_TYPE_SHIFT)
-#define PCD_DATUM_TYPE_UINT8    (0x1U << PCD_DATUM_TYPE_SHIFT)
-#define PCD_DATUM_TYPE_UINT16   (0x2U << PCD_DATUM_TYPE_SHIFT)
-#define PCD_DATUM_TYPE_UINT32   (0x4U << PCD_DATUM_TYPE_SHIFT)
-#define PCD_DATUM_TYPE_UINT64   (0x8U << PCD_DATUM_TYPE_SHIFT)
-
-#define PCD_DATUM_TYPE_ALL_SET  (PCD_DATUM_TYPE_POINTER | \\
-                                 PCD_DATUM_TYPE_UINT8   | \\
-                                 PCD_DATUM_TYPE_UINT16  | \\
-                                 PCD_DATUM_TYPE_UINT32  | \\
-                                 PCD_DATUM_TYPE_UINT64)
-
-#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET))
-
-typedef struct  {
-  UINT32  ExTokenNumber;
-  UINT16  LocalTokenNumber;   // PCD Number of this particular platform build
-  UINT16  ExGuidIndex;        // Index of GuidTable
-} DYNAMICEX_MAPPING;
-
-typedef struct {
-  UINT32  SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler
-  UINT32  SkuIdTableOffset;   //Offset from the PCD_DB
-} SKU_HEAD;
-
-typedef struct {
-  UINT32  StringIndex;        // Offset in String Table in units of UINT32.
-  UINT32  DefaultValueOffset; // Offset of the Default Value
-  UINT16  GuidTableIndex;     // Offset in Guid Table in units of GUID.
-  UINT16  Offset;             // Offset in Variable
-} VARIABLE_HEAD;
-
-typedef  struct {
-  UINT32  Offset;
-} VPD_HEAD;
-
-typedef UINT32 STRING_HEAD;
-
-typedef UINT16 SIZE_INFO;
-
-#define offsetof(s,m)  (UINT32) (UINTN) &(((s *)0)->m)
-
-"""
-
-gPcdDatabaseEpilogueAutoGenH = """
-typedef struct {
-  PEI_PCD_DATABASE PeiDb;
-  DXE_PCD_DATABASE DxeDb;
-} PCD_DATABASE;
-
-#define PCD_TOTAL_TOKEN_NUMBER (PEI_LOCAL_TOKEN_NUMBER + DXE_LOCAL_TOKEN_NUMBER)
-
-"""
-
-gPcdDatabaseAutoGenH = TemplateString("""
-#define ${PHASE}_GUID_TABLE_SIZE                ${GUID_TABLE_SIZE}
-#define ${PHASE}_STRING_TABLE_SIZE              ${STRING_TABLE_SIZE}
-#define ${PHASE}_SKUID_TABLE_SIZE               ${SKUID_TABLE_SIZE}
-#define ${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE  ${LOCAL_TOKEN_NUMBER_TABLE_SIZE}
-#define ${PHASE}_LOCAL_TOKEN_NUMBER             ${LOCAL_TOKEN_NUMBER}
-#define ${PHASE}_EXMAPPING_TABLE_SIZE           ${EXMAPPING_TABLE_SIZE}
-#define ${PHASE}_EX_TOKEN_NUMBER                ${EX_TOKEN_NUMBER}
-#define ${PHASE}_SIZE_TABLE_SIZE                ${SIZE_TABLE_SIZE}
-#define ${PHASE}_GUID_TABLE_EMPTY               ${GUID_TABLE_EMPTY}
-#define ${PHASE}_STRING_TABLE_EMPTY             ${STRING_TABLE_EMPTY}
-#define ${PHASE}_SKUID_TABLE_EMPTY              ${SKUID_TABLE_EMPTY}
-#define ${PHASE}_DATABASE_EMPTY                 ${DATABASE_EMPTY}
-#define ${PHASE}_EXMAP_TABLE_EMPTY              ${EXMAP_TABLE_EMPTY}
-
-typedef struct {
-${BEGIN}  UINT64             ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}];
-${END}
-${BEGIN}  UINT64             ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64};
-${END}
-${BEGIN}  UINT32             ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}];
-${END}
-${BEGIN}  UINT32             ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32};
-${END}
-${BEGIN}  VPD_HEAD           ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}];
-${END}
-  DYNAMICEX_MAPPING  ExMapTable[${PHASE}_EXMAPPING_TABLE_SIZE];
-  UINT32             LocalTokenNumberTable[${PHASE}_LOCAL_TOKEN_NUMBER_TABLE_SIZE];
-  GUID               GuidTable[${PHASE}_GUID_TABLE_SIZE];
-${BEGIN}  STRING_HEAD        ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}];
-${END}
-${BEGIN}  VARIABLE_HEAD      ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}];
-${END}
-${BEGIN}  UINT8              StringTable${STRING_TABLE_INDEX}[${STRING_TABLE_LENGTH}]; /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */
-${END}
-  SIZE_INFO          SizeTable[${PHASE}_SIZE_TABLE_SIZE];
-${BEGIN}  UINT16             ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}];
-${END}
-${BEGIN}  UINT16             ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16};
-${END}
-${BEGIN}  UINT8              ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}];
-${END}
-${BEGIN}  UINT8              ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8};
-${END}
-${BEGIN}  BOOLEAN            ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}];
-${END}
-${BEGIN}  BOOLEAN            ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN};
-${END}
-  UINT8              SkuIdTable[${PHASE}_SKUID_TABLE_SIZE];
-${SYSTEM_SKU_ID}
-} ${PHASE}_PCD_DATABASE_INIT;
-
-typedef struct {
-${PCD_DATABASE_UNINIT_EMPTY}
-${BEGIN}  UINT64   ${UNINIT_CNAME_DECL_UINT64}_${UNINIT_GUID_DECL_UINT64}[${UNINIT_NUMSKUS_DECL_UINT64}];
-${END}
-${BEGIN}  UINT32   ${UNINIT_CNAME_DECL_UINT32}_${UNINIT_GUID_DECL_UINT32}[${UNINIT_NUMSKUS_DECL_UINT32}];
-${END}
-${BEGIN}  UINT16   ${UNINIT_CNAME_DECL_UINT16}_${UNINIT_GUID_DECL_UINT16}[${UNINIT_NUMSKUS_DECL_UINT16}];
-${END}
-${BEGIN}  UINT8    ${UNINIT_CNAME_DECL_UINT8}_${UNINIT_GUID_DECL_UINT8}[${UNINIT_NUMSKUS_DECL_UINT8}];
-${END}
-${BEGIN}  BOOLEAN  ${UNINIT_CNAME_DECL_BOOLEAN}_${UNINIT_GUID_DECL_BOOLEAN}[${UNINIT_NUMSKUS_DECL_BOOLEAN}];
-${END}
-} ${PHASE}_PCD_DATABASE_UNINIT;
-
-#define PCD_${PHASE}_SERVICE_DRIVER_VERSION         2
-
-typedef struct {
-  ${PHASE}_PCD_DATABASE_INIT    Init;
-  ${PHASE}_PCD_DATABASE_UNINIT  Uninit;
-} ${PHASE}_PCD_DATABASE;
-
-#define ${PHASE}_NEX_TOKEN_NUMBER (${PHASE}_LOCAL_TOKEN_NUMBER - ${PHASE}_EX_TOKEN_NUMBER)
-""")
-
-gEmptyPcdDatabaseAutoGenC = TemplateString("""
-${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
-  /* ExMapTable */
-  {
-    {0, 0, 0}
-  },
-  /* LocalTokenNumberTable */
-  {
-    0
-  },
-  /* GuidTable */
-  {
-    {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
-  },
-  /* StringTable */
-  { 0 },
-  /* SizeTable */
-  {
-    0, 0
-  },
-  /* SkuIdTable */
-  { 0 },
-  ${SYSTEM_SKU_ID_VALUE}
-};
-""")
-
-gPcdDatabaseAutoGenC = TemplateString("""
-${PHASE}_PCD_DATABASE_INIT g${PHASE}PcdDbInit = {
-${BEGIN}  { ${INIT_VALUE_UINT64} }, /*  ${INIT_CNAME_DECL_UINT64}_${INIT_GUID_DECL_UINT64}[${INIT_NUMSKUS_DECL_UINT64}] */
-${END}
-${BEGIN}  ${VARDEF_VALUE_UINT64}, /* ${VARDEF_CNAME_UINT64}_${VARDEF_GUID_UINT64}_VariableDefault_${VARDEF_SKUID_UINT64} */
-${END}
-${BEGIN}  { ${INIT_VALUE_UINT32} }, /*  ${INIT_CNAME_DECL_UINT32}_${INIT_GUID_DECL_UINT32}[${INIT_NUMSKUS_DECL_UINT32}] */
-${END}
-${BEGIN}  ${VARDEF_VALUE_UINT32}, /* ${VARDEF_CNAME_UINT32}_${VARDEF_GUID_UINT32}_VariableDefault_${VARDEF_SKUID_UINT32} */
-${END}
-  /* VPD */
-${BEGIN}  { ${VPD_HEAD_VALUE} }, /* ${VPD_HEAD_CNAME_DECL}_${VPD_HEAD_GUID_DECL}[${VPD_HEAD_NUMSKUS_DECL}] */
-${END}
-  /* ExMapTable */
-  {
-${BEGIN}    { ${EXMAPPING_TABLE_EXTOKEN}, ${EXMAPPING_TABLE_LOCAL_TOKEN}, ${EXMAPPING_TABLE_GUID_INDEX} },
-${END}
-  },
-  /* LocalTokenNumberTable */
-  {
-${BEGIN}    offsetof(${PHASE}_PCD_DATABASE, ${TOKEN_INIT}.${TOKEN_CNAME}_${TOKEN_GUID}${VARDEF_HEADER}) | ${TOKEN_TYPE},
-${END}
-  },
-  /* GuidTable */
-  {
-${BEGIN}    ${GUID_STRUCTURE},
-${END}
-  },
-${BEGIN}  { ${STRING_HEAD_VALUE} }, /* ${STRING_HEAD_CNAME_DECL}_${STRING_HEAD_GUID_DECL}[${STRING_HEAD_NUMSKUS_DECL}] */
-${END}
-${BEGIN}  /* ${VARIABLE_HEAD_CNAME_DECL}_${VARIABLE_HEAD_GUID_DECL}_Variable_Header[${VARIABLE_HEAD_NUMSKUS_DECL}] */
-  {
-    ${VARIABLE_HEAD_VALUE}
-  },
-${END}
- /* StringTable */
-${BEGIN}  ${STRING_TABLE_VALUE}, /* ${STRING_TABLE_CNAME}_${STRING_TABLE_GUID} */
-${END}
-  /* SizeTable */
-  {
-${BEGIN}    ${SIZE_TABLE_MAXIMUM_LENGTH}, ${SIZE_TABLE_CURRENT_LENGTH}, /* ${SIZE_TABLE_CNAME}_${SIZE_TABLE_GUID} */
-${END}
-  },
-${BEGIN}  { ${INIT_VALUE_UINT16} }, /*  ${INIT_CNAME_DECL_UINT16}_${INIT_GUID_DECL_UINT16}[${INIT_NUMSKUS_DECL_UINT16}] */
-${END}
-${BEGIN}  ${VARDEF_VALUE_UINT16}, /* ${VARDEF_CNAME_UINT16}_${VARDEF_GUID_UINT16}_VariableDefault_${VARDEF_SKUID_UINT16} */
-${END}
-${BEGIN}  { ${INIT_VALUE_UINT8} }, /*  ${INIT_CNAME_DECL_UINT8}_${INIT_GUID_DECL_UINT8}[${INIT_NUMSKUS_DECL_UINT8}] */
-${END}
-${BEGIN}  ${VARDEF_VALUE_UINT8}, /* ${VARDEF_CNAME_UINT8}_${VARDEF_GUID_UINT8}_VariableDefault_${VARDEF_SKUID_UINT8} */
-${END}
-${BEGIN}  { ${INIT_VALUE_BOOLEAN} }, /*  ${INIT_CNAME_DECL_BOOLEAN}_${INIT_GUID_DECL_BOOLEAN}[${INIT_NUMSKUS_DECL_BOOLEAN}] */
-${END}
-${BEGIN}  ${VARDEF_VALUE_BOOLEAN}, /* ${VARDEF_CNAME_BOOLEAN}_${VARDEF_GUID_BOOLEAN}_VariableDefault_${VARDEF_SKUID_BOOLEAN} */
-${END}
-  /* SkuIdTable */
-  { ${BEGIN}${SKUID_VALUE}, ${END} },
-  ${SYSTEM_SKU_ID_VALUE}
-};
-""")
-
-
 ## AutoGen File Header Templates
 gAutoGenHeaderString = TemplateString("""\
 /**
@@ -907,6 +662,76 @@ gModuleTypeHeaderFile = {
     "USER_DEFINED"      :   [gBasicHeaderFile]
 }
 
+## Autogen internal worker macro to define DynamicEx PCD name includes both the TokenSpaceGuidName 
+#  the TokenName and Guid comparison to avoid define name collisions.
+#
+#   @param      Info        The ModuleAutoGen object
+#   @param      AutoGenH    The TemplateString object for header file
+#
+#
+def DynExPcdTokenNumberMapping(Info, AutoGenH):
+    ExTokenCNameList = []
+    PcdExList        = []
+    if Info.IsLibrary:
+        PcdList = Info.LibraryPcdList
+    else:
+        PcdList = Info.ModulePcdList
+    for Pcd in PcdList:
+        if Pcd.Type in gDynamicExPcd:
+            ExTokenCNameList.append(Pcd.TokenCName)
+            PcdExList.append(Pcd)
+    if len(ExTokenCNameList) == 0:
+        return
+    AutoGenH.Append('\n#define COMPAREGUID(Guid1, Guid2) (BOOLEAN)(*(CONST UINT64*)Guid1 == *(CONST UINT64*)Guid2 && *((CONST UINT64*)Guid1 + 1) == *((CONST UINT64*)Guid2 + 1))\n')
+    # AutoGen for each PCD listed in a [PcdEx] section of a Module/Lib INF file.
+    # Auto generate a macro for each TokenName that takes a Guid pointer as a parameter.  
+    # Use the Guid pointer to see if it matches any of the token space GUIDs.
+    TokenCNameList = []
+    for TokenCName in ExTokenCNameList:
+        if TokenCName in TokenCNameList:
+            continue
+        Index = 0
+        Count = ExTokenCNameList.count(TokenCName)
+        for Pcd in PcdExList:
+            if Pcd.TokenCName == TokenCName:
+                Index = Index + 1
+                if Index == 1:
+                    AutoGenH.Append('\n#define __PCD_%s_ADDR_CMP(GuidPtr)  (' % (Pcd.TokenCName))
+                    AutoGenH.Append('\\\n  (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' 
+                                    % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))
+                else:
+                    AutoGenH.Append('\\\n  (GuidPtr == &%s) ? _PCD_TOKEN_%s_%s:' 
+                                    % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))
+                if Index == Count:
+                    AutoGenH.Append('0 \\\n  )\n')
+                TokenCNameList.append(TokenCName)
+    
+    TokenCNameList = []
+    for TokenCName in ExTokenCNameList:
+        if TokenCName in TokenCNameList:
+            continue
+        Index = 0
+        Count = ExTokenCNameList.count(TokenCName)
+        for Pcd in PcdExList:
+            if Pcd.Type in gDynamicExPcd and Pcd.TokenCName == TokenCName:
+                Index = Index + 1
+                if Index == 1:
+                    AutoGenH.Append('\n#define __PCD_%s_VAL_CMP(GuidPtr)  (' % (Pcd.TokenCName))
+                    AutoGenH.Append('\\\n  COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' 
+                                    % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))
+                else:
+                    AutoGenH.Append('\\\n  COMPAREGUID (GuidPtr, &%s) ? _PCD_TOKEN_%s_%s:' 
+                                    % (Pcd.TokenSpaceGuidCName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))
+                if Index == Count:
+                    AutoGenH.Append('0 \\\n  )\n')
+                    # Autogen internal worker macro to compare GUIDs.  Guid1 is a pointer to a GUID.  
+                    # Guid2 is a C name for a GUID. Compare pointers first because optimizing compiler
+                    # can do this at build time on CONST GUID pointers and optimize away call to COMPAREGUID().
+                    #  COMPAREGUID() will only be used if the Guid passed in is local to the module.
+                    AutoGenH.Append('#define _PCD_TOKEN_EX_%s(GuidPtr)   __PCD_%s_ADDR_CMP(GuidPtr) ? __PCD_%s_ADDR_CMP(GuidPtr) : __PCD_%s_VAL_CMP(GuidPtr)  \n'
+                                    % (Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName))
+                TokenCNameList.append(TokenCName)
+
 ## Create code for module PCDs
 #
 #   @param      Info        The ModuleAutoGen object
@@ -923,13 +748,29 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
     PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName
     if Pcd.Type in gDynamicExPcd:
         TokenNumber = int(Pcd.TokenValue, 0)
+        # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with 
+        # different Guids but same TokenCName
+        PcdExTokenName = '_PCD_TOKEN_' + Pcd.TokenSpaceGuidCName + '_' + Pcd.TokenCName
+        AutoGenH.Append('\n#define %s  %dU\n' % (PcdExTokenName, TokenNumber))
     else:
         if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
-            EdkLogger.error("build", AUTOGEN_ERROR,
-                            "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
-                            ExtraData="[%s]" % str(Info))
-        TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]
-    AutoGenH.Append('\n#define %s  %dU\n' % (PcdTokenName, TokenNumber))
+            # If one of the Source built modules listed in the DSC is not listed in FDF modules, 
+            # and the INF lists a PCD can only use the PcdsDynamic access method (it is only 
+            # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will 
+            # report warning message notify the PI that they are attempting to build a module 
+            # that must be included in a flash image in order to be functional. These Dynamic PCD 
+            # will not be added into the Database unless it is used by other modules that are 
+            # included in the FDF file. 
+            # In this case, just assign an invalid token number to make it pass build.
+            if Pcd.Type in PCD_DYNAMIC_TYPE_LIST:
+                TokenNumber = 0
+            else:
+                EdkLogger.error("build", AUTOGEN_ERROR,
+                                "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                ExtraData="[%s]" % str(Info))
+        else:
+            TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]
+        AutoGenH.Append('\n#define %s  %dU\n' % (PcdTokenName, TokenNumber))
 
     EdkLogger.debug(EdkLogger.DEBUG_3, "Creating code for " + Pcd.TokenCName + "." + Pcd.TokenSpaceGuidCName)
     if Pcd.Type not in gItemTypeStringDatabase:
@@ -946,12 +787,33 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
     GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
     SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName
 
+    PcdExCNameList  = []
     if Pcd.Type in gDynamicExPcd:
-        AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
-        if Pcd.DatumType == 'VOID*':
-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+        if Info.IsLibrary:
+            PcdList = Info.LibraryPcdList
         else:
-            AutoGenH.Append('#define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            PcdList = Info.ModulePcdList
+        for PcdModule in PcdList:
+            if PcdModule.Type in gDynamicExPcd:
+                PcdExCNameList.append(PcdModule.TokenCName)
+        # Be compatible with the current code which using PcdToken and PcdGet/Set for DynamicEx Pcd.
+        # If only PcdToken and PcdGet/Set used in all Pcds with different CName, it should succeed to build.
+        # If PcdToken and PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.
+        if PcdExCNameList.count(Pcd.TokenCName) > 1:
+            AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')
+            AutoGenH.Append('// #define %s  %s\n' % (PcdTokenName, PcdExTokenName))
+            AutoGenH.Append('// #define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            if Pcd.DatumType == 'VOID*':
+                AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            else:
+                AutoGenH.Append('// #define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+        else:
+            AutoGenH.Append('#define %s  %s\n' % (PcdTokenName, PcdExTokenName))
+            AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            if Pcd.DatumType == 'VOID*':
+                AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            else:
+                AutoGenH.Append('#define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
     elif Pcd.Type in gDynamicPcd:
         AutoGenH.Append('#define %s  LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
         if Pcd.DatumType == 'VOID*':
@@ -1117,16 +979,30 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
     PcdTokenNumber = Info.PlatformInfo.PcdTokenNumber
     TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
     TokenCName  = Pcd.TokenCName
-    TokenSpaceGuidValue = Pcd.TokenSpaceGuidValue   #Info.GuidList[TokenSpaceGuidCName]
-    if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
-        EdkLogger.error("build", AUTOGEN_ERROR,
-                        "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
-                        ExtraData="[%s]" % str(Info))
-    TokenNumber = PcdTokenNumber[TokenCName, TokenSpaceGuidCName]
-
-    # If PCD is DynamicEx, then use TokenNumber declared in DEC file
+    PcdTokenName = '_PCD_TOKEN_' + TokenCName
+    #
+    # Write PCDs
+    #
     if Pcd.Type in gDynamicExPcd:
         TokenNumber = int(Pcd.TokenValue, 0)
+    else:
+        if (Pcd.TokenCName, Pcd.TokenSpaceGuidCName) not in PcdTokenNumber:
+            # If one of the Source built modules listed in the DSC is not listed in FDF modules, 
+            # and the INF lists a PCD can only use the PcdsDynamic access method (it is only 
+            # listed in the DEC file that declares the PCD as PcdsDynamic), then build tool will 
+            # report warning message notify the PI that they are attempting to build a module 
+            # that must be included in a flash image in order to be functional. These Dynamic PCD 
+            # will not be added into the Database unless it is used by other modules that are 
+            # included in the FDF file. 
+            # In this case, just assign an invalid token number to make it pass build.
+            if Pcd.Type in PCD_DYNAMIC_TYPE_LIST:
+                TokenNumber = 0
+            else:
+                EdkLogger.error("build", AUTOGEN_ERROR,
+                                "No generated token number for %s.%s\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+                                ExtraData="[%s]" % str(Info))
+        else:
+            TokenNumber = PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName]
 
     if Pcd.Type not in gItemTypeStringDatabase:
         EdkLogger.error("build", AUTOGEN_ERROR,
@@ -1148,23 +1024,40 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
     if Pcd.DatumType == 'VOID*':
         Type = '(VOID *)'
         Array = '[]'
-
-    AutoGenH.Append('#define _PCD_TOKEN_%s  %dU\n' % (TokenCName, TokenNumber))
-
     PcdItemType = Pcd.Type
-    #if PcdItemType in gDynamicPcd:
-    #    PcdItemType = TAB_PCDS_FIXED_AT_BUILD
-    #    if (TokenCName, TokenSpaceGuidCName) in Info.PlatformInfo.Platform.Pcds:
-    #        PcdItemType  = Info.PlatformInfo.Platform.Pcds[TokenCName, TokenSpaceGuidCName].Type
+    PcdExCNameList  = []
     if PcdItemType in gDynamicExPcd:
-        PcdTokenName = '_PCD_TOKEN_' + TokenCName
-        AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
-        if DatumType == 'VOID*':
-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName,DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
+        PcdExTokenName = '_PCD_TOKEN_' + TokenSpaceGuidCName + '_' + Pcd.TokenCName
+        AutoGenH.Append('\n#define %s  %dU\n' % (PcdExTokenName, TokenNumber))
+        
+        if Info.IsLibrary:
+            PcdList = Info.LibraryPcdList
+        else:
+            PcdList = Info.ModulePcdList
+        for PcdModule in PcdList:
+            if PcdModule.Type in gDynamicExPcd:
+                PcdExCNameList.append(PcdModule.TokenCName)
+        # Be compatible with the current code which using PcdGet/Set for DynamicEx Pcd.
+        # If only PcdGet/Set used in all Pcds with different CName, it should succeed to build.
+        # If PcdGet/Set used in the Pcds with different Guids but same CName, it should failed to build.
+        if PcdExCNameList.count(Pcd.TokenCName) > 1:
+            AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')
+            AutoGenH.Append('// #define %s  %s\n' % (PcdTokenName, PcdExTokenName))
+            AutoGenH.Append('// #define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            if Pcd.DatumType == 'VOID*':
+                AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            else:
+                AutoGenH.Append('// #define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
         else:
-            AutoGenH.Append('#define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, TokenSpaceGuidCName, PcdTokenName))
+            AutoGenH.Append('#define %s  %s\n' % (PcdTokenName, PcdExTokenName))
+            AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            if Pcd.DatumType == 'VOID*':
+                AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+            else:
+                AutoGenH.Append('#define %s(Value)  LibPcdSetEx%s(&%s, %s, (Value))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))
+    else:
+        AutoGenH.Append('#define _PCD_TOKEN_%s  %dU\n' % (TokenCName, TokenNumber))
     if PcdItemType in gDynamicPcd:
-        PcdTokenName = '_PCD_TOKEN_' + TokenCName
         AutoGenH.Append('#define %s  LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))
         if DatumType == 'VOID*':
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))
@@ -1172,468 +1065,15 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
             AutoGenH.Append('#define %s(Value)  LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
     if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:
         PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName
-        AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) )
+        AutoGenH.Append('extern volatile %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array) )
         AutoGenH.Append('#define %s  %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))
         AutoGenH.Append('#define %s(Value)  (%s = (Value))\n' % (SetModeName, PcdVariableName))
     if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:
         AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))
-        #AutoGenH.Append('#define _PCD_VALUE_%s  _gPcd_FixedAtBuild_%s\n' %(TokenCName, TokenCName))
         AutoGenH.Append('#define %s  %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))
         AutoGenH.Append('//#define %s  ASSERT(FALSE)  // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)
 
-## Create code for PCD database in DXE or PEI phase
-#
-#   @param      Platform    The platform object
-#   @retval     tuple       Two TemplateString objects for C code and header file,
-#                           respectively
-#
-def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
-    AutoGenC = TemplateString()
-    AutoGenH = TemplateString()
-
-    Dict = {
-        'PHASE'                         : Phase,
-        'GUID_TABLE_SIZE'               : '1U',
-        'STRING_TABLE_SIZE'             : '1U',
-        'SKUID_TABLE_SIZE'              : '1U',
-        'LOCAL_TOKEN_NUMBER_TABLE_SIZE' : '1U',
-        'LOCAL_TOKEN_NUMBER'            : '0U',
-        'EXMAPPING_TABLE_SIZE'          : '1U',
-        'EX_TOKEN_NUMBER'               : '0U',
-        'SIZE_TABLE_SIZE'               : '2U',
-        'GUID_TABLE_EMPTY'              : 'TRUE',
-        'STRING_TABLE_EMPTY'            : 'TRUE',
-        'SKUID_TABLE_EMPTY'             : 'TRUE',
-        'DATABASE_EMPTY'                : 'TRUE',
-        'EXMAP_TABLE_EMPTY'             : 'TRUE',
-        'PCD_DATABASE_UNINIT_EMPTY'     : '  UINT8  dummy; /* PCD_DATABASE_UNINIT is emptry */',
-        'SYSTEM_SKU_ID'                 : '  SKU_ID             SystemSkuId;',
-        'SYSTEM_SKU_ID_VALUE'           : '0U'
-    }
-
-    for DatumType in ['UINT64','UINT32','UINT16','UINT8','BOOLEAN', "VOID*"]:
-        Dict['VARDEF_CNAME_' + DatumType] = []
-        Dict['VARDEF_GUID_' + DatumType]  = []
-        Dict['VARDEF_SKUID_' + DatumType] = []
-        Dict['VARDEF_VALUE_' + DatumType] = []
-        for Init in ['INIT','UNINIT']:
-            Dict[Init+'_CNAME_DECL_' + DatumType]   = []
-            Dict[Init+'_GUID_DECL_' + DatumType]    = []
-            Dict[Init+'_NUMSKUS_DECL_' + DatumType] = []
-            Dict[Init+'_VALUE_' + DatumType]        = []
-
-    for Type in ['STRING_HEAD','VPD_HEAD','VARIABLE_HEAD']:
-        Dict[Type + '_CNAME_DECL']   = []
-        Dict[Type + '_GUID_DECL']    = []
-        Dict[Type + '_NUMSKUS_DECL'] = []
-        Dict[Type + '_VALUE'] = []
-
-    Dict['STRING_TABLE_INDEX'] = []
-    Dict['STRING_TABLE_LENGTH']  = []
-    Dict['STRING_TABLE_CNAME'] = []
-    Dict['STRING_TABLE_GUID']  = []
-    Dict['STRING_TABLE_VALUE'] = []
-
-    Dict['SIZE_TABLE_CNAME'] = []
-    Dict['SIZE_TABLE_GUID']  = []
-    Dict['SIZE_TABLE_CURRENT_LENGTH']  = []
-    Dict['SIZE_TABLE_MAXIMUM_LENGTH']  = []
-
-    Dict['EXMAPPING_TABLE_EXTOKEN'] = []
-    Dict['EXMAPPING_TABLE_LOCAL_TOKEN'] = []
-    Dict['EXMAPPING_TABLE_GUID_INDEX'] = []
-
-    Dict['GUID_STRUCTURE'] = []
-
-    Dict['SKUID_VALUE'] = []
-    Dict['VARDEF_HEADER'] = []
-    if Phase == 'DXE':
-        Dict['SYSTEM_SKU_ID'] = ''
-        Dict['SYSTEM_SKU_ID_VALUE'] = ''
-
-    StringTableIndex = 0
-    StringTableSize = 0
-    NumberOfLocalTokens = 0
-    NumberOfPeiLocalTokens = 0
-    NumberOfDxeLocalTokens = 0
-    NumberOfExTokens = 0
-    NumberOfSizeItems = 0
-    GuidList = []
-    
-    for Pcd in Platform.DynamicPcdList:
-        CName = Pcd.TokenCName
-        TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
-
-        EdkLogger.debug(EdkLogger.DEBUG_3, "PCD: %s %s (%s : %s)" % (CName, TokenSpaceGuidCName, Pcd.Phase, Phase))
-        if Pcd.DatumType not in gDatumSizeStringDatabase:
-            EdkLogger.error("build", AUTOGEN_ERROR,
-                            "Unknown datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
-                            ExtraData="[%s]" % str(Platform))
-
-        if Pcd.Phase == 'PEI':
-            NumberOfPeiLocalTokens += 1
-        if Pcd.Phase == 'DXE':
-            NumberOfDxeLocalTokens += 1
-        if Pcd.Phase != Phase:
-            continue
-
-        #
-        # TODO: need GetGuidValue() definition
-        #
-        TokenSpaceGuidStructure = Pcd.TokenSpaceGuidValue
-        TokenSpaceGuid = GuidStructureStringToGuidValueName(TokenSpaceGuidStructure)
-        if Pcd.Type in gDynamicExPcd:
-            if TokenSpaceGuid not in GuidList:
-                GuidList += [TokenSpaceGuid]
-                Dict['GUID_STRUCTURE'].append(TokenSpaceGuidStructure)
-            NumberOfExTokens += 1
 
-        ValueList = []
-        StringHeadOffsetList = []
-        VpdHeadOffsetList = []
-        VariableHeadValueList = []
-        Pcd.InitString = 'UNINIT'
-
-        if Pcd.DatumType == 'VOID*':
-            if Pcd.Type not in ["DynamicVpd", "DynamicExVpd"]:
-                Pcd.TokenTypeList = ['PCD_TYPE_STRING']
-            else:
-                Pcd.TokenTypeList = []
-        elif Pcd.DatumType == 'BOOLEAN':
-            Pcd.TokenTypeList = ['PCD_DATUM_TYPE_UINT8']
-        else:
-            Pcd.TokenTypeList = ['PCD_DATUM_TYPE_' + Pcd.DatumType]
-
-        if len(Pcd.SkuInfoList) > 1:
-            Pcd.TokenTypeList += ['PCD_TYPE_SKU_ENABLED']
-
-        for SkuName in Pcd.SkuInfoList:
-            Sku = Pcd.SkuInfoList[SkuName]
-            SkuId = Sku.SkuId
-            if SkuId == None or SkuId == '':
-                continue
-
-            if (SkuId + 'U') not in Dict['SKUID_VALUE']:
-                Dict['SKUID_VALUE'].append(SkuId + 'U')
-
-            SkuIdIndex =   Dict['SKUID_VALUE'].index(SkuId + 'U')
-            if len(Sku.VariableName) > 0:
-                Pcd.TokenTypeList += ['PCD_TYPE_HII']
-                Pcd.InitString = 'INIT'
-                VariableNameStructure = StringToArray(Sku.VariableName)
-                if VariableNameStructure not in Dict['STRING_TABLE_VALUE']:
-                    Dict['STRING_TABLE_CNAME'].append(CName)
-                    Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
-                    if StringTableIndex == 0:
-                        Dict['STRING_TABLE_INDEX'].append('')
-                    else:
-                        Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
-
-                    Dict['STRING_TABLE_LENGTH'].append((len(Sku.VariableName) - 3 + 1) * 2)
-                    Dict['STRING_TABLE_VALUE'].append(VariableNameStructure)
-                    StringTableIndex += 1
-                    StringTableSize += (len(Sku.VariableName) - 3 + 1) * 2
-
-                VariableHeadStringIndex = 0
-                for Index in range(Dict['STRING_TABLE_VALUE'].index(VariableNameStructure)):
-                    VariableHeadStringIndex += Dict['STRING_TABLE_LENGTH'][Index]
-
-                VariableGuidStructure = Sku.VariableGuidValue
-                VariableGuid = GuidStructureStringToGuidValueName(VariableGuidStructure)
-                if VariableGuid not in GuidList:
-                    GuidList += [VariableGuid]
-                    Dict['GUID_STRUCTURE'].append(VariableGuidStructure)
-                VariableHeadGuidIndex = GuidList.index(VariableGuid)
-
-                if "PCD_TYPE_STRING" in Pcd.TokenTypeList:
-                    VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s), %dU, %sU' %
-                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, 
-                                                                                                VariableHeadGuidIndex, Sku.VariableOffset))
-                else:
-                    VariableHeadValueList.append('%dU, offsetof(%s_PCD_DATABASE, Init.%s_%s_VariableDefault_%s), %dU, %sU' %
-                                                 (VariableHeadStringIndex, Phase, CName, TokenSpaceGuid, SkuIdIndex, 
-                                                                                                VariableHeadGuidIndex, Sku.VariableOffset))
-                Dict['VARDEF_CNAME_'+Pcd.DatumType].append(CName)
-                Dict['VARDEF_GUID_'+Pcd.DatumType].append(TokenSpaceGuid)
-                Dict['VARDEF_SKUID_'+Pcd.DatumType].append(SkuIdIndex)
-                if "PCD_TYPE_STRING" in  Pcd.TokenTypeList:
-                    Dict['VARDEF_VALUE_' + Pcd.DatumType].append("%s_%s[%d]" % (Pcd.TokenCName, TokenSpaceGuid, SkuIdIndex))
-                else:
-                    #
-                    # ULL (for UINT64) or U(other integer type) should be append to avoid
-                    # warning under linux building environment.
-                    #
-                    if Pcd.DatumType == "UINT64":
-                        Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "ULL")
-                    elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):
-                        Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U")
-                    elif Pcd.DatumType == "BOOLEAN":
-                        if Sku.HiiDefaultValue in ["1", "0"]:
-                            Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue + "U")
-                    else:
-                        Dict['VARDEF_VALUE_'+Pcd.DatumType].append(Sku.HiiDefaultValue)
-
-            elif Sku.VpdOffset != '':
-                Pcd.TokenTypeList += ['PCD_TYPE_VPD']
-                Pcd.InitString = 'INIT'
-                VpdHeadOffsetList.append(str(Sku.VpdOffset) + 'U')
-                continue
-          
-            if Pcd.DatumType == 'VOID*':
-                Pcd.TokenTypeList += ['PCD_TYPE_STRING']
-                Pcd.InitString = 'INIT'
-                if Sku.HiiDefaultValue != '' and Sku.DefaultValue == '':
-                    Sku.DefaultValue = Sku.HiiDefaultValue
-                if Sku.DefaultValue != '':
-                    NumberOfSizeItems += 1
-                    Dict['STRING_TABLE_CNAME'].append(CName)
-                    Dict['STRING_TABLE_GUID'].append(TokenSpaceGuid)
-
-                    if StringTableIndex == 0:
-                        Dict['STRING_TABLE_INDEX'].append('')
-                    else:
-                        Dict['STRING_TABLE_INDEX'].append('_%d' % StringTableIndex)
-                    if Sku.DefaultValue[0] == 'L':
-                        Size = (len(Sku.DefaultValue) - 3 + 1) * 2
-                        Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
-                    elif Sku.DefaultValue[0] == '"':
-                        Size = len(Sku.DefaultValue) - 2 + 1
-                        Dict['STRING_TABLE_VALUE'].append(StringToArray(Sku.DefaultValue))
-                    elif Sku.DefaultValue[0] == '{':
-                        Size = len(Sku.DefaultValue.replace(',',' ').split())
-                        Dict['STRING_TABLE_VALUE'].append(Sku.DefaultValue)
-
-                    StringHeadOffsetList.append(str(StringTableSize) + 'U')
-                    Dict['SIZE_TABLE_CNAME'].append(CName)
-                    Dict['SIZE_TABLE_GUID'].append(TokenSpaceGuid)
-                    Dict['SIZE_TABLE_CURRENT_LENGTH'].append(str(Size) + 'U')
-                    Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append(str(Pcd.MaxDatumSize) + 'U')
-                    if Pcd.MaxDatumSize != '':
-                        MaxDatumSize = int(Pcd.MaxDatumSize, 0)
-                        if MaxDatumSize < Size:
-                            EdkLogger.error("build", AUTOGEN_ERROR,
-                                            "The maximum size of VOID* type PCD '%s.%s' is less than its actual size occupied." % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
-                                            ExtraData="[%s]" % str(Platform))
-                        Size = MaxDatumSize
-                    Dict['STRING_TABLE_LENGTH'].append(Size)
-                    StringTableIndex += 1
-                    StringTableSize += (Size)
-            else:
-                if "PCD_TYPE_HII" not in Pcd.TokenTypeList:
-                    Pcd.TokenTypeList += ['PCD_TYPE_DATA']
-                    if Sku.DefaultValue == 'TRUE':
-                        Pcd.InitString = 'INIT'
-                    else:
-                        try:
-                            if int(Sku.DefaultValue, 0) != 0:
-                                Pcd.InitString = 'INIT'
-                        except:
-                            pass
-                
-                #
-                # For UNIT64 type PCD's value, ULL should be append to avoid
-                # warning under linux building environment.
-                #
-                if Pcd.DatumType == "UINT64":
-                    ValueList.append(Sku.DefaultValue + "ULL")
-                elif Pcd.DatumType in ("UINT32", "UINT16", "UINT8"):
-                    ValueList.append(Sku.DefaultValue + "U")
-                elif Pcd.DatumType == "BOOLEAN":
-                    if Sku.DefaultValue in ["1", "0"]:
-                        ValueList.append(Sku.DefaultValue + "U")              
-                else:
-                    ValueList.append(Sku.DefaultValue)
-
-        Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))
-        
-
-        if 'PCD_TYPE_HII' in Pcd.TokenTypeList:
-            Dict['VARIABLE_HEAD_CNAME_DECL'].append(CName)
-            Dict['VARIABLE_HEAD_GUID_DECL'].append(TokenSpaceGuid)
-            Dict['VARIABLE_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
-            Dict['VARIABLE_HEAD_VALUE'].append('{ %s }\n' % ' },\n    { '.join(VariableHeadValueList))
-            Dict['VARDEF_HEADER'].append('_Variable_Header')
-        else:
-            Dict['VARDEF_HEADER'].append('')
-        if 'PCD_TYPE_VPD' in Pcd.TokenTypeList:
-            Dict['VPD_HEAD_CNAME_DECL'].append(CName)
-            Dict['VPD_HEAD_GUID_DECL'].append(TokenSpaceGuid)
-            Dict['VPD_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
-            Dict['VPD_HEAD_VALUE'].append('{ %s }' % ' }, { '.join(VpdHeadOffsetList))
-        if 'PCD_TYPE_STRING' in Pcd.TokenTypeList:
-            Dict['STRING_HEAD_CNAME_DECL'].append(CName)
-            Dict['STRING_HEAD_GUID_DECL'].append(TokenSpaceGuid)
-            Dict['STRING_HEAD_NUMSKUS_DECL'].append(len(Pcd.SkuInfoList))
-            Dict['STRING_HEAD_VALUE'].append(', '.join(StringHeadOffsetList))
-        if 'PCD_TYPE_DATA' in Pcd.TokenTypeList:
-            Dict[Pcd.InitString+'_CNAME_DECL_'+Pcd.DatumType].append(CName)
-            Dict[Pcd.InitString+'_GUID_DECL_'+Pcd.DatumType].append(TokenSpaceGuid)
-            Dict[Pcd.InitString+'_NUMSKUS_DECL_'+Pcd.DatumType].append(len(Pcd.SkuInfoList))
-            if Pcd.InitString == 'UNINIT':
-                Dict['PCD_DATABASE_UNINIT_EMPTY'] = ''
-            else:
-                Dict[Pcd.InitString+'_VALUE_'+Pcd.DatumType].append(', '.join(ValueList))
-
-    if Phase == 'PEI':
-        NumberOfLocalTokens = NumberOfPeiLocalTokens
-    if Phase == 'DXE':
-        NumberOfLocalTokens = NumberOfDxeLocalTokens
-
-    Dict['TOKEN_INIT']       = ['' for x in range(NumberOfLocalTokens)]
-    Dict['TOKEN_CNAME']      = ['' for x in range(NumberOfLocalTokens)]
-    Dict['TOKEN_GUID']       = ['' for x in range(NumberOfLocalTokens)]
-    Dict['TOKEN_TYPE']       = ['' for x in range(NumberOfLocalTokens)]
-    
-    for Pcd in Platform.DynamicPcdList:
-        CName = Pcd.TokenCName
-        TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName
-        if Pcd.Phase != Phase:
-            continue
-
-        TokenSpaceGuid = GuidStructureStringToGuidValueName(Pcd.TokenSpaceGuidValue) #(Platform.PackageList, TokenSpaceGuidCName))
-        GeneratedTokenNumber = Platform.PcdTokenNumber[CName, TokenSpaceGuidCName] - 1
-        if Phase == 'DXE':
-            GeneratedTokenNumber -= NumberOfPeiLocalTokens
-
-        EdkLogger.debug(EdkLogger.DEBUG_1, "PCD = %s.%s" % (CName, TokenSpaceGuidCName))
-        EdkLogger.debug(EdkLogger.DEBUG_1, "phase = %s" % Phase)
-        EdkLogger.debug(EdkLogger.DEBUG_1, "GeneratedTokenNumber = %s" % str(GeneratedTokenNumber))
-
-        Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Init'
-        if Pcd.InitString == 'UNINIT':
-            Dict['TOKEN_INIT'][GeneratedTokenNumber] = 'Uninit'
-        Dict['TOKEN_CNAME'][GeneratedTokenNumber] = CName
-        Dict['TOKEN_GUID'][GeneratedTokenNumber] = TokenSpaceGuid
-        Dict['TOKEN_TYPE'][GeneratedTokenNumber] = ' | '.join(Pcd.TokenTypeList)
-        
-        Pcd.TokenTypeList = list(set(Pcd.TokenTypeList))
-        #
-        # Update VARDEF_HEADER
-        #
-        if 'PCD_TYPE_HII' in Pcd.TokenTypeList:
-            Dict['VARDEF_HEADER'][GeneratedTokenNumber] = '_Variable_Header'
-        else:
-            Dict['VARDEF_HEADER'][GeneratedTokenNumber] = ''
-        
-        
-        if Pcd.Type in gDynamicExPcd:
-            Dict['EXMAPPING_TABLE_EXTOKEN'].append(str(Pcd.TokenValue) + 'U')
-            if Phase == 'DXE':
-                GeneratedTokenNumber += NumberOfPeiLocalTokens
-            #
-            # Per, PCD architecture specification, PCD Token Number is 1 based and 0 is defined as invalid token number.
-            # For each EX type PCD, a PCD Token Number is assigned. When the
-            # PCD Driver/PEIM map EX_GUID and EX_TOKEN_NUMBER to the PCD Token Number,
-            # the non-EX Protocol/PPI interface can be called to get/set the value. This assumption is made by
-            # Pcd Driver/PEIM in MdeModulePkg.
-            # Therefore, 1 is added to GeneratedTokenNumber to generate a PCD Token Number before being inserted
-            # to the EXMAPPING_TABLE.
-            #
-            Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append(str(GeneratedTokenNumber + 1) + 'U')
-            Dict['EXMAPPING_TABLE_GUID_INDEX'].append(str(GuidList.index(TokenSpaceGuid)) + 'U')
-
-    if GuidList != []:
-        Dict['GUID_TABLE_EMPTY'] = 'FALSE'
-        Dict['GUID_TABLE_SIZE'] = str(len(GuidList)) + 'U'
-    else:
-        Dict['GUID_STRUCTURE'] = [GuidStringToGuidStructureString('00000000-0000-0000-0000-000000000000')]
-
-    if StringTableIndex == 0:
-        Dict['STRING_TABLE_INDEX'].append('')
-        Dict['STRING_TABLE_LENGTH'].append(1)
-        Dict['STRING_TABLE_CNAME'].append('')
-        Dict['STRING_TABLE_GUID'].append('')
-        Dict['STRING_TABLE_VALUE'].append('{ 0 }')
-    else:
-        Dict['STRING_TABLE_EMPTY'] = 'FALSE'
-        Dict['STRING_TABLE_SIZE'] = str(StringTableSize) + 'U'
-
-    if Dict['SIZE_TABLE_CNAME'] == []:
-        Dict['SIZE_TABLE_CNAME'].append('')
-        Dict['SIZE_TABLE_GUID'].append('')
-        Dict['SIZE_TABLE_CURRENT_LENGTH'].append('0U')
-        Dict['SIZE_TABLE_MAXIMUM_LENGTH'].append('0U')
-
-    if NumberOfLocalTokens != 0:
-        Dict['DATABASE_EMPTY']                = 'FALSE'
-        Dict['LOCAL_TOKEN_NUMBER_TABLE_SIZE'] = NumberOfLocalTokens
-        Dict['LOCAL_TOKEN_NUMBER']            = NumberOfLocalTokens
-
-    if NumberOfExTokens != 0:
-        Dict['EXMAP_TABLE_EMPTY']    = 'FALSE'
-        Dict['EXMAPPING_TABLE_SIZE'] = str(NumberOfExTokens) + 'U'
-        Dict['EX_TOKEN_NUMBER']      = str(NumberOfExTokens) + 'U'
-    else:
-        Dict['EXMAPPING_TABLE_EXTOKEN'].append('0U')
-        Dict['EXMAPPING_TABLE_LOCAL_TOKEN'].append('0U')
-        Dict['EXMAPPING_TABLE_GUID_INDEX'].append('0U')
-
-    if NumberOfSizeItems != 0:
-        Dict['SIZE_TABLE_SIZE'] = str(NumberOfSizeItems * 2) + 'U'
-
-    AutoGenH.Append(gPcdDatabaseAutoGenH.Replace(Dict))
-    if NumberOfLocalTokens == 0:
-        AutoGenC.Append(gEmptyPcdDatabaseAutoGenC.Replace(Dict))
-    else:
-        #
-        # Update Size Table to the right order, it should be same with LocalTokenNumberTable
-        #
-        SizeCNameTempList = []
-        SizeGuidTempList = []
-        SizeCurLenTempList = []
-        SizeMaxLenTempList = []
-        ReOrderFlag = True
-  
-        if len(Dict['SIZE_TABLE_CNAME']) == 1:
-            if not (Dict['SIZE_TABLE_CNAME'][0] and Dict['SIZE_TABLE_GUID'][0]):
-                ReOrderFlag = False
-        
-        if ReOrderFlag:
-            for Count in range(len(Dict['TOKEN_CNAME'])):
-                for Count1 in range(len(Dict['SIZE_TABLE_CNAME'])):
-                    if Dict['TOKEN_CNAME'][Count] == Dict['SIZE_TABLE_CNAME'][Count1] and \
-                        Dict['TOKEN_GUID'][Count] == Dict['SIZE_TABLE_GUID'][Count1]:
-                        SizeCNameTempList.append(Dict['SIZE_TABLE_CNAME'][Count1])
-                        SizeGuidTempList.append(Dict['SIZE_TABLE_GUID'][Count1])
-                        SizeCurLenTempList.append(Dict['SIZE_TABLE_CURRENT_LENGTH'][Count1])
-                        SizeMaxLenTempList.append(Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count1])
-                        
-            for Count in range(len(Dict['SIZE_TABLE_CNAME'])):
-                Dict['SIZE_TABLE_CNAME'][Count] = SizeCNameTempList[Count]
-                Dict['SIZE_TABLE_GUID'][Count] = SizeGuidTempList[Count]
-                Dict['SIZE_TABLE_CURRENT_LENGTH'][Count] = SizeCurLenTempList[Count]
-                Dict['SIZE_TABLE_MAXIMUM_LENGTH'][Count] = SizeMaxLenTempList[Count]
-                
-        AutoGenC.Append(gPcdDatabaseAutoGenC.Replace(Dict))
-
-    return AutoGenH, AutoGenC
-
-## Create code for PCD database
-#
-#   @param      Info        The ModuleAutoGen object
-#   @param      AutoGenC    The TemplateString object for C code
-#   @param      AutoGenH    The TemplateString object for header file
-#
-def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
-    if Info.PcdIsDriver == "":
-        return
-    if Info.PcdIsDriver not in gPcdPhaseMap:
-        EdkLogger.error("build", AUTOGEN_ERROR, "Not supported PcdIsDriver type:%s" % Info.PcdIsDriver,
-                        ExtraData="[%s]" % str(Info))
-
-    AutoGenH.Append(gPcdDatabaseCommonAutoGenH)
-    AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, 'PEI')
-    AutoGenH.Append(AdditionalAutoGenH.String)
-
-    Phase = gPcdPhaseMap[Info.PcdIsDriver]
-    if Phase == 'PEI':
-        AutoGenC.Append(AdditionalAutoGenC.String)
-
-    if Phase == 'DXE':
-        AdditionalAutoGenH, AdditionalAutoGenC = CreatePcdDatabasePhaseSpecificAutoGen (Info.PlatformInfo, Phase)
-        AutoGenH.Append(AdditionalAutoGenH.String)
-        AutoGenC.Append(AdditionalAutoGenC.String)
-        AutoGenH.Append(gPcdDatabaseEpilogueAutoGenH)
 
 ## Create code for library constructor
 #
@@ -1920,7 +1360,7 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
     # Collect Token Space GUIDs used by DynamicEc PCDs
     TokenSpaceList = []
     for Pcd in Info.ModulePcdList:
-       if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList:
+        if Pcd.Type in gDynamicExPcd and Pcd.TokenSpaceGuidCName not in TokenSpaceList:
             TokenSpaceList += [Pcd.TokenSpaceGuidCName]
             
     # Add extern declarations to AutoGen.h if one or more Token Space GUIDs were found
@@ -1938,13 +1378,14 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
             AutoGenH.Append("\n// PCD definitions\n")
         for Pcd in Info.ModulePcdList:
             CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd)
+        DynExPcdTokenNumberMapping (Info, AutoGenH)
     else:
         if Info.ModulePcdList:
             AutoGenH.Append("\n// Definition of PCDs used in this module\n")
             AutoGenC.Append("\n// Definition of PCDs used in this module\n")
         for Pcd in Info.ModulePcdList:
             CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd)
-
+        DynExPcdTokenNumberMapping (Info, AutoGenH)
         if Info.LibraryPcdList:
             AutoGenH.Append("\n// Definition of PCDs used in libraries is in AutoGen.c\n")
             AutoGenC.Append("\n// Definition of PCDs used in libraries\n")