BaseTool/VfrCompile: Support Union type in VFR

https://bugzilla.tianocore.org/show_bug.cgi?id=603

Update VfrCompiler to parse the UNION type in vfr file

Cc: Eric Dong <eric.dong@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Dandan Bi 2017-08-23 15:50:50 +08:00 committed by Eric Dong
parent 9fdf31789a
commit 2b7f3d4a6b
3 changed files with 65 additions and 37 deletions

View File

@ -157,6 +157,7 @@ VfrParserStart (
#token Inventory("inventory") "inventory"
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
#token Struct("struct") "struct"
#token Union("union") "union"
#token Boolean("BOOLEAN") "BOOLEAN"
#token Uint64("UINT64") "UINT64"
#token Uint32("UINT32") "UINT32"
@ -272,6 +273,7 @@ vfrProgram > [UINT8 Return] :
(
vfrPragmaPackDefinition
| vfrDataStructDefinition
| vfrDataUnionDefinition
)*
vfrFormSetDefinition
<< $Return = mParserStatus; >>
@ -320,6 +322,21 @@ vfrPragmaPackDefinition :
"\)"
;
vfrDataUnionDefinition :
{ TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
{ NonNvDataMap }
{
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
}
OpenBrace
vfrDataStructFields[TRUE]
CloseBrace
{
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
}
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>
;
vfrDataStructDefinition :
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
{ NonNvDataMap }
@ -327,7 +344,7 @@ vfrDataStructDefinition :
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
}
OpenBrace
vfrDataStructFields
vfrDataStructFields[FALSE]
CloseBrace
{
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
@ -335,42 +352,42 @@ vfrDataStructDefinition :
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
;
vfrDataStructFields :
vfrDataStructFields [BOOLEAN FieldInUnion]:
(
dataStructField64 |
dataStructField32 |
dataStructField16 |
dataStructField8 |
dataStructFieldBool |
dataStructFieldString |
dataStructFieldDate |
dataStructFieldTime |
dataStructFieldRef |
dataStructFieldUser
dataStructField64 [FieldInUnion] |
dataStructField32 [FieldInUnion] |
dataStructField16 [FieldInUnion] |
dataStructField8 [FieldInUnion] |
dataStructFieldBool [FieldInUnion] |
dataStructFieldString [FieldInUnion]|
dataStructFieldDate [FieldInUnion] |
dataStructFieldTime [FieldInUnion] |
dataStructFieldRef [FieldInUnion] |
dataStructFieldUser [FieldInUnion]
)*
;
dataStructField64 :
dataStructField64 [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"UINT64"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructField32 :
dataStructField32 [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"UINT32"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructField16 :
dataStructField16 [BOOLEAN FieldInUnion]:
<<
UINT32 ArrayNum = 0;
>>
@ -379,77 +396,77 @@ dataStructField16 :
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>
;
dataStructField8 :
dataStructField8 [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"UINT8"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldBool :
dataStructFieldBool [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"BOOLEAN"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldString :
dataStructFieldString [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"EFI_STRING_ID"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldDate :
dataStructFieldDate [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"EFI_HII_DATE"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldTime :
dataStructFieldTime [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"EFI_HII_TIME"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldRef :
dataStructFieldRef [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
D:"EFI_HII_REF"
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>
;
dataStructFieldUser :
dataStructFieldUser [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >>
T:StringIdentifier
N:StringIdentifier
{
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >>
}
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>
";" << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>
;
//*****************************************************************************

View File

@ -2,7 +2,7 @@
Vfr common library functions.
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2004 - 2017, 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
@ -1013,15 +1013,18 @@ EFI_VFR_RETURN_CODE
CVfrVarDataTypeDB::DataTypeAddField (
IN CHAR8 *FieldName,
IN CHAR8 *TypeName,
IN UINT32 ArrayNum
IN UINT32 ArrayNum,
IN BOOLEAN FieldInUnion
)
{
SVfrDataField *pNewField = NULL;
SVfrDataType *pFieldType = NULL;
SVfrDataField *pTmp;
UINT32 Align;
UINT32 MaxDataTypeSize;
CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);
MaxDataTypeSize = mNewDataType->mTotalSize;
if (strlen (FieldName) >= MAX_NAME_LEN) {
return VFR_RETURN_INVALID_PARAMETER;
@ -1057,7 +1060,15 @@ CVfrVarDataTypeDB::DataTypeAddField (
}
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));
mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);
if (FieldInUnion) {
if (MaxDataTypeSize < pNewField->mFieldType->mTotalSize) {
mNewDataType->mTotalSize = pNewField->mFieldType->mTotalSize;
}
pNewField->mOffset = 0;
} else {
mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);
}
return VFR_RETURN_SUCCESS;
}

View File

@ -2,7 +2,7 @@
Vfr common library functions.
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2004 - 2017, 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
@ -205,7 +205,7 @@ public:
VOID DeclareDataTypeBegin (VOID);
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *);
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32);
EFI_VFR_RETURN_CODE DataTypeAddField (IN CHAR8 *, IN CHAR8 *, IN UINT32, IN BOOLEAN);
VOID DeclareDataTypeEnd (VOID);
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);