mirror of https://github.com/acidanthera/audk.git
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:
parent
9fdf31789a
commit
2b7f3d4a6b
|
@ -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,14 +322,14 @@ vfrPragmaPackDefinition :
|
|||
"\)"
|
||||
;
|
||||
|
||||
vfrDataStructDefinition :
|
||||
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
||||
vfrDataUnionDefinition :
|
||||
{ TypeDef } Union << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
||||
{ NonNvDataMap }
|
||||
{
|
||||
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
|
||||
}
|
||||
OpenBrace
|
||||
vfrDataStructFields
|
||||
vfrDataStructFields[TRUE]
|
||||
CloseBrace
|
||||
{
|
||||
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
|
||||
|
@ -335,42 +337,57 @@ vfrDataStructDefinition :
|
|||
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>
|
||||
;
|
||||
|
||||
vfrDataStructFields :
|
||||
vfrDataStructDefinition :
|
||||
{ TypeDef } Struct << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>
|
||||
{ NonNvDataMap }
|
||||
{
|
||||
N1:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>
|
||||
}
|
||||
OpenBrace
|
||||
vfrDataStructFields[FALSE]
|
||||
CloseBrace
|
||||
{
|
||||
N2:StringIdentifier << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>
|
||||
}
|
||||
";" << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>
|
||||
;
|
||||
|
||||
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); >>
|
||||
;
|
||||
|
||||
//*****************************************************************************
|
||||
|
|
|
@ -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));
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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 **);
|
||||
|
|
Loading…
Reference in New Issue