+ \r
+ private void genCodeWorker(Token t,\r
+ ArrayList<CStructTypeDeclaration> declaList,\r
+ HashMap<String, String> instTable, String phase)\r
+ throws EntityException {\r
+\r
+ CStructTypeDeclaration decl;\r
+\r
+ //\r
+ // Insert SKU_HEAD if isSkuEnable is true\r
+ //\r
+ if (t.isSkuEnable()) {\r
+ int tableIdx;\r
+ tableIdx = skuIdTable.add(t);\r
+ decl = new CStructTypeDeclaration(t.getPrimaryKeyString(),\r
+ SkuHeadAlignmentSize, getSkuEnabledTypeDeclaration(t), true);\r
+ declaList.add(decl);\r
+ instTable.put(t.getPrimaryKeyString(),\r
+ getSkuEnabledTypeInstantiaion(t, tableIdx));\r
+ }\r
+\r
+ //\r
+ // Insert PCD_ENTRY declaration and instantiation\r
+ //\r
+ getCDeclarationString(t);\r
+\r
+ decl = new CStructTypeDeclaration(privateGlobalName,\r
+ getAlignmentSize(t), privateGlobalCCode, t.hasDefaultValue());\r
+ declaList.add(decl);\r
+\r
+ if (t.hasDefaultValue()) {\r
+ instTable.put(privateGlobalName, \r
+ getTypeInstantiation(t, declaList, instTable, phase)\r
+ );\r
+ }\r
+\r
+ }\r
+\r
+ private void ProcessTokensNew (List<Token> tokens, \r
+ ArrayList<CStructTypeDeclaration> cStructDeclList,\r
+ HashMap<String, String> cStructInstTable,\r
+ String phase\r
+ ) \r
+ throws EntityException {\r
+ \r
+ for (int idx = 0; idx < tokens.size(); idx++) {\r
+ Token t = tokens.get(idx);\r
+ \r
+ genCodeWorker (t, cStructDeclList, cStructInstTable, phase);\r
+ \r
+ sizeTable.add(t);\r
+ localTokenNumberTable.add(t);\r
+ t.tokenNumber = assignedTokenNumber++;\r
+ \r
+ //\r
+ // Add a mapping if this dynamic PCD entry is a EX type\r
+ //\r
+ if (t.isDynamicEx()) {\r
+ exMapTable.add(t.tokenNumber, \r
+ t.dynamicExTokenNumber, \r
+ guidTable.add(t.tokenSpaceName, t.getPrimaryKeyString()), \r
+ t.getPrimaryKeyString()\r
+ );\r
+ }\r
+ }\r
+\r
+ }\r
+ \r
+ public void genCodeNew () throws EntityException {\r
+ \r
+ ArrayList<CStructTypeDeclaration> cStructDeclList = new ArrayList<CStructTypeDeclaration>();\r
+ HashMap<String, String> cStructInstTable = new HashMap<String, String>();\r
+ \r
+ List<Token> nexTokens = new ArrayList<Token> ();\r
+ List<Token> exTokens = new ArrayList<Token> ();\r
+\r
+ getNonExAndExTokens (alTokens, nexTokens, exTokens);\r
+\r
+ //\r
+ // We have to process Non-Ex type PCD entry first. The reason is\r
+ // that our optimization assumes that the Token Number of Non-Ex \r
+ // PCD entry start from 1 (for PEI phase) and grows continously upwards.\r
+ // \r
+ // EX type token number starts from the last Non-EX PCD entry and\r
+ // grows continously upwards.\r
+ //\r
+ ProcessTokensNew (nexTokens, cStructDeclList, cStructInstTable, phase);\r
+ ProcessTokensNew (exTokens, cStructDeclList, cStructInstTable, phase);\r
+ \r
+ stringTable.genCodeNew(cStructDeclList, cStructInstTable);\r
+ skuIdTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ exMapTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ localTokenNumberTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ sizeTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ guidTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+ \r
+ hString = genCMacroCode ();\r
+ \r
+ HashMap <String, String> result;\r
+ \r
+ result = genCStructCode(cStructDeclList, \r
+ cStructInstTable, \r
+ phase\r
+ );\r
+ \r
+ hString += result.get("initDeclStr");\r
+ hString += result.get("uninitDeclStr");\r
+ \r
+ hString += String.format("#define PCD_%s_SERVICE_DRIVER_VERSION %d", phase, version);\r
+ \r
+ cString = newLine + newLine + result.get("initInstStr");\r
+ \r
+ }\r
+ \r
+ private String genCMacroCode () {\r
+ String macroStr = "";\r
+\r
+ //\r
+ // Generate size info Macro for all Tables\r
+ //\r
+ macroStr += guidTable.getSizeMacro();\r
+ macroStr += stringTable.getSizeMacro();\r
+ macroStr += skuIdTable.getSizeMacro();\r
+ macroStr += localTokenNumberTable.getSizeMacro();\r
+ macroStr += exMapTable.getSizeMacro();\r
+\r
+ //\r
+ // Generate existance info Macro for all Tables\r
+ //\r
+ macroStr += guidTable.getExistanceMacro();\r
+ macroStr += stringTable.getExistanceMacro();\r
+ macroStr += skuIdTable.getExistanceMacro();\r
+ macroStr += localTokenNumberTable.getExistanceMacro();\r
+ macroStr += exMapTable.getExistanceMacro();\r
+\r
+ macroStr += newLine;\r
+ \r
+ return macroStr;\r
+ }\r
+ \r
+ private HashMap <String, String> genCStructCode(\r
+ ArrayList<CStructTypeDeclaration> declaList, \r
+ HashMap<String, String> instTable, \r
+ String phase\r
+ ) {\r
+ \r
+ int i;\r
+ HashMap <String, String> result = new HashMap<String, String>();\r
+ HashMap <Integer, ArrayList<String>> alignmentInitDecl = new HashMap<Integer, ArrayList<String>>();\r
+ HashMap <Integer, ArrayList<String>> alignmentUninitDecl = new HashMap<Integer, ArrayList<String>>();\r
+ HashMap <Integer, ArrayList<String>> alignmentInitInst = new HashMap<Integer, ArrayList<String>>();\r
+ \r
+ //\r
+ // Initialize the storage for each alignment\r
+ //\r
+ for (i = 8; i > 0; i>>=1) {\r
+ alignmentInitDecl.put(new Integer(i), new ArrayList<String>());\r
+ alignmentInitInst.put(new Integer(i), new ArrayList<String>());\r
+ alignmentUninitDecl.put(new Integer(i), new ArrayList<String>());\r
+ }\r
+ \r
+ String initDeclStr = "typedef struct {" + newLine;\r
+ String initInstStr = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase()) + newLine;\r
+ String uninitDeclStr = "typedef struct {" + newLine;\r
+\r
+ //\r
+ // Sort all C declaration and instantiation base on Alignment Size \r
+ //\r
+ for (Object d : declaList) {\r
+ CStructTypeDeclaration decl = (CStructTypeDeclaration) d;\r
+ \r
+ if (decl.initTable) {\r
+ alignmentInitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+ alignmentInitInst.get(new Integer(decl.alignmentSize)).add(instTable.get(decl.key));\r
+ } else {\r
+ alignmentUninitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Generate code for every alignment size\r
+ //\r
+ for (int align = 8; align > 0; align >>= 1) {\r
+ ArrayList<String> declaListBasedOnAlignment = alignmentInitDecl.get(new Integer(align));\r
+ ArrayList<String> instListBasedOnAlignment = alignmentInitInst.get(new Integer(align));\r
+ for (i = 0; i < declaListBasedOnAlignment.size(); i++) {\r
+ initDeclStr += tab + declaListBasedOnAlignment.get(i);\r
+ initInstStr += tab + instListBasedOnAlignment.get(i);\r
+ \r
+ //\r
+ // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE\r
+ // has a least one data memember with alignment size of 1. So we can\r
+ // remove the last "," in the C structure instantiation string.\r
+ //\r
+ if ((align == 1) && (i == declaListBasedOnAlignment.size() - 1)) {\r
+ initInstStr += newLine;\r
+ } else {\r
+ initInstStr += commaNewLine;\r
+ }\r
+ }\r
+ \r
+ declaListBasedOnAlignment = alignmentUninitDecl.get(new Integer(align));\r
+ for (Object d : declaListBasedOnAlignment) {\r
+ String s = (String)d;\r
+ uninitDeclStr += tab + s;\r
+ }\r
+ }\r
+ \r
+ initDeclStr += String.format("} %s_PCD_DATABASE_INIT;", phase) + newLine + newLine;\r
+ initInstStr += "};";\r
+ uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;", phase) + newLine + newLine;\r
+ \r
+ result.put("initDeclStr", initDeclStr);\r
+ result.put("initInstStr", initInstStr);\r
+ result.put("uninitDeclStr", uninitDeclStr);\r
+\r
+ return result;\r
+ }\r