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 Inventory("inventory") "inventory"
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP" #token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
#token Struct("struct") "struct" #token Struct("struct") "struct"
#token Union("union") "union"
#token Boolean("BOOLEAN") "BOOLEAN" #token Boolean("BOOLEAN") "BOOLEAN"
#token Uint64("UINT64") "UINT64" #token Uint64("UINT64") "UINT64"
#token Uint32("UINT32") "UINT32" #token Uint32("UINT32") "UINT32"
@ -272,6 +273,7 @@ vfrProgram > [UINT8 Return] :
( (
vfrPragmaPackDefinition vfrPragmaPackDefinition
| vfrDataStructDefinition | vfrDataStructDefinition
| vfrDataUnionDefinition
)* )*
vfrFormSetDefinition vfrFormSetDefinition
<< $Return = mParserStatus; >> << $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 : vfrDataStructDefinition :
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >> { TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
{ NonNvDataMap } { NonNvDataMap }
@ -327,7 +344,7 @@ vfrDataStructDefinition :
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >> N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
} }
OpenBrace OpenBrace
vfrDataStructFields vfrDataStructFields[FALSE]
CloseBrace CloseBrace
{ {
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >> N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
@ -335,42 +352,42 @@ vfrDataStructDefinition :
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >> ";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
; ;
vfrDataStructFields : vfrDataStructFields [BOOLEAN FieldInUnion]:
( (
dataStructField64 | dataStructField64 [FieldInUnion] |
dataStructField32 | dataStructField32 [FieldInUnion] |
dataStructField16 | dataStructField16 [FieldInUnion] |
dataStructField8 | dataStructField8 [FieldInUnion] |
dataStructFieldBool | dataStructFieldBool [FieldInUnion] |
dataStructFieldString | dataStructFieldString [FieldInUnion]|
dataStructFieldDate | dataStructFieldDate [FieldInUnion] |
dataStructFieldTime | dataStructFieldTime [FieldInUnion] |
dataStructFieldRef | dataStructFieldRef [FieldInUnion] |
dataStructFieldUser dataStructFieldUser [FieldInUnion]
)* )*
; ;
dataStructField64 : dataStructField64 [BOOLEAN FieldInUnion]:
<< UINT32 ArrayNum = 0; >> << UINT32 ArrayNum = 0; >>
D:"UINT64" D:"UINT64"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"UINT32" D:"UINT32"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; UINT32 ArrayNum = 0;
>> >>
@ -379,77 +396,77 @@ dataStructField16 :
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"UINT8" D:"UINT8"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"BOOLEAN" D:"BOOLEAN"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"EFI_STRING_ID" D:"EFI_STRING_ID"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"EFI_HII_DATE" D:"EFI_HII_DATE"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"EFI_HII_TIME" D:"EFI_HII_TIME"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
D:"EFI_HII_REF" D:"EFI_HII_REF"
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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; >> << UINT32 ArrayNum = 0; >>
T:StringIdentifier T:StringIdentifier
N:StringIdentifier N:StringIdentifier
{ {
OpenBracket I:Number CloseBracket << ArrayNum = _STOU32(I->getText(), I->getLine()); >> 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. 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -1013,15 +1013,18 @@ EFI_VFR_RETURN_CODE
CVfrVarDataTypeDB::DataTypeAddField ( CVfrVarDataTypeDB::DataTypeAddField (
IN CHAR8 *FieldName, IN CHAR8 *FieldName,
IN CHAR8 *TypeName, IN CHAR8 *TypeName,
IN UINT32 ArrayNum IN UINT32 ArrayNum,
IN BOOLEAN FieldInUnion
) )
{ {
SVfrDataField *pNewField = NULL; SVfrDataField *pNewField = NULL;
SVfrDataType *pFieldType = NULL; SVfrDataType *pFieldType = NULL;
SVfrDataField *pTmp; SVfrDataField *pTmp;
UINT32 Align; UINT32 Align;
UINT32 MaxDataTypeSize;
CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS); CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);
MaxDataTypeSize = mNewDataType->mTotalSize;
if (strlen (FieldName) >= MAX_NAME_LEN) { if (strlen (FieldName) >= MAX_NAME_LEN) {
return VFR_RETURN_INVALID_PARAMETER; return VFR_RETURN_INVALID_PARAMETER;
@ -1057,7 +1060,15 @@ CVfrVarDataTypeDB::DataTypeAddField (
} }
mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign)); 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; return VFR_RETURN_SUCCESS;
} }

View File

@ -2,7 +2,7 @@
Vfr common library functions. 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 This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -205,7 +205,7 @@ public:
VOID DeclareDataTypeBegin (VOID); VOID DeclareDataTypeBegin (VOID);
EFI_VFR_RETURN_CODE SetNewTypeName (IN CHAR8 *); 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); VOID DeclareDataTypeEnd (VOID);
EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **); EFI_VFR_RETURN_CODE GetDataType (IN CHAR8 *, OUT SVfrDataType **);