|
From: <yd...@us...> - 2013-08-09 07:07:28
|
Revision: 2594
http://sourceforge.net/p/edk2-buildtools/code/2594
Author: ydong10
Date: 2013-08-09 07:07:25 +0000 (Fri, 09 Aug 2013)
Log Message:
-----------
Report warning info or error info when two default value is set for one question.
Signed-off-by: Eric Dong <eri...@in...>
Reviewed-by: Liming Gao <lim...@in...>
Modified Paths:
--------------
trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h
trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.h
trunk/BaseTools/Source/C/VfrCompile/VfrError.cpp
trunk/BaseTools/Source/C/VfrCompile/VfrError.h
trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g
trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
Modified: trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/EfiVfr.h 2013-08-09 07:07:25 UTC (rev 2594)
@@ -38,6 +38,8 @@
#define EFI_STRING_ID_INVALID 0x0
#define EFI_IMAGE_ID_INVALID 0xFFFF
+#define EFI_IFR_MAX_DEFAULT_TYPE 0x10
+
typedef enum {
QUESTION_NORMAL,
QUESTION_DATE,
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.cpp 2013-08-09 07:07:25 UTC (rev 2594)
@@ -82,6 +82,7 @@
mOptions.CPreprocessorOptions = NULL;
mOptions.CompatibleMode = FALSE;
mOptions.HasOverrideClassGuid = FALSE;
+ mOptions.WarningAsError = FALSE;
memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID));
if (Argc == 1) {
@@ -153,6 +154,8 @@
goto Fail;
}
mOptions.HasOverrideClassGuid = TRUE;
+ } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) {
+ mOptions.WarningAsError = TRUE;
} else {
DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]);
goto Fail;
@@ -425,6 +428,8 @@
" -g, --guid",
" override class guid input",
" format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ " -w --warning-as-error",
+ " treat warning as an error",
NULL
};
for (Index = 0; Help[Index] != NULL; Index++) {
@@ -516,6 +521,7 @@
InFileName = (mOptions.SkipCPreprocessor == TRUE) ? mOptions.VfrFileName : mOptions.PreprocessorOutputFileName;
gCVfrErrorHandle.SetInputFile (InFileName);
+ gCVfrErrorHandle.SetWarningAsError(mOptions.WarningAsError);
if ((pInFile = fopen (InFileName, "r")) == NULL) {
DebugError (NULL, 0, 0001, "Error opening the input file", InFileName);
@@ -802,6 +808,8 @@
)
{
COMPILER_RUN_STATUS Status;
+
+ SetPrintLevel(WARNING_LOG_LEVEL);
CVfrCompiler Compiler(Argc, Argv);
Compiler.PreProcess();
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.h 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrCompiler.h 2013-08-09 07:07:25 UTC (rev 2594)
@@ -57,6 +57,7 @@
BOOLEAN CompatibleMode;
BOOLEAN HasOverrideClassGuid;
EFI_GUID OverrideClassGuid;
+ BOOLEAN WarningAsError;
} OPTIONS;
typedef enum {
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrError.cpp
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrError.cpp 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrError.cpp 2013-08-09 07:07:25 UTC (rev 2594)
@@ -49,14 +49,20 @@
{ VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }
};
+static SVFR_WARNING_HANDLE VFR_WARNING_HANDLE_TABLE [] = {
+ { VFR_WARNING_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},
+ { VFR_WARNING_CODEUNDEFINED, ": undefined Warning Code" }
+};
+
CVfrErrorHandle::CVfrErrorHandle (
VOID
)
{
- mInputFileName = NULL;
- mScopeRecordListHead = NULL;
- mScopeRecordListTail = NULL;
- mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;
+ mInputFileName = NULL;
+ mScopeRecordListHead = NULL;
+ mScopeRecordListTail = NULL;
+ mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;
+ mVfrWarningHandleTable = VFR_WARNING_HANDLE_TABLE;
}
CVfrErrorHandle::~CVfrErrorHandle (
@@ -75,12 +81,21 @@
delete pNode;
}
- mScopeRecordListHead = NULL;
- mScopeRecordListTail = NULL;
- mVfrErrorHandleTable = NULL;
+ mScopeRecordListHead = NULL;
+ mScopeRecordListTail = NULL;
+ mVfrErrorHandleTable = NULL;
+ mVfrWarningHandleTable = NULL;
}
VOID
+CVfrErrorHandle::SetWarningAsError (
+ IN BOOLEAN WarningAsError
+ )
+{
+ mWarningAsError = WarningAsError;
+}
+
+VOID
CVfrErrorHandle::SetInputFile (
IN CHAR8 *InputFile
)
@@ -243,4 +258,41 @@
}
}
+UINT8
+CVfrErrorHandle::HandleWarning (
+ IN EFI_VFR_WARNING_CODE WarningCode,
+ IN UINT32 LineNum,
+ IN CHAR8 *TokName
+ )
+{
+ UINT32 Index;
+ CHAR8 *FileName = NULL;
+ UINT32 FileLine;
+ CONST CHAR8 *WarningMsg = NULL;
+
+ if (mVfrWarningHandleTable == NULL) {
+ return 1;
+ }
+
+ GetFileNameLineNum (LineNum, &FileName, &FileLine);
+
+ if (mWarningAsError) {
+ Error (FileName, FileLine, 0x2220, "warning treated as error", NULL);
+ }
+
+ for (Index = 0; mVfrWarningHandleTable[Index].mWarningCode != VFR_WARNING_CODEUNDEFINED; Index++) {
+ if (WarningCode == mVfrWarningHandleTable[Index].mWarningCode) {
+ WarningMsg = mVfrWarningHandleTable[Index].mWarningMsg;
+ break;
+ }
+ }
+
+ if (WarningMsg != NULL) {
+ Warning (FileName, FileLine, 0, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) WarningMsg);
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
CVfrErrorHandle gCVfrErrorHandle;
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrError.h
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrError.h 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrError.h 2013-08-09 07:07:25 UTC (rev 2594)
@@ -47,11 +47,21 @@
VFR_RETURN_CODEUNDEFINED
} EFI_VFR_RETURN_CODE;
+typedef enum {
+ VFR_WARNING_DEFAULT_VALUE_REDEFINED = 0,
+ VFR_WARNING_CODEUNDEFINED
+} EFI_VFR_WARNING_CODE;
+
typedef struct _SVFR_ERROR_HANDLE {
EFI_VFR_RETURN_CODE mErrorCode;
CONST CHAR8 *mErrorMsg;
} SVFR_ERROR_HANDLE;
+typedef struct _SVFR_WARNING_HANDLE {
+ EFI_VFR_WARNING_CODE mWarningCode;
+ CONST CHAR8 *mWarningMsg;
+} SVFR_WARNING_HANDLE;
+
struct SVfrFileScopeRecord {
CHAR8 *mFileName;
UINT32 mWholeScopeLine;
@@ -66,17 +76,21 @@
private:
CHAR8 *mInputFileName;
SVFR_ERROR_HANDLE *mVfrErrorHandleTable;
+ SVFR_WARNING_HANDLE *mVfrWarningHandleTable;
SVfrFileScopeRecord *mScopeRecordListHead;
SVfrFileScopeRecord *mScopeRecordListTail;
+ BOOLEAN mWarningAsError;
public:
CVfrErrorHandle (VOID);
~CVfrErrorHandle (VOID);
+ VOID SetWarningAsError (IN BOOLEAN);
VOID SetInputFile (IN CHAR8 *);
VOID ParseFileScopeRecord (IN CHAR8 *, IN UINT32);
VOID GetFileNameLineNum (IN UINT32, OUT CHAR8 **, OUT UINT32 *);
UINT8 HandleError (IN EFI_VFR_RETURN_CODE, IN UINT32 LineNum = 0, IN CHAR8 *TokName = NULL);
+ UINT8 HandleWarning (IN EFI_VFR_WARNING_CODE, IN UINT32 LineNum = 0, IN CHAR8 *TokName = NULL);
VOID PrintMsg (IN UINT32 LineNum = 0, IN CHAR8 *TokName = NULL, IN CONST CHAR8 *MsgType = "Error", IN CONST CHAR8 *ErrorMsg = "");
};
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrSyntax.g 2013-08-09 07:07:25 UTC (rev 2594)
@@ -1108,6 +1108,7 @@
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;
CHAR8 *QName = NULL;
CHAR8 *VarIdStr = NULL;
+ mUsedDefaultCount = 0;
>>
{
Name "=" QN:StringIdentifier "," <<
@@ -1525,6 +1526,7 @@
>>
}
<<
+ CheckDuplicateDefaultValue (DefaultId, D);
if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {
_PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());
VarGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
@@ -1902,6 +1904,7 @@
VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
Val.b = TRUE;
if (CBObj.GetFlags () & 0x01) {
+ CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);
_PCATCH(
mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
EFI_HII_DEFAULT_CLASS_STANDARD,
@@ -1917,6 +1920,7 @@
);
}
if (CBObj.GetFlags () & 0x02) {
+ CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);
_PCATCH(
mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
EFI_HII_DEFAULT_CLASS_MANUFACTURING,
@@ -2915,6 +2919,7 @@
_PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());
VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);
if (OOOObj.GetFlags () & 0x10) {
+ CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);
_PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
EFI_HII_DEFAULT_CLASS_STANDARD,
_GET_CURRQEST_VARTINFO(),
@@ -2925,6 +2930,7 @@
), L->getLine());
}
if (OOOObj.GetFlags () & 0x20) {
+ CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);
_PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (
EFI_HII_DEFAULT_CLASS_MANUFACTURING,
_GET_CURRQEST_VARTINFO(),
@@ -3998,6 +4004,12 @@
CHAR8* mLastFormEndAddr;
//
+// Whether the question already has default value.
+//
+ UINT16 mUsedDefaultArray[EFI_IFR_MAX_DEFAULT_TYPE];
+ UINT16 mUsedDefaultCount;
+
+//
// For framework vfr compatibility
//
BOOLEAN mCompatibleMode;
@@ -4011,6 +4023,7 @@
UINT8 _GET_CURRQEST_DATATYPE ();
UINT32 _GET_CURRQEST_VARSIZE ();
UINT32 _GET_CURRQEST_ARRAY_SIZE();
+ VOID CheckDuplicateDefaultValue (IN EFI_DEFAULT_ID, IN ANTLRTokenPtr);
public:
VOID _PCATCH (IN INTN, IN INTN, IN ANTLRTokenPtr, IN CONST CHAR8 *);
@@ -4871,4 +4884,25 @@
mCompatibleMode = Mode;
mCVfrQuestionDB.SetCompatibleMode (Mode);
}
+
+VOID
+EfiVfrParser::CheckDuplicateDefaultValue (
+ IN EFI_DEFAULT_ID DefaultId,
+ IN ANTLRTokenPtr Tok
+ )
+{
+ UINT16 Index;
+
+ for(Index = 0; Index < mUsedDefaultCount; Index++) {
+ if (mUsedDefaultArray[Index] == DefaultId) {
+ gCVfrErrorHandle.HandleWarning (VFR_WARNING_DEFAULT_VALUE_REDEFINED, Tok->getLine(), Tok->getText());
+ }
+ }
+
+ if (mUsedDefaultCount >= EFI_IFR_MAX_DEFAULT_TYPE - 1) {
+ gCVfrErrorHandle.HandleError (VFR_RETURN_FATAL_ERROR, Tok->getLine(), Tok->getText());
+ }
+
+ mUsedDefaultArray[mUsedDefaultCount++] = DefaultId;
+}
>>
Modified: trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp
===================================================================
--- trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp 2013-07-31 10:58:26 UTC (rev 2593)
+++ trunk/BaseTools/Source/C/VfrCompile/VfrUtilityLib.cpp 2013-08-09 07:07:25 UTC (rev 2594)
@@ -323,10 +323,6 @@
// tranverse the list to find out if there's already the value for the same offset
for (pInfo = mItemListPos->mInfoStrList; pInfo != NULL; pInfo = pInfo->mNext) {
if (pInfo->mOffset == Offset) {
- // check if the value and width are the same; return error if not
- if ((Id != NULL) && (pInfo->mWidth != Width || memcmp(pInfo->mValue, &Value, Width) != 0)) {
- return VFR_RETURN_DEFAULT_VALUE_REDEFINED;
- }
return 0;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|