\r
VfrCompiler main class and main function.\r
\r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, 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
\r
PACKAGE_DATA gCBuffer;\r
PACKAGE_DATA gRBuffer;\r
+CVfrStringDB gCVfrStringDB;\r
\r
VOID \r
CVfrCompiler::DebugError (\r
)\r
{\r
INT32 Index;\r
- \r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
SetUtilityName ((CHAR8*) PROGRAM_NAME);\r
\r
mOptions.VfrFileName[0] = '\0';\r
mOptions.SkipCPreprocessor = TRUE;\r
mOptions.CPreprocessorOptions = NULL;\r
mOptions.CompatibleMode = FALSE;\r
+ mOptions.HasOverrideClassGuid = FALSE;\r
+ mOptions.WarningAsError = FALSE;\r
+ memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID));\r
\r
if (Argc == 1) {\r
Usage ();\r
AppendCPreprocessorOptions (Argv[Index]);\r
} else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) {\r
mOptions.CompatibleMode = TRUE;\r
+ } else if (stricmp(Argv[Index], "-s") == 0|| stricmp(Argv[Index], "--string-db") == 0) {\r
+ Index++;\r
+ if ((Index >= Argc) || (Argv[Index][0] == '-')) {\r
+ DebugError (NULL, 0, 1001, "Missing option", "-s missing input string file name");\r
+ goto Fail;\r
+ }\r
+ gCVfrStringDB.SetStringFileName(Argv[Index]);\r
+ DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", Argv[Index]);\r
+ } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) {\r
+ Index++;\r
+ Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid);\r
+ if (EFI_ERROR (Status)) {\r
+ DebugError (NULL, 0, 1000, "Invalid format:", "%s", Argv[Index]);\r
+ goto Fail;\r
+ }\r
+ mOptions.HasOverrideClassGuid = TRUE;\r
+ } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {\r
+ mOptions.WarningAsError = TRUE;\r
} else {\r
DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);\r
goto Fail;\r
mPreProcessCmd = (CHAR8 *) PREPROCESSOR_COMMAND;\r
mPreProcessOpt = (CHAR8 *) PREPROCESSOR_OPTIONS;\r
\r
+ SET_RUN_STATUS (STATUS_STARTED);\r
+\r
OptionInitialization(Argc, Argv);\r
\r
if ((IS_RUN_STATUS(STATUS_FAILED)) || (IS_RUN_STATUS(STATUS_DEAD))) {\r
UINT32 Index;\r
CONST CHAR8 *Help[] = {\r
" ", \r
- "VfrCompile version " VFR_COMPILER_VERSION VFR_COMPILER_UPDATE_TIME,\r
- "Copyright (c) 2004-2010 Intel Corporation. All rights reserved.",\r
+ "VfrCompile version " VFR_COMPILER_VERSION __BUILD_VERSION,\r
+ "Copyright (c) 2004-2013 Intel Corporation. All rights reserved.",\r
" ",\r
"Usage: VfrCompile [options] VfrFile",\r
" ",\r
" do not preprocessing input file",\r
" -c, --compatible-framework",\r
" compatible framework vfr file",\r
+ " -s, --string-db",\r
+ " input uni string package file",\r
+ " -g, --guid",\r
+ " override class guid input",\r
+ " format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",\r
+ " -w --warning-as-error",\r
+ " treat warning as an error",\r
NULL\r
};\r
for (Index = 0; Help[Index] != NULL; Index++) {\r
delete PreProcessCmd;\r
}\r
\r
-extern UINT8 VfrParserStart (IN FILE *, IN BOOLEAN);\r
+extern UINT8 VfrParserStart (IN FILE *, IN INPUT_INFO_TO_SYNTAX *);\r
\r
VOID\r
CVfrCompiler::Compile (\r
{\r
FILE *pInFile = NULL;\r
CHAR8 *InFileName = NULL;\r
+ INPUT_INFO_TO_SYNTAX InputInfo;\r
\r
if (!IS_RUN_STATUS(STATUS_PREPROCESSED)) {\r
goto Fail;\r
InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;\r
\r
gCVfrErrorHandle.SetInputFile (InFileName);\r
+ gCVfrErrorHandle.SetWarningAsError(mOptions.WarningAsError);\r
\r
if ((pInFile = fopen (InFileName, "r")) == NULL) {\r
DebugError (NULL, 0, 0001, "Error opening the input file", InFileName);\r
goto Fail;\r
}\r
\r
- if (VfrParserStart (pInFile, mOptions.CompatibleMode) != 0) {\r
+ InputInfo.CompatibleMode = mOptions.CompatibleMode;\r
+ if (mOptions.HasOverrideClassGuid) {\r
+ InputInfo.OverrideClassGuid = &mOptions.OverrideClassGuid;\r
+ } else {\r
+ InputInfo.OverrideClassGuid = NULL;\r
+ }\r
+\r
+ if (VfrParserStart (pInFile, &InputInfo) != 0) {\r
goto Fail;\r
}\r
\r
}\r
}\r
\r
+VOID\r
+CVfrCompiler::UpdateInfoForDynamicOpcode (\r
+ VOID\r
+ )\r
+{\r
+ SIfrRecord *pRecord;\r
+\r
+ if (!gNeedAdjustOpcode) {\r
+ return;\r
+ }\r
+ \r
+ //\r
+ // Base on the original offset info to update the record list.\r
+ //\r
+ if (!gCIfrRecordInfoDB.IfrAdjustDynamicOpcodeInRecords()) {\r
+ DebugError (NULL, 0, 1001, "Error parsing vfr file", "Can find the offset in the record.");\r
+ }\r
+\r
+ //\r
+ // Base on the opcode binary length to recalculate the offset for each opcode.\r
+ //\r
+ gCIfrRecordInfoDB.IfrAdjustOffsetForRecord();\r
+\r
+ //\r
+ // Base on the offset to find the binary address.\r
+ //\r
+ pRecord = gCIfrRecordInfoDB.GetRecordInfoFromOffset(gAdjustOpcodeOffset);\r
+ while (pRecord != NULL) {\r
+ pRecord->mIfrBinBuf = gCFormPkg.GetBufAddrBaseOnOffset(pRecord->mOffset);\r
+ if (pRecord->mIfrBinBuf == NULL) {\r
+ DebugError (NULL, 0, 0001, "Error parsing vfr file", " 0x%X. offset not allocated.", pRecord->mOffset);\r
+ }\r
+ pRecord = pRecord->mNext;\r
+ }\r
+}\r
+\r
VOID\r
CVfrCompiler::AdjustBin (\r
VOID\r
)\r
{\r
EFI_VFR_RETURN_CODE Status;\r
+\r
+ if (!IS_RUN_STATUS(STATUS_COMPILEED)) {\r
+ return;\r
+ }\r
+\r
+ UpdateInfoForDynamicOpcode ();\r
+\r
//\r
// Check Binary Code consistent between Form and IfrRecord\r
//\r
goto Err1;\r
}\r
\r
- fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION "\n//\n");\r
+ fprintf (pOutFile, "//\n// VFR compiler version " VFR_COMPILER_VERSION __BUILD_VERSION "\n//\n");\r
LineNo = 0;\r
while (!feof (pInFile)) {\r
if (fgets (LineBuf, MAX_VFR_LINE_LEN, pInFile) != NULL) {\r
)\r
{\r
COMPILER_RUN_STATUS Status;\r
+\r
+ SetPrintLevel(WARNING_LOG_LEVEL);\r
CVfrCompiler Compiler(Argc, Argv);\r
\r
Compiler.PreProcess();\r